ダイアログを開いたら自動で関数を実行したい – プログラミング – Home

ダイアログを開いたら自動で関数を実行し...
 
通知
すべてクリア

[解決済] ダイアログを開いたら自動で関数を実行したい


嘉月
 嘉月
(@嘉月)
ゲスト
結合: 18年前
投稿: 4
Topic starter  

VisualStudio2005 VC++ MFC

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

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


引用未解決
トピックタグ
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

CXXXDlg::OnInitDialogでなくて?

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


返信引用
つばさ
 つばさ
(@つばさ)
ゲスト
結合: 23年前
投稿: 16
 

OnInitDialogの最後に呼び出したい関数を呼ぶ
とかじゃダメなのかな?

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


返信引用
嘉月
 嘉月
(@嘉月)
ゲスト
結合: 18年前
投稿: 4
Topic starter  

>CXXXDlg::OnInitDialogでなくて?

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

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


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

では、WM_ACTIVEをハンドリングしたOnActivateではどうでしょうか?
フラグか何かを使って初回だけ処理するようにすればいいでしょう。


返信引用
とも
 とも
(@とも)
ゲスト
結合: 23年前
投稿: 65
 

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


返信引用
嘉月
 嘉月
(@嘉月)
ゲスト
結合: 18年前
投稿: 4
Topic starter  

>では、WM_ACTIVEをハンドリングしたOnActivateではどうでしょうか?
>フラグか何かを使って初回だけ処理するようにすればいいでしょう。

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


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

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

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


返信引用
つばさ
 つばさ
(@つばさ)
ゲスト
結合: 23年前
投稿: 16
 

では 姑息な手をひとつ・・

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

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

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

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

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


返信引用
嘉月
 嘉月
(@嘉月)
ゲスト
結合: 18年前
投稿: 4
Topic starter  

>ダイアログが表示された事を検出したいなら、OnWindowPosChangedで
>WINDOWPOSのflagsにSWP_SHOWWINDOWが立った事を調べれば検出できます。

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

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

>OnInitDialogの最後でスレッドをひとつ立ち上げます
>そしてそのスレッドから呼び出したい関数を呼ぶ またはスレッドでやりたい処理を行

>もしタイミングが微妙であれば スレッドの最初に少しSleepでも入れれば
>画面表示がきちんと終わってから処理が走ると思います

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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