ピクチャーボックスに線等を描いた後、別のウィンドウが前面に来ると、ピクチャーボックスの線が消えてしまいます。単純な線ならpaintイベントで同じ処理をやりなおせば良い、と理解しましたが、例えばマウスで線を引くプログラムを作った場合など、この方法では大変だと思います。何か他に良い方法は無いのでしょうか?はるか昔(VB2.0)は、AutoRedrawを使って簡単に実現できた気がしますが・・・。
初心者質問ですが、よろしくお願いします。
> はるか昔(VB2.0)は、
今どのバージョンを使っているのかを書かないと…。(^_^;)
まぁ、AutoRedrawが無いと言う事なら、多分VB.NET系でしょうね。
.NETの場合は、
bmp = New Bitmap(縦, 横)
といった感じで、まずキャンバスとなるBitmapを用意します。
そして、この Bitmap に対して、
Dim g As Graphics = Graphics.FromImage(bmp)
として、ここに描画します。
これをImageプロパティに割り当てれば、描画内容が消える事は無いでしょう。
(旧VBのAutoRedrawも、内部的には同様の処理が行われています)
あ゛…逆だ。(^^;)
サイズの指定は、
bmp = New Bitmap(幅, 高さ)
ですね。
アドバイス、ありがとうございました!
それと、ご推察のとおり、.NETでした(失礼しました)。
アドバイスを基に試しにプログラムを作ってみたのですが、私の理解が浅く、うまく動きませんでした(下の Test1())。
ですが、アドバス頂いたキーワードを基にHPを検索してみると
http://dobon.net/vb/dotnet/graphics/pictureboximageanddrawimage.html
のページに情報が見つかりました。これを基に書いたのが、下のTest2()ですが、一応動いてくれました。
正直まだ内容を全然理解できていないので、何でTest1()がうまく動かず、Test2()がうまく動くのか理解できませんが、とりあえず勉強の取っ掛かりは得られました。
本当にどうもありがとうございました。
(もし気が向いたら、Test1()の添削をしていただけると幸いです)
Sub Test1()
Dim bmp As Image
Dim myPen As Pen
bmp = New Bitmap(300, 300)
Dim g As Graphics = Graphics.FromImage(bmp)
g.FillPie(Brushes.Red, 50, 50, 200, 200, 0, 360)
End Sub
Sub Test2()
PictureBox1.Image = New Bitmap(300, 300)
Dim g As Graphics = Graphics.FromImage(PBox1.Image)
g.FillPie(Brushes.Red, 50, 50, 200, 200, 0, 360)
End Sub
> アドバイスを基に試しにプログラムを作ってみたのですが、私の理解が浅く、うまく動きませんでした(下の Test1())。
私の書いた、
》 これをImageプロパティに割り当てれば、
が実行されていませんよね、Test1では。
Test2では、最初の1行目で実行されていますけれども…。
それと、Test1にもTest2にも言えることですが、作成したオブジェクトは、
使い終わったらDisposeメソッドをよんで破棄する必要があります。
Disposeメソッドは、Windowsによって割り当てられた資源を、
明示的に解放する役割を持ちます。このメソッドを持っているクラスは、
使用後、最後に必ずDisposeするようにしてください。
つまりどちらも、最後に g.Dispose() が必要という事です。
Test1の方は、myPenのDisposeも必要ですね。
ただし今回の場合、BitmapはDisposeしてはいけませんので、その点はご注意を。
(PictureBox1.Imageが使用中のオブジェクトを捨ててしまう事になりますからね)
すいません。ずいぶん返答が遅れてしまいました。
》 これをImageプロパティに割り当てれば、
なるほど、だいぶ分かってきた気がします。
>最後に必ずDisposeするようにしてください。
これもまた、今までの私の頭にはない考え方ですね。
ヘルプを読んでみましたが、まさかリソースと言う言葉が出てくるとは・・・。
しかし、Visual Basicの勉強を数年ぶりに再開しましたが、ここまでビギナーにつらい言語だったかな?と戸惑っています。ヘルプを読んでも正直ほとんど意味が分かりません。今回の件も、ヘルプだけでは当分理解できなかったことでしょう。
どうもありがとうございました!