- - PR -
VB.Netでピクチャーボックスに線を描画する方法
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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) 過去のスレッドを検索しましたが、らしいものが見当たりませんでした。 どなたか、よろしくお願いします。 | ||||
|
投稿日時: 2004-11-15 00:07
Paint内では、e.Graphicsを使って、
最後にPictureBox1.Refreshをしましょう。 | ||||
|
投稿日時: 2004-11-15 00:22
Lin様
誠にありがとうございます。 あっさり解決しました。 つまり、『Paintイベントは、グラフィックスを描画するためのイベントなので自分でGraphicsクラスを生成する必要もない?』ということですね。 3日くらいいろいろ試していましたので疲れていました。新しいメソッドも覚えられました。感謝です。 | ||||
|
投稿日時: 2004-11-15 01:41
また問題が発生?しました。
Refreshメソッドはアクティブになっているフォームに働くことが分かりました。 しかし、そのPictureBoxを表示している間はCPUの消費が非常に激しいのです。 さらに 例えば、Refreshメソッドを使用したPictureBoxを表示しているフォームを2つ以上表示し、まったく別のアプリケーションを立ち上げ、再度VB.Netで作成したPictureBoxのフォームを再表示した場合、アクティブになっていないフォームのPictureBoxに、まったく別のアプリケーションの残像が残ってしまいます。 参考画像を以下にサイトアップいたしました。 http://www.online-gate.com/index1.html フォームにサイズ変更によって描画サイズも変更させる場合の対処は、CPU消費と残像は仕方がないことなのでしょうか? 何度も図々しいですが、よろしくお願いします。 また、別の対策がありましたらご教授お願いします。 | ||||
|
投稿日時: 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 | ||||
|
投稿日時: 2004-11-15 09:13
Paintのハンドラでは、Refresh呼ぶ必要はないです。
(というか、呼ぶとまずい) | ||||
|
投稿日時: 2004-11-15 09:13
ピクチャボックスを相手にしているなら、いちいち Paint イベントで(決まりきった)描画を行うのではなく、ピクチャボックスと同サイズの Bitmap を作成してそこに描画を行い、その Bitmap をピクチャボックスの Image プロパティにセットするのが楽チンです。 この手法は ・描画範囲がそれほど大きくない ・更新間隔がそれほど短くない ・描画内容が比較的複雑 な場合に有利です。 _________________ // 渋木宏明 (Hiroaki SHIBUKI) // http://hidori.jp/ // Microsoft MVP for Visual C# // // @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/ | ||||
|
投稿日時: 2004-11-15 10:57
RefreshメソッドってPaintを呼ぶんですね。
失礼しました。というわけで使わないでください。>SSDさん。 ただ、Resize時に呼んだ方がいいかも。 ひどりさんの方法がいいですね。 |