ダイアログを開いたら自動で関数を実行したい

[戻る]
嘉月 2007/03/23(金) 11:51:42
VisualStudio2005 VC++ MFC

ダイアログベースでアプリケーションを作成しているのですが、
最初のダイアログが開いたらすぐに起動時チェックを走らせるように
したいと思っています。

イベント等を調べてはみましたが、どうすればよいのか
わかりませんでした。
どのようにすればダイアログが開いた後に自動で関数を
走らせることができるでしょうか。
よろしくお願いします。

Blue 2007/03/23(金) 11:58:48
CXXXDlg::OnInitDialogでなくて?

>起動時チェック
とは?
ほんとに開いてからでよろしいのでしょうか?
開く前にチェックするなら、CXXXApp::InitInstanceになりますけど。

つばさ 2007/03/23(金) 11:59:06
OnInitDialogの最後に呼び出したい関数を呼ぶ
とかじゃダメなのかな?

大体のダイアログの初期処理はそこでできると思いますが・・

嘉月 2007/03/23(金) 12:05:13
>CXXXDlg::OnInitDialogでなくて?

OnInitDialogはダイアログが完全に開いてから動くのでしょうか?

今回のプログラムでは何個かチェック項目があり、
ユーザに今何のチェックを行っているか見せたいので、
ダイアログが完全に開いてからチェックを行いたいのです。

Blue 2007/03/23(金) 12:29:25
では、WM_ACTIVEをハンドリングしたOnActivateではどうでしょうか?
フラグか何かを使って初回だけ処理するようにすればいいでしょう。

とも 2007/03/23(金) 13:28:59
>ダイアログが完全に開いてから
ダイアログが表示された事を検出したいなら、OnWindowPosChangedで
WINDOWPOSのflagsにSWP_SHOWWINDOWが立った事を調べれば検出できます。
ただしそこでどのような処理をするか自分は知らないので、嘉月さんの
行いたい処理がそのタイミングで適切かどうかは分かりませんけど。

嘉月 2007/03/23(金) 13:29:40
>では、WM_ACTIVEをハンドリングしたOnActivateではどうでしょうか?
>フラグか何かを使って初回だけ処理するようにすればいいでしょう。

グローバル変数でフラグを作成し、
CXXXDlg::OnActivateにてメッセージボックスを出すようにして
試してみましたが、ダイアログボックスが表示されるより前に
OnActivateを通っているようで、メッセージボックスが変に
表示されるだけでした。

tetrapod 2007/03/23(金) 13:40:17
俺なら
GUI スレッドが停まってしまわないようにワーカースレッドを使う
OnInitDialog でスレッド作成 (停止状態)
最初の OnIdle でスレッド再開 (というか実行)
とするかな。
チェック中にキャンセル等のボタンが押された場合の挙動を考察しておくべし。

OnTimer でやっちゃうという手抜き系荒業もありかもしれない。

つばさ 2007/03/23(金) 13:40:34
では 姑息な手をひとつ・・

OnInitDialogの最後でスレッドをひとつ立ち上げます

そしてそのスレッドから呼び出したい関数を呼ぶ またはスレッドでやりたい処理を行う

もしタイミングが微妙であれば スレッドの最初に少しSleepでも入れれば

画面表示がきちんと終わってから処理が走ると思います

あまりいい手とは思いませんけどね;

嘉月 2007/03/23(金) 13:58:02
[[解決]]
>ダイアログが表示された事を検出したいなら、OnWindowPosChangedで
>WINDOWPOSのflagsにSWP_SHOWWINDOWが立った事を調べれば検出できます。

力技になりますが、フラグを数えて特定回数のみ処理をすることで
ほぼ望んだ動作をするようになりました。

>GUI スレッドが停まってしまわないようにワーカースレッドを使う
>OnInitDialog でスレッド作成 (停止状態)
>最初の OnIdle でスレッド再開 (というか実行)
>とするかな。

>OnInitDialogの最後でスレッドをひとつ立ち上げます
>そしてそのスレッドから呼び出したい関数を呼ぶ またはスレッドでやりたい処理を行>もしタイミングが微妙であれば スレッドの最初に少しSleepでも入れれば
>画面表示がきちんと終わってから処理が走ると思います

スレッド処理ですか。
スレッドはまだ使ったことがないので、調べて挑戦したいと思います。
きっと他の部分でも有効でしょうし。

質問に答えてくださった皆さん
お付き合いいただきありがとうございました。

古いスレッドには追加発言できません。