WndProc - Fehler
-
Hi Leuts,
ich hab mir meine ganze Win-API Fenstererstellung in eine DLL gepackt so das ich nur noch einen Aufruf brauche um ein Fenster zu erzeugen. Soweit kein Prob.
Nun wollte ich die Funktionen etc. in eine Klasse packen auch das dachte ich währe kein Prob weil es anfänglich normal aussah. Doch nun wollte ich in dem Fenster eingaben machen und mußte nach endlosen debuggen und arbeiten mit dem spy++ feststellen das die WndProc nur bis zur fertigen Fenstererstellung Nachrichten abarbeitet.
Wie bekomme ich die WndProc dazu durchgehend zu laufen.
Hier der Aufruf aus meinem Hauptprogramm:c_root *c_tmp; c_tmp = new c_root; s_strukt = Program_Init(1024,768,32,true, c_tmp);
Soweit erstmal das Hauptprogramm . Ich mach mir ne Instanz der Klasse c_root (Hauptklasse für Fenstererstellung) und ruf dann Programm_Init() in der DLL auf.
CROOT_EXPORT st_root Program_Init( int Bildschirmbreite, int Bildschirmhoehe, int Bildschirmbpp, bool Fullscreen, c_root *myroot); CROOT_EXPORT void Program_Shutdown();
Diese beiden Export-Funktionen händeln das erschaffen und schließen der Fenster und noch ein paar Sachen mehr die hier nicht wichtig sind.
In der KLasse wird dann normal das Fenster erstellt und wieder vernichtet über entsprechende Memberfunktionen:class GREN_EXPORT c_root { public: HINSTANCE hinstance; HWND hwnd; HDC hdc; .. .. public: c_root(); ~c_root(); bool Program_CreateWindow(); bool Program_DestroyWindow(); virtual LRESULT CALLBACK WinProc(UINT Message, WPARAM wParam, LPARAM lParam); private: static LRESULT CALLBACK sta_WinProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam);
erst hab ich die WndProc als interne Funktion in der DLL gehabt also außerhalb der Klasse als das nicht funzte hab ich sie in die Klasse mit aufgenommen (siehe oben) mit dem gleichen Effekt.
Hier noch der Code der beiden WndProc'sLRESULT CALLBACK c_root::sta_WinProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { c_root *pthis = (c_root *)::GetProp(hwnd, "c_root"); if(pthis) { return pthis->WinProc(message, wparam, lparam); } else { return ::DefWindowProc(hwnd,message,wparam, lparam); } } LRESULT CALLBACK c_root::WinProc(UINT Message, WPARAM wParam, LPARAM lParam) { Log("Nachricht\n"); switch(Message) { case WM_PAINT: { Log("WM_PAINT\n"); return 0; } case WM_SYSCOMMAND: { Log("WM_SYSCOMMAND\n"); switch(wParam) { case SC_SCREENSAVE: case SC_MONITORPOWER: return 0; } break; } case WM_CLOSE: { Log("WM_CLOSE\n"); PostQuitMessage(0); return 0; } case WM_KEYDOWN: { Log("Taste down\n"); s_win.b_taste[wParam] = TRUE; return 0; } }//switch(Message) return DefWindowProc(s_win.hwnd, Message, wParam, lParam); }
Hat jemand ne Idee warum die WndProc aufhört zu rennen ?
edit: Gut das du Codetags benutzt. Aber nimm nächstesmal bitte C++ Codetags.
[ Dieser Beitrag wurde am 08.01.2003 um 16:26 Uhr von cd9000 editiert. ]
-
while(GetMessage(...) ...
-
@<> kannste das mal genauer erklären würde mich auch interessieren ?
-
Debugge doch mal sta_WinProc, und schau nach ob pthis immer ungleich 0 ist. Wenns 0 ist rufst du ja einfach die DefWindowProc auf.
Wie sieht denn deine Nachrichtenschleife aus?
-
Hi Leute
hat sich erledigt mein PeekMessage war fehlerhaft. Ausserdem hatte ich ein Speicherleck was sich pro Minute 300 MB Ram gezogen hat (bis zum Maximum ) und so den Rechner fast eingefrohren hat.