こんにちわ。
BitBltが使いたいだけなら、GDIのお作法にそって好きなだけビットマップ作って描画し、
その後にbuhioさんがおっしゃられるようにcelbitmapでVRAM転送すれば良いのではないでしょうか?
BitBltのhdcには自分で作ったビットマップを指定すればよろしいかと思います。
皆さんおっしゃられるようにあまり利点は無さそうですがGDIの機能が使いたいのであれば
良いかもしれませんが、ある程度は基本命令で事足りそうかと思いました。
※ちょっと手間は多くかかるかもですね。。。
よろしかったらどうぞ
#uselib "user32.dll"
#cfunc GetDC "GetDC" sptr
#func ReleaseDC "ReleaseDC" sptr, sptr
#uselib "gdi32.dll"
#cfunc SelectObject "SelectObject" sptr, sptr
#cfunc CreateCompatibleDC "CreateCompatibleDC" sptr
#cfunc CreateBitmap "CreateBitmap" sptr, sptr, sptr, sptr, sptr
#func GetBitmapBits "GetBitmapBits" sptr, sptr, sptr
#func DeleteDC "DeleteDC" sptr
#func DeleteObject "DeleteObject" sptr
#func BitBlt "BitBlt" sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr
#func Rectangle "Rectangle" sptr, sptr, sptr, sptr, sptr
#include "hsp3dish.as"
screen 0, 512, 512
buffer 1,128, 128, screen_offscreen: gsel 0 ; ビットマップ転送用のバッファー
; ビットマップ1
_hdc = GetDC(hwnd) ; ウインドウのデバイスコンテキストを取得
hdcm = CreateCompatibleDC(_hdc) ; メモリデバイスコンテキストを作成(ビットマップを使う為)
hbmp = CreateBitmap(128, 128, 1, 32, 0) ; 空のビットマップオブジェクト作成
hold = SelectObject(hdcm, hbmp) ; メモリDCにビットマップをセット
; ビットマップ2
dim bmp, 128*128 : foreach bmp : bmp.cnt = cnt*2 : loop ; 適当なビットマップ配列
hdcm2 = CreateCompatibleDC(_hdc)
hbmp2 = CreateBitmap(128, 128, 1, 32, varptr(bmp)) ; 適当なビットマップ配列からビットマップ作成
hold2 = SelectObject(hdcm2, hbmp2)
onexit *EXIT
*MAIN
redraw 0
color 255,255,255 : boxf
; ★hgimg4での描画
x = 0,512,512,0: y = 0,0,512,512: c = $ff0000,$ffff00,$00ff00,$0000ff: gsquare -257,x,y,c
; ★gdiでの描画
; ビットマップ2をビットマップ1にBitBlt転送
BitBlt hdcm, 0, 0, 128, 128, hdcm2, 0, 0, 0xCC0020/*SRCCOPY*/
; ビットマップ1に直接矩形を書き込む
s = 64-time\64, 64+time\64 : Rectangle hdcm, s.0,s.0,s.1,s.1
; ビットマップ1をバッファーにコピーする
GetBitmapBits hbmp, varsize(bmp), varptr(bmp)
; バッファーを描画
celbitmap 1,bmp : pos 192,192 : celput 1
; 更新
redraw 1 : await 16 : time++
goto *MAIN
*EXIT ; 不要な物を削除
DeleteObject hbmp : DeleteDC hdcm
DeleteObject hbmp2 : DeleteDC hdcm2
ReleaseDC hwnd, _hdc
end