二 菜单消息处理模式

      以鼠标为例,当用鼠标单击菜单栏的任何部分时,鼠标只送入一个WM-NCHITTEST消息,默认函数DefWindowProc( )对此消息的处理结果是先后发出WM_SYSCOMMAND和WM_INITMENU。这两条消息不送入消息队列,函数DefWindowProc(  )直接把消息给窗口过程函数。这两条函数默认还是用DefWindowProc( )处理。先不讨论对WM_SYSCOMMAND的处理。DefWindowProc( )对WM_INITMENU的处理将导致三种情况发生:1鼠标单击在菜单栏的命令项上,则发出WM_COMMAND。2鼠标单击在菜单栏的弹出项时,发出WM_INITMENUPOPUP,这条消息处理完后显示弹出式菜单,单击弹出式菜单中的命令项,发出WM_COMMAND。3鼠标单击在菜单栏的空白处时,不做反映。以上消息除WM-NCHITTEST放入消息队列外,其他均直接调用窗口处理函数去处理。

            下面为自己写的测试代码:

#include<windows.h>
LRESULT   CALLBACK   WndProc(   HWND,   UINT,   WPARAM,   LPARAM   );  
int   WINAPI   WinMain(   HINSTANCE   hInstance,   HINSTANCE   hPrevInstance,  
          LPSTR   lpCmdLine,   int   nCmdShow   )  
{  
 HWND   hwnd;  
 MSG   Msg;  
 WNDCLASS   wndclass;  
 char   lpszClassName[]   =   "Windows";  
 char   lpszTitle[]   =   "Windows   Example";  
 wndclass.style   =   0;  
 wndclass.lpfnWndProc   =   WndProc;  
 wndclass.cbWndExtra   =   0;  
 wndclass.cbClsExtra   =   0;  
 wndclass.hInstance   =   hInstance;  
 wndclass.hIcon   =   LoadIcon(   NULL,   IDI_HAND   );  
 wndclass.hCursor   =   LoadCursor(   NULL,   IDC_CROSS   );  
 wndclass.hbrBackground   =   (HBRUSH)GetStockObject(   WHITE_BRUSH   );  
 wndclass.lpszMenuName   = "#101";  
 wndclass.lpszClassName   =   lpszClassName;  
   
 if   (   !RegisterClass(   &wndclass   )   )  
 {  
  MessageBeep(   0   );  
  return   FALSE;  
 }     
 hwnd   =   CreateWindow(   lpszClassName,   lpszTitle,  
                                    WS_OVERLAPPEDWINDOW,  
    CW_USEDEFAULT,   CW_USEDEFAULT,  
    CW_USEDEFAULT,   CW_USEDEFAULT,  
    NULL,   NULL,   hInstance,   NULL   );  
   
 ShowWindow(   hwnd,   nCmdShow   );    
 UpdateWindow(   hwnd   );    
   
 while   (   GetMessage(   &Msg,   NULL,   0,   0   )   )  
 {
  //Sleep(1000);
  TranslateMessage(   &Msg   );  
  DispatchMessage(   &Msg   );  
 }  
    return   Msg.wParam;  
}  
   
LRESULT   CALLBACK   WndProc(   HWND   hwnd,   UINT   message,  
      WPARAM   wParam,   LPARAM   lParam   )  
{  
 switch(   message   )  
 { 
  HDC hdcClick;
  case WM_DESTROY:   PostQuitMessage(   0   );
  case WM_SYSCOMMAND:
    hdcClick=GetDC(hwnd);
    TextOut(hdcClick,0,0,"SYSCOMMAND",sizeof("SYSCOMMAND"));
    ReleaseDC(hwnd,hdcClick); Sleep(1000);
    return   DefWindowProc(   hwnd,   message,   wParam,   lParam   );
  case WM_INITMENU:
    hdcClick=GetDC(hwnd);
    TextOut(hdcClick,0,20,"INITMENU",sizeof("INITMENU"));
    ReleaseDC(hwnd,hdcClick);   Sleep(1000);
    return   DefWindowProc(   hwnd,   message,   wParam,   lParam   );
  case WM_INITMENUPOPUP:
    hdcClick=GetDC(hwnd);
    TextOut(hdcClick,0,40,"INITMENUPOPUP",sizeof("INITMENUPOPUP"));
    ReleaseDC(hwnd,hdcClick);  Sleep(1000);
    return   DefWindowProc(   hwnd,   message,   wParam,   lParam   );
  case WM_COMMAND:
    hdcClick=GetDC(hwnd);
    TextOut(hdcClick,0,60,"COMMAND",sizeof("COMMAND"));
    ReleaseDC(hwnd,hdcClick);
    return   DefWindowProc(   hwnd,   message,   wParam,   lParam   );
  case WM_NCHITTEST:
    hdcClick=GetDC(hwnd);
    TextOut(hdcClick,0,80,"NCHITTEST",sizeof("NCHITTEST"));
    ReleaseDC(hwnd,hdcClick); Sleep(1000);
    return   DefWindowProc(   hwnd,   message,   wParam,   lParam   );
  case WM_LBUTTONDBLCLK: 
    hdcClick=GetDC(hwnd);
    TextOut(hdcClick,0,100,"LBUTTONDBLCLK",sizeof("LBUTTONDBLCLK"));
    ReleaseDC(hwnd,hdcClick);
    return   DefWindowProc(   hwnd,   message,   wParam,   lParam   );
  case WM_LBUTTONDOWN: 
    hdcClick=GetDC(hwnd);
    TextOut(hdcClick,0,120,"LBUTTONDOWN",sizeof("LBUTTONDOWN"));
    ReleaseDC(hwnd,hdcClick);
    return   DefWindowProc(   hwnd,   message,   wParam,   lParam   );
  default:  
  return   DefWindowProc(   hwnd,   message,   wParam,   lParam   );  
 }  
 return   0;  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值