HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
0402
とあるプログラマ(GDI+) デバイスコンテキスト(ウィンドウ)からBitmapへコピー4解決


とあるプログラマ

リンク

2020/4/2(Thu) 12:51:47|NO.89907

Artlet2D(a2d.hsp)を解析するとalStretchScreenToImage命令は、BMSCR構造体のpBit・pbiを使ってGdipCreateBitmapFromGdiDib関数でBitmapオブジェクトを作っているようですが、これを代わりにデバイスコンテキストなどで実現できないでしょうか。
BMSCR構造体ですとHSP側のスクリーンしか使えない、コントロールやCreateWindowで作ったウィンドウ等で使えないので、デバイスコンテキストからBitmapオブジェクトを作りたいと思っています。

当方BitmapとGraphicsクラスの仕様がイマイチ分かっておらず、もし変な質問でしたら申し訳ないです…



この記事に返信する


あらや

リンク

2020/4/4(Sat) 12:14:31|NO.89952

CreateCompatibleBitmap関数はいかがでしょうか。

CreateCompatibleBitmapで取得したビットマップオブジェクトは
不要になったらDeleteObject関数で消して下さい。



とあるプログラマ

リンク

2020/4/5(Sun) 10:25:30|NO.89963

CreateCompatibleBitmapを使ってHBITMAPを作る方法は思いついていたのですが、恐らくこのHBITMAPは指定のデバイスコンテキストと互換性があるというだけでスクリーンを映したものではないと思うのです。
なので画面コピーを行っても真っ暗な画面になってしまうのです…


#include "gdi32.as" #uselib "gdiplus" #func GdiplusStartup "GdiplusStartup" int, int, int #func GdiplusShutdown "GdiplusShutdown" int #func GdipCreateBitmapFromHBITMAP "GdipCreateBitmapFromHBITMAP" sptr, sptr, sptr #func GdipDisposeImage "GdipDisposeImage" int #func GdipCreateFromHDC "GdipCreateFromHDC" int, int #func GdipDeleteGraphics "GdipDeleteGraphics" int #func GdipDrawImageRectRectI "GdipDrawImageRectRectI" int, int, int, int, int, int, int, int, int, int, int, int, int, int onexit *exit // Delete objects gsi = 1, 0, 0, 0 GdiplusStartup varptr(gdiplusToken), varptr(gsi), 0 if (gdiplusToken == 0) : dialog "GDI+ start up failed" : goto *exit // *** *** // screen 0 (source) // *** *** screen 0 cls 1 mes "Hello World !" // Create hBitmap hBitmap = CreateCompatibleBitmap(hdc, ginfo_winx, ginfo_winy) if (hBitmap == 0) : dialog "Create hBitmap failed" : goto *exit // Create GDI+ Image from hBitmap GdipCreateBitmapFromHBITMAP hBitmap, 0, varptr(srcImage) if (srcImage == 0) : dialog "Create srcImage failed" : goto *exit // *** *** // screen 1 (destination) // *** *** screen 1 // Create dest objects GdipCreateFromHDC hdc, varptr(destGraphics) if (destGraphics == 0) : dialog "Create dest objects failed" // Copy screen 0 Image to screen 1 Graphics #define UnitPixel 2 GdipDrawImageRectRectI destGraphics, srcImage, 0, 0, ginfo_winx, ginfo_winy, 0, 0, ginfo_winx, ginfo_winy, UnitPixel, 0, 0, 0 redraw 1 stop // Delete Objects *exit if (hBitmap) : DeleteObject hBitmap if (srcImage) : GdipDisposeImage srcImage if (destImage) : GdipDisposeImage destImage if (destGraphics) : GdipDeleteGraphics destGraphics if (gdiplusToken) : GdiplusShutdown gdiplusToken end



とあるプログラマ

リンク

2020/4/5(Sun) 10:38:21|NO.89965

すみません。やはり勘違いというか予想通りというか、HBITMAPを作成するだけでは駄目でしたね。

http://chokuto.ifdef.jp/urawaza/api/BitBlt.html
こちらのサイトを見つけて更にCreateCompatibleDCとSelectObject、BitBltをしないといけないことを知りました。
その結果以下のようなコードでGDI+とデバイスコンテキストを使った画面コピーに成功しました。

あらやさんありがとうございます。一人で解決してしまって申し訳ないです…


#include "gdi32.as" #uselib "gdiplus" #func GdiplusStartup "GdiplusStartup" int, int, int #func GdiplusShutdown "GdiplusShutdown" int #func GdipCreateBitmapFromHBITMAP "GdipCreateBitmapFromHBITMAP" sptr, sptr, sptr #func GdipDisposeImage "GdipDisposeImage" int #func GdipCreateFromHDC "GdipCreateFromHDC" int, int #func GdipDeleteGraphics "GdipDeleteGraphics" int #func GdipDrawImageRectRectI "GdipDrawImageRectRectI" int, int, int, int, int, int, int, int, int, int, int, int, int, int onexit *exit // Delete objects gsi = 1, 0, 0, 0 GdiplusStartup varptr(gdiplusToken), varptr(gsi), 0 if (gdiplusToken == 0) : dialog "GDI+ start up failed" : goto *exit // *** *** // screen 0 (source) // *** *** screen 0 cls 1 mes "Hello World !" // Create hBitmap hBitmap = CreateCompatibleBitmap(hdc, ginfo_winx, ginfo_winy) if (hBitmap == 0) : dialog "Create hBitmap failed" : goto *exit // Create hSrcDC hSrcDC = CreateCompatibleDC(hDC) if (hSrcDC == 0) : dialog "Create hSrcDC failed" : goto *exit SelectObject hSrcDC, hBitmap // Associate hSrcDC with hBitmap // Copy screen; hDC to hSrcDC BitBlt hSrcDC, 0, 0, ginfo_winx, ginfo_winy, hDC, 0, 0, 0x00CC0020 // SRCCOPY // Create GDI+ Image from hBitmap GdipCreateBitmapFromHBITMAP hBitmap, 0, varptr(srcImage) if (srcImage == 0) : dialog "Create srcImage failed" : goto *exit // *** *** // screen 1 (destination) // *** *** screen 1 // Create dest objects GdipCreateFromHDC hdc, varptr(destGraphics) if (destGraphics == 0) : dialog "Create dest objects failed" // Copy screen 0 Image to screen 1 Graphics #define UnitPixel 2 GdipDrawImageRectRectI destGraphics, srcImage, 0, 0, ginfo_winx, ginfo_winy, 0, 0, ginfo_winx, ginfo_winy, UnitPixel, 0, 0, 0 redraw 1 stop // Delete Objects *exit if (hBitmap) : DeleteObject hBitmap if (hSrcDC) : DeleteDC hSrcDC if (srcImage) : GdipDisposeImage srcImage if (destImage) : GdipDisposeImage destImage if (destGraphics) : GdipDeleteGraphics destGraphics if (gdiplusToken) : GdiplusShutdown gdiplusToken end



とあるプログラマ

リンク

2020/4/5(Sun) 14:38:30|NO.89970

すみません、URLが間違っていました。正しくはこっちです。
http://chokuto.ifdef.jp/urawaza/bitmapobject.html



ONION software Copyright 1997-2021(c) All rights reserved.