C中创建的窗口崩溃的原因

Pos*_*ger 0 c c++ windows getch createwindow

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

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

我尝试了很多东西,比如一起使用MessageBox()getch()一起使用,使用getch()before 和 after 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;
}
Run Code Online (Sandbox Code Playgroud)

不起作用的代码:

#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;
}
Run Code Online (Sandbox Code Playgroud)

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

Rem*_*eau 5

这段代码没有崩溃。

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

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

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