最近一直看孙鑫的教程,有一节讲appendmenu(),看完 便自己动手延展了一下。
本想是在上下文菜单里为名叫“append”的菜单项添加一个消息响应,目的是为了在主菜单动态地添加一个popup菜单。
用classwizard在视类中添加了相应的响应函数:
void CMenuView::OnMENUappend()
{
// TODO: Add your command handler code here
CMenu menu1;
menu1.CreateMenu();
GetMenu()->AppendMenu(MF_POPUP,(UINT)menu1.m_hMenu,"menubyappend");
menu1.Detach();
}
运行->右键->append . . . 出错
一看到这个脑袋就大了。思索了一下,我以为是局部变量menu1的“局部”问题, 但是我想后面不是有Detach()吗? 问了某位网友,说是将menu1作为类的变量,虽然有疑惑,但还是照做了。 果然,还是错误。。
为啥在CMainFrame的Oncreate()中响应不会出现错误呢?我开始想,是不是因为context菜单是属于视类的,而主菜单是属于框架类的。而在视类中不能用这种方法来做本是框架类该做的事。 所以我将视类中的OnMENUappend()移到框架类中, 右键append 果然没有出错, 但是主菜单中还是没有我要的menubyappend 。
于是我换了一种方式,在视类中又加了OnMENUappend(),不过将代码改了:
void CMenuView::OnMENUappend()
{
// TODO: Add your command handler code here
CMenu menu1;
menu1.CreateMenu();
GetpParent()->GetMenu()->AppendMenu(MF_POPUP,(UINT)menu1.m_hMenu,"menubyappend");
GetParent()->DrawMenuBar();
menu1.Detach();
}
额,其中的DrawMenuBar()是为了解决主菜单不能及时刷新的问题。
运行,append。 裸然出现了我所要的菜单项:
但是,之前我把视类的响应函数移到框架时,为什么不起作用呢?难道是消息路由顺序的缘故吗?
于是百度了一下顺序:CMyView--->CMyDoc-->CMultiDocTemplate(它通常不会处理)-->CMyChildFrame-->CMyApp->CMyFrameWnd
可见,最后还是会将消息路由给框架类的。但我的框架类中的似乎并没有相应OnMENUappend()。 百思不得其解。明天来解决吧。真的要睡了。