§18 グラフィックス(2)1 プログラミング実習
 back next 

 グラフィックス(1)で描画した図形は、ウィンドウを最小化したり、ほかのウィンドウの下になったりすると消えてしまう。ここでは、描画した図形が消えないようにする方法について学習する。また、画像ファイルを読み込んだり、描画した画像を保存する方法について学習する。

利用するオブジェクト等
ビットマップ(Bitmap)クラス

【1】 プログラム作成の準備

操作 1 「17.グラフィックス(1)」の実習で作成したプロジェクト「実習17グラフィックス1」を開く。フォーム(Form1)のTextプロパティを「グラフィックス2」に変更する。

Text グラフィックス2    


【2】 再描画

 ウィンドウが最小化から元に戻ったりするとき、そのウィンドウは再描画される。この時、これまで描画した画像も再描画されるようにする。

操作 2 ビットマップオブジェクトをピクチャボックスのImageプロパティに設定するメソッドAutoRedrawを次のように作成する。

    Private Function AutoRedraw(ByVal pict As PictureBox) As Graphics
        If pict.Image Is Nothing Then    '※1
            pict.Image = New Bitmap(pict.ClientRectangle.Width, pict.ClientRectangle.Height)
        End If
        Return Graphics.FromImage(pict.Image)    '※2
    End Function

※1 Imageプロパティに何も設定されていないときだけ、ビットマップオブジェクトを作成して、Imageプロパティに設定する。
※2 Imageプロパティのグラフィックスを作成して返却する。
ピクチャボックスへのグラフィックス描画
 ウィンドウが最小化から元に戻ったりするとき、Paintイベント(再描画が必要になったときに発生するイベント)が発生し、そのウィンドウは再描画される。この時、ピクチャボックスにはImageプロパティに設定された画像が描画される。
 グラフィックス(1)の実習では、Imageプロパティは何も設定しなかったので、次図のようなイメージとなる。また、グラフィックスクラスで描画してもImageプロパティは変化しない(空のまま)ので、再描画の時に描画した図形が消えた。

 一般的に、ピクチャボックスに画像を設定(表示)するには、次図のようにImageプロパティに画像ファイルなどを設定する。したがって、ウィンドウの最小化などで画像が消えることはなかった。

 そこで、図形を描画する場所として、ビットマップ(Bitmap)を用意し、Imageプロパティに設定する(次図)。これをグラフィックスに関連づけて描画すると消えなくなる。

 グラフィクスクラスで描画した後は、ピクチャボックスのRefreshメソッドで再描画する。


操作 3 グラフィックスクラス作成をCreateGraphicsメソッドから作成したAutoRedrawメソッドに変更して、画像が消えないようにする。下線部のプログラムを追加・修正する。

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        'グラフィックオブジェクトの作成
        Dim gr As Graphics = PictureBox1.CreateGraphics 'ピクチャボックス用
                                    ↓
                           = AutoRedraw(PictureBox1)
        Dim gpen As New Pen(Color.Black, 5) 'ペンオブジェクト
        '直線描画
        gpen.DashStyle = Drawing2D.DashStyle.Custom    '破線に設定
        gpen.EndCap = Drawing2D.LineCap.ArrowAnchor    '終端に矢印を設定
        gr.DrawLine(gpen, 10, 10, 190, 190)
        gpen.Color = Color.Red        'ペン色の設定
        gr.DrawLine(gpen, 190, 10, 10, 190)
        PictureBox1.Refresh()        '再描画
        'オブジェクト解放
        gr.Dispose()
        gpen.Dispose()
    End Sub

結果 実行して、[直線]ボタンをクリックする。ウィンドウを最小化してから戻しても直線は消えない。そのほかの図形はまだ消える。

操作 4 同じようにして、残りの描画処理にもプログラムを追加・修正する。対象となるメソッドはButton2_Click〜Button6_Clickである。

結果 実行して、図形を描画し、ウィンドウを最小化してから戻しても図形は消えない。


 back next 
 §18 グラフィックス(2)1 Copyright©2009 Hiroshi Masuda 

 

 

inserted by FC2 system