如何将CCmdTarget派生类嵌入到MFC消息链中?

时间:2011-03-26 14:42:45

标签: c++ mfc

我想从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()

1 个答案:

答案 0 :(得分: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来避免为每个设置编写处理函数。