2015-04-05 41 views
0

我已經開始看手工英雄視頻,我試圖做一個win32窗口,但CreateWindowEx()函數保持失敗。C++ CreateWindowEx()無法創建窗口

我檢查了錯誤代碼,我得到1407

代碼如下。

在此先感謝。

#include <Windows.h> 

LRESULT CALLBACK WindowProcedure(
    HWND hwnd, 
    UINT uMsg, 
    WPARAM wParam, 
    LPARAM lParam 
    ) 
{ 
    LRESULT result; 

    switch (uMsg) 
    { 
    case WM_ACTIVATEAPP: 
     { 
      OutputDebugStringA("The window is now active"); 

      break; 
     } 

    case WM_SIZE: 
     { 
      OutputDebugStringA("The window is now being resized"); 

      break; 
     } 

    case WM_CREATE: 
     { 
      OutputDebugStringA("The window has been created"); 

      break; 
     } 

    default: 
     { 
      result = DefWindowProc(hwnd, uMsg, wParam, lParam); 

      break; 
     } 
    } 

    return result; 
}; 

int CALLBACK WinMain(
    HINSTANCE hInstance, 
    HINSTANCE hPrevInstance, 
    LPSTR lpCmdLine, 
    int nCmdShow 
    ) 
{ 
    WNDCLASS GameWindow; 

    GameWindow.style = CS_OWNDC|CS_HREDRAW|CS_VREDRAW; 
    GameWindow.lpfnWndProc = WindowProcedure; 
    GameWindow.hInstance = hInstance; 
//  HICON  hIcon; 
    GameWindow.lpszClassName = "HandmadeHeroWindowClass"; 

    RegisterClass(&GameWindow); 

    if (HWND GameWindowHandle = CreateWindowEx(
     0, 
     GameWindow.lpszClassName, 
     "Handmade Hero", 
     WS_OVERLAPPEDWINDOW | WS_VISIBLE, 
     CW_USEDEFAULT, 
     CW_USEDEFAULT, 
     CW_USEDEFAULT, 
     CW_USEDEFAULT, 
     0, 
     0, 
     hInstance, 
     0 
     )) 
    { 

     for (;;) 
     { 
      MSG message; 
      BOOL messageResult = GetMessage(&message, GameWindowHandle, 0, 0); 
      if (messageResult != 0) 
      { 
       DispatchMessage(&message); 
      } 
      else if (messageResult == 0) 
      { 
       break; 
      } 
      else 
      { 
       // ERROR 
      } 
     } 

    } 
    else 
    { 
     OutputDebugStringA("Couldn't create window"); 
    } 

    DWORD error = GetLastError(); 

    return 0; 
}; 
+2

1407 =='ERROR_CANNOT_FIND_WND_CLASS' – Michael 2015-04-05 17:05:28

+0

查看您的註冊類是否成功。我猜測它沒有。 – tMJ 2015-04-05 17:09:00

+1

我同意IMJ。 'RegisterClass()'很可能失敗,因爲許多'WNDCLASS'字段沒有被初始化。始終對API結構進行零初始化,並始終檢查API函數調用的錯誤代碼。 – 2015-04-05 19:57:45

回答

1

感謝Remy Lebeau提供的答案,問題在於我的WNDCLASS除了我更改的所有字段都沒有初始化值,導致RegisterClass()失敗,從而導致CreateWindowEx()失敗。

我改變WNDCLASS聲明如下:

WNDCLASS GameWindow = {0}; 

謝謝大家誰幫助。

1

你的窗口過程中除了default:每個路徑返回一個未初始化的變量,這是不確定的行爲和窗口創建失敗是完全有可能的。

對於WM_CREATE,該文件說:

如果應用程序處理此消息,它應該返回零來繼續窗口的創建。


正如邁克爾在評論中指出,RegisterClass失敗。相同類型的錯誤,您將傳遞一個WNDCLASS結構,使大多數成員未初始化。

+0

@Remy:文檔實際上並未說明所有非零值會發生什麼情況。只有零和-1。無論哪種方式,返回一個未初始化的值是UB。 – 2015-04-05 17:20:38

+0

我刪除了我的開關,並讓它返回DefWindowProc(hwnd,uMsg,wParam,lParam),但仍然不工作。 – mkdewidar 2015-04-05 17:44:51