WINAPI窗口不工作
WINAPI window does not work.
我刚刚完成教程,就用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;
}
}
}
我试图将几乎所有内容都更改为不同的值,并添加头文件,但这从未奏效。
您需要对源代码进行以下更改:
-
指示窗口更新其内容:
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
将丢失,并且由于您没有检查> 0
的GetMessage
的返回值,您的消息循环将无限期地继续旋转。 -
将所有未处理的消息传递给
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;
在窗口过程的末尾添加以下内容:
return DefWindowProc(window, message, wParam, lParam);
现在,除了WM_DESTROY之外,您没有处理任何消息。并且不从过程中返回任何内容,这意味着未定义的行为。
相关文章:
- 如果不在窗口 10 中声明名为 openCV 的 openCV namedWindow,QT 图像显示将无法正常工作
- Visual Studio 2017 停止工作,并在打开后显示许多控制台窗口
- 自 Windows 10 20H1 以来,具有单独线程的多个窗口停止工作
- 我想使用此代码单击某个特定窗口,但它无法正常工作
- 渲染窗口无法跨多个函数工作
- QtCUrl post不再工作(Linux nok...窗口确定)
- 如何将C++ dll 在 C# 窗口窗体应用程序下的工作线程中运行
- 如何在工作区中使用 HTML/CSS UI 在C++中制作本机 UI 窗口
- 在工作线程中使用 QT 主窗口
- xcb_get_image_reply另一个工作区/桌面上的窗口失败
- Qt拖放在窗口中工作.我可以做到我只能放入Qlabel而不是整个窗口吗?
- 如何将子窗口(MFC 应用程序)的工作区保存到图像
- 从Windows注册表中保存的工作区检索窗口放置
- 资源窗口在其他系统上无法正常工作 (Visual Studio 2012)
- 将工作线程信号与主窗口插槽 (Qt5) 连接时出错
- CMD窗口停止工作,文本文件使用fstream读取错误
- 如何允许工作线程更新 X11 窗口
- Qt:为什么connect()只在主窗口类中工作
- C++ 如果某处有空间,则窗口系统 ( "path" ) 无法正常工作
- WM_PAINT在最小化并恢复窗口后停止工作