• 締切済み

VB.netで図形描画ができません^^;

初心者質問で申し訳ないです。 VB.net(Visual Studio 2005)で図形描画を行っています。 ボタン押下で図形(四角形)を描画する方法は理解できたのですが 起動時に表示するほうほうが分かりません。 どなたか教えてもらえないでしょうか? Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim g As Graphics g = PictureBox1.CreateGraphics() g.DrawRectangle(Pens.Black, 100, 50, 100, 100) g.Dispose() End Sub 上記のようにLoadから読み込むようにしましたが描画されませんでした。 よろしくお願い致します><

みんなの回答

回答No.1

■VB.NETで図形を描画する際の注意 VB.NETの場合、VB6.0以下と違い、PictureBoxにAutoRedraw(自動再描画機能)が無いので、Paintメソッドに描画処理を書かなければなりません。 ・ボタン押下で図形を描画しても、他のウィンドウの下にウィンドウを隠したり最小化した後にウィンドウを前面に戻すと描画が消えて無くなってしまう(再描画されない)のがわかると思います。 ■Paintメソッドで図形を描画する PictureBox1のPaintメソッドを選び、 描画には、Paintメソッドの引数にある System.Windows.Forms.PaintEventArgsクラスのe引数オブジェクトを使います。 Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint e.Graphics.DrawRectangle(Pens.Black, 100, 50, 100, 100) End Sub というような感じです。

kspring
質問者

お礼

細かく説明いただきましてありがとうございます。 質問を書いた後に、Paintメソッドでの表示はしましたが、仰るとおり 再描画されず、わけが分からなくなっていました。。。 本当に100%のお答えありがとうございます。

関連するQ&A

  • VB2005のピクチャーボックス内の図形の移動

    VB2005で、formにPictureBox一つと、Button三つをおいて、Button1で、PictureBoxに丸を書いて、Button2とButton3で、PictureBox内で、丸を右左に移動させようと考えています。で丸を書くことと、同じプロシジャー内では、移動させることはできました。が、別のプロシジャーから移動させるってことは出来るのでしょうか?VB2005をやり始めたばかりなのでてんでわかりません。どなたか詳しい方いらっしゃいましたら教えてください。よろしくお願いします。 Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim g As Graphics = PictureBox1.CreateGraphics() g.Clear(PictureBox1.BackColor) Dim w As Integer = PictureBox1.ClientSize.Width / 3 Dim h As Integer = PictureBox1.ClientSize.Height / 3 g.ResetTransform() g.DrawEllipse(Pens.Black, 0, 0, w, h) g.TranslateTransform(80, 50) g.DrawEllipse(Pens.Black, 0, 0, w, h) g.ResetTransform() g.Dispose() End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim g As Graphics = PictureBox1.CreateGraphics() g.TranslateTransform(80, 50) End Sub Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click End Sub End Class

  • 描画した後での塗りるぶし VB

    丸を描画後にColorDialogで指定された色で丸の範囲だけ塗りつぶすというプログラムを作っているのですが、なかなかうまくいきません。 丸は、このように描画するようにしています。 Private Sub PictureBox1_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove If (e.Button = MouseButtons.Left) Then Dim g As Graphics = PictureBox1.CreateGraphics() Dim ePos As MouseEventArgs PictureBox1.Refresh() g.DrawEllipse(New Pen(Color.Black, 2), Spos.X, Spos.Y, e.X - Spos.X, e.Y - Spos.Y) ePos = e g.Dispose() End If End Sub Private Sub PictureBox1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown If (e.Button = System.Windows.Forms.MouseButtons.Left) Then Spos = e End If End Sub VB2010を使っています。 どなたか教えていただけるとありがたいです。よろしくお願いします。

  • VB PictureBoxの描画範囲

    VisualStudio2010のVBにて、ピクチャーボックスの範囲をプログラム中で大きくして描画をさせたいのですが、ピクチャーボックスのサイズを大きくしても、大きくした範囲には描画がされません。 やり方は↓の方法です。 まず、formにボタンとピクチャーボックスを300×200で配置して、 http://homepage1.nifty.com/rucio/main/dotnet/Samples/dnSampleKeepImage.htm ↑のページで書かれてた方法でグラフィックを再描画させています。 Public Class Form1 Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim g As Graphics = AutoGraphics(PictureBox1) PictureBox1.Width = 400 g.FillRectangle(Brushes.Black, 100, 100, 10, 10) '1つ目の図形 g.FillRectangle(Brushes.Black, 350, 100, 10, 10) '2つ目の図形 g.Dispose() End Sub Public Function AutoGraphics(ByVal picSource As PictureBox) As Graphics If picSource.Image Is Nothing Then picSource.Image = New Bitmap(PictureBox1.Width, PictureBox1.Height) End If Return Graphics.FromImage(picSource.Image) End Function End Class これを実行すると、1つ目の図形は描画されていますが、拡大した範囲にある2つ目の図形は描画されていません。 ピクチャーボックスの範囲を大きくした所にも描画をさせたいと思っています。 よろしくお願いします。

  • C#を用いて描画する四角形の角を丸くする方法

    教えて下さい。 書籍やインターネットで調べているのですが、四角形の角を丸く(ワードの図形描画にある「角丸四角」です。)したり面取り(日曜大工で角を落とすのとおなじ)にはどのようにしたら良いのでしょうか? 多角形は参考するのがあったのですが、「角」の加工について調べたのですが見当たりませんでした。 【四角形描画】 //Graphicsオブジェクトの作成 Graphics g = PictureBox1.CreateGraphics(); //Penオブジェクトの作成(幅1の黒色) //(この場合はPenを作成せずに、Pens.Blackを使っても良い) Pen p = new Pen(Color.Black, 1); //(10,20,100,80)の長方形を描く g.DrawRectangle(p, 10, 20, 100, 80); //リソースを開放する p.Dispose(); g.Dispose(); 【四角形の一箇所の角を丸くする】  →四角形の角の描画が残ってしまう。 //Graphicsオブジェクトの作成 Graphics g = PictureBox1.CreateGraphics(); //位置(10, 20)に100x80の四角を赤色で描く g.DrawRectangle(Pens.Red, 10, 20, 100, 80); //先に描いた四角に外接する楕円の一部 //(開始角度 0度、スイープ角度 90度)を黒で描く g.DrawArc(Pens.Black, 10, 20, 100, 80, 0, 90); //リソースを開放する g.Dispose();

  • VB.NETのグラフィック描画について

    グラフィック描画ですが、引数を持たないサブルーチンプロシージャ(固定的な 目盛り等)は、PictureBox_paint(***イベントプロシージャ内に記述すればグラフィック描画ができます(e.Graphicsでグラフィックスオブジェクトを取得できる為)が、 X、Y座標を引数としたサブルーチンプロシージャを作り、その中でLineDraw(*****で描画させたい場合サブルーチンプロシージャ内に dim g As Graphics=pictureBox1.CreateGraphics() でグラフィックオブジェクトを生成しても 描画できないのですがどのようにすれば解決できるでしょうか(イメージがわかり難いかもしれませんのでサンプルを書きました) よろしくお願いします (1)private sub pictureBox1_paint(Byval sender as Object, Byval e as system****** e.Graphics.DrawLine(****** (これは描画できる) End Sub (2)private sub zahyou() ' 座標を生成するサブルーチンプロシージャ dim i as integer for i=0 to 10 hyouji( i , i*5 ) End Sub private sub hyouji( x as integer, y as integer) ’直線を引くサブルーチンプロシージャ dim g As Graphics=pictureBox1.CreateGraphics() g.DrawLine(***,x,y**** (これは描画できない)

  • Form1 Load で実行されない。

    以前も同じ質問をしましたが、カテゴリーが不適当だったようですので、再度質問します。 よろしくお願いします。 VB2010のある参考書に下記のようなプログラムがありました。 Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click Dim g As Graphics = Me.PictureBox1.CreateGraphics() g.DrawEllipse(Pens.Black, 0, 0, 100, 100) End Sub ボタンをクリックすると円が描けます。これをプログラムの起動時に実行させようと思い Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Dim g As Graphics = Me.PictureBox1.CreateGraphics() g.DrawEllipse(Pens.Black, 0, 0, 100, 100) End Sub と、しましたが実行されません。 どうすれば良いのでしょうか?

  • 図の削除直後の再描画

    VB2008 Express Edditionを使って、写真画像に直線等の図形を重ねる プログラムを作っています。 PictureBoxのBackgroundImageに写真画像を設定し、 Dim gp As Graphics = PictureBox1.CreateGraphics() gp.DrawLine(Pens.Pink, 100, 100, 300, 300) gp.Dispose() といった書式で図形が描画できること、それを削除するには If Not (PictureBox1.Image Is Nothing) Then PictureBox1.Image.Dispose() End If PictureBox1.Image = Nothing とすれば良いことは分かりました。 次に、例えば(100,100)-(300,300)の直線を(100,100)-(300,290)に 変更するような修正をしたいのですが、上記の図形削除と描画を 組み合わせれば良いと考えてやってみたのですが、一瞬図形が 表示されてすぐに消えてしまいます。 図形削除と再描画を別々のボタンに割り当てるとうまくいくのですが、 1つのボタンに割り当てて続けて行うとダメなようです。 これを回避するにはどうすればいいでしょうか?

  • VB2005 リソースの開放

    VBは始めたばかりで、妙な質問ですが。 CAD等で直線描画中のラバーライン(始点は決定で終点が未定)の処理ですが Private Sub MouseMoveイベント Dim g As Graphics = PictureBox1.CreateGraphics() If ラバーライン描画中 Then ラバーライン描画処理 End If g.Dispose() End Sub Dim g As Graphics = PictureBox1.CreateGraphics()とg.Dispose()の記述はこのSubの中に書かなくてはいけないのですか? 描画処理中リソースの開放g.Dispose()するのは効率よさそうではないみたいで。 終点が決定してから開放の方が気分的にいいのですが。 なにかもっといい方法があったら御指南お願いします。

  • VB .net Form_Load時、または関数内でPictureBoxにライン描画を行ないたい。

    Form上にPictureBox,Buttonを配置して、Botton_Click処理時にPictureBox上へのライン描画は Dim g As Graphics = PictureBox1.CreateGraphics g.DrawLine(Pens.Red, 0, 0, 100, 200) g,Dispose() にて行なえましたが、同じような描画を Form_Load時に上記の処理を入れても全く描画されません。Button_Clickイベントのように1クッション置かないと実現できないのでしょうか? Form_Load時、関数内などで周期的にライン描画を 行なってやりたいのですが、どなたか解決方法をご存知の方がいましたら回答の程よろしくお願いいたします。

  • ピクチャボックスの描画内容をファイル出力

    VB2005を使用しています。 BufferedGraphicsContextクラスと、BufferedGraphicsクラスを使用して ダブルバッファでピクチャボックスに絵を書くプログラムを作成しています。 絵は問題なく描けるのですが、それをBMPファイル、もしくはクリップボードに転送したいのですが、どうしたらいいかわかりません。 ご指導お願いします。 参考に描画のコードを載せておきます。 Public Class Form1 Private currentContext As BufferedGraphicsContext Private myBuffer1 As BufferedGraphics Private Dpen As Pen Private Sub ToolStripButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton1.Click '描画 Dpen = New Pen(Color.Black, 5) myBuffer1.Graphics.Clear(Color.FromArgb(255, 255, 255, 255)) myBuffer1.Graphics.DrawLine(Dpen, 0, 0, 200, 200) myBuffer1.Render(PictureBox1.CreateGraphics) End Sub Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load currentContext = BufferedGraphicsManager.Current myBuffer1 = currentContext.Allocate(PictureBox1.CreateGraphics, PictureBox1.DisplayRectangle) End Sub End Class

専門家に質問してみよう