2014-11-30 4 views
0

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

#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; 
} 

Большое спасибо.

+4

Вы можете вызвать 'GetLastError', чтобы получить код ошибки после сбоя' CreateWindowEx'. Это может дать вам дополнительную информацию. – Michael

+0

Ох, я не нашел ошибку. Можете ли вы помочь мне решить эту проблему? –

ответ

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

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