Winapi C++;CreateWindowEx()无法创建窗口
我开始观看手工制作的hero视频,并试图制作一个win32窗口,但CreateWindowEx()函数一直失败 我检查了错误代码,得到了1407 代码如下 提前谢谢Winapi C++;CreateWindowEx()无法创建窗口,winapi,Winapi,我开始观看手工制作的hero视频,并试图制作一个win32窗口,但CreateWindowEx()函数一直失败 我检查了错误代码,得到了1407 代码如下 提前谢谢 #include <Windows.h> LRESULT CALLBACK WindowProcedure( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { LRESULT result; s
#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;
};
#包括
LRESULT回调窗口过程(
HWND HWND,
联合通讯社,
WPARAM WPARAM,
LPARAM
)
{
结果;
开关(uMsg)
{
案例WM_激活EAPP:
{
OutputDebugStringA(“窗口现在处于活动状态”);
打破
}
案例WM_大小:
{
OutputDebugStringA(“窗口现在正在调整大小”);
打破
}
案例WM_创建:
{
OutputDebugStringA(“已创建窗口”);
打破
}
违约:
{
结果=DefWindowProc(hwnd、uMsg、wParam、lParam);
打破
}
}
返回结果;
};
int回调WinMain(
HINSTANCE HINSTANCE,
HINSTANCE HPPrevenstance,
LPSTR lpCmdLine,
国际nCmdShow
)
{
WNDCLASS游戏窗口;
GameWindow.style=CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
GameWindow.lpfnWndProc=WindowProcedure;
GameWindow.hInstance=hInstance;
//HICON HICON;
GameWindow.lpszClassName=“手工制作的窗口类”;
注册表类(和游戏窗口);
如果(HWND GameWindowHandle=CreateWindowEx(
0,
GameWindow.lpszClassName,
“手工制作的英雄”,
WS|U重叠窗口| WS|U可见,
CW_使用默认值,
CW_使用默认值,
CW_使用默认值,
CW_使用默认值,
0,
0,
hInstance,
0
))
{
对于(;;)
{
消息;
BOOL messageResult=GetMessage(&message,GameWindowHandle,0,0);
if(messageResult!=0)
{
DispatchMessage(&message);
}
else if(messageResult==0)
{
打破
}
其他的
{
//错误
}
}
}
其他的
{
OutputDebugStringA(“无法创建窗口”);
}
DWORD error=GetLastError();
返回0;
};
您的窗口过程在每个路径中返回一个未初始化的变量,默认值除外:,这是未定义的行为,窗口创建失败是完全可能的
对于WM_CREATE
,文档说明:
如果应用程序处理此消息,则应返回零以继续创建窗口
正如Michael在评论中指出的,
RegisterClass
正在失败。同一类错误,您传递的是一个WNDCLASS
结构,导致大多数成员未初始化。多亏了Remy Lebeau的回答,问题是我的WNDCLASS对所有字段都没有初始化值,除了我更改的字段,这导致RegisterClass()失败,从而导致CreateWindowEx()失败
我将WNDCLASS声明更改为:
WNDCLASS GameWindow = {0};
感谢所有帮助您的人。1407==
ERROR\u找不到\u WND\u类
查看您的注册类是否成功。我猜不是。我同意IMJRegisterClass()
可能会失败,因为许多WNDCLASS
字段未初始化。始终为零初始化API结构,并始终检查API函数调用中的错误代码。@RemyLebeau非常感谢您remy,我将所有字段初始化为零,然后更改了我想要的字段,现在它可以工作了。谢谢大家。@Remy:文档并没有说明所有非零值的情况。只有0和-1。无论哪种方式,返回未初始化的值都是UB。我删除了我的开关,让它返回DefWindowProc(hwnd、uMsg、wParam、lParam),但仍然不起作用。