第五讲 菜单编程_第1页
第五讲 菜单编程_第2页
第五讲 菜单编程_第3页
第五讲 菜单编程_第4页
第五讲 菜单编程_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2023/12/15第五讲菜单编程2023/12/152内容安排菜单编程菜单响应函数基本菜单操作MFC菜单命令更新机制制作快捷菜单动态菜单操作2023/12/153弹出式菜单与菜单项MFC中,设置为Pop-up类型的菜单称为弹出式菜单,VC++默认顶层菜单为弹出式菜单,这种菜单不能响应命令。将菜单的属性对话框中的Pop-up选项去掉,该菜单成为一个菜单项,对应有一个ID号,可以响应命令。菜单响应函数2023/12/154Windows消息的分类标准消息

除WM_COMMAND之外,所有以WM_开头的消息。从CWnd派生的类,都可以接收到这类消息。命令消息

来自菜单、加速键或工具栏按钮的消息。这类消息都以WM_COMMAND呈现。在MFC中,通过菜单项的标识(ID)来区分不同的命令消息;在SDK中,通过消息的wParam参数识别。 从CCmdTarget派生的类,都可以接收到这类消息。通告消息

由控件产生的消息,例如,按钮的单击,列表框的选择等均产生此类消息,为的是向其父窗口(通常是对话框)通知事件的发生。这类消息也是以WM_COMMAND形式呈现。 从CCmdTarget派生的类,都可以接收到这类消息。菜单响应函数2023/12/155菜单命令响应函数与响应顺序

菜单相应命令:在ClassWizard中添加。响应顺序:(示例)

CMenuView CMenuDoc CMainFrame CMenuApp菜单响应函数2023/12/156菜单命令路由的过程当点击某菜单项时,最先接收到这个菜单命令消息的是框架类。框架类把接收到的这个消息传给它的子窗口,即视类。视类根据命令消息映射机制查找自身是否对这个消息进行了响应,如果响应了,则调用自身相应响应函数。如果视类没有对此命令消息作出响应,就交由文档类,文档类同样查找自身是否这个消息进行了响应,如果响应了,则调用自身相应响应函数。如果文档类也未做出响应,就把这个命令消息交还给视类,后者再交还给框架类。框架类查看自己是否对这个命令消息进行了响应,如果它也没有相应,就把这个菜单命令消息交给应用程序类,由后者来处理。菜单响应函数2023/12/157内容安排菜单编程菜单响应函数基本菜单操作MFC菜单命令更新机制制作快捷菜单动态菜单操作2023/12/158基本菜单操作菜单的结构顶级菜单(菜单栏),依附于主框架上。CMenu*GetMenu()子菜单(弹出菜单)CMenu*GetSubMenu(intnPos)菜单项(注:分隔符也算一个菜单项)2023/12/159基本菜单操作标记菜单(在菜单项前面打上勾)GetMenu()->GetSubMenu(0)->CheckMenuItem(0,MF_BYPOSITION|MF_CHECKED);GetMenu()->GetSubMenu(0)->CheckMenuItem(ID_FILE_NEW,MF_CHECKED);注意:在使用索引的时候“分隔符”也要算上。UNITCheckMenuItem(UINTnIDCheckItem,UINTnCheck)实例一:实例二:2023/12/1510基本菜单操作图形标记菜单(在菜单项前面加上位图)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()实例:2023/12/1511基本菜单操作禁用菜单项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(缺省值)。实例:2023/12/1512基本菜单操作移除和加载菜单BOOLSetMenu(CMenu*pMenu)移除菜单:SetMenu(NULL);加载菜单:CMenumenu;menu.LoadMenu(IDR_MAINFRAME);SetMenu(&menu);注意:如果CMenu对象是一个临时对象,则在加载完成之后必须加上menu.Detach()。Detach会把菜单句柄与这个菜单对象分离,这样,当这个局部对象的生命周期结束时,它不会去销毁一个它不再具有拥有权的菜单资源。2023/12/1513内容安排菜单编程菜单响应函数基本菜单操作MFC菜单命令更新机制制作快捷菜单动态菜单操作2023/12/1514MFC菜单命令更新机制

菜单项状态的维护是依赖于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号)。2023/12/1515MFC菜单命令更新MFC菜单命令更新机制voidCMainFrame::OnUpdateEditCopy(CCmdUI*pCmdUI){ //TODO:AddyourcommandupdateUIhandlercodehere

pCmdUI->Enable(TRUE); pCmdUI->SetCheck(); pCmdUI->SetText("123");}2023/12/1516内容安排菜单编程菜单响应函数基本菜单操作MFC菜单命令更新机制制作快捷菜单动态菜单操作2023/12/1517Step1:为Menu程序增加一个新的菜单资源制作快捷菜单

在ResouceView上的Menu分支上单击鼠标右件,选择“InsertMenu”命令,为这个菜单资源添加菜单项。由于在显示快捷菜单时顶级菜单不出现,所以可以给它设置任意的文本。2023/12/1518Step2:给视类添加WM_RBUTTONDOWN消息响应函数制作快捷菜单加载菜单资源到CMenu对象voidCMenuView::OnRButtonDown(UINTnFlags,CPointpoint){

CMenumenu; menu.LoadMenu(IDR_MENU1);

CView::OnRButtonDown(nFlags,point);}2023/12/1519Step3:调用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);}2023/12/1520将鼠标点的客户去坐标转换为屏幕坐标制作快捷菜单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(nFlags,point);}2023/12/1521Step4:添加响应函数制作快捷菜单利用ClassWizard添加。voidCMenuView::OnTest1(){ //TODO:Addyourcommandhandlercodehere

MessageBox("ViewTest1");}voidCMenuView::OnTest2(){ //TODO:Addyourcommandhandlercodehere

MessageBox("ViewTest2");}2023/12/1522关于快捷菜单中的菜单项的命令响应的说明制作快捷菜单

对于快捷菜单,如果将其拥有者窗口设置为框架类窗口,则框架类窗口才能有机会获得对该快捷菜单中的菜单项的命令响应,否则,就只能有视类窗口作出响应。2023/12/1523内容安排菜单编程菜单响应函数基本菜单操作MFC菜单命令更新机制制作快捷菜单动态菜单操作2023/12/1524添加菜单项目(AppendMenu)动态菜单操作CMenumy_menu;my_menu.CreateMenu();GetMenu()->AppendMenu(MF_POPUP,(UINT)my_menu.m_hMenu,"my_menu");my_menu.Detach();添加顶层菜单:添加顶层菜单下的菜单项:GetMenu()->GetSubMenu(0)->AppendMenu(MF_STRING,777,"Hello");2023/12/1525插入菜单项目(InsertMenu)动态菜单操作CMenumy_menu;my_menu.CreateMenu();GetMenu()->InsertMenu(2,MF_BYPOSITION|MF_POPUP,(UINT)my_menu.m_hMenu,"my_menu");my_menu.Detach();插入顶级菜单:插入顶级菜单下的菜单项GetMenu()->GetSubMenu(0)->InsertMenu(0,MF_STRING|MF_BYPOSITION,777,"Hello");GetMenu()->GetSubMenu(0)->InsertMenu(ID_FILE_OPEN,MF_STRING,777,"Hello");2023/12/1526删除菜单项目(DeleteMenu)动态菜单操作GetMenu()->DeleteMenu(1,MF_BYPOSITION);删除顶级菜单:删除顶级菜单下的菜单项:GetMenu()->Get

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论