DefWindowProc

これまで何度も登場してきたDefWindowProcについて・・・。

DefWindowProcは、ウィンドウメッセージに対する既定の処理を行うWindowsAPI・・・。

DefWindowProc 関数

引数には、WindowProcで渡されたものをそのまま渡す・・・。
基本的には、WindowProcの中で、独自に定義した処理の後に置くことで、それ以降の処理をOSに任せることができる・・・。
これまで行ってきたWNDCLASSのlpfnWndProcにセットしたりするのは、本来正しい使い方でないのでやってはいけない・・・。

で、これが無かったら一体どうなるのか・・・。ちょっと実験してみよう・・・。

WM_CREATEとそれ以外で、DefWindowProcの戻り値を返すのか0を返すのかで、どう動作が変わるのかをいろいろ試してみる・・・。
パターンは、

でiPatternの値は次のメッセージボックス、

これで選択する・・・。ちょっとめんどいけど・・・。

で戻り値の処理は、

こんな感じ・・・。

で実行してみると、

f:id:BG1:20150309144610p:plain

ここで"はい"を選択すると、Pattern1となる・・・。
"いいえ"なら、

f:id:BG1:20150309144651p:plain

と出て、"はい"ならPattern2・・・。
"いいえ"なら、

f:id:BG1:20150309144725p:plain

ここで"はい"でPattern3、
"いいえ"でPattern4に行く・・・。

でこのあと、Pattern1(WM_CREATE, それ以外, ともにDefWindowProc.)とPattern2(WM_CREATEで0, それ以外でDefWindowProc.)の場合は、

f:id:BG1:20150309145142p:plain

ともにウィンドウが正しく表示されたのに対し、
Pattern3(WM_CREATEでDefWindowProc, それ以外で0.)とPattern4(WM_CREATE, それ以外, ともに0.)の場合は、

f:id:BG1:20150309145554p:plain

ウィンドウが正しく表示されない・・・。(枠とか消えてるし・・・。)

Pattern2については、WM_CREATEでの戻り値が0のとき、ウィンドウの作成に成功という仕様のために、上手くいくだけで、他のメッセージの正しい戻り値が0とは限らない・・・。

実際、WM_CREATEのとき、"return 0;"とする例は多い・・・。
だが、それ以外はDefWindowProcに任せるべきである・・・。
いや、全部DefWindowProcでいいんじゃないかな・・・。

Sample/DefWindowProc.cpp at master · bg1bgst333/Sample · GitHub