我真一根筋啊 怎么就是不想放弃啊
就是想发送个什么消息,让treeview控件的nodeclick事件能被触发。
我试过通知消息,NM_CLICK,http://blog.csdn.net/slowgrace/archive/2009/01/14/3772557.aspx,发是发成功了,因为用SPY++能看到。可是nodeclick事件不被触发。
还试过用投递鼠标消息的方法,http://blog.csdn.net/slowgrace/archive/2009/04/16/4084299.aspx。可是这种办法是投递的,投递完并不立刻执行相应的nodeclick事件过程,害得我随后的测试语句统统不能通过。
难道就真的没有办法了么?
(1)不要投递消息。要直接送达,直接触发。
(2)不要直接call treeview0_nodeclick()。原因在http://blog.csdn.net/slowgrace/archive/2009/01/14/3772557.aspx。
[解决办法]
用 WM_NOTIFY 没错,不过不够具体。
Private Sub Command1_Click() Dim hItem As Long Dim tVI As TVITEM Dim ntv As NMTREEVIEW 'Root hItem = SendMessage(TreeView1.hwnd, TVM_GETNEXTITEM, TVGN_ROOT, ByVal 0&) Debug.Print Hex(hItem) SendMessage TreeView1.hwnd, TVM_EXPAND, TVE_TOGGLE, ByVal hItem 'tVI.hItem = hItem 'tVI.mask = TVIF_STATE Or TVIF_PARAM 'SendMessage TreeView1.hwnd, TVM_GETITEM, 0, tVI 'ntv.itemOld = tVI '没有 itemOld 也是可以的' 'Root\A hItem = SendMessage(TreeView1.hwnd, TVM_GETNEXTITEM, TVGN_CHILD, ByVal hItem) Debug.Print Hex(hItem) SendMessage TreeView1.hwnd, TVM_SELECTITEM, TVGN_CARET, ByVal hItem tVI.hItem = hItem tVI.mask = TVIF_STATE Or TVIF_PARAM SendMessage TreeView1.hwnd, TVM_GETITEM, 0, tVI ntv.itemNew = tVI ntv.hdr.hwndFrom = TreeView1.hwnd ntv.hdr.idfrom = GetDlgCtrlID(TreeView1.hwnd) ntv.hdr.code = TVN_SELCHANGED ntv.action = TVN_SELCHANGED SendMessage Me.hwnd, WM_NOTIFY, ntv.hdr.idfrom, ntvEnd SubPrivate Sub Form_Load() TreeView1.LineStyle = tvwRootLines TreeView1.Nodes.Add , , "R", "Root" TreeView1.Nodes.Add "R", tvwChild, "A", "A" TreeView1.Nodes.Add "R", tvwChild, "B", "B" TreeView1.Nodes.Add "R", tvwChild, "C", "C"End SubPrivate Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node) Debug.Print "NodeClick("; Node.Text & ")"End Sub
[解决办法]
刚才试过了,treeview不支持IAccessible特性,只能试试VB老鸟的办法了。
[解决办法]
Option ExplicitPrivate Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" ( _ ByVal hwnd As Long, _ ByVal wMsg As Long, _ ByVal wParam As Long, _ ByRef lParam As Any) As LongPrivate Declare Function GetDlgCtrlID Lib "user32.dll" ( _ ByVal hwnd As Long) As LongPrivate Type TVITEM mask As Long hItem As Long state As Long stateMask As Long pszText As String cchTextMax As Long iImage As Long iSelectedImage As Long cChildren As Long lParam As LongEnd TypePrivate Type NMHDR hwndFrom As Long idfrom As Long code As LongEnd TypePrivate Type POINTAPI x As Long y As LongEnd TypePrivate Type NMTREEVIEW ' was NM_TREEVIEW Hdr As NMHDR ' Specifies a notification-specific action flag. ' Is NMTREEVIEW_action for TVN_SELCHANGING, TVN_SELCHANGED, TVN_SETDISPINFO ' Is TVM_EXPAND_wParam for TVN_ITEMEXPANDING, TVN_ITEMEXPANDED Action As Long itemOld As TVITEM itemNew As TVITEM ptDrag As POINTAPIEnd TypePrivate Const TVN_FIRST As Long = (-400)Private Const TV_FIRST As Long = &H1100Private Const TVM_GETNEXTITEM As Long = (TV_FIRST + 10)Private Const TVM_EXPAND As Long = (TV_FIRST + 2)Private Const TVGN_ROOT As Long = &H0Private Const TVE_TOGGLE As Long = &H3Private Const TVIF_STATE As Long = &H8Private Const TVIF_PARAM As Long = &H4Private Const TVM_GETITEMA As Long = (TV_FIRST + 12)Private Const TVM_GETITEMW As Long = (TV_FIRST + 62)Private Const TVGN_CHILD As Long = &H4Private Const TVM_SELECTITEM As Long = (TV_FIRST + 11)Private Const TVGN_CARET As Long = &H9Private Const TVN_SELCHANGEDA As Long = (TVN_FIRST - 2)Private Const TVN_SELCHANGEDW As Long = (TVN_FIRST - 51)Private Const TVM_GETTEXTCOLOR As Long = (TV_FIRST + 32)Private Const WM_NOTIFY As Long = &H4EPrivate Sub Form_Load() TreeView1.LineStyle = tvwRootLines TreeView1.Nodes.Add , , "R", "Root" TreeView1.Nodes.Add "R", tvwChild, "A", "A" TreeView1.Nodes.Add "R", tvwChild, "B", "B" TreeView1.Nodes.Add "R", tvwChild, "C", "C"End SubPrivate Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node) Debug.Print "NodeClick("; Node.Text & ")"End SubPrivate Sub Command1_Click() Dim hItem As Long Dim tVI As TVITEM Dim ntv As NMTREEVIEW 'Root hItem = SendMessage(TreeView1.hwnd, TVM_GETNEXTITEM, TVGN_ROOT, ByVal 0&) Debug.Print Hex(hItem) SendMessage TreeView1.hwnd, TVM_EXPAND, TVE_TOGGLE, ByVal hItem 'tVI.hItem = hItem 'tVI.mask = TVIF_STATE Or TVIF_PARAM 'SendMessage TreeView1.hwnd, TVM_GETITEM, 0, tVI 'ntv.itemOld = tVI '没有 itemOld 也是可以的' 'Root\A hItem = SendMessage(TreeView1.hwnd, TVM_GETNEXTITEM, TVGN_CHILD, ByVal hItem) Debug.Print Hex(hItem) SendMessage TreeView1.hwnd, TVM_SELECTITEM, TVGN_CARET, ByVal hItem tVI.hItem = hItem tVI.mask = TVIF_STATE Or TVIF_PARAM SendMessage TreeView1.hwnd, TVM_GETITEMA, 0, tVI '关键一 ntv.itemNew = tVI ntv.Hdr.hwndFrom = TreeView1.hwnd ntv.Hdr.idfrom = GetDlgCtrlID(TreeView1.hwnd) ntv.Hdr.code = TVN_SELCHANGEDA '关键二 ntv.Action = TVN_SELCHANGEDA '关键三 SendMessage Me.hwnd, WM_NOTIFY, ntv.Hdr.idfrom, ntvEnd Sub
[解决办法]
VB6 可以的,我的确用 A 版本、没有试 W 版本。