您的位置:程序门 -> vc/mfc -> 界面



弹出式菜单消息传递问题,不解中


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


弹出式菜单消息传递问题,不解中[已结贴,结贴人:fish_kun]
发表于:2007-03-18 00:26:12 楼主
我在编程中遇到了一个很不解的问题。
用mfc的多文档—视图框架做了一个程序,其中childframe中有两个view,一个leftview,一个rightview。整个工程资源中有两个菜单,一个mainframe的菜单,一个弹出式菜单,其中弹出式菜单只在leftview上出现。弹出式菜单中的子项来自mainframe上的菜单子项,它们使用同样的id,我将菜单的消息响应函数映射到mainframe类上,出现的结果是,点击mainframe上的菜单,响应函数被调用,在leftview中点击右键,弹出弹出式菜单并点击,响应函数根本没有被调用。
虽然,我可以同时将菜单的响应函数映射到leftview的类上,使弹出式菜单被响应,但是对此问题很迷惑,不知为何映射到mainframe上,弹出式菜单就不响应了。
照我的理解,消息传递的顺序是view-> doc-> mainframe,不管怎么样,消息都会传递给mainframe类,为什么它就不响应弹出式菜单了呢?
发表于:2007-03-18 15:20:551楼 得分:25
对于弹出式菜单它有一个owner窗口的概念,默认情况下,你在leftview中创建的快捷菜单其owner窗口就是leftview自己,如果你不在leftview中添加其处理函数的话,消息就不会得到处理。对于你所说的问题,解决办法是在trackpopupmenu时给定该菜单的owner窗口为主框架窗口即可。
发表于:2007-03-18 17:10:112楼 得分:5
命令传送

使用命令时您的责任仅限于创建命令和其处理函数之间的消息映射连接。使用“属性”窗口来完成此任务。您还必须编写大多数的命令处理程序。

通常将   windows   消息发送到主框架窗口,而将命令消息传送到其他对象。框架通过命令目标对象的标准序列传送命令,而在这些对象中,有一个应具有该命令的处理程序。每一个命令目标对象检查其消息映射,查看是否能处理传入的消息。

不同的命令目标类在不同的时间检查各自的消息映射。通常,类将命令传送到某些其他对象,给它们首先处理命令的机会。如果这些对象都不能处理此命令,则原始类检查自己的消息映射。然后,如果它自己也无法提供处理程序,则可能将此命令传送到更多的命令目标。下表标准命令路由显示了每一种类构造该序列的方法。命令目标传送命令的一般顺序是:  

传送到当前活动的子命令目标对象。  
传送到本身。  
传送到其他命令目标。  
该传送机制的成本多高?与处理程序为响应命令所做的工作相比,传送的成本较低。记住只有当用户与用户界面对象交互时框架才生成命令。

标准命令路由

当此类型的对象收到命令时...   按此顺序为其本身以及其他命令目标对象提供处理命令的机会:  
mdi   框架窗口  
(cmdiframewnd)   活动的   cmdichildwnd  
该框架窗口  
应用程序(cwinapp   对象)  
 
文档框架窗口  
(cframewnd,   cmdichildwnd)   活动视图  
该框架窗口  
应用程序(cwinapp   对象)  
 
视图   该视图  
附加于该视图的文档  
 
文档   该文档  
附加于该文档的文档模板  
 
对话框   该对话框  
拥有该对话框的窗口  
应用程序(cwinapp   对象)  
 

上表第二列中的编号项提到其他对象(如文档)的地方,请参见第一列中的相应项。例如,当在第二列中读到视图将命令转发到其文档时,请参见第一列中的“文档”项以进一步跟踪传送。

发表于:2007-08-18 20:14:083楼 得分:0
n   nhj


快速检索

最新资讯
热门点击