您好,欢迎访问三七文档
FundamentalsofComputers暨南大学珠海学院《Windows编程》制作:刘晓翔2019/12/18第五讲菜单编程FundamentalsofComputers制作:刘晓翔JINANUniversity暨南大学珠海学院《Windows编程》2019/12/182内容安排菜单编程菜单响应函数基本菜单操作MFC菜单命令更新机制制作快捷菜单动态菜单操作FundamentalsofComputers制作:刘晓翔JINANUniversity暨南大学珠海学院《Windows编程》2019/12/183弹出式菜单与菜单项MFC中,设置为Pop-up类型的菜单称为弹出式菜单,VC++默认顶层菜单为弹出式菜单,这种菜单不能响应命令。将菜单的属性对话框中的Pop-up选项去掉,该菜单成为一个菜单项,对应有一个ID号,可以响应命令。菜单响应函数FundamentalsofComputers制作:刘晓翔JINANUniversity暨南大学珠海学院《Windows编程》2019/12/184Windows消息的分类标准消息除WM_COMMAND之外,所有以WM_开头的消息。从CWnd派生的类,都可以接收到这类消息。命令消息来自菜单、加速键或工具栏按钮的消息。这类消息都以WM_COMMAND呈现。在MFC中,通过菜单项的标识(ID)来区分不同的命令消息;在SDK中,通过消息的wParam参数识别。从CCmdTarget派生的类,都可以接收到这类消息。通告消息由控件产生的消息,例如,按钮的单击,列表框的选择等均产生此类消息,为的是向其父窗口(通常是对话框)通知事件的发生。这类消息也是以WM_COMMAND形式呈现。从CCmdTarget派生的类,都可以接收到这类消息。菜单响应函数FundamentalsofComputers制作:刘晓翔JINANUniversity暨南大学珠海学院《Windows编程》2019/12/185菜单命令响应函数与响应顺序菜单相应命令:在ClassWizard中添加。响应顺序:(示例)CMenuViewCMenuDocCMainFrameCMenuApp菜单响应函数FundamentalsofComputers制作:刘晓翔JINANUniversity暨南大学珠海学院《Windows编程》2019/12/186菜单命令路由的过程①当点击某菜单项时,最先接收到这个菜单命令消息的是框架类。②框架类把接收到的这个消息传给它的子窗口,即视类。视类根据命令消息映射机制查找自身是否对这个消息进行了响应,如果响应了,则调用自身相应响应函数。③如果视类没有对此命令消息作出响应,就交由文档类,文档类同样查找自身是否这个消息进行了响应,如果响应了,则调用自身相应响应函数。④如果文档类也未做出响应,就把这个命令消息交还给视类,后者再交还给框架类。⑤框架类查看自己是否对这个命令消息进行了响应,如果它也没有相应,就把这个菜单命令消息交给应用程序类,由后者来处理。菜单响应函数FundamentalsofComputers制作:刘晓翔JINANUniversity暨南大学珠海学院《Windows编程》2019/12/187内容安排菜单编程菜单响应函数基本菜单操作MFC菜单命令更新机制制作快捷菜单动态菜单操作FundamentalsofComputers制作:刘晓翔JINANUniversity暨南大学珠海学院《Windows编程》2019/12/188基本菜单操作菜单的结构顶级菜单(菜单栏),依附于主框架上。CMenu*GetMenu()子菜单(弹出菜单)CMenu*GetSubMenu(intnPos)菜单项(注:分隔符也算一个菜单项)FundamentalsofComputers制作:刘晓翔JINANUniversity暨南大学珠海学院《Windows编程》2019/12/189基本菜单操作标记菜单(在菜单项前面打上勾)GetMenu()-GetSubMenu(0)-CheckMenuItem(0,MF_BYPOSITION|MF_CHECKED);GetMenu()-GetSubMenu(0)-CheckMenuItem(ID_FILE_NEW,MF_CHECKED);注意:在使用索引的时候“分隔符”也要算上。UNITCheckMenuItem(UINTnIDCheckItem,UINTnCheck)实例一:实例二:FundamentalsofComputers制作:刘晓翔JINANUniversity暨南大学珠海学院《Windows编程》2019/12/1810基本菜单操作图形标记菜单(在菜单项前面加上位图)UNITSetMenuItemBitmaps(UINTnPosition,UINTnFlag,constCBitmap*pBmpUnchecked,constCBitmap*pBmpChecked)bmp1.LoadBitmap(IDB_BITMAP1);bmp2.LoadBitmap(IDB_BITMAP2);GetMenu()-GetSubMenu(0)-SetMenuItemBitmaps(0,MF_BYPOSITION,&bmp1,&bmp2);注意:位图大小必须为13x13。bmp1、bmp2为主框类的成员对象;若为局部变量,菜单标记后要加上bmp.Detach()实例:FundamentalsofComputers制作:刘晓翔JINANUniversity暨南大学珠海学院《Windows编程》2019/12/1811基本菜单操作禁用菜单项UNITEnableMenuItem(UINTnIDEnableItem,UINTnEnable)GetMenu()-GetSubMenu(0)-EnableMenuItem(0,MF_BYPOSITION|MF_GRAYED|MF_DISABLED);注意1:菜单的禁用状态和变灰状态是不同的。通常把MF_GRAYED和MF_DISABLED这两个标志放在一起使用注意2:该函数要生效,必须在CMainFrame类的构造函数中把成员变量m_bAutoMenuEnable设置为FALSE。要使用菜单命令更新机制(后面有讲),则该变量应设置为TRUE(缺省值)。实例:FundamentalsofComputers制作:刘晓翔JINANUniversity暨南大学珠海学院《Windows编程》2019/12/1812基本菜单操作移除和加载菜单BOOLSetMenu(CMenu*pMenu)移除菜单:SetMenu(NULL);加载菜单:CMenumenu;menu.LoadMenu(IDR_MAINFRAME);SetMenu(&menu);注意:如果CMenu对象是一个临时对象,则在加载完成之后必须加上menu.Detach()。Detach会把菜单句柄与这个菜单对象分离,这样,当这个局部对象的生命周期结束时,它不会去销毁一个它不再具有拥有权的菜单资源。FundamentalsofComputers制作:刘晓翔JINANUniversity暨南大学珠海学院《Windows编程》2019/12/1813内容安排菜单编程菜单响应函数基本菜单操作MFC菜单命令更新机制制作快捷菜单动态菜单操作FundamentalsofComputers暨南大学珠海学院《Windows编程》制作:刘晓翔JINANUniversity2019/12/1814MFC菜单命令更新机制菜单项状态的维护是依赖于CN_UPDATE_COMMAND_UI消息,谁捕获CN_UPDATE_COMMAND_UI消息,MFC就在其中创建一个CCmdUI对象。我们可以通过ClassWizard在消息映射中添加ON_UPDATE_COMMAND_UI宏来捕获CN_UPDATE_COMMAND_UI消息。在后台所做的工作是:当显示菜单的时候,操作系统发出WM_INITMENUPOPUP消息,然后由MFC的基类如CFrameWnd接管。它创建一个CCmdUI对象,并与第一个菜单项相关联,调用对象的一个成员函数DoUpdate()。这个函数发出CN_UPDATE_COMMAND_UI消息,这条消息带有指向CCmdUI对象的指针。同一个CCmdUI对象就设置为与第二个菜单项相关联,这样顺序进行,直到完成所有菜单项。更新命令UI处理程序仅应用于弹出式菜单项上的项目(有ID号),不能应用于顶层菜单项目(无ID号)。FundamentalsofComputers制作:刘晓翔JINANUniversity暨南大学珠海学院《Windows编程》2019/12/1815MFC菜单命令更新MFC菜单命令更新机制voidCMainFrame::OnUpdateEditCopy(CCmdUI*pCmdUI){//TODO:AddyourcommandupdateUIhandlercodeherepCmdUI-Enable(TRUE);pCmdUI-SetCheck();pCmdUI-SetText(123);}FundamentalsofComputers制作:刘晓翔JINANUniversity暨南大学珠海学院《Windows编程》2019/12/1816内容安排菜单编程菜单响应函数基本菜单操作MFC菜单命令更新机制制作快捷菜单动态菜单操作FundamentalsofComputers制作:刘晓翔JINANUniversity暨南大学珠海学院《Windows编程》2019/12/1817Step1:为Menu程序增加一个新的菜单资源制作快捷菜单在ResouceView上的Menu分支上单击鼠标右件,选择“InsertMenu”命令,为这个菜单资源添加菜单项。由于在显示快捷菜单时顶级菜单不出现,所以可以给它设置任意的文本。FundamentalsofComputers制作:刘晓翔JINANUniversity暨南大学珠海学院《Windows编程》2019/12/1818Step2:给视类添加WM_RBUTTONDOWN消息响应函数制作快捷菜单加载菜单资源到CMenu对象voidCMenuView::OnRButtonDown(UINTnFlags,CPointpoint){CMenumenu;menu.LoadMenu(IDR_MENU1);CView::OnRButtonDown(nFlags,point);}FundamentalsofComputers制作:刘晓翔JINANUniversity暨南大学珠海学院《Windows编程》2019/12/1819Step3:调用TrackPopupMenu函数制作快捷菜单voidCMenuView::OnRButtonDown(UINTnFlags,CPointpoint){CMenumenu;menu.LoadMenu(IDR_MENU1);CMenu*pPopup=menu.GetSubMenu(0);pPopup-TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);CView::OnRButtonDown(nFlags,point);}FundamentalsofComputers制作:刘晓翔JINANUniversity暨南大学珠海学院《Windows编程》2019/12/1820将鼠标点的客户去坐标转换为屏幕坐标制作快捷菜单voidCMenuView::OnRButtonDown(UINTnFlags,CPointpoint){CMenumenu;menu.LoadMenu(IDR_MENU1);ClientToScreen(&point);CMenu*pPopup=menu.GetSubMenu(0);pPopup-TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);CView::OnRButtonDown(nFla
本文标题:第五讲菜单编程.
链接地址:https://www.777doc.com/doc-2085551 .html