在MFC Feature Pack中,可以为CMFCRibbonBar添加多个CMFCRibbonCategory 作为button panel的容器。在切换这些category时,MFC没有提供对应的消息类型,可以派生一个新的CMFCRibbonBar子类,当设置当前category时,向Main Frame发送消息,将category的caption字符串作为消息参数。在Main Frame中,通过判断对应字符串是否相等,得到当前的category。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// CMFCRibbonBarEx.h
#pragma once
#define WM_USER_SWITCHRIBBONCATEGORY WM_USER+200
class CMFCRibbonBarEx : public CMFCRibbonBar
{
DECLARE_DYNAMIC(CMFCRibbonBarEx)
public:
CMFCRibbonBarEx();
virtual ~CMFCRibbonBarEx();
//overwrite virtual function
virtual BOOL SetActiveCategory(CMFCRibbonCategory* pCategory, BOOL bForceRestore = FALSE );
protected:
DECLARE_MESSAGE_MAP()
};
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// CMFCRibbonBarEx.cpp
#include "stdafx.h"
#include "CMFCRibbonBarEx.h"
IMPLEMENT_DYNAMIC(CMFCRibbonBarEx,CMFCRibbonBar)
BEGIN_MESSAGE_MAP(CMFCRibbonBarEx,CMFCRibbonBar)
END_MESSAGE_MAP()
CMFCRibbonBarEx::CMFCRibbonBarEx()
{
}
CMFCRibbonBarEx::~CMFCRibbonBarEx()
{
}
BOOL CMFCRibbonBarEx::SetActiveCategory(CMFCRibbonCategory* pCategory, BOOL bForceRestore )
{
CMFCRibbonBar::SetActiveCategory(pCategory,bForceRestore);
// when switching the current ribbon category, send message to the main frame
LPCTSTR lpName = pCategory->GetName();
CMainFrame* pMainFrm = (CMainFrame *)AfxGetMainWnd();
pMainFrm->SendMessage(WM_USER_SWITCHRIBBONCATEGORY,NULL,(LPARAM)lpName);
return TRUE;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// MainFrm.h
class CMainFrame
{
CMFCRibbonBarEx m_wndRibbonBar;
afx_msg LRESULT OnSwitchRibbonCategory(WPARAM wparam,LPARAM lparam);
};
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// MainFrm.cpp
ON_MESSAGE(WM_USER_SWITCHRIBBONCATEGORY,OnSwitchRibbonCategory)
LRESULT CMainFrame::OnSwitchRibbonCategory(WPARAM wparam,LPARAM lparam)
{
CString strName;
strName = (LPCTSTR)lparam;
CString categoryName;
if( categoryName.LoadString(IDS_RIBBON_CAD) && ( categoryName == strName ) )
{
MessageBox(_T("CAD"));
}else
if( categoryName.LoadString(IDS_RIBBON_HOME ) && ( categoryName == strName ) )
{
MessageBox(_T("HOME"));
}
return 0;
}
在每次切换category的时候,都会调用虚函数SetActiveCategory。
是否有更合适的方法,欢迎指正。