我已经开始观看手工制作的英雄视频,我正在尝试制作一个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;
};发布于 2015-04-06 01:28:16
由于Remy得到了答案,问题是我的WNDCLASS对所有字段都没有初始化值,除了我更改的字段之外,这导致了RegisterClass()失败,从而导致CreateWindowEx()失败。
我将WNDCLASS声明更改为:
WNDCLASS GameWindow = {0};感谢每一个帮忙的人。
发布于 2015-04-05 17:14:31
您的窗口过程在除default:之外的每个路径中返回一个未初始化的变量,这是未定义的行为,窗口创建失败是完全可能的。
对于WM_CREATE,文档说:
如果应用程序处理此消息,则应返回零以继续创建窗口。
正如迈克尔在评论中指出的那样,RegisterClass正在失败。同样的错误类型,您传递的是一个WNDCLASS结构,而大多数成员都没有初始化。
https://stackoverflow.com/questions/29459827
复制相似问题