Fenster bekommt keine Nachrichten???
-
Hallo ich habe ein Problem! Ich habe einen (eigentlich) sehr einfachen Code, der nur ein leeres Fenster erstellen soll, aber immer wenn ich kompiliere passiert einfach nix! Es kommt keine Fehlermeldung aber das Programm läuft. Beim Debuggen ist mir aufgefallen, dass er nie in den if-Zweig von PeekMessage() reingeht ...
#include <windows.h> HWND MainWnd; // Main Window HINSTANCE hInst; // Instance #define IDI_SAMPLE 107 #define IDI_SMALL 108 // ================================================================== // Forward Declaration // ================================================================== LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); HRESULT Engine_Start (); HRESULT Engine_Main (); HRESULT Engine_Stop (); // ================================================================== // WinMain // ================================================================== int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { HWND hWnd; WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = (WNDPROC)WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_SAMPLE)); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = NULL; wcex.lpszClassName = /*szWindowClass;*/ TEXT("parent"); wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); if (!RegisterClassEx(&wcex)) { return FALSE; } hInst = hInstance; // ================================================================== // Creates the Window // ================================================================== hWnd = CreateWindowEx(0, TEXT("parent"), TEXT("test"), WS_OVERLAPPEDWINDOW, 200 ,200 ,320, 200, NULL, NULL, hInstance, NULL); if (!hWnd) { return FALSE; } MainWnd = hWnd; // ================================================================== // Display Window // ================================================================== UpdateWindow(hWnd); // ================================================================== // Init Game Engine // ================================================================== Engine_Start(); // ================================================================== // Main Message Loop // ================================================================== MSG msg; ZeroMemory( &msg, sizeof(msg) ); while( msg.message!=WM_QUIT ) { if(PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE )) { if (GetMessage ( &msg, NULL, 0, 0)) { TranslateMessage( &msg ); DispatchMessage( &msg ); } } else { Engine_Main(); } // else } // while // ================================================================== // Engine Cleanup // ================================================================== Engine_Stop(); return (int) msg.wParam; }//WinMain // ================================================================== // WndProc // ================================================================== LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; switch (message) { case WM_SETCURSOR: SetCursor( NULL ); // Hide Cursor break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); RECT rc; GetClientRect(MainWnd,&rc); // Insert Drawing Code here EndPaint(hWnd, &ps); break; case WM_DESTROY: Engine_Stop(); // Main Cleanup SetCursor( LoadCursor(NULL, IDC_ARROW) ); // Show Cursor PostQuitMessage(0); break; case WM_SIZE: // If Window is allow to resize, paste code in here break; case WM_KEYDOWN: break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } // Window Proc // ================================================================== // Engine Functions // ================================================================== HRESULT Engine_Start() { return S_OK; } // Engine Start HRESULT Engine_Main() { return S_OK; } // Engine Main HRESULT Engine_Stop() { return S_OK; } // Engine StopUnd ja: Es soll ganz viel später mal ne GameEngine werden
!
-
Kein Wunder

if(PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ))
-
OK... erstmal danke für die schnelle Antwort. Ich denke ich stehe ziemlich auf dem Schlauch weil ich immer noch keine Ahnung habe was du mir sagen willst
!
Ich frage doch ganz normal ab ob eine Nachricht vorliegt und die Parameter müssten doch auch stimmen oder?
Tut mir leid, wenn ich irgendwie nicht durchblicke oder was übersehe...
-
TB_D schrieb:
OK... erstmal danke für die schnelle Antwort. Ich denke ich stehe ziemlich auf dem Schlauch weil ich immer noch keine Ahnung habe was du mir sagen willst
!
Ich frage doch ganz normal ab ob eine Nachricht vorliegt und die Parameter müssten doch auch stimmen oder?
Tut mir leid, wenn ich irgendwie nicht durchblicke oder was übersehe...Warum öffnest Du nicht einfach mal die MSDN zu PeekMessage und liest mal was PM_NOREMOVE bedeutet, wenn ich Dir schon die Stelle sage wo es hakt?
-
Und wenn man schon PeekMessage() aufruft, braucht man doch kein GetMessage() mehr, nicht?
-
Naja! Wenn ich mir den KOnstrukt noch mal ansehe macht es schon Sinn, obwohl man es auch mit einem PeekMessage hinbekommt.
Ist was da (peekMessage), dann hol die Nachricht (GetMessage).
Wenn aber PeekMessage immer TRUE liefert würd ich sagen ,das eben immer eine Nachricht vorhanden ist. Evtl. ein fenster für das nie BeginPaint/EndPaint aufgerufen wird.
-
@Messag0r: Ja ich denke du hast Recht! Ich hatte übrigens das PM_NOREMOVE nur für GetMessage() drinne, damit GetMessage() die Nachricht bekommt, sonst wäre sie ja gelöscht worden. (Wenn ich mich irre korrigiert mich)
Außerdem: Das PM_NOREMOVE hat ja nix damit zu tun, dass er einfach nicht in diesen if-Zweig geht!
Habe es natürlich auch schon mit PM_REMOVE versucht!
-
Das Problem ist das PeekMessage () NIE true liefert sonder immer false. D.h. er geht immer in den else Zweig
-
Dann würde ich sagen: Es ist eben keine Nachricht, da, weil kein Fenster sichtbar ist?
WS_VISIBLE/ShowWindow?
-
while(msg.message != WM_QUIT) { if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } else Engine_Main(); }Ja, genau, schreibe "WS_VISIBLE | WS_OVERLAPPEDWINDOW", nicht nur WS_OVERLAPPEDWINDOW.
-
JAAAA es klappt! Danke! Müssten aber nicht eig auch unsichtbare Fenster Nachrichten bekommen?
-
Ich habe wieder ein Problem: Ich will in der Init-Methode der GameEngine ein DirectX Device erstellen. Ich bekomme aber diese Fehlermeldung:
GameEngine.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_Direct3DCreate9@4" in Funktion ""public: void __thiscall GameEngine::Init(void)" (?Init@GameEngine@@QAEXXZ)".
PS: Ich habe die d3d9.lib und d3dx9.lib beim Linker unter zusätzliche Abhängigkeiten eingetragen!
-
TB_D schrieb:
JAAAA es klappt! Danke! Müssten aber nicht eig auch unsichtbare Fenster Nachrichten bekommen?
Sicher aber die Message Queue erhält ja nur Nachrichten vom User-Input, und den bekommt niunmal kein verstecktes Fenster.
-
Martin Richter schrieb:
Sicher aber die Message Queue erhält ja nur Nachrichten vom User-Input, und den bekommt niunmal kein verstecktes Fenster.
Wieso nicht? Ist Windows doch egal, ob ein Fenster versteckt ist oder nicht. Wenn ich ein gültiges Fenster habe, kann ich an dieses auch Nachrichten schicken. Wäre mir neu, wenn nicht.
-
Ja und außerdem ist die Nachricht WM_CREATE zum Beispiel ja nicht gerade vom User ausgelöst
. Wenn einer von euch sich mit DirectX auskennt wäre es toll wenn er sich noch mal meine zweite Frage angucken kann. Die einzige Lösung die ich dazu immer gehört habe ist d3d9.lib einbinden ... das habe ich aber schon gemacht! PS: Ich weiß das die Frage wohl eigentlich in ein anderes Forum gehört, dachte mir aber wo wir gerade am diskutieren sind ...
-
Ich weißt nicht was Du dait sagen willst.
In die Message Queue kommt WM_CREATE nicht.
WM_CREATE eben nicht über die Queue versendet sonder sofort in CreateWindow ausgelöst und ausgeliefert
-
Ahja wieder was dazu gelernt... aber was ist mit meiner zweiten Frage? Tut mir leid wenn ich damit nerve, aber ich weiß echt nicht mehr weiter
...
-
In Delphi soll es ein Orakel geben, das man alles fragen kann!