WINAPI窗口不起作用。

时间:2014-04-26 08:32:11

标签: c++ winapi user-interface

我已经使用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;

}
}

}

我试图将几乎所有内容更改为不同的值并添加头文件,但这种方法从来没有用过。

2 个答案:

答案 0 :(得分:4)

您需要对源代码应用以下更改:

  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会丢失,因为您没有检查GetMessage > 0的返回值,您的消息循环会无限期地继续旋转。

  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;
    

答案 1 :(得分:0)

在窗口过程结束时添加以下内容:

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

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