読者です 読者をやめる 読者になる 読者になる

ウィンドウコンポジション (1)

.NET Vista

まずは Win32 開発の常識テストから行きましょう.別のウィンドウの背後に隠れていたウィンドウが前面に移動すると,WM_PAINT が飛んできて再描画を行う必要がある……とは限りません.
Windows 2000 で導入されたレイヤードウィンドウを使用すると,ウィンドウの隠れていた部分が現われた場合でも WM_PAINT は飛んで来ないのです.
このことは,WinForms でも簡単に確かめられます.Form.Opacity に 1.0 未満の値をセットすると,(対応環境では) Form はレイヤードウィンドウに変化します.このとき OnPaint をオーバーライドするか,Paint イベントをリッスンしておくと,レイヤードウィンドウ化後はウィンドウの隠れていた部分が現われたことによる再描画が発生していないことが分かります.
これは Form 上のコントロールについても同じ意味を持ちます.id:ladybug:20060206#p1 で ladybug さんが書かれているような事情もあって,多数のコントロールを Form に貼り付けたときなどこの違いは意外と馬鹿になりません.