『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