- PR -

ペイントイベントのパフォーマンス向上について

1
投稿者投稿内容
カウンター
大ベテラン
会議室デビュー日: 2004/02/19
投稿数: 123
投稿日時: 2004-11-18 13:50

現在、VB.netでwinアプリを作成しています。
トラックバーの上にピクチャボックスをおいて、スライダの移動に合わせて
ピクチャボックスでの垂直線の移動(再描画)を行っています。

コード:

Private Sub tb_ValueChange(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBar1.ValueChanged

Me.PictureBox1.Invalidate()

End Sub
Private Sub draw_Line(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox.Paint

'垂直線を描画
e.Graphics.DrawLine(Pens.Black, Me.TrackBar1.Value, 0, Me.TrackBar1.Value, 840)

End Sub



上記のようにしていますが、これだとスライダをマウスで素早く移動した場合に垂直線が遅れてついてきてしまいます。
ペイントベントを使用せずに、ピクチャボックスのグラフィックオブジェクトを作成して描画を行った場合には
スライダにぴったりついてきてくれたのですが、簡単に垂直線が消えてしまうので、ペイントイベントのパフォーマンスを向上する方法を考えています。
皆さんの、意見をお聞かせください。
よろしくお願いします。

[ メッセージ編集済み 編集者: カウンター 編集日時 2004-11-18 14:56 ]
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2004-11-18 15:04
コントロール全体を Invalidate せずに、描画に必要な部分(旧線分と新線分)だけを Invalidate するようにしたほうがパフォーマンスは上がるはずです。

Invalidate に 当該 Rectangle あるいは Region を渡せばよいはずです。

[ メッセージ編集済み 編集者: にしざき 編集日時 2004-11-18 15:05 ]
カウンター
大ベテラン
会議室デビュー日: 2004/02/19
投稿数: 123
投稿日時: 2004-11-18 15:20
引用:

にしざきさんの書き込み (2004-11-18 15:04) より:
Invalidate に 当該 Rectangle あるいは Region を渡せばよいはずです。



にしざきさん、ありがとうございます。

ちょうどいま、それを試していました。

コード:
        Dim rc As Rectangle
        rc.Size = New Size(2, 840)
        Me.pbChart.Invalidate(rc.X = VerX)



のようにして、無効化領域を狭めてみたんですが、結果はほとんど変わりませんでした。
領域の指定が間違っているのでしょうか?
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2004-11-18 15:49
引用:

カウンターさんの書き込み (2004-11-18 15:20) より:
コード:
        Dim rc As Rectangle
        rc.Size = New Size(2, 840)
        Me.pbChart.Invalidate(rc.X = VerX)




このコードって、Invalidate(Boolean)を呼んでいませんか?
コード:
        Dim rc As Rectangle
        rc.Size = New Size(2, 840)
        rc.X = VerX
        Me.pbChart.Invalidate(rc)


ではどうでしょうか。
カウンター
大ベテラン
会議室デビュー日: 2004/02/19
投稿数: 123
投稿日時: 2004-11-18 16:03
引用:

にしざきさんの書き込み (2004-11-18 15:49) より:

このコードって、Invalidate(Boolean)を呼んでいませんか?
コード:
        Dim rc As Rectangle
        rc.Size = New Size(2, 840)
        rc.X = VerX
        Me.pbChart.Invalidate(rc)


ではどうでしょうか。



たしかに、Booleanを呼んでいました

にしざきさんのコードを使用したら、それっぽくうごいたのですが、
マウスを素早く動かしたときに、指定した領域の無効化が間に合わず
残像が残ってしまいました。
1

スキルアップ/キャリアアップ(JOB@IT)