- PR -

VB.Netでピクチャーボックスに線を描画する方法

投稿者投稿内容
SSD
会議室デビュー日: 2004/09/20
投稿数: 15
投稿日時: 2004-11-14 23:48
私は最近VB.Netを学び始めたものです。
VB6.0ではグラフなどの線を描画する場合、ピクチャーボックスに描画していたのですが、VB.Netでピクチャーボックスに線を描画する方法が分かりません。
また、フォームに直接描く方法は参考書などで存じていますが、フォームのサイズを変更した場合に線のサイズが変更されるようにコーディングした場合、残像が残ってしまいます。
そこでご教授いただきたいのですが、VB.netではPictureBoxに描くにはどのような処理が必要なのでしょうか?
また、PictureBoxを使う必要はないのでしょうか?その場合、残像が残らない方法はあるのでしょうか?

PictureBoxに描画させたい場合の、簡単なサンプルを以下に記述しておきます。

Private Sub PictureBox1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint

Dim ChartLeft As Integer = 80 '左位置
Dim ChartRight As Integer = PictureBox1.Width - 50 '右位置
Dim ChartHeight As Integer = 50 '上方位置
Dim ChartLower As Integer = PictureBox1.Height - 50 '下方位置

Dim Graphics As System.Drawing.Graphics = PictureBox1.CreateGraphics
Dim ChartAxis As New Pen(Color.Black, 2)
Graphics.DrawLine(ChartAxis, ChartLeft, ChartHeight, ChartLeft, ChartLower)
Graphics.DrawLine(ChartAxis, ChartLeft, ChartLower, ChartRight, ChartLower)

過去のスレッドを検索しましたが、らしいものが見当たりませんでした。
どなたか、よろしくお願いします。
Lin
ベテラン
会議室デビュー日: 2004/11/08
投稿数: 50
投稿日時: 2004-11-15 00:07
Paint内では、e.Graphicsを使って、
最後にPictureBox1.Refreshをしましょう。
SSD
会議室デビュー日: 2004/09/20
投稿数: 15
投稿日時: 2004-11-15 00:22
Lin様
誠にありがとうございます。
あっさり解決しました。
つまり、『Paintイベントは、グラフィックスを描画するためのイベントなので自分でGraphicsクラスを生成する必要もない?』ということですね。
3日くらいいろいろ試していましたので疲れていました。新しいメソッドも覚えられました。感謝です。
SSD
会議室デビュー日: 2004/09/20
投稿数: 15
投稿日時: 2004-11-15 01:41
また問題が発生?しました。
Refreshメソッドはアクティブになっているフォームに働くことが分かりました。
しかし、そのPictureBoxを表示している間はCPUの消費が非常に激しいのです。
さらに
例えば、Refreshメソッドを使用したPictureBoxを表示しているフォームを2つ以上表示し、まったく別のアプリケーションを立ち上げ、再度VB.Netで作成したPictureBoxのフォームを再表示した場合、アクティブになっていないフォームのPictureBoxに、まったく別のアプリケーションの残像が残ってしまいます。

参考画像を以下にサイトアップいたしました。
http://www.online-gate.com/index1.html

フォームにサイズ変更によって描画サイズも変更させる場合の対処は、CPU消費と残像は仕方がないことなのでしょうか?
何度も図々しいですが、よろしくお願いします。
また、別の対策がありましたらご教授お願いします。
Lin
ベテラン
会議室デビュー日: 2004/11/08
投稿数: 50
投稿日時: 2004-11-15 03:30
ペイントイベント内で次のようにして、

Me.Timer1.Interval = 100
Me.Timer1.Enabled = True
'Me.PictureBox1.Refresh()

タイマーで一度だけRefreshを呼ぶ、では。

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Me.PictureBox1.Refresh()
Me.Timer1.Enabled = False
End Sub

cats
大ベテラン
会議室デビュー日: 2002/11/29
投稿数: 221
お住まい・勤務地: 東京
投稿日時: 2004-11-15 09:13
Paintのハンドラでは、Refresh呼ぶ必要はないです。
(というか、呼ぶとまずい)
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2004-11-15 09:13
引用:

VB6.0ではグラフなどの線を描画する場合、ピクチャーボックスに描画していたのですが、VB.Netでピクチャーボックスに線を描画する方法が分かりません。



ピクチャボックスを相手にしているなら、いちいち Paint イベントで(決まりきった)描画を行うのではなく、ピクチャボックスと同サイズの Bitmap を作成してそこに描画を行い、その Bitmap をピクチャボックスの Image プロパティにセットするのが楽チンです。

この手法は

・描画範囲がそれほど大きくない
・更新間隔がそれほど短くない
・描画内容が比較的複雑

な場合に有利です。

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
Lin
ベテラン
会議室デビュー日: 2004/11/08
投稿数: 50
投稿日時: 2004-11-15 10:57
RefreshメソッドってPaintを呼ぶんですね。
失礼しました。というわけで使わないでください。>SSDさん。
ただ、Resize時に呼んだ方がいいかも。
ひどりさんの方法がいいですね。

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