Potwierdzenie wyjścia z programu WinAPI

0

Mam prosty programik w WinAPI, który przed wyłączeniem ma zapytać, czy użytkownik na pewno chce zakończyć pracę.

#define WIN32_LEAN_AND_MEAN

#include <windows.h>

HWND okno_glowne_hWnd;
HINSTANCE hInst;

LRESULT CALLBACK WindowEventProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch (uMsg)
	{
		case WM_DESTROY:
			if (MessageBox(hWnd, "Wyjść z programu?", "Zamykanie...", MB_YESNO | MB_ICONQUESTION) == 6)
			{
				DestroyWindow(okno_glowne_hWnd);
				PostQuitMessage(0);
				return 0;
			}
			else
				return 0;
		break;
	}

	return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR lpCmdLine, int nShowCmd)
{
	WNDCLASSEX okno_glowne;
	ZeroMemory(&okno_glowne, sizeof(okno_glowne));

	okno_glowne.cbSize = sizeof(okno_glowne);
	okno_glowne.hInstance = hInstance;
	okno_glowne.lpfnWndProc = WindowEventProc;
	okno_glowne.lpszClassName = "okno_glowne";
	okno_glowne.hIcon = LoadIcon(0, IDI_APPLICATION);
	okno_glowne.hCursor = LoadCursor(0, IDC_ARROW);
	okno_glowne.hbrBackground = (HBRUSH) COLOR_WINDOW;

	RegisterClassEx(&okno_glowne);

	okno_glowne_hWnd = CreateWindowEx(0, "okno_glowne", "Okno", WS_OVERLAPPEDWINDOW, 10, 10, 40, 80, 0, 0, hInstance, 0);

	ShowWindow(okno_glowne_hWnd, nShowCmd);

	MSG komunikaty;
	while(GetMessage(&komunikaty, 0, 0, 0))
	{
		TranslateMessage(&komunikaty);
		DispatchMessage(&komunikaty);
	}

	return static_cast<int>(komunikaty.wParam);
}

Co zrobić, aby program zadziałał poprawnie?

0

WM_DESTROY leci w przypadku niszczenia okna, bez możliwości zatrzymania. Za obsługę zamykania odpowiada WM_CLOSE. Tak poza tym WM_DESTROY jest wysyłane przez DestroyWindow, które powinno być wołane w obsłudze WM_CLOSE. PostQuitMessage trzymaj dalej w obsłudze niszczenia.

0
LRESULT CALLBACK WindowEventProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
        switch (uMsg)
        {
                case WM_DESTROY:
                        PostQuitMessage(0);
                        return 0;

                case WM_CLOSE:
                        if (MessageBox(hWnd, TEXT("Wyjść z programu?"), TEXT("Zamykanie..."), 
                                MB_YESNO | MB_ICONQUESTION) == IDNO) return 0;
                        break;
        }

        return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1