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();
}


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

08-16 02:03