ダイアログを消去する – プログラミング – Home

通知
すべてクリア

[解決済] ダイアログを消去する


hanabi
 hanabi
(@hanabi)
ゲスト
結合: 22年前
投稿: 39
Topic starter  

いつもお世話になっています。
開発環境はwindows2000 VC++6.0 MFC SDI です。

現在  http://www.net24.ne.jp/~kenji/s_swin/swin.html  のページを参考にし、
ダイアログを表示し、ボタンを押すとウインドウを表示するというプログラムを組んでい
ます。
今回、ウインドウを表示すると同時に、ダイアログを消去したいと考えたのですが
どうにもうまくいきません。
EndDialog関数を使用してみたりしたのですが、
それですと作成したウインドウごと消去してしまいます。

また、平行して質問させていただきたいのですが、
上のページのようにして作成したウインドウにViewを持たせることはできるのでしょうか?

稚拙な質問だとは思いますが、よろしくお願いいたします。


引用未解決
トピックタグ
Daisuke
 Daisuke
(@Daisuke)
ゲスト
結合: 22年前
投稿: 11
 

そのプロジェクトの**App.cppを良く眺めてみましょう。
Appがどうやってダイアログを表示させているのかがわかります。
(インスタンスができると何もしないで終了しているんですね。)

また、SDIのプロジェクトを作って同様の部分を見てみると、
SDI画面をどうやって表示しているのかもわかります。

それらと同じ事をやればいいんです。

どちらかというと、SDIプロジェクトのInitInstanceでダイアログを
DoModalさせた方が手っ取り早いですね。


返信引用
hanabi
 hanabi
(@hanabi)
ゲスト
結合: 22年前
投稿: 39
Topic starter  

Daisukeさんありがとうございます。

なるほど。
普段主にViewやDocumentなどしか見ないのでAppでの処理はチェックしていませんでした。
ここでやってるんですね。
もっとくわしく見てみます。


返信引用
Daisuke
 Daisuke
(@Daisuke)
ゲスト
結合: 22年前
投稿: 11
 

SDIでドキュメントビューアーキテクチャのサポートをはずしたスケルトンを作って見ると
わかりやすいかもしれません。
AppのInitInstanceでCMainFrameをnewしてCreateしてShowWindowしている
だけですね。

そしてCMainFrameの中で、View、ToolBar、StatusBarをCreateしています。
(ViewはCViewの派生ではなく、単なるCWnd派生です。)
もしToolBarやStatusBarが要らなければ、メンバにしなければいいだけの話です。
他に必要なものがあれば(例えばCDialogBarとか)、メンバにしてあげればいいん
ですよね。
CMainFrameとCDialogの両方を切り替えて使いたいのでしたら、
両方をもCreateして
ShowWindow(SW_SHOW)
ShowWindow(SW_HIDE)
をAppにコントロールさせる(Appに独自の関数を追加する)ことで実現できます。


返信引用
hanabi
 hanabi
(@hanabi)
ゲスト
結合: 22年前
投稿: 39
Topic starter  

返事が遅くなり申し訳ありません。
Daisukeさんアドバイスありがとうございます。
説明がとてもわかりやすく、大変参考になりました。

>CMainFrameとCDialogの両方を切り替えて使いたいのでしたら
というのは、前の方で質問した「ダイアログの消去」の方法なのでしょうか?
ShowWindow(SW_HIDE)はウインドウを非表示にする関数だと書いてありましたが、
消去というのは非表示にするだけでいいのですか?
イメージ的には作ったものはちゃんと消さないと、と考えてしまったので(^_^;

質問ばかりで申し訳ありませんが、よろしくお願いいたします。


返信引用
Daisuke
 Daisuke
(@Daisuke)
ゲスト
結合: 22年前
投稿: 11
 

>イメージ的には作ったものはちゃんと消さないと、と考えてしまったので(^_^;
作ったものはちゃんと消してください。(^^ゞ
(もっともスコープを外れる時にデストラクタで消えるでしょうから消す作業を
明記する必要はありませんが)

後からもう一回このダイアログ出したい、そしてMainFrameはその時隠したい
とかいう場合には...と思ったまでです。


返信引用
Daisuke
 Daisuke
(@Daisuke)
ゲスト
結合: 22年前
投稿: 11
 

ダイアログは一回しか表示しないのであれば、

1.後から表示したいウィンドウのプロジェクトを作る。
2.ダイアログクラスを追加する。
3.AppのInitInstance内の、CMainFrameを作る記述の前で、ダイアログを実体化し、
DoModalする。

で実現できます。つまりダイアログが破棄されて(DoModalが終了して)はじめて、
本来のウィンドウを作る作業が始まるということになります。


返信引用
hanabi
 hanabi
(@hanabi)
ゲスト
結合: 22年前
投稿: 39
Topic starter  

Daisukeさんありがとうございます。

ふと思ったのですが、毎回AppのInitInstance内で処理を追加してますが、
そこ以外のとこに処理を書いても実行できるのでしょうか?

例えばメニューからダイアログを開き、ボタンを押すとウインドウが出る
というプログラムの場合も同じようにAppのInitInstance内に処理を書けばいいのですか?


返信引用
Daisuke
 Daisuke
(@Daisuke)
ゲスト
結合: 22年前
投稿: 11
 

試しにやってみたらいかがですか。
InitInstanceで作るのは、メインのウィンドウだけです。唯一のウィンドウとして
使用される様でしたので、そうしたほうがいいかなと思いました。

モードレスのウィンドウなら任意の場所で出せますよ。(モーダルは自分で実装する必要が
あります。)

但し、hanabiさんの書かれている
>例えばメニューからダイアログを開き、ボタンを押すとウインドウが出る

という場合には、親子関係をきちんと処理しないと思った通りの動きにならないかも
しれません。
親をメインウィンドウの方にするか、ダイアログにするかで、動作が違います。
ダイアログが閉じてもそのウィンドウが閉じてほしくないのでしたら、親をメインウィンドウ
にする必要がありますね。(そしてポインタも保存しておく必要があります。)
親をNULLにするとメインウィンドウと兄弟関係になります。この際の動きもビミョーで
しょうね。
while文でまわしてシステムダウンさせる様なウィルスまがいのプログラムは
くれぐれも作らないように。(^^ゞ


返信引用
hanabi
 hanabi
(@hanabi)
ゲスト
結合: 22年前
投稿: 39
Topic starter  

Daisukeさん、長々とお付き合いいただいてどうもありがとうございました。

今回大変勉強になりました。
ためしにやってみたのですが、まだまだよくわかってないところが多く、
どこがどう処理しているのか理解できてないところが多いですが、
もっと勉強して、理解できるようにがんばっていきます。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました