01.目录

目录

  • 01.目录
  • 02.本文内容
  • 03.完善Ribbon实例
    • 3.1 为Ribbon bar 添加更多的Ribbon控件
    • 3.2 为Ribbon控件添加消息处理函数
  • 04.扩展内容(快速访问工具栏)
  • 05.总结

02.本文内容

上一节中讲了为Ribbon Bar添加控件的方法。本节将继续完善前面的实例,讲解一些稍复杂的控件的添加方法,及如何为它们添加消息处理函数。

消息处理函数,在消息处理机制那节有介绍,忘记了可以去看看。

03.完善Ribbon实例

3.1 为Ribbon bar 添加更多的Ribbon控件

下面我将在原有的基础上添加下拉菜单、Check Box、Combo Box等Ribbon控件。

  1. 首先把“Small Button”面板上的“Click”按钮改造成一个下拉菜单。“Click”按钮有一个Behavior属性Menu Items,默认为Empty,选中它右侧会出现一个浏览按钮,点击浏览按钮会弹出“Items Editor”对话框,如下图:

    我们可以在上图Items下的组合框中选择按钮、分割线等,点击组合框右侧的Add按钮将其添加到下拉菜单中,添加按钮后在Properties分组中可以设置Caption(标题)、ID、Image(图片)等属性。这里我们添加两个按钮,Caption属性分别为One Click、Double Click,ID分别为ID_ONE_CLICK、ID_DOUBLE_CLICK,Image等属性就不设置了。

“Click”右侧多了一个向下的箭头,运行程序后点击此箭头会显示包含One Click和Double Click按钮的下拉菜单。另外,上图中有一个按钮鸡啄米用红线指示了其提示信息-“Test Ribbon”,点击了此按钮我们就可以不运行程序而直接查看Ribbon界面效果。

  1. 在Small Button面板的右侧再添加一个面板“More Controls”,然后在Toolbox工具中找到Check Box和Combo Box控件拖入新面板,Check Box的Caption属性设为“Websites Enable”,Combo Box的属性设为“Websites”。效果图如下:

    我们为Websites组合框(Combo Box)添加两个下拉选项,方法是,右键点击Websites组合框,选择“Properties”,显示出其属性页,修改Data属性为“www.baidu.com;www.taobao.com”,这样就为此Combo Box添加两个网址选项。

3.2 为Ribbon控件添加消息处理函数

前面控件都添加好了,接下来我们就为控件添加消息处理函数。
步骤如下:

  • 首先为Open按钮添加单击事件的消息处理函数,其ID修改为ID_OPEN_BUTTON,然后右键点击Open按钮,选择“Add Event Handler”,弹出Event Handler Wizard对话框,右侧的Class list中选择“CMainFrame”,左侧的Message Type中选择“COMMAND”,最后点击“Add and Edit”按钮,CMainFrame类中就添加了void CMainFrame::OnOpenButton()成员函数。

熟悉MFC的可能看到了,其实消息处理函数的添加过程与普通控件是类似的。最后修改void CMainFrame::OnOpenButton()函数的函数实现如下:

void CMainFrame::OnOpenButton()
{   // TODO: Add your command handler code here   MessageBox(_T("Open Button!"));   // 弹出对话框,提示“Open Button!”
}

因为只是为了讲解按钮的消息处理函数的添加,所以没有写复杂的代码,只写了一个弹出MessageBox的语句。运行程序,在结果界面的Function类别的Big Button面板中,点击Open按钮就会弹出一个对话框,并显示“Open Button!”。

  • 我们再为Websites组合框添加消息处理函数(方法同上),同样也为其在CMainFrame类中添加COMMAND消息处理函数–void CMainFrame::OnWebsitesCombo(),修改此函数实现如下:
void CMainFrame::OnWebsitesCombo()
{   // TODO: Add your command handler code here   // 获取Combo Box控件的指针   CMFCRibbonComboBox* pComboBox = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, m_wndRibbonBar.FindByID(ID_WEBSITES_COMBO));   // 获取Combo Box控件当前选中项的索引   int nCurSel = pComboBox->GetCurSel();   if (nCurSel >= 0)   {   // 如果索引大于等于0,则说明有选中项,弹出对话框并显示选中项的信息   MessageBox(pComboBox->GetItem(nCurSel));   }   else  {   // 如果索引小于0,则说明没有选中项,弹出对话框提示用户进行选择   MessageBox(_T("Please select one item!"));   }
}

运行程序,在结果界面中,改变WebSites组合框的选中项,则会弹出对话框显示选中项的信息。

  • 然后我们为Websites Enable复选框添加消息处理函数。默认情况下Check Box控件不会因为用户的点击而改变状态,这就需要我们通过代码来实现正常的复选功能。
  • 我们需要一个变量保存Check Box的当前选中状态,所以在MainFrm.h文件中为CMainFrame类添加一个BOOL型的成员变量m_bWebsitesEnable,并在CMainFrame类的构造函数中为其初始化:
CMainFrame::CMainFrame()
{   // TODO: add member initialization code here   theApp.m_nAppLook = theApp.GetInt(_T("ApplicationLook"), ID_VIEW_APPLOOK_OFF_2007_BLUE);   // 初始化为TRUE,即复选框为选中状态   m_bWebsitesEnable = TRUE;
}

接下来仍然采用1中的方法为Websites Enable复选框在CMainFrame类中添加COMMAND消息处理函数,并修改其函数体如下:

void CMainFrame::OnWebsitesCheck()
{   // TODO: Add your command handler code here   // 为m_bWebsitesEnable取反,即切换复选框的状态   m_bWebsitesEnable = !m_bWebsitesEnable;
}

但是现在复选框的状态只是保存到了变量中,我们还要根据变量值改变复选框的显示状态,这就需要再为Check Box添加一个UPDATE_COMMAND_UI消息处理函数,方法仍旧是右键点击Check Box,选择“Add Event Handler”,在弹出的Event Handler Wizard对话框的Class list中选择“CMainFrame”,Message type中则选择UPDATE_COMMAND_UI,最后点“Add and Edit”,这样就添加了UPDATE_COMMAND_UI消息处理函数,修改此函数实现如下:

void CMainFrame::OnUpdateWebsitesCheck(CCmdUI *pCmdUI)
{   // TODO: Add your command update UI handler code here   // 根据当前变量值设置复选框状态   pCmdUI->SetCheck(m_bWebsitesEnable);
}

这时你可以试着运行下程序,点击Website Enable复选框,它已经能成功的改变状态了。

  • 除了以上功能,我们还要实现一个稍复杂的功能,就是如果选中Websites Enable复选框则激活Websites组合框,而如果取消选中则禁用Websites组合框。这就需要我们为Websites组合框添加UPDATE_COMMAND_UI消息处理函数了,添加方法同上,这里不再赘述。修改函数实现为:
void CMainFrame::OnUpdateWebsitesCombo(CCmdUI *pCmdUI)
{   // TODO: Add your command update UI handler code here   // 根据Websites Enable复选框的状态确实激活还是禁用   pCmdUI->Enable(m_bWebsitesEnable);
}

运行程序,试着改变Websites Enable复选框的状态,Websites组合框的使能状态也会跟着改变。
最后,再简单讲讲如何为Ribbon Bar左上角的圆形菜单按钮和快速访问工具栏添加新项。

04.扩展内容(快速访问工具栏)

贴上一张图片先看看具体是啥东西。


圆形菜单按钮的属性页中有一个Buttons属性,可以点击其右侧浏览按钮弹出Items Editor对话框,使用该对话框可以在菜单按钮的弹出菜单窗口中添加右下角的按钮。还有一个Main Items属性,点其右侧浏览按钮也会弹出Items Editor对话框,通过它可以为圆形菜单按钮添加菜单项。

快速访问工具栏的属性页中有一个QAT Items属性,点击其右侧浏览按钮弹出QAT Items Editor对话框,使用该对话框可以在快速访问工具栏中添加新项。

这样,MFC快速访问工具栏也可以添加新的选项了。

05.总结

通过三篇文章的了解,想必对MFC中的Ribbon也算有了一定概念了。
https://blog.csdn.net/m0_43458204/article/details/107184067
https://blog.csdn.net/m0_43458204/article/details/107184964
上面就是前两篇的链接了。
如果有什么疏漏或者错误的地方,请一定要指出来,谢谢大家。
版权声明:部分内容来源网上,若侵权,请私聊!转载请注明出处,谢谢!

【MFC】Ribbon界面开发(三)相关推荐

  1. MFC Ribbon界面开发

    转载自: http://msdn.microsoft.com/zh-cn/library/ee851836.aspx 概述 本教程适用于正在开发桌面应用程序并希望利用新的 MFC 功能区框架优势的 M ...

  2. (转载)VS2010/MFC编程入门之五十二(Ribbon界面开发:创建Ribbon样式的应用程序框架)...

    上一节中鸡啄米讲了GDI对象之画刷CBrush,至此图形图像的入门知识就讲完了.从本节开始鸡啄米将为大家带来Ribbon界面开发的有关内容.本文先来说说如何创建Ribbon样式的应用程序框架. Rib ...

  3. VS2010/MFC编程入门之五十三(Ribbon界面开发:为Ribbon Bar添加控件)

    前面一节中鸡啄米为大家简单介绍了如何创建Ribbon样式的应用程序框架,本节教程就来初步讲讲怎样为Ribbon Bar添加Ribbon控件. VS2010为Ribbon界面开发提供了Ribbon De ...

  4. 【MFC】Ribbon界面开发(二)

    01.目录 目录 01.目录 02.本文内容 03.Ribbon实例 04.本文小结 02.本文内容 前面一节中为大家简单介绍了如何创建Ribbon样式的应用程序框架,本节就来初步聊聊怎样为Ribbo ...

  5. 【MFC】Ribbon界面开发(一)

    01.目录 目录 01.目录 02.Ribbon介绍 03.创建第一个Ribbon界面 04.本文小结 02.Ribbon介绍 Ribbon界面就是微软从Office2007开始引入的一种为了使应用程 ...

  6. VS2010/MFC编程入门之一(Ribbon界面开发:创建Ribbon样式的应用程序框架)

    Ribbon界面就是微软从Office2007开始引入的一种为了使应用程序的功能更加易于发现和使用.减少了点击鼠标的次数的新型界面,从实际效果来看,不仅外观漂亮,而且功能直观,用户操作简洁方便. 鸡啄 ...

  7. (转载)VS2010/MFC编程入门之五十四(Ribbon界面开发:使用更多控件并为控件添加消息处理函数)...

    上一节中鸡啄米讲了为Ribbon Bar添加控件的方法.本节教程鸡啄米将继续完善前面的实例,讲解一些稍复杂的控件的添加方法,及如何为它们添加消息处理函数. 一.为Ribbon Bar添加更多Ribbo ...

  8. qtcreator 界面样式_Office Ribbon 界面开发入门教程:如何用Qt实现Office界面样式

    Ribbon是什么? Ribbon是一种以面板及标签页为架构的用户界面.相当于它是一个收藏了命令按钮和图标的面板(把命令组织成一组"标签",每一组包含了相关的命令.每一个应用程序都 ...

  9. 基于Qt的类QQ气泡聊天的界面开发(三)

    最近在写IM 聊天界面,想设计出一个类似QQ气泡聊天的样式 使用了几种办法 1:使用Qt下面的QListview来实现QQ类似效果,差强人意 2:使用QWebview加载html css样式来完成,发 ...

  10. C#之CAD二次开发(14) Ribbon界面初探

    # 0. 引言 从CAD2009版本以后就开始使用上了Ribbon界面,更早的版本使用的界面相对较为简单,对比一下就知道啥是Ribbon界面了 这是CAD2006界面,经典的菜单工具栏,略low 这是 ...

最新文章

  1. Go 知识点(12) — 类型转换以三方库 cast
  2. 用python实现todolist_So easy !用 Python 开发一个todolist
  3. 使用transform和transition制作CSS3动画
  4. C++读取文件夹中所有文件的路径,包含子文件夹
  5. spring+cxf
  6. P3389 【模板】高斯消元法
  7. 一种SPA(单页面应用)架构
  8. python随机发红包_python 微信红包随机金额
  9. 吴恩达|机器学习作业7.0.k-means聚类
  10. 关于在Eclipse里面启动了服务,但是localhost:8080无法访问的问题:
  11. cadence 常见pcb电阻_不加端接电阻的快乐,你们绝对想象不到!
  12. 如何用键盘快捷键打开 macOS 控制中心?
  13. 发邮件+实习+简历+
  14. redis-----07-----redigo基本命令操作(主要讲如何让go的struct、map展开成redis的参数,以及使用struct获取redis返回的key-value批量数组)
  15. sqlserver字符串转日期
  16. 这个世界,总是被设计得刚刚好?人类或许只是被设定的一个程序
  17. 加勒比海盗5——死无对证
  18. 十万部冷知识:足球赛中进三个球为什么叫帽子戏法?
  19. java学习笔记四:正则表达式
  20. 夕颜的python笔记001

热门文章

  1. sdn的用处_什么是SDN?SDN有什么优势?
  2. 雅马哈机器人编程讲解_雅马哈机器人配置方法之西门子S7-1500控制技巧分享
  3. max3490esa_max3490中文资料
  4. max3232ese_MAX3232CSE使用指南,MAX3232CES和MAX3232ESE有什么区别?
  5. 探寻微博背后的大数据原理:微博推荐算法简述
  6. AD18单位mm和mil切换
  7. 将数字金额转换为对应的中文大写金额
  8. 机器学习模型评估指标
  9. 第五次上课 PPT作业——随机数组,并求和
  10. 决策树 BP神经网络(BPNN) SVM实现iris鸢尾花数据集的分类