ab.com コミュニティ https://www.activebasic.com/forum/ |
|
TreeView プログラム内からノードを選択 https://www.activebasic.com/forum/viewtopic.php?t=4557 |
ページ 1 / 1 |
作成者: | 水波形 [ 2014年4月14日(月) 14:02 ] |
記事の件名: | TreeView プログラム内からノードを選択 |
教えて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)の状態になるのです…… これはどのように修正したらいいのでしょうか? よろしくお願いいたします. |
作成者: | kobo [ 2014年4月28日(月) 16:20 ] |
記事の件名: | Re: TreeView プログラム内からノードを選択 |
こんにちは 絵が既に消えていたので病状もわからず ツリービューも使ったことがないのでさっぱりですが よく参考にしているサイトとバックサーチに情報があったので 貼り付けておきます。少しでも参考になれば 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 |
作成者: | 水波形 [ 2014年6月11日(水) 11:26 ] |
記事の件名: | Re: TreeView プログラム内からノードを選択 |
kobo様 ご返信有難うございます! 大変参考になりました。 '--------------------------------- '現在選択されているアイテムを取得 '--------------------------------- Function TV_GetSelection() As Long TV_GetSelection = SendMessage(g_hTVWnd, TVM_GETNEXTITEM, TVGN_CARET, 0) End Function この命令を探して探して…… 1行で出来たのですね…… 完成にまた一つ近づきました!ありがとうございました |
作成者: | MSXマスター [ 2021年4月21日(水) 09:22 ] |
記事の件名: | Re: TreeView プログラム内からノードを選択 |
アイテム数が取得できずに悩んだ方へ いまさらですが、 Const TVM_GETCOUNT = 4357 の設定が無いとアイテム数がゼロで返って来ます ---------------------------------------------------- 余談ですが、できれば Const TVGN_ROOT = 0 も設定しておいていた方が親切かも、、、。 ちなみに、私はVBSでこのソースの一部を intアイテム数 = objEx.ExecuteExcel4Macro("CALL(""user32"", ""SendMessageA"", ""JJJJJ"", " & lngハンドル番号 & ", " & TVM_GETCOUNT & ", 0, 0)") こんな感じで使用させて頂きました。 ありがとうございました。 |
ページ 1 / 1 | 全ての表示時間は UTC+09:00 です |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |