C 中 created window 崩溃的原因
Reason for crashing of created window in C
当我使用 CreateWindow()
函数在 C 中创建一个 window 时,它工作正常但立即消失,所以我使用 getch()
函数来尝试解决这个问题但是这没用。 window 不显示按钮,并崩溃。
但是当我使用 MessageBox()
而不是 getch()
时,它仍然正常运行。我想弄清楚为什么会这样。
我尝试了很多东西,比如一起使用 MessageBox()
和 getch()
,在 ShowWindow()
之前和之后使用 getch()
,但每次它都会给我一些有趣的结果但是不是 window.
的正常功能
有效代码:
#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()
示例只是缺少服务 window 所需的消息循环,而且 getch()
在非控制台应用程序中毫无意义。所以你的 WinMain()
在显示按钮 window 后立即退出。
而您的 MessageBox()
示例有一个消息循环(在 MessageBox()
本身内部),它保持 WinMain()
运行 和按钮 window processong UI 条消息,直到 MessageBox
对话框关闭。
此外,尝试将按钮显示为自己的重叠 window 没有任何意义。您应该注册并创建一个单独的重叠 window,然后将按钮创建为子按钮。按钮上的用户操作会发送到按钮的父级 window,因此您需要为其创建一个父级 window。
当我使用 CreateWindow()
函数在 C 中创建一个 window 时,它工作正常但立即消失,所以我使用 getch()
函数来尝试解决这个问题但是这没用。 window 不显示按钮,并崩溃。
但是当我使用 MessageBox()
而不是 getch()
时,它仍然正常运行。我想弄清楚为什么会这样。
我尝试了很多东西,比如一起使用 MessageBox()
和 getch()
,在 ShowWindow()
之前和之后使用 getch()
,但每次它都会给我一些有趣的结果但是不是 window.
有效代码:
#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()
示例只是缺少服务 window 所需的消息循环,而且 getch()
在非控制台应用程序中毫无意义。所以你的 WinMain()
在显示按钮 window 后立即退出。
而您的 MessageBox()
示例有一个消息循环(在 MessageBox()
本身内部),它保持 WinMain()
运行 和按钮 window processong UI 条消息,直到 MessageBox
对话框关闭。
此外,尝试将按钮显示为自己的重叠 window 没有任何意义。您应该注册并创建一个单独的重叠 window,然后将按钮创建为子按钮。按钮上的用户操作会发送到按钮的父级 window,因此您需要为其创建一个父级 window。