我真一根筋啊 怎么就是不想放弃啊

slowgrace 2009-04-16 03:41:03
就是想发送个什么消息,让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
...全文
512 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
jvchuan7 2012-08-27
  • 打赏
  • 举报
回复
都是VB的啊,有没有VC的?
slowgrace 2009-05-07
  • 打赏
  • 举报
回复
谢谢楼上各位。

没时间自己装VB6来验证tiger_zhao的代码了,我想应该没有问题的。

也没时间在VBA里去找别的办法了。

所以,结帖给分并向tiger_zhao致敬。同时BS某些围观的同学
hehaiyi2008 2009-05-06
  • 打赏
  • 举报
回复
熊孩子开学喽 2009-05-06
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 slowgrace 的回复:]
to wallescai 和 chen8013

别光围观啊

帮我试试13楼的代码,在你们的环境里是不是能正常print出来 nodeclick啊?
[/Quote]

有人成功啦,太好了,开香槟.
宁可写一个控件也不愿意绕阿,哈哈
(等我哪天闲得要发霉的时候,我说不定真的会去写的...我先决定好,一个用PICTURE控件画,另一个用LINE+LABEL+FRAME+IMAGE搭, 比较性能取其优, 应该是挺麻烦的,但是绝对不难)
嗷嗷叫的老马 2009-04-20
  • 打赏
  • 举报
回复
另外,环境是VB6,不是VBA.

以上代码是完整的,工程中添加一个TreeView与Command即可执行

闪人,睡觉...........
嗷嗷叫的老马 2009-04-20
  • 打赏
  • 举报
回复
13楼代码在我这里成功了

我的全部代码:

Option Explicit

Private 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 Long
Private Declare Function GetDlgCtrlID Lib "user32.dll" ( _
ByVal hwnd As Long) As Long

Private 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 Long
End Type
Private Type NMHDR
hwndFrom As Long
idfrom As Long
code As Long
End Type
Private Type POINTAPI
x As Long
y As Long
End Type
Private 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 POINTAPI
End Type

Private Const TVN_FIRST As Long = (-400)
Private Const TV_FIRST As Long = &H1100
Private Const TVM_GETNEXTITEM As Long = (TV_FIRST + 10)
Private Const TVM_EXPAND As Long = (TV_FIRST + 2)
Private Const TVGN_ROOT As Long = &H0
Private Const TVE_TOGGLE As Long = &H3
Private Const TVIF_STATE As Long = &H8
Private Const TVIF_PARAM As Long = &H4
Private Const TVM_GETITEMA As Long = (TV_FIRST + 12)
Private Const TVM_GETITEMW As Long = (TV_FIRST + 62)
Private Const TVGN_CHILD As Long = &H4
Private Const TVM_SELECTITEM As Long = (TV_FIRST + 11)
Private Const TVGN_CARET As Long = &H9
Private 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 = &H4E

Private 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 Sub

Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node)
Debug.Print "NodeClick("; Node.Text & ")"
End Sub

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_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, ntv
End Sub

上面有三个关键点,我之前使用的是W版本的,不成功.

换为A版本的,就OK了.
Tiger_Zhao 2009-04-20
  • 打赏
  • 举报
回复
VB6 可以的,我的确用 A 版本、没有试 W 版本。
mybelta2 2009-04-20
  • 打赏
  • 举报
回复
mybelta2 2009-04-20
  • 打赏
  • 举报
回复
slowgrace 2009-04-19
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 myjian 的回复:]
帮顶顶~~
[/Quote]

横,要是真心的帮,就试试13楼的代码
slowgrace 2009-04-19
  • 打赏
  • 举报
回复
to wallescai 和 chen8013

别光围观啊

帮我试试13楼的代码,在你们的环境里是不是能正常print出来 nodeclick啊?
zengfanying 2009-04-19
  • 打赏
  • 举报
回复
学习
嗷嗷叫的老马 2009-04-19
  • 打赏
  • 举报
回复
帮顶顶~~
舉杯邀明月 2009-04-19
  • 打赏
  • 举报
回复
又来看看热闹~~~~~
熊孩子开学喽 2009-04-18
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 slowgrace 的回复:]
引用 11 楼 WallesCai 的回复:
看楼主铁头功来了.


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

要硬转牛角尖,肯定要会铁头功啦,呵呵



这种纯技术的东西,啃起来蛮费劲.
我投机取巧惯了,一向偏好用技巧绕过技术.
lyserver 2009-04-17
  • 打赏
  • 举报
回复
刚才试过了,treeview不支持IAccessible特性,只能试试VB老鸟的办法了。
Tiger_Zhao 2009-04-17
  • 打赏
  • 举报
回复
用 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, ntv
End Sub

Private 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 Sub

Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node)
Debug.Print "NodeClick("; Node.Text & ")"
End Sub
slowgrace 2009-04-17
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 WallesCai 的回复:]
看楼主铁头功来了.
[/Quote]

铁头功?我理解力差啊。这个是从何说起啊?
熊孩子开学喽 2009-04-17
  • 打赏
  • 举报
回复
看楼主铁头功来了.
东方之珠 2009-04-17
  • 打赏
  • 举报
回复
up
加载更多回复(11)

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧