On-Mouse-Over-Funktion ? Wie ?



  • Und wie kann ich dann eine Nachricht an WM_PAINT schicken, damit er mir das Highlight ausgibt?!

    😕



  • n()()bi schrieb:

    Und wie kann ich dann eine Nachricht an WM_PAINT schicken, damit er mir das Highlight ausgibt?!

    😕

    ?! - WM_PAINT ist eine Nachricht. Wenn Du WM_PAINT auslösen möchtest: InvalidateRect()



  • Stimmt ^- Naja, ich hab mir folgendes Gedacht:

    Variable -> True/False -> Bei Mouseover: auf TRUE -> WM_PAINT aufrufen -> If-Schleife frägt Variable ab -> Bei True Highlight zeichnen, bei False Highlight nicht anzeichnen

    Mein Prob. ist, dass ich nicht weiss wie ich die Cursorposition aufrufe ...

    case WM_COMMAND:
          {
        GetCursorPos(&pt);
    
           if(pt.x >= 1  | pt.y >= 1 | pt.x <= 100 | pt.y <= 50){
            isactive = "TRUE";
             InvalidateRect(hWnd, NULL, TRUE);
           }
    

    Also so funktionierts schon einmal nicht ! Kann mir jemand sagen, was Falsch ist? ThX

    Achja, noch ne andere Sache ... Wie leere ich eine Editbox ? MFG

    n()()bi



  • n()()bi schrieb:

    Mein Prob. ist, dass ich nicht weiss wie ich die Cursorposition aufrufe ...

    Was willst du denn überhaupt damit machen? Um das Verlassen zu überwachen eignet sich wohl TrackMouseEvent besser. Falls du es anders machen willst musst du auf jeden Fall mittels SetCapture dafür sorgen, dass du auch noch Mausnachrichten von außerhalb des Childs bekommst - wenn dies dann der Fall ist ReleaseCapture nicht vergessen.

    n()()bi schrieb:

    Achja, noch ne andere Sache ... Wie leere ich eine Editbox ?

    Einfach mittels SetDlgItemText bzw. SetWindowText einen leeren String setzen 😉



  • Ich möchte einfach nur überwachen, ob der Cursor in meinen Programm (also nur in dem Programm, nicht Desktop) über eine bestimmte Fläche "wandert"... Wenn er dies dann macht, dann soll diese Fläche ein Highlight - wie z.B. unterstreichen des Textes oder ein bestimmtes Icon laden - durchführen.
    Wenn die FLäche dann wieder verlassen wird, dann soll dieses Highlight dementsprechend wieder gelöscht werden ... Ist wie im Javascript (Websprache) die On-Mouse-Over Funktion (Wie der Name schon sagt ^- ), doch mein oben-gepostetes Bsp. funktioniert nicht ...

    Hoff ihr versteht mich ! ThX dass ihr euch die Zeit nehmt! MFG:

    n()()bi



  • ist eine fläche ein control oder sind es einfach koordinaten?

    oben genannter code kann nicht funktionieren da die operatoren in der if
    abfrage nicht stimmen. 😉



  • kleine frage am rande: mir ist eben aufgefallen, dass mein compiler plötzlich TRACKMOUSEEVENT und TrackMouseEvent nicht mehr kennt, woran könnte das liegen?



  • Was ist an der if-Abfrage bitte falsch ?

    Er soll einfach die Koordinaten von einer Fläche abfragen ... Nicht die eines Controls. Sorry, bin allgemein in Win-API noch neu, evtl. denkt ihr einfach zu kompliziert ^-

    Hoff alles ist jetzt klar! MFG

    n()()bi



  • Nur ein "|" bedeutet es ist eine bitweise Oder-Verknüpfung.
    Die logische Oder-Verknüpfung besteht aus 2 "|"
    also: Expression1 || Expression2



  • du hast den Bit-Operator "|" genommen anstatt "||"



  • n()()bi schrieb:

    Was ist an der if-Abfrage bitte falsch ?

    http://www.cpp-tutor.de/cpp/le05/le05_01.htm#mbed
    den kasten lesen 😉
    http://www.cpp-tutor.de/cpp/le03/le03_02.htm#bit

    [edit]
    zwei minuten zum links suchen, auch net schlecht 😃 😃 🕶



  • Naja, wieder was gelernt ^^! Also, hier seht ihr einmal, was ich bis jetzt - erfolglos - zusammengebastelt habe:

    string activehome;
    
       switch (message)
       {
        case WM_PAINT:
          {
           PAINTSTRUCT ps;
    
            HDC hDC = BeginPaint(hWnd, &ps);
             const char  Test[] = "Ouch";
    
             if(activehome == "a"){
              TextOut(hDC, 7,50, Test, sizeof(Test) - 1);
             }
    
            EndPaint(hWnd, &ps); 
    
           return 0;
          }
    
       case WM_COMMAND:
          {
           GetCursorPos(&pt);
    
            if((pt.x >= 1) || (pt.y >= 1) || (pt.x <= 200) || (pt.y <= 200)){
             activehome = "a";
              InvalidateRect(hWnd, NULL, TRUE);
            }
    
           return 0;
          }
    
    }
    

    Hoffe jemand kann dieses - hoffentlich kleine - Prob. debuggen ... ThX nochmal für eure Hilfe! MFG:

    n()()bi



  • also so spontan würd ich sagen muss

    if((pt.x >= 1) && (pt.y >= 1) && (pt.x <= 200) && (pt.y <= 200)){
        // code
    }
    

    heißen.
    die fläche die du meinst is doch rechteckig. oder seh ich das falsch?



  • Hatte ich auch schon ausprobiert, ging alles nicht ! Ooooh Man 😞



  • Sooo ... habe ein bisschen weiter in der MSDN gekruscht ... Folgendes:
    Um die Koordinaten ermitteln zu können braucht man die FUnktion Mousemove. Diese wird immer aufgerufen wenn die Mouse sich bewegt.

    case WM_MOUSEMOVE:
          {
    
          if(activated != "a"){
    
           long xPos = GET_X_LPARAM(lParam); 
           long yPos = GET_Y_LPARAM(lParam); 
    
           if((xPos >= 1) && (yPos >= 1) && (xPos <= 200) && (yPos <= 200)){
            activated = "a";
            activehome = "a";
           }
    
             InvalidateRect(hNavigation, NULL, FALSE);
          }
    
           return 0;
    
       }
    

    Habe eine zusätzliche Variable (activated) erstellt, die schaut, ob das Feld schon einmal berührt wurde, wenn nicht, dann soll er die Variable "activated" und "activehome" auf "a" setzen. Mein Problem liegt nur darin, dass er mir die beiden Variablen nicht auf "a" setzt !? Ich weiss nicht warum dass so ist?!

    Weiss jemand was da los ist?



  • tipp: wenn irgendetwas einfach nicht ausgeführt wird, dann stopf alle schleifen und bedingungen voll mit MessageBox-en, dann siehst du wie weit es kommt und wo es abbricht. oder, wenn du ansonsten bombadiert werden würdest, bastel etwas ganz kleines, was dann bei WM_PAINT einfach ausgegeben wird.



  • Ich weiss wo es nicht weitergeht!

    Das Problem liegt wahrscheinlich am Semilikon ... Da gibt es doch diese Regel, alles was in einem Block ist, ist für Funktionen außerhalb des Blockes nicht sichtbar ... D.h. Meine Variable muss für das "Äußere" sichtbar gemacht werden, nur die Frage ist wie ?!



  • n()()bi schrieb:

    D.h. Meine Variable muss für das "Äußere" sichtbar gemacht werden, nur die Frage ist wie ?!

    Dann musst du sie einfach außerhalb deklarieren - evtl. brauchst du auch einfach nur ein static davor?!



  • Juhu, funktioniert einwandfrei !!!!!! THX, Problem endlich gelöst ^-

    MFG:
    n()()bi



  • kann mir noch schnell jemand sagen, wieso TRACKMOUSEEVENT und TrackMouseEvent() bei mir plötzlich nicht mehr dem compiler bekannt ist?


Anmelden zum Antworten