Warum DestroyWindow schließen meiner Anwendung?
I ' V erstellt ein Fenster nach dem erstellen mein Haupt, aber den Aufruf DestroyWindow auf das handle schließt die gesamte Anwendung, wie kann ich einfach entfernen?
sieht es wie folgt aus:
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
HWND fakehandle;
hInst = hInstance; //Store instance handle in our global variable
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW | WS_EX_LAYERED,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
fakehandle = CreateWindow(szWindowClass, "FAKE WINDOW", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hWnd || !fakehandle)
{
return FALSE;
}
//some code
DestroyWindow(fakehandle);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
wie kann ich Zerstöre dieses Fenster, ohne Sie zu zerstören mein main ein? Ich erstelle ein dummy-Fenster zum überprüfen für multisampling in OpenGL.
Dank
- Haben Sie überprüft, dass
hWnd
undfakehandle
unterschiedlich sind? - ja, Sie sind unterschiedlich, je nach den debugger...
- Meine nicht, Sie zu kritisieren, wie ich bin sicher, Sie haben einen guten Grund. Justo wollen, um zu erfahren, warum Sie zu entwickeln, wäre eine windows-app-Petzold-Stil?
- Ich will nicht auf den zweiten-denke, die poster, aber wenn die app macht alles mit OpenGL dann noch etwas klüger ist als einfache Win32-overkill. Alles, was Sie brauchen, ist ein HWND (bestätigt, dass das update rect auf jeden
WM_PAINT
Beiträge und eine quit-Nachricht aufWM_CLOSE
), und ein polling message-loop. Sobald Sie haben, dass Sie gesetzt sind, und Sie können es vergessen. Etwas mehr Phantasie vorstellen können zusätzliche Abhängigkeiten und/oder machen Dinge schwieriger insgesamt. - Einfache Win32-kann mehr lesbar, dann mit MFC.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den ich gerade gefunden habe diesen Kommentar:
auf die
DestroyWindow
MSDN-Seite.Könnte dies einen gewissen Einfluss auf dein problem? Könnte man die Einstellung der Eltern von
hWnd
wo hast du//some code
?DestroyWindow() sendet eine WM_DESTROY an das Fenster in Frage. Wenn die WndProc geht WM_DESTROY an DefWindowProc(), dann DefWindowProc() töten wird, Ihre app.
So, in deiner WndProc, erstellen Sie einen Ereignishandler für WM_DESTROY (wenn Sie nicht bereits eine haben), und überprüfen Sie das Fenster-handle. Sie sollten in der Lage sein, zwischen den beiden zu unterscheiden und Maßnahmen von dort.
Bewusst sein, dass, wenn Sie tun, PostQuitMessage() auf den Namen des entweder Fenster, es wird nehmen Sie Ihre Anwendung, weil PostQuitMessage() beendet die message loop.
Ich vermute, dass die Angabe einer übergeordneten (Vierte param vom Ende) für die "fakehandle" Fenster " anstelle von NULL, kann helfen.
Auch könnte man überprüfen, ob dieses Zitat ", Wenn das Fenster zerstört wird, ist ein untergeordnetes Fenster, das nicht über den WS_EX_NOPARENTNOTIFY-Stil, eine WM_PARENTNOTIFY-Nachricht an das übergeordnete Element." (Aus: msdn.microsoft.com) für Ihren Fall.
Macht die Klasse bezeichnet, die von
szWindowClass
nennenPostQuitMessage
nach Erhalt derWM_CLOSE
oderWM_DESTROY
? Das hält Ihre Nachricht Schleife zunächst mal, sollte ich denken. (Aber wenn du mit dem debugger, vermutlich würden Sie gesehen haben das?)In jedem Fall, für Ihre dumme Fenster, für die besten Ergebnisse, die Sie bräuchten eine zweite Fenster-Klasse mit einem dämlichen WndProc. (Ich denke
DefWindowProc
geeignet wären.)