WINAPI 窗口不工作。 [关闭]
Posted
技术标签:
【中文标题】WINAPI 窗口不工作。 [关闭]【英文标题】:WINAPI window does not work. [closed] 【发布时间】:2014-04-26 08:32:11 【问题描述】:我使用 C++ 和 WINAPI 制作了这个 GUI 应用程序,就在我完成我的教程之后,但无论我尝试什么都无法工作......
代码如下:
#include <windows.h>
LRESULT CALLBACK WinProc(HWND window, UINT message, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow)
WNDCLASS window;
window.cbClsExtra = NULL;
window.cbWndExtra = NULL;
window.hbrBackground = (HBRUSH)COLOR_BACKGROUND;
window.hCursor = LoadCursor (hInst, IDC_ARROW);
window.hIcon = NULL;
window.hInstance = hInst;
window.lpfnWndProc = WinProc;
window.lpszClassName = "WINDOW";
window.lpszMenuName = NULL;
window.style = CS_HREDRAW | CS_VREDRAW;
RegisterClass(&window);
HWND hwnd = CreateWindow("WINDOW", "Win32 Window Application", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 50, 50, 200, 200, NULL, NULL, hInst, NULL);
ShowWindow(hwnd, SW_SHOW);
MSG message;
while (GetMessage(&message, hwnd, 0, 0))
TranslateMessage(&message);
DispatchMessage(&message);
LRESULT CALLBACK WinProc(HWND window, UINT message, WPARAM wParam, LPARAM lParam)
switch(message)
case WM_DESTROY:
PostQuitMessage(0);
return 0;
break;
我尝试将几乎所有内容更改为不同的值并添加头文件,但效果不佳。
【问题讨论】:
当你说“从不工作”时,你的意思是什么?窗户不开吗?你在某处得到错误吗?程序会崩溃吗?请详细说明。 相当标准的错误,除了从不检查错误,因此永远无法诊断故障。您的窗口过程必须为它自己不处理的消息调用 DefWindowProc()。现在 WM_NCCREATE 消息没有得到处理,任何创建窗口的尝试都结束了。 您应该做的第一件事是检查函数的结果,通过文档中的说明确定是否发生任何错误,并获取更多信息(如果可用),如文档中所述。 【参考方案1】:您需要对源代码应用以下更改:
指示窗口更新其内容:
ShowWindow(hwnd, SW_SHOW);
UpdateWindow(hwnd);
初始化MSG
结构,不过滤消息,适当使用GetMessage
的返回值:
MSG message = 0;
while (GetMessage(&message, NULL, 0, 0) > 0)
TranslateMessage(&message);
DispatchMessage(&message);
使用hwnd
参数过滤消息只会从该窗口的消息队列中检索消息。 WM_QUIT
将丢失,并且由于您没有检查 GetMessage
的返回值是否为 > 0
,因此您的消息循环将继续无限期地旋转。
将您未处理的所有消息传递给DefWindowProc
。不这样做会阻止窗户甚至脱离地面。正如 Hans Passant 上面回复的那样,WM_NCCREATE
未处理,导致对CreateWindow
的调用失败(检查NULL
的返回值)。另外,不要忽略编译器警告(因为您发布的代码):
LRESULT CALLBACK WinProc(HWND window,
UINT message,
WPARAM wParam,
LPARAM lParam)
switch(message)
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
break;
return DefWindowProc(window, message, wParam, lParam);
始终检查错误。任何可能失败的 API 调用(请参阅文档)都应检查其返回值。特别是您需要检查对RegisterClass
和CreateWindow
的调用。后者会给你一个线索,那就是出了点问题:
if(RegisterClass(&window) == 0)
return -1;
// ...
if(hwnd == NULL)
return -1;
【讨论】:
【参考方案2】:在窗口过程的末尾添加以下内容:
return DefWindowProc(window, message, wParam, lParam);
现在除了 WM_DESTROY 之外,您没有处理任何消息。而且也没有从过程中返回任何东西,这意味着未定义的行为。
【讨论】:
我在窗口过程中的默认情况下添加了该行并且它工作但是当我单击 x 按钮时它只隐藏而不关闭,这可能是什么问题?? 那是因为你的GetMessage只接受窗口消息,而WM_QUIT是线程消息。您还需要更改为GetMessage(&message, NULL, 0, 0)
。 IInspectable 的回答也已经解释了这一点。以上是关于WINAPI 窗口不工作。 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章