多彩界面,Ribbon编程

Ribbon是类似于office2007样式的界面,它替代了传统的MFC程序里的菜单和工具栏,MFC默认生成的Ribbon功能少,需要我们自己添加一些控件和图片等元素使界面好看。与菜单资源相比,Ribbon的设计使界面更加直观,带有的图标也使界面看起来更加美观。Ribbon界面设计的重要方面就是要设计所需的图标,设计图标时,需要设计小图标和大图标,Ribbon类的添加有两种方式。

方法一:资源创建

可以利用VS2010带有的资源编辑器创建Ribbon资源,并在程序中调用,调用方式:

m_wndRibbonBar.LoadFromResource(IDR_RIBBON)

在右边的工具栏中,具有与Ribbon界面相关的各种工具,可以选择相应的Ribbon工具按照工具进行添加,可以先添加category,再添加Pane,再根据自己的需要添加各种按钮、按钮集、复选框等。

Ribbon工具栏及其包含的控件如下:

在利用资源编辑的方式编辑Ribbon界面时,注意先利用位图的方式引入category需要的图标,然后再在具体的控件中填写引用的序号,并选用相应的ID,针对下拉式按钮,在创建时,可以利用“Menu Item”项目创建子项目。

在资源中创建Ribbon界面之后,可以利用ClassWizard添加各个控件的Ribbon变量,并针对各个按钮创建实现的代码函数,实现相应的程序设计。

方法二:编程创建

1.      Ribbon主菜单的设计

m_MainButton.SetImage(IDB_RIBBON_MAIN);

m_MainButton.SetToolTipText(_T("File"));

m_MainButton.SetText(_T("\nf"));

m_wndRibbonBar.SetApplicationButton(&m_MainButton, CSize (45, 45));

CMFCRibbonMainPanel*pMainPanel = m_wndRibbonBar.AddMainCategory (_T("File"),IDB_RIBBON_FILE_SMALL, IDB_RIBBON_FILE_LARGE);

pMainPanel->Add(new CMFCRibbonButton (ID_FILE_NEW, _T("&New"), 0, 0));

pMainPanel->Add(new CMFCRibbonButton (ID_FILE_OPEN, _T("&Open..."), 1, 1));

pMainPanel->Add(new CMFCRibbonButton (ID_FILE_SAVE, _T("&Save"), 2, 2));

pMainPanel->Add(new CMFCRibbonButton (ID_FILE_SAVE_AS, _T("Save &As..."), 3, 3));

std::auto_ptr<CMFCRibbonButton>apBtnPrint(new CMFCRibbonButton (ID_FILE_PRINT,_T("&Print"), 4, 4));

apBtnPrint->AddSubItem(new CMFCRibbonLabel (_T("Preview and print the document")));

apBtnPrint->AddSubItem(new CMFCRibbonButton (ID_FILE_PRINT, _T("&Print"), 4, 4, TRUE));

apBtnPrint->AddSubItem(new CMFCRibbonButton (ID_FILE_PRINT_DIRECT,_T("&Quick Print"), 6, 6,TRUE));

apBtnPrint->AddSubItem(new CMFCRibbonButton (ID_FILE_PRINT_PREVIEW,_T("Print Pre&view"), 7, 7,TRUE));

apBtnPrint->SetKeys (_T("p"),_T("w"));

pMainPanel->Add (apBtnPrint.release());

pMainPanel->AddRecentFilesList(_T("Recent Documents"));

pMainPanel->AddToBottom(new CMFCRibbonMainPanelButton(ID_TOOLS_OPTIONS, _T("Opt&ions"),8));

pMainPanel->AddToBottom(new CMFCRibbonMainPanelButton (ID_APP_EXIT,_T("E&xit"), 9));

2.      Ribbon的category的添加:

CMFCRibbonCategory*pCategory = m_wndRibbonBar.AddCategory(_T("&Buttons"),IDB_RIBBON_CATEGORY1_SMALL, IDB_RIBBON_CATEGORY1_LARGE);

CMFCRibbonPanel*pPanel1 = pCategory->AddPanel(_T("LargeButtons"));

std::auto_ptr<CMFCRibbonButton>apBtn1(new CMFCRibbonButton(ID_RIBBON_BTN_1,_T("Button"), 0, 0));

apBtn1->SetAlwaysLargeImage();

pPanel1->Add(apBtn1.release());

std::auto_ptr<CMFCRibbonButton>apBtn2(new CMFCRibbonButton(ID_RIBBON_BTN_2,_T("Menu Button"), 1, 1));

apBtn2->SetMenu(IDR_RIBBON_MENU_1);

apBtn2->SetAlwaysLargeImage();

pPanel1->Add(apBtn2.release());

std::auto_ptr<CMFCRibbonButton>apBtn3(new CMFCRibbonButton(ID_RIBBON_BTN_3,_T("Split Button"), 2, 2));

apBtn3->SetMenu(IDR_RIBBON_MENU_1,TRUE);

apBtn3->SetAlwaysLargeImage();

apBtn3->RemoveSubItem(0);

apBtn3->AddSubItem(new CMFCRibbonButton(ID_RIBBON_MBTN_1, _T("Item 1"), 2), 0);

pPanel1->Add(apBtn3.release());

CMFCRibbonPanel*pPanel2 = pCategory->AddPanel(_T("Small"));

std::auto_ptr<CMFCRibbonButton>apBtn4(new CMFCRibbonButton(ID_RIBBON_BTN_4,_T("Button"), 3));

pPanel2->Add(apBtn4.release());

std::auto_ptr<CMFCRibbonButton>apBtn5(new CMFCRibbonButton(ID_RIBBON_BTN_5,_T("Menu Button"), 4));

apBtn5->SetMenu(IDR_RIBBON_MENU_1);

pPanel2->Add(apBtn5.release());

std::auto_ptr<CMFCRibbonButton>apBtn6(new CMFCRibbonButton(ID_RIBBON_BTN_6,_T("Split Button"), 5));

apBtn6->SetMenu(IDR_RIBBON_MENU_1,TRUE);

apBtn6->SetAlwaysLargeImage();

apBtn6->RemoveSubItem(1);

apBtn6->AddSubItem(new CMFCRibbonButton(ID_RIBBON_MBTN_2, _T("Item 2"), 5), 1);

pPanel2->Add(apBtn6.release());

CMFCRibbonPanel*pPanel3 = pCategory->AddPanel(_T("CheckBoxes"));

pPanel3->Add(new CMFCRibbonCheckBox(ID_RIBBON_BTN_7, _T("Check Box 1")));

pPanel3->Add(new CMFCRibbonCheckBox(ID_RIBBON_BTN_8, _T("Check Box 2")));

pPanel3->Add(new CMFCRibbonCheckBox(ID_RIBBON_BTN_9, _T("Check Box 3")));

pPanel1->SetData(ID_RIBBON_SOURCE_CODE_1_1);

pPanel2->SetData(ID_RIBBON_SOURCE_CODE_1_2);

pPanel3->SetData(ID_RIBBON_SOURCE_CODE_1_3);

3.      其它category的添加

添加方法同2

4.      界面风格的变化:

Ribbon支持MFC风格界面的变化,可以根据设定的Style设定不同的界面风格。

switch (m_nAppLook)

{

caseID_VIEW_APPLOOK_2007:

caseID_VIEW_APPLOOK_2007_1:

caseID_VIEW_APPLOOK_2007_2:

caseID_VIEW_APPLOOK_2007_3:

switch (m_nAppLook)

{

caseID_VIEW_APPLOOK_2007:

CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_LunaBlue);

break;

caseID_VIEW_APPLOOK_2007_1:

CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_ObsidianBlack);

break;

caseID_VIEW_APPLOOK_2007_2:

CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_Silver);

break;

caseID_VIEW_APPLOOK_2007_3:

CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_Aqua);

break;

}

CMFCVisualManager::SetDefaultManager (RUNTIME_CLASS(CMFCVisualManagerOffice2007));

CDockingManager::SetDockingMode (DT_SMART);

break;

default:

ASSERT(FALSE);

}

最终界面:

【VS开发】RIbbon编程的更多相关文章

  1. (转载)android开发常见编程错误总结

    首页 › 安卓开发 › android开发 android开发常见编程错误总结 泡在网上的日子 / 文 发表于2013-09-07 13:07  第771次阅读 android,异常 0 编辑推荐:稀 ...

  2. Java开发手册-编程规约精选

    # Java开发手册-编程规约精选 ## 总约 - 采用驼峰写法 ## 变量 - 首字母小写 ## 方法 - 方法名首字母小写- 参数首字母小写 ## 引用 - <阿里巴巴Java开发手册> ...

  3. [转载]Web前端开发工程师编程能力飞升之路

    [背景] 如果你是刚进入web前端研发领域,想试试这潭水有多深,看这篇文章吧:如果你是做了两三年web产品前端研发,迷茫找不着提高之路,看这篇文章吧:如果你是四五年的前端开发高手,没有难题能难得住你的 ...

  4. linux应用程序开发-文件编程-系统调用方式

    在看韦东山视频linux驱动方面有一些吃力,究其原因,虽然接触过linux应用程序编程,但是没有深入去理解,相关函数用法不清楚,正好看到国嵌视频对这一方面讲的比较透彻, 所以把学习过程记录下来,也作为 ...

  5. ios开发 网络编程浅析(一)

    iphone包含了很多框架和库,从底层的套接字到不同层次的封装,可以方便地给程序添加网络功能. (1)BSD套接字.最底层的套接字,这是Unix网络开发常用的API.如果从其他系统移植程序,而程序用的 ...

  6. Web前端开发工程师编程能力飞升之路

    [背景] 如果你是刚进入web前端研发领域,想试试这潭水有多深,看这篇文章吧:如果你是做了两三年web产品前端研发,迷茫找不着提高之路,看这篇文章吧:如果你是四五年的前端开发高手,没有难题能难得住你的 ...

  7. iOS开发— Socket编程

    Socket编程 一.了解网络各个协议:TCP/IP.SOCKET.HTTP等 网络七层由下往上分别为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 其中物理层.数据链路层和网络层通常被 ...

  8. 1_1准备工作[wp8特色开发与编程技巧]

    1准备工作 大家好,我是徐文康,今天我要开始带大家玩转windowsphone8 app的开发 在这一套视频中,我将带大家从零开始学习编程.在互联网时代熟悉编程是非常有必要的.差异化竞争将变成趋势,那 ...

  9. iOS开发——网络编程OC篇&Socket编程

    Socket编程 一.网络各个协议:TCP/IP.SOCKET.HTTP等 网络七层由下往上分别为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 其中物理层.数据链路层和网络层通常被称作 ...

随机推荐

  1. PHP mysqli_field_seek() 函数

    定义和用法 mysqli_field_seek() 函数把字段指针设置为指定字段的偏移量. 设置结果集中第一个字段(列)的字段指针,然后通过 mysqli_fetch_field() 获取字段信息并输 ...

  2. mysql日常优化细节

    # sql语句优化> 1)使用limit限制一次性查询出的数据量2)链接查询代替子查询3)尽量不要使用select * ,将需要查找的字段列出来4)如果数据量特别大的话尽量将一条复杂的sql拆分 ...

  3. java+上传整个文件夹的所有文件

    我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 首先我们需要了解的是上传文件三要素: 1.表单提交方式:post (get方式提交有大小 ...

  4. 洛谷P2110 欢总喊楼记

    洛谷题目链接 乱搞qwq 我们其实可以找规律,对于每个数$x$,我们先求出从$1$~$x$中有多少符合条件的,记为$sum[x]$,那么类似于前缀和,答案自然就是$sum[r]-sum[l-1]$了 ...

  5. [Luogu] 相关分析

    不想调了 #include <bits/stdc++.h> ; #define LL long long #define gc getchar() int fjs; struct Node ...

  6. Cogs 647. [Youdao2010] 有道搜索框(Trie树)

    [Youdao2010] 有道搜索框 ★☆ 输入文件:youdao.in 输出文件:youdao.out 简单对比 时间限制:1 s 内存限制:128 MB [问题描述] 在有道搜索框中,当输入一个或 ...

  7. Sqlite3错误:Recursive use of cursors not allowed 的解决方案

    感悟] 写完这篇日志后,有调了一段时间程序,又有了一点心得分享下: 一)爬稳定的数(dong)据(xi)最好存储下来,特别是数据库在国外的那种,下载时间成本太高昂了,存起来再处理,会节约很多时间: 二 ...

  8. svn上误删除覆盖的文件简单恢复步骤

    因为失误,不小心把同事提交到svn的文件给覆盖删除了.早上来和我说,吓死宝宝了... 还好,svn是个好东西,恢复到某个版本就行了.下面是简单步骤: 1.在本地的svn项目文件,右键---Toitoi ...

  9. SAE上配置Django静态文件

    很简单,步骤如下: 1.修改配置文件 setting.py 中的STATIC_ROOT为 '/static/' 2. 运行 python manage.py collectstatic , 将静态文件 ...

  10. PHP 二维数组去重方法

    php二维数组的去重策略,如果需要根据某字段去重(其他字段可能不一致),那么需要使用循环策略,如果去重的都是相同的(字段,值),那么可以用序列化方式. $allComments = array_map ...