『HSPの裏技』イメージリストを使ってみる(HSP2.x 版)をHSP3.x バージョンへ書き換えたものです。
http://chokuto.ifdef.jp/urawaza/imagelist.html
※このサンプルで読み込まれるビットマップファイル iconlist.bmp は上記URLで公開されているものを使用することを仮定しています。
『HSPの裏技』イメージリストを使ってみる(HSP2.x 版)をHSP3.x バージョンへ書き換えたものです。
http://chokuto.ifdef.jp/urawaza/imagelist.html
※このサンプルで読み込まれるビットマップファイル iconlist.bmp は上記URLで公開されているものを使用することを仮定しています。
;【HSP3.x 移植版】
;『HSPの裏技』イメージリストを使ってみる
; http://chokuto.ifdef.jp/urawaza/imagelist.html
; ※ファイル iconlist.bmp は上記URLで公開されているものを使用
;
; [参照]『Advanced HSP』ビットマップオブジェクト
; http://chokuto.ifdef.jp/advanced/bitmapobject.html
#module ;###### ビットマップオブジェクト作成モジュール #########
#uselib "gdi32.dll"
#cfunc CreateCompatibleDC "CreateCompatibleDC" int
#cfunc CreateCompatibleBitmap "CreateCompatibleBitmap" int, int, int
#func SelectObject "SelectObject" int, int
#func BitBlt "BitBlt" int, int, int, int, int, int, int, int, int
#func DeleteDC "DeleteDC" int
#func DeleteObject "DeleteObject" int
#define SRCCOPY 0x00CC0020
; DIBセクションオブジェクト作成
#defcfunc CreateDIB int px, int py, int sx, int sy
; DIBセクションオブジェクト作成
hBitmap = CreateCompatibleBitmap(hdc, sx, sy)
; メモリデバイスコンテキスト作成
hdcMemory = CreateCompatibleDC(hdc)
; ビットマップをデバイスコンテキストに選択
SelectObject hdcMemory, hBitmap
hOldBitmap = stat
; HSPウィンドウからビットマップにイメージをコピー
BitBlt hdcMemory, 0, 0, sx, sy, hdc, px, py, SRCCOPY
; デバイスコンテキストの選択ビットマップを戻す
SelectObject hdcMemory, hOldBitmap
; デバイスコンテキストを削除
DeleteDC hdcMemory
; ビットマップオブジェクト(DIBセクション)のハンドルを返す
return hBitmap
; DIBオブジェクト削除
#deffunc DeleteDIB int hbmp
; ビットマップオブジェクトを削除
DeleteObject hbmp
return
#global ;############# モジュール終わり ########################
#module ;########### イメージリスト操作モジュール ##############
#uselib "comctl32.dll"
#cfunc ImageList_Create "ImageList_Create" int,int,int,int,int
#func ImageList_Destroy "ImageList_Destroy" int
#func ImageList_AddMasked "ImageList_AddMasked" int,int,int
#func ImageList_Draw "ImageList_Draw" int,int,int,int,int,int
#define global ILC_COLOR 0x0000
#define global ILC_COLOR4 0x0004
#define global ILC_COLOR8 0x0018
#define global ILC_COLOR16 0x0010
#define global ILC_COLOR24 0x0018
#define global ILC_COLOR32 0x0020
#define global ILC_COLORDDB 0x00FE
#define global ILC_MASK 0x0001
#define ILD_TRANSPARENT 0x0001
; イメージリスト作成
#defcfunc CreateImageList int sx, int sy, int type, int num
return ImageList_Create(sx, sy, type, num, 0)
; メージリスト破棄
#deffunc DestroyImageList int handle
ImageList_Destroy handle
return
; イメージリストに描画中ウィンドウのイメージ追加
#deffunc AddImageListItem int handle, int cx, int cy, int sx, int sy, int maskColor
; DIB作成
hDIB = CreateDIB(cx, cy, sx, sy)
; ビットマップをイメージリストに追加
ImageList_AddMasked handle, hDIB, maskColor
firstItemIndex = stat
; DIB削除
DeleteDIB hDIB
return firstItemIndex
; イメージリストのイメージ描画
#deffunc DrawImageListItem int handle, int index, int cx, int cy
ImageList_Draw handle, index, hdc, cx, cy, ILD_TRANSPARENT
return
#global ;############# モジュール終わり ########################
; ビットマップファイルの読み込み
buffer 2,,, 0 ; フルカラーモード
picload "iconlist.bmp"
; 24bit DIB イメージリスト作成(マスクなし)
hImgList1 = CreateImageList(32, 32, ILC_COLOR24, 4)
AddImageListItem hImgList1, 0, 0, 32*4, 32
; 24bit DIB イメージリスト作成(マスクあり)
hImgList2 = CreateImageList(32, 32, ILC_COLOR24 | ILC_MASK, 4)
AddImageListItem hImgList2, 0, 0, 32*4, 32, 0xF0CAA6
gsel 0
cls 3 ; いったん塗りつぶし
pos 20, 10 : mes "マスクなし"
repeat 4
DrawImageListItem hImgList1, cnt, 40*cnt+30, 30
loop
pos 20, 80 : mes "マスクあり"
repeat 4
DrawImageListItem hImgList2, cnt, 40*cnt+30, 100
loop
redraw ; redraw は必須
onexit goto *OnExitApp
stop
*OnExitApp
; 終了時の処理(イメージリスト破棄)
DestroyImageList hImgList1
DestroyImageList hImgList2
end