xms77 发表于 2014-8-19 15:51:58

回复 14# afan
A大请指教一下,谢谢了先!

meteor0330 发表于 2014-8-20 09:34:05

回复 14# afan

请问A大,我一直都没搞明白那个windows消息,
特别是我应该怎样直接在双击、右键消息里面识别当前的控件并处理呢?

austere 发表于 2014-8-22 00:33:51

回复 2# user3000


    借问一下大神,如果有多个lable控件的话,我是说非常多的情况,Case $WM_LBUTTONDBLCLK ; 左键双击
                        MsgBox(64, "提示", "双击了LABLE!")
                Case $WM_RBUTTONDOWN ; 右键按下
                        MsgBox(64, "提示", "右击了LABLE!")这个双击和单机中,如果获得是双击了哪个控件呢? 批量的控件我是用 for    to 来添加的,但是这里对所有的都有作用,case触发用的是数组

user3000 发表于 2014-8-22 07:21:08

回复 18# austere Case $WM_RBUTTONDOWN ; 右键按下
    MsgBox(64, "右击LABLE", GUICtrlGetHandle($Label1) & @CR & $hWnd)

user3000 发表于 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

austere 发表于 2014-8-22 08:15:37

回复 19# user3000 Case $WM_RBUTTONDOWN ; 右键按下
    MsgBox(64, "右击LABLE", GUICtrlGetHandle($Label1) & @CR & $hWnd)可能是我描述有问题,我的意思是这样,不知道怎么实现Case $WM_RBUTTONDOWNand 双击了控件1      
执行 1
Case $WM_RBUTTONDOWNand 双击了控件2
执行 2

user3000 发表于 2014-8-22 12:40:15

回复 21# austere

请参考20楼的代码

具体应该是这样:
Case $WM_RBUTTONDOWN
         Switch 控件ID
                  Case 控件1
                           执行1
                     Case 控件2
                           执行2
                      ;....
          EndSwitch

netegg 发表于 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
                $child = IniReadSection($ini, $aSec[$i])
                If @error Then;类
                        $hItem = GUICtrlCreateTreeViewItem($aSec[$i], $hClass)
                Else;子类
                        $hClass1 = GUICtrlCreateTreeViewItem($aSec[$i], $hClass)
                        readinfo($ini, $hClass, $aSec[$i], $hClass1)
                EndIf
      Next
      Return True
EndFunc   ;==>readinfo

playlist.ini
List1=List1
List2=List2


1=0001
2=0010


3=0011如果这类烦人的单击、双击、右击控件的问题(……话说这两天一直在找这方面资料)解决了,大家可以整合一下别的什么GUICtrlOnHover之类的,最好能写个UDF,顺便根据p版的说法,这种SetWindowLong的方法好像还能在某些方面模拟一下多线程,多学习学习也是好的

user3000 发表于 2014-8-27 21:45:44

回复 24# 雪栀

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

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

你的代码:GUICtrlGetHandle($Manage)
该变量储存的是窗体的句柄,已经是错误性地调用此函数了!

雪栀 发表于 2014-8-27 23:14:28

回复 25# user3000


    感谢解答……有空我去官网找找这方面资料

austere 发表于 2014-8-28 01:14:34

回复 26# 雪栀


    应该是只针对 ICO 标签 复选框~其他没测试

lanfengc 发表于 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
$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

seniors 发表于 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
$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
...

xms77 发表于 2014-8-29 21:48:09

回复 28# lanfengc \\
感谢疯子大侠的代码,很好用。
页: 1 [2] 3
查看完整版本: Label控件能不能接受双击或右键的消息?