【HSP3.x 移植版】『HSPの裏技』リストビューを作成してみる ACT-2

『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