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

OnPrefrences() は、ユーザーがメニューバーからツール -> 設定を選択したときに呼び出されます。

現在、1 つのダイアログ (DlgX と言う) に 1 つのボタンがあり、これをクリックすると、実際には多くのペインがある環境設定ダイアログを開く必要がありますが、ここでは、これらのペインの 1 つをアクティブとして選択して環境設定ダイアログを開く必要があります。また、その特定のペインでは、メニューからではなく、このダイアログから開いたときにのみ、一部のコントロールを非表示にする必要があります。

そのため、MainFrm クラスに 1 つの変数 (たとえば 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

カスタムダイアログでこれを解決できます(まだ持っていない場合)

メイン メニューからダイアログを表示する場合、つまり、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 に答える
1

その特別なケースでは、パターンと見なされなくなった場合でも、シングルトンパターンがうまくいくと思います。

于 2012-07-19T08:09:58.800 に答える