返回列表 发帖

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


  1.         If $hItem = 0 Then $hItem = 0x00000000

  2.         If IsHWnd($hWnd) Then

  3.                 If $hItem = 0x00000000 Then $hItem = _SendMessage($hWnd, $TVM_GETNEXTITEM, $TVGN_ROOT, 0, 0, "wparam", "lparam", "handle");如果第二参数为0,返回第一项目ID的句柄,没毛病 .但不为0,就直接不处理了.

  4.         Else

  5.                 If $hItem = 0x00000000 Then

  6.                         $hItem = Ptr(GUICtrlSendMsg($hWnd, $TVM_GETNEXTITEM, $TVGN_ROOT, 0))

  7.                 Else

  8.                         Local $hTempItem = GUICtrlGetHandle($hItem)

  9.                         If $hTempItem <> 0x00000000 Then $hItem = $hTempItem

  10.                 EndIf

  11.         EndIf

  12.  

  13.         Return $hItem

  14. EndFunc   ;==>_GUICtrlTreeView_GetItemHandle

复制代码 高亮切换


当传入的hwnd参数是句柄,第二个参数是项目控件ID.根据上面的逻辑,项目ID不经处理就返回了.与预期的结果不一样.

不如直接用GUICtrlGetHandle($hItem),不太明白....各位有什么看法?
1

评分人数

  • afan

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

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

当传入的hwnd参数是句柄时候,你说的没有错误,但是传入的hwnd是控件id的时候呢?
_GUICtrlTreeView_GetItemHandle已经考虑到了两种创建方式
小时候欺负女孩子是喜欢她,长大后喜欢女孩子是想欺负她

TOP

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

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

TOP

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



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

TOP

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

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

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

TOP

这个错误会影响到不少函数.因为这个,昨天一源代码除错除了好久.最后看了函数原型才发现的
看这个函数
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.最后直接导致函数失败.

TOP

返回列表