Edit-Control subclassen, ohne globale Variable (alte WndProc in GWLP_USERDATA verpacken ?)
-
Schönen guten Abend
,Also wie der Titel hoffentlich vermuten lässt, habe ich versucht ein EditControl zu subclassen, ohne dabei eine globale Variable zu verwenden.
Das Problem ist allerdings, sobald das Control erstellt wird beendet sich mein gesamten Programm (im Debug-Modus mit der Access-Violation, im Release-Modus sang und klanglos).
Hier der Code (gekürzt):
LRESULT CALLBACK RenameEditProc(HWND hWnd, UINT uiMessage, WPARAM wParam, LPARAM lParam) { WNDPROC pfnPrevProc = reinterpret_cast<WNDPROC>(GetWindowLongPtr(hWnd, GWLP_WNDPROC)); if(pfnPrevProc == NULL) return (DefWindowProc(hWnd, uiMessage, wParam, lParam)); switch(uiMessage) { case WM_CHAR: // ToDo: ... return (0); } return (CallWindowProc(pfnPrevProc, hWnd, uiMessage, wParam, lParam)); } // In der Parent-WndProc: // Edit-Control für die Eingabe des neuen Dateinamens erstellen: HWND hebxNewFileName = CreateWindowEx (0, TEXT("EDIT"), pWndData->strCurName.c_str(), WS_CHILD | WS_VISIBLE | WS_BORDER | ES_AUTOHSCROLL | ES_NOHIDESEL, 16, 98, 269, 18, hWnd, reinterpret_cast<HMENU>(EBX_NEW_FILE_NAME), pWndData->hInstance, NULL); // Schrift des Edit-Controls anpassen: SendMessage(hebxNewFileName, WM_SETFONT, reinterpret_cast<WPARAM>(GetStockObject(DEFAULT_GUI_FONT)), TRUE); // Edit-Control subclassen, um die Taste [Enter] (VK_RETURN) abzufangen: WNDPROC pfnPrevProc = reinterpret_cast<WNDPROC>(GetWindowLongPtr(hebxNewFileName, GWLP_WNDPROC)); SetWindowLongPtr(hebxNewFileName, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(pfnPrevProc)); SetWindowLongPtr(hebxNewFileName, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>(RenameEditProc));Wenn ich den Aufruf von CallWindowProc weglasse, funktioniert es, allerdings ist das Control (logischerweise) dann etwas 'verkrüppelt'
.Danke schonmal für Hilfe
!PS: IDE ist Visual C++ 8.
-
LRESULT CALLBACK RenameEditProc(HWND hWnd, UINT uiMessage, WPARAM wParam, LPARAM lParam) { // WNDPROC pfnPrevProc = reinterpret_cast<WNDPROC>(GetWindowLongPtr(hWnd, GWLP_WNDPROC)); WNDPROC pfnPrevProc = reinterpret_cast<WNDPROC>(GetWindowLongPtr(hWnd, GWLP_USERDATA)); // <- GWLP_USERDATA if(pfnPrevProc == NULL) return (DefWindowProc(hWnd, uiMessage, wParam, lParam)); ... } // weil : WNDPROC pfnPrevProc = reinterpret_cast<WNDPROC>(GetWindowLongPtr(hebxNewFileName, GWLP_WNDPROC)); SetWindowLongPtr(hebxNewFileName, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(pfnPrevProc)); // <- pfnPrevProc ist in GWLP_USERDATA SetWindowLongPtr(hebxNewFileName, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>(RenameEditProc));
-
OHA, rofl, joar das war n Copy&Paste Bug *g*. Danke
- alles klar^^ *sich-ärger*.