ページ 1 / 1
Win32 APIのWM_PAINTが発行されるのはどんなとき??
Posted: 2016年6月05日(日) 21:04
by notebook
ウインドプロシージャにcase WM_PAINT:
hdc = GetDC(hwnd);
TextOut(hdc , 10 , 10 , lptStr , lstrlen(lptStr));
ReleaseDC(hwnd , hdc);
return 0;
をかいただけで
プログラムを実行したら普通に文字列が描画されました
ボタンを押したときなどのイベントではなく勝手にWM_PAINTが発行されたのでなぜナノかなと思っています。
何故なんでしょうか?
Re: Win32 APIのWM_PAINTが発行されるのはどんなとき??
Posted: 2016年6月06日(月) 02:06
by YuO
notebook さんが書きました:ボタンを押したときなどのイベントではなく勝手にWM_PAINTが発行されたのでなぜナノかなと思っています。
see)
When to Draw in a Window (Windows)
ボタンを押してもWM_PAINTは発生しませんが,初回のウィンドウ表示時などの時は必ずWM_PAINTが発生します。
なお,WM_PAINTの応答ハンドラでは,HDCを取得するために通常GetDCではなくBeginPaintを使います。
BeginPaintの場合,InvalidateRectやValidateRectによって,最終的に「無効化された」となっている領域だけを描画できます。
逆に,無効化されていない領域への描画は無視されます。
オフトピック
MSDNではBeginPaint使う,とは書いてあるものの,GetDC使うなと書いてはなかった
Re: Win32 APIのWM_PAINTが発行されるのはどんなとき??
Posted: 2016年6月06日(月) 10:12
by notebook
YuOさんご親切にありがとうございます。
hdc = GetDC(hwnd);
TextOut(hdc , 10 , 10 , lptStr , lstrlen(lptStr));
ReleaseDC(hwnd , hdc);
return 0;
だと画面外に移動しても消えないってことは
GetDC(hwnd)もBeginPaintも再描画関数って事でいいですか?
でもGetDCを使った場合キューにメッセージが送られ続けることになるそうですが
これが原因でメモリリークとか生じたりするんでしょうか?
動いてしまうがゆえに何も知らないと内部で大変なことが生じてると思ったら怖いですね…