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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C中创建的窗口崩溃的原因相关的知识,希望对你有一定的参考价值。

[当我使用CreateWindow()函数在C中创建一个窗口时,它可以正常工作,它会立即消失,因此我使用了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函数,但编译器仍然至少应显示警告。

答案

此代码中没有崩溃。

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

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

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

以上是关于C中创建的窗口崩溃的原因的主要内容,如果未能解决你的问题,请参考以下文章

[WTL/ATL]_[初级]_[关于窗口子类析构时崩溃的原因]

[WTL/ATL]_[初级]_[关于窗口子类析构时崩溃的原因]

程序在 iOS 5 中崩溃而在 iOS 4 中正常?

使用 Swift 在代码中创建的中心 UILabel

如何重新打开在 OS X 的故事板中创建的关闭窗口

在 Redux thunk 中创建的数组未正确传递到状态树