『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, hBitmaphOldBitmap = 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 hbmpreturn#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 numreturn ImageList_Create(sx, sy, type, num, 0); メージリスト破棄#deffunc DestroyImageList int handleImageList_Destroy handlereturn; イメージリストに描画中ウィンドウのイメージ追加#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, maskColorfirstItemIndex = stat; DIB削除DeleteDIB hDIBreturn firstItemIndex; イメージリストのイメージ描画#deffunc DrawImageListItem int handle, int index, int cx, int cyImageList_Draw handle, index, hdc, cx, cy, ILD_TRANSPARENTreturn#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_CLASSESInitCommonControlsEx varptr(initinfo); リストビューの作成styleFlags = WS_CHILD | WS_VISIBLE | typewinobj "SysListView32", "", 0, styleFlags, sx, synewObjID = stat; イメージリスト(大きいアイコン)の追加if hLargeImgList {; LVM_SETIMAGELIST メッセージ送信sendmsg objinfo_hwnd(newObjID), LVM_SETIMAGELIST, LVSIL_NORMAL, hLargeImgListlogmes "LVM_SETIMAGELIST, LVSIL_NORMAL : " + stat}; イメージリスト(小さいアイコン)の追加if hSmallImgList {; LVM_SETIMAGELIST メッセージ送信sendmsg objinfo_hwnd(newObjID), LVM_SETIMAGELIST, LVSIL_SMALL, hSmallImgListlogmes "LVM_SETIMAGELIST, LVSIL_SMALL : " + stat}return newObjID; リストビューに列を追加#deffunc InsertListViewColumn int objID, int index, str text, int align, int pixelstextbuf = text; LVCOLUMN 構造体をセットdim lvcolumn, 8lvcolumn(0) = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEMlvcolumn(1) = alignlvcolumn(2) = pixelslvcolumn(3) = varptr(textbuf); LVM_INSERTCOLUMN メッセージ送信sendmsg objinfo_hwnd(objID), LVM_INSERTCOLUMN, index, varptr(lvcolumn)return; リストビューに項目追加#deffunc InsertListViewItem int objID, int index, str text, int imagetextbuf = text; LVITEM 構造体をセットdim lvitem, 13lvitem(0) = LVIF_TEXT | LVIF_IMAGElvitem(1) = indexlvitem(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 texttextbuf = text; LVITEM 構造体をセットdim lvitem, 13lvitem(0) = LVIF_TEXTlvitem(1) = indexlvitem(2) = subitemlvitem(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, 13lvitem(2) = subitemtextbufsize = 256; 取得できるまでバッファサイズを拡張repeatsdim textbuf, textbufsizelvitem(5) = varptr(textbuf)lvitem(6) = textbufsize; LVM_GETITEMTEXT メッセージ送信sendmsg objinfo_hwnd(objID), LVM_GETITEMTEXT, index, varptr(lvitem)if stat < textbufsize - 1 : breaktextbufsize *= 2loopreturn textbuf; リストビューの項目削除#deffunc DeleteListViewItem int objID, int index; LVM_DELETEITEM メッセージ送信sendmsg objinfo_hwnd(objID), LVM_DELETEITEM, index, 0return; リストビューの選択項目のインデックス取得#defcfunc GetSelectedListViewItem int objID, int startIndex; LVM_GETNEXTITEM メッセージ送信sendmsg objinfo_hwnd(objID), LVM_GETNEXTITEM, startIndex, LVNI_SELECTEDreturn 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, stylereturn#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, 0gzoom 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, 0xF0CAA6gsel 0objsize ginfo_winx, 25button gosub "リスト種別変更", *OnChangeListTypeButtonClicked; リストビュー作成pos 0, 25CreateListView ginfo_winx, ginfo_winy, LVS_ICON, hLargeImgList, hSmallImgListlistviewID = stat; 列を追加InsertListViewColumn listviewID, 0, "名前", LVCFMT_LEFT, 100InsertListViewColumn listviewID, 1, "読み", LVCFMT_LEFT, 200; 項目追加・サブ項目設定InsertListViewItem listviewID, 0, "在原業平", 0SetListViewItemText listviewID, 0, 1, "ありわらのなりひら"InsertListViewItem listviewID, 1, "僧正遍昭", 1SetListViewItemText listviewID, 1, 1, "そうじょうへんじょう"InsertListViewItem listviewID, 2, "喜撰法師", 2SetListViewItemText listviewID, 2, 1, "きせんほうし"InsertListViewItem listviewID, 3, "大伴黒主", 3SetListViewItemText listviewID, 3, 1, "おおとものくろぬし"InsertListViewItem listviewID, 4, "文屋康秀", 0SetListViewItemText listviewID, 4, 1, "ふんやのやすひで"InsertListViewItem listviewID, 5, "小野小町", 1SetListViewItemText listviewID, 5, 1, "おののこまち"stop*OnChangeListTypeButtonClicked; リストビューのタイプを変更type = (type + 1) \ 4SetListViewType listviewID, typereturn