0

当我使用该函数在 C 中创建一个窗口时 CreateWindow(),它工作正常,只是立即消失,所以我使用该getch()函数尝试解决问题,但它不起作用。窗口不显示按钮,并崩溃。

但是当我使用MessageBox()代替时getch(),它会保持正常运行。我试图弄清楚为什么会发生这种情况。

我尝试了很多东西,比如使用MessageBox()getch()一起使用,使用getch()之前和之后ShowWindow(),但每次它都会给我一些有趣的结果,但不是窗口的正常功能。

有效的代码:

#include <windows.h>

int _stdcall WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{
    HWND h;
    HINSTANCE i;
    h = CreateWindow("Button", "XYZ", WS_OVERLAPPEDWINDOW, 15, 20, 250, 200, 0, 0, i, 0);
    ShowWindow(h, nCmdShow);
    MessageBox(0, "Stop", "Wait", MB_OK);
    return 0;
}

不起作用的代码:

#include <windows.h>

int _stdcall WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{
    HWND h;
    HINSTANCE i;
    h = CreateWindow("Button", "XYZ", WS_OVERLAPPEDWINDOW, 15, 20, 250, 200, 0, 0, i, 0);
    ShowWindow(h, nCmdShow);
    getch();
    return 0;
}

我想知道这个错误的原因。我认为这是因为它getch()是一个 DOS 函数,但编译器至少应该显示一个警告。

4

1 回答 1

6

这段代码没有崩溃。

您的getch()示例只是缺少服务窗口所需的消息循环,并且getch()在非控制台应用程序中也毫无意义。因此,您WinMain()在显示按钮窗口后立即退出。

而您的示例有一个持续运行MessageBox()的消息循环(在自身内部) ,并且按钮窗口处理 UI 消息,直到对话框关闭。MessageBox()WinMain()MessageBox

此外,尝试将按钮显示为自己的重叠窗口是没有意义的。您应该注册并创建一个单独的重叠窗口,然后将按钮创建为子级。按钮上的用户操作被发送到按钮的父窗口,因此您需要为其创建一个父窗口。

于 2020-03-22T09:36:33.407 回答