『HSPの裏技』リストビューでアイコンを使ってみる(HSP2.x 版)をHSP3.x バージョンへ書き換えたものです。
http://chokuto.ifdef.jp/urawaza/lv_icon.html
※このサンプルで読み込まれるビットマップファイル iconlist.bmp は上記URLで公開されているものを使用することを仮定しています。
前のが間違ってたので書き直し
『HSPの裏技』リストビューでアイコンを使ってみる(HSP2.x 版)をHSP3.x バージョンへ書き換えたものです。
http://chokuto.ifdef.jp/urawaza/lv_icon.html
※このサンプルで読み込まれるビットマップファイル iconlist.bmp は上記URLで公開されているものを使用することを仮定しています。
前のが間違ってたので書き直し
;【HSP3.x 移植版】 ;『HSPの裏技』リストビューでアイコンを使ってみる ; http://chokuto.ifdef.jp/urawaza/lv_icon.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 ;############# モジュール終わり ######################## #module ;############ リストビュー操作モジュール ############### #uselib "comctl32.dll" #func InitCommonControlsEx "InitCommonControlsEx" int #uselib "user32.dll" #func SetWindowLong "SetWindowLongA" int,int,int #cfunc GetWindowLong "GetWindowLongA" int,int ; 各種定数定義 #define ICC_LISTVIEW_CLASSES 4 #define WS_CHILD 0x40000000 #define WS_VISIBLE 0x10000000 #define global LVS_ICON 0x0000 #define global LVS_REPORT 0x0001 #define global LVS_SMALLICON 0x0002 #define global LVS_LIST 0x0003 #define LVS_TYPEMASK 0x0003 #define LVM_SETIMAGELIST 0x1003 #define LVM_SETITEM 0x1006 #define LVM_INSERTITEM 0x1007 #define LVM_DELETEITEM 0x1008 #define LVM_INSERTCOLUMN 0x101B #define LVM_GETNEXTITEM 0x100C #define LVM_GETITEMTEXT 0x102D #define LVCF_FMT 0x0001 #define LVCF_WIDTH 0x0002 #define LVCF_TEXT 0x0004 #define LVCF_SUBITEM 0x0008 #define LVIF_TEXT 0x0001 #define LVIF_IMAGE 0x0002 #define LVNI_SELECTED 0x0002 #define LVSIL_NORMAL 0x0000 #define LVSIL_SMALL 0x0001 #define GWL_STYLE (-16) ; (外部から参照できるように global 指定) #define global LVCFMT_LEFT 0x0000 #define global LVCFMT_RIGHT 0x0001 #define global LVCFMT_CENTER 0x0002 ; リストビュー作成 #deffunc CreateListView int sx, int sy, int type, int hLargeImgList, int hSmallImgList ; コモンコントロールライブラリの初期化 initinfo = 8, ICC_LISTVIEW_CLASSES InitCommonControlsEx varptr(initinfo) ; リストビューの作成 styleFlags = WS_CHILD | WS_VISIBLE | type winobj "SysListView32", "", 0, styleFlags, sx, sy newObjID = stat ; イメージリスト(大きいアイコン)の追加 if hLargeImgList { ; LVM_SETIMAGELIST メッセージ送信 sendmsg objinfo_hwnd(newObjID), LVM_SETIMAGELIST, LVSIL_NORMAL, hLargeImgList logmes "LVM_SETIMAGELIST, LVSIL_NORMAL : " + stat } ; イメージリスト(小さいアイコン)の追加 if hSmallImgList { ; LVM_SETIMAGELIST メッセージ送信 sendmsg objinfo_hwnd(newObjID), LVM_SETIMAGELIST, LVSIL_SMALL, hSmallImgList logmes "LVM_SETIMAGELIST, LVSIL_SMALL : " + stat } return newObjID ; リストビューに列を追加 #deffunc InsertListViewColumn int objID, int index, str text, int align, int pixels textbuf = text ; LVCOLUMN 構造体をセット dim lvcolumn, 8 lvcolumn(0) = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM lvcolumn(1) = align lvcolumn(2) = pixels lvcolumn(3) = varptr(textbuf) ; LVM_INSERTCOLUMN メッセージ送信 sendmsg objinfo_hwnd(objID), LVM_INSERTCOLUMN, index, varptr(lvcolumn) return ; リストビューに項目追加 #deffunc InsertListViewItem int objID, int index, str text, int image textbuf = text ; LVITEM 構造体をセット dim lvitem, 13 lvitem(0) = LVIF_TEXT | LVIF_IMAGE lvitem(1) = index lvitem(5) = varptr(textbuf) lvitem(7) = image ; LVM_INSERTITEM メッセージ送信 sendmsg objinfo_hwnd(objID), LVM_INSERTITEM, 0, varptr(lvitem) return ; リストビューの項目またはサブ項目テキスト設定 #deffunc SetListViewItemText int objID, int index, int subitem, str text textbuf = text ; LVITEM 構造体をセット dim lvitem, 13 lvitem(0) = LVIF_TEXT lvitem(1) = index lvitem(2) = subitem lvitem(5) = varptr(textbuf) ; LVM_SETITEM メッセージ送信 sendmsg objinfo_hwnd(objID), LVM_SETITEM, 0, varptr(lvitem) return ; リストビューの項目またはサブ項目テキスト取得 #defcfunc GetListViewItemText int objID, int index, int subitem ; LVITEM 構造体をセット dim lvitem, 13 lvitem(2) = subitem textbufsize = 256 ; 取得できるまでバッファサイズを拡張 repeat sdim textbuf, textbufsize lvitem(5) = varptr(textbuf) lvitem(6) = textbufsize ; LVM_GETITEMTEXT メッセージ送信 sendmsg objinfo_hwnd(objID), LVM_GETITEMTEXT, index, varptr(lvitem) if stat < textbufsize - 1 : break textbufsize *= 2 loop return textbuf ; リストビューの項目削除 #deffunc DeleteListViewItem int objID, int index ; LVM_DELETEITEM メッセージ送信 sendmsg objinfo_hwnd(objID), LVM_DELETEITEM, index, 0 return ; リストビューの選択項目のインデックス取得 #defcfunc GetSelectedListViewItem int objID, int startIndex ; LVM_GETNEXTITEM メッセージ送信 sendmsg objinfo_hwnd(objID), LVM_GETNEXTITEM, startIndex, LVNI_SELECTED return stat ; リストビューの種別を変更 #deffunc SetListViewType int objID, int type ; 現在のウィンドウスタイルを取得 style = GetWindowLong(objinfo_hwnd(objID), GWL_STYLE) ; リストビューの表示形式を変更 style = (style & (-1 ^ LVS_TYPEMASK)) | type ; 新しいウィンドウスタイルを設定 SetWindowLong objinfo_hwnd(objID), GWL_STYLE, style return #global ;############# モジュール終わり ######################## ; ビットマップファイルの読み込み buffer 2,,, 0 ; フルカラーモード picload "iconlist.bmp" ; 大きいアイコン(32×32)イメージリスト作成 hLargeImgList = CreateImageList(32, 32, ILC_COLOR24 | ILC_MASK, 4) AddImageListItem hLargeImgList, 0, 0, 32*4, 32, 0xF0CAA6 ; 小さいアイコン用にイメージを縮小 pos 0, 0 gzoom 16*4, 16, 2, 0, 0, 32*4, 32 ; 小さいアイコン(16×16)イメージリスト作成 hSmallImgList = CreateImageList(16, 16, ILC_COLOR24 | ILC_MASK, 4) AddImageListItem hSmallImgList, 0, 0, 16*4, 16, 0xF0CAA6 gsel 0 objsize ginfo_winx, 25 button gosub "リスト種別変更", *OnChangeListTypeButtonClicked ; リストビュー作成 pos 0, 25 CreateListView ginfo_winx, ginfo_winy, LVS_ICON, hLargeImgList, hSmallImgList listviewID = stat ; 列を追加 InsertListViewColumn listviewID, 0, "名前", LVCFMT_LEFT, 100 InsertListViewColumn listviewID, 1, "読み", LVCFMT_LEFT, 200 ; 項目追加・サブ項目設定 InsertListViewItem listviewID, 0, "在原業平", 0 SetListViewItemText listviewID, 0, 1, "ありわらのなりひら" InsertListViewItem listviewID, 1, "僧正遍昭", 1 SetListViewItemText listviewID, 1, 1, "そうじょうへんじょう" InsertListViewItem listviewID, 2, "喜撰法師", 2 SetListViewItemText listviewID, 2, 1, "きせんほうし" InsertListViewItem listviewID, 3, "大伴黒主", 3 SetListViewItemText listviewID, 3, 1, "おおとものくろぬし" InsertListViewItem listviewID, 4, "文屋康秀", 0 SetListViewItemText listviewID, 4, 1, "ふんやのやすひで" InsertListViewItem listviewID, 5, "小野小町", 1 SetListViewItemText listviewID, 5, 1, "おののこまち" stop *OnChangeListTypeButtonClicked ; リストビューのタイプを変更 type = (type + 1) \ 4 SetListViewType listviewID, type return