本帖最后由 xyx115 于 2019-2-26 10:26 编辑
为了快速编写相关的按钮动作,在写GUI时,绘制动态的软件界面按钮,采用了数组的方法,创建5行按钮,每行5个。(实际情况会更多)
当鼠标点击某按钮的时候,可以获取到这个控件的id和按钮的句柄,例如$But_pid[1][3],请问如何获取到这个被触发的$But_pid[1][3](按钮句柄)的下标,即其中的1和3.
如果可以获取到这个1和3,那么我只需要简单的一个方法,即可写出所有按钮对应的自定义函数动作。
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
__Gui_0_Create_GUICreate()
__Gui_While()
Func __Gui_0_Create_GUICreate()
Global $List_Size = 5
Global $BH00[12]
Global $BH01[12]
Global $BH02[12]
Global $BH03[12]
Global $BH04[12]
Global $BH05[12]
Global $Gui_Main = GUICreate('TEST', 800, 480, -1, -1)
__Gui_1_Create_Label()
GUISetState(@SW_SHOW)
EndFunc ;==>__Gui_0_Create_GUICreate
Func __Gui_1_Create_Label()
;绘画软件界面的表格
For $i = 0 To $List_Size;左边大表格框中的行数。服务器个数。
Switch $i
Case 0
Case 1
Case Else;如果文件夹字符串不为空,则拆分字符串,对每个定义的共享文件夹进行处理
For $j = 0 To 5
Switch $j
Case 1
$BH01[$i] = GUICtrlCreateLabel("菜单" & $i & '-' & $j, 120, 80 + $i * 30, 80, 20, $SS_CENTER)
Case 2
$BH02[$i] = GUICtrlCreateLabel("菜单" & $i & '-' & $j, 220, 80 + $i * 30, 80, 20, $SS_CENTER)
Case 3
$BH03[$i] = GUICtrlCreateLabel("菜单" & $i & '-' & $j, 320, 80 + $i * 30, 80, 20, $SS_CENTER)
Case 4
$BH04[$i] = GUICtrlCreateLabel("菜单" & $i & '-' & $j, 420, 80 + $i * 30, 80, 20, $SS_CENTER)
Case 5
$BH05[$i] = GUICtrlCreateLabel("菜单" & $i & '-' & $j, 520, 80 + $i * 30, 80, 20, $SS_CENTER)
EndSwitch
Next
EndSwitch
Next
EndFunc ;==>__Gui_1_Create_Label
Func __Gui_While()
Local $otherother
While 1
$nMsg = GUIGetMsg(0)
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $otherother
Case $BH00[0], $BH00[1], $BH00[2], $BH00[3], $BH00[4], $BH00[5], $BH00[6], $BH00[7], $BH00[8], $BH00[9], $BH00[10], $BH00[11]
;需要一个方法,知道$BH00变量的下标。方便后面直接根据函数下标进行操作。
___Gui_Lie_001(GUIGetCursorInfo($Gui_Main))
Case $BH01[0], $BH01[1], $BH01[2], $BH01[3], $BH01[4], $BH01[5], $BH01[6], $BH01[7], $BH01[8], $BH01[9], $BH01[10], $BH01[11]
;需要一个方法,知道$BH01变量的下标。方便后面直接根据函数下标进行操作。
___Gui_Lie_002(GUIGetCursorInfo($Gui_Main))
Case $BH02[0], $BH02[1], $BH02[2], $BH02[3], $BH02[4], $BH02[5], $BH02[6], $BH02[7], $BH02[8], $BH02[9], $BH02[10], $BH02[11]
;需要一个方法,知道$BH02变量的下标。方便后面直接根据函数下标进行操作。
___Gui_Lie_003(GUIGetCursorInfo($Gui_Main))
Case $BH03[0], $BH03[1], $BH03[2], $BH03[3], $BH03[4], $BH03[5], $BH03[6], $BH03[7], $BH03[8], $BH03[9], $BH03[10], $BH03[11]
;需要一个方法,知道$BH03变量的下标。方便后面直接根据函数下标进行操作。
___Gui_Lie_004(GUIGetCursorInfo($Gui_Main))
Case $BH04[0], $BH04[1], $BH04[2], $BH04[3], $BH04[4], $BH04[5], $BH04[6], $BH04[7], $BH04[8], $BH04[9], $BH04[10], $BH04[11]
;需要一个方法,知道$BH04变量的下标。方便后面直接根据函数下标进行操作。
___Gui_Lie_005(GUIGetCursorInfo($Gui_Main))
Case $BH05[0], $BH05[1], $BH05[2], $BH05[3], $BH05[4], $BH05[5], $BH05[6], $BH05[7], $BH05[8], $BH05[9], $BH05[10], $BH05[11]
;需要一个方法,知道$BH05变量的下标。方便后面直接根据函数下标进行操作。
___Gui_Lie_006(GUIGetCursorInfo($Gui_Main))
EndSwitch
WEnd
EndFunc ;==>__Gui_While
Func ___Gui_Lie_001($s1)
MsgBox(0, '服务器描述', @CRLF & _
@CRLF & '鼠标悬停位置的控件 ID:' & $s1[4])
EndFunc ;==>___Gui_Lie_001
Func ___Gui_Lie_002($s1)
MsgBox(0, '服务器描述', @CRLF & _
@CRLF & '鼠标悬停位置的控件 ID:' & $s1[4])
EndFunc ;==>___Gui_Lie_002
Func ___Gui_Lie_003($s1)
MsgBox(0, '服务器描述', @CRLF & _
@CRLF & '鼠标悬停位置的控件 ID:' & $s1[4])
EndFunc ;==>___Gui_Lie_003
Func ___Gui_Lie_004($s1)
MsgBox(0, '服务器描述', @CRLF & _
@CRLF & '鼠标悬停位置的控件 ID:' & $s1[4])
EndFunc ;==>___Gui_Lie_004
Func ___Gui_Lie_005($s1)
MsgBox(0, '服务器描述', @CRLF & _
@CRLF & '鼠标悬停位置的控件 ID:' & $s1[4])
EndFunc ;==>___Gui_Lie_005
Func ___Gui_Lie_006($s1)
MsgBox(0, '服务器描述', @CRLF & _
@CRLF & '鼠标悬停位置的控件 ID:' & $s1[4])
EndFunc ;==>___Gui_Lie_006
根据2楼和4楼的帖子思路,自制完成以下自定义函数,可获取数组变量的下标。Func __Get_the_array_var_subscript($Array_Var, $Array_Var_Name)
;函数功能: 获取给定的数组变量的下标。
;输入参数1:$Array_Var 要获取下标的数组变量
;输入参数2:$Array_Var_Name 要获取下标的数组变量名称
;输出结果: $Array_vari_sub 获取到的数组变量的下标。
; $Array_vari_sub[0]为该变量的行下标
; $Array_vari_sub[1]为该变量的列下标
;作者:迷路轮回
;注意事项:数组中的元素不能存在重复值,否则可能会出错。适合GUI绘制的窗口句柄(不会重复)调用。
For $i = 0 To UBound($Array_Var_Name, $UBOUND_ROWS) - 1;遍历数组
For $j = 0 To UBound($Array_Var_Name, $UBOUND_COLUMNS) - 1;遍历数组
If $Array_Var = $Array_Var_Name[$i][$j] Then
Local $Array_var_sub[2] = [$i, $j]
Return $Array_var_sub
EndIf
Next
Next
EndFunc ;==>__Get_the_array_var_subscript
调用方法如下:#include <AutoItConstants.au3>
#include <Array.au3> ; 为 _ArrayDisplay 函数需要.
Global $HD_TabIt1_SerBut[3][8], $Get_Row_Column
$HD_TabIt1_SerBut[2][6] = 8
$sd = __Get_the_array_var_subscript($HD_TabIt1_SerBut[2][6], $HD_TabIt1_SerBut)
MsgBox(0, 0, '数组变量$HD_TabIt1_SerBut[2][6]' & @CRLF & '行下标是:' & $sd[0] & @CRLF & '列下标是:' & $sd[1])
Exit
具体参见UDF帖:获取多维数组的下标 |