by kobo » 2014年10月29日(水) 18:16
こんにちは。
色々な方のコードを切り張りしました。
Ver4.24 Win7 64bit で動作確認済みです。
コモンコントロール使用するでpj作成
RADで空っぽツリービュー(ラベル編集にチェック)1個作成
ボタン1個作成
追加と
変更した文字の確認ができます。
コード: 全て選択
'-----------------------------------------------------------------------------
' イベント プロシージャ
'-----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd
' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。
Type TVDISPINFO
hdr As NMHDR
item As TVITEM
End Type
/*
Type TVITEM
mask As Long '有効メンバを示すフラグ
hItem As Long 'アイテムのハンドル
state As Long 'アイテムの状態・イメージ
stateMask As Long 'state のフラグ
pszText As BytePtr 'アイテムの文字列
cchTextMax As Long 'アイテムの文字列の長さ
iImage As Long 'イメージのインデックス(非選択時)
iSelectedImage As Long 'イメージのインデックス(選択時)
cChildren As Long '子アイテムを持つかどうかのフラグ
lParam As Long 'アイテムの持つ32ビット値
End Type
*/
Const TVM_SETITEM = &h110D
Const TVGN_CARET = &h9
Const TVM_SELECTITEM = &h110B
'-----------------------------------------------------------------------------
' ウィンドウメッセージを処理するためのコールバック関数
Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。
' イベントプロシージャの呼び出しを行います。
MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function
'-----------------------------------------------------------------------------
' ここから下は、イベントプロシージャを記述するための領域になります。
Sub MainWnd_Destroy()
Treeview4_DestroyObjects()
PostQuitMessage(0)
End Sub
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
Dim rect As RECT
Dim i As Long
Dim j As Long
Dim wst As Long
Dim hRoot As Long
Dim temp As String
For i = 0 To 4
temp = "Item " + Str$(i)
hRoot = AddTVItem(0,temp)
For j = 0 To 6
temp = "Item " + Str$(i) + " - Sub " + Str$(j)
AddTVItem(hRoot,temp)
Next j
Next i
End Sub
Sub MainWnd_Notify(ByRef sEdit As TVDISPINFO)
'引き数で編集内容取得
Dim hTreeView As HWND
hTreeView = GetDlgItem(hMainWnd,TreeView1)
If sEdit.hdr.code=TVN_ENDLABELEDIT Then
SendMessage(hTreeView,TVM_SETITEM,0,VarPtr(sEdit.item) as long )
'変更された文字列---------------------------------
msgbox 0,MakeStr(sEdit.item.pszText),"sEdit.item.pszText"
'-------------------------------------------------
End If
End Sub
Sub MainWnd_CommandButton1_Click()
Dim hCaret As Long
Dim hTreeView As HWND
hTreeView = GetDlgItem(hMainWnd,TreeView1)
hCaret = SendMessage(hTreeView,TVM_GETNEXTITEM,TVGN_CARET,0)
AddTVItem(hCaret,"追加")
SendMessage(hTreeView,TVM_SELECTITEM,TVGN_CARET,0)
SetFocus(hTreeView)
End Sub
Function AddTVItem(hParent As long ,s As String) As Long
'選択した場所の下層に追加する
'hParentが0の場合は最上階層に追加
Dim tvStruct As TVINSERTSTRUCT
Dim pText As BytePtr
Dim hTreeView As HWND
hTreeView = GetDlgItem(hMainWnd,TreeView1)
ZeroMemory(VarPtr(tvStruct),Len(tvStruct))
tvStruct.hParent = hParent as HTREEITEM
tvStruct.hInsertAfter = TVI_LAST
tvStruct.item.mask = LVIF_TEXT
pText = calloc( lstrlen( s )+1 )
memcpy(pText,StrPtr(s),Len(s))
tvStruct.item.pszText = pText
tvStruct.item.cchTextMax = lstrlen( pText )+1
AddTVItem = SendMessage(hTreeView,TVM_INSERTITEM,0,VarPtr(tvStruct) as Long)
free( pText )
End Function
こんにちは。
色々な方のコードを切り張りしました。
Ver4.24 Win7 64bit で動作確認済みです。
コモンコントロール使用するでpj作成
RADで空っぽツリービュー(ラベル編集にチェック)1個作成
ボタン1個作成
追加と[color=#800000]変更した文字の確認ができます[/color]。
[code]
'-----------------------------------------------------------------------------
' イベント プロシージャ
'-----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd
' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。
Type TVDISPINFO
hdr As NMHDR
item As TVITEM
End Type
/*
Type TVITEM
mask As Long '有効メンバを示すフラグ
hItem As Long 'アイテムのハンドル
state As Long 'アイテムの状態・イメージ
stateMask As Long 'state のフラグ
pszText As BytePtr 'アイテムの文字列
cchTextMax As Long 'アイテムの文字列の長さ
iImage As Long 'イメージのインデックス(非選択時)
iSelectedImage As Long 'イメージのインデックス(選択時)
cChildren As Long '子アイテムを持つかどうかのフラグ
lParam As Long 'アイテムの持つ32ビット値
End Type
*/
Const TVM_SETITEM = &h110D
Const TVGN_CARET = &h9
Const TVM_SELECTITEM = &h110B
'-----------------------------------------------------------------------------
' ウィンドウメッセージを処理するためのコールバック関数
Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。
' イベントプロシージャの呼び出しを行います。
MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function
'-----------------------------------------------------------------------------
' ここから下は、イベントプロシージャを記述するための領域になります。
Sub MainWnd_Destroy()
Treeview4_DestroyObjects()
PostQuitMessage(0)
End Sub
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
Dim rect As RECT
Dim i As Long
Dim j As Long
Dim wst As Long
Dim hRoot As Long
Dim temp As String
For i = 0 To 4
temp = "Item " + Str$(i)
hRoot = AddTVItem(0,temp)
For j = 0 To 6
temp = "Item " + Str$(i) + " - Sub " + Str$(j)
AddTVItem(hRoot,temp)
Next j
Next i
End Sub
Sub MainWnd_Notify(ByRef sEdit As TVDISPINFO)
'引き数で編集内容取得
Dim hTreeView As HWND
hTreeView = GetDlgItem(hMainWnd,TreeView1)
If sEdit.hdr.code=TVN_ENDLABELEDIT Then
SendMessage(hTreeView,TVM_SETITEM,0,VarPtr(sEdit.item) as long )
'変更された文字列---------------------------------
msgbox 0,MakeStr(sEdit.item.pszText),"sEdit.item.pszText"
'-------------------------------------------------
End If
End Sub
Sub MainWnd_CommandButton1_Click()
Dim hCaret As Long
Dim hTreeView As HWND
hTreeView = GetDlgItem(hMainWnd,TreeView1)
hCaret = SendMessage(hTreeView,TVM_GETNEXTITEM,TVGN_CARET,0)
AddTVItem(hCaret,"追加")
SendMessage(hTreeView,TVM_SELECTITEM,TVGN_CARET,0)
SetFocus(hTreeView)
End Sub
Function AddTVItem(hParent As long ,s As String) As Long
'選択した場所の下層に追加する
'hParentが0の場合は最上階層に追加
Dim tvStruct As TVINSERTSTRUCT
Dim pText As BytePtr
Dim hTreeView As HWND
hTreeView = GetDlgItem(hMainWnd,TreeView1)
ZeroMemory(VarPtr(tvStruct),Len(tvStruct))
tvStruct.hParent = hParent as HTREEITEM
tvStruct.hInsertAfter = TVI_LAST
tvStruct.item.mask = LVIF_TEXT
pText = calloc( lstrlen( s )+1 )
memcpy(pText,StrPtr(s),Len(s))
tvStruct.item.pszText = pText
tvStruct.item.cchTextMax = lstrlen( pText )+1
AddTVItem = SendMessage(hTreeView,TVM_INSERTITEM,0,VarPtr(tvStruct) as Long)
free( pText )
End Function
[/code]