您的位置:首页 > Web前端

响应MFC Feature Pack中 CMFCRibbonCategory 切换消息

2010-02-26 11:05 155 查看
在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。

是否有更合适的方法,欢迎指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: