当用户点击菜单、按钮、下拉列表框等控件时候,会触发WM_COMMAND LOWORD(wParam) 是控件或菜单或加速键的ID,菜单的sparator的ID为0 如果LOWORD(wParam) 是控件ID,HIWORD(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_RESTORE、SC_MOVE、SC_MAXIMIZE、SC_MINIMIZE、SC_CLOSE 等等操作了。这些命令都是通过Windows 投递WM_SYSCOMMAND 消息,在DefWindowProc 中进行处理的。 WM_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等)。
WM_MESSAGE是最普通的WINDOWS消息,对于这种类型的消息没什么好说的。那WM_COMMAND和WM_NOTIFY消息都是WINDOWS CONTROL给它的父窗体发的消息,那这两种消息有什么不同呢?WM_COMMAND消息其实是早期的(WIN3.X时代)子窗体消息,子窗体给父窗体发送消息,父窗体就捕获WM_COMMAND来处理子窗体的消息。但是这个消息只包括了有限的信息,例如wParam包括了子窗口ID和通知码,lParam则包括了子窗口句柄,就这点信息了,如果想知道一些额外的信息的话(例如,鼠标点在了子控件的位置)就要借助于其他的WM_*消息。所以对于新型的WIN32控件,微软就增加了一个新的NOTIFICATION消息,这个消息的参数是这样的:wParam包含了控件ID,而lParam则包含了一个结构体的指针,这个结构体是NMHDR结构或者以NMHDR结构为第一项的一个更大的结构体。这样就可以包含了很多的子控件想给父窗体提供的信息了,甚至可以自己去定义这种的结构体。
按钮在以下状态时会对它的父窗口发送WM_COMMAND的消息: 在Windows3.1里,控件会将mouse, keybord等等的消息通知它的父窗口, 使用的消息就只有WM_COMMAND, 事件种类和控件ID被包含在wParam中, 控件的句柄包含在lParam中。由于wParam和 lParam已经满了,当控件要向父窗口发送其它特殊消息同时附带很多信息的时候就没有地方可以存放它们了。所以Windows3.1中定义了许多其它的消息种类,比如WM_VSCROLL, WM_CTLCOLOR等等,每种消息wParam,lParam中附带的信息是不同的。 |
联系客服