PreTranslateMessage....



  • Hallo,
    eine kurze Frage zur PreTranslateMessage:
    Kann man aus der pMsg irgendwie herausbekommen ob ein CEdit-Feld momentan den Fokus hat, bzw. aktiviert ist?!?

    Folgende Problematik:
    Ich habe unterschiedliche STeuerelemente in einem Dialog.
    In der PreTranslateMessage-Fkt. überprüfe ich über

    if (pMsg->hwnd == GetDlgItem(nID[i])->m_hWnd)  // Handle vergleichen
    

    und zeige dann dazu entsprechend einen Hinweis in einem Fenster an.
    Besitzt ein CEdit den Fokus (Cursor blinkt im CEdit-Feld), dann wird bei der Überprüfuung

    if (pMsg->message == WM_MOUSEMOVE || WM_NCHITTEST)
    

    bei Maus über einem anderen Steuerelement kurz dessen Hinweis angezeigt und dann wieder der Hinweis von dem CEdit wo der Cursor noch lustig blinkt. Das soll natürlich nicht sein.

    Was ich nun tun möchte ist folgendes:

    Ist Cursor in einem CEdit-Feld, dann soll WM_MOUSEMOVE nicht überprüft werden, sondern wie folgend der Wechsel nur Mausklick oder TAB-Taste:

    if (pMsg->wParam == VK_TAB || pMsg->message ==  WM_LBUTTONDOWN)
    {
       .......
    }
    

    Wenn ANDERES STeuerelement aktiv ist, dann klappt die Geschichte mit der WM_MOUSEMOVE-Fkt ja ganz gut, also:

    if (pMsg->message == WM_MOUSEMOVE || WM_NCHITTEST)
    {
      ...
    }
    

    Aber um dies umzusetzen muss ich ja vorher wissen OB ein CEdit den Fokus hat, oder nicht! 😕

    Bin für jeden Tipp dankbar. Vielleicht gibts ja auch eine viel einfachere Lösung?!?!

    Danke.

    Gruss
    S.



  • GetActiveWindow 😉



  • Hi,
    irgenwie kann ich mit Deinem Tipp nicht wirklich viel anfangen, sorry.
    GetActiveWindow liefert mir einen CWnd* zurück.
    Wie kann ich jetzt herausfinden ob das ein CEdit ist? 😕

    Danke für Deine Hilfe, bin noch blutiger Anfänger. 🙄

    Gruss
    S.



  • Na schau, GetActiveWindow() liefert einen CWnd*.
    Aus pMsg kannst du dir auch einen CWnd* oder zumindest das Handle besorgen.
    Die beiden vergleichst du einfach.

    Oder

    if(GetActivWindow() == GetDlgItem(IDC_EDIT1)) {
     .. 
     ... 
     .. 
    }
    


  • Oder du schaltest RTTI ein und machst dann:

    if (dynamic_cast<CEdit*>(GetActiveWindow()))
    { // es ist ein Edit
    }
    

    Dann musst du nicht jedes einzeln prüfen. 🙂



  • estartu_de schrieb:

    Oder du schaltest RTTI ein und machst dann:

    if (dynamic_cast<CEdit*>(GetActiveWindow()))
    { // es ist ein Edit
    }
    

    Dann musst du nicht jedes einzeln prüfen. 🙂

    und hier mein Senf ääh Code dazu:

    // get current focus-object
        CWnd* w = NULL;
        w = GetFocus();
        if(w==NULL) return FALSE;
    
        // is it one of the targetfields?
        int iId = w->GetDlgCtrlID();
    
       if( iId == IDC_CK_EDIT_BOOL ||
            iId == IDC_CB_EDIT_ENUM ||
            iId == IDC_LIST3 ||
            iId == IDC_EDIT_PARVAL||
            iId == IDC_SLIDER1){
          doThisMethod();
        }
    

    Häf fun 🤡



  • Habe es nach der Methode von sky21 gemacht.
    Funktioniert einwandfrei 👍

    Um diese Run Time Type Informationen benutzen zu können muss man doch noch einige Projekteinstellungen vornehmen, oder?
    Irgendwelche Libraries einbinden, etc. ?!?

    Danke nochmals für die Tipps.

    Gruss
    S.


Anmelden zum Antworten