Über Button ein anderer Cursor



  • Upsi, verguckt. Aber hast du mal überprüft, ob LoadCursor ein gültiges Handle zurückgibt?



  • Ne mach ich jetzt mal.
    aber es ist ja eigentlich nur der befehl den du auch benutzt hast (LoadCursor(0,IDC_HAND), nur halt mit dem wert von IDC_HAND) deswegen wüsste ich nicht, was da schief gehen sollte, naja ich gucke mal, ob ein fehler kommt.
    Danke


  • Mod

    Wenn der Button WM_SETCURSOR selbst behandelt, dann bekommt das Elternfenster diese Nachricht nicht zu sehen.
    Nutze Spy++ um das zu prüfen.



  • <00119> 004A02F2 S WM_SETCURSOR hwnd:004A02F2 nHittest:HTCLIENT wMouseMsg:WM_MOUSEMOVE
    <00120> 004A02F2 R WM_SETCURSOR fHaltProcessing:False

    ?



  • Santa schrieb:

    <00120> 004A02F2 R WM_SETCURSOR fHaltProcessing:False

    Da ist doch der Haken -> fHaltProcessing müsste true sein. Das bedeutet, du musst zur Nachricht WM_SETCURSOR den Wert "TRUE" zurückgeben.

    =>

    MSDN schrieb:

    If the dialog box procedure processes a message that requires a specific return value, the dialog box procedure should set the desired return value by calling SetWindowLong(hwndDlg, DWL_MSGRESULT, lResult) immediately before returning TRUE. Note that you must call SetWindowLong immediately before returning TRUE; doing so earlier may result in the DWL_MSGRESULT value being overwritten by a nested dialog box message.



  • wo denn?

    hier steht doch return TRUE;

    case WM_SETCURSOR: 
            if(wParam == GetDlgItem(hwnd, mybutton) { 
                SetCursor(LoadCursor(0, 32649)); 
            } 
            return TRUE;
    

  • Mod

    Und Deine WM_SETCURSOR Routine wird aufegrufen?



  • ja, wenn ich da eine messagebox reinmache, erscheint sie



  • Santa schrieb:

    wo denn?

    hier steht doch return TRUE;

    Lies doch mal ein wenig Doku 🙄

    MSDN schrieb:

    Typically, the dialog box procedure should return TRUE if it processed the message, and FALSE if it did not. If the dialog box procedure returns FALSE, the dialog manager performs the default dialog operation in response to the message.

    Dein "return TRUE" bedeutet nur, dass die Nachricht nicht ans Standard-Nachrichten-Bearbeitungs-System weitergeleitet wird; den Rückgabewert setzt du damit allerdings nicht. Deshalb hatte ich in meinem Post (von 14:50:59) ja den MSDN-Quote dazugenommen, wo drinsteht, wie du den Rückgabewert setzen kannst.


  • Mod

    Du hast hier keine Fenster Prozedur, sondern eine DlgProc!

    Hier gibst Du TRUE und FALSE zurück und regelst ob die DefDlgProc aufegrufen wird. Um auf WM_SETCURSOR mit TRUE zu reagieren musst Du DWL_MSGRESULT verwenden und den Code wie folgt ändern:

    case WM_SETCURSOR: 
            if(wParam == GetDlgItem(hwnd, mybutton) 
            { 
                SetCursor(LoadCursor(0, 32649)); 
                SetWindowLong(hDlg,DWL_MSGRESULT,TRUE);
            } 
            return TRUE;
    

    BTW. Speicher Dir doch das Handle, permanent und verwnede doch besser die entsprechenden symbolischen IDs.



  • Vielen Dank euch beiden, hat wunderbar funktioniert 😃

    @Badestrand:
    tut mir leid, ich dachte ich hätte es schon gelesen und habe es deswegen mehr oder weniger ignoriert, obwohl darin die lösung steckte 👍


Anmelden zum Antworten