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 \\
感谢疯子大侠的代码,很好用。