找回密码
 加入
搜索
查看: 5346|回复: 8

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

  [复制链接]
发表于 2012-10-6 00:48:54 | 显示全部楼层 |阅读模式
本帖最后由 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
 
发表于 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

评分

参与人数 2金钱 +15 贡献 +2 收起 理由
绿色风 + 10 + 2
lpxx + 5

查看全部评分

发表于 2012-10-6 12:36:31 | 显示全部楼层
不知道是不是真的小妹?如果是真小妹,哥马上给你搞定!
发表于 2012-10-6 13:06:29 | 显示全部楼层
发现MM,当然得帮咯

#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    

 楼主| 发表于 2012-10-6 15:13:59 | 显示全部楼层
回复 4# drunk


    哇,真的可以拉

谢谢谢谢谢谢拉,哇哈哈
 楼主| 发表于 2012-10-6 15:14:40 | 显示全部楼层
绿色风 发表于 2012-10-6 13:17



    谢谢GG哦,太感激呢,学习了好多~
 楼主| 发表于 2012-10-6 15:15:29 | 显示全部楼层
回复 2# Azura


    谢谢亲哦~学习了~
发表于 2012-10-6 21:39:30 | 显示全部楼层
学习了~!!!!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-16 07:02 , Processed in 0.086585 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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