2011-03-26 3 views
3

View 클래스에서 특정 설정 코드를 추출하여 CSettings 클래스에 넣으 려합니다.CCmdTarget 파생 클래스를 MFC 메시지 체인에 포함시키는 방법은 무엇입니까?

내가 설정의 양이 CSettings 클래스에서 처리되어야 설정에 대한 메뉴 (리본)에서 이상의 80

모든 메시지가 될 것입니다 내를 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

보기 클래스의 메시지 맵에 아무 것도 추가 할 필요가 없습니다. 대신 당신은 다음과 같이 당신의 CSettings 클래스 경로에 명령 및 업데이트 메시지를 OnCmdMsg 기능을 오버라이드 (override) :

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을 사용하는 것이 좋습니다.

관련 문제