响应MFC Feature Pack中 CMFCRibbonCategory 切换消息

在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。

 

 

是否有更合适的方法,欢迎指正。

 

 

你可能感兴趣的:(响应MFC Feature Pack中 CMFCRibbonCategory 切换消息)