我开始观看手工制作的英雄视频,我试图创建一个win32窗口,但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;
};
答案 0 :(得分:1)
您的窗口过程在除default:
之外的每个路径中返回一个未初始化的变量,这是未定义的行为,并且完全可以创建窗口失败。
对于WM_CREATE
,文档说:
如果应用程序处理此消息,则应返回零以继续创建窗口。
迈克尔在评论中指出,RegisterClass
失败了。同样的错误,您通过了WNDCLASS
结构,大多数成员都未初始化。
答案 1 :(得分:1)
感谢Remy Lebeau的回答,问题是我的WNDCLASS除了我改变的那些字段外都有未初始化的值,这导致RegisterClass()失败,因此CreateWindowEx()失败。
我将WNDCLASS声明更改为:
WNDCLASS GameWindow = {0};
感谢所有帮助过的人。