Maus



  • Hi!
    Ich habe mal wider n Problemchen, und wie unschwer am titel zu erkennen ist,
    dreht es sich um die MAUS. Ich will in einer Konsolenanwendung sowas wie
    Buttons einrichten, dazu muss ja natürlich die position der Maus bekannt seien.
    Ich hab auch schon gesucht und son paar Beiträge, wie z.B. diesen hier gefunden:
    http://www.c-plusplus.net/forum/viewtopic.php?t=80636&highlight=maus+konsole

    Da ich aber noch ziemlich neu bin verstehe ich von dem Code so gut wie nichts.
    Jetzt meine Bitte an alle die mir helfen wollen/können:
    Könntet ihr mal n Beispielcode fürn Button hier reinsetzen, der nicht so kompliziert ist?
    (Keine Ahnnug ob das geht, aber könnte ja seien)

    Danke schon mal im Voraus.

    MfG
    Canon



  • Also wenn du einen richtigen grafischen Button willst, dann solltest du dich erstmal mit dem Thema Grafiken auseinander setzen. Um Linien, Kreise, ... zu zeichnen brauchst du natürlich noch eine Grafikbibliothek (z. B. Allegro; da ist sogar noch mehr dabei). Das Zeichnen alleine reicht natürlich nicht (hat ja nur was mit dem visuellen zu tun). Allerdings ist die restliche Logik nicht schwer. Mach dir einfach eine struct in der du die Position und Größe deines Buttons speicherst. Sobald der User auf die Maustaste klickt, solltest du ein Event bekommen, dass dir die genaue Klickposition übermittelt, anhand dieser Position kannst du dann ermitteln, ob der Klick innerhalb des Bereichs deines Buttons ist.



  • AJ schrieb:

    Also wenn du einen richtigen grafischen Button willst, dann solltest du dich erstmal mit dem Thema Grafiken auseinander setzen. Um Linien, Kreise, ... zu zeichnen brauchst du natürlich noch eine Grafikbibliothek (z. B. Allegro; da ist sogar noch mehr dabei). Das Zeichnen alleine reicht natürlich nicht (hat ja nur was mit dem visuellen zu tun). Allerdings ist die restliche Logik nicht schwer. Mach dir einfach eine struct in der du die Position und Größe deines Buttons speicherst. Sobald der User auf die Maustaste klickt, solltest du ein Event bekommen, dass dir die genaue Klickposition übermittelt, anhand dieser Position kannst du dann ermitteln, ob der Klick innerhalb des Bereichs deines Buttons ist.

    Ne grafisch muss das nicht so toll sein, da reichen mir die Normalen Unicode
    Zeichen. Ich wollte zum Beispiel etwa so einen Button zeichnen:

    #include <windows.h> 
    #include <iostream.h>
    #include <conio.h>
    char c1=201, c2=205, c3=187, c4=200, c5=188, c6=186;
    
    int main () {
    cout<<c1<<c2<<c2<<c2<<c2<<c2<<c2<<c3<<endl
    	<<c6<<"Button"<<c6			<<endl
    	<<c4<<c2<<c2<<c2<<c2<<c2<<c2<<c5<<endl;
    
    int i; cin>>i;
    return 1;
    }
    

    Sehr primitve Methode, aber Allegro kann ich eben noch nicht,
    und ich hab gehört es soll auch ohne gehen.
    Man muss nur wissen wo der Crusor sich befindet, wenn die Maus gedrückt wird.
    das beste wäre wenn mal jemand ein Beispielcode schreiben könnte.

    MfG Canon



  • Beispielcode hast du doch eh in dem Thread, den du gepostet hast. Mehr als das Ereignis und die Position gibt es hald nicht.



  • Hm..
    Schade, den code versteh ich noch nich so ganz.
    Wo kann man den da einfügenn was gemacht werden soll wenn
    eine bestimmte Maus Position geklickt wird?



  • Genau hier:

    ...
            case MOUSE_EVENT:  
                sprintf(bOutBuf, "mouse: %s at %d, %d",(inputBuffer.Event.MouseEvent.dwEventFlags == MOUSE_MOVED ?"moved" : "clicked"), inputBuffer.Event.MouseEvent.dwMousePosition.X,inputBuffer.Event.MouseEvent.dwMousePosition.Y);
                printf("%s", bOutBuf);              
                  break;     
    ...
    

    Anstatt sprintf() und printf() musst du hald deine Logik einbauen. Also erstmal abprüfen, ob es sich um einen Click handelt (inputBuffer.Event.MouseEvent.dwEventFlags) und wenn das so ist, dann die Position mit der deines Buttons überprüfen, ob der Click innerhalb des Buttons war oder außerhalb.



  • Sorry, ich stell mich warscheinlich zu blöd an,
    aber ich krieg das einfach nicht hin... 😕
    Wen irgtentwer weiß wie's geht, wäre ich ihm dankbar,
    wenn er mich an seinem Wissen teilhaben lassen würde.



  • Canon schrieb:

    Sorry, ich stell mich warscheinlich zu blöd an,
    aber ich krieg das einfach nicht hin... 😕
    Wen irgtentwer weiß wie's geht, wäre ich ihm dankbar,
    wenn er mich an seinem Wissen teilhaben lassen würde.



  • Hä?! Wieso schreibse das denn 2mal ?



  • Sorry, war nur aus Versehen.



  • Überleg hald mal wie man das machen könnte. Schreibs dir am besten mal auf und poste es dann hier rein.

    Nochmal ne kleine Zusammenfassung als Hilfestellung. Du hast einen Button, der sich an einer bestimmten Position befindet und eine bestimmte Größe hat (=> Bereich des Buttons). Dann hast du Informationen über die Mouse zur Verfügung. Diese sind einmal das Event (Bewegung oder Klick) und zum anderen ist das die Position, an der das Event aufgetreten ist.
    Ziel ist es zu bestimmen, ob der Benutzer in den Bereich des Buttons geklickt hat.

    Noch ein Tip:
    Damit du dich mal mit der Handhabung vertraut machen kannst, versuch mal das Beispiel aus dem geposteten Thread ganz am Anfang umzubauen, dass es dir immer nur die Position ausgibt, wenn du klickst.
    Viel Erfolg!



  • Hab zur Zeit, nicht die möglichkeit mich damit zu beschäftigen. 😞
    Werde ich aber noch machen. also nich verzweifeln, wenn ihr länger nix mehr
    von mir höhrt. 😉

    MfG
    Canon



  • Hi!
    Ich hab mich nochmal mitdem Code auseinanergesezt,
    und rausgekommen ist das:

    #include <windows.h> 
    #include <winuser.h> 
    #include <stdio.h> 
    #include <string.h> 
    #include <conio.h> 
    #include <iostream.h>
    #include <stdlib.h>
    
    char c1=201, c2=205, c3=187, c4=200, c5=188, c6=186; 
    
    int main(void) 
    { 
        BOOL bSuccess;
        HANDLE hStdIn, hStdOut; /* standard input, output handles */ 
        DWORD dwMode;
        /* array of console input event records */ 
        INPUT_RECORD inputBuffer; 
        DWORD dwInputEvents; /* number of events actually read */ 
        CHAR bOutBuf[256]; /* buffer to format event information into */ 
        CONSOLE_CURSOR_INFO cci; /* used when turning off the cursor */ 
        CONSOLE_SCREEN_BUFFER_INFO csbi; /* used to get cursor position */ 
        OSVERSIONINFO osVer; /* for GetVersionEx() */ 
        /* check if Win32s, if so, display notice and terminate */ 
        osVer.dwOSVersionInfoSize = sizeof(osVer); 
        bSuccess = GetVersionEx(&osVer); 
        if (osVer.dwPlatformId == VER_PLATFORM_WIN32s) 
        { 
            MessageBox(NULL, 
            "This application cannot run on Windows 3.1.", 
            "Error: Windows NT or Windows 95 Required to Run", MB_OK ); 
            return(1); 
        } 
    
        bSuccess = GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi); 
    
        if ((csbi.dwCursorPosition.X) | (csbi.dwCursorPosition.Y)) /* either non-zero? */ 
        { 
            bSuccess = FreeConsole();         
            bSuccess = AllocConsole(); 
        } 
        /* let's put up a meaningful console title */ 
        bSuccess = SetConsoleTitle("elises window32 api demo"); 
        /* get the standard handles */ 
        hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); 
        hStdIn = GetStdHandle(STD_INPUT_HANDLE); 
        /* set up mouse and window input */ 
        bSuccess = GetConsoleMode(hStdIn, &dwMode); 
        /* ENABLE_ECHO_INPUT. */ 
        bSuccess = SetConsoleMode(hStdIn, (dwMode & ~(ENABLE_LINE_INPUT |ENABLE_ECHO_INPUT)) | ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT); 
        /* save then hide the cursor */ 
        cci.dwSize = 100; 
        cci.bVisible = FALSE; 
        bSuccess = SetConsoleCursorInfo(hStdOut, &cci); 
    
    	cout<<c1<<c2<<c2<<c2<<c2<<c2<<c2<<c3<<endl 
        <<c6<<"Button"<<c6            <<endl 
        <<c4<<c2<<c2<<c2<<c2<<c2<<c2<<c5<<endl; 
    
        do{ 
            /* read an input events from the input event queue */ 
           bSuccess = ReadConsoleInput(hStdIn, &inputBuffer, 1, &dwInputEvents); 
           switch (inputBuffer.EventType){   
            case KEY_EVENT: 
                if (inputBuffer.Event.KeyEvent.bKeyDown){ 
                    /* display the key event info on the status line */ 
                    sprintf(bOutBuf, "key: virtual=%d ascii=%c", 
                    inputBuffer.Event.KeyEvent.wVirtualKeyCode, 
                    inputBuffer.Event.KeyEvent.uChar.AsciiChar); 
                    printf("%s", bOutBuf); 
                } 
                break; 
    
            case MOUSE_EVENT:
    
    			POINT mPos;
                if (inputBuffer.Event.MouseEvent.dwEventFlags){;}
    			else { printf("clicked at ");
    			GetCursorPos(&mPos);
        cout << "X:" << mPos.x << "  Y:" << mPos.y << endl;	
    	if (mPos.x==20 && mPos.y==20) {system("cls");
    	printf("Du hast den Button geklicked.");}
        }
    
                  break;     
           } 
    
        }while ( inputBuffer.Event.KeyEvent.uChar.AsciiChar!='E'&&inputBuffer.Event.KeyEvent.uChar.AsciiChar!='e'); 
        return 0; 
    }
    

    Ich bräuchte aber noch Hilfe bei der Festlegeung der Punkte auf die man
    klicken muss, damit es Button klick angesehen wird, denn in der Version des
    Codes, wie er oben steht, geht das nur wenn man exakt ein Punkt trifft. (20/20)

    MfG Canon



  • Canon schrieb:

    Ich bräuchte aber noch Hilfe bei der Festlegeung der Punkte auf die man
    klicken muss, damit es Button klick angesehen wird, denn in der Version des
    Codes, wie er oben steht, geht das nur wenn man exakt ein Punkt trifft. (20/20)

    Wie schon mal beschrieben, definiere dir einen Bereich über eine Struktur z. B. und überprüfe, dann ob die geklickte Position innerhalb des Bereichs liegt.

    Dein Bereich sollte zwei Punkte haben, z. B. links oben und rechts unten.

    Damit solltest du eigentlich alles haben, was du brauchst. Jetzt musst du nur noch überlegen, wie du feststellst, ob dein Punkt im Bereich liegt, aber das sollte eigentlich einfach sein. Einfach mal ein wenig den Kopf drüber zerbrechen ;).


Anmelden zum Antworten