Weiterer Schleifendurchgang trotz WM_QUIT
-
Hallo!
Ich versuche gerade, eine Windows Anwendung SAUBER zu beenden.
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int) { MeineKlasse::getInstance(hInstance); MSG msg = {0}; while(msg.message != WM_QUIT) { if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } MeineKlasse::getInstance().Tick(); } } LRESULT WINAPI MsgProc(HWND windowHandle, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_DESTROY: MeineKlasse::getInstance().Exit(); } return DefWindowProc(windowHandle, msg, wParam, lParam); }Im Konstruktor meiner Klasse wird nur das Fenster erstellt.
void MeineKlasse::Tick() { MessageBox(NULL, "Window lost!", "Error 05", MB_OK); DestroyWindow(windowHandle); PostQuitMessage(0); return; Sleep(1); }Kann mir nun jemand erklären, warum die MessageBox ZWEI mal erscheint, bevor das Programm beendet wird.
Und mache ich das so generell richtig?
MfG
-
Grml, in Exit() steht das:
DestroyWindow(windowHandle); PostQuitMessage(0); return;Und wozu braucht man das return eigentlich? Steht meist hinter PostQuitMessage(0).
MfG
-
Das return bezogen auf den Return-Typ void ist überflüssig, wenn es als letzte Anweisung im Funktiosblock steht.
Machs mal so:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int) { MeineKlasse::getInstance(hInstance); MSG msgApp; while(PeekMessage(&msgApp, 0, 0, 0, PM_REMOVE)) { if(msgApp.message == WM_QUIT) break; TranslateMessage(&msgApp); DispatchMessage(&msgApp); MeineKlasse::getInstance().Tick(); } return (msgApp.wParam); }
-
Jo, so erscheint nur eine MessageBox.
Aber warum? Nach Tick() wurde doch WM_QUIT geworfen, somit sollte die while- Schleife kein weiteres Mal mehr durchlaufen?
MfG
-
Achja, und bei deiner Variante beendet das Programm sofort, egal was passiert.
MfG
-
Naja habs jetzt so gemacht:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int) { MeineKlasse::getInstance(hInstance); MSG msg = { 0 }; while(true) { if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) { if(msg.message == WM_QUIT) break; TranslateMessage(&msg); DispatchMessage(&msg); } MeineKlasse::getInstance().Tick(); } }Geht nicht vielleicht irgendwie "eleganter"?
MfG