- PR -

bmp画像の表示で

投稿者投稿内容
ボビン
常連さん
会議室デビュー日: 2007/02/05
投稿数: 45
投稿日時: 2009-03-06 11:03
こんにちは、ボビンと申します。

bmp画像を切り取りたく、Graphicsオブジェクトについて勉強しています。
bmpをPictureBox1に表示させるコードを二通り試しているのですが、
表示される方法と表示されない方法があります。
表示されない方法も動きそうではあるのですが、
は何が悪いのかわからず困っています。

よろしければご指摘いただけると助かります。

コード:
        ' 【表示されるコード】
        ' FileStream を開く
        Dim hStream As System.IO.FileStream = New System.IO.FileStream("c:/map.bmp", IO.FileMode.Open)
        Me.PictureBox1.Image = Image.FromStream(hStream)


        ' 【表示されないコード】
        Dim bmp As Bitmap = New Bitmap("c:/map.bmp")
        Dim g As Graphics = PictureBox1.CreateGraphics()
        ' 描画
        g.DrawImage(bmp, 10, 10, 300, 300)
        ' 破棄
        bmp.Dispose()
        g.Dispose()


環境はwinxp、VB2005 SP1です。
よろしくお願いします。
セラフ
ベテラン
会議室デビュー日: 2005/12/01
投稿数: 95
お住まい・勤務地: 東北の顔の形といえば
投稿日時: 2009-03-06 12:18
こんにちは

g.Dispose()

が原因だと思われます。
せっかく描画したデータが、Disposeで消されてしまっているのだと思います。
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2009-03-06 12:27
こんにちは。

引用:

セラフさんの書き込み (2009-03-06 12:18) より:
こんにちは

g.Dispose()

が原因だと思われます。
せっかく描画したデータが、Disposeで消されてしまっているのだと思います。



ん?
単純にForm.Loadイベントなんかで記述しているからじゃないですか?

参照元記事にあるように、
描画するのは基本的にPaintイベントで行いましょう。
ボビン
常連さん
会議室デビュー日: 2007/02/05
投稿数: 45
投稿日時: 2009-03-06 13:10
セラフさん、お返事ありがとうございます。
'g.Dispose()
試してみたのですが、残念ながら表示されません。。

Tdnr_Symさん、お返事ありがとうございます。
Paintイベントによる描画はできるのですが、
参照元記事では、
「Paintイベントによる方法が使えない場合は、こちらの方法となります。」
とありまして、それがこのコードです。
コード:
Dim _bmp As Bitmap =  New Bitmap("C:\\\\Blue hills.jpg")

'PictureBox1のGraphicsオブジェクトの作成
Dim g As Graphics =  PictureBox1.CreateGraphics() 
'画像の描画
g.DrawImage(_bmp, 60, 10, _bmp.Width, _bmp.Height)
'BitmapとGraphicsオブジェクトを破棄
_bmp.Dispose()
g.Dispose()


特に間違いはなさそうですので、表示できない原因が知りたくて
投稿しました。
イベントはおっしゃる通りPaintではなくフォームロードでやっております。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2009-03-06 13:17
引用:

ボビンさんの書き込み (2009-03-06 13:10) より:

イベントはおっしゃる通りPaintではなくフォームロードでやっております。


たとえば Button.Click イベントなんかでやってみてください。 百聞は一見に(ry

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ボビン
常連さん
会議室デビュー日: 2007/02/05
投稿数: 45
投稿日時: 2009-03-06 13:20
あ、じゃんぬねっとさん、失礼しました。
かぶってしまいました。ありがとうございます。

はい、ボタンクリックイベントで無事に表示できました。
理由はご存知でしょうか?

[ メッセージ編集済み 編集者: ボビン 編集日時 2009-03-06 13:26 ]
武史
ベテラン
会議室デビュー日: 2007/09/21
投稿数: 71
投稿日時: 2009-03-06 13:29
じゃんぬねっとさんのおっしゃるようにして、
それぞれで描いたあとに、他のウィンドウを手前に
持ってきて隠してから、再度該当ウィンドウを手前に
表示してみてください。


その後で、下記を理解しようとしてみてください。

Load 処理の後で、画面の描画( Paint イベント )が行われます。

Windows の Window が裏に隠れた後に、表に出てきた時の処理は、
隠れた時に保存された画像が表示されるのでなく、
アプリケーションで再描画( Paint イベント )が行われます。

Paint イベント以外で描いたものは、Paint イベントで消えてしまいます。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2009-03-06 13:31
引用:

ボビンさんの書き込み (2009-03-06 13:20) より:

はい、ボタンクリックイベントで無事に表示できました。
理由はご存知でしょうか?


Button.Click イベントで PictureBox に画像を表示させた後、PictureBox の画像が半分隠れるまでデスクトップの領域外にウィンドウを移動させてみてください。 その後、ウィンドウをデスクトップの領域内に戻してみてください。 再描画はされますか?

「Load イベントだから」 というよりは 「再描画されないから」 と考えてみてください。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

スキルアップ/キャリアアップ(JOB@IT)