在VS2008 SP1中有很炫的类似OFFICE07的Ribbon主题“菜单”,研究了2天,总结下。
参考资料:msdn
视频:微软的1 2
基本资源和类如图:
继承图为:图中标注的是常用的几个类
用法:
1 接着添加CMFCRibbonBar
.h中声明
CMFCRibbonBar m_wndRibbonBar; .cpp中 m_wndRibbonBar.Create(this);
此时得到的是一个空白的Bar
2 最大的那个button
.h中声明
CMFCRibbonApplicationButton m_MainButton;
.cpp中
m_MainButton.SetImage(IDB_MAIN); m_MainButton.SetText(_T("/nf")); m_MainButton.SetToolTipText(strTemp); CMFCRibbonMainPanel* pMainPanel = m_wndRibbonBar.AddMainCategory(strTemp, IDB_FILESMALL, IDB_FILELARGE);//大按钮点击后出现的panle //这里有32×32 和16×16两种位图资源 分别提供按钮的大小 两种图标
然后通过
pMainPanel->Add(new CMFCRibbonButton(ID_FILE_NEW, _T("按钮1"), 0, 0));//添加大按钮点击后出现的panle上的按钮
3 添加Category
.cpp中
//每个TAB就相当于一个Category,分别添加就可以 很简单 CMFCRibbonCategory *pCategory = m_wndRibbonBar.AddCategory(_T("Button"), IDB_FILESMALL,IDB_FILELARGE); CMFCRibbonPanel* pPanel = pCategory->AddPanel(_T("Large Button")); CMFCRibbonButton* pButton; pPanel->Add(new CMFCRibbonButton(ID_BUTTON_BUTTON1,_T("Button"),0,0)); pButton = new CMFCRibbonButton(ID_BUTTON_BUTTON2,_T("Menu Button"),1,1); pButton->SetMenu(IDR_MAINFRAME); pPanel->Add(pButton); pButton = new CMFCRibbonButton(ID_BUTTON_BUTTON3,_T("Splitter Menu Button"),2,2); pButton->SetMenu(IDR_MAINFRAME,TRUE); pPanel->Add(pButton);
另外按钮要必须指定事件才可以是enable的状态,可以用
ON_COMMAND_RANGE(ID_BUTTON_BUTTON2, ID_BUTTON_BUTTON9,&CMFCCategoryDemoView::OnButtonButton)
=====================================
在新的vs2010里 这些界面已经可以直接可视化编辑了 Resource View ----Ribbon-IDR_RIBBON
=====================================
获取RibbonBar相关控件指针的方法:
CMainFrame *pMainFrame = (CMainFrame *)AfxGetApp()->m_pMainWnd; ASSERT_VALID(pMainFrame); //获取RibbonBar指针 CMFCRibbonBar *pRibbonBar = pMainFrame->GetRibbonBar(); ASSERT_VALID(pRibbonBar); //获取RibbonComboBox控件指针 CMFCRibbonComboBox *pCombox = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbonBar->FindByID(uiCmdID)); //使用…… pCombox->AddItem(lpszItem);
=================================================
更新下改变CMFCRibbonStatusBar里CMFCRibbon元素文字颜色的方法
先看效果图
第一个是默认的CMFCRibbonButton的默认字体颜色
第二个是修改之后的CColorRibbonButton的默认字体颜色,与ribbon主题相符
方法是从CMFCRibbonButton派生出CColorRibbonButton,然后改写虚函数。DrawRibbonText代码如下
class CColorMFCRibbonBT : public CMFCRibbonButton { public: CColorMFCRibbonBT(UINT nID, LPCTSTR lpszText); ~CColorMFCRibbonBT(); public: int DrawRibbonText(CDC* pDC, const CString& strText, CRect rectText, UINT uiDTFlags, COLORREF clrText = (COLORREF)-1); protected: private: };
CColorMFCRibbonBT::CColorMFCRibbonBT(UINT nID, LPCTSTR lpszText ):CMFCRibbonButton(nID,lpszText) { } CColorMFCRibbonBT::~CColorMFCRibbonBT() { } int CColorMFCRibbonBT::DrawRibbonText(CDC* pDC, const CString& strText, CRect rectText, UINT uiDTFlags, COLORREF clrText ) { ASSERT_VALID(this); ASSERT_VALID(pDC); uiDTFlags = DT_SINGLELINE | DT_VCENTER | DT_END_ELLIPSIS; clrText = afxGlobalData.clrBarText; return CMFCRibbonButton::DrawRibbonText(pDC, strText, rectText, uiDTFlags, clrText); }
AddElement(new CColorMFCRibbonBT(ID_STATUSBAR_LOGNAME,_T("当前登录账号为:")),_T("当前登录账号"));
=====================================================
更改ribbon里的字体有很简单的方法就是
m_wndRibbonBar.SetFont(&g_Font);
1.添加ribbon按钮之后,设置属性prompt,这个prompt是tooltips的详细说明。
2.在代码里mainfrm初始化的时候,设置一个tooltips的大纲说明
m_wndRibbonBar.FindByID(ID_RIBBON_BUTTON_SIMPLEQUERY)->SetToolTipText(_T("简单查询"));运行的时候效果如下图