今回はツリービューコントロールのアイテムの削除や、現在選択されているアイテムの取得を行なってみましょう。
ツリービューで現在選択されているアイテムを取得するには、ツリービューに TVM_GETNEXTITEM メッセージを送信します。
#define TVM_GETNEXTITEM 0x110A
TVM_GETNEXTITEM
wParam = flag;
lParam = hitem;
このメッセージは、指定されたアイテムに対して、指定された関係を持っているアイテムを取得するためのもので、例えば、このメッセージを繰り返し送信することで、リストビューコントロールが持つすべてのアイテムを取得することなどもできるようになっています。
flag パラメータには、hitem パラメータで指定されるアイテムとどのようなアイテムを取得するのかを指定します。今回は選択されているアイテムを取得するので、 9 (TVGN_CARET) を指定します。
hitem パラメータにはアイテムハンドルを指定するのですが、選択されているアイテムを取得する場合には 0 (NULL) を指定しておきます。
ツリービューが持つアイテムを削除するには、ツリービューに TVM_DELETEITEM メッセージを送信します。
#define TVM_DELETEITEM 0x1101
TVM_DELETEITEM
wParam = 0;
lParam = hitem;
hitem パラメータには、削除するアイテムのハンドルを指定します。このとき、指定されたアイテムが持っている子アイテムもすべて削除されます。また、このパラメータに 0xFFFF0000 (TVI_ROOT) を指定すると、ツリービューが持つすべてのアイテムが削除されます。
さて、実際にスクリプトを書いてみます。今回使用する画像は前回と同じものです。
(treeicon.bmp)
#include "llmod.as"
#module ;###### ビットマップオブジェクト作成モジュール #########
;===============================================================
; 描画中ウィンドウのイメージからビットマップオブジェクト(DIB)作成
; CreateDIB p1, p2, p3, p4
; p1 : HSPウィンドウx座標
; p2 : HSPウィンドウy座標
; p3 : 幅
; p4 : 高さ
; stat : ビットマップのハンドルが返る
;===============================================================
#deffunc CreateDIB int, int, int, int
mref px, 0 ; HSPウィンドウx座標
mref py, 1 ; HSPウィンドウy座標
mref sx, 2 ; xサイズ
mref sy, 3 ; yサイズ
mref stt, 64 ; stat
mref bmscr, 67 ; 描画中ウィンドウのBMSCR構造体
; DIBセクションオブジェクト作成
pm = bmscr.4, sx, sy
dllproc "CreateCompatibleBitmap", pm, 3, D_GDI@
hbitmap = stat ; ビットマップオブジェクトのハンドル
; メモリデバイスコンテキスト作成
pm = bmscr.4
dllproc "CreateCompatibleDC", pm, 1, D_GDI@
hdcMemory = stat ; メモリデバイスコンテキストのハンドル
; ビットマップをデバイスコンテキストに選択
pm = hdcMemory, hbitmap
dllproc "SelectObject", pm, 2, D_GDI@
; HSPウィンドウからビットマップにイメージをコピー
pm = hdcMemory, 0, 0, sx, sy, bmscr.4, px, py, $CC0020
dllproc "BitBlt", pm, 9, D_GDI@
; デバイスコンテキストを削除
dllproc "DeleteDC", hdcMemory, 1, D_GDI@
stt = hbitmap ; ビットマップオブジェクトのハンドル
return
#global ;############# モジュール終わり ########################
#module ;######### イメージリスト操作モジュール ################
;===============================================================
; イメージリストの作成
; CreateImageList p1, p2, p3, p4
; p1 : イメージの幅
; p2 : イメージの高さ
; p3 : イメージリストのタイプ
; p4 : イメージの数
; stat : イメージリストのハンドルが返る
;===============================================================
#deffunc CreateImageList int, int, int, int
mref sx, 0 ; イメージの幅
mref sy, 1 ; イメージの高さ
mref flags, 2 ; イメージリストのタイプ
mref num, 3 ; イメージの数
; イメージリストの作成
pm.0 = sx
pm.1 = sy
pm.2 = flags
pm.3 = num
pm.4 = 0
dllproc "ImageList_Create", pm, 5, D_COMCTL@
return
;===============================================================
; イメージリストに描画中ウィンドウのイメージ追加
; AddImageList p1, p2, p3, p4, p5
; p1 : イメージリストのハンドル
; p2 : HSPウィンドウx座標
; p3 : HSPウィンドウy座標
; p4 : 幅
; p5 : 高さ
; p6 : マスクに用いる色
; stat : イメージのインデックスが返る
;===============================================================
#deffunc AddImageList int, int, int, int, int, int
mref himl, 0 ; イメージリストのハンドル
mref cx, 1 ; x座標
mref cy, 2 ; y座標
mref sx, 3 ; xサイズ
mref sy, 4 ; yサイズ
mref crmask, 5 ; マスク生成に用いる色
mref stt, 64 ; stat
; DIBオブジェクトの作成
CreateDIB cx, cy, sx, sy
hbitmap = stat ; ビットマップハンドル
; ビットマップをイメージリストに追加
pm.0 = himl
pm.1 = hbitmap
pm.2 = crmask
dllproc "ImageList_AddMasked", pm, 3, D_COMCTL@
index = stat ; 最初のイメージのインデックス
; ビットマップオブジェクトを削除
dllproc "DeleteObject", hbitmap, 1, D_GDI@
stt = index ; イメージのインデックスをstatに格納
return
;===============================================================
; イメージリストの破棄
; DestroyImageList p1
; p1 : イメージリストのハンドル
;===============================================================
#deffunc DestroyImageList int
mref himl, 0 ; イメージリストのハンドル
; イメージリストを破棄
pm.0 = himl
dllproc "ImageList_Destroy", pm, 1, D_COMCTL@
return
#global ;############# モジュール終わり ########################
#module ;########### ツリービュー操作モジュール ##################
;===============================================================
; 描画中ウィンドウにツリービュー作成
; CreateTreeView p1, p2, p3, p4
; p1 : x座標
; p2 : y座標
; p3 : 幅
; p4 : 高さ
; stat : ツリービューのハンドルが返る
;===============================================================
#deffunc CreateTreeView int, int, int, int
mref cx, 0 ; x
mref cy, 1 ; y
mref sx, 2 ; 幅
mref sy, 3 ; 高さ
mref stt, 64 ; stat
; コモンコントロールライブラリ初期化
dllproc "InitCommonControls", pm, 0, D_COMCTL@
; ツリービュー作成
pm = cx, cy, sx, sy ; 座標、サイズ
pm.4 = 0x50800007 ; WS_VISIBLE | WS_BORDER | WS_CHILD
; | TVS_HASBUTTONS | TVS_HASLINES
; | TVS_LINESATROOT
pm.5 = 0, 0
_makewnd pm, "SysTreeView32"
stt = pm ; ツリービューのハンドル
return
;===============================================================
; ツリービューにイメージリストを設定
; SetTreeImageList p1, p2
; p1 : ツリービューのハンドル
; p2 : イメージリストのハンドル
;===============================================================
#deffunc SetTreeImageList int, int
mref hTree, 0 ; ツリービューのハンドル
mref himl, 1 ; イメージリストのハンドル
; TVM_SETIMAGELIST メッセージ送信
pm = hTree, 0x1109, 0, himl
sendmsg pm
return
;===============================================================
; ツリービューにアイテム追加
; AddTreeItem p1, p2, p3, p4, p5
; p1 : ツリービューのハンドル
; p2 : 表示するテキスト
; p3 : イメージのインデックス
; p4 : 親アイテムのハンドル
; p5 : 挿入位置のアイテムハンドルまたは以下の値
; $FFFF0001 : リストの最初の位置
; $FFFF0002 : リストの最後の位置
; $FFFF0003 : リストをアルファベット順にソート
;===============================================================
#deffunc AddTreeItem int, str, int, int, int
mref hTree, 0 ; ツリービューのハンドル
mref setText, 33 ; 表示するテキスト
mref iImage, 2 ; イメージのインデックス
mref hParent, 3 ; 親アイテムのハンドル
mref hIns, 4 ; 挿入位置のアイテムハンドル
dim bufText, 256
bufText = setText ; いったん別の変数に移しておく
; TVINSERTSTRUCT 構造体
dim tvins, 12
tvins.0 = hParent ; 親アイテムのハンドル
tvins.1 = hIns ; 挿入位置のアイテムハンドル
tvins.2 = 0x0023 ; TVIF_TEXT | TVIF_IMAGE
; | TVIF_SELECTEDIMAGE
getptr tvins.6, bufText ; 文字列のアドレス
tvins.8 = iImage ; イメージインデックス(非選択時)
tvins.9 = iImage ; イメージインデックス(選択時)
; TVM_INSERTITEM メッセージ送信
pm = hTree, 0x1100, 0
getptr pm.3, tvins
sendmsg pm
return
;===============================================================
; 選択されているツリービューアイテムを取得
; GetSelTreeItem p1
; p1 : ツリービューのハンドル
; stat : 選択されているアイテムのハンドルが返る
;===============================================================
#deffunc GetSelTreeItem int
mref hTree, 0 ; ツリービューのハンドル
; TVM_GETNEXTITEM メッセージ送信
pm = hTree, 0x110A, 9, 0 ; TVGN_CARET
sendmsg pm
return
;===============================================================
; ツリービューアイテムを削除
; DelTreeItem p1
; p1 : ツリービューのハンドル
; p2 : アイテムハンドル
;===============================================================
#deffunc DelTreeItem int, int
mref hTree, 0 ; ツリービューのハンドル
mref hitem, 1 ; アイテムのハンドル
; TVM_DELETEITEM メッセージ送信
pm = hTree, 0x1101, 0, hitem
sendmsg pm
return
#global ;############# モジュール終わり ########################
objsize winx/2, 24
button "子アイテム追加", *lb_additem ; Object ID=0
pos winx/2, 0
button "ルートアイテム追加", *lb_additem ; Object ID=1
pos 0, 24
button "アイテム削除", *lb_deleteitem ; Object ID=2
pos winx/2, 24
button "全アイテム削除", *lb_deleteitem ; Object ID=3
; イメージリスト作成 (16×16×4, 24bit, マスクあり)
CreateImageList 16, 16, 25, 4
himl = stat ; イメージリストのハンドル
; イメージリスト作成用バッファウィンドウ
buffer 2,,,0
picload "treeicon.bmp" ; ビットマップの読み込み
; イメージリストにイメージを追加
AddImageList himl, 0, 0, 16*4, 16, 0x00F0CAA6
; ツリービュー作成
gsel 0
CreateTreeView 0, 48, winx, winy-48
hTree = stat ; ツリービューのハンドル
; ツリービューのイメージリストを設定
SetTreeImageList hTree, himl
stop
*lb_additem
if stat == 0 {
; 子アイテム追加
; 選択アイテム取得
GetSelTreeItem hTree
hitem = stat
} else {
; ルートアイテム追加
hitem = 0
}
screen 3, 200, 150
title "アイテム追加"
sdim itemtext, 260
pos 10, 10 : mes "アイテム文字列"
input itemtext, 160
pos 10, 60 : mes "イメージインデックス"
combox imgidx,, "0\n1\n2\n3"
pos 30, 120 : button "OK", *lb_ok
pos 120, 120 : button "Cansel", *lb_cansel
stop
*lb_ok
; ツリービューのアイテム追加
AddTreeItem hTree, itemtext, imgidx, hitem, $FFFF0002
*lb_cansel
gsel 3, -1
stop
*lb_deleteitem
if stat == 2 {
; ツリービューのアイテム削除
; 選択アイテム取得
GetSelTreeItem hTree
hitem = stat
} else {
; ツリービューの全アイテム削除
hitem = $FFFF0000 ; TVI_ROOT
}
DelTreeItem hitem
stop