この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
Windowsフォーム用のPictureBoxコントロールは基本的に画像ファイルやWeb上の画像を表示するためのものだが、プログラムからグラフィックを描画するためにPictureBoxコントロールを使いたいというニーズは多い。本稿ではPictureBoxコントロール(以下、単にPictureBox)へ描画する方法についてまとめる。
例えば、ボタンがクリックされたときにPictureBoxにグラフィックを描画するには、次のようにCreateGraphicsメソッドによりGraphicsオブジェクト(System.Drawing名前空間)を取得し、それに対して描画を行えばよい(以降ではmyPaintingメソッドが実際の描画を行うものとする)。
// ボタンのClickイベント・ハンドラ
private void button1_Click(object sender, EventArgs e) {
Graphics g = pictureBox1.CreateGraphics();
myPainting(g);
}
' ボタンのClickイベント・ハンドラ
Private Sub Button1_Click(ByVal sender As Object, ByVal e AsEventArgs) Handles Button1.Click
Dim g As Graphics = PictureBox1.CreateGraphics()
myPainting(g)
End Sub
ただしこのようにして描画した内容は、ウィンドウをリサイズしたとき(ウィンドウをいったん小さくしてから元のサイズに戻した場合など)や、PictureBoxを覆っていた別のウィンドウが移動したときなどに消えてしまう(リサイズやほかのウィンドウなどにより無効になった画面領域はプログラム自身で再描画する必要があるため)。
描画したグラフィックの内容が消されずに常に表示されるようにするには、Paintイベントが発生したタイミングでグラフィックを描画しなければならない。これは、グラフィックの描画に必要なデータ(例えばラインならその始点と終点の座標など)をすべて保持しておき、Paintイベント・ハンドラですべてのグラフィックを再描画できるように常に準備しておく必要があることを意味する。
Paintイベント・ハンドラとなるメソッドでは、メソッドの第2パラメータのGraphicsプロパティからGraphicsオブジェクトを取得できるようになっているため、次のようにしてPictureBoxにグラフィックを描画できる。
// PictureBoxのPaintイベント・ハンドラ
private void pictureBox1_Paint(object sender, PaintEventArgs e) {
myPainting(e.Graphics);
}
' PictureBoxのPaintイベント・ハンドラ
Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As PaintEventArgs) Handles PictureBox1.Paint
myPainting(e.Graphics)
End Sub
以上の2つの描画方法は、実際にはPictureBoxに限ったものではなく、フォームも含め基本的にすべてのコントロールで可能だ。いうなれば、これらの方法は単にコントロールの表面にグラフィックを上書きしているようなものだ。
また、描画されたグラフィックの保存は、.NET Framework 2.0では「TIPS:フォームやコントロールの画像をファイルに保存するには?」で示した方法により可能だが、.NET Framework 1.xでは容易でない。
PictureBoxにグラフィックを描画する場合のより合理的な方法は、あらかじめPictureBoxと同じサイズのBitmapオブジェクト(System.Drawing名前空間)を作成してPictureBoxのImageプロパティに設定しておき、グラフィックの描画はそのBitmapオブジェクトに対して行うというやり方だ。
次のサンプル・コードでは、フォームのコンストラクタでBitmapオブジェクトを作成し、ボタンがクリックされたときにグラフィックの描画を行う。
// フォームのコンストラクタ
public Form1() {
InitializeComponent();
// PictureBoxと同サイズのBitmapオブジェクトを作成
Bitmap bmp =
new Bitmap(pictureBox1.Size.Width, pictureBox1.Size.Height);
pictureBox1.Image = bmp;
}
// ボタンのClickイベント・ハンドラ
private void button1_Click(object sender, EventArgs e) {
Graphics g = Graphics.FromImage(pictureBox1.Image);
myPainting(g); // Bitmapオブジェクトに描画
pictureBox1.Refresh(); // PictureBoxを更新(再描画させる)
}
' フォームのコンストラクタ
Sub New()
' この呼び出しは、Windows フォーム デザイナで必要です。
InitializeComponent()
' PictureBoxと同サイズのBitmapオブジェクトを作成
Dim bmp As New _
Bitmap(PictureBox1.Size.Width, PictureBox1.Size.Height)
PictureBox1.Image = bmp
End Sub
' ボタンのClickイベント・ハンドラ
Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
Dim g As Graphics = Graphics.FromImage(PictureBox1.Image)
myPainting(g) ' Bitmapオブジェクトに描画
PictureBox1.Refresh() ' PictureBoxを更新(再描画させる)
End Sub
この方法では、PictureBox自身がPaintイベント発生時にImageプロパティに設定されているBitmapオブジェクトを再描画するため、プログラムで明示的にPaintイベントを処理する必要はない。
またこのようにして描画を行っておけば、その画像をファイルに保存したい場合にも、BitmapオブジェクトのSaveメソッドを使用するだけでよい(参照「TIPS:画像をファイルに保存するには?」)。
ただしBitmapオブジェクトに対して描画したものをすぐにPictureBoxに反映するためには、PictureBoxのRefreshメソッドを呼び出して、PictureBoxを強制的に更新しなければならない(RefreshメソッドはPictureBoxの画像領域を無効にし、Paintイベントを発生させる)。
カテゴリ:Windowsフォーム 処理対象:コントロール
使用ライブラリ:PictureBoxコントロール(System.Windows.Forms名前空間)
使用ライブラリ:Graphicsクラス(System.Drawing名前空間)
使用ライブラリ:Bitmapクラス(System.Drawing名前空間)
関連TIPS:フォームやコントロールの画像をファイルに保存するには?
関連TIPS:画像をファイルに保存するには?
Copyright© Digital Advantage Corp. All Rights Reserved.