右键菜单的响应问题

 

作者:朱金灿

来源:http://blog.csdn.net/clever101

 

 

        同事问我一个同事问我:我在视图客户区上新建了一个树形控件(对应为CTreeCtrl类的派生类CTreeFileCtrl),右键单击它弹出一个右键菜单。我分别在框架类和视图类上为这些菜单项添加了命令消息函数,可是我单击这些菜单项都无法响应。同事的程序的界面如下:

    

     同事程序界面 

     开始我也有点迷惑,回家后去翻《深入浅出MFC》。按说右键菜单的消息属于WM_COMMAND类型。任何派生自CCmdTarget类的类都可以接收WM_COMMAND消息。如果是标准菜单栏上的消息,遵循的是VIEW——〉Frame窗口本身——〉CWinApp对象的顺序。但是右键菜单呢?

 

     上微软技术论坛问了蒋晟大侠,知道原来是看右键菜单是否有转发WM_COMMAND

那么什么是右键菜单的目标窗口,最后查了MSDNCMenu类的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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

clever101

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值