プロが教えるわが家の防犯対策術!

WM_PAINT について教えてほしいのですが、

WM_PAINTがシステムから発行されるタイミングとして、

クライアント領域に無効領域がある時
UpdateWindow()を呼び出した時
InvalidateRect()を呼び出した時があると思いますが




例えば

LRESULT CALLBACK WndProc(HWND , UINT , WPARAM , LPARAM) {

LPCTSTR  Str = TEXT("Kitty");

switch (msg) {

case WM_CREATE:
   hdc = GetDC(hwnd);
   SetTextColor(hdc , RGB(255, 0 , 0));
   ReleaseDC(hwnd , hdc);
   return 0;

case WM_PAINT:
   hdc = BeginPaint(hwnd , &ps);
   TextOut(hdc, 10 , 10 , Str, lstrlen(Str));
   EndPaint(hwnd , &ps);
   return 0;
}
return DefWindowProc(hwnd , msg , wp , lp);
}


の場合, WM_PAINTはどのタイミングでシステムから呼び出されるんですか?
WinMain()でUpdateWindow()もInvalidateRect()もつかっていないのですが。

いつシステムから送られるかご教授をお願いします。

A 回答 (3件)

たぶん、作成したウィンドウを最初に表示した時にUpdateWindow等を呼んでないのに何故WM_PAINTが送られてきているのかを知りたいのだと思って回答します。


たしか、
 
・ウィンドウスタイルにWS_VISIBLEを指定している場合は、CreateWindow(Ex)を呼んだ時
・WS_VISIBLEを指定してない場合はShowWindowでウィンドウを表示した時
 
に最初のWM_PAINTが送られて来たと思います。
これは「クライアント領域に無効領域がある時」に該当します。
 
記憶に頼って書いているので、違ってるかもしれません。自分でブレークポイントとかを張ってみて確かめてみて下さい。
 
    • good
    • 0
この回答へのお礼

どうも!回答ありがとうございます。

MSDNに スタイルに WS_VISIBLE を指定した場合は、さらに、ウィンドウのアクティブ化と表示に必要となるすべてのメッセージをウィンドウに送ります。

とありました。
もしかしたらこのことを指してるのかもしれませんね。
何で詳しく書いてないんだろ(><)
サンキューです。

お礼日時:2007/07/04 23:00

WM_PAINTメッセージは、



1.自ウインドウのクライアント領域が可視化された時
>これは初めて表示する時や非表示から表示状態になった時です。

2.自ウインドウが能動的(自己処理として)に描画状態を変えた時
>これは最小化や最大化、移動などで“自スレッド管轄”で
自身スレッドにメッセージが送られます。

3.自ウインドウが他動的(別ウインドウによって)に自クライアント
領域に状態変化影響した時
>これは他のウインドウがアクティブである時、そのウインドウが
一方的に自ウインドウクライアント領域部分を隠した時で
再び自ウインドウがアクティブになった際、
影響を与えた他スレッド管轄から再描画メッセージが送られます。

この定義だったと思います。
    • good
    • 0
この回答へのお礼

どうも!回答ありがとうございます。
ネットいろいろ調べましたがなかなか、これに関する記述が見つからず
助かります。
どうもありがとうございました。

お礼日時:2007/07/04 22:53

★アドバイス


>いつシステムから送られるかご教授をお願いします。
 ↑
 自分で作成したウインドウの上に別のウインドウ(メモ帳など)が覆いかぶさり、
 上に乗っていたウインドウが何処かに移動すると自分で作成したウインドウが
 現れます。このときシステムから無効領域として WM_PAINT メッセージを処理
 するように指示がでます。
・他にも最小化から元に戻すときや、サイズを変更した時にも WM_PAINT を処理
 するようにシステムから指示が出ます。
・とにかく再描画が必要になったときにシステム(OS)より WM_PAINT で描画する
 ように信号が出されるわけですよ。
 だから
>WinMain()でUpdateWindow()もInvalidateRect()もつかっていないのですが。
 ↑
 としなくても WM_PAINT で再描画されます。
・以上。
    • good
    • 0
この回答へのお礼

回答どうありがとうございます!
どうも!
Oh-Orangeさんの回答は他の方の回答でもいつも勉強になります。
できればWM_PAINTが最初に発生するタイミングも教えていただきたかったのですが。
また教えてください。
どうもありがとうございました。

お礼日時:2007/07/04 23:10

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています