別ウィンドウで消えたグラフィックを再描画するには?

解決


たぬき腹  2004-12-12 19:22:08  No: 118228  IP: [192.*.*.*]

ピクチャーボックスに線等を描いた後、別のウィンドウが前面に来ると、ピクチャーボックスの線が消えてしまいます。単純な線ならpaintイベントで同じ処理をやりなおせば良い、と理解しましたが、例えばマウスで線を引くプログラムを作った場合など、この方法では大変だと思います。何か他に良い方法は無いのでしょうか?はるか昔(VB2.0)は、AutoRedrawを使って簡単に実現できた気がしますが・・・。
初心者質問ですが、よろしくお願いします。

編集 削除
魔界の仮面弁士  2004-12-12 20:55:18  No: 118229  IP: [192.*.*.*]

> はるか昔(VB2.0)は、
今どのバージョンを使っているのかを書かないと…。(^_^;)
まぁ、AutoRedrawが無いと言う事なら、多分VB.NET系でしょうね。

.NETの場合は、
  bmp = New Bitmap(縦, 横)
といった感じで、まずキャンバスとなるBitmapを用意します。
そして、この Bitmap に対して、
  Dim g As Graphics = Graphics.FromImage(bmp)
として、ここに描画します。

これをImageプロパティに割り当てれば、描画内容が消える事は無いでしょう。
(旧VBのAutoRedrawも、内部的には同様の処理が行われています)

編集 削除
魔界の仮面弁士  2004-12-12 21:01:51  No: 118230  IP: [192.*.*.*]

あ゛…逆だ。(^^;)

サイズの指定は、
  bmp = New Bitmap(幅, 高さ)
ですね。

編集 削除
たぬき腹  2004-12-12 22:49:04  No: 118231  IP: [192.*.*.*]

アドバイス、ありがとうございました!
それと、ご推察のとおり、.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

編集 削除
魔界の仮面弁士  2004-12-13 00:56:20  No: 118232  IP: [192.*.*.*]

> アドバイスを基に試しにプログラムを作ってみたのですが、私の理解が浅く、うまく動きませんでした(下の Test1())。
私の書いた、
》 これをImageプロパティに割り当てれば、
が実行されていませんよね、Test1では。
Test2では、最初の1行目で実行されていますけれども…。

それと、Test1にもTest2にも言えることですが、作成したオブジェクトは、
使い終わったらDisposeメソッドをよんで破棄する必要があります。

Disposeメソッドは、Windowsによって割り当てられた資源を、
明示的に解放する役割を持ちます。このメソッドを持っているクラスは、
使用後、最後に必ずDisposeするようにしてください。

つまりどちらも、最後に g.Dispose() が必要という事です。
Test1の方は、myPenのDisposeも必要ですね。


ただし今回の場合、BitmapはDisposeしてはいけませんので、その点はご注意を。
(PictureBox1.Imageが使用中のオブジェクトを捨ててしまう事になりますからね)

編集 削除
たぬき腹  2004-12-19 18:44:14  No: 118233  IP: [192.*.*.*]

すいません。ずいぶん返答が遅れてしまいました。

》 これをImageプロパティに割り当てれば、
なるほど、だいぶ分かってきた気がします。

>最後に必ずDisposeするようにしてください。
これもまた、今までの私の頭にはない考え方ですね。
ヘルプを読んでみましたが、まさかリソースと言う言葉が出てくるとは・・・。

しかし、Visual Basicの勉強を数年ぶりに再開しましたが、ここまでビギナーにつらい言語だったかな?と戸惑っています。ヘルプを読んでも正直ほとんど意味が分かりません。今回の件も、ヘルプだけでは当分理解できなかったことでしょう。
どうもありがとうございました!

編集 削除