0
class MyApp : public CWinApp {
        afx_msg OnPrefrences();
    };

当用户从菜单栏中选择工具->首选项时,将调用 OnPrefrences()。

现在在一个对话框中(比如说 DlgX)有一个按钮,点击这个按钮我需要打开 Preference 对话框,它实际上有很多窗格,但是在这里我需要通过选择这些窗格中的一个来打开 Preference 对话框。同样在那个特定的窗格中,我需要隐藏一些控件,只有当它通过这个对话框而不是通过菜单打开时。

所以我在 MainFrm 类中创建了一个变量(比如 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中的事情变得混乱。此外,我正在从事的项目是遗留项目,因此我无法进行太多更改。

有什么模式可以处理这种情况吗?

谢谢

4

2 回答 2

1

我认为对于这种特殊情况,即使有时不再被视为一种模式,单例模式也会为您工作。

于 2012-07-19T08:09:58.800 回答
1

您可以使用自定义对话框解决此问题(如果您还没有)

当您从主菜单显示对话框时,即onPreferences()填充并显示所有“窗格”。你将不得不做一个自定义对话框,其中 ctor 接受一些参数。

例如

enum { all, part };

void MainFrame::OnPreferences() 
{
  CMyPreferences dlg( GetDocument(), all );
  dlg.DoModal();
}

但是当您从对话框中调用它时,您只需填写您需要的部分。

void YourDialog::OnPreferences()
{
  CMyPreferences dlg( GetDocument(), part );
  dlg.doModal();
}

对于要显示/允许编辑的内容的更精细调整的配置,该参数可能更复杂。

于 2012-07-19T08:34:48.310 回答