こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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使用率が跳ね上がるのは何故でしょうか。

まだ勉強したてでレベルの低い質問でしたらすみません。

投稿日時 - 2009-02-23 21:24:18

QNo.4743419

暇なときに回答ください

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

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

投稿日時 - 2009-02-23 21:28:33

お礼

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

投稿日時 - 2009-02-23 21:38:39

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

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

投稿日時 - 2009-02-24 07:54:13

ANo.2

Wr5

既に回答ついている通り…ですが…
処理しないメッセージを無視するのはかまいません。
デフォルトの動作さえしないだけですから。

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

投稿日時 - 2009-02-24 00:54:58