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]_[初级]_[关于窗口子类析构时崩溃的原因]