2011-03-26 69 views
3

我想從View類中提取一些特定於設置的代碼並將其放入CSettings類中。如何將CCmdTarget派生類嵌入到MFC消息鏈中?

我不想臃腫時的設置量將超過80

所有關於設置在菜單(和色帶)消息應該CSettings類來處理我的CView類。

我無法理解的唯一事情是如何將消息映射條目嵌入到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

您不必在視圖類的消息映射中添加任何東西。相反,你應該重寫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以避免必須爲每個設置編寫處理函數。