DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ピクチャボックスの画像表示

環境/言語:[Win2000 VB.NET]
分類:[.NET]

VB初心者なので、ここのtipsが無かったら始める前に挫折してたでしょう
本当に感謝しています
ところでtipsにある方法のdrawimageの場合、次々と表示していった時に
100*100のイメージ表示→200*200のイメージ表示とした場合、200*200で
あるにもかかわらず100*100の分しか描画されません
(あ、一応表示の前にピクチャボックスは画像サイズに伸縮させてから
表示しました。ピクチャボックスのサイズ自体はちゃんと画像サイズに
変わっています)
もちろん小さいイメージを表示する分には全部表示されるのですが
結局paintイベントの方でやったら解決はしましたが、drawimageの方は
何か解決方法があったのでしょうか
> VB初心者なので、ここのtipsが無かったら始める前に挫折してたでしょう
> 本当に感謝しています

お世辞でもそういっていただけると非常にうれしいです。こちらこそありがとうございます。

> 結局paintイベントの方でやったら解決はしましたが、drawimageの方は
> 何か解決方法があったのでしょうか

Paintイベントの方法と、DrawImageの方法は同じだと思うのですが。PaintイベントハンドラでDrawImageメソッドを使いますよね?
2004/06/23(Wed) 10:17:11 編集(投稿者)

■No4525に返信(管理人さんの記事)
>>VB初心者なので、ここのtipsが無かったら始める前に挫折してたでしょう
>>本当に感謝しています
> > お世辞でもそういっていただけると非常にうれしいです。こちらこそありがとうございます。
> >>結局paintイベントの方でやったら解決はしましたが、drawimageの方は
>>何か解決方法があったのでしょうか
> > Paintイベントの方法と、DrawImageの方法は同じだと思うのですが。PaintイベントハンドラでDrawImageメソッドを使いますよね?

さっそくレスありがとうございます

1つ書き忘れてましたが、別フォームにピクチャボックスだけあって、その
ピクチャボックスへの描画でした

方法1の時はフォーム1からフォーム2のピクチャボックスのグラフィクス
オブジェクトへdrawimageしてましたが、前述の通りだったので
方法2でフォーム2のピクチャボックスのpaintでdrawimage、フォーム1から
ピクチャボックスをInvalidateにしたらOKでした

new bmpでビットマップオブジェクト作ってサイズ取るとちゃんと画像の
サイズになっていたのでピクチャボックスのグラフィクスオブジェクトが
ちゃんと初期化されてないのかな、とも思ったのですが
でも描画の前にピクチャボックスはリサイズしてるし、drawimageもサイズ
指定でやって、ピクチャボックス自体も描画された部分以外は全面背景色
になってるし…とどーも?な状況でした
「前回の描画の領域でクリッピングされたかの様な」状態なんですねぇ…
ずれるかな…
---- -------- -------- ----
|A |→|B |  |→| B  |→|C |
---- |---  | |   | ----
   |   | |   |
   -------- --------
ね、変でしょう?(笑
やっぱズレまくり(汗

一応自己解決しました、ていうかよけい訳わかんなくなりました(笑

creategraphicsとdrawimageの間にmsgbox挟んで止めたらちゃんと描画
しやがります
単にグラフィクスオブジェクト作るのが間に合わなかったっただけですか?

一応サンプルです
http://homepage2.nifty.com/gyo-ren/ss.lzh
http://homepage2.nifty.com/gyo-ren/ss2.lzh
ssはpaint、ss2はdrawimageです
msgbox削ればおかしな動作をするはずです
解決済み!
DrawImageの方法というのは、たぶんCreateGraphicsではじめの一回だけ描画するという方法のようですね。この方法ですと、再描画が必要な時でも再描画されませんので、やはりPaintイベントハンドラで描画すべきでしょう。

> creategraphicsとdrawimageの間にmsgbox挟んで止めたらちゃんと描画
> しやがります
> 単にグラフィクスオブジェクト作るのが間に合わなかったっただけですか?

そうではなく、ピクチャボックスの大きさが変わる前に描画されたなどの原因ではないでしょうか。
レスありがとうございます

■No4590に返信(管理人さんの記事)
> DrawImageの方法というのは、たぶんCreateGraphicsではじめの一回だけ描画するという方法のようですね。この方法ですと、再描画が必要な時でも再描画されませんので、やはりPaintイベントハンドラで描画すべきでしょう。

一応下のルーチンはその都度実行されるのですが…

> > そうではなく、ピクチャボックスの大きさが変わる前に描画されたなどの原因ではないでしょうか。

うーん…
取りあえず関係あるとこだけの抜粋ですが

Dim _g As Graphics = _form2._pic2.CreateGraphics()

_bmp = New Bitmap(_filename)
_size_x = _bmp.Width
_size_y = _bmp.Height

_form2.Width = _mod_size_x
_form2.Height = _mod_size_y
_form2._pic2.Width = _mod_size_x
_form2._pic2.Height = _mod_size_y

_g = _form2._pic2.CreateGraphics()
MsgBox("a") ←コレ!
_g.DrawImage(_bmp, 0, 0, _mod_size_x, _mod_size_y)

_bmp.Dispose()
_g.Dispose()

このメッセージボックスの有無だけで動作が変わるんですよね…(苦笑
2-3秒ウェイトさせてみればいいのかな?
maさん、こんにちは ちと横槍いれさせていただきますm(__)m
> このメッセージボックスの有無だけで動作が変わるんですよね…(苦笑
> 2-3秒ウェイトさせてみればいいのかな?

単にイベントの処理順に起因するものです。
_load_bmpの先頭にDebug.WriteLine("_load_bmp")
Form2の_pic2のPaintイベントにもDebug.WriteLine("Paint")
これで流れをみればわかりますが、MsgBoxをいれてないときには
_load_bmpの後にPaintが処理されてます。 _pic2に自身が再描画を
行えば、当然BackColorでの塗りつぶしとなるわけですよね。

MsgBoxを呼ぶとこの間にPaintが処理され、DrawImageが後になります
ので、絵が後から描画されます。

基本的に描画するオブジェクト自身のPaintイベントで描画は行わないと
再描画のタイミングは取れませんよね?
■No4604に返信(ゆさんの記事)
> > 基本的に描画するオブジェクト自身のPaintイベントで描画は行わないと
> 再描画のタイミングは取れませんよね?

レスありがとうございます
返信遅くなって申し訳ありません
そうですか、やっぱ別フォームからの描画が問題だったんですか
ようやっと納得いきました
ありがとうございました
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板