Win32プログラムのコア

前回ではウィンドウを作ってみました。そして解説もしましたが、今回はその続きでウィンドウプロシージャを解説します。 ウィンドウプロシージャはWin32プログラムのコア、心臓部で一番重要と言い切れる部分です。 なぜならWindowsから来るメッセージは全てここで処理されるからです。


///// ウィンドウプロシージャ LRESULT CALLBACK WindowProc(HWND hwnd,UINT msg,WPARAM wp,LPARAM lp) { switch(msg) { case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd,msg,wp,lp); } return 0; } ///// End of Source

Windowsから来たメッセージは前回説明したメッセージループで解析されてウィンドウプロシージャに送られてきます。 送られてきたメッセージは普通switchによって分配され、それぞれの所で処理されるようにします。 前回の例では、WM_DESTROYメッセージに対する処理のみが書かれ、他のメッセージはDefWindowProc関数に全て任せています。

DefWindowProc関数は、アプリケーションが処理しないメッセージに対してデフォルトの処理をします。 これを消すと予期しない動作が起きます。試しに消してみると、上の例の場合は実行してもウィンドウさえ表示されずに終了してしまいます。 default部分には必ずDefWindowProc関数を使っておきましょう。

ではメッセージですが、いったいどういう種類があって、どんな意味があるんでしょう。 実はメッセージは嫌になるくらい大量にあります。ウィンドウに対するメッセージや、エディタ専用メッセージ、自分で定義できちゃうメッセージや、 NOTIFYという親ウィンドウへ通知されるメッセージ等々、ものすごい数があります。 Win32プログラムのメインの部分だけはありますね。実際どれくらいあるのか正確な数は知りませんが、WM系だけで250以上はあったと思います。 もちろんこれを全て覚えて使うわけはありません。実際に必要な部分は少ししかありませんので安心してくださいね。ではつかえそうなのをリストにしてみます。

WM系メッセージ主なもの
WM_CREATE ウィンドウが作成される前に呼ばれます。
WM_CLOSE ウィンドウが閉じられる前に呼ばれます。
WM_DESTROYウィンドウが閉じた後に呼ばれます。
WM_QUIT これを送るとメッセージループ終了です。
WM_SIZE ウィンドウサイズが変更されるとでます。
WM_MOVE ウィンドウを移動すると出ます。
WM_PAINTウィンドウを再描画をして欲しいときによばれます。
WM_COMMAND メニューなどのコマンドはここへ来ます。
WM_NOTIFY コモンコントロールから親ウィンドウへ送られます。
WM_PARENTNOTIFY子ウィンドウへの動作が親ウィンドウへ送られます。
WM_INITMENUメニューが出る寸前に呼ばれます。
WM_SETFOCUSウィンドウにフォーカスが移るとでます。
WM_LBUTTONDOWN 左ボタンを押したとき。
WM_LBUTTONUP 左ボタンをあげたとき。
WM_LBUTTONDBLCLK左ボタンダブルクリック。ダブルクリックを検知するには、
ウィンドウクラスのスタイルをwcx.style=CS_DBLCLKS;の用にします。
WM_MOUSEMOVE マウスを移動したとき。
WM_CHAR TranslateMessageで変換された文字メッセージです。
WM_KEYDOWNキーボード押すとでます。
WM_KEYUP キーボード押した後にあげるときに出ます。
WM_TIMERタイマーをセットすると、指定した間隔で呼ばれます。
WM_USER ユーザー定義用のメッセージ。空です。
ここから先はユーザーが自由に使えるという意味で、WM_USER+1というような感じでつかう。

さて、たくさんありますが、一つ一つ使い方を覚えていけばOKです。ここでは上の4個のメッセージを説明します。

WM_CREATEメッセージは、ウィンドウを作る前に呼び出されます。なのでここでいろいろな変数などの初期化処理をするにはもってこいです。

WM_CLOSEメッセージは、ウィンドウを破棄する前に呼び出されます。具体的には右上の×ボタンを押すなどで出ます。 ここで前のメッセージボックスのYESNO判定を利用して、「終了しますか?」という感じにいきなり終了せずに確認を取ることが可能になるわけです。

WM_DESTROYメッセージは、ウィンドウが破棄された後に呼ばれます。ここではWM_CREATEとは反対に後処理をするにはもってこいです。 また、ウィンドウの終了==アプリケーションの終了という形(ほとんどこうですね)なら、ここでWM_QUITメッセージを送信してメッセージループから抜け出させる必要があります。

WM_QUITメッセージは、PostQuitMessage関数が呼び出されると発生し、メッセージループから抜け出してアプリケーションが終了します。 なのでPostQuitMessage関数が呼び出されないと、ウィンドウが無くなってもアプリケーションが終了しなくなるので注意してください。 普通はWM_DESTROYメッセージでPostQuitMessage関数を呼び出します。

さて、今回はこれくらいで終わりです。ソースファイルも用意してみました。 メッセージによってSetWindowTextを使ってタイトルを変えてみたり、メッセージボックスを呼び出したりしています。

DownLoad!ソースファイルをDownLoad!

では次回は何をしようか考えている最中なので何が出来るかはわかりません。 たぶんリソース系にいくと思うのでリソースエディタを磨いていてくださいね(謎)。 ではっr(ээ)。


★INDEX★

Copyright(C) へぽぽ