菜单、控件、快捷键消息:wm_command

上传人:子 文档编号:42202555 上传时间:2018-06-01 格式:DOC 页数:5 大小:27KB
返回 下载 相关 举报
菜单、控件、快捷键消息:wm_command_第1页
第1页 / 共5页
菜单、控件、快捷键消息:wm_command_第2页
第2页 / 共5页
菜单、控件、快捷键消息:wm_command_第3页
第3页 / 共5页
菜单、控件、快捷键消息:wm_command_第4页
第4页 / 共5页
菜单、控件、快捷键消息:wm_command_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《菜单、控件、快捷键消息:wm_command》由会员分享,可在线阅读,更多相关《菜单、控件、快捷键消息:wm_command(5页珍藏版)》请在金锄头文库上搜索。

1、菜单、控件、快捷键消息:菜单、控件、快捷键消息:WM_COMMANDWM_COMMANDWM_COMMAND 消息当用户点击菜单、按钮、下拉列表框等控件时候,会触发WM_COMMANDLOWORD(wParam) 是控件或菜单或加速键的 ID,菜单的 sparator 的ID 为 0如果 LOWORD(wParam) 是控件 ID,HIWORD(wParam)是 notification code, 比如 BN_CLICKED, BN_DBLCLK 等,标志用户对控件的操作,双击,单击之类。如果 LOWORD(wParam) 是菜单 ID,HIWORD(wParam)是 0。如果 LOWORD

2、(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 ,不然你会发现不能拖动窗体、改变大小、最大最小化操作等。

3、因为你如果不交给 DefWindowProc 处理,相当于屏蔽了SC_RESTORE、SC_MOVE、SC_MAXIMIZE、SC_MINIMIZE、SC_CLOSE 等等操作了。这些命令都是通过 Windows 投递 WM_SYSCOMMAND 消息,在 DefWindowProc 中进行处理的。WM_COMMAND 产生的条件:点击菜单,点击加速键,点击子窗口按钮,点击工具栏按钮。这些时候都有 command 消息产生。WM_COMMAND 消息中有两个参数,wparam、lparam,定义如下:wParam 高两个字节 通知码wParam 低两字节 命令 IDlParam 发送命令消息的

4、子窗体句柄。对于菜单和加速键来说,lParam 为 0,只有控件此项才非 0。命令ID 也就是资源脚本中定义的菜单项的命令 ID 或者加速键的命令ID;菜单的通知码为 0;加速键的通知码为 1。对于 Windows 菜单中菜单项和加速键,点击后,Windows 会向所属的窗体发送 WM_SYSCOMMAND,而不是 WM_COMMAND 消息。注意,WINDOWS 菜单是系统菜单,也就是在标题栏点击鼠标左键的时候弹出的菜单。我们可以捕获 WM_CREATE 消息,加入自己的操作:GetSysMenu 获取系统菜单句柄,然后对系统菜单进行操作,并且捕获添加菜单项(根据菜单命令 ID)ID 对应的

5、 WM_SYSCOMMAND 消息进行处理。修改系统默认的菜单行为。子窗体和父窗体:子窗体被触发时,向父窗体发送一个 WM_COMMAND 消息,父窗体的窗口函数处理这个消息,进行相关的处理。lParam 表示子窗口句柄,LOWORD(wParam)表示子窗口 ID,HIWORD (wParam)表示通知码(例如单击,双击,SETFOCUS 等) 。WM_MESSAGE、WM_COMMAND、WM_NOTIFY 等消息有什么不同? WM_MESSAGE 是最普通的 WINDOWS 消息,对于这种类型的消息没什么好说的。那 WM_COMMAND 和 WM_NOTIFY 消息都是 WINDOWS

6、CONTROL 给它的父窗体发的消息,那这两种消息有什么不同呢?WM_COMMAND 消息其实是早期的(WIN3.X 时代)子窗体消息,子窗体给父窗体发送消息,父窗体就捕获 WM_COMMAND 来处理子窗体的消息。但是这个消息只包括了有限的信息,例如 wParam 包括了子窗口 ID和通知码,lParam 则包括了子窗口句柄,就这点信息了,如果想知道一些额外的信息的话(例如,鼠标点在了子控件的位置)就要借助于其他的 WM_*消息。所以对于新型的 WIN32 控件,微软就增加了一个新的 NOTIFICATION 消息,这个消息的参数是这样的:wParam包含了控件 ID,而 lParam 则包

7、含了一个结构体的指针,这个结构体是 NMHDR 结构或者以 NMHDR 结构为第一项的一个更大的结构体。这样就可以包含了很多的子控件想给父窗体提供的信息了,甚至可以自己去定义这种的结构体。这就是这几种消息的差别点了。控件的自画:首先在创建控件的时候当然就是指定 BS_OWNERDRAW 的 STYLE,这个 STYLE 是告诉控件,别自己处理外观,让主程序来处理你的外观,这时你就有权决定这个控件是画成什么样子了。然后就是处理WM_DRAWITEM 的消息,利用 LPDRAWITEMSTRUCT pdis = (LPDRAWITEMSTRUCT) lParam; 来取得一些必要的信息,如按钮的D

8、C,位置等。这才能对这个 DC 的内容进行绘画啊。COMMON CTRL 的STYLE 都在 COMMCTRL.H 头文件里。按钮在以下状态时会对它的父窗口发送 WM_COMMAND 的消息:按了一次(BN_CLICKED) ,取得焦点(BN_SETFOCUS) ,失去焦点(BN_KILLFOCUS)等。这个是按钮的发送 WM_COMMAND 的条件,其他的控件什么时候会发送WM_COMMAND 消息可查看该控件的通知码(在 wParam 的高位 HIWORD) 。例如,滚动条控件在被滚动的时候会向它的父窗体发送消息,但是不是 WM_COMMAND 消息,而是 WM_VSCROLL 和 WM_

9、HSCROLL 消息。这只是为了说明凡是子控件,都会在适当的条件下向它的父窗体发送消息。无论是 WM_COMMAND 还是 WM_NOTIFY 或是 WM_VSCROLL 消息等。MoveWindow 会产生 WM_SIZE 消息。在 Windows3.1 里,控件会将 mouse, keybord 等等的消息通知它的父窗口, 使用的消息就只有 WM_COMMAND, 事件种类和控件 ID 被包含在 wParam 中, 控件的句柄包含在 lParam 中。由于 wParam 和 lParam 已经满了,当控件要向父窗口发送其它特殊消息同时附带很多信息的时候就没有地方可以存放它们了。所以 Win

10、dows3.1 中定义了许多其它的消息种类,比如 WM_VSCROLL, WM_CTLCOLOR 等等,每种消息 wParam,lParam 中附带的信息是不同的。 当到了 Win32 后,控件的种类越来越多,当然不可以为每一个控件都定义一套消息,这样也不利于系统的扩充。所以在 Win32 中定义了唯一一个强大的消息 WM_NOTIFY。当然 WM_NOTIFY 也遵守原来的消息规则,既只带参数 wParam 和 lParam。唯一不同处在于,此时的 lParam 中传送的是一个 NMHDR 指针。不同的控件可以按照规则对 NMHDR 进行扩充,因此 WM_NOTIFY 消息传送的信息量可以相

11、当的大,这个可以看看 MSDN 中的相关说明,TreeControl 中就有很多这种消息。 现在就可以知道为什么有 ON_MESSAGE ,ON_COMMAND, , ON_NOTIFY 了。 ON_MESSAGE 是处理所有的 Windows 的消息的,因为所有的消息都以相同的格式传送,也就是 ID, WPARAM, LPARAM. ON_COMMAND 是专门处理 WM_COMMAND 消息的,这样我们就不用自己解开 WM_COMMAND 中 wParam 和 lParam 中传送的控件 ID, 事件种类,所有的都在 MFC 内部解决了:) ,当然方便了。 ON_NOTIFY 更是不用说了,看看他的处理函数,是不是把 NMHDR 解出来了。 这样一样就一目了然了,ON_COMMAND 和 ON_NOTIFY 都可以用ON_MESSAGE 来处理,只不过自己要多做很多事情。ON_COMMAND 和ON_NOTIFY 最好就不要互换了!

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号