親ダイアログボックスクラスを参照する方法について

[戻る]
初心者8号 2002/12/04(水) 11:29:08
おはようございます。

【実現したい事】
MFCで作成したダイアログクラスを他の関数ファイルからも
参照できるような方法が知りたい。

【状況/前置き】
MFCでダイアログを作成しました。
また共通関数ライブラリを作成しようと思い
kansu.cppとkansu.hを作成して中にいくつかの関数を作成しました。
ダイアログ.cppのヘッダーで<kansu.h>を宣言して
関数は使えるようになりました。

【問題】
共通関数の中でダイアログに値をセットできる関数を作りたいのですが
kansu.cpp内での親ダイアログの参照方法する必要があります。
そこで取った方法は

@MFCが自動作成するダイアログを呼び出している箇所の上に
ダイアログクラスの変数を作る。
Aその変数に作成するダイアログのポインタを保存しておく

CxxxDlg* p_dlg;              //この1行を追加
BOOL CxxxApp::InitInstance()
{
    CxxxDlg dlg;
    m_pMainWnd = &dlg;
    p_dlg = &dlg;       //この1行を追加
}

Bkansu.cpp内にincludeしてexternする。
#include "xxxDlg.h"
#include "xxx.h"

extern CxxxDlg* p_dlg; //メインクラスの呼び出し

kansu(){
p_dlg->aaa = 3;
p_dlg->UpdateData(false);
}

【質問】
この方法で出来ることは出来るのですが
かなり回りくどいことをやっている気がします。

なんとか上手く他の関数ファイルからダイアログクラスを参照することは
出来ないのでしょうか?

VC++6.0 MFC使用

dairygoods 2002/12/04(水) 12:01:53
「親ダイアログを参照」と言うと、
「ある子ダイアログのポインタが既に分かっていて、その親ダイアログの
ポインタを得たい」という意味に取れますが、その場合は、
  (CxxxDlg*)pChildDlg->GetParent();
です。


上記のソースを見る限りは、
「アプリケーションのメインダイアログのポインタを得たい」
というように見えます。

その場合、ウィザードによって作成される、
>    m_pMainWnd = &dlg;
という行が、まさに、初心者8号さんが加えた処理と同じことをやっています。
このm_pMainWndの値は、AfxGetMainWnd()で取得できます
(メインスレッドから呼び出した場合に限る)。

kansu(){
  CxxxDlg* p_dlg = (CxxxDlg*)AfxGetMainWnd();
  p_dlg->aaa = 3;
  p_dlg->UpdateData(false);
}


#個人的には、CxxxDlgクラスに依存する関数は、
#CxxxDlgクラスのメンバ関数にするのが良いと思いますけど。

古いスレッドには追加発言できません。