環境:VS2012、MFC
ダイアログをDoModalで連続して表示させると、
一つ目を表示後、一瞬画面から消えて次の画面が表示されます。
CDlgAAA aaa;
CDlgBBB bbb;
aaa.DoModal();
bbb.DoModal();
これを、画面が消えずに連続して表示したい場合どのようにすれば良いのでしょうか?
初歩的な質問かと思いますが、ご教授宜しくお願いいたします。
「できません」が基本的な回答となります。
DoModal()とはアプリケーション全体を停止して、
DLGのみ有効にする操作ですね。
再びメインのアプリケーションを有効にするためには、
DoModal()したDLGが消えてくれなければなりません。
前のDLGが「消えて」、有効になったメインアプリケーションは、
次のDLG2のDoModal()を実行できる・・・という順番になるわけです。
この動作はWindowsの原理上、不可避です。
さて、この様なことをやらなければならなくなった、
「原因」又は、この仕様の「目的」などを
説明してみると、別の解決方法が提示できるかもしれません。
目的は、複数の画面を連続して表示したい
インストーラーのようなものを作成したいのです。
巷でよくあるインストーラーのように、画面が消えないまま
次の画面へ遷移するようにしたいのですが、難しいのでしょうか?
一つの画面で行えばよいだけの様な気がします。
残念ながら、むしろそれができない理由がわかりません。
一般に、状態の遷移をDLGの画面切り替えで表現する場合、
ないし、複数のオプション画面を同一DLG内で切り替えたい場合は、
親となるモーダルDLGの中に、複数の子DLGを作成し、
これらの表示、非表示を切り替えることによって表現します。
この様な最も基本的な手法以外にも色々な方法が考えられます。
あたりまえですが、これらの子DLGはWS_CHILDのモードレスDLGとなります。
>巷でよくあるインストーラーのように、画面が消えないまま
>次の画面へ遷移するようにしたいのですが、難しいのでしょうか?
ウィザード形式ですかね?
プロパティシートなどで作成するようですが。
http://mail2.nara-edu.ac.jp/~asait/visual_cpp/property/property.htm
APIでやるなら…お約束の「猫でも~」から。
http://www.kumei.ne.jp/c_lang/sdk3/sdk_212.htm
インストーラ作るなら、VSのセットアッププロジェクトでmsiを作るとかの方法もあると
思いますよ。
# 私はInnoSetupで処理しましたが。(VSはExpressEditionだったし)
VS2012ならinstallSHILDのVisualC限定版を使うのでは?
画面数が決まっているのならMDI使うとか?
皆さんご回答ありがとうございます。
ウィザード形式にしようと思ったのですが、
プロパティシートを使うと不要なボタンや線が表示されてしまうので、
自由度の高い自作のダイアログにしようと考えてました。
とりあえず、一つの画面を表示させたまま
子ダイアログの表示を切り替える方法で試してみます。
また何かあったらご質問させて下さい。