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

このQ&Aのポイント
  • VB.NETのグラフィック描画について詳しく教えてください。
  • グラフィック描画の引数を持たないサブルーチンプロシージャはPictureBox_paint内で実行され、引数を持つ場合は別途定義して呼び出してください。
  • グラフィック描画において、X座標とY座標を引数としたサブルーチンプロシージャ内で描画させたい場合、PictureBox1.CreateGraphics()を使用する必要があります。
回答を見る
  • ベストアンサー

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**** (これは描画できない)

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

返信遅れまして申し訳御座いません フォーム=frmGurafu ピクチャ=Picture1 開発環境の設定にもよりますが、コードのイメージは以下のようになります │ 田 Windows フォーム デザイナで生成されたコード │ │ │Private g As Graphics │ 日Private Sub frmGurafu_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load │ PictureBox1.Image = New Bitmap(PictureBox1.Width, PictureBox1.Height) │ g = Graphics.FromImage(PictureBox1.Image) │'別のSub │ sakugatate() '縦を描く │ sakugayoko() '横を描く │End Sub │ 日Sub sakugatate() │ Dim i As Integer │ For i = 1 To 5 │  g.DrawLine(Pens.Pink, i * 20, 0, i * 20, 100) │ Next │End Sub │ 日Sub sakugayoko() │ Dim i As Integer │ For i = 1 To 5 │  g.DrawLine(Pens.Pink, 0, i * 20, 100, i * 20) │ Next │End Sub これで、どうでしょうか?

mehiro2
質問者

お礼

お返事いただきまして さっそく試して上手くいきました。 とても親切に教えていただいて有難うございました。

その他の回答 (2)

回答No.2

'フォームにPictureBox1とButton1を貼り付けて 'フォーム内の共通obj宣言 Private g As Graphics 'フォームロードに g = PictureBox1.CreateGraphics 'ボタンクリック Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click  kaku() End Sub 'こんなSubを作成して Private Sub kaku()  Dim I As Integer  For I = 1 To 40   keisen(I * 10)  Next End Sub '繰り返される部分 Private Sub keisen(ByVal Px As Integer)  g.DrawLine(Pens.Pink, Px, 0, Px, PictureBox1.Height) End Sub グラフの罫線はこんな処理で描きます このままですと、ウインドウの裏に隠れると消えてしまいますので 346706番の方法とあわせれば、書けると思います。 スイマセン↓これは大間違いでした Private g As Graphics = Graphics.FromImage(PictureBox1.Image)

mehiro2
質問者

お礼

この度は、大変お世話になりました。 前回教えていただいた方法と組み合わせてやってみます 有難うございました。 ちなみに346706番とは、前回のお返事分でしょうか?

mehiro2
質問者

補足

すみません、前回教えていただいた方法でグラフィックが書けたのですが、 dim g as graphics=・・・・ PictureBox1.Image・・・・ を複数のSubプロシージャに書くと、先のプロシージャで表示されていたグラフィックが消えてしまいます。 例えば、座標を書くプロシージャとグラフデータを書くプロシージャと分けていた 場合、座標プロシージャを呼んでグラフデータプロシージャを呼ぶと座標が消えます。宣言の場所方法が違うのでしょうか よろしくお願い致します

回答No.1

dim g As ~ をSubの外に宣言してみては如何でしょうか? Private g As Graphics = Graphics.FromImage(PictureBox1.Image) Private p As New Pen(Color.Black) private sub hyouji(***) g.DrawLine(p, x1, y1, x2, y2) End sub …はずしていたら、すいません

mehiro2
質問者

補足

お返事遅れましてすみませんでした 回答有難うございます。 dim g as をプロシージャの外に出すとコンパイルエラーになってしまいました あとPrivate g As Graphics = Graphics.FromImage(PictureBox1.Image) のpraivate部分が引っかかってしまうのです。 記述方法がちがっていましたら、御指摘ください よろしくお願い致します

関連するQ&A

  • VB.NETのグラフィック描画で困っています

    VB.NETでのグラフィックの記述方法ですが 何かをクリックすると描画させるのではなく 単にあるsubプロシージャ内でグラフィックを描画させる記述する方法として pictureBox1.Image=New Bitmap(PictureBox1.width,pictureBox1.Height) Dim g As Graphics = Graphics.FromImage(PictureBox1.Image) を教えていただきました。そこで private sub xy_keisan() '座標を計算させるプロシージャ disp_x() 'x座標に目盛りを表示させるプロシージャ disp_Y() 'xの目盛り数によってY座標の位置を変えて表示させるプロシージャ end sub private sub disp_x() pictureBox1.Image=New Bitmap(PictureBox1.width,pictureBox1.Height) Dim g As Graphics = Graphics.FromImage(PictureBox1.Image) g.DrawLine(****** end sub private sub disp_y() pictureBox1.Image=New Bitmap(PictureBox1.width,pictureBox1.Height) Dim g As Graphics = Graphics.FromImage(PictureBox1.Image) g.DrawLine(****** end sub のような記述(引数とか細かい所は端折っています)ですとdisp_yは描画されていますが,disp_xは消えてしまいます。 pictureBox1.Image=New Bitmap(PictureBox1.width,pictureBox1.Height) が消えてしまう原因だとおもって宣言場所を変えてみましたが同じです 逆にこれが無いと描画させることが出来なくなります。 これの意味も今ひとつ判りません よろしくお願い致します

  • 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から読み込むようにしましたが描画されませんでした。 よろしくお願い致します><

  • VB.NETでPictureBoxへの描画について

    VB.NETでPictureBoxへの描画について PictureBoxに画像を表示し、余白部分を含めて、マウスで描画できる処理を作成しているのですが、 どうも上手くいかない為、皆さんの知恵をお借りしたいと思い質問させて頂きました。 まず、880×560のPictureBoxを用意し、その中に、600×480の画像を埋め込んでいます。 そのPictureBoxの中で、画像以外の部分(余白)にもマウスで線等を書きたいのです。 画像のみに描く場合は上手くいくのですが、余白を含めると上手くいかなくなってしまい、 困っております。 プログラムの違いは以下の箇所のみです。2の場合は上手くいきます。 1.PictureBox全体に描画する(画像も含め) Dim g As Graphics = PictureBox1.CreateGraphics 2.画像のみに描画する Dim g As Graphics = Graphics.FromImage(PictureBox1.Image) ちなみに、マウスではなく、ボタンクリック時に描画した時は、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()するのは効率よさそうではないみたいで。 終点が決定してから開放の方が気分的にいいのですが。 なにかもっといい方法があったら御指南お願いします。

  • PictureBoxの描画について

    VB2005を使用してPictureBoxに線を描きました。  Dim g As Graphics = PictureBox1.CreateGraphics()  g.DrawLine(p, X1, Y1, X2, Y2) 線は上手く描けたのですが、表示している画面(Form)を最小化して再度最大化すると、描いた線が消えてしまいます。FormをHideしてもう一度Showしても同じです。 この描画を消さないようにするには、どうすればよいでしょうか?

  • 描画した後での塗りるぶし 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 .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時、関数内などで周期的にライン描画を 行なってやりたいのですが、どなたか解決方法をご存知の方がいましたら回答の程よろしくお願いいたします。

  • VB2008 PaintイベントとResize

    VB初心者です VisualStudio2008 VBを使用しております 早速質問なのですが Form1にPictureBox1があり、プロパティDockがFillとします このピクチャーボックスの色を赤にして、左上から中心に向かって線を引きたいのですが Public Class Form1 Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint Dim p1XC, p1YC As Integer p1XC = PictureBox1.Width / 2 p1YC = PictureBox1.Height / 2 e.Graphics.Clear(Color.Red) e.Graphics.DrawLine(Pens.Black, 0, 0, p1XC, p1YC) End Sub -------------------------------------------------------------------------------- Private Sub PictureBox1_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles PictureBox1.Resize Dim p1XC, p1YC As Integer p1XC = PictureBox1.Width / 2 p1YC = PictureBox1.Height / 2 Dim g As Graphics = PictureBox1.CreateGraphics g.Clear(Color.Red) g.DrawLine(Pens.Black, 0, 0, p1XC, p1YC) End Sub End Class ↑は、おかしいですよね? eに書いてるのかgに書いているのか・・・ そもそも←の考え方がおかしいのか eの扱いがよくわからないです。 *同じ色だとわからないですが、色違いにすると大きくした時は増えた部分しか書かれてない *ペイントのみにしてしまうとサイズを小さくしたときに中心に線がいかない *リサイズのみだと元の部分しか塗られない こういう場合どうするのがいいのしょうか? 実際はもっと複雑な絵を描きたいので、イベントと描写を分けたいと思っているのですが・・・ どなたかご教示下さい。

  • 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

  • VB2005 コード記述作法

    VBのコード記述作法に自身がなく不安です。 CADのラバーラインのような感じです。 PictureBoxを置いてFormの上下左右にアンカーしてるだけです。 lineモードにXorがないので下記のようにしました。 今は、とりあえず動いてますが、<?>印部分をここに記述しても安定動作しますか? (メモリの無駄使いとか・CPUの負荷とか) 又Form1_Resizeで再描画してますが、Windowを最小化すると当然でしょうが PictureBox1.Image = New Bitmap(PictureBox1.Width, PictureBox1.Height) でエラーになります。 これを防ぐ方法を教えて下さい。 Public Class Form1 Private sx, sy, ex, ey As Integer Private flg As Boolean = False Private fg, bg As Graphics   '----<?>---- Private d(100, 4) As Integer Private po As Integer = 1 '-------------------------------- Private Sub PictureBox1_MouseDown(~~ If flg = False Then sx = e.X sy = e.Y ex = sx ey = sy flg = True fg = PictureBox1.CreateGraphics() '----<?>---- Else flg = False ex = e.X ey = e.Y PictureBox1.Refresh() fg.Dispose() '----<?>---- bg = Graphics.FromImage(PictureBox1.Image) '----<?>---- bg.DrawLine(Pens.Black, sx, sy, ex, ey) bg.Dispose() '----<?>---- PictureBox1.Refresh() d(po, 1) = sx d(po, 2) = sy d(po, 3) = ex d(po, 4) = ey po = po + 1 End If End Sub '-------------------------------- Private Sub PictureBox1_MouseMove(~~ If flg = True Then PictureBox1.Refresh() fg.DrawLine(Pens.Blue, sx, sy, e.X, e.Y) ex = e.X ey = e.Y End If End Sub '-------------------------------- Private Sub Form1_Resize(~~ Dim x As Integer PictureBox1.Image = New Bitmap(PictureBox1.Width, PictureBox1.Height) bg = Graphics.FromImage(PictureBox1.Image) ' ----<?>---- For x = 1 To po - 1 bg.DrawLine(Pens.Black, d(x, 1), d(x, 2), d(x, 3), d(x, 4)) Next bg.Dispose() ' ----<?>---- End Sub '-------------------------------- End Class

専門家に質問してみよう