Docで子ダイアログを生成するには?

解決


臼井  2003-06-29 22:31:29  No: 51623  IP: [192.*.*.*]

C覚えたてで、C++始めたばかりのものです

VC6のMFCで質問がありますOSは2000です

プロジェクト名をTestにして
リソースのダイアログIDD_TEST、そのクラスCTestDlgを作っています

TestDocのメンバ変数として
CTestDlg* pTestDlgを宣言

BOOL CTestDoc::OnNewDocument()で
if(pAgentDlg==NULL)
{
  pTestDlg=new CTestDlg();
  pTestDlg->Create(IDD_TEST,NULL);//NULLではだめ?
}
とやってダイアログを作成しています

ここで質問なのですが
作成されたダイアログの親ウインドウはメインのウインドウになっているのでしょうか?
(起動させるとWindowsのタスクバーに、メインのアプリの他にダイアログの起動を表す
物まで表示されてしまいます)

また、CTestDlgの中でメインのウインドウのクライアント領域を無効化する方法
を教えていただきたいのですが。

CTestDlgから
CWnd* pWnd;
pWnd=this->GetParent();
pWnd->InvalidateRect(NULL,FALSE);
などとやってみたのですが変化なしでした。

分かりにくい説明かと思いますがよろしくお願いしますm(__)m

編集 削除
Wanderer  2003-06-30 17:11:13  No: 51624  IP: [192.*.*.*]

>作成されたダイアログの親ウインドウはメインのウインドウになっているのでしょうか

MFCのソースをざっと見た感じでは、メインのウインドウになっているようですが、
メインウインドウのポインタは AfxGetMainWnd()で取得できるので、明示的に指
定しておけば安心できるかと思います。

編集 削除
臼井  2003-06-30 21:38:51  No: 51625  IP: [192.*.*.*]

Wandererさんありがとうございます。
AfxGetMainWnd()で解決できました。

アプリ起動時にWindowsタスクバーにダイアログの起動を示す物が表示される件ですが
以下の様にダイアログを複数作成すると最初の一つのみタスクバーに表示されてしまいます

BOOL CTestDoc::OnNewDocument()で
if(pTestDlgA==NULL)
{
  pTestDlgA=new CTestADlgA();
  pTestDlgA->Create(IDD_TEST_A,NULL);//ダイアログA表示、タスクバーに起動状態が表示される
}
if(pTestDlgB==NULL)
{
  pTestDlgB=new CTestDlgB();
  pTestDlgB->Create(IDD_TEST_B,NULL);//ダイアログB表示、タスクバーに起動状態が表示されない
}
if(pTestDlgC==NULL)
{
  pTestDlgC=new CTestDlgC();
  pTestDlgC->Create(IDD_TEST_C,NULL);//ダイアログC表示、タスクバーに起動状態が表示されない
}

さらに、先に作成されたダイアログは後に作成されたダイアログより前面に表示できません
(ダイアログAとダイアログBが重なっている時、AをクリックしてもBに隠れたまま)

どこがおかしいのでしょうか?

編集 削除
Wanderer  2003-07-01 08:58:33  No: 51626  IP: [192.*.*.*]

どうやら初回の CxxxDocument::OnNewDocument() が呼ばれるタイミングでは
AfxGetMainWnd()でメインフレームのポインタは取得できないようです。

だからダイアログがトップレベルウインドウとして作成されるため、タスクバー
に表示されたのでしょう。また2つ目以降のダイアログは1つ目のダイアログを
親として作成されるようですね。それで前後の切替ができないのでしょう。

初回OnNewDocument()の呼び出しはアプリケーションの初期化が完了する前のタ
イミングになるので、ここでダイアログを表示するのあまりよろしくないかと思
います。

編集 削除
臼井  2003-07-01 14:46:27  No: 51627  IP: [192.*.*.*]

何度も丁寧に教えて頂いてありがとうございました
CViewからダイアログを生成する事で解決できました。

編集 削除