我想从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()
答案 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_RANGE
和ON_UPDATE_COMMAND_UI_RANGE
来避免为每个设置编写处理函数。