命令消息WM_COMMAND

命令消息是一种特殊的窗口函数,它从一个窗口发送到另一个窗口,以处理来自用户的请求,当用户单击一个菜单项、工具栏或者加速键时,将会产生命令消息,并被发送到能处理该请求的类对象,此类消息参数如下:

 

       消息

     参数wParam

    参数IParam

   WM_COMMAND

  0

 CommandID

       0

其中wParam的高字为0,低字为CommandID,这个命令ID要么是选中菜单项的ID,要么是被单击的工具栏按钮。需要注意的是,低字CommandID不能大于一个字长,如果它大于一个字长,则系统就只用0来填充高位字。某些控件通知也用WM_COMMAND消息区别两种消息的唯一方法是IParam是否为NULL

对于菜单和加速键来说,lParam 0 ,只有控件此项才非0 控件是一个句柄,用来标识发出该通知的空间。命令ID 也就是资源脚本中定义的菜单项的命令ID 或者加速键的命令ID ;菜单的通知码为0 ;加速键的通知码为1

对于Windows 菜单中菜单项和加速键,点击后,Windows 会向所属的窗体发送WM_SYSCOMMAND ,而不是WM_COMMAND 消息。注意,WINDOWS 菜单是系统菜单,也就是在标题栏点击鼠标左键的时候弹出的菜单。我们可以捕获WM_CREATE 消息,加入自己的操作:GetSysMenu 获取系统菜单句柄,然后对系统菜单进行操作,并且捕获添加菜单项(根据菜单命令ID ID 对应的WM_SYSCOMMAND 消息进行处理。修改系统默认的菜单行为。

 

如:#define IDM_SELMENU 0x4444

 

else if ( uMsg == WM_CREATE)

 

       {

              HMENU hMenu = GetSystemMenu(hWnd,0);

              AppendMenu(hMenu,0,IDM_SELMENU,"Show Hello");

              return DefWindowProc(hWnd,uMsg,wParam,lParam);

       }

 

       else if ( uMsg == WM_SYSCOMMAND) //

       {           

              if ( wParam << 16 >> 16 == 0x4444 )

 

              {

                     MessageBox(NULL,"SysMenu:Show Hello MenuItem", "sysmenu info",MB_OK);

                     return 0;

              }

 

              return DefWindowProc(hWnd,uMsg,wParam,lParam);

 

       }

 

 对于WM_SYSCOMMAND 中如果是系统菜单的消息,必须要交给DefWindowProc 来处理,并且将返回值返回给Windows ,不然不能拖动窗体、改变大小、最大最小化操作等。因为你如果不交给DefWindowProc 处理,相当于屏蔽了SC_RESTORE 、SC_MOVE 、SC_MAXIMIZE 、SC_MINIMIZE 、SC_CLOSE 等等操作了。这些命令都是通过Windows 投递WM_SYSCOMMAND 消息,在DefWindowProc 中进行处理。

你可能感兴趣的:(命令消息WM_COMMAND)