孙鑫老师教学视频学习笔记——单文档中菜单操作

简介:
////////////////////////静态实现菜单操作
创建和删除一个标记菜单:
在框架类CMainFrame中的OnCreate消息响应函数中添加:
    GetMenu()->GetSubMenu(0)->CheckMenuItem(0,MF_CHECKED |                                                     MF_BYPOSITION);//创建
或者GetMenu()->GetSubMenu(0)->CheckMenuItem(ID_FILE_NEW,
                                    MF_UNCHECKED | MF_BYCOMMAND);//删除
创建缺省菜单项:
在框架类CMainFrame中的OnCreate消息响应函数中添加:
    GetMenu()->GetSubMenu(0)->SetDefaultItem(1,TRUE);//以索引方式
    GetMenu()->GetSubMenu(0)->SetDefaultItem (ID_FILE_OPEN,FALSE);//以ID方式
注意:下拉菜单中的分隔栏也占用一个索引号;一个下拉菜单中只能有一个缺省菜单。
 
创建图形标记菜单:
在框架类CMainFrame中的OnCreate消息响应函数中添加:
    bitmap.LoadBitmap(IDB_BITMAP1);
    GetMenu()->GetSubMenu(0)->
                      SetMenuItemBitmaps(0,MF_BYPOSITION,&bitmap,&bitmap);
注意:先通过函数GetSystemMetrics(SM_CXMAXTRACK)和GetSystemMetrics(SM_CYMAXTRACK)来
获知系统图标的大小。

创建菜单屏蔽使用:
在框架类CMainFrame中的OnCreate消息响应函数中添加:
     GetMenu()->GetSubMenu(0)->EnableMenuItem(1,MF_BYPOSITION | 
                                         MF_DISABLED | MF_GRAYED);
注意:必须在CMainFrame类的构造函数中m_bAutoMenuEnable = FALSE;才会使上述有效。

如何操作整个菜单:
在框架类CMainFrame中的OnCreate消息响应函数中添加:
     SetMenu(NULL);     //取消整个菜单栏
     //重新加载整个菜单栏
     CMenu menu;       // 创建的是局部的menu,程序运行完要析构
     menu.LoadMenu(IDR_MAINFRAME);
     SetMenu(&menu);        
     menu.Detach(); //注意此语句必须加,可防止局部变量析构造成的错误
补充:菜单项状态的维护时依赖于CN_UPDATE_COMMAND_UI消息,谁捕获CN_UPDATE_COMMAND_UI
消息,MFC就在其中创建一个CCmdUI对象。我们可以通过手工或利用ClassWizard在消息映射中
添加CN_UPDATE_COMMAND_UI宏来捕获CN_UPDATE_COMMAND_UI消息。只用于弹出式菜单的菜单项
。依据该消息更新,可以实现某一菜单项的各种操作。
    void CMainFrame::OnUpdateEditCut(CCmdUI* pCmdUI) 
    {
 // TODO: Add your command update UI handler code here
 pCmdUI->Enable(); //使某菜单项可以使用
        pCmdUI->>Enable(FALSE);   //使某菜单项不能使用
    }
或者  if(0==pCmdUI->m_nID);      //通过ID判断是否为该菜单项
           pCmdUI->>Enable(FALSE);
或者  if(0==pCmdUI->m_nIndex);      //通过索引判断是否为该菜单项
           pCmdUI->>Enable(FALSE);
注意:当通过索引进行判断时,只能改变菜单项的状态,不能改变工具栏中的状态
 
实现右键弹出菜单:
一种方式可以在工程菜单中选择添加到工程中的components and controls选项,添加一个
Pop-up Menu。此时右键弹出菜单就已经有了。注意在View类中添加该组件,此时View类中多
了一个函数OnContextMenu(CWnd*, CPoint point),并在此函数的基础上进行修改。
另一种方式是仿造OnContextMenu(CWnd*, CPoint point)函数内的操作,对右键消息响应函数
进行编写。
    void CMenuView::OnRButtonDown(UINT nFlags, CPoint point) 
    {
 // TODO: Add your message handler code here and/or call default
 CMenu menu;
 menu.LoadMenu(IDR_MENU1);
 CMenu *pPopup=menu.GetSubMenu(0);  //获取子菜单
 ClientToScreen(&point);      //将屏幕坐标转换为客户坐标
 pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,
   this);      //创建一个浮动的菜单
 CView::OnRButtonDown(nFlags, point);
    }  
之后在ClassWizard中添加右键中菜单的消息相应函数。

////////////////////////////动态添加菜单
pop菜单的动态操作:
在框架类CMainFrame中的OnCreate消息响应函数中添加:
     CMenu menu;
 menu.CreatePopupMenu();  
        //添加一个popup菜单
 //GetMenu)->AppendMenu(MF_POPUP,(UINT)menu.m_hMenu,"Jazka");
        //插入到某一位置的popup菜单
        GetMenu()->InsertMenu(2,MF_BYPOSITION | MF_POPUP,(UINT)                   
                          menu.m_hMenu,"Jazka");
        //为popup菜单添加菜单项
        menu.AppendMenu(MF_STRING,111,"Hello");
 menu.AppendMenu(MF_STRING,112,"Well");  
 menu.Detach();
 //在pop菜单的某一位置插入一个菜单项
        //菜单项加到了最后一栏
 GetMenu()->GetSubMenu(0)->AppendMenu(MF_STRING,113,"Welcome");
        //菜单项加载到某一指定位置
 GetMenu()->GetSubMenu(0)->InsertMenu(ID_FILE_OPEN,
                 MF_BYCOMMAND | MF_STRING,114,"飞雪");
        //删除某一pop菜单
        GetMenu()->DeleteMenu(1,MF_BYPOSITION);
        //删除某一pop菜单的某一个菜单项
        GetMenu()->GetSubMenu(0)->DeleteMenu(2,MF_BYPOSITION);
重绘菜单栏:DrawMenuBar();
CString中选择某一部分的内容:m_strLine.Left(m_strLine.Find(' '));为寻找m_strLine的
空格字符左边的字符串。
当存储一些CString的对象时,用集合类CStringArray,可以动态增加。用ADD(LPCTSTR
newElement)可以增加一个字符串。m_strArray.GetAt(3)来取出一个成员。用 m_strArray.GetSize()可以获得集合类的大小。
用CFrameWnd::GetActiveView    CView *GetActiveView() const;获取当前视类的指针。


本文转自jazka 51CTO博客,原文链接:http://blog.51cto.com/jazka/168825,如需转载请自行联系原作者
相关文章
Vuex中改变store状态值的方法是什么?为什么?
Vuex中改变store状态值的方法是什么?为什么?
267 1
|
7月前
|
API 开发者
HarmonyOS 之 @Require 装饰器自学指南
在 HarmonyOS 应用开发中,组件初始化传参校验是常见难题。本文深入探讨了 `@Require` 装饰器的使用方法,它能在编译阶段严格校验组件构造传参,提升代码健壮性与开发效率。文章涵盖装饰器定义、版本支持、限制条件及典型使用场景(如父子组件传参校验和 `@ComponentV2` 初始化),并通过错误示例分析常见问题。总结中强调了 `@Require` 的重要性,助力开发者编写更稳定高效的代码。适合鸿蒙开发者学习参考!
170 28
HarmonyOS 之 @Require 装饰器自学指南
|
12月前
|
机器学习/深度学习 人工智能 算法
基于YOLOv8的钢铁缺陷实时检测系统【训练和系统源码+Pyside6+数据集+包运行】
基于YOLOv8的钢铁缺陷实时检测系统,通过1800张图片训练,开发了带GUI界面的检测系统,支持图片、视频和摄像头实时检测,提高生产效率和产品质量。系统基于Python和Pyside6开发,具备模型权重导入、检测置信度调节等功能。项目代码、数据集可通过特定链接获取。
354 1
基于YOLOv8的钢铁缺陷实时检测系统【训练和系统源码+Pyside6+数据集+包运行】
|
11月前
|
机器学习/深度学习 数据采集 监控
如何使用机器学习模型来自动化评估数据质量?
如何使用机器学习模型来自动化评估数据质量?
|
编解码 数据安全/隐私保护
平面设计师资格证怎么考
平面设计(graphic design),也称为视觉传达设计,是以“视觉”作为沟通和表现的方式,透过多种方式来创造和结合符号、图片和文字,借此作出用来传达想法或讯息的视觉表现。
平面设计师资格证怎么考
|
vr&ar C语言
计算机网络:信道复用
计算机网络:信道复用
640 0
|
前端开发 小程序
微信小程序系列——无缝引入CSS或者WXML文件
微信小程序系列——无缝引入CSS或者WXML文件
|
Web App开发 Linux 数据安全/隐私保护
Docker本地部署开源浏览器Firefox并远程访问进行测试
Docker本地部署开源浏览器Firefox并远程访问进行测试
636 1
|
机器学习/深度学习 人工智能 运维
智能化运维:基于AI的系统异常检测与自动修复策略
【5月更文挑战第29天】 在现代IT基础设施管理领域,智能化运维正逐步成为推动效率和稳定性的关键因素。本文深入探讨了人工智能(AI)技术在系统异常检测和自动化故障修复中的应用,提出了一个集成的智能运维框架。该框架利用机器学习算法分析历史数据,实时监控关键性能指标,并在检测到潜在问题时触发自动化修复流程。通过这一方法,我们旨在降低人工干预的需求,提高系统的可靠性和业务连续性。
|
存储 Prometheus 运维
通过Exporter收集一切指标
通过Exporter收集一切指标
通过Exporter收集一切指标