必威体育Betway必威体育官网
当前位置:首页 > IT技术

从TrackPopupMenu(创建快捷菜单的函数)看菜单消息路由机制

时间:2019-07-26 20:42:09来源:IT技术作者:seo实验室小编阅读:65次「手机版」
 

trackpopupmenu

先摘段《vc++深入详解》孙鑫的话

以上讲的是点击主菜单时的消息路由过程,但鼠标右键快捷菜单的消息路由有点区别。

trackpopupmenu函数用来创建右键快捷菜单。

例:

CMenu menu;

menu.LoadMenu(MENUID);

menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON

                                                    , x_position, y_position

                                                    , this);

注意最后这个参数this。

一般情况下,快捷菜单会在视类(view)中创建,也就是说上面这段代码写进视类中时,那么这个就this代表指向视类的指针。这个时候点击出现的快捷菜单,消息会如何传递呢?

首先由view类接收到消息,然后查看view类是否有对此消息进行处理,如果有,则进入view类消息处理函数进行处理。如果没有,将此消息传递给Doc类,然后再查看Doc类是否有对此消息进行处理,如果有,则进入Doc类消息处理函数进行处理。如果没有,则将此消息返回给view类。因此这个消息最后并没有传达到框架类(MainFrame类)。如果此时框架类定义了该消息的处理函数,等于是废品。

当然,如果把如下代码中的this改成AfxGetMainWnd(),情况就和《vc++深入详解》里面摘录的一样了。

AfxGetMainWnd()函数用来获得框架类窗口的指针。

menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON

                                                    , x_position, y_position

                                                    , this);

改成

menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON

                                                    , x_position, y_position

                                                    , AfxGetMainWnd());

也就是说,最后这个参数指定将消息首先传给谁。之后的消息路由是从上级往下级地毯式搜索对此消息的处理,找到了就处理,找不到就继续向下找,到了最底层还没找到就还给首先接到消息的类,然后用默认处理。

相关阅读

典型相关分析(Matlab实现函数)

先附上自己认为写的比较好的一篇博客。 https://www.cnblogs.com/duye/p/9384821.html 同时要指出自己博文的问题:对于Matlab中can

22.钩子函数.html

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-widt

setsockopt()函数 参数详解

Socket描述符选项[SOL_SOCKET] #include <sys/socket.h> int setsockopt( int socket, int level, int option_name,      

【Linux】浅析多线程与多线程相关的简单函数

【概念】在这里我们只做简单理解,因为说得越多反而越不利于理解,具体理解参考点击打开链接。我们就把线程看成是在一个程序里的一个

excel减法函数怎么用使用教程

excel中函数是最强大同时又比较复杂的功能,在很多复杂或者批量计算和统计中非常重要。很多用户表示不会使用excel的减法函数,其实ex

分享到:

栏目导航

推荐阅读

热门阅读