AというダイアログボックスからBというダイアログボックスを
モーダルで開いて、Bダイアログボックスを終了させ、
AダイアログボックスがActiveになったとき、Aダイアログボックスに
おいてなんらかの動作を行いたいのですが、どうすれば良いの
でしょうか?
よろしくお願いします。
WindowsSDKを前提として…(MFCやってないんでご勘弁を m(_ _)m)
case WM_ACTIVATE:
if(wParam==WA_ACTIVE && lParam!=0) {
/* ダイアログAがアクティブ(ダイアログBが消えた)*/
}
if(wParam==WA_INACTIVE && lParam!=0){
/* ダイアログBが生み出された */
}
break;
ダイアログBが生み出されたとき、
『WM_ACTIVATE WRAPAM:WM_INACTIVE LPARAM:<ダイアログBのハンドル値>』
のメッセージが飛んできます。
他APP等に飛んだ場合等は『lParamの値は0』となっています。
モーダルダイアログとの事でしたので、ダイアログAから生み出されるダイアログは
1つと限定されておりますので lParam!=0 にしました。
ダイアログを生み出す直前に『ダイアログ処理番号』を確保しておき、
WA_ACTIVE && lParam!=0 に適合した後、処理番号によって処理を切りかえれば。
生み出したダイアログに対応した消去後の処理を行う事ができます。
Nao@NSoftです。
それって、アクティブとか関係ないような気がするのですが・・・
#勘違いでしたらごめんなさい。
MFCだと、doModal()でモーダルダイアログを表示しますよね。それの戻り値を見ればよいだけかと。
例えば、
int nRet;
CBDlg BDlg;
nRet = BDlg.doModal();
switch (nRet){
case IDOK:
//OKボタンが押された時の処理
break;
case IDCANCEL:
//キャンセルボタンが押された時の処理
break;
default:
//エラー処理など
break;
}
上記のようにしておけば、Bダイアログが終了した時に何か処理を行うことが出来ます。
いかがでしょうか?
>それって、アクティブとか関係ないような気がするのですが・・・
>#勘違いでしたらごめんなさい。
あ。モーダルでしたね……
CreateDialog関数は『モーダレス』用でした^^;
~~~~~~~~~~~
モーダルダイアログ作成はDialogBox関数を使います
作成後、作成元(ダイアログA)は『待ち』になっています。
モーダル。つまり<strong>『ダイアログBが存在する間はダイアログAはアクティブにならない』<strong>ので
DialogBox関数終わった後が『アクティブになった』事になります。
(正確には『1度、アクティブメッセージをWindowsが処理した後)
>Nao@NSoft殿
いえいえ、指摘されて『もう一度考え直してみる』事で 上記の誤り に気付きました。
逆に感謝です^^
別件になりますが、Nao@NSoft殿 の do.doModal() の場合
『ボタンを1つ押すごとにダイアログが閉じる』みたいですが…(in MSDN)
これ以外のモーダル処理はMFCには存在しないんでしょうか?
『ボタンを押しても閉じない(閉じる設定を任意にする)』
#WindowsSDK DialobBox関数に対応する『EndDialog関数』のような……
Nao@NSoftです。
>別件になりますが、Nao@NSoft殿 の do.doModal() の場合
>『ボタンを1つ押すごとにダイアログが閉じる』みたいですが…(in MSDN)
ん?それは少し勘違いされていると思います。
doModal()のしたのswitch文はdoModal()の戻り値を見ているだけです。
ですから、Chietherさんの言われている『ボタンを1つ押すごとにダイアログが閉じる』とは違うと思いますが。
>これ以外のモーダル処理はMFCには存在しないんでしょうか?
MFCにはあまり詳しくないので良く分かりません。
>『ボタンを押しても閉じない(閉じる設定を任意にする)』
これをやるには、SDKで言えばEndDialogを呼ぶか呼ばないかを制御できれば良いわけですよね。MFCではボタンのクリックメッセージで基底クラスのメソッドを呼ぶか呼ばないかで制御できると思います。
Chietherさん、Nao@NSoftさん、ありがとうございました。
おかげでなんとかなりました。
また、なにかありましたら宜しくお願いします。