【HSP3.x 移植版】『HSPの裏技』イメージリストを使ってみる

『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