投稿者 魔界の仮面弁士  (社会人) 投稿日時 2019/12/27 23:37:58
> あとdispose()でメモリ開放でしょうか。
開放というよりは解放ですね。処分と言い換えても良いですが。


> creategraphicsですが、「コントロールのGraphicsを作成します」とのことですが、

Bitmap や PictureBox は、絵を描くためのキャンバスに相当します。
一方 Graphics オブジェクトは、ペンやブラシなどのお絵かきツールだと思ってください。


Graphics クラスの FillEllipse メソッドを呼び出せば、楕円が描かれますし、
Graphics クラスの DrawString メソッドを呼び出せば、文字列が描画されます。
Graphics クラスの Clear メソッドを呼び出せば、指定した色でキャンバス全体が塗り潰されます。


このとき、これらの描画結果が何処に描画されるかといえば、
「その Graphics が指しているキャンバス」になります。
そのキャンバスは PictureBox のこともあれば、プリンターの場合もありますが、
出力先が何であっても、Graphics クラスを使って同じように描いていくことが出来ます。


Public Class Form1
    ' 引数で受け取った Graphics クラスを使って、現在時刻を描く処理 
    Private Sub DrawTime(g As Graphics)
        g.DrawString(Now.ToString("HH:mm:ss.fff"), Me.Font, Brushes.Red, Point.Empty)
    End Sub

    ' Bitmap インスタンスから得た Graphics インスタンスに描画させる 
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        ' 確実に Dispose を呼び出せるように、Using ステートメントを利用している 
        Using bmp As New Bitmap(100, 100)
            Using g As Graphics = Graphics.FromImage(bmp)
                DrawTime(g)
            End Using
            ' 描画した Bitmap を sample.png というファイル名で保存する。 
            bmp.Save("C:\TEMP\sample.png", Imaging.ImageFormat.Png)
        End Using
    End Sub

    ' PictureBox1 では、CreateGraphics() を使っているので、フォームの最小化等で消えてしまう。 
    ' PictureBox2 では、前景に割り当てた Bitmap に描いているので、最小化しても残り続ける。 
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Using g As Graphics = PictureBox1.CreateGraphics()
            g.Clear(Color.Yellow)
            DrawTime(g)
        End Using

        If PictureBox2.Image IsNot Nothing Then
            PictureBox2.Image.Dispose()   '古い画像が割り当てられていたら捨てる 
        End If
        PictureBox2.Image = New Bitmap(100, 100)   '新しいキャンバスを用意 
        Using g As Graphics = Graphics.FromImage(PictureBox2.Image)
            g.Clear(Color.Yellow)
            DrawTime(g)
        End Using
    End Sub


    'Form1 の Paint イベントで得られる e.Graphics に対して描画させる 
    Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
        DrawTime(e.Graphics)
    End Sub

    ' 0.1 秒ごとに、Form1 に再描画を指示する 
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        DoubleBuffered = True
        Timer1.Interval = 100
        Timer1.Start()
    End Sub
    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        Invalidate()
    End Sub

End Class