コントロールサイズのリサイズ その2 | August 4, 2008 8:27 PM _ prgramming
前の記事で描画時にゴミが残るーとか言ってたわけだけど、
そもそもWM_SIZEを捕まえる必要がないという……
The So-Software Studio のWTL/ATLコンテンツのPart3ダイアログリサイズにリサイズマップを使ったコントロールのリサイズ方法が載ってます。
WTL/ATLはもっぱらここを読んで勉強してるわけだけどちゃんと読もうぜ俺。
悔しいので何でゴミが残らないのかなーと思ってちょっと追ってみた。
CDialogResizeのWM_SIZEハンドラで処理しているらしい。
んで、自分のくんだハンドラとの違いはまず処理始めに
BOOL bVisible = pT->IsWindowVisible();
if(bVisible) pT->SetRedraw(FALSE);
としてやって表示されてたら一時的に再描画を切って、最後に
if(bVisible) pT->SetRedraw(TRUE);
pT->RedrawWindow(NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_UPDATENOW | RDW_ALLCHILDREN);
としてやって再描画をオンにして再描画メソッドを投げると。
再描画を切るのはまぁ良いとして多分最後のRedrawWindow()に渡している引数がポイントの模様。
MSDNを見ると
■DW_ERASE
ウィンドウの再描画時に、ウィンドウが WM_ERASEBKGND メッセージを受け取ります。RDW_INVALIDATE フラグも同時に指定しなければなりません。RDW_INVALIDATE フラグを指定しないと、RDW_ERASE フラグは効果がありません。
■RDW_INVALIDATE
lprcUpdate または hrgnUpdate パラメータで指定した領域を無効化します(NULL 以外の値を指定できるのはどちらか一方だけです)。両方とも NULL の場合、クライアント領域全体が無効化されます。
となっていて、自分のはWM_ERASEBKGNDを投げるだけだったので、きちんと消去されていなかったらしい。
一度領域を無効化しないと消されないという解釈でいいのかな。
とまぁそう言うことらしい。
若干もやもやが残るけどこれ以上追求してる余裕もないので分かったつもりになっておく。
Σ(・×・)