mfc从入门到放弃 02

WM_COMMAND message

Sent when the user selects a command item from a menu, when a control sends a
notification message to its parent window, or when an accelerator keystroke is
translated.
send(被动式)
command item = 按钮 或 菜单项 工具栏按钮

当用户点击菜单,按钮,下拉列表框等控件的时候,会触发WM_COMMAND
LOWORD(wParam)是控件或菜单或加速键的ID,菜单的sparator的ID为0;

如果LOWORD(wParam)是控件ID,HIWRD(wParam)是notification code,比如BN_CLICKED,BN_DBLCLK等
,标志用户对控件的操作,双击,单击之类。
如果LOWORD(wParam)是菜单ID,HIWORD(wParam)是0。
如果LOWORD(wParam)是加速符ID,HIWORD(wParam)是1。
如果LOWORD(wParam)是控件ID,lParam是控件的句柄值,否则为NULL。
其实,GetDlgItem(hWnd, LOWORD(wParam)) == lParam。


Notification Code的命名规则:
列表框: LBN_****
组合框:CBN_****
Tab框 :TBN_****
按钮 :BN_****
Edit :EN_****

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

VM_COMMAND产生的条件:点击菜单,点击加速键,点击子窗口按钮,带年纪工具栏按钮。这些时候
都有command消息产生

WM_COMMAND消息中有两个参数,wparam、lparam,定义如下:
wParam 高两个字节 通知码
wParam 低两字节 命令ID
lParam 发送命令消息的子窗体句柄。
对于菜单和加速键来说,lParam为0,只有控件此项才非0。命令ID也就是资源脚本中定义的菜单项的
命令ID或者加速键的命令ID;菜单的通知码为0;加速键的通知码为1。

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

子窗口和父窗口:
子窗体被触发时,向父窗口发送一个WM_COMMAND消息,父窗体的窗口处理函数处理这个消息,进行
相关的处理。lParam表示子窗口句柄,LOWORD(wParam)表示子窗口ID,HIWORD(wParam)表示通知码
(例如单击,双击,SETFOCUS等)。

 

posted @ 2016-07-27 17:51  没吃完的火腿肠  阅读(225)  评论(0编辑  收藏  举报