haijie1223 发表于 2016-9-9 22:30:43

NMHDR结构中的Code参数类型为什么是INT[已解决]

本帖最后由 haijie1223 于 2016-9-22 16:32 编辑

MSDN的官方介绍地址为:
https://msdn.microsoft.com/zh-cn/library/bb775514(v=vs.71).aspxtypedef struct tagNMHDR {
HWND   hwndFrom;
UINT_PTR idFrom;
UINT   code;
} NMHDR;
其中的code元素类型官方规定是UINT,但是在AU3中如果用UINT似乎是错误的,并不能使用。经查看UDF中的定义为INT。何故如此?
测试代码如下:

#include <WindowsConstants.au3>
$hForm = GUICreate("treeview", 200, 100)
$hTree = GUICtrlCreateTreeView(0, 0, 200, 100)
GUISetState()
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

While 1
        $Msg = GUIGetMsg()
        Switch $Msg
                Case -3
                        Exit
        EndSwitch
WEnd


Func WM_NOTIFY($hWnd, $Msg, $wParam, $lParam)
        Local $hWndFrom, $iCode, $tNMHDR
        $tNMHDR = DllStructCreate('HWND hwndFrom;UINT_PTR idFrom;INT code;', $lParam) ;最后一个参数修改为Uint则无效。
        $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
        $iCode = DllStructGetData($tNMHDR, "Code")
        Switch $hWndFrom
                Case GUICtrlGetHandle($hTree)
                        Switch $iCode
                                Case $NM_CLICK
                                        MsgBox(0, '$iCode=' & $iCode, '单击', 1, $hForm)
                        EndSwitch
        EndSwitch
EndFunc   ;==>WM_NOTIFY

nmgwddj 发表于 2016-9-9 23:29:31

我觉得这是个 Bug{:face (382):}

heroxianf 发表于 2016-9-19 15:21:55

感觉海大 又做了不得了的东西了。

haijie1223 发表于 2016-9-22 16:30:49

自问自答:
AU3中没有UINT类型,而$NM_CLICK为INT类型,所以所以如果定义为UINT类型,需要把数据转化为相同类型的INT类型再进行比较。
所以定义为UINT类型的代码如下:
#include <WindowsConstants.au3>
$hForm = GUICreate("treeview", 200, 100)
$hTree = GUICtrlCreateTreeView(0, 0, 200, 100)
GUISetState()
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

While 1
        $Msg = GUIGetMsg()
        Switch $Msg
                Case -3
                        Exit
        EndSwitch
WEnd


Func WM_NOTIFY($hWnd, $Msg, $wParam, $lParam)
        Local $hWndFrom, $iCode, $tNMHDR
        $tNMHDR = DllStructCreate('HWND hwndFrom;UINT_PTR idFrom;UINT code;', $lParam) ;最后一个参数修改为Uint则无效。
        $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
        $iCode = DllStructGetData($tNMHDR, "Code")
        $iCode = BitAND('0x' & Hex($iCode), 0xffffffff)
        Switch $hWndFrom
                Case GUICtrlGetHandle($hTree)
                        Switch $iCode
                                Case $NM_CLICK
                                        MsgBox(0, '$iCode=' & $iCode, '单击', 1, $hForm)
                        EndSwitch
        EndSwitch
EndFunc   ;==>WM_NOTIFY
页: [1]
查看完整版本: NMHDR结构中的Code参数类型为什么是INT[已解决]