|
|
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
|
|