- ベストアンサー
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使用率が跳ね上がるのは何故でしょうか。 まだ勉強したてでレベルの低い質問でしたらすみません。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
メッセージは無視してはいけません 自分で処理する以外のメッセージはシステム側にやらせます return (DefWindowProc(hWnd, msg, wp, lp)); そのためウィンドウの移動や、最大、最小が何もしなくても処理されます WM_PAINTを無視したことによりずーっとメッセージが飛び続けます Spy++を使ってメッセージを勉強するのをお勧めします
その他の回答 (2)
- php504
- ベストアンサー率42% (926/2160)
return (DefWindowProc(hWnd, msg, wp, lp)); はswitch{ }の外でreturn 0L;と入れ替えたらどうでしょう。 処理してないメッセージはbreak;でDefWindowProcに渡してメッセージを自分で処理した時はbreak;ではなくreturn 1;で抜けるようにしたらいいと思います。
- Wr5
- ベストアンサー率53% (2173/4061)
既に回答ついている通り…ですが… 処理しないメッセージを無視するのはかまいません。 デフォルトの動作さえしないだけですから。 ただ、OSからのメッセージで無視してはうまく動作できないメッセージがいくつかあります。 今回のWM_PAINTもその1つです。 OSから再描画が必要ということでその再描画をすべき場所(無効領域という)が渡されます。 WM_PAINT内でこの無効領域を処理して(処理しなくてもいいけど)、処理済みとしないと、 OS側で再度無効領域の再描画の為にWM_PAINTが呼ばれます。 今回の場合、無効領域に対して何もしていないためWM_PAINTが延々と呼ばれCPU使用率が上がった。 ということになります。 # せめてBeginPaint()とEndPaint()をコールしていれば…
お礼
回答ありがとうございます。 つまりSDKでは使用するメッセージは必ず何らかの処理をすべきであり、私の例のようにあらかじめメッセージを用意しておくのはまずいやり方という解釈でよろしいでしょうか。 Spy++を使ってちょっといじくってみますね。