ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年3月28日(木) 21:10

全ての表示時間は UTC+09:00 です




新しいトピックを投稿する  トピックへ返信する  [ 4 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2014年4月14日(月) 14:02 
オフライン

登録日時: 2009年3月29日(日) 15:45
記事: 106
教えて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)の状態になるのです……

これはどのように修正したらいいのでしょうか?
よろしくお願いいたします.

_________________
↓個人的ソフト置き場
http://www.software.jpn.org/
↓萌えゲー製作とかしていたい
http://www.holygate.jpn.org/


通報する
ページトップ
投稿記事Posted: 2014年4月28日(月) 16:20 
こんにちは
絵が既に消えていたので病状もわからず
ツリービューも使ったことがないのでさっぱりですが
よく参考にしているサイトとバックサーチに情報があったので
貼り付けておきます。少しでも参考になれば

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



通報する
ページトップ
   
投稿記事Posted: 2014年6月11日(水) 11:26 
オフライン

登録日時: 2009年3月29日(日) 15:45
記事: 106
kobo様

ご返信有難うございます!
大変参考になりました。

'---------------------------------
'現在選択されているアイテムを取得
'---------------------------------
Function TV_GetSelection() As Long

TV_GetSelection = SendMessage(g_hTVWnd, TVM_GETNEXTITEM, TVGN_CARET, 0)

End Function

この命令を探して探して……
1行で出来たのですね……
完成にまた一つ近づきました!ありがとうございました

_________________
↓個人的ソフト置き場
http://www.software.jpn.org/
↓萌えゲー製作とかしていたい
http://www.holygate.jpn.org/


通報する
ページトップ
投稿記事Posted: 2021年4月21日(水) 09:22 
アイテム数が取得できずに悩んだ方へ

いまさらですが、
Const TVM_GETCOUNT = 4357
の設定が無いとアイテム数がゼロで返って来ます

----------------------------------------------------
余談ですが、できれば
Const TVGN_ROOT = 0
も設定しておいていた方が親切かも、、、。

ちなみに、私はVBSでこのソースの一部を
intアイテム数 = objEx.ExecuteExcel4Macro("CALL(""user32"", ""SendMessageA"", ""JJJJJ"", " & lngハンドル番号 & ", " & TVM_GETCOUNT & ", 0, 0)")
こんな感じで使用させて頂きました。

ありがとうございました。


通報する
ページトップ
   
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 4 件の記事 ] 

全ての表示時間は UTC+09:00 です


オンラインデータ

このフォーラムを閲覧中のユーザー: Ahrefs [Bot] & ゲスト[20人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
cron
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean