• ベストアンサー

WindowsSDKのCALLBACK内について

猫でも分かるWindowsSDKを参考にして、とりあえずウィンドウプロシージャの関数内を下のようにしてプログラムを組んでみました。 //ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { switch (msg) { case WM_CREATE: break; case WM_TIMER: break; case WM_PAINT: break; case WM_COMMAND: break; case WM_CLOSE: SendMessage(hWnd, WM_DESTROY, wp, lp); break; case WM_DESTROY: PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } return 0L; } しかし、これで何もないWindow表示をさせるとCPU使用率が80%くらいまで跳ね上がります。 調べてみたところcase WM_PAINT:を削ったらCPU使用率が下がりました。 普通にクライアント領域に文字を表示したり画像を表示したりするだけだったら、それほどCPU使用率が上がらないのに、上のようにあらかじめ用意しておいたらCPU使用率が跳ね上がるのは何故でしょうか。 まだ勉強したてでレベルの低い質問でしたらすみません。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

メッセージは無視してはいけません 自分で処理する以外のメッセージはシステム側にやらせます return (DefWindowProc(hWnd, msg, wp, lp)); そのためウィンドウの移動や、最大、最小が何もしなくても処理されます WM_PAINTを無視したことによりずーっとメッセージが飛び続けます Spy++を使ってメッセージを勉強するのをお勧めします

zensin12
質問者

お礼

回答ありがとうございます。 つまりSDKでは使用するメッセージは必ず何らかの処理をすべきであり、私の例のようにあらかじめメッセージを用意しておくのはまずいやり方という解釈でよろしいでしょうか。 Spy++を使ってちょっといじくってみますね。

その他の回答 (2)

  • php504
  • ベストアンサー率42% (926/2160)
回答No.3

return (DefWindowProc(hWnd, msg, wp, lp)); はswitch{ }の外でreturn 0L;と入れ替えたらどうでしょう。 処理してないメッセージはbreak;でDefWindowProcに渡してメッセージを自分で処理した時はbreak;ではなくreturn 1;で抜けるようにしたらいいと思います。

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.2

既に回答ついている通り…ですが… 処理しないメッセージを無視するのはかまいません。 デフォルトの動作さえしないだけですから。 ただ、OSからのメッセージで無視してはうまく動作できないメッセージがいくつかあります。 今回のWM_PAINTもその1つです。 OSから再描画が必要ということでその再描画をすべき場所(無効領域という)が渡されます。 WM_PAINT内でこの無効領域を処理して(処理しなくてもいいけど)、処理済みとしないと、 OS側で再度無効領域の再描画の為にWM_PAINTが呼ばれます。 今回の場合、無効領域に対して何もしていないためWM_PAINTが延々と呼ばれCPU使用率が上がった。 ということになります。 # せめてBeginPaint()とEndPaint()をコールしていれば…

関連するQ&A

専門家に質問してみよう