投稿者 魔界の仮面弁士  (社会人) 投稿日時 2010/8/6 13:05:38
> C# フォームのOnPaintイベントについて
OnPaint はイベントでは無く、メソッドですね。
(Paint イベントと混同されていませんか?)

> //base.OnPaint(e);
base.OnPaint の呼び出しを省略すると、Paint イベントが発生しなくなりますのでご注意を。

> g.Dispose();
外部から引数で渡されるオブジェクトを、勝手に Dispose しては駄目ですよ。
(今回の場合は Dispose しても問題は出ないとは思いますが…)

本来、自らが Dispose しなければいけないのは、その Graphics が
自分で作成した物(Graphics.FromImage や CreateGraphics などで)の場合です。

> その際、フォームがアクティブ?になる度にOnPaintイベントが発生します
OS 側で再描画が必要と判断された場合には、OnPaint/Paint が呼び出されますので、
結果的にそう見える事もあるかも知れません。ただし、常に発生するわけではありません。

確認のために、描画処理の先頭に
 Trace.WriteLine(DateTime.Now.ToString("HH:mm:ss.ffff"));
などと書いておき、フォームを切り替えるテストを行ってみてください。OS にもよりますが、
切り替えるタイミングで、呼ばれる場合と呼ばれない場合があるかと思います。

> コスパ的に気になってきました。
ごめんなさい、それはどういう意味でしょうか?

> 実際、このOnPaintイベントの発生を1回目以降イベントを起こさないようにしてしまった場合
ここでいう「イベントを起こさない」というのは、どのような処理の事を指しておられますか?

イベントという物は、通常、自動的に呼びだされるものを利用するだけであって、
自分で発生させる類の物では無いと思います。
(コントロールやコンポーネントを開発する場合は、自分で発生させることもありますが)


> 何らかの不具合がでますでしょうか?
イベントを起こさない、という言葉の意味が分からないので回答に迷いますが、
「再描画が不要な状態にする」という意味であれば、問題無いと思います。
どのようにしてそれを実現するのか、という点が不明瞭なので確約はできませんが。

「base.OnPaint を呼びだすかどうかを変更する」という意味だとすれば、
OnPaint を呼ばない場合は自己描画、OnPaint を呼ぶ場合は標準描画となるでしょう。

「再描画要求時に何も行わないようにする(base.OnPaint すら呼ばない)」という意味なら、
恐らくは画面が更新されないという不具合になるかと思います。