[gelöst!]Subclassing Editfelder
-
Ich möchte Editfelder subclassen, um von Windows standardsmässig festgelegte Tasten oder die Maus abzufangen. Dies gelingt mir nur, wenn die Editfelder im Hauptfenster mit CreateWindow erzeugt und die Subclass-Funktion in WM_CREATE von WndProc eingefügt sind. Ich will das aber auch aus einem in einer Ressource definierten Dialog machen. Hier bekomme ich in der Dialogprozedur DlgProc kein WM_CREATE zu sehen. Also versuche ich es unter WM_INITDIALOG oder WM_ACTIVATE. Doch dort will nichts laufen.
--> Compiler und Linker (BCB1) wollen nicht mit #define STRICT arbeiten. Zum Subclassen ist daher FARPROC statt WNDPROC einzusetzen. Ferner hatte ich ein en Fehler in der Indizierung der als Array verwalteten FARPROCs für die einzelnen Editfelder, der zum Absturz führen musste.
-
Lege diese globale Variable an:
WNDPROC g_wndpEdit;Dann das Editfeld währen der Verarbeitung von WM_INITDIALOG deines Dialoges subclassen:
case WM_INITDIALOG: hWndEdit = GetDlgItem(hWnd, ID_DER_EDITBOX); //hWnd ist der Handle zu deinem Dialog g_wndpEdit = (WNDPROC)SetWindowLongPtr(hWndEdit, GWLP_WNDPROC,(LONG_PTR)EditSubclassProc); return TRUE;hWndEdit ist der Handle auf die zu subclassende Editbox.
Dann die neue Prozedur(Funktion) für deine Editbox:
LRESULT CALLBACK EditSubclassProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_: //Hier kannst du jetzt beliebige Nachrichten bearbeiten return TRUE; default: break; } return(CallWindowProc(g_wndpEdit, hWnd, uMsg, wParam, lParam)); //ruft nochmal die Standardprozedur deiner Editbox auf, //um nicht bearbeitete Nachrichten zu bearbeiten. }Ich hoffe ich konnte dir helfen.
[EDIT]
Natürlich musst du in der Resourcedatei eine Editbox mit der entsprechenden ID definiert haben,die dann
im Fenster deines Dialoges angezeigt wird.
[/EDIT]