2010年6月10日星期四

MFC中添加的菜单项为什么始终是灰色的

来自百度知道的提问:

我新建一个类,在BEGIN_NESSAGE_MAP中添加了ON_COMMAND消息,菜单项的ID也没有问题,加了响应函数,编译通过,可是运行的时候菜单项总是灰色的,请问还需要什么东西。

消息处理函数好像就是用BEGIN_NESSAGE_MAP来指定的吧,我已经指定好了。那个BEGIN_NESSAGE_MAP好像在MainFrm里指定就不是灰色的,但我想放在别的类里面要怎么做呢,说清楚点,谢谢

他这里遇到的问题和我的类似,我的问题是:我在微软官网上下了一个MFC的例子程序,工程名是MtMdi,这个程序实现多文档功能,支持多线程。由于这个例子的实现的功能和我的需求差不多,我就在这个例子上就该。基本上完全照抄了,但是遇到各种问题。

1、由于我要实现一个播放视频的功能,每次响应播放视频的时候,就发现在播放视频的时候,整个没有界面就没有响应了。
我搞不清着地方时什么原因,明明是多线程的,这个那个播放视频的线程和主窗口的不在同一个线程,在点击主窗口的时候,就没有响应。这个问题我还没有搞清楚原因,可能是我的理解有问题。

2、菜单是灰色的。
我通过class wizard添加菜单响应函数,确发现没有作用,菜单一直是灰色的,只有把响应函数放到MainFrame中才有响应。我看那个例子中也是这样做的,而且都是在子窗口类中添加的响应函数。后来在网上查到这么一段话:原文

MFC菜单默认是禁用的
由于以前用MFC都是写一些小工具作自己用,因此很少添加菜单。这段时间在弄一个比较正式的东西,因此用上了MDI,但发现添加了一个菜单后,发现菜单竟然是灰色的。不管怎样设置这个菜单的属性,菜单还是灰灰的。捣鼓了很久,终于发现当这个菜单没有添加处理事件的时候,它就死活都是灰的。
看了一下MFC的代码,原来是CWnd类的OnCmdMsg函数会迭代一遍菜单,如果发现菜单项没有处理事件就将它禁用。

这里最后断话提醒了我,也找到了菜单灰色的根本原因。特别是最后一句话,原来我在抄那个例子的时候,那个例子中重载了OnCmdMsg函数,我照抄过来,在这个函数中并没有处理我添加的菜单的响应关系。后来我把这个函数改成默认的函数,菜单果然不是灰色的了。

通过这个例子,可以发现,菜单的消息首先是通过MainFrame传递给其子窗口ChildFrame,ChildFrame首先传递给对应的view,如果view中找到了响应的处理函数,就进行处理,如果没有就沿途返回,最后到MainFrame,最后到App类。这个过程我实在看孙鑫的MFC视频教程看到的,通过这个例子就有更深刻的理解了。


没有评论:

发表评论