在类实例之间共享变量

Sharing variable among class instances

本文关键字:共享变量 之间 实例      更新时间:2023-10-16
class MyApp : public CWinApp {
        afx_msg OnPrefrences();
    };

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

现在在一个对话框(比如说 DlgX(中有一个按钮,单击此按钮后,我需要打开"首选项"对话框,该对话框实际上有许多窗格,但在这里我需要通过选择一个打开"首选项"对话框这些窗格作为活动状态。同样在该特定窗格中,我只需要隐藏一些控件,当它通过此对话框而不是通过菜单打开时。

所以我在 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 中的东西变得混乱。此外,我正在从事的项目是遗留项目,所以我无法进行太多更改。

有没有处理这种情况的模式?

谢谢

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

当您从主菜单显示对话框时,即 onPreferences()填充并显示所有"窗格"。您必须执行一个自定义对话框,其中 CTOR 接受一些参数。

例如

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

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

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

该参数可能是更复杂的内容,以便对要显示/允许编辑的内容进行更精细的配置。

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