WINAPI窗口不工作

WINAPI window does not work.

本文关键字:工作 窗口 WINAPI      更新时间:2023-10-16

我刚刚完成教程,就用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;
}
}
}

我试图将几乎所有内容都更改为不同的值,并添加头文件,但这从未奏效。

您需要对源代码进行以下更改:

  1. 指示窗口更新其内容:

    ShowWindow(hwnd, SW_SHOW);
    UpdateWindow(hwnd);
    
  2. 初始化MSG结构,不过滤消息,适当使用GetMessage:的返回值

    MSG message = {0};
    while (GetMessage(&message, NULL, 0, 0) > 0){
        TranslateMessage(&message);
        DispatchMessage(&message);
    }
    

    使用hwnd参数筛选消息将只从该窗口的消息队列中检索消息。WM_QUIT将丢失,并且由于您没有检查> 0GetMessage的返回值,您的消息循环将无限期地继续旋转。

  3. 将所有未处理的消息传递给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);
    }
    
  4. 始终检查错误。任何可能失败的API调用(请参阅文档)都应该检查其返回值。特别需要检查对RegisterClassCreateWindow的调用。后者会给你线索,表明出了问题:

    if(RegisterClass(&window) == 0)
        return -1;
    // ...
    if(hwnd == NULL)
        return -1;
    

在窗口过程的末尾添加以下内容:

return DefWindowProc(window, message, wParam, lParam);

现在,除了WM_DESTROY之外,您没有处理任何消息。并且不从过程中返回任何内容,这意味着未定义的行为。