任意のタイミング(例えば、ボタンがクリックされたときなど)でPictureBoxにグラフィックを描画するには、CreateGraphicsメソッドによりGraphicsオブジェクト(System.Drawing名前空間)を取得し、それに対して描画を行えばよい。

この描画方法は、実際にはPictureBoxに限ったものではなく、フォームも含め基本的にすべてのコントロールで可能であり、単にコントロールの表面にグラフィックを上書きしているようなものである。

ただしこのようにして描画した内容は、ウィンドウをリサイズしたとき(ウィンドウをいったん小さくしてから元のサイズに戻した場合など)や、PictureBoxを覆っていた別のウィンドウが移動したときなどに消えてしまう(リサイズやほかのウィンドウなどにより無効になった画面領域はプログラム自身で再描画する必要があるため)。

消えてしまう描画の対策としては、以下の2パターンの方法がある。

 

【Imageプロパティで指定したビットマップに描画】

あらかじめPictureBoxと同じサイズのBitmapオブジェクト(System.Drawing名前空間)を作成してPictureBoxのImageプロパティに設定しておき、グラフィックの描画はそのBitmapオブジェクトに対して行う方法。

またこのようにして描画を行っておけば、その画像をファイルに保存したい場合にも、BitmapオブジェクトのSaveメソッドを使用するだけでよい。

ただしBitmapオブジェクトに対して描画したものをすぐにPictureBoxに反映するためには、PictureBoxのRefreshメソッドを呼び出して、PictureBoxを強制的に更新しなければならない(RefreshメソッドはPictureBoxの画像領域を無効にし、Paintイベントを発生させる)。

 

【Paintイベントで描画】

Paintイベントが発生したタイミングでグラフィックを描画する方法。

Paintイベントはコントロールの再描画が必要な場合に発生する。

Paintイベント・ハンドラとなるメソッドでは、メソッドの第2パラメータのGraphicsプロパティからGraphicsオブジェクトを取得できるようになっている。

 

以下はサンプル。