1,488
社区成员




Private Sub ctlMsgHook_GetWindowMessage(Result As Long, ByVal cHwnd As Long, ByVal Message As Long, ByVal wParam As Long, ByVal lParam As Long)
'// 这是树形列表控件的父窗口的子类化过程, 用于接收\处理 systreeview32 的通知消息
Dim tvHDR As NMTREEVIEW
Dim cHDR As NMHDR
Dim HandleOfRoot As Long
Dim tItem As TV_ITEM
Select Case Message
Case WM_NOTIFY
CopyMemory cHDR, ByVal lParam, Len(cHDR)
If cHDR.hwndFrom = PG.n_hWndTreeList Then
'/// PG.n_hWndTreeList = 树形列表的句柄
Select Case cHDR.code
Case NM_CLICK: Debug.Print "NM_CLICK", Timer
Case NM_DBLCLK: Debug.Print "NM_DBLCLK", Timer
Case NM_RCLICK: Debug.Print "NM_RCLICK", Timer
Case TVN_ITEMEXPANDED
'// 这是项目展开或收起的通知消息
'// 这里开始是问题重点 ■■■
CopyMemory tvHDR, ByVal lParam, Len(tvHDR)
'// 本次的 Copymemory 取的是 NMTREEVIEW 内容
'// 没有copymemory和以下的内容,这个代码没问题, 但我需要对这个通知消息响应
'// 加了copymemory, 展开的动作时没问题
'// 但是在收起的动作时, 程序崩溃...
'// 在调试时, 如果在copymemory下面有debug.print,能显示出读出了正确的消息
'// 但是立刻也就崩溃了, 错误原因不详, 应该是copymemory的问题, 没有下面的代码
'// 只有copymemory一样出错, so.... 现在不知道怎么办了...
'// 到底是怎么回事? 我这个通知消息响应过程错了了吗?
Select Case tvHDR.ItemNew.hItem
Case PG.n_FolderExeProject, PG.n_FolderDLLProject, PG.n_FolderVxdProject
Case Else
tItem.Mask = TVIF_HANDLE Or TVIF_IMAGE Or TVIF_SELECTEDIMAGE
tItem.hItem = tvHDR.ItemNew.hItem
If tvHDR.Actionz = 2 Then tItem.iImage = FolderOpen - 101& Else tItem.iImage = FolderClose - 101&
tItem.iSelectedImage = tItem.iImage
SendMessage PG.n_hWndTreeList, TVM_SETITEM, ByVal 0&, tItem
Debug.Print "TVN_ITEMEXPANDED", tvHDR.Actionz, tvHDR.ItemNew.hItem, PG.n_FolderExeProject, PG.n_FolderForm
End Select
Result = -1
Exit Sub
Case TVN_ITEMEXPANDING
Debug.Print "TVN_ITEMEXPANDING"
Case TVN_SINGLEEXPAND: Debug.Print "TVN_SINGLEEXPAND"
Case TVN_SELCHANGED: Debug.Print "TVN_SELCHANGED"
Case Else ': Debug.Print tvHDR.hDR.code, Timer
End Select
End If
Case WM_SYSCOMMAND
Result = 1: Exit Sub
End Select
Result = ctlMsgHook.CallDefaultWindowProc(cHwnd, Message, wParam, lParam)
End Sub