找回密码
 加入
搜索
楼主: xms77

[GUI管理] Label控件能不能接受双击或右键的消息?

 火... [复制链接]
 楼主| 发表于 2014-8-19 15:51:58 | 显示全部楼层
回复 14# afan
A大请指教一下,谢谢了先!
发表于 2014-8-20 09:34:05 | 显示全部楼层
回复 14# afan

请问A大,我一直都没搞明白那个windows消息,
特别是我应该怎样直接在双击、右键消息里面识别当前的控件并处理呢?
发表于 2014-8-22 00:33:51 | 显示全部楼层
回复 2# user3000


    借问一下大神,如果有多个lable控件的话,我是说非常多的情况,
  Case $WM_LBUTTONDBLCLK ; 左键双击
                        MsgBox(64, "提示", "双击了LABLE!")
                Case $WM_RBUTTONDOWN ; 右键按下
                        MsgBox(64, "提示", "右击了LABLE!")
这个双击和单机中,如果获得是双击了哪个控件呢? 批量的控件我是用 for    to 来添加的,但是这里对所有的都有作用,case触发用的是数组
发表于 2014-8-22 07:21:08 | 显示全部楼层
回复 18# austere
Case $WM_RBUTTONDOWN ; 右键按下
    MsgBox(64, "右击LABLE", GUICtrlGetHandle($Label1) & @CR & $hWnd)
发表于 2014-8-22 07:33:22 | 显示全部楼层
回复 16# xms77
Func _lable_events($hWnd, $uiMsg, $wParam, $lParam) 
        Switch $uiMsg
                        Case $WM_LBUTTONDBLCLK ; 左键双击
                                MsgBox(64, "提示", "双击了LABLE!")
                                Switch _WinAPI_GetDlgCtrlID($hWnd)
                            Case $Label1
                               ;...
                                EndSwitch                                           
                                Case $WM_RBUTTONDOWN ; 右键按下
                                            MsgBox(64, "右击LABLE", GUICtrlGetHandle($Label1) &  @CR & $hWnd)                           
        EndSwitch
        Return _WinAPI_CallWindowProc($handle2, $hWnd, $uiMsg, $wParam, $lParam)
EndFunc   ;==>_lable_events
发表于 2014-8-22 08:15:37 | 显示全部楼层
回复 19# user3000
Case $WM_RBUTTONDOWN ; 右键按下
    MsgBox(64, "右击LABLE", GUICtrlGetHandle($Label1) & @CR & $hWnd)
可能是我描述有问题,我的意思是这样,不知道怎么实现
Case $WM_RBUTTONDOWN  and 双击了控件1      
执行 1  
Case $WM_RBUTTONDOWN  and 双击了控件2
执行 2
发表于 2014-8-22 12:40:15 | 显示全部楼层
回复 21# austere

请参考20楼的代码

具体应该是这样:
Case $WM_RBUTTONDOWN
         Switch 控件ID
                    Case 控件1
                             执行1
                     Case 控件2
                             执行2 
                      ;....
          EndSwitch
发表于 2014-8-23 14:35:24 | 显示全部楼层
回复 13# xms77

加样式就行了,不用画
发表于 2014-8-27 16:49:51 | 显示全部楼层
本帖最后由 雪栀 于 2014-8-27 17:49 编辑

回复 22# user3000


    试过了,好像不行啊,我从自己写的东西里弄出个稍稍复杂点的例子,你看一下,关键是第29行怎么写,或者说你在20楼的回答中的_WinAPI_SetWindowLong怎么写……对API不是很懂,囧之……
#include <GuiConstants.au3>
#include <GuiTreeView.au3>
#NoTrayIcon

Dim $inifile_path = "playlist.ini"
If Not FileExists($inifile_path) Then
        FileInstall("playlist.ini", $inifile_path)
EndIf
Dim $csname = "List", $hClass = 0
$Manage = GUICreate("选择", 300, 300, (@DesktopWidth - 215) / 2, (@DesktopHeight - 100) / 2)
$treeview = GUICtrlCreateTreeView(0, 0, 200, 300, -1, $WS_EX_CLIENTEDGE)
readinfo($inifile_path, $treeview) ;加载ini
$exit = GUICtrlCreateButton("退出", 216, 180, 67, 25)
;右键菜单
$Menu = GUICtrlCreateContextMenu($treeview)
$rclk = GUICtrlCreateMenuItem("萌萌的菜单", $Menu)
GUISetState(@SW_SHOW, $Manage)

;关键测试代码===========================================================================
$handle = DllCallbackRegister("MouseEvents", "ptr", "hwnd;uint;long;ptr")
$handle2 = _WinAPI_SetWindowLong(GUICtrlGetHandle($Manage), $GWL_WNDPROC, DllCallbackGetPtr($handle)) ;关键是这个地方怎么写。。。

Func MouseEvents($hWnd, $uiMsg, $wParam, $lParam)
        Switch $uiMsg
                Case $WM_LBUTTONUP ;左键按下后松开
                        Switch _WinAPI_GetDlgCtrlID($hWnd)
                                Case $exit
                                        Exit
                                Case $rclk
                                        MsgBox(0,0,"点击了萌萌的菜单!")
                        EndSwitch
                Case $WM_LBUTTONDBLCLK ; 左键双击
                        Switch _WinAPI_GetDlgCtrlID($hWnd)
                                Case $treeview
                                MsgBox(0,0,"双击了treeviewitem!")
                        EndSwitch
                ;Case $WM_RBUTTONUP ; 右键按下后松开
                        ;MsgBox(64, "提示", "右击!")
        EndSwitch
        Return _WinAPI_CallWindowProc($handle2, $hWnd, $uiMsg, $wParam, $lParam)
EndFunc   ;==>MouseEvents
;关键测试代码===========================================================================

While 1
        Local $msg = GUIGetMsg()
        Select
                Case $msg = -3
                        Exit
        EndSelect
WEnd

Func readinfo($ini, $htv, $csname = "List", $hClass = 0)  ;加载ini
        If Not $hClass Then $hClass = $htv
        $aSec = IniReadSection($ini, $csname)
        If @error Then Return False
        For $i = 1 To $aSec[0][0]
                $child = IniReadSection($ini, $aSec[$i][0])
                If @error Then;类
                        $hItem = GUICtrlCreateTreeViewItem($aSec[$i][0], $hClass)
                Else;子类
                        $hClass1 = GUICtrlCreateTreeViewItem($aSec[$i][0], $hClass)
                        readinfo($ini, $hClass, $aSec[$i][0], $hClass1)
                EndIf
        Next
        Return True
EndFunc   ;==>readinfo


playlist.ini
[List]
List1=List1
List2=List2

[List1]
1=0001
2=0010

[List2]
3=0011
如果这类烦人的单击、双击、右击控件的问题(……话说这两天一直在找这方面资料)解决了,大家可以整合一下别的什么GUICtrlOnHover之类的,最好能写个UDF,顺便根据p版的说法,这种SetWindowLong的方法好像还能在某些方面模拟一下多线程,多学习学习也是好的
发表于 2014-8-27 21:45:44 | 显示全部楼层
回复 24# 雪栀

老实承认,这方面应用,我也是半桶水!

但经过测试,发现点东西:
1,必须是同一类控件(比如全是按钮)才能将它注册到同一个回调函数里.
2,非显式或位置不固定的控件(比如弹出性菜单)无法注册回调函数?

你的代码:GUICtrlGetHandle($Manage)
该变量储存的是窗体的句柄,已经是错误性地调用此函数了!
发表于 2014-8-27 23:14:28 | 显示全部楼层
回复 25# user3000


    感谢解答……有空我去官网找找这方面资料
发表于 2014-8-28 01:14:34 | 显示全部楼层
回复 26# 雪栀


    应该是只针对 ICO 标签 复选框~  其他没测试
发表于 2014-8-28 08:03:59 | 显示全部楼层
回复 1# xms77

这样应该就能满足你的要求了.
   

#include <WinAPIex.au3>
#include <apiconstants.au3>
#include <StaticConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Global $Label[3][4]
$Form1 = GUICreate("Form1", 623, 700, 192, 114)
For $j=0 To 2
        For $i=0 To 3
                $Label[$j][$i] = GUICtrlCreateLabel("Label"&$j&$i, 10+$j*200, 8+$i*150, 189, 79)
                GUICtrlSetFont(-1, 20, 800, 0, "微软雅黑")
                $handle = DllCallbackRegister("_lable_events", "ptr", "hwnd;uint;long;ptr")
                $handle2 = _WinAPI_SetWindowLong(GUICtrlGetHandle($Label[$j][$i]), $GWL_WNDPROC, DllCallbackGetPtr($handle))
        Next
Next

GUISetState(@SW_SHOW)

While 1
        Switch GUIGetMsg()
                Case -3 ; $GUI_EVENT_CLOSE
                        GUIDelete()
                        DllCallbackFree($handle) ; 必须释放否则程序不会退出
                        Exit
        EndSwitch
WEnd

Func _lable_events($hWnd, $uiMsg, $wParam, $lParam)
        Switch $uiMsg
                Case $WM_LBUTTONDBLCLK ; 左键双击
                        For $j=0 To 2
                                For $i=0 To 3
                                        If $hWnd=GUICtrlGetHandle($Label[$j][$i]) Then MsgBox(64, "提示", "双击了LABLE"&$j&$i&"!")
                                Next
                        Next
                Case $WM_RBUTTONDOWN ; 右键按下
                        For $j=0 To 2
                                For $i=0 To 3
                                        If $hWnd=GUICtrlGetHandle($Label[$j][$i]) Then MsgBox(64, "提示", "右击了LABLE"&$j&$i&"!")
                                Next
                        Next
        EndSwitch
        Return _WinAPI_CallWindowProc($handle2, $hWnd, $uiMsg, $wParam, $lParam)
EndFunc   ;==>_lable_events

评分

参与人数 1金钱 +50 贡献 +2 收起 理由
xms77 + 50 + 2 代码很好用

查看全部评分

发表于 2014-8-28 13:11:26 | 显示全部楼层
本帖最后由 seniors 于 2014-8-28 13:20 编辑

疯子,lableevent中不需要循环判断$i$j,因为ID是依次的
#include <WinAPIex.au3>
#include <apiconstants.au3>
#include <StaticConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Global $Label[3][4]
$Form1 = GUICreate("Form1", 623, 700, 192, 114)
$handle = DllCallbackRegister("_lable_events", "ptr", "hwnd;uint;long;ptr");这句只要注册一次
For $j = 0 To 2
        For $i = 0 To 3
                $Label[$j][$i] = GUICtrlCreateLabel("Label" & $j & $i, 10 + $j * 200, 8 + $i * 150, 189, 79)
                GUICtrlSetFont(-1, 20, 800, 0, "微软雅黑")
                $handle2 = _WinAPI_SetWindowLong(GUICtrlGetHandle($Label[$j][$i]), $GWL_WNDPROC, DllCallbackGetPtr($handle));这就是为每个控件注册回调函数
        Next
Next

GUISetState(@SW_SHOW)

While 1
        Switch GUIGetMsg()
                Case -3 ; $GUI_EVENT_CLOSE
                        GUIDelete()
                        DllCallbackFree($handle) ; 必须释放否则程序不会退出
                        Exit
        EndSwitch
WEnd

Func _lable_events($hWnd, $uiMsg, $wParam, $lParam)
        Local $hcId
        $hcId = _WinAPI_GetDlgCtrlID($hWnd)
        ;如果要知道第几行第几列就计算一下
;~         #cs
        Local $i, $j
        $i = Int(($hcId - 3) / 4);列
        $j = Mod($hcId - 3, 4);行
;~         #ce
        Switch $uiMsg
                Case $WM_LBUTTONDBLCLK ; 左键双击
                        MsgBox(64, "提示", "双击了LABLE" & $i & $j & " !")
                Case $WM_RBUTTONDOWN ; 右键按下
                        MsgBox(64, "提示", "双击了LABLE" & $i & $j & " !")
        EndSwitch
        Return _WinAPI_CallWindowProc($handle2, $hWnd, $uiMsg, $wParam, $lParam)
EndFunc   ;==>_lable_events

$hcid = 3 即 lable00
$hcid = 4 即 lable01
$hcid = 5 即 lable02
$hcid = 6 即 lable03
$hcid = 7 即 lable10
...
 楼主| 发表于 2014-8-29 21:48:09 | 显示全部楼层
回复 28# lanfengc \\
感谢疯子大侠的代码,很好用。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-22 06:57 , Processed in 0.078437 second(s), 18 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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