VB PictureBoxの描画範囲を拡大して描画させる方法

このQ&Aのポイント
  • VisualStudio2010のVBにて、ピクチャーボックスの範囲をプログラム中で大きくしても描画がされない場合の対処方法です。
  • ピクチャーボックスのサイズを大きくした場合、拡大した範囲に描画するには特定の手順が必要です。
  • 具体的な手順としては、グラフィックオブジェクトを取得し、座標を指定して図形を描画することで拡大後の範囲にも描画することができます。
回答を見る
  • ベストアンサー

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つ目の図形は描画されていません。 ピクチャーボックスの範囲を大きくした所にも描画をさせたいと思っています。 よろしくお願いします。

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

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

お返事有難うございます。 修正してみましたので参考にしてください。 1.1回目のボタンクリックで画像2(relief001の画像です)のように表示します。 但しrelief001 さんの補足情報をから推測すると、1回目のボタンクリックではPictureBoxの大きさは小さいままだと思いますので、PictureBoxを大きくする動作はしていません。 2.2回目のボタンクリックで画像3(relief001の画像です)のように表示します。 PictureBoxを大きくします。 「1つ目の図形を消さずに、PictureBox1のサイズを大きくして、2つ目の図形も描画します」 3.3回目のボタンクリックで画像1(relief001の画像です)のように表示します。 PictureBoxを初期の何も無い状態に戻します。 コードを変更しました。 Public Class Form1 Dim i As Integer Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click i += 1 Dim g As Graphics = PictureBox1.CreateGraphics '1回目のボタンクリックで画像2のように表示します If i = 1 Then g.FillRectangle(Brushes.Black, 100, 100, 10, 10) '1つ目の図形 '2回目のボタンクリックで画像3のように表示します ElseIf i = 2 Then Dim gr As Graphics = AutoGraphics(PictureBox1) gr.FillRectangle(Brushes.Black, 100, 100, 10, 10) '1つ目の図形 gr.FillRectangle(Brushes.Black, 350, 100, 10, 10) '2つ目の図形 gr.Dispose() End If '3回目のボタンクリックで画像1のように表示します 'PictureBoxを初期の何も無い状態に戻す必要の無い場合は下記のコードは消してください If i > 2 Then i = 0 If Not (PictureBox1.Image Is Nothing) Then ' PictureBox1を初期の状態にします PictureBox1.Size = New Size(200, 200) 'ここの値はrelief001 さんの目的の値にしてください。 PictureBox1.Image.Dispose() PictureBox1.Image = Nothing End If End If g.Dispose() End Sub Public Function AutoGraphics(ByVal picSource As PictureBox) As Graphics If picSource.Image Is Nothing Then 'PictureBox1のSizeをNewする PictureBox1.Size = New Size(400, PictureBox1.Height) picSource.Image = New Bitmap(PictureBox1.Width, PictureBox1.Height) End If Return Graphics.FromImage(picSource.Image) End Function End Class Dim g As Graphics = PictureBox1.CreateGraphicsはIf分の中に入れてもいいですね。

relief001
質問者

お礼

ありがとうございます。 2回目のボタンを押した時に、2つ目の図形と一緒に1つ目の図形も描画すればいいのですね。 解決できました。

その他の回答 (2)

回答No.2

こんばんは 私はここのサイトでVBの学習をしました。 わかりやすいサイトですが、掲示板は喧嘩が多いので利用していません。 FunctionのAutoGraphicsメソッドでPictureBox1のサイズがBitmapされますので、AutoGraphics内でPictureBox1のSizeをNewすればいいと思います。 サンプルです 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) 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 'PictureBox1のSizeをNewする PictureBox1.Size = New Size(400, PictureBox1.Height) picSource.Image = New Bitmap(PictureBox1.Width, PictureBox1.Height) End If Return Graphics.FromImage(picSource.Image) End Function End Class 間違っていましたらごめんなさい。

relief001
質問者

お礼

すいません。 No.1の回答に付けた補足の通り、1つ目の図形と2つ目の図形の描画は別々にやりたいと思っています。 なので、2回目に押した時にAutoGraphics内のSizeをNewしてしまうと、1つ目の図形が消えてしまいます。 1つ目の図形を消さずに、PictureBox1のサイズを大きくして、2つ目の図形も描画するという方法はありますでしょうか?

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

基本的に Graphics.FromImageで生成したGraphicsオブジェクトの描画範囲は FromImageの引数の Imageの大きさになります AutoGraphicsが呼ばれた時点では300x200なので 350,100へ描画命令をしても 範囲外なので描画自体されません 呼び出し順を PictureBox1.Width = 400 dim g as Graphics = AutoGraphics(PictureBox1) といった具合するといいと思います

relief001
質問者

お礼

すいません。 質問の仕方が悪かったため、少し変えさせて頂きます。 Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click i = i + 1 Dim g As Graphics = AutoGraphics(PictureBox1) If i = 1 Then g.FillRectangle(Brushes.Black, 100, 100, 10, 10) '1つ目の図形 End If If i = 2 Then PictureBox1.Width = 400 g.FillRectangle(Brushes.Black, 350, 100, 10, 10) '2つ目の図形 End If g.Dispose() End Sub 上記のように、1回目にボタンを押すと1つ目の図形が表示されて、2回目に押した時にはピクチャーボックスの横幅が広がって、そこに描画をさせたいという場合はどうしたらいいでしょうか?

関連するQ&A

  • 描画した後での塗りるぶし 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で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の場合でも上手くいきます。 お手数ですが、ご回答の程、よろしくお願いします。

  • C# PictureBoxへの描画を行うとメッセージボックスが表示されません。

    いつもお世話になっております。 ふと、PictureBoxに描画をしてみようかと思い Paintイベントに以下のようにして描画を行いました。   myBitmap = new Bitmap(pictureBox1.Width, pictureBox1.Height);   Graphics g = Graphics.FromImage(myBitmap);   pictureBox1.Image = myBitmap;      ・      ・(g.FillRectangle(・・・);など)      ・ (myBitmapはBitmap型のグローバル変数です。) PictureBoxは、自由にサイズ変更可能なフォームに貼り付け、四方をanchorで固めています。 そのためサイズが変更されるたびに、描画するときBitmapのサイズも変更しないといけないので この処理を毎回通っています。 (その部分が何だか無駄な気がするのですが、他にいい方法が思いつきませんでした。) ところが、描画はうまくいったのですが、メッセージボックスを出すと そのメッセージボックスが一度Altキーを押さないと表示されません。 色々調べて、ダブルバッファリングというものがあると知りました。 そこでPaintイベントで最初にこの処理をし   Image image = new Bitmap(pictureBox1.Width, pictureBox1.Height);   g = Graphics.FromImage(image); gに描画し終わってから   e.Graphics.DrawImage(image, 0, 0); としてみると、今度はフォームを移動するのにも一瞬フリーズするようになってしまいました。 (あまり深くプログラミングをしたことがないので、理解しきれなくてやり方が悪いのかも知れません・・・) メッセージボックスが表示されないのは、PictureBoxの描画のため 他のコントロールの描画ができていなためだと推測しているのですが どう直していいかわかりません。 どなたか、わかる方がいましたらよろしくお願いします。 <補足> OS:Vista VisualStudio2008 .NET Framework3.5

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

  • 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) が消えてしまう原因だとおもって宣言場所を変えてみましたが同じです 逆にこれが無いと描画させることが出来なくなります。 これの意味も今ひとつ判りません よろしくお願い致します

  • グラフィック描画中にボタンが使えない

    よろしくお願いします。 Visual Basic 2010です。 ピクチャーボックスに、黒で四角を書いて、白で四角を書いて消すと言うことを始点を移動しながら黒の四角が移動していくように作りました。 これを実行している間にボタンをクリックして止めようと思うのですが、ボタンをクリックしてもボタンのハンドラーが実行されません。 どのようにしたらいいのでしょうか? 描画部分のみを記述します。 Dim g As Graphics = Me.PictureBox1.CreateGraphics() For j = 1 to 20000 For i = 1 to 1000 StartBlack = i + 50 Startwhite = i g.FillRectangle(Brushes.Black, StartBlack, 0, 50, 500) g.FillRectangle(Brushes.White, Startwhite, 0, 50, 500) ' ゆっくり動かすための時間稼ぎです。 For k = 1 to 2000 b = k ^ 100 Next Next Next

  • VB.NET ピクチャーボックスのImageの一部をクリップボードにコピー

    Picturebox1.Image = New Bitmap(Picturebox1.Width, Picturebox1.Height) Dim g As Graphics = Graphics.FromImage(Picturebox1.Image) これ以降 g.DrawLine 等で描画を行っています そして、ピクチャーボックスの一部の領域(矩形)を指定して クリップボードにコピーしたいのですがどうしたらいいでしょうか よろしくお願いします 他のピクチャーボックスにその一部をコピーできるだけでもいいのですが

  • VB2010 でのPictureboxのフォント指定

    VB2010 でのPictureboxのフォント指定 現在 Pictureboxのフォントをプログラムの先頭で定義しているのですが、 '------------------------------------------------------------------------- Dim fnt As New Font("MS ゴシック", 9) With PictureBox1 .Image = New Bitmap(.Size.Width, .Size.Height) g1 = Graphics.FromImage(.Image) g1.Clear(.BackColor) End With g1.DrawString("TEST" fnt, Brushes.Black, IX,IY) '------------------------------------------------------------------------- 下記のようにループ内で指定したいのですが、どう定義すればいいでしょうか。 For i=1 to 10 <------------------------ここでfont指定したい g1.DrawString("TEST" fnt, Brushes.Black, IX,IY) next

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

専門家に質問してみよう