二 菜单消息处理模式

原创 2007年10月10日 21:50:00

      以鼠标为例,当用鼠标单击菜单栏的任何部分时,鼠标只送入一个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;  
}

Java微信二次开发之14-自定义菜单及菜单响应事件的推送

2013年8月5日,伴随着微信5.0 iPhone版的发布,公众平台也进行了重要的更新,主要包括: 1)运营主体为组织,可选择成为服务号或者订阅号; 2)服务号可以申请自定义菜单; ...
  • LanBuff
  • LanBuff
  • 2016年09月06日 15:45
  • 5013

为duilib的MenuDemo增加消息响应,优化代码和显示效果

扩展duilib MenuDemo,制作通用菜单
  • zhuhongshu
  • zhuhongshu
  • 2014年07月29日 08:20
  • 9639

新版MenuDemo——使用Duilib模拟Windows原生菜单

相信玩Duilib的朋友已经期待这篇文章很久了,因为我在一周前发表的文章——“无焦点窗口的实现”里面提到了无焦点窗口在菜单里面的应用,并承诺大家,写一个关于Menu实现的Demo分享给大家。先上几张截...
  • Skilla
  • Skilla
  • 2014年12月22日 13:07
  • 4271

java微信开发API解析(六)-综合运用(消息处理、自定义菜单响应处理、用户自动分组处理;包含源码)

  • 2016年04月24日 20:18
  • 858KB
  • 下载

利用Delphi消息处理建立类似Windows开始菜单

====================================================== 注:本文源代码点此下载 =============================...
  • javazhuanzai
  • javazhuanzai
  • 2012年02月01日 03:29
  • 205

微信公众平台开发----自定义菜单、消息处理及获取OpenID(C#)

介绍了微信公众平台开发中,配置服务器地址,获取access_token、自定义菜单及消息处理等内容。...
  • u013075075
  • u013075075
  • 2016年07月28日 10:00
  • 297

java微信开发API解析(六)-综合运用(消息处理、自定义菜单响应处理、用户自动分组处理;包含源码)

java微信开发API解析(六)全局说明* 详细说明请参考前两篇文章。 本文说明* 本文主要是对前面学习的知识进行综合整合。 * 我们对需要的bean、工具类、xml、file进行必要的包装。 * 我...
  • wgyscsf
  • wgyscsf
  • 2016年04月24日 20:16
  • 5008

Android中的消息处理实例之二

  • 2015年06月22日 09:19
  • 3.39MB
  • 下载

Android消息处理机制之Message 二

  • 2013年11月29日 16:58
  • 1.14MB
  • 下载

微信公众号消息处理-工厂模式的实例

一. 业务情况 我们知道,在微信公众号开发中,经常需要处理各种各样的消息(事件),比如用户发来一段文本消息,我们需要进行自动回复;又比如有用户关注了微信公众号,我们要将这个用户的一些信息保存到用户表...
  • komyluo
  • komyluo
  • 2017年03月14日 11:52
  • 371
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二 菜单消息处理模式
举报原因:
原因补充:

(最多只允许输入30个字)