首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

WIDNOW机制有关问题

2012-02-07 
WIDNOW机制问题/*测试多窗口程序*/#includewindows.hHINSTANCEhInst//第一个消息循环函数LRESULTCALLBA

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;){}在处理你的新窗口的创建以后就会一直占用时间片,你的程序完全没有机会发送和处理其他消息,当然也就死掉了。

热点排行