Почему CreateWindowEx () возвращает NULL

Я изучаю пример на MSDN, но когда я кодирую, у меня большие проблемы с CreateWindowEx (). Он возвращает NULL, поэтому не может создать окно. Я не понимаю, почему это вернуть. Этот код соответствует примеру MSDN. Вот мой код:

#include <Windows.h>

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);

int WINAPI wWinMain(HINSTANCE hIns, HINSTANCE hPreIns, PWSTR pCmdLine, int nCmdShow)
{
UNREFERENCED_PARAMETER(hPreIns);
UNREFERENCED_PARAMETER(pCmdLine);
HWND hWnd;
TCHAR ClassName[] = L"Learn";
TCHAR Title[] = L"My Window";
WNDCLASSEX wcx;
wcx.cbSize = sizeof(WNDCLASSEX);
wcx.style = CS_HREDRAW | CS_VREDRAW;
wcx.hInstance = hIns;
wcx.lpszClassName = ClassName;
wcx.lpfnWndProc = WndProc;
wcx.cbClsExtra = 0;
wcx.cbWndExtra = 0;
wcx.hbrBackground = CreateSolidBrush(RGB(238,201,0));
wcx.hIcon = LoadIcon(hIns, IDI_APPLICATION);
wcx.lpszMenuName = NULL;
wcx.hCursor = LoadCursor(hIns, IDC_WAIT);
wcx.hIconSm = LoadIcon(hIns, IDI_INFORMATION);
// Register
RegisterClassEx(&wcx);

hWnd = CreateWindowEx(0, ClassName, Title, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 1024, 768,
NULL, NULL, hIns, NULL);
if(hWnd == NULL)
{
MessageBox(hWnd, L"Fail!", L"Warning!", MB_OK);
return 1;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
MSG msg;
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_PAINT:
{
HDC hdc;
PAINTSTRUCT ps;
hdc = BeginPaint(hWnd, &ps);
FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));
EndPaint(hWnd, &ps);
}
break;
case WM_DESTROY:
{
PostQuitMessage(0);
break;
}
default: DefWindowProc(hWnd, msg, wParam, lParam);
}
return 0;
}

Спасибо.

0

Решение

  default: DefWindowProc(hWnd, msg, wParam, lParam);

Это неправильно, очень важно, чтобы вы возвращали значение, которое возвращает DefWindowProc (). Если вы этого не сделаете, то ваш обработчик сообщений возвращает FALSE для Сообщение WM_NCCREATE. Документально подтверждено, чтобы заставить CreateWindowEx () возвращать NULL, Windows отказывается от попытки создания окна. Fix:

  default: return DefWindowProc(hWnd, msg, wParam, lParam);
3

Другие решения