突然发现autoit3.3.14.2 UDF函数_GUICtrlTreeView_GetItemHandle有逻辑上的错误
Func _GUICtrlTreeView_GetItemHandle($hWnd, $hItem = 0)If $hItem = 0 Then $hItem = 0x00000000
If IsHWnd($hWnd) Then
If $hItem = 0x00000000 Then $hItem = _SendMessage($hWnd, $TVM_GETNEXTITEM, $TVGN_ROOT, 0, 0, "wparam", "lparam", "handle");如果第二参数为0,返回第一项目ID的句柄,没毛病 .但不为0,就直接不处理了.
Else
If $hItem = 0x00000000 Then
$hItem = Ptr(GUICtrlSendMsg($hWnd, $TVM_GETNEXTITEM, $TVGN_ROOT, 0))
Else
Local $hTempItem = GUICtrlGetHandle($hItem)
If $hTempItem <> 0x00000000 Then $hItem = $hTempItem
EndIf
EndIf
Return $hItem
EndFunc ;==>_GUICtrlTreeView_GetItemHandle
当传入的hwnd参数是句柄,第二个参数是项目控件ID.根据上面的逻辑,项目ID不经处理就返回了.与预期的结果不一样.
不如直接用GUICtrlGetHandle($hItem),不太明白....各位有什么看法? 当用GUICtrlCreateListView创建的时候,得到的不是句柄是控件id
当用_GUICtrlTreeView_Create 创建的时候,得到的不是控件id是句柄
_SendMessage($hWnd中$hWnd是句柄
GUICtrlSendMsg($hWnd和GUICtrlGetHandle($hItem)中,传入的都是控件id
当传入的hwnd参数是句柄时候,你说的没有错误,但是传入的hwnd是控件id的时候呢?
_GUICtrlTreeView_GetItemHandle已经考虑到了两种创建方式 本帖最后由 tubaba 于 2018-5-10 08:58 编辑
所以我说有逻辑错误啊,_GUICtrlTreeView_GetItemHandle(控件ID, 项目ID) 可以返回正确结果,这不是我要说的重点
当$hWnd是句柄,$hItem=0,返回正确结果.
当$hWnd是句柄,$hItem<>0,未做处理,直接由最后一行.Return $hItem返回.这就存在一个问题.
_GUICtrlTreeView_GetItemHandle(真正的句柄, 项目ID) 将会返回项目的ID,而不是此项目的句柄. 所以我说有逻辑错误啊,_GUICtrlTreeView_GetItemHandle(控件ID, 项目ID) 可以返回正确结果,这不是我要说的重 ...
tubaba 发表于 2018-5-10 08:55 http://www.autoit3.cn/images/common/back.gif
是有这个问题,估计是疏忽了 好像真是啊,第一参数为句柄,第二参数为ID时没有表达式,最终返回的还是那ID。
_GUICtrlTreeView_GetItemHandle(控件句柄, 项目句柄)
_GUICtrlTreeView_GetItemHandle(控件句柄)
这样能返回正确结果
_GUICtrlTreeView_GetItemHandle(控件句柄, 项目ID)
这样好似是不能返回正确结果
当然在使用时如果不专门转换成句柄,使用是没问题的。
GUICtrlCreateTreeView和GUICtrlCreateTreeViewItem 创建是ID
_GUICtrlTreeView_Create和_GUICtrlTreeView_Add和_GUICtrlTreeView_AddChild创建提句柄 这个错误会影响到不少函数.因为这个,昨天一源代码除错除了好久.最后看了函数原型才发现的
看这个函数
Func _GUICtrlTreeView_SetItemParam($hWnd, $hItem, $iParam)
If Not IsHWnd($hItem) Then $hItem = _GUICtrlTreeView_GetItemHandle($hWnd, $hItem)
Local $tItem = DllStructCreate($tagTVITEMEX)
DllStructSetData($tItem, "Mask", BitOR($TVIF_HANDLE, $TVIF_PARAM))
DllStructSetData($tItem, "hItem", $hItem)
DllStructSetData($tItem, "Param", $iParam)
Local $bResult = __GUICtrlTreeView_SetItem($hWnd, $tItem)
Return $bResult
EndFunc ;==>_GUICtrlTreeView_SetItemParam
在这里如果传入的$hItem是控件ID,结果$hItem还是控件ID.最后直接导致函数失败.
页:
[1]