class MyApp : public CWinApp {
afx_msg OnPrefrences();
};
当用户选择工具时,会调用OnPrefrences() - >来自菜单栏的偏好。
现在在一个对话框(Say DlgX)中有一个按钮,点击此按钮我需要打开Preference对话框,其中实际上有很多窗格,但在这里我需要打开Preference对话框,选择一个这些窗格为活动。同样在那个特定的窗格中,我需要隐藏一些控件,只有当它通过这个对话框而不是通过菜单打开时。
所以我在MainFrm类中创建了一个变量(Say m_varX)。
void DlgX::OnButtonXClick()
{
CMainFrame* pFrame = (CMainFrame*)AfxGetMainWnd();
if(pFrame)
{
pFrame->m_varX = TRUE;
((CMyApp*)(AfxGetApp()))->OnPrefrences();
pFrame->m_varX = FALSE;
}
}
在DlgX的按钮处理程序中,我将m_varX设为TRUE并调用OnPreference(),关闭此首选项对话框后,我将m_varX设为FALSE。
这一切都很好......但问题是mainFrm中的东西变得杂乱无章。我正在研究的项目也是遗产项目,所以我无法做出太多改变。
有没有可用于处理此类案件的模式?
谢谢
答案 0 :(得分:1)
我认为对于这种特殊情况,即使有时不再将其视为一种模式,singleton pattern也适合你。
答案 1 :(得分:1)
您可以使用自定义对话框解决此问题(如果您还没有)
当您从主菜单显示对话框,即onPreferences()时,您将填写并显示所有'窗格'。你必须做一个自定义对话框,其中ctor采取一些参数
e.g。
enum { all, part };
void MainFrame::OnPreferences()
{
CMyPreferences dlg( GetDocument(), all );
dlg.DoModal();
}
但是当您从对话框中调用它时,您只需填写所需的部分。
void YourDialog::OnPreferences()
{
CMyPreferences dlg( GetDocument(), part );
dlg.doModal();
}
对于要显示/允许编辑的内容的更精细配置,该参数可能更复杂。