在VS2008 SP1中有很炫的类似OFFICE07的Ribbon主题“菜单”,研究了2天,总结下。
参考资料:msdn
基本资源和类如图:
继承图为:图中标注的是常用的几个类
用法:
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);
另外添加ribbon按钮的时候,自定义的tooltips经常显示不出来,研究了一下,原来还是有点诀窍的,方法如下:
1.添加ribbon按钮之后,设置属性prompt,这个prompt是tooltips的详细说明。
2.在代码里mainfrm初始化的时候,设置一个tooltips的大纲说明
m_wndRibbonBar.FindByID(ID_RIBBON_BUTTON_SIMPLEQUERY)->SetToolTipText(_T("简单查询"));
运行的时候效果如下图
如果我的文字解决了你的问题,请打个赏的,让我更有动力:)