tubaba 发表于 2018-5-9 16:09:47

突然发现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),不太明白....各位有什么看法?

gto250 发表于 2018-5-9 20:45:12

当用GUICtrlCreateListView创建的时候,得到的不是句柄是控件id
当用_GUICtrlTreeView_Create 创建的时候,得到的不是控件id是句柄

_SendMessage($hWnd中$hWnd是句柄
GUICtrlSendMsg($hWnd和GUICtrlGetHandle($hItem)中,传入的都是控件id

当传入的hwnd参数是句柄时候,你说的没有错误,但是传入的hwnd是控件id的时候呢?
_GUICtrlTreeView_GetItemHandle已经考虑到了两种创建方式

tubaba 发表于 2018-5-10 08:55:35

本帖最后由 tubaba 于 2018-5-10 08:58 编辑

所以我说有逻辑错误啊,_GUICtrlTreeView_GetItemHandle(控件ID, 项目ID) 可以返回正确结果,这不是我要说的重点
当$hWnd是句柄,$hItem=0,返回正确结果.
当$hWnd是句柄,$hItem<>0,未做处理,直接由最后一行.Return $hItem返回.这就存在一个问题.
_GUICtrlTreeView_GetItemHandle(真正的句柄, 项目ID) 将会返回项目的ID,而不是此项目的句柄.

afan 发表于 2018-5-10 09:39:16

所以我说有逻辑错误啊,_GUICtrlTreeView_GetItemHandle(控件ID, 项目ID) 可以返回正确结果,这不是我要说的重 ...
tubaba 发表于 2018-5-10 08:55 http://www.autoit3.cn/images/common/back.gif


    是有这个问题,估计是疏忽了

志艺风云 发表于 2018-5-10 10:49:53

好像真是啊,第一参数为句柄,第二参数为ID时没有表达式,最终返回的还是那ID。

_GUICtrlTreeView_GetItemHandle(控件句柄, 项目句柄)
_GUICtrlTreeView_GetItemHandle(控件句柄)
这样能返回正确结果
_GUICtrlTreeView_GetItemHandle(控件句柄, 项目ID)
这样好似是不能返回正确结果

当然在使用时如果不专门转换成句柄,使用是没问题的。
GUICtrlCreateTreeView和GUICtrlCreateTreeViewItem 创建是ID
_GUICtrlTreeView_Create和_GUICtrlTreeView_Add和_GUICtrlTreeView_AddChild创建提句柄

tubaba 发表于 2018-5-10 12:34:29

这个错误会影响到不少函数.因为这个,昨天一源代码除错除了好久.最后看了函数原型才发现的
看这个函数
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]
查看完整版本: 突然发现autoit3.3.14.2 UDF函数_GUICtrlTreeView_GetItemHandle有逻辑上的错误