• ベストアンサー

WM_PAINT

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()もつかっていないのですが。 いつシステムから送られるかご教授をお願いします。

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

  • ベストアンサー
  • ninigi
  • ベストアンサー率43% (10/23)
回答No.2

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

noname#168725
質問者

お礼

どうも!回答ありがとうございます。 MSDNに スタイルに WS_VISIBLE を指定した場合は、さらに、ウィンドウのアクティブ化と表示に必要となるすべてのメッセージをウィンドウに送ります。 とありました。 もしかしたらこのことを指してるのかもしれませんね。 何で詳しく書いてないんだろ(><) サンキューです。

その他の回答 (2)

noname#50176
noname#50176
回答No.3

WM_PAINTメッセージは、 1.自ウインドウのクライアント領域が可視化された時 >これは初めて表示する時や非表示から表示状態になった時です。 2.自ウインドウが能動的(自己処理として)に描画状態を変えた時 >これは最小化や最大化、移動などで“自スレッド管轄”で 自身スレッドにメッセージが送られます。 3.自ウインドウが他動的(別ウインドウによって)に自クライアント 領域に状態変化影響した時 >これは他のウインドウがアクティブである時、そのウインドウが 一方的に自ウインドウクライアント領域部分を隠した時で 再び自ウインドウがアクティブになった際、 影響を与えた他スレッド管轄から再描画メッセージが送られます。 この定義だったと思います。

noname#168725
質問者

お礼

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

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

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

noname#168725
質問者

お礼

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

関連するQ&A