邪恶海盗 发表于 2014-9-10 16:02:42

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

本帖最后由 邪恶海盗 于 2014-9-15 09:40 编辑

      For $i1 = 1 To $var
                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-$Button[$X],怎么分别捕捉每个按钮的消息呢???

austere 发表于 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 = ["一", "二", "三", "四", "五"]
Dim $y = ["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
精简之后的...

shqf 发表于 2014-9-11 17:35:47

本帖最后由 shqf 于 2014-9-11 17:40 编辑

GUIGetMsg()会捕捉事件消息的呀,所以剩下的是判断的问题:事件消息是哪个控件产生的?
我想到的方法是一个个case来判断。或者用个循环,里面是用一句case也可以,再一句执行相应的自定义函数。

austere 发表于 2014-9-11 19:16:30

同意楼上的,用case~~

邪恶海盗 发表于 2014-9-11 20:48:55

回复 6# shqf


    试过,没成功,不知道具体该咋写...

sdc7 发表于 2014-9-12 14:49:23

根据最后点击按钮的ID做为执行条件·

邪恶海盗 发表于 2014-9-12 15:25:35

回复 9# sdc7


    关键是怎么判断最后点击的按钮ID...

shqf 发表于 2014-9-12 15:29:55

#include <GUIConstantsEx.au3>

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

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有什么区别可以解释一下不???

shqf 发表于 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。
页: [1] 2
查看完整版本: [已解决]多标签批量创建的按钮如何捕捉消息?