首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

小弟我真一根筋啊 如何就是不想放弃

2012-09-29 
我真一根筋啊 怎么就是不想放弃啊就是想发送个什么消息,让treeview控件的nodeclick事件能被触发。我试过通

我真一根筋啊 怎么就是不想放弃啊
就是想发送个什么消息,让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 没错,不过不够具体。

VB code
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老鸟的办法了。
[解决办法]
探讨
引用:
看楼主铁头功来了.


铁头功?我理解力差啊。这个是从何说起啊?

[解决办法]
13楼代码在我这里成功了

我的全部代码:

VB code
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 版本。

热点排行