如何使用功能区类别来切换视图?

时间:2010-10-09 15:19:30

标签: mfc ribbon

我想使用两个功能区类别按钮在两个不同的视图之间切换,但我发现它无法为按钮添加事件处理程序。

有什么提示可以解决这个问题吗?如果有一些样本更好,实际上我是MFC的新手。

2 个答案:

答案 0 :(得分:2)

您可以尝试挂钩此事件吗?

AFX_WM_ON_CHANGE_RIBBON_CATEGORY

答案 1 :(得分:0)

我发现成功的一个选项是继承CMFCRibbonBar并覆盖PreTranslateMessage并检查鼠标点击。以下是我迄今为止运作良好的步骤。

  1. 子类CMFCRibbon - 在我的例子中我创建了CCustomRibbonBar
  2. 覆盖PreTranslateMessage,并添加一个int值以跟踪选项卡
  3. 在我的示例中创建应用程序MainForm处理-WM_ACTIVE_RIBBON_TAB_CHANGED的自定义Windows消息
  4. PreTranslateMessage内部检查左鼠标向上事件
  5. 如果鼠标左键按下,请让功能区完成处理消息,然后查询活动类别。
  6. 将活动类别发布到MainForm(或其他形式)
  7. 在您的MainForm中,处理该类别并考虑到大多数事件的类别都不会更改。
  8. 然后在我的覆盖中,我检查鼠标注册事件并检索活动类别

    内部宣言

      virtual BOOL PreTranslateMessage(MSG* pMsg);
        int m_LastActiveCategory;
    

    内部类定义

    BOOL CCustomRibbonBar::PreTranslateMessage(MSG* pMsg)
    {
        //If command was finishing a click
        if(pMsg->message == WM_LBUTTONUP && pMsg->wParam == 0)
        {
    
            //Allow ribbon to handle itself first
             BOOL result = CMFCRibbonBar::PreTranslateMessage(pMsg);
    
             //Get new active tab
             int activeTab = GetCategoryIndex(GetActiveCategory());
    
             //If tab has changed, forward message
             if(activeTab != m_LastActiveCategory)
             {
                  //forward message to parent
                ::SendMessage(GetParentFrame()->GetSafeHwnd(),WM_ACTIVE_RIBBON_TAB_CHANGED,activeTab,0);
                m_LastActiveCategory = activeTab;
             }
    
    
    
             return result;
        }
    
        //Otherwise handle like normal
        return CMFCRibbonBar::PreTranslateMessage(pMsg);
    }