投稿者 魔界の仮面弁士  (社会人) 投稿日時 2009/11/5 20:13:02
「CreateGraphics で無ければならない状況」の方が特殊だと思いますよ。
理解して使う分には構いませんが、通常は Paint の方が良好な;充分な結果を得られます。

たとえば、DoubleBuffered プロパティや SetStyle を用いて
ダブルバッファリングを用いた場合、その影響を受けられるのは
Paint イベント(あるいは、OnPaint メソッド)で得られる
PaintEventArgs 型の引数を用いた場合だけです。

一応、CreateGraphics で得た Graphics に対して、ダブルバッファリングを
行うためのクラスも用意されてはいますが、この場合、バッファ内の描画内容を
サーフェイスにレンダリングするタイミングは自前で管理する事になります。


また、CreateGraphics で得たサーフェイスはあくまで一時的な描画となります。
最小化したり他のウィンドウの下に隠れてしまうと、その部分は消えてしまいますので、
そのたびに消えた部分を再描画しなければなりません。

そして本来、その再描画の仕組みを担っているのが Paint イベントです。この引数
e.Graphics を使えば、自分で Graphics を生成する必要も Dispose する必要も
ありませんし、描画すべきタイミングを自分で推し量る必要もありません(プログラムから
再描画を要請するための Invalidate / Update / Refresh メソッドも用意されています)。

この「再描画通知を受け取り、そのタイミングで描画する」という手法は、
Windows フォームの描画原則となっています。この原則は .NET が登場する前から
変わっていません。VB6 しかり、MFC しかり。


なお、書き換え頻度の少ない描画(背景画像など)を表示するのが目的であれば、
CreateGraphics メソッドも Paint イベントも使う必要はありません。あらかじめ
固定画像を用意しておくか、または Graphics.FromImage(Bitmap) に対して描画して、
その画像(Bitmap)を Image/BackgroundImage に割り当てる方が効率的です。