ウインド表示直後に処理

久々に SDK チップスネタでも書こう。

WM_SHOW を捕まえて処理するとウインド表示に時間が掛かる場合がある。
このイベント処理が終わった後でないと実際の描写が行われないからだ。

だから表示された直後に作成や描写を行えば見た目の起動速度が向上する。
しかしそんな都合のよいメッセージは飛んでこない。

が、実はデルヒャァにはある。

procedure CMShowingChanged(var Message:TMessage);message CM_SHOWINGCHANGED;

をフォームの private に定義してハンドラを書くだけ…
但し表示状態が変わる毎に飛んでくるので一番最初に捕まえた時以外は弾くこと。
Y901 はそのツマラン方法で見た目の起動時間を短縮するセコイことをやっていた。

はて、CM_SHOWINGCHANGED なんて無い VC++ ではどうすんだ?
で考えた、PostMessage を使ってまえ!

SendMessage は処理が終わるまで制御を戻してくれない。
PostMessage はキューにメッセージを放り込んで即制御を戻す。
だから WM_SHOW 処理の一番最後で適当なメッセージを投げればよい。

#define WM_SHOWEND (WM_APP + 3)

とか定義しておいて WM_SHOW 処理の一番最後に

PostMessage(hWnd, WM_SHOWEND, 0L, 0L);

とすればキューに自分宛の WM_SHOWEND がセットされる。
キューって何?な人は Windows をもっと勉強してください。
後は WndProc で普通に

case WM_SHOWEND:

を処理、これで見た目の起動時間が早いアプリのできあがり!
詳しくは Cinema のソースコードで、オープンソースは楽だ。

フォーム表示直後に実行されるメソッド OnShowed を作る – Sakura scope

他にも同じコトを考える人がいるのね。
ビルダァ(名古屋弁化できん…)には CM_SHOWINGCHANGED は無いのかな?
でも WM_USER を使うのは止めておいたほうがいいみたいよ

WM_APPの薦め。

それより Windows SuperFetch がある Vista ではあまり意味が無い…