【问题标题】:How to embed CCmdTarget-derived class into MFC message chain?如何将 CCmdTarget 派生类嵌入到 MFC 消息链中?
【发布时间】:2011-03-26 14:42:45
【问题描述】:

我想从 View 类中提取一些特定于设置的代码并将其放入 CSettings 类中。

当设置数量超过 80 时,我不想让 CView 类膨胀。

所有来自菜单(和功能区)的关于设置的消息都应该在 CSettings 类中处理。

我唯一不明白的是如何将消息映射条目嵌入到 CMyView 消息映射中。

//The main purpose of class CSettings is to remove all the logic of settings from View.
class CSettings : public CCmdTarget
{
   DECLARE_MESSAGE_MAP()
   DECLARE_DYNAMIC(CSettings)
   void OnCheckS1() {
       m_bVal1 = !m_bVal1;
   }

   void OnUpdateCheck1(CCmdUI* pCmdUI){
       pCmdUI->SetRadio(m_bVal1);
   }

   bool m_bVal1;
   <other 80 settings>
}

BEGIN_MESSAGE_MAP(CSettings, CCmdTarget)
    ON_COMMAND(ID_CHECK_S1, &CSettings::OnCheckS1)
    ON_UPDATE_COMMAND_UI(ID_CHECK_S1, &CSettings::OnUpdateCheck1)
END_MESSAGE_MAP()


class CMyView : public CView
{
      ...
    CSettings m_sett;
}

BEGIN_MESSAGE_MAP(CMyViewView, CView)
--->>> ??? <<<----
END_MESSAGE_MAP()

【问题讨论】:

    标签: c++ mfc


    【解决方案1】:

    您不必向视图类的消息映射添加任何内容。相反,您应该重写 OnCmdMsg 函数来路由命令并将消息更新到您的 CSettings 类,如下所示:

    class CMyView : public CView {
        // ...
        virtual BOOL OnCmdMsg(UINT nID, int nCode, void* pExtra,
            AFX_CMDHANDLERINFO* pHandlerInfo);
    };
    
    BOOL CMyView::OnCmdMsg(UINT nID, int nCode, void* pExtra,
        AFX_CMDHANDLERINFO* pHandlerInfo)
    {
        if (m_sett.OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
            return TRUE;
    
        return CView::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);    
    }
    

    查看 MSDN 中的 this page 了解更多信息。

    另外,如果您有 80 多个设置,您可能需要考虑使用 ON_COMAND_RANGEON_UPDATE_COMMAND_UI_RANGE 以避免为每个单独的设置编写处理函数。

    【讨论】:

      猜你喜欢
      • 2014-08-09
      • 2023-03-06
      • 1970-01-01
      • 2012-02-03
      • 2014-10-13
      • 2017-02-14
      • 2012-12-07
      • 2021-04-06
      • 2020-05-23
      相关资源
      最近更新 更多