イメージ元を一時逃避させてから、再び描画させようとするとエラーが...

解決


翔太  2007-09-13 21:12:49  No: 137477

VB2005を使っていて、図形を描いています。
現在、PictureBoxのCreateGraphicsメソッドを使ってGraphicsを作成しており、描画図形がImageプロパティに反映されず、印刷などが出来ません。
(※はじめからBitmapオブジェクトを作成してPictureBoxのImageプロパティからGraphicsオブジェクトを作成しないのには、理由があります。)
そこで、描画したイメージ元を一時的に退避させて、ImageプロパティからGraphicsオブジェクトを作成したものに再び描画させようとしています。

以下が、PictureBox1に描画した後のコードです。

    Dim orgImage As Image
    Dim w,h As Integer
    
    w = PictureBox1.Width
    h = PictureBox1.Height
    orgImage = PictureBox1.Image

    bmp = New Bitmap(w, h)
    PictureBox1.Image = bmp
    g = Graphics.FromImage(PictureBox1.Image)
    g.DrawImage(orgImage, 0, 0, w, h)

しかし、この「g.DrawImage(orgImage, 0, 0, w, h)」でエラーが発生してしまうのです。「値をNull にすることはできません」と返ってきます。
途中にテキストボックスなどを置いてwやhの値を確認してみたのですが、確実に893,568などの数値が返ってきています。
何が原因なのでしょうか?


Hongliang  2007-09-13 21:28:32  No: 137478

普通に Paint イベントで e.Graphics に書けばいい話じゃないですかね。
退避だのどうだの以前に。

というかその「理由」が気になりますが。
Image プロパティ使わないんなら PictureBox 使う意味もありませんし。


翔太  2007-09-14 16:27:30  No: 137479

おっしゃる通り、フォームのLoad上に以下のコードを書き、

    bmp = New Bitmap(PictureBox1.Width, PictureBox1.Height)
    PictureBox1.Image = bmp
    g = Graphics.FromImage(PictureBox1.Image)

はじめからImageプロパティによりGraphicsオブジェクトを作成してみました。

しかし、別に設置したボタンクリック後、描写されるはずの図形が表示されないのです・・・。
一度、Pictureboxを別のウィンドウで隠してから、そのウィンドウを退かすと図形が現れるんです。
この原因は何でしょうか・・・?


魔界の仮面弁士  2007-09-14 18:14:09  No: 137480

PictureBox は、Image の内容が変化したということを知らないため、
再描画の指示が行われないためです。


Invalidate メソッドを呼び出して、再描画が必要であると指示するか、
Update メソッドを呼び出して、強制的に再描画を行わせるか、もしくは、
変化したことを通知するために、Image プロパティを再設定すれば、
図形が現れるでしょう。


翔太  2007-09-14 18:16:14  No: 137481

なるほど・・・。

あと、Refreshメソッドを使って再描画をしてみたら表示されるようになりました。

ありがとうございます。


※作成する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。







   このエントリーをはてなブックマークに追加