菜单的工作原理及编写应用,菜单命令消息在MFC框架程序的几个类中的传递顺序和处理过程。标记菜单、缺省菜单的实现原理、图形菜单的实现及常犯错误的分析,GetSystemMetrics的应用,快捷弹出菜单的实现方式及其命令响应函数有效范围(与弹出菜单时所指定的父窗口有密切的关系,最底层的子窗口具有最优先的处理机会)。动态菜单的编写,如何让程序在运行时产生新的菜单项及如何手工为这些新产生的菜单命令安排处理函数,如何在顶层窗口中截获对菜单命令的处理,更进一步掌握CString类的应用。
1.弹出菜单不可以用于命令响应,也就是没有ID
2.对菜单项的处理,可以在Frame,App,Doc,和View类中处理。其消息响应的顺序是:
View->Doc->Frame->App
3.消息的分类:(图)
4。对菜单的几种操作:
标记菜单 CheckMenuItem
缺省菜单SetDefaultMenuItem
图形标记菜单SetMenuItemBitmap
GetSystemMetrics可用于获取系统的信息
5 .MFC对菜单的命令更新机制(图)
6.如果想将菜单栏与工具栏中的图标相关联只需将他们的ID号设置成一样的。
7.右键弹出菜单的创建:
a.可以通过菜单中Project ->Add To Project->componants and Command中选择相应的右键弹出菜单,增加到View类中
b.也可以自己创建,关键函数TrackPopupMenu,将父类设为谁就由谁来响应右键弹出菜单选项,ClientToScreen将客户区坐标换 成屏幕坐标。
8.动态菜单的创建:操作对象都分成两类,对菜单项和弹出菜单
CMenu menu;
menu.CreatePopupMenu();
GetMenu()->AppendMenu(MF_POPUP,(UINT)menu.m_hMenu,"WinSun");
由于menu是局部变量,所以点击这个菜单时会弹出一个非法操作的提示对话框,这需要添上menu.Detach();将资源与对象断开,当然也可以把menu设为类对象。
CMenu menu; menu.CreatePopupMenu(); GetMenu()->AppendMenu(MF_POPUP,(UINT)menu.m_hMenu,"WinSun"); GetMenu()->InsertMenu(2,MF_BYPOSITION | MF_POPUP,(UINT) menu.m_hMenu,"WinSun");//插入 menu.AppendMenu(MF_STRING,IDM_HELLO,"Hello");//添加菜单项 menu.AppendMenu(MF_STRING,112,"Weixin"); menu.AppendMenu(MF_STRING,113,"Mybole"); GetMenu()->DeleteMenu(1,MF_BYPOSITION);//删除弹出菜单 GetMenu()->GetSubMenu(0)->DeleteMenu(2,MF_BYPOSITION);//删除菜单项 menu.Detach();
以上这些代码在Frame中就可以使用了,如果是在View类中用,因注意View类是没有menu的所以都要调用其父窗口Frame的menu ,而且在Windows已经创建之后再动态创建menu时,还需要调用DrawMenuBar来重绘menu,当然如果是在View类中直接使用DrawMenuBar,是无效的,原因一样因为View中没有菜单栏。
启动程序后,如何让框架类来处理本该View类优先处理的消息,在框架类中通过向导创建一个Virtual Override for class CMainFrame 添加一个OnCommand函数来覆盖基类的onCommand函数。
PS:
Invalidate()重绘窗口
CStringArray CString类型的集合类
LOWORD可以取得低字节
在Frame中要获取与其相关联的View类:GetActiveView