fenhanxue 发表于 2012-10-6 00:48:54

[已解决]如何让list控件,对单击和双击事件分别进行响应?

本帖最后由 fenhanxue 于 2012-10-6 15:18 编辑

小妹写的程序是这样的,有2个控件,分别是input和一个list

然后我想实现list的单击和双击事件:
    1)单击事件:单击list上的任一行的文本时,input上显示“我只想单击时显示本段文字,双击时别闪现本段文字,怎么弄哦”
    2 )双击事件:list上的任一行的文本时,被双击的这一行文本会发送到input上
            
    尝试写了下面这段代码,发现可以得到结果,但是过程存在问题,就是对于   2)双击事件:
      在我点了一下鼠标还没来得及点第二下的时候,“我只想单击时显示本段文字,双击时别闪现本段文字,怎么弄哦”这段文字会马上出现在input上
      也就是说,整个双击过程,点下第一下鼠标,“我只想单击时显示本段文字,双击时别闪现本段文字,怎么弄哦”这段文字会先出现在input上,点第二下鼠标,被双击的这一行文本再出现在input上,
      而我想要实现的,是整过双击过程,点下第一下鼠标,input上不要有任何反应,点第二下鼠标,被被双击的这一行文本再出现在input上。不知道我的代码出错在哪里,求高手指点哦,感觉逻辑很混乱,哎

也就是说,我发现我的这段代码,好像双击事件,包含了单击事件,也就是如果我执行双击事件,他会先执行单击事件,再执行双击事件,

但我想实现的是,单击的时候只执行单击事件,双击的时候,只执行双击事件,求助哦

代码如下:#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WindowsConstants.au3>

Global Const $STN_DBLCLK = 2
Global Const $STN_SIGCLK = 1

$Form1 = GUICreate("Form1", 362, 269, 262, 158)
$Input1 = GUICtrlCreateInput("Input1", 8, 8, 137, 50)
$List1 = GUICtrlCreateList("", 160, 0, 193, 253)
GUICtrlSetData($List1, "123")
GUICtrlSetData($List1, "345")
GUICtrlSetData($List1, "789")
GUIRegisterMsg($WM_COMMAND, "MY_WM_COMMAND")
GUISetState()

While 1
      $nMsg = GUIGetMsg()
      Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit
      EndSwitch
WEnd

Func MY_WM_COMMAND($hWnd, $msg, $wParam, $lParam)
    Local $nNotifyCode = BitShift($wParam,16)
    Local $nID = BitAND($wParam, 0xFFFF)
    Local $hCtrl = $lParam

    Switch $nID
      Case $List1
            Switch $nNotifyCode
                Case $STN_DBLCLK
                                   GUICtrlSetData ( $Input1 , GUICtrlRead($List1))
                          Case $STN_SIGCLK
                                   GUICtrlSetData($Input1,"我只想单击时显示本段文字,双击时别闪现本段文字,怎么弄哦")
            EndSwitch
    EndSwitch

    Return $GUI_RUNDEFMSG
EndFunc

Terence 发表于 2012-10-6 08:52:52

Func WM_NOTIFY($hWndGUI, $MsgID, $WParam, $LParam)

        Local $tagNMHDR, $Event, $hWndFrom, $IDFrom
        Local $tagNMHDR = DllStructCreate("int;int;int", $LParam)
        If @error Then Return $GUI_RUNDEFMSG
        $IDFrom = DllStructGetData($tagNMHDR, 2)
        $Event = DllStructGetData($tagNMHDR, 3)
        $tagNMHDR = 0
        Switch $IDFrom;选择产生事件的控件

                Case $ListView2

                        Switch $Event; 选择产生的事件

                                Case $NM_CLICK ; 左击
                                       


;~                                 Case $NM_DBLCLK ; 双击
;~                                       $Index = _GUICtrlListView_GetSelectedIndices($ListView1)
;~                                       If Not StringLen($Index) Then; 这里用以判断是否选定了ListViewItem
;~                                                 MsgBox(0, "", "未选定")
;~                                                 Return
;~                                       EndIf
;~                                       MsgBox(0, 0, _GUICtrlListView_GetItemText($ListView1, Number($Index), 0))

;~                                 Case $NM_RCLICK ; 右击
;~                                       ...
                        EndSwitch

        EndSwitch

        Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

hzxymkb 发表于 2012-10-6 12:36:31

不知道是不是真的小妹?如果是真小妹,哥马上给你搞定!

drunk 发表于 2012-10-6 13:06:29

发现MM,当然得帮咯{:face (88):}

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WindowsConstants.au3>

Global Const $STN_DBLCLK = 2
Global Const $STN_SIGCLK = 1

$Form1 = GUICreate("Form1", 362, 269, 262, 158)
$Input1 = GUICtrlCreateInput("Input1", 8, 8, 137, 50)
$List1 = GUICtrlCreateList("", 160, 0, 193, 253)
GUICtrlSetData($List1, "123")
GUICtrlSetData($List1, "345")
GUICtrlSetData($List1, "789")
GUIRegisterMsg($WM_COMMAND, "MY_WM_COMMAND")
GUISetState()

While 1
      $nMsg = GUIGetMsg()
      Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit
      EndSwitch
WEnd

Func MY_WM_COMMAND($hWnd, $msg, $wParam, $lParam)
    Local $nNotifyCode = BitShift($wParam,16)
    Local $nID = BitAND($wParam, 0xFFFF)
    Local $hCtrl = $lParam

    Switch $nID
      Case $List1
            Switch $nNotifyCode
                                Case $STN_DBLCLK
                                        ondblclick()
                                Case $STN_SIGCLK
                                        onclick()
            EndSwitch
    EndSwitch

    Return $GUI_RUNDEFMSG
EndFunc

Func ondblclick()
        Assign("isdblclick", True, 2)
       
        ; 下面放需要执行的东东
        GUICtrlSetData($Input1 , GUICtrlRead($List1))
EndFunc

Func onclick($call = 1)
        If IsDeclared("call") Then Return AdlibRegister("onclick",100)
        Local $dblclick = Eval("isdblclick")
        Assign("isdblclick", False, 2)
        AdlibUnRegister("onclick")
        ; 如果是双击,则不操作,返回
        If $dblclick Then Return
       
        ; 下面放需要执行的东东
        GUICtrlSetData($Input1,"我只想单击时显示本段文字,双击时别闪现本段文字,怎么弄哦")
EndFunc

绿色风 发表于 2012-10-6 13:17:00


GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY");注册双击消息函数

Func WM_NOTIFY($hWndGUI, $MsgID, $WParam, $LParam);双击事件
        Local $tagNMHDR, $Event, $hWndFrom, $IDFrom
        Local $tagNMHDR = DllStructCreate("int;int;int", $LParam)
        If @error Then Return $GUI_RUNDEFMSG
        $IDFrom = DllStructGetData($tagNMHDR, 2)
        $Event = DllStructGetData($tagNMHDR, 3)
        $tagNMHDR = 0
        Switch $IDFrom
                Case $list1 ;选择产生事件的控件
                        Switch $Event; 选择产生的事件
                                Case $NM_CLICK ; 左击
                                        ;你的代码
                                Case $NM_DBLCLK ; 双击       
                                        ;你的代码
                                Case $$NM_RCLICK ;右键
                                        ;你的代码
                                EndSwitch
        EndSwitch
        Return $GUI_RUNDEFMSG
EndFunc   

fenhanxue 发表于 2012-10-6 15:13:59

回复 4# drunk


    哇,真的可以拉{:face (411):}

谢谢谢谢谢谢拉,哇哈哈

fenhanxue 发表于 2012-10-6 15:14:40


绿色风 发表于 2012-10-6 13:17 http://www.autoitx.com/images/common/back.gif


    谢谢GG哦,太感激呢,学习了好多~

fenhanxue 发表于 2012-10-6 15:15:29

回复 2# Azura


    谢谢亲哦~学习了~

cvwyg 发表于 2012-10-6 21:39:30

学习了~!!!!
页: [1]
查看完整版本: [已解决]如何让list控件,对单击和双击事件分别进行响应?