- ベストアンサー
ウインドウの遷移コードについて
- ウインドウの遷移において、MFCのCDialogを使用する場合はDoModal関数を使い、ボタンが押されるまで処理が止まります。
- 一方、通常のWindowSDKプログラミングでは、メッセージループを使用してウインドウの遷移を制御します。
- 具体的なコーディング方法は、ウインドウを表示し、メッセージループを開始してウインドウが閉じられるまで待機し、次のウインドウを表示する、という手順で行います。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
メッセージループの場所が変わっても何の問題もありません。 例えアプリケーション内で1ヶ所にまとめてあったとしても、ダイアログやメッセージボックスを出すたびにWindowsが内部的に持つメッセージループが実行されるので同じことです。
その他の回答 (2)
- xcrOSgS2wY
- ベストアンサー率50% (1006/1985)
リソースファイルを使わないとなると、やり方は2種類しかありません。 1つはCreateWindows等でウィンドウを自前で作成し、その中にコントロールも自前で配置する方法。メッセージループは自分で作成する必要があります。と言っても、大変なのはメッセージループではなくコントロールの自前配置の部分だと思いますが。 もう1つは「ダイアログリソース」互換のバイナリデータ(ダイアログテンプレート)をメモリ上に用意しておいて、CreateDialogIndirectを使う方法です。こちらは通常のダイアログボックス相当なので、メッセージループを自分で書く必要はありません。
お礼
いつもご回答頂き、大変助かります。 CreateDialogIndirectというAPIははじめてききました。そういう方法もあるのですね。 ただ今回はCreateWindowを使って 自分でコントロールも配置していく方針で行こうと思います。 有難うございました。
補足
ところでWinMainの中で // Window1表示 CreateWindow(... ShowWindow(... UpdateWindow( while( メッセージループ ) // Window2表示 CreateWindow(... ShowWindow(... UpdateWindow( while( メッセージループ ) ・ ・ ・ return 0; とするのは邪道でしょうか?
- xcrOSgS2wY
- ベストアンサー率50% (1006/1985)
MFCでCDialog::DoModal()を使用するというのであれば、SDKではCreateDialog系を使ってダイアログを作成するのがちょうどよいでしょう。 その場合、メッセージループはWindowsのシステム内にあるので、自前でメッセージループを作成する必要はありません。 ちなみに、数行のメッセージ+Yes/No程度の選択肢でよいのであれば、さらに規模を小さくしてMessageBoxを使うということも考えられます。MessageBoxの場合はメッセージループだけでなくメッセージ処理もWindowsのシステム内にあるので、ダイアログ表示中の処理は何も書く必要がありません。
お礼
ご回答有難うございます。 ちょっといい忘れてしまいましたが 出来ればリソースファイルが必要なダイアログは 避けたいのです。 メッセージボックスのようなウインドウを CreateWindowで作成する事はできないでしょうか?
お礼
とても参考になりました。 ご回答有難うございました。