投稿者 るきお  (社会人) 投稿日時 2008/11/24 02:37:55
解決してよかったです。

Invalidateはご指摘のように本来は「無効にする」メソッドです。
Windowsは無効化された領域に対して再描画を行う習性があるので、
無効化することで再描画されるという仕組みです。
(WindowsXPでウィンドウを2つ重ねて、前にあるウィンドウをずらすと、
後ろにあるウィンドウの裏に隠れていた部分(を表す領域)がInvalidateされます。
そこで、すかさずWindowsはこの領域を再描画し、ユーザーからは
裏に隠れていた部分が表に出てきたように見えるわけです。)

ですので、再描画が必要ない領域まで無効化すると、
Windowsは必要ない部分までもう一度描画するのでその分パワーを使います。
もし、再描画が必要な範囲をもっとせまく限定できるのならば
Invalidateメソッドの引数にその限定された領域を指定することでパフォーマンス等向上します。

本当はInvlidateメソッドは単に無効化するだけで、再描画をするメソッドはUpdateです。
MSDNを見ると強制再描画を行うにはInvalidate後にUpdateせよという趣旨のことが書いてあるので、
Invalidateの下にUpdateも入れておいた方がいいのかもしれません。

ちょっと長く書きすぎました。このようにWindowsの描画に関する仕組みが.NETをやっていてもかかわっきます。このあたりはC++だろうが、機械語だろうがWindows上で動いていれば事情は同じですので理解しておけば今後も役に立つと思います。