Problem mit SetWindowLongPtr()
-
Hallo.
Ich bin gerade dabei ein kleines Windows-Programm zu schreiben und benutze dafür C++ und die WinAPI.
Nun erstelle ich mit CreateWindowEx ein Fenster und in diesem Fenster wieder mit CreateWindowEx ein Edit-Element.
Funktioniert soweit perfekt. Nun möchte ich die Window-Procedure des Elements auf eine eigene Funktion ändern, und verwende die SetWindowLongPtr()-Funktion, was auch soweit funktioniert, da diese zweite Funktion mir schön viele Messages ausgibt.
Allerdings tritt hierbei folgener Effekt auf:
Die Edit-Box ist plötzlich inaktiv/readonly?Hier zwei Bilder:
Vor der Verwendung von SetWindowLongPtr()
Nach der Verwendung von SetWindowLongPtr()Ich habe auch keinen Anhaltspunkt, da ich mit dem Edit-Element noch in keiner der beiden Funktionen arbeite. Ich erstelle es bloß.
Hat jemand von euch vielleicht eine Idee, weshalb sich dieses Element anders verhält obwohl im Code selbst nichts damit passiert? Eine Lösung wäre super.
Danke.
mfg
Barton
-
die frage hättest du im WinAPI forum fragen müssen. lass dich von einem mod verschieben
greetz KN4CK3R
-
Oh, das hab ich leider nicht gesehen.
Ja dann bitte ich den Thread zu verschieben.
-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Wie sieht denn Deine WndProc aus?
-
Evtl. DefWindowProc verwendet anstatt CallWindowProc?
-
Hallo.
Das sind meine beiden WndProcs.
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { std::cout << "MainWndProc: " << message << std::endl; switch(message) { case WM_CREATE: { break; } case WM_COMMAND: { break; } case WM_SIZE: { break; } case WM_DESTROY: { PostQuitMessage(0); break; } default: { return DefWindowProc(hWnd, message, wParam, lParam); } } return 0; } LRESULT CALLBACK NewWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { std::cout << "NewWndProc: " << message << std::endl; switch(message) { case WM_CREATE: { break; } case WM_COMMAND: { break; } default: { return DefWindowProc(hWnd, message, wParam, lParam); } } return 0; }
Die Elemente (Buttons, Textfelder, etc...) werden erst einwenig später erstellt.
Ich hab gerade eben in NewWndProc statt dem DefWindowProc folgendes probiert, hilft aber nicht...
return CallWindowProc(MainWndProc, hWnd, message, wParam, lParam);
-
Du verstehst Subclassing ciht.
Wenn Du die WindowProc ersett bekommst Du die alte WindowProc, Deine Subclass Routine muss dann mit CallWindowProc die alte aufrufen.
-
Hallo.
Ich bekomme einen LONG_PTR zurück (die alte WndProc), bloß wie rufe ich diese mit der Information auf?
WINUSERAPI LRESULT WINAPI CallWindowProcW(WNDPROC, HWND, UINT, WPARAM, LPARAM)
Ich sehe da nirgends Platz für einen LONG_PTR?
Edit: Die Lösung scheint ein Cast des ersten Parameters auf WNDPROC zu sein.
-
Sowas vielleicht?
: : oldEditWindowProc = SetWindowLongPtr(hEdit, GWLP_WNDPROC, &NewWndProc); : : : LRESULT CALLBACK NewWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { std::cout << "NewWndProc: " << message << std::endl; switch(message) { case WM_CREATE: { break; } case WM_COMMAND: { break; } default: { return oldEditWindowProc(hWnd, message, wParam, lParam); } } return 0; }
-
Lies doch einfach die Doku...
Was Du zurückbekomst ist eine WNDPROC! Diesen Wert musst Du verwenden mit CallWindowProc!http://msdn.microsoft.com/en-us/library/windows/desktop/bb773183(v=vs.85).aspx