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 überif (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üfuungif (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 einwandfreiUm 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.