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

BitBltのトラブルについて

環境/言語:[WinXP,VB.NET,.NET Fra 1.1]
分類:[.NET]

初めて質問します。VB中級車です。よろしくお願いします。

BitBlt関数を使って画像を高速描画しようと考えております。

Picture1.imageにPicture2.imageを描画するプログラムなのですが

Private Sub btnDraw_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles btnDraw.Click

Dim g1 As System.Drawing.Graphics = Picture1.CreateGraphics
Dim g2 As System.Drawing.Graphics = Picture2.CreateGraphics

BitBlt(g1.GetHdc.ToInt32, 0, 0, 50, 50, _
g2.GetHdc.ToInt32, 0, 0, &HCC0020)

End Sub

上記のように打ち込んで、実行するとPicture2のVisibleがTrueのときは成功、
FalseのときはPicture2のある範囲が描画されてしまいます。

Falseにしてもきちんと描画できるようにしたいのですが、
色々と試行錯誤を繰り返しましたが、さっぱり解決しません。
どなたかご教授お願いします。m(_ _)m
> Falseにしてもきちんと描画できるようにしたいのですが、
> 色々と試行錯誤を繰り返しましたが、さっぱり解決しません。

PictureBox.CreateGraphics してたら永遠に無理です。

PictureBox.Image から Graphics.FromImage してましょう。
渋木宏明(ひどり)さん返信ありがとうございます。

CreateGraphicsのところをGraphics.FromImage(Picture1.Image)
にしてやってみましたところ、
描画先のPicture1にはImageが無いためエラーが出て失敗し、
Picture2.CreateGraphicsをGraphics.FromImage(Picture2.Image)
にしたらPicture1が真っ黒になってしまいました。

定数はSRCCOPY(&HCC0020)でBLACKNESS(&H42)じゃ無いはずです。

Picture1.CreateGraphicsのままだからいけないのでしょうか?
Graphics.FromImage(Picture2.Image)自体はいいと思うのですが…

いろいろ調べましたがVB.NETでのBitBlt関連は少ないようです。
VB6は簡単だったのに・・・○| ̄|_

何度もすいませんがよろしくお願いします。m(_ _)m
とりあえずこちらを読まれてはいかがでしょうか?

http://dobon.net/vb/dotnet/graphics/pictureboximageanddrawimage.html
壱丸3さん、ありがとうございます。
この記事は「GDI+」での描画を試みたときにじっくり読ませていただきました。

VB6のときはhdcは直接PictureBoxのimageに指定できたのですが、
NETになるとGetHdcはSystem.Drawing.Graphicsの形しかとらないようで、
PictureBox.ImageのようなSystem.Drawing.Imageは指定できないようです。

ImageからGraphicsに変換する方法は渋木宏明(ひどり)さんより
教えてくださいました、Graphics.FromImageを使えば出来るのですが、
逆のGraphicsからImageに変換する方法が分かりません。
(これが出来なきゃ、出来るわけが無いような気がする・・・)

VB.NETでBitBltを正しく使っているサンプルはありませんかねえ。
(VB.NETでBitBltを使うようなゲームとか作っている人少なすぎる・・・)

いつも、長くなってすいません。泥沼状態です。
よろしくお願いします。
> 逆のGraphicsからImageに変換する方法が分かりません。

まったく別なものですから、変換することは出来ません。

要するに、PictureBox が抱えている Image を、別の PictureBox が抱えている Image に書き出したいんですよね?

であれば、Graphics.FromImage() で作った Graphics に Graphics.DrawImage() すればよろしいんじゃないでしょうか。
> CreateGraphicsのところをGraphics.FromImage(Picture1.Image)
> にしてやってみましたところ、
> 描画先のPicture1にはImageが無いためエラーが出て失敗し、

そりゃ、そうでしょうね。
無ければ new してくださいな。

> いろいろ調べましたがVB.NETでのBitBlt関連は少ないようです。
> VB6は簡単だったのに・・・○| ̄|_

てか、BitBlt にこだわる理由は何でしょう?
Graphics.DrawImage() で十分だったりしませんか?
渋木宏明(ひどり)さん、返信ありがとうございます。

> てか、BitBlt にこだわる理由は何でしょう?
> Graphics.DrawImage() で十分だったりしませんか?

今、VB.NETで2Dの縦スクロールのシューティングを
作ろうとしているのですが、
初めにGraphics.DrawImage()を使って作ったのですが、
描画が遅く、ゲームにならなかったので
BitBltを使うことにしました。

なかなか参考するものが少なく困っています。

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