教えてGooに投稿していたのですが,いまいちいい感じの反応がなかったのでこちらにも.
TreeViewをプログラムの内部から選択したり、選択を外したりする方法を探しています。
http://okwave.jp/qa/q8518352.html
症状を画像でまとめてみました。
(A)http://fast-uploader.com/file/6950711390639/
(B)http://fast-uploader.com/file/6950711438023/
なお、(B)の症状については、TreeViewを一度クリックするとクリアされます。
直接ノードをクリックすると(A)の状態になるのです……
これはどのように修正したらいいのでしょうか?
よろしくお願いいたします.
TreeView プログラム内からノードを選択
Re: TreeView プログラム内からノードを選択
こんにちは
絵が既に消えていたので病状もわからず
ツリービューも使ったことがないのでさっぱりですが
よく参考にしているサイトとバックサーチに情報があったので
貼り付けておきます。少しでも参考になれば
http://www.kumei.ne.jp/c_lang/sdk3/sdk_201.htm
絵が既に消えていたので病状もわからず
ツリービューも使ったことがないのでさっぱりですが
よく参考にしているサイトとバックサーチに情報があったので
貼り付けておきます。少しでも参考になれば
http://www.kumei.ne.jp/c_lang/sdk3/sdk_201.htm
コード: 全て選択
投稿時間:2003/10/05(Sun) 11:14
投稿者名:ysama
Eメール:
URL :
タイトル:TreeViewライブラリー
コモンコントロールのひとつ、TreeViewがRADツールで貼っ付けら
れますが、結構めんどいのでけいえんされているのではないかし
ら?自作のCTREEVIEWクラスを関数ライブラリーとしてABに移植し
ました。一応RADで作ったテストプログラムで完動してます。ご参
考まで。
'------------------------------
' TREEVIEWライブラリーファイル
'------------------------------
'--------------
' 外部関数宣言
'--------------
'Declare Function ImageList_Create Lib "comctl32.dll" (cx As Long, cy As Long, flags As Long, cInitial As Long, cGrow As Long) As Long
'Declare Function ImageList_Destroy Lib "comctl32.dll" (himl As Long) As Long
Declare Function ImageList_AddMasked Lib "comctl32.dll" (himl As Long, hbmImage As Long, crMask As Long) As Long
'-------------
' TV 定数宣言
'-------------
Const TVSIL_NORMAL = 0
Const TVS_HASBUTTONS = 1
Const TVS_HASLINES = 2
Const TVS_LINESATROOT = 4
Const TVS_SHOWSELALWAYS = 32
Const TVI_ROOT = -65536
Const TVI_LAST = -65534
Const TVM_INSERTITEM = 4352
Const TVM_DELETEITEM = 4353
Const TVM_EXPAND = 4354
Const TVM_SETIMAGELIST = 4361
Const TVM_GETNEXTITEM = 4362
Const TVM_SELECTITEM = 4363
Const TVM_SORTCHILDREN = 4371
Const TVM_GETITEM = 4364
Const TVGN_CHILD = 4
Const TVGN_NEXTVISIBLE = 6
Const TVGN_CARET = 9
Const TVE_COLLAPSE = 1
Const TVE_EXPAND = 2
Const TVE_TOGGLE = 3
Const TVE_COLLAPSERESET = 32768
'-----------------------
' TV_INSERTSTRUCT構造体
'-----------------------
Type TV_INSERTSTRUCT
hParent As Long
hInsertAfter As Long
item As TV_ITEM
End Type
'---------------
' TV_ITEM構造体
'---------------
Type TV_ITEM
mask As Long
hItem As Long
state As Long
stateMask As Long
pszText As BytePtr
cchTextMax As Long
iImage As Long
iSelectedImage As Long
cChildren As Long
lParam As Long
End Type
'----------
' 外部変数
'----------
Dim g_hTVWnd As Long 'ツリービューコントロールのハンドル
Dim g_hIList As Long 'ツリービュー用イメージリスト
Dim g_imgw As Long 'イメージリスト用イメージの幅
Dim g_imgh As Long 'イメージリスト用イメージの高さ
Dim g_imgnum As Long 'イメージリスト用イメージの最大数
Dim g_ext As Long 'イメージリスト用イメージの拡張数
Dim g_tvItem As TV_ITEM 'アイテム情報構造体(情報取得用)
Dim g_tvInst As TV_INSERTSTRUCT 'アイテム追加構造体
'-----------------------------
'コンストラクター
'イメージを使う際に初期化する
'-----------------------------
Sub TV_Init(imgw As Long, imgh As Long, imgnum As Long, ext As Long)
g_imgw = imgw
g_imgh = imgh
g_imgnum = imgnum
g_ext = ext
g_hIList = ImageList_Create(imgw, imgh, ILC_COLOR4 Or ILC_MASK, imgnum, ext)
End Sub
'-----------------------------------
'イメージリストへのビットマップ登録
'TV_Init実行後すぐに登録する
'-----------------------------------
Function TV_AddBitmap(ID As BytePtr, hInstance As Long) As Long
Dim hBmp As Long
hBmp = LoadBitmap(hInstance, ID)
TV_AddBitmap = ImageList_AddMasked(g_hIList, hBmp, RGB(0, 0, 0))
DeleteObject(hBmp)
End Function
'-------------------------------------
'デストラクター
'イメージを使ったら必ず終了時実行する
'-------------------------------------
Sub TV_Quit()
'ツリービューで作成したイメージリスト、ツリービューを廃棄する
ImageList_Destroy(g_hIList)
End Sub
'--------------------------------------
'CTREEVIEWコントロール作成関数 (1)
'RADツールでTVコントロールを作った場合
'--------------------------------------
Function TV_Create1(hWnd As Long, ID As Long) As Long
g_hTVWnd = GetDlgItem(hWnd, ID)
'ツリービューにイメージコントロールをセット
TV_Create1 = SendMessage(g_hTVWnd, TVM_SETIMAGELIST, TVSIL_NORMAL, g_hIList)
End Function
'----------------------------------
'CTREEVIEWコントロール作成関数 (2)
'自分でTVコントロールを作る場合
'----------------------------------
Function TV_Create2(hWnd As Long, hInstance As Long, ID As Long, x As Long, y As Long, w As Long, h As Long) As Long
g_hTVWnd = CreateWindowEx(WS_EX_CLIENTEDGE, "SYSTREEVIEW32", "", WS_CHILD Or WS_VISIBLE Or TVS_HASLINES Or TVS_LINESATROOT Or TVS_HASBUTTONS Or TVS_SHOWSELALWAYS, x, y, w, h, hWnd, ID, hInstance, 0)
'ツリービューにイメージコントロールをセット
TV_Create2 = SendMessage(g_hTVWnd, TVM_SETIMAGELIST, TVSIL_NORMAL, g_hIList)
End Function
'--------------------------------
'TREEVIEWコントロールの移動
'本体ウィンドウのWM_SIZE時に使用
'--------------------------------
Sub TV_Move(x As Long, y As Long, w As Long, h As Long)
MoveWindow(g_hTVWnd, x, y, w, h, TRUE)
End Sub
'-----------------
'アイテム数を取得
'-----------------
Function TV_GetCount() As Long
TV_GetCount = SendMessage(g_hTVWnd, TVM_GETCOUNT, 0, 0)
End Function
'-----------------
'ルートを取得する
'-----------------
Function TV_GetRoot() As Long
TV_GetRoot = SendMessage(g_hTVWnd, TVM_GETNEXTITEM, TVGN_ROOT, 0)
End Function
'---------------------------------
'現在選択されているアイテムを取得
'---------------------------------
Function TV_GetSelection() As Long
TV_GetSelection = SendMessage(g_hTVWnd, TVM_GETNEXTITEM, TVGN_CARET, 0)
End Function
'-----------------------------
'指定されたアイテムの親を取得
'-----------------------------
Function TV_GetParent(hitem As Long) As Long
TV_GetParent = SendMessage(g_hTVWnd, TVM_GETNEXTITEM, TVGN_PARENT, hitem)
End Function
'-----------------------------------
'指定されたアイテムの次の兄弟を取得
'-----------------------------------
Function TV_GetNext(hitem As Long) As Long
TV_GetNext = SendMessage(g_hTVWnd, TVM_GETNEXTITEM, TVGN_NEXTVISIBLE, hitem)
End Function
'-----------------------------------
'指定されたアイテムの最初の子を取得
'-----------------------------------
Function TV_GetChild(hitem As Long) As Long
TV_GetChild = SendMessage(g_hTVWnd, TVM_GETNEXTITEM, TVGN_CHILD, hitem)
End Function
'-------------------
'アイテム情報の取得
'-------------------
Function TV_GetItem(hitem As Long, Buff As BytePtr, size As Long) As VoidPtr
TV_GetItem = VarPtr(g_tvItem)
g_tvItem.hItem = hitem
If(Buff = 0) Then
g_tvItem.mask = TVIF_CHILDREN Or TVIF_HANDLE Or TVIF_IMAGE Or TVIF_PARAM Or _
TVIF_SELECTEDIMAGE Or TVIF_STATE
Else
g_tvItem.mask = TVIF_CHILDREN Or TVIF_HANDLE Or TVIF_IMAGE Or TVIF_PARAM Or _
TVIF_SELECTEDIMAGE Or TVIF_STATE Or TVIF_TEXT
g_tvItem.cchTextMax = size
g_tvItem.pszText = Buff
End If
SendMessage(g_hTVWnd, TVM_GETITEM, 0, TV_GetItem)
End Function
'-----------------------------------
'UINTで指定した関係のアイテムを取得
'-----------------------------------
Function TV_GetNextItem(hitem As Long, flag As Long) As Long
TV_GetNextItem = SendMesage(g_hTVWnd, TVM_GETNEXTITEM, flag, hitem)
End Function
'--------------------------------------
'char*で指定した文字列のアイテムを取得
'--------------------------------------
Function TV_FindItem(hitem As Long, text As BytePtr) As Long
TV_FindItem = NULL '全てのSiblingに無ければNULLを返す
Dim hSelected As Long, hFound As Long
hSelected = hitem
Dim tvitem As TV_ITEM 'TV_ITEM構造体
Dim Buff[MAX_PATH] As Byte '文字列長はMAX_PATH限度
While(hSelected) '最後まで見つからなければhSelectedは0になる
tvitem.hItem = hSelected
tvitem.mask = TVIF_TEXT Or TVIF_CHILDREN
tvitem.pszText = Buff
tvitem.cchTextMax = MAX_PATH
SendMessage(g_hTVWnd, TVM_GETITEM, 0, VarPtr(tvitem))
If(lstrcmp(Buff, text) = 0) Then '取得した文字列が同じ場合
TV_FindItem = hSelected
Exit Function
Else '同じでない場合
'子がいれば再起呼出でサーチ、見つかれば終了
If(tvitem.cChildren) Then
hFound = TV_FindItem(TV_GetChild(hSelected), text)
If(hFound) Then
TV_FindItem = hFound
Exit Function
End If
End If
'矢張り見つからなければ次を探す
hSelected = TV_GetNext(hSelected);
End If
Wend
End Function
'----------------------------------
'HTREEITEMで指定したアイテムを選択
'----------------------------------
Function TV_SelectItem(hitem As Long) As Long
TV_SelectItem = SendMessage(g_hTVWnd, TVM_SELECTITEM, TVGN_CARET, hitem)
End Function
'-------------
'アイテム追加
'-------------
Function TV_InsertItem(Title As BytePtr, InsAfter As Long, Parent As Long, Image As Long, SelImage As Long) As Long
If(InsAfter = 0) Then InsAfter = TVI_LAST
If(Parent = 0) Then Parent = TVI_ROOT
ZeroMemory(VarPtr(g_tvInst), Len(g_tvInst))
g_tvInst.hInsertAfter = InsAfter
g_tvInst.hParent = Parent
g_tvInst.item.pszText = Title
If(Image = -1) Then
g_tvInst.item.mask = TVIF_TEXT
Else
g_tvInst.item.mask = TVIF_TEXT Or TVIF_IMAGE
g_tvInst.item.iImage = Image
If(SelImage <> -1) Then
g_tvInst.item.mask = g_tvInst.item.mask Or TVIF_SELECTEDIMAGE
g_tvInst.item.iSelectedImage = SelImage
End If
EndIf
TV_InsertItem = SendMessage(g_hTVWnd, TVM_INSERTITEM, 0, VarPtr(g_tvInst))
End Function
'-----------------------------------------
'g_tvItemのデータを予めセットして実行する
'-----------------------------------------
Function TV_SetItem(hitem As Long) As Long
g_tvItem.mask = TVIF_CHILDREN Or TVIF_HANDLE Or TVIF_IMAGE Or TVIF_PARAM Or _
TVIF_SELECTEDIMAGE Or TVIF_STATE Or TVIF_TEXT
g_tvItem.hItem = hitem
TV_SetItem = SendMessage(g_hWnd, TVM_SETITEM, 0, VarPtr(g_tvItem))
End Function
'---------------------
'全てのアイテムを削除
'---------------------
Function TV_DeleteAllItems() As Long
TV_DeleteAllItems = SendMessage(g_hTVWnd, TVM_DELETEITEM, 0, TVI_ROOT)
End Function
'-----------------------
'指定したアイテムを削除
'-----------------------
Function TV_DeleteItem(hitem As Long) As Long
TV_DeleteItem = SendMessage(g_hTVWnd, TVM_DELETEITEM, 0, hitem)
End Function
'-------------------
'アイテムを展開する
'-------------------
Function TV_Expand(hitem As Long, flag As Long) As Long
If(flag = 0) Then flag = TVE_TOGGLE
TV_Expand = SendMessage(g_hTVWnd, TVM_EXPAND, flag, hitem)
End Function
'-------------------
'子供達をソートする
'-------------------
Function TV_SortChildren(hitem As Long) As Long
TV_SortChildren = SendMessage(g_hTVWnd, TVM_SORTCHILDREN, 0, hitem)
End Function
Re: TreeView プログラム内からノードを選択
kobo様
ご返信有難うございます!
大変参考になりました。
'---------------------------------
'現在選択されているアイテムを取得
'---------------------------------
Function TV_GetSelection() As Long
TV_GetSelection = SendMessage(g_hTVWnd, TVM_GETNEXTITEM, TVGN_CARET, 0)
End Function
この命令を探して探して……
1行で出来たのですね……
完成にまた一つ近づきました!ありがとうございました
ご返信有難うございます!
大変参考になりました。
'---------------------------------
'現在選択されているアイテムを取得
'---------------------------------
Function TV_GetSelection() As Long
TV_GetSelection = SendMessage(g_hTVWnd, TVM_GETNEXTITEM, TVGN_CARET, 0)
End Function
この命令を探して探して……
1行で出来たのですね……
完成にまた一つ近づきました!ありがとうございました
Re: TreeView プログラム内からノードを選択
アイテム数が取得できずに悩んだ方へ
いまさらですが、
Const TVM_GETCOUNT = 4357
の設定が無いとアイテム数がゼロで返って来ます
----------------------------------------------------
余談ですが、できれば
Const TVGN_ROOT = 0
も設定しておいていた方が親切かも、、、。
ちなみに、私はVBSでこのソースの一部を
intアイテム数 = objEx.ExecuteExcel4Macro("CALL(""user32"", ""SendMessageA"", ""JJJJJ"", " & lngハンドル番号 & ", " & TVM_GETCOUNT & ", 0, 0)")
こんな感じで使用させて頂きました。
ありがとうございました。
いまさらですが、
Const TVM_GETCOUNT = 4357
の設定が無いとアイテム数がゼロで返って来ます
----------------------------------------------------
余談ですが、できれば
Const TVGN_ROOT = 0
も設定しておいていた方が親切かも、、、。
ちなみに、私はVBSでこのソースの一部を
intアイテム数 = objEx.ExecuteExcel4Macro("CALL(""user32"", ""SendMessageA"", ""JJJJJ"", " & lngハンドル番号 & ", " & TVM_GETCOUNT & ", 0, 0)")
こんな感じで使用させて頂きました。
ありがとうございました。