VBGraphics

VB.NET - 別ウインドウで消された画像の再描画を必要としない描画の方法

 VB.Net ではPictureBoxなどに直接描画しても次に現れるダイアログボックスなどで画像の一部がつぶされると、最初に描画したと同じ手順で再描画しないと修復されません。これでは複雑な描画をしたとき、様々な困難を伴います。
 これを避けるためにBitmapコントロールを使う方法があります。この場合に使われる原理と手順を述べます。

1. まず、Form1にPictureBoxコンポーネントのインスタンスPictureBox1を配置しておきます。
PictureBoxのImageデータは表示画面に他のウインドウが被ってくると壊されます。
そこで、Bitmapオブジェクトを作成し、PictureBoxのImageプロパティにBitmapを設定しておきます。
Bitmap上の画像データは別ウインドウなどが表示画面に被ってきても壊されることがありません。
PictureBoxにPaintイベントが発生した時に素早くBitmapにある画像データをもってPictureBoxのイメージが入れ替えられます。
Paintイベントを強制的に発生させる命令はPictureBox1.Refresh()です。

2. BitmapオブジェクトはSystem.Drawing名前空間に定義されています。フォームの動作中は有効にしておくために、フォームのコンストラクタ Sub New() 内にBitmaのインスタンスbmapを用意します。 Sub New()はForm1のコード部の(宣言)ドロップダウンリストにあるNewをクリックすると現れます。

'(Form1.vb)
Imports System.Drawing
Public Class Form1
    Public Sub New()
          'この呼び出しはデザイナーで必要です。
          InitializeComponent()

          'InitializeComponent() 呼び出しの後で初期化を追加します。        '
          Dim bmap As New Bitmap(PictureBox1.Size.Width, PictureBox1.Size.Height)
          PictureBox1.Image = bmap
     End Sub
  InitializeComponent()を消してはなりません。エンジ色の部分を追加します。BitmapオブジェクトはPictureBox1と同じサイズとします。これでBitmapが確保され、ピクチャボックスのイメージはビットマップに連結されることになります。

3. まず文字をピクチャーボックスに描画する場合を示しましょう。MenuItemあるいはButtonなどを配置しそれらのクリックイベントプロシージャを記述します。ここではButton1を配置したとします。

'(Form1.vb)
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim gph As Graphics = Graphics.FromImage(PictureBox1.Image)
        Dim fnt As New Font("MS UI Gothic", 12)
        Dim drawBrush As New SolidBrush(Color.Black)

        gph.DrawString("文字描画テスト", fnt, drawBrush, 10, 50) 

        PictureBox1.Refresh()
        fnt.Dispose()
        drawBrush.Dispose()
        gph.Dispose()
    End Sub
ここにPictureBox1.Refresh()によってピクチャボックスに描画結果が反映されます。それまでは白紙のままですから注意しましょう。

参照サイトPictureBoxコントロールにグラフィックを描画するには?


VBGraphics

VB.NET - Bitmapに直接点描を行う描画の方法

1. ビットマップに直接図形描画する例を掲げます。例えば点描する場合、SetPixel 関数を使わなければなりませんが、これはビットマップオブジェクトに所属します。Public Class Form1の冒頭のDim bmap As Bitmap と入れることによってForm1の任意のサブルーチンからbmapの呼び出しが可能になります。

'(Form1.vb)
Imports System.Drawing
Public Class Form1
Dim bmap As Bitmap     'これによってForm1のどこからでもbmapの呼び出しが可能になる。
    Public Sub New()
          'この呼び出しはデザイナーで必要です。
          InitializeComponent()

          'InitializeComponent() 呼び出しの後で初期化を追加します。        '
          bmap = New Bitmap(PictureBox1.Size.Width, PictureBox1.Size.Height)
          PictureBox1.Image = bmap
     End Sub


    Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
        Dim gph As Graphics = Graphics.FromImage(PictureBox1.Image)

        bmap.SetPixel(100, 100, Color.Black) 

        PictureBox1.Refresh()
    End Sub
                     .
                     .

2. ただしあるルーチンでPictureBox1のImageプロパティを変更した場合、それ以後Bipmap内容がImageに反映されなくなります。この時は次の例のようにPictureBox1.Image = bmpを挿入して新たに相互関系を確立して下さい。

    Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
        PictureBox1.BackColor = Color.White  ' BackColorまたはForeColorを変えるとImageとBitmapとの連携が崩れる。 
        PictureBox1.ForeColor = Color.Black

        PictureBox1.Image = bmp
        Dim gph As Graphics = Graphics.FromImage(PictureBox1.Image)
         gph.Clear(Color.White)
        PictureBox1.Refresh()
        gph.Dispose()
    End Sub

参照サイト


[SoftLandの入り口へ]