『HSPの裏技』リストビューを作成してみる ACT-2(HSP2.x 版)をHSP3.x バージョンへ書き換えたものです。
http://chokuto.ifdef.jp/urawaza/listview2.html
LVM_GETITEM の代わりに LVM_GETITEMTEXT を使うなど、一部変更しているところあり。
前のが間違ってたので書き直し
『HSPの裏技』リストビューを作成してみる ACT-2(HSP2.x 版)をHSP3.x バージョンへ書き換えたものです。
http://chokuto.ifdef.jp/urawaza/listview2.html
LVM_GETITEM の代わりに LVM_GETITEMTEXT を使うなど、一部変更しているところあり。
前のが間違ってたので書き直し
;【HSP3.x 移植版】 ;『HSPの裏技』リストビューを作成してみる ACT-2 ; http://chokuto.ifdef.jp/urawaza/listview2.html #module ;============= リストビュー操作モジュール =============== #uselib "comctl32.dll" #func InitCommonControlsEx "InitCommonControlsEx" int ; 各種定数定義 #define ICC_LISTVIEW_CLASSES 4 #define WS_CHILD 0x40000000 #define WS_VISIBLE 0x10000000 #define LVS_REPORT 0x0001 #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 LVNI_SELECTED 0x0002 ; (外部から参照できるように global 指定) #define global LVCFMT_LEFT 0x0000 #define global LVCFMT_RIGHT 0x0001 #define global LVCFMT_CENTER 0x0002 ; リストビュー作成 #deffunc CreateListView int sx, int sy ; コモンコントロールライブラリの初期化 initinfo = 8, ICC_LISTVIEW_CLASSES InitCommonControlsEx varptr(initinfo) ; リストビューの作成 styleFlags = WS_CHILD | WS_VISIBLE | LVS_REPORT winobj "SysListView32", "", 0, styleFlags, sx, sy return ; リストビューに列を追加 #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 textbuf = text ; LVITEM 構造体をセット dim lvitem, 13 lvitem(0) = LVIF_TEXT lvitem(1) = index lvitem(5) = varptr(textbuf) ; 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 #global ;================= モジュール終わり ===================== objsize ginfo_winx / 2, 25 pos 0, 0 button gosub "選択項目の情報表示", *OnShowInfoButtonClicked pos ginfo_winx / 2, 0 button gosub "選択項目削除", *OnDeleteButtonClicked pos 0, 25 CreateListView ginfo_winx, ginfo_winy listviewID = stat InsertListViewColumn listviewID, 0, "名前", LVCFMT_LEFT, 100 InsertListViewColumn listviewID, 1, "読み", LVCFMT_LEFT, 200 InsertListViewItem listviewID, 0, "在原業平" SetListViewItemText listviewID, 0, 1, "ありわらのなりひら" InsertListViewItem listviewID, 1, "僧正遍昭" SetListViewItemText listviewID, 1, 1, "そうじょうへんじょう" InsertListViewItem listviewID, 2, "喜撰法師" SetListViewItemText listviewID, 2, 1, "きせんほうし" InsertListViewItem listviewID, 3, "大伴黒主" SetListViewItemText listviewID, 3, 1, "おおとものくろぬし" InsertListViewItem listviewID, 4, "文屋康秀" SetListViewItemText listviewID, 4, 1, "ふんやのやすひで" InsertListViewItem listviewID, 5, "小野小町" SetListViewItemText listviewID, 5, 1, "おののこまち" stop *OnShowInfoButtonClicked ; 選択されている項目の情報を表示 ; (複数項目が選択されている場合があるので繰り返す) index = -1 repeat index = GetSelectedListViewItem(listviewID, index) if index == -1 : break name = GetListViewItemText(listviewID, index, 0) reading = GetListViewItemText(listviewID, index, 1) message = "Index: " + index + "\nName: " + name + "\nReading: " + reading dialog message, 0, "情報表示" loop return *OnDeleteButtonClicked ; 選択されている項目をリストビューから削除 ; (複数項目が選択されている場合があるので繰り返す) index = -1 repeat index = GetSelectedListViewItem(listviewID, index) if index == -1 : break DeleteListViewItem listviewID, index index-- ; アイテム削除によるインデックスのずれを補正 loop return