API高手请进:向treeview发消息,使指定节点的expand事件发生。

slowgrace 2009-04-12 09:16:30
参考这两个帖子:
http://topic.csdn.net/u/20070401/15/be6add3b-a6c6-4179-bd27-d13b8a4bdfe2.html
http://topic.csdn.net/t/20020315/20/579406.html
总算拼出一段代码,可是一运行,我的ACCESS就“遇到问题需要关闭”。对了,我是在ACCESS里用VBA编程。

现在我想做的是把向treeview指定节点发送expand消息,使该节点的expand事件发生。

Public Sub CheckExpand(ByVal nodX As MSComctlLib.Node, trcX As CTreeCtl)
On Error GoTo Err_CheckExpand
Dim hItem As Long
Dim hTvw As Long
Dim udtTVI As TV_ITEM

hTvw = trcX.m_tvw.hwnd

'先获得nodx的句柄
nodX.Selected = True
hItem = SendMessageLong(hTvw, TVM_GETNEXTITEM, TVGN_CARET, 0)

'再获得nodx的lparam
With udtTVI
.hItem = hItem
.mask = TVIF_PARAM
End With
Call SendMessage(hTvw, TVM_GETITEM, 0, udtTVI)

' SendMessage(GetDlgItem(hWnd, ID_TREEVIEW), TVM_EXPAND, (WPARAM) (UINT)TVE_EXPAND, (LPARAM)hitemDrop);
Call SendMessage(hTvw, TVM_EXPAND, TVE_EXPAND, udtTVI.lParam) '运行到这一句死掉
MsgBox "aaa"
Exit Sub
Err_CheckExpand:
Stop
Debug.Print ERR.Description
Resume
End Sub


在标准模块里有如下定义:
'API声明
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Declare Function SendMessageLong Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Const TV_FIRST As Long = &H1100
Public Const TVM_GETNEXTITEM As Long = TV_FIRST + 10
Public Const TVM_GETITEM = (TV_FIRST + 12)
Public Const TVM_EXPAND As Long = TV_FIRST + 2
Public Const TVE_EXPAND As Long = &H2

'typedef struct _TREEITEM FAR* HTREEITEM;
'TV_ITEM struct
Public Type TV_ITEM
mask As TV_ITEM_mask
hItem As Long
state As TV_ITEM_state
stateMask As Long
pszText As Long ' pointer
cchTextMax As Long
iImage As Long
iSelectedImage As Long
cChildren As Long
lParam As Long
End Type

Public Enum TV_ITEM_mask
TVIF_TEXT = &H1
TVIF_IMAGE = &H2
TVIF_PARAM = &H4
TVIF_STATE = &H8
TVIF_HANDLE = &H10
TVIF_SELECTEDIMAGE = &H20
TVIF_CHILDREN = &H40
TVIF_DI_SETITEM = &H1000 ' Notification
End Enum

Public Enum TV_ITEM_state
TVIS_SELECTED = &H2
TVIS_CUT = &H4
TVIS_DROPHILITED = &H8
TVIS_BOLD = &H10
TVIS_EXPANDED = &H20
TVIS_EXPANDEDONCE = &H40
TVIS_EXPANDPARTIAL = &H80

TVIS_OVERLAYMASK = &HF00
TVIS_STATEIMAGEMASK = &HF000
TVIS_USERMASK = &HF000
End Enum

' TVM_GETNEXTITEM wParam values
Public Enum TVGN_Flags
TVGN_ROOT = &H0
TVGN_NEXT = &H1
TVGN_PREVIOUS = &H2
TVGN_PARENT = &H3
TVGN_CHILD = &H4
TVGN_FIRSTVISIBLE = &H5
TVGN_NEXTVISIBLE = &H6
TVGN_PREVIOUSVISIBLE = &H7
TVGN_DROPHILITE = &H8
TVGN_CARET = &H9
#If (WIN32_IE >= &H400) Then ' >= Comctl32.dll v4.71
TVGN_LASTVISIBLE = &HA
#End If
End Enum
...全文
349 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2009-04-27
  • 打赏
  • 举报
回复
第二种不一定是地址,比如 WM_MOVE 就是直接将两个坐标在一个 Int32 值中进行传递。
slowgrace 2009-04-26
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 Tiger_Zhao 的回复:]
想问问这种区别意味着什么?哪种情况我要用第一种?哪种情况用第二种?
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Declare Function SendMessageLong Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

区别只在最后一个参数。
前一种自动取地址,通常对应指针类型的参数。
后一种直接传值,通常对应非指针类型的参数。
简单地说只要看 MSDN 的参数类型是否有 *
[/Quote]

请问zhao,

第一种是,传变量的地址过去
第二种是,传变量的拷贝的地址过去

就像以前有个帖子你说过的那样的,对吧?

那么,如果MSDN 的参数类型如果有 *,那我是用第一种,是么?而这种参数一般是unsigned所说的“出参”,对吧?
slowgrace 2009-04-15
  • 打赏
  • 举报
回复
另外,还想请教一下,我在网上抄的API函数声明有如下两个:

Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Declare Function SendMessageLong Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

区别只在最后一个参数。想问问这种区别意味着什么?哪种情况我要用第一种?哪种情况用第二种?
slowgrace 2009-04-15
  • 打赏
  • 举报
回复
另外,谢谢supergreenbean,跟你学了个表情 orz,呵呵
slowgrace 2009-04-15
  • 打赏
  • 举报
回复
谢谢以上各位,问题解决了。

可我还是有点晕,MSDN的说明上明明写的是要类型转换为lparam啊?哪位高人解释一下如何看懂下面这段说明啊?




这里面这句:(LPARAM) lParam // = (LPARAM) (HTREEITEM) hItem;
难道不是在说:要传hitem对应的结构体里的lparam么?
东方之珠 2009-04-15
  • 打赏
  • 举报
回复
结贴这么快,1分没要到
东方之珠 2009-04-15
  • 打赏
  • 举报
回复
解决了,我来要1分!
slowgrace 2009-04-15
  • 打赏
  • 举报
回复
问题解决了,楼上的各种讨论小结在这里http://blog.csdn.net/slowgrace/archive/2009/04/15/4076404.aspx,感谢各位热心指点,结帖!
Tiger_Zhao 2009-04-15
  • 打赏
  • 举报
回复
是的。
slowgrace 2009-04-15
  • 打赏
  • 举报
回复
那其实,我希望传值的时候这么写就相当于第二种了,是吧?

Call SendMessage(hTvw, TVM_EXPAND, TVE_EXPAND, ByVal hItem)
Tiger_Zhao 2009-04-15
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 slowgrace 的回复:]
另外,还想请教一下,我在网上抄的API函数声明有如下两个:

区别只在最后一个参数。想问问这种区别意味着什么?哪种情况我要用第一种?哪种情况用第二种?[/Quote]
前一种自动取地址,通常对应指针类型的参数。
后一种直接传值,通常对应非指针类型的参数。
简单地说只要看 MSDN 的参数类型是否有 *
Tiger_Zhao 2009-04-15
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 slowgrace 的回复:]
可我还是有点晕,MSDN的说明上明明写的是要类型转换为lparam啊?哪位高人解释一下如何看懂下面这段说明啊? [/Quote]

(LPARAM) 是为了与参数类型匹配进行的强制类型转换,不用管(在 VB 中就是 Long)。
(HTREEITEM) 说明 hItem 是一个句柄,句柄在 VB 中就是一个 Long,而不是什么结构。
supergreenbean 2009-04-14
  • 打赏
  • 举报
回复
hoho,不过这样才热闹啊
Tiger_Zhao 2009-04-14
  • 打赏
  • 举报
回复
帖子打开得比较早,不知道supergreenbean已经回复了,不是要抢分。
supergreenbean 2009-04-14
  • 打赏
  • 举报
回复
楼上的这样都来抢……阿弥陀佛 Orz
Tiger_Zhao 2009-04-14
  • 打赏
  • 举报
回复
[Quote=MSDN:]
TVM_EXPAND
wParam = (WPARAM) (UINT) flag;
lParam = (LPARAM) (HTREEITEM) hItem;[/Quote]
Public Sub CheckExpand(ByVal nodX As MSComctlLib.Node, trcX As CTreeCtl)
On Error GoTo Err_CheckExpand
Dim hItem As Long
Dim hTvw As Long

hTvw = trcX.m_tvw.hwnd

nodX.Selected = True
hItem = SendMessageLong(hTvw, TVM_GETNEXTITEM, TVGN_CARET, 0)

Call SendMessageLong(hTvw, TVM_EXPAND, TVE_EXPAND, hItem)
MsgBox "aaa"
Exit Sub
Err_CheckExpand:
Stop
Debug.Print ERR.Description
Resume
End Sub
supergreenbean 2009-04-14
  • 打赏
  • 举报
回复
Call SendMessage(hTvw, TVM_EXPAND, TVE_EXPAND, ByVal hItem)
嗷嗷叫的老马 2009-04-14
  • 打赏
  • 举报
回复
先睡觉,帮MM顶顶!
bdzwj 2009-04-13
  • 打赏
  • 举报
回复
Call SendMessage(hTvw, TVM_EXPAND, 0, hItem) '运行到这一句死掉
MsgBox "aaa"
bdzwj 2009-04-13
  • 打赏
  • 举报
回复
Call SendMessage(hTvw, TVM_EXPAND, TVE_EXPAND, udtTVI) '运行到这一句死掉
MsgBox "aaa"
加载更多回复(3)

1,486

社区成员

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

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