dポイントプレゼントキャンペーン実施中!

VisualStudio2010のVBにて、ピクチャーボックスの範囲をプログラム中で大きくして描画をさせたいのですが、ピクチャーボックスのサイズを大きくしても、大きくした範囲には描画がされません。

やり方は↓の方法です。
まず、formにボタンとピクチャーボックスを300×200で配置して、
http://homepage1.nifty.com/rucio/main/dotnet/Sam …
↑のページで書かれてた方法でグラフィックを再描画させています。

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

よろしくお願いします。

「VB PictureBoxの描画範囲」の質問画像

A 回答 (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分の中に入れてもいいですね。
    • good
    • 0
この回答へのお礼

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

解決できました。

お礼日時:2012/11/21 23:54

こんばんは




私はここのサイトで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


間違っていましたらごめんなさい。
    • good
    • 0
この回答へのお礼

すいません。
No.1の回答に付けた補足の通り、1つ目の図形と2つ目の図形の描画は別々にやりたいと思っています。
なので、2回目に押した時にAutoGraphics内のSizeをNewしてしまうと、1つ目の図形が消えてしまいます。

1つ目の図形を消さずに、PictureBox1のサイズを大きくして、2つ目の図形も描画するという方法はありますでしょうか?

お礼日時:2012/11/20 23:55

基本的に Graphics.FromImageで生成したGraphicsオブジェクトの描画範囲は


FromImageの引数の Imageの大きさになります

AutoGraphicsが呼ばれた時点では300x200なので 350,100へ描画命令をしても 範囲外なので描画自体されません

呼び出し順を
PictureBox1.Width = 400
dim g as Graphics = AutoGraphics(PictureBox1)
といった具合するといいと思います
    • good
    • 0
この回答へのお礼

すいません。
質問の仕方が悪かったため、少し変えさせて頂きます。

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回目に押した時にはピクチャーボックスの横幅が広がって、そこに描画をさせたいという場合はどうしたらいいでしょうか?

お礼日時:2012/11/20 23:45

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!