使用 Win32 API 建立 OpenGL 視窗時,CreateWindowEx 回傳 NULL 導致建立失敗,最常見原因是 視窗類別名稱不一致:註冊類別時用 lpszAppName ("OpenGL App"),但建立視窗時卻傳入 "MyClass"。
static LPCTSTR lpszAppName = "OpenGL App";
// 註冊類別
wc.lpszClassName = lpszAppName; // "OpenGL App"
RegisterClassEx(&wc);
// 建立視窗 - 錯誤!
hWnd = CreateWindowEx(
NULL,
"MyClass", // 這裡應與註冊時的 lpszClassName 相同
"The OpenGL window Application",
// ...
);
hWnd = CreateWindowEx(
NULL,
lpszAppName, // 使用同一個類別名稱指標
_T("OpenGL Window"),
WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
100, 100, 800, 600,
NULL, NULL, hInstance, NULL
);
RegisterClassEx 回傳值非 0。WS_VISIBLE 與後續 ShowWindow 重複無傷大雅,但 WS_EX_TOPMOST 等擴充樣式需謹慎。hInstance 必須為 WinMain 參數傳入的模組控制代碼。ChoosePixelFormat/SetPixelFormat 失敗不會導致 CreateWindowEx 失敗,但會使後續 OpenGL 初始化失敗。CreateWindowEx 後立即檢查 GetLastError(),錯誤碼 1407 (ERROR_CANNOT_FIND_WND_CLASS) 即為類別名不存在。Spy++ 或 WinId 工具檢視系統中已註冊的視窗類別。新專案建議使用 GLFW、SDL2 或 Qt 等跨平台庫建立 OpenGL 視窗,避免手寫繁瑣且易錯的 Win32 樣板代碼。
核對類別名稱一致性,是解決 Win32 視窗建立失敗的第一步。