tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルピクチャーボックスへの再描画
記事No8617
投稿日: 2009/01/23(Fri) 09:44
投稿者GEN
開発環境:Microsoft VisualBasic2008 Express Edition
PC:DELL OPTIPLEX 755(CPU:Core2Duo 2.33GHz、MEM:1GB、OS:Windows Vista SP2)


VB6は数年使って測定用のソフトを何本か作っていましたが、
VB.NETにてはじめてソフトを作ることになり、下記のピクチャーボックスへの再描画コードでつまずいています。ご助言の程よろしくお願いいたします。
(最終目的は、測定器からデータが送られてくる毎にグラフ軸の再スケーリング)

目的は、ピクチャーボックス内に高速再描画をすることです。
再描画をする上で、
(1)ピクチャーボックスを画面外に持っていっても消えないようにしたい。
(2)再描画するときに表示内容が綺麗に表示させたい。
(3)できるだけ高速に再描画させたい。

(1)〜(3)を満足させたいのですが、これらを踏まえて

コードを考える工程で、下記の2点のコードをPictureBox1、PictureBox2で
実現したいのですが、どのようにコードを書いたらよろしいでしょうか?
・PictureBox1の処理終了後にPictureBox2のように画面外に持っていっても
 消えないようにしたい。
・PictureBox2の再描画をPictureBox1の処理のように高速にしたい。
 (※PictureBox1とPictureBox2の良い所だけをとったコードにしたい・・・)

'PictureBox:2個、Button:1個を配置してコマンドボタンを押してください。

Public Class Form1
    Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
        PictureBox1.BackColor = ColorTranslator.FromWin32(Microsoft.VisualBasic.RGB(200, 200, 255))
        PictureBox2.BackColor = ColorTranslator.FromWin32(Microsoft.VisualBasic.RGB(200, 200, 255))
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        '----------------------------------------------------------------------------------
        '●ピクチャーボックスを画面上から消すと消える描画     (PictureBox1)            |
        '----------------------------------------------------------------------------------
        Dim g1 As Graphics = PictureBox1.CreateGraphics
        Dim f1 As New Font("MS Pゴシック", 50)
        Dim i1 As Integer

        For i1 = 0 To 10000
            'PictureBox1.Image = Nothing '表示を初期化する
            g1.Clear(PictureBox1.BackColor)
            'Invalidate()
            Update()
            g1.DrawString(i1, f1, Brushes.Blue, 0, PictureBox1.Height / 2)
            'Application.DoEvents()
            'PictureBox1.Refresh()
        Next i1
        f1.Dispose()
        g1.Dispose()
        '----------------------------------------------------------------------------------


        '----------------------------------------------------------------------------------
        '●ピクチャーボックスを画面上から消しても消えない描画   (PictureBox2)         |
        '----------------------------------------------------------------------------------
        Dim g2 As Graphics
        Dim f2 As New Font("MS Pゴシック", 50)
        Dim i2 As Integer

        With PictureBox2
            .Image = New Bitmap(.Width, .Height)
            g2 = Graphics.FromImage(.Image)
        End With

        For i2 = 0 To 10000
            'PictureBox2.Image = Nothing '表示を初期化する
            g2.Clear(PictureBox1.BackColor)
            'Invalidate()
            'Update()
            g2.DrawString(i2, f2, Brushes.Blue, 0, PictureBox2.Height / 2)
            'Application.DoEvents()
            PictureBox2.Refresh()
        Next i2
        f2.Dispose()
        g2.Dispose()
        '----------------------------------------------------------------------------------
    End Sub

End Class

[ツリー表示へ]
タイトルRe: ピクチャーボックスへの再描画
記事No8618
投稿日: 2009/01/23(Fri) 10:59
投稿者ダンボ
RefreshメソッドとPaintイベントで実現してみました。最後に1001となるバグはご愛敬で。

Public Class Form1
    Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
        PictureBox1.BackColor = ColorTranslator.FromWin32(Microsoft.VisualBasic.RGB(200, 200, 255))
        PictureBox2.BackColor = ColorTranslator.FromWin32(Microsoft.VisualBasic.RGB(200, 200, 255))
    End Sub

    Dim i1 As Integer
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        '----------------------------------------------------------------------------------
        '●ピクチャーボックスを画面上から消すと消える描画     (PictureBox1)            |
'----------------------------------------------------------------------------------
        For i1 = 0 To 1000
            PictureBox1.Refresh()
        Next i1
'----------------------------------------------------------------------------------
        '●ピクチャーボックスを画面上から消しても消えない描画   (PictureBox2)        変更無し |
'----------------------------------------------------------------------------------
    End Sub

    Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
        Dim g1 As Graphics = e.Graphics
        Dim f1 As New Font("MS Pゴシック", 50)
        g1.Clear(PictureBox1.BackColor)
        g1.DrawString(Str(i1), f1, Brushes.Blue, 0, CSng(PictureBox1.Height / 2))
        f1.Dispose()
        'g1.Dispose()
    End Sub
End Class

[ツリー表示へ]
タイトルRe^2: ピクチャーボックスへの再描画
記事No8619
投稿日: 2009/01/23(Fri) 13:41
投稿者GEN
ダンボ様 早速の回答ありがとうございました。

> RefreshメソッドとPaintイベントで実現してみました。最後に1001となるバグはご愛敬で。

for 〜 nextで 0〜1000までを回しているだけなのに、ピクチャーボックスを画面の外に持っていくと1000→1001にバグる原因は分かりませんが、Paintイベントにて実現できることを確認できました。

ありがとうございました。

[ツリー表示へ]
タイトルRe^3: ピクチャーボックスへの再描画
記事No8620
投稿日: 2009/01/23(Fri) 14:52
投稿者ダンボ
> for 〜 nextで 0〜1000までを回しているだけなのに、ピクチャーボックスを画面の外に持っていくと1000→1001にバグる原因

i1がグローバル変数で、for 〜 nextを抜けた後には1001になっているからですよ。
どうせ本番仕様ではi1を表示するのではなく、別な最終結果数値を表示したいのだろうと
思いますので、そこら辺は調整を。

ところで毎回Paintイベントで表示しているとやっぱり遅いですね。いいとこどりを
狙うなら、測定の間隔が極小ならば、もとのままPictureBox1に書き続けて、最終結果
だけをPaintイベントで表示した方が応答速度を稼げます。測定間隔が極小ならば、表示
間隔も極小で、その間にWindowが隠れてもすぐにまた書き換わるので。

[ツリー表示へ]