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 的返回值是否为 &gt; 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 调用(请参阅文档)都应检查其返回值。特别是您需要检查对RegisterClassCreateWindow 的调用。后者会给你一个线索,那就是出了点问题:

    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(&amp;message, NULL, 0, 0)。 IInspectable 的回答也已经解释了这一点。

以上是关于WINAPI 窗口不工作。 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

使用 winapi 进行 GUI 设计的“完整”参考 [关闭]

未创建对话框 WinAPI

winapi - 防止上下文菜单关闭

为对话框启用关闭按钮 c++ winapi

WinAPI 鼠标点击无法正常工作

绘画后winapi窗口不刷新