Somebody sent me email pointing out strange behavior in the
MessageBox
function if you fail a window creation
by returning −1 from the WM_CREATE
message.
On the other hand, returning FALSE
from
WM_NCCREATE
seems to work just fine.
“So why the difference with WM_CREATE
?”
#include <windows.h> LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_CREATE: return -1; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hWnd, uMsg, wParam, lParam); } int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, int nShowCmd) { MSG msg; HWND hWnd; WNDCLASS wc = { 0 }; wc.lpfnWndProc = WndProc; wc.hInstance = hInst; wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wc.lpszClassName = "TestApp"; if(!RegisterClass(&wc)){ MessageBox(NULL, "Error creating class", "Test App", MB_ICONERROR); return 1; } hWnd = CreateWindow(wc.lpszClassName, "Test App", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, 0, hInst, NULL); if(!hWnd){ MessageBox(NULL, "Error creating window", "Test App", MB_ICONERROR); return 1; } ShowWindow(hWnd, nShowCmd); UpdateWindow(hWnd); while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int)msg.wParam; }
You already know enough to solve this puzzle. You just need to connect the dots.
(In fact, the person who sent me this topic did so a year after I already answered it. But I’m repeating it here because the original answer was accidentally destroyed.)
0 comments