WIDNOW机制问题
/*
测试多窗口程序
*/
#include <windows.h>
HINSTANCE hInst;
//第一个消息循环函数
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
//第二个消息循环函数
LRESULT CALLBACK WndProc1 (HWND, UINT, WPARAM, LPARAM) ;
//开始函数
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
hInst=hInstance;
//声明且初始化变量
static TCHAR szAppName[] = TEXT ( "BtnLook ") ;
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;
//初始化结束
//注册变量
RegisterClass (&wndclass);
//创建窗口
hwnd = CreateWindow (szAppName, TEXT ( "Button Look "),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL) ;
//显示窗口
ShowWindow (hwnd, SW_SHOW) ;
UpdateWindow (hwnd) ;
//消息循环
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
MessageBox(NULL, "ABC ", "ABC ",0);
return msg.wParam ;
}
//第一个回调函数
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static TCHAR szAppName1[] = TEXT ( "BtnLook1 ") ;
int i=0;
switch (message)
{
//窗口创建时添加一个按钮
case WM_CREATE :
CreateWindow ( TEXT( "button "),TEXT( "button "),
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
10,
10,
200,
200,
hwnd,
(HMENU) 1,
((LPCREATESTRUCT) lParam)-> hInstance,
NULL) ;
return 0 ;
//单击按钮时创建另一个窗口
case WM_COMMAND :
//变量声明初始化
HWND hwnd1 ;
MSG msg ;
WNDCLASS wndclass ;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc1 ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance =hInst ;//这里出了问题
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName1 ;
//初始化结束
/*
//注册
RegisterClass (&wndclass);
//创建
hwnd1 = CreateWindow (szAppName1, TEXT ( "Button Look "),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInst, NULL) ;//这里出了问题
//显示
ShowWindow (hwnd1, SW_SHOW) ;
UpdateWindow (hwnd1) ;
//消息循环
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
*/
for(;i <100;)
{}
break ;
//结束
case WM_DESTROY :
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
//第二个回调函数
LRESULT CALLBACK WndProc1 (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
//结束
case WM_DESTROY :
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
这段代码显示一个窗口,上面添加一个按钮,现在在按钮的事件中添加了一个死循环,单击按钮就死掉了,而如果把这死循环去掉,把上面的消息循环去掉注释却可以正常运行,为什么呢?不都是死循环吗?
死循环处为
for(;i <100;){}
[解决办法]
这段代码显示一个窗口,上面添加一个按钮,现在在按钮的事件中添加了一个死循环,单击按钮就死掉了,而如果把这死循环去掉,把上面的消息循环去掉注释却可以正常运行--这是你说的话
看来你是真的不太懂应用程序的框架结构,或者说你正在学。
Windows的CPU在处理时是按时间片进行分配的,而这个时间片是以线程为单位的。
以上你创建的应用程序是处在同一个线程中,而你的死循环,亦for(;i <100;){}在处理你的新窗口的创建以后就会一直占用时间片,你的程序完全没有机会发送和处理其他消息,当然也就死掉了。