WM_XXXXXXメッセージについて

解決


cocomo  2004-12-06 20:58:04  No: 55480

こんにちわ。

早速質問なんですが
画面が表示されたあとに送られてくるWM_XXXXXXXXX
というメッセージはあるでしょうか?
アプリを起動し画面が表示されたらある関数を
走らせるようにしたいと思っています。
こういうときは、ダイアログのOnInitDialogあたりで
スレッドを使うものなのでしょうか?

Windows2000 SP3
VC++.NET 2003を使っています。


REE  2004-12-07 01:00:11  No: 55481

WM_SHOWWINDOWのことでしょうか?


cocomo  2004-12-07 06:47:24  No: 55482

REEさんありがとうございます。
WM_SHOWWINDOWだとダイアログが表示される前に
呼ばれてしまいます。
ダイアログが表示されたあとに1回だけ関数を
呼び出したいのです。

書くのを忘れましたが
開発はMFCのダイアログベースで行っています。


Anonymous Coward  2004-12-08 00:11:10  No: 55483

内部でフラグをもっておいて、WM_SHOWWINDOWがきたらフラグを
チェックして、1回目だったら実行、2回目以降は無視するって
すればいいんじゃないですか?
こんな感じで

case WM_SHOWWINDOW:
{
  static bool first = true;
  if( first ) {
     // なんかの処理
     first = false;
  }
}


cocomo  2004-12-08 23:05:21  No: 55484

Anonymous Cowardさんありがとうございます。
WM_SHOWWINDOWだと画面が表示される前に呼ばれてしまいます。
画面が表示されたあとに関数を呼んで
画面をデバックやテスト用に使おうと考えてます。
関数は基本的に無限ループですっと動いたままです。


みい  2004-12-08 23:36:25  No: 55485

あまり難しく考えずに、完全に表示された後にしたいのなら
OnInitDialogでSetTimer、OnTimerイベント内でKillTimerして
スレッド起動でよいのでは?
OnInitDialog後に表示されるはずなので。


なーめ  2004-12-09 00:17:50  No: 55486

>> あまり難しく考えずに、完全に表示された後にしたいのなら
>> OnInitDialogでSetTimer、OnTimerイベント内でKillTimerして
>> スレッド起動でよいのでは?
>> OnInitDialog後に表示されるはずなので。
そんな大げさな。
自分自身に PostMessage() で十分。
そもそも、
OnInitDialog() の return TRUE; の前では
都合が悪かった?


みい  2004-12-09 00:33:57  No: 55487

「表示されたあとに」という文章があったので、
OnInitDialog() の return TRUE;前だとまだ画面が
描画されていない状態だから呼び出す関数の始めが
画面上でトレースできないかもね…とちょっと
うがった見方しちゃいました。ごめんなさい。


なーめ  2004-12-09 03:08:54  No: 55488

>みいさん
CDialog::OnInitDialog();
を呼び出した後なら、
UpdateData(FALSE);
も効くんですよ。
ためしに ShowWindow(SW_SHOW);
を発行してみてください。

ShowWindow(SW_SHOW);
UpdateData(FALSE);
MessageBox("へい!お待ち!", "MESSAGE", MB_ICONINFORMATION );
ShowWindow(SW_HIDE); // これを抜くと中央に移動されない。
return TRUE;
(Win2K,VC++6.0)

// VC++7.0(.NET)や他のOSで動作が違っていたら教えてね。


みい  2004-12-09 05:18:28  No: 55489

> CDialog::OnInitDialog();
> を呼び出した後なら、
> UpdateData(FALSE);
> も効くんですよ。
これは知ってますけどOnInitDialogの中でShowWindow(SW_SHOW)
するとダイアログが左上に表示されるので、
自分の場合はMoveWindowとかでわざわざ表示位置変える処理を
書くのが嫌でタイマーを使って手抜きしてます。
それと、人に見てもらう時に画面が表示された後に
「ここの値を見ていて下さい」と指示する余裕をもつため
だけのごく私的な理由です。


RAPT  2004-12-09 11:43:08  No: 55490

>中央に移動
# CenterWindow()じゃだめなのかなぁ。


なーめ  2004-12-09 16:28:39  No: 55491

>> これは知ってますけど
失礼した。(^^;;
私はちょいもののダイアログ系ツールアプリが結構あるので、
左上とか中央とかいった固定位置に出現すると結構じゃまになります。
そこで、前回使用した位置を復元しています。
CPoint m_pt; // class member
CWinApp & ap = *AfxGetApp();
m_pt.x = ap.GetProfileInt("APPWND","X",0 );
m_pt.y = ap.GetProfileInt("APPWND","Y",0 );
SetWindowPos( NULL,m_pt.x,m_pt.y,0,0,SWP_NOMOVE|SWP_NOZORDER );
最初の NULL のかわりに
m_bTopMost = ap.GeProfileInt("APPWND","TOPMOST",0 );
m_bTopMost ? &wndTopMost : &wndNoTopMost
も通常やっています。
位置の保存は
OnMove() で保持した m_pt を
CDialogのデストラクタなどで、レジストリか iniファイルに格納します。


cocomo  2004-12-10 01:42:28  No: 55492

REEさん、Anonymous Cowardさん、みいさん
なーめさん、RAPTさんありがとうございます。

>OnInitDialog() の return TRUE; の前では
>都合が悪かった?

return TRUE;の前だと画面が表示(描画)されないので
都合が悪かったですね。

>CDialog::OnInitDialog();
>を呼び出した後なら、
>UpdateData(FALSE);
>も効くんですよ。
>ためしに ShowWindow(SW_SHOW);
>を発行してみてください。

知りませんでした。

>あまり難しく考えずに、完全に表示された後にしたいのなら
>OnInitDialogでSetTimer、OnTimerイベント内でKillTimerして
>スレッド起動でよいのでは?

そうですで簡単に考えればよかったですね。
今回はタイマーイベントを使ってデバッグすることが出来ました。
みなさんありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加