找回密码
 加入
搜索
查看: 12326|回复: 20

[GUI管理] [已解决]多标签批量创建的按钮如何捕捉消息?

 火.. [复制链接]
发表于 2014-9-10 16:02:42 | 显示全部楼层 |阅读模式
本帖最后由 邪恶海盗 于 2014-9-15 09:40 编辑
        For $i1 = 1 To $var[0]
                GUICtrlCreateTabItem($var[$i1])
           GUICtrlCreateButton("按钮1", 20, 40, 160, 50)
              GUICtrlCreateButton("按钮2", 20, 40, 160, 50)
       Next
如题,如何捕捉按钮按下的消息?
 楼主| 发表于 2014-9-11 09:07:32 | 显示全部楼层
补充一下,比如根据配置文件创建的标签页有1-$X($X>0),每个标签页内又有按钮0-8,这样地话按钮就有$Button[0][0]-$Button[$X][8],怎么分别捕捉每个按钮的消息呢???
发表于 2014-9-11 13:40:29 | 显示全部楼层
上全代码,才好分析问题~
发表于 2014-9-11 13:51:40 | 显示全部楼层
可以详细了解一下 eval 的用途

可 解 你 的 迷 惑
 楼主| 发表于 2014-9-11 14:05:45 | 显示全部楼层
回复 3# austere
#include <GUIConstantsEx.au3>

Dim $x[5] = ["一", "二", "三", "四", "五"]
Dim $y[6] = ["11", "21", "31", "41", "51", "61"]

GUICreate("主窗口", 300, 300) ;创建主窗口
GUICtrlCreateTab(0, 0, 300, 300)
For $i1 = 0 To 4
        GUICtrlCreateTabItem($x[$i1])
        For $i2 = 0 To 5
                GUICtrlCreateButton($x[$i1] & $y[$i2], 20, 30 + 40 * $i2, 50, 30)
        Next

Next
GUISetState(@SW_SHOW)

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit

        EndSwitch
WEnd
精简之后的...
发表于 2014-9-11 17:35:47 | 显示全部楼层
本帖最后由 shqf 于 2014-9-11 17:40 编辑

GUIGetMsg()会捕捉事件消息的呀,所以剩下的是判断的问题:事件消息是哪个控件产生的?
我想到的方法是一个个case来判断。或者用个循环,里面是用一句case也可以,再一句执行相应的自定义函数。
发表于 2014-9-11 19:16:30 | 显示全部楼层
同意楼上的,用case~~
 楼主| 发表于 2014-9-11 20:48:55 | 显示全部楼层
回复 6# shqf


    试过,没成功,不知道具体该咋写...
发表于 2014-9-12 14:49:23 | 显示全部楼层
根据最后点击按钮的ID做为执行条件·
 楼主| 发表于 2014-9-12 15:25:35 | 显示全部楼层
回复 9# sdc7


    关键是怎么判断最后点击的按钮ID...
发表于 2014-9-12 15:29:55 | 显示全部楼层
#include <GUIConstantsEx.au3>

Dim $x[5] = ["一", "二", "三", "四", "五"]
Dim $y[6] = ["11", "21", "31", "41", "51", "61"]
Dim $Button[5][6]

GUICreate("主窗口", 300, 300) ;创建主窗口
GUICtrlCreateTab(0, 0, 300, 300)
For $i1 = 0 To 4
        GUICtrlCreateTabItem($x[$i1])
        For $i2 = 0 To 5
                $Button[$i1][$i2] = GUICtrlCreateButton($x[$i1] & $y[$i2], 20, 30 + 40 * $i2, 50, 30)
        Next

Next
GUISetState(@SW_SHOW)

While 1
        $nMsg = GUIGetMsg()
        If $nMsg = $GUI_EVENT_CLOSE Then Exit        
        For $i1 = 0 To 4
                For $i2 = 0 To 5
                        If $nMsg = $Button[$i1][$i2] Then
                                MyFun(String($i1) & String($i2))
                                ExitLoop
                        EndIf
                Next
        Next
WEnd

Func MyFun($btnIndex)
        Switch $btnIndex
                Case "00"
                        MsgBox(0, "", "你按了 一11 按钮")
                Case "01"
                        MsgBox(0, "", "你按了 一21 按钮")
                Case "02"
                        MsgBox(0, "", "你按了 一31 按钮")
        EndSwitch        
EndFunc   ;==>MyFun
 楼主| 发表于 2014-9-12 16:39:20 | 显示全部楼层
回复 11# shqf


    我咋测试只有标签一按钮有效,其它标签页按钮无效???
 楼主| 发表于 2014-9-12 16:42:48 | 显示全部楼层
回复 11# shqf


把MyFun(String($i1) & String($i2))换成MsgBox(0,0,$i1&"&"&$i2,5)测试成功,我再试试看...
 楼主| 发表于 2014-9-12 17:35:43 | 显示全部楼层
回复 11# shqf

使用方法代入我自己的代码测试成功了,不过我还是想了解一下这段代码
        If $nMsg = $GUI_EVENT_CLOSE Then Exit        
        For $i1 = 0 To 4
                For $i2 = 0 To 5
                        If $nMsg = $Button[$i1][$i2] Then
                                MyFun(String($i1) & String($i2))
                                ExitLoop
                        EndIf
                Next
        Next
与我们平时用的Swich-case-case有什么区别可以解释一下不???
发表于 2014-9-15 09:08:27 | 显示全部楼层
本帖最后由 shqf 于 2014-9-15 09:12 编辑

GUIGetMsg()是捕获窗口中产生的消息,其返回的“事件”其实是产生消息的控件ID号,所以GUICtrlCreateButton()语句必须要将其返回值也就是ID赋值给变量,这里用数组比较好(11楼的12句),以便后面用来判断产生消息的是哪个控件(11楼的23句)。以上是本程序的关键。11楼的MyFun()自定义函数里我偷懒只写了3 种情况,所以只能响应3个按钮。应该是所有按钮的处理代码都 要列出,所以完整的话要有30个case,你自己完成哈。至于Swich-case-case与If语句无什么大的区别,都是条件选择语句,Swich-case通常用于条件较多时候的判断,它比If语句往往要更清晰。但本例中因为混杂了循环语句(11楼的20-28句),用case不行,所以改用if。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-22 17:37 , Processed in 0.092318 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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