找回密码
 加入
搜索
查看: 1835|回复: 5

[AU3基础] 突然发现autoit3.3.14.2 UDF函数_GUICtrlTreeView_GetItemHandle有逻辑上的错误

    [复制链接]
发表于 2018-5-9 16:09:47 | 显示全部楼层 |阅读模式
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),不太明白....各位有什么看法?

评分

参与人数 1贡献 +2 收起 理由
afan + 2 我很赞同

查看全部评分

发表于 2018-5-9 20:45:12 | 显示全部楼层
当用GUICtrlCreateListView创建的时候,得到的不是句柄是控件id
当用_GUICtrlTreeView_Create 创建的时候,得到的不是控件id是句柄

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

当传入的hwnd参数是句柄时候,你说的没有错误,但是传入的hwnd是控件id的时候呢?
_GUICtrlTreeView_GetItemHandle已经考虑到了两种创建方式
 楼主| 发表于 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,而不是此项目的句柄.
发表于 2018-5-10 09:39:16 | 显示全部楼层
所以我说有逻辑错误啊,_GUICtrlTreeView_GetItemHandle(控件ID, 项目ID) 可以返回正确结果,这不是我要说的重 ...
tubaba 发表于 2018-5-10 08:55



    是有这个问题,估计是疏忽了
发表于 2018-5-10 10:49:53 | 显示全部楼层
好像真是啊,第一参数为句柄,第二参数为ID时没有表达式,最终返回的还是那ID。

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

当然在使用时如果不专门转换成句柄,使用是没问题的。
GUICtrlCreateTreeView和GUICtrlCreateTreeViewItem 创建是ID
_GUICtrlTreeView_Create和_GUICtrlTreeView_Add和_GUICtrlTreeView_AddChild  创建提句柄
 楼主| 发表于 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.最后直接导致函数失败.
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-16 16:36 , Processed in 0.078343 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表