右键菜单的响应问题
2009-11-06 20:48
429 查看
作者:朱金灿
来源:http://www.cnblogs.com/clever101
同事问我一个同事问我:我在视图客户区上新建了一个树形控件(对应为CTreeCtrl类的派生类CTreeFileCtrl),右键单击它弹出一个右键菜单。我分别在框架类和视图类上为这些菜单项添加了命令消息函数,可是我单击这些菜单项都无法响应。同事的程序的界面如下:
开始我也有点迷惑,回家后去翻《深入浅出MFC》。按说右键菜单的消息属于WM_COMMAND类型。任何派生自CCmdTarget类的类都可以接收WM_COMMAND消息。如果是标准菜单栏上的消息,遵循的是VIEW——〉Frame窗口本身——〉CWinApp对象的顺序。但是右键菜单呢?
上微软技术论坛问了蒋晟大侠,知道原来是看右键菜单是否有转发WM_COMMAND。
那么什么是右键菜单的目标窗口,最后查了MSDN的CMenu类的TrackPopupMenu函数的用法,明白了:
BOOL TrackPopupMenu(
UINT nFlags,
int x,
int y,
CWnd* pWnd,
LPCRECT lpRect = 0
);
这是实现弹出右键菜单功能的函数,其中我们看看MSDN对第四个参数pWnd的解释:
Identifies the window that owns the pop-up menu. This window receives all WM_COMMAND messages from the menu. In Windows versions 3.1 and later, the window does not receive WM_COMMAND messages until TrackPopupMenu returns. In Windows 3.0, the window receives WM_COMMAND messages before TrackPopupMenu returns.
下面以我拙劣的翻译水平翻译一下:这是用来标识拥有这个菜单的窗口的。这个窗口接收这个菜单栏的所有WM_COMMAND消息。在Windows 3.1及更新的版本,这个窗口不接收任何WM_COMMAND消息直到TrackPopupMenu函数返回(就是只有调用了TrackPopupMenu函数这个窗口才处理WM_COMMAND消息)。在Windows 3.0,在TrackPopupMenu函数返回之前窗口就接收WM_COMMAND。就是说这个参数指定了在这个窗口处理菜单的WM_COMMAND消息。开始我还以为这个参数指定了菜单的父窗口呢,网上也有类似的误导人的说法。实际上父窗口一说是经不起推敲的,如果说这个是父窗口,那么菜单是它的子窗口,但是你要知道,菜单并不是窗口啊!MSDN上明明白白写着:class CMenu : public CObject。
来源:http://www.cnblogs.com/clever101
同事问我一个同事问我:我在视图客户区上新建了一个树形控件(对应为CTreeCtrl类的派生类CTreeFileCtrl),右键单击它弹出一个右键菜单。我分别在框架类和视图类上为这些菜单项添加了命令消息函数,可是我单击这些菜单项都无法响应。同事的程序的界面如下:
开始我也有点迷惑,回家后去翻《深入浅出MFC》。按说右键菜单的消息属于WM_COMMAND类型。任何派生自CCmdTarget类的类都可以接收WM_COMMAND消息。如果是标准菜单栏上的消息,遵循的是VIEW——〉Frame窗口本身——〉CWinApp对象的顺序。但是右键菜单呢?
上微软技术论坛问了蒋晟大侠,知道原来是看右键菜单是否有转发WM_COMMAND。
那么什么是右键菜单的目标窗口,最后查了MSDN的CMenu类的TrackPopupMenu函数的用法,明白了:
BOOL TrackPopupMenu(
UINT nFlags,
int x,
int y,
CWnd* pWnd,
LPCRECT lpRect = 0
);
这是实现弹出右键菜单功能的函数,其中我们看看MSDN对第四个参数pWnd的解释:
Identifies the window that owns the pop-up menu. This window receives all WM_COMMAND messages from the menu. In Windows versions 3.1 and later, the window does not receive WM_COMMAND messages until TrackPopupMenu returns. In Windows 3.0, the window receives WM_COMMAND messages before TrackPopupMenu returns.
下面以我拙劣的翻译水平翻译一下:这是用来标识拥有这个菜单的窗口的。这个窗口接收这个菜单栏的所有WM_COMMAND消息。在Windows 3.1及更新的版本,这个窗口不接收任何WM_COMMAND消息直到TrackPopupMenu函数返回(就是只有调用了TrackPopupMenu函数这个窗口才处理WM_COMMAND消息)。在Windows 3.0,在TrackPopupMenu函数返回之前窗口就接收WM_COMMAND。就是说这个参数指定了在这个窗口处理菜单的WM_COMMAND消息。开始我还以为这个参数指定了菜单的父窗口呢,网上也有类似的误导人的说法。实际上父窗口一说是经不起推敲的,如果说这个是父窗口,那么菜单是它的子窗口,但是你要知道,菜单并不是窗口啊!MSDN上明明白白写着:class CMenu : public CObject。
相关文章推荐
- 关于右键动态创建菜单的响应问题
- 解决Windows资源管理器右键菜单打开EditPlus容易导致资源管理器无响应问题
- 右键菜单的响应问题
- 解决Windows资源管理器右键菜单打开EditPlus容易导致资源管理器无响应问题
- arcgis server 右键菜单 单击事件的响应问题。
- 右键菜单的响应问题
- 解决WPF右键菜单的菜单项左击有效右击无效的问题
- MFC中的CListCtrl添加右键菜单消息响应实例分析
- win7 64位svn右键菜单不显示问题
- 解决右键菜单不能新建txt文档问题
- 关于FlexPaper 2.1.2版本 二次开发 Logo 、打印、搜索、缩略图、添加按钮、js交互、右键菜单等相关问题
- QT右键菜单、右键下拉菜单、各控件响应右键菜单方法简介 【百度空间】
- QT右键菜单、右键下拉菜单、各控件响应右键菜单方法简介(转)
- QT Qtreewidget操作 右键菜单响应等
- 窗口响应右键弹出菜单
- 前端-mui框架的div侧拉菜单,导致页面中按钮的点击事件无法响应的问题
- 解决Visual Studio 2010 右键菜单滚动问题的补丁
- 解决右键菜单没有新建的问题
- Extjs 右键菜单创建问题
- 解决windows 10 桌面右键时菜单显示出来需要很长时间的问题