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などの数値が返ってきています。
何が原因なのでしょうか?
普通に Paint イベントで e.Graphics に書けばいい話じゃないですかね。
退避だのどうだの以前に。
というかその「理由」が気になりますが。
Image プロパティ使わないんなら PictureBox 使う意味もありませんし。
おっしゃる通り、フォームのLoad上に以下のコードを書き、
bmp = New Bitmap(PictureBox1.Width, PictureBox1.Height)
PictureBox1.Image = bmp
g = Graphics.FromImage(PictureBox1.Image)
はじめからImageプロパティによりGraphicsオブジェクトを作成してみました。
しかし、別に設置したボタンクリック後、描写されるはずの図形が表示されないのです・・・。
一度、Pictureboxを別のウィンドウで隠してから、そのウィンドウを退かすと図形が現れるんです。
この原因は何でしょうか・・・?
PictureBox は、Image の内容が変化したということを知らないため、
再描画の指示が行われないためです。
Invalidate メソッドを呼び出して、再描画が必要であると指示するか、
Update メソッドを呼び出して、強制的に再描画を行わせるか、もしくは、
変化したことを通知するために、Image プロパティを再設定すれば、
図形が現れるでしょう。
なるほど・・・。
あと、Refreshメソッドを使って再描画をしてみたら表示されるようになりました。
ありがとうございます。
| ツイート |
|