Что нового

_GUICtrlButton_Show срабатывает через раз

saraconor

Новичок
Сообщения
404
Репутация
3
Код:
#include <ButtonConstants.au3>
#include <GuiButton.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Opt("TrayIconDebug", 1)
#Region
$Form1 = GUICreate("Метадатер", 938, 290, 192, 124)
$Button1 = GUICtrlCreateButton("КНОПКА 1", 8, 8, 185, 41)
;GUICtrlSetFont(-1, 12, 400, 0, "Days")
$Button2 = GUICtrlCreateButton("КНОПКА 2", 200, 8, 177, 41)
;GUICtrlSetFont(-1, 12, 400, 0, "Days")
$Button3 = GUICtrlCreateButton("КНОПКА 3", 384, 8, 177, 41)
;GUICtrlSetFont(-1, 12, 400, 0, "Days")
$Button4 = GUICtrlCreateButton("КНОПКА 4", 568, 8, 177, 41)
;GUICtrlSetFont(-1, 12, 400, 0, "Days")
$Button5 = GUICtrlCreateButton("КНОПКА 5", 752, 8, 177, 41)
;GUICtrlSetFont(-1, 12, 400, 0, "Days")
$Button6 = GUICtrlCreateButton("КНОПКА 6", 8, 248, 921, 33)
;GUICtrlSetFont(-1, 15, 400, 0, "Days")
$Button7 = GUICtrlCreateButton("КНОП 1", 8, 56, 225, 25)
;GUICtrlSetFont(-1, 10, 400, 0, "Days")
$Button8 = GUICtrlCreateButton("КНОП 2", 8, 88, 225, 25)
;GUICtrlSetFont(-1, 10, 400, 0, "Days")
$Button9 = GUICtrlCreateButton("КНОП 3", 8, 120, 225, 25)
;GUICtrlSetFont(-1, 10, 400, 0, "Days")
$Button10 = GUICtrlCreateButton("КНОП 4", 8, 152, 225, 25)
;GUICtrlSetFont(-1, 10, 400, 0, "Days")
$Button11 = GUICtrlCreateButton("КНОП 5", 8, 184, 225, 25)
;GUICtrlSetFont(-1, 10, 400, 0, "Days")
$Button12 = GUICtrlCreateButton("КНОП 6", 8, 216, 225, 25)
;GUICtrlSetFont(-1, 10, 400, 0, "Days")
GUISetState(@SW_SHOW)
#EndRegion

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $Button1
			_GUICtrlButton_SetState($Button1,True)
			_GUICtrlButton_SetState($Button2,False)
			_GUICtrlButton_Show($Button7,True)
			_GUICtrlButton_Show($Button8,True)
			_GUICtrlButton_Show($Button9,True)
			_GUICtrlButton_Show($Button10,True)
			_GUICtrlButton_Show($Button11,True)
			_GUICtrlButton_Show($Button12,True)

		Case $Button2
			_GUICtrlButton_SetState($Button2,True)
			_GUICtrlButton_SetState($Button1,False)
			_GUICtrlButton_Show($Button7,False)
			_GUICtrlButton_Show($Button8,False)
			_GUICtrlButton_Show($Button9,False)
			_GUICtrlButton_Show($Button10,False)
			_GUICtrlButton_Show($Button11,False)
			_GUICtrlButton_Show($Button12,False)

		Case $GUI_EVENT_CLOSE
			Exit
	sleep(20)
	EndSwitch
WEnd


По идее переключаясь между кнопками $Button1 и $Button2 скрипт должен их последовательно подсвечивать и гасить, а на деле выходит что нужно 2 раза на кнопку нажимать, почему так и как этого избежать?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Код:
#include <GUIConstants.au3>

$Form1 = GUICreate("Метадатер", 938, 290, 192, 124)
$Button1 = GUICtrlCreateButton("КНОПКА 1", 8, 8, 185, 41)
;GUICtrlSetFont(-1, 12, 400, 0, "Days")
$Button2 = GUICtrlCreateButton("КНОПКА 2", 200, 8, 177, 41)
;GUICtrlSetFont(-1, 12, 400, 0, "Days")
$Button3 = GUICtrlCreateButton("КНОПКА 3", 384, 8, 177, 41)
;GUICtrlSetFont(-1, 12, 400, 0, "Days")
$Button4 = GUICtrlCreateButton("КНОПКА 4", 568, 8, 177, 41)
;GUICtrlSetFont(-1, 12, 400, 0, "Days")
$Button5 = GUICtrlCreateButton("КНОПКА 5", 752, 8, 177, 41)
;GUICtrlSetFont(-1, 12, 400, 0, "Days")
$Button6 = GUICtrlCreateButton("КНОПКА 6", 8, 248, 921, 33)
;GUICtrlSetFont(-1, 15, 400, 0, "Days")
$Button7 = GUICtrlCreateButton("КНОП 1", 8, 56, 225, 25)
;GUICtrlSetFont(-1, 10, 400, 0, "Days")
$Button8 = GUICtrlCreateButton("КНОП 2", 8, 88, 225, 25)
;GUICtrlSetFont(-1, 10, 400, 0, "Days")
$Button9 = GUICtrlCreateButton("КНОП 3", 8, 120, 225, 25)
;GUICtrlSetFont(-1, 10, 400, 0, "Days")
$Button10 = GUICtrlCreateButton("КНОП 4", 8, 152, 225, 25)
;GUICtrlSetFont(-1, 10, 400, 0, "Days")
$Button11 = GUICtrlCreateButton("КНОП 5", 8, 184, 225, 25)
;GUICtrlSetFont(-1, 10, 400, 0, "Days")
$Button12 = GUICtrlCreateButton("КНОП 6", 8, 216, 225, 25)
;GUICtrlSetFont(-1, 10, 400, 0, "Days")
GUISetState(@SW_SHOW)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $Button1
			GUICtrlSetState($Button7, $GUI_SHOW)
			GUICtrlSetState($Button8, $GUI_SHOW)
			GUICtrlSetState($Button9, $GUI_SHOW)
			GUICtrlSetState($Button10, $GUI_SHOW)
			GUICtrlSetState($Button11, $GUI_SHOW)
			GUICtrlSetState($Button12, $GUI_SHOW)
		Case $Button2
			GUICtrlSetState($Button7, $GUI_HIDE)
			GUICtrlSetState($Button8, $GUI_HIDE)
			GUICtrlSetState($Button9, $GUI_HIDE)
			GUICtrlSetState($Button10, $GUI_HIDE)
			GUICtrlSetState($Button11, $GUI_HIDE)
			GUICtrlSetState($Button12, $GUI_HIDE)
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd


P.S

А вообще, в таких случаях лучше использовать массив, а не 100500 переменных $Button1, $Button2 и т.д.
 
Автор
S

saraconor

Новичок
Сообщения
404
Репутация
3
Yashied
В вашем примере кнопки $Button1 $Button2 вообще перестали "вдавливаться" (_GUICtrlButton_SetState) частичное решение кстати найдено:
Код:
#include <ButtonConstants.au3>
#include <GuiButton.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Opt("TrayIconDebug", 1)
#Region
$Form1 = GUICreate("Метадатер", 938, 290, 192, 124)
$Button1 = GUICtrlCreateButton("КНОПКА 1", 8, 8, 185, 41)
;GUICtrlSetFont(-1, 12, 400, 0, "Days")
$Button2 = GUICtrlCreateButton("КНОПКА 2", 200, 8, 177, 41)
;GUICtrlSetFont(-1, 12, 400, 0, "Days")
$Button3 = GUICtrlCreateButton("КНОПКА 3", 384, 8, 177, 41)
;GUICtrlSetFont(-1, 12, 400, 0, "Days")
$Button4 = GUICtrlCreateButton("КНОПКА 4", 568, 8, 177, 41)
;GUICtrlSetFont(-1, 12, 400, 0, "Days")
$Button5 = GUICtrlCreateButton("КНОПКА 5", 752, 8, 177, 41)
;GUICtrlSetFont(-1, 12, 400, 0, "Days")
$Button6 = GUICtrlCreateButton("КНОПКА 6", 8, 248, 921, 33)
;GUICtrlSetFont(-1, 15, 400, 0, "Days")
$Button7 = GUICtrlCreateButton("КНОП 1", 8, 56, 225, 25)
;GUICtrlSetFont(-1, 10, 400, 0, "Days")
$Button8 = GUICtrlCreateButton("КНОП 2", 8, 88, 225, 25)
;GUICtrlSetFont(-1, 10, 400, 0, "Days")
$Button9 = GUICtrlCreateButton("КНОП 3", 8, 120, 225, 25)
;GUICtrlSetFont(-1, 10, 400, 0, "Days")
$Button10 = GUICtrlCreateButton("КНОП 4", 8, 152, 225, 25)
;GUICtrlSetFont(-1, 10, 400, 0, "Days")
$Button11 = GUICtrlCreateButton("КНОП 5", 8, 184, 225, 25)
;GUICtrlSetFont(-1, 10, 400, 0, "Days")
$Button12 = GUICtrlCreateButton("КНОП 6", 8, 216, 225, 25)
;GUICtrlSetFont(-1, 10, 400, 0, "Days")
GUISetState(@SW_SHOW)
#EndRegion


While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $Button1
			_GUICtrlButton_SetState($Button1,True)
			_GUICtrlButton_SetState($Button2,False)
			_GUICtrlButton_Show($Button7,True)
			_GUICtrlButton_Show($Button8,True)
			_GUICtrlButton_Show($Button9,True)
			_GUICtrlButton_Show($Button10,True)
			_GUICtrlButton_Show($Button11,True)
			_GUICtrlButton_Show($Button12,True)
			ToolTip('1')
			Sleep(1)
			ToolTip('')

		Case $Button2
			_GUICtrlButton_SetState($Button2,True)
			_GUICtrlButton_SetState($Button1,False)
			_GUICtrlButton_Show($Button7,False)
			_GUICtrlButton_Show($Button8,False)
			_GUICtrlButton_Show($Button9,False)
			_GUICtrlButton_Show($Button10,False)
			_GUICtrlButton_Show($Button11,False)
			_GUICtrlButton_Show($Button12,False)
			ToolTip('2')
			Sleep(1)
			ToolTip('')

		Case $GUI_EVENT_CLOSE
			Exit
	sleep(20)
EndSwitch
WEnd

Или вот так:
Код:
#include <ButtonConstants.au3>
#include <GuiButton.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Opt("TrayIconDebug", 1)

#Region
$Form1 = GUICreate("Метадатер", 938, 290, 192, 124)
$Button1 = GUICtrlCreateButton("КНОПКА 1", 8, 8, 185, 41)
;GUICtrlSetFont(-1, 12, 400, 0, "Days")
$Button2 = GUICtrlCreateButton("КНОПКА 2", 200, 8, 177, 41)
;GUICtrlSetFont(-1, 12, 400, 0, "Days")
$Button3 = GUICtrlCreateButton("КНОПКА 3", 384, 8, 177, 41)
;GUICtrlSetFont(-1, 12, 400, 0, "Days")
$Button4 = GUICtrlCreateButton("КНОПКА 4", 568, 8, 177, 41)
;GUICtrlSetFont(-1, 12, 400, 0, "Days")
$Button5 = GUICtrlCreateButton("КНОПКА 5", 752, 8, 177, 41)
;GUICtrlSetFont(-1, 12, 400, 0, "Days")
$Button6 = GUICtrlCreateButton("КНОПКА 6", 8, 248, 921, 33)
;GUICtrlSetFont(-1, 15, 400, 0, "Days")
$Button7 = GUICtrlCreateButton("ТЕХ 1", 8, 56, 225, 25)
;GUICtrlSetFont(-1, 10, 400, 0, "Days")
$Button8 = GUICtrlCreateButton("ТЕХ 2", 8, 88, 225, 25)
;GUICtrlSetFont(-1, 10, 400, 0, "Days")
$Button9 = GUICtrlCreateButton("ТЕХ 3", 8, 120, 225, 25)
;GUICtrlSetFont(-1, 10, 400, 0, "Days")
$Button10 = GUICtrlCreateButton("ТЕХ 4", 8, 152, 225, 25)
;GUICtrlSetFont(-1, 10, 400, 0, "Days")
$Button11 = GUICtrlCreateButton("ТЕХ 5", 8, 184, 225, 25)
;GUICtrlSetFont(-1, 10, 400, 0, "Days")
$Button12 = GUICtrlCreateButton("ТЕХ 6", 8, 216, 225, 25)
;GUICtrlSetFont(-1, 10, 400, 0, "Days")
GUISetState(@SW_SHOW)
#EndRegion

Cicle()
Func Cicle()
While 1
	$nMsg = GUIGetMsg()
	ToolTip($nMsg)
	Switch $nMsg
		Case $Button1
			_GUICtrlButton_SetState($Button1,True)
			_GUICtrlButton_SetState($Button2,False)
			_GUICtrlButton_Show($Button7,True)
			_GUICtrlButton_Show($Button8,True)
			_GUICtrlButton_Show($Button9,True)
			_GUICtrlButton_Show($Button10,True)
			_GUICtrlButton_Show($Button11,True)
			_GUICtrlButton_Show($Button12,True)
		Case $Button2
			_GUICtrlButton_SetState($Button2,True)
			_GUICtrlButton_SetState($Button1,False)
			_GUICtrlButton_Show($Button7,False)
			_GUICtrlButton_Show($Button8,False)
			_GUICtrlButton_Show($Button9,False)
			_GUICtrlButton_Show($Button10,False)
			_GUICtrlButton_Show($Button11,False)
			_GUICtrlButton_Show($Button12,False)

		Case $GUI_EVENT_CLOSE
			Exit
	sleep(500)
EndSwitch
WEnd
EndFunc

Вот только как бы без tooltip все сделать?

Yashied сказал(а):
А вообще, в таких случаях лучше использовать массив, а не 100500 переменных $Button1, $Button2 и т.д.
Приведите пожалуйста пример? как можно сделать массив для кнопок которые имеют разные параметры размеров и координат?
 
Автор
S

saraconor

Новичок
Сообщения
404
Репутация
3
Кто-нибудь может подсказать решение? :'(


Добавлено:
Сообщение автоматически объединено:

Найдено приемлемое решение:
Код:
#include <ButtonConstants.au3>
#include <GuiButton.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Opt("TrayIconDebug", 1)
$w = 1
$Form1 = GUICreate("Метадатер", 938, 290, 192, 124)
$Button1 = GUICtrlCreateButton("КНОПКА 1", 8, 8, 185, 41)
;GUICtrlSetFont(-1, 12, 400, 0, "Days")
$Button2 = GUICtrlCreateButton("КНОПКА 2", 200, 8, 177, 41)
;GUICtrlSetFont(-1, 12, 400, 0, "Days")
$Button7 = GUICtrlCreateButton("КНОП 1", 8, 56, 225, 25)
;GUICtrlSetFont(-1, 10, 400, 0, "Days")
$Button8 = GUICtrlCreateButton("КНОП 2", 8, 88, 225, 25)
;GUICtrlSetFont(-1, 10, 400, 0, "Days")
GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
		Case $Button1
			_GUICtrlButton_SetState($Button1,True)
            _GUICtrlButton_SetState($Button2,False)
            GUICtrlSetState($Button7, $GUI_SHOW)
            GUICtrlSetState($Button8, $GUI_SHOW)
			WinSetOnTop('Метадатер','',1)
			WinSetOnTop('Метадатер','',0)
        Case $Button2
			_GUICtrlButton_SetState($Button1,False)
			_GUICtrlButton_SetState($Button2,True)
            GUICtrlSetState($Button7, $GUI_HIDE)
            GUICtrlSetState($Button8, $GUI_HIDE)
			WinSetOnTop('Метадатер','',1)
			WinSetOnTop('Метадатер','',0)
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Не знаю на сколько оно "орфографически" верное, но работает именно так как надо, т.е. зажимает одну кнопку и отжимает другую, если у кого-нибудь есть более элегантное решение с объяснением сути ошибки то напишите тут пожалуйста.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
saraconor [?]
Потому что _GUICtrlButton_SetState вызывает событие кнопок.

как этого избежать?
Проверять (флажки)...

[?]
как можно сделать массив для кнопок

Код:
#include <ButtonConstants.au3>
#include <GuiButton.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Opt("TrayIconDebug", 1)

Global $aBttns[4] = [3]
Global $aFlags[2] = [0, 0]

$hForm = GUICreate("Метадатер", 938, 290, 192, 124)

$Button1 = GUICtrlCreateButton("КНОПКА 1", 8, 8, 185, 41)
;GUICtrlSetFont(-1, 12, 400, 0, "Days")
$Button2 = GUICtrlCreateButton("КНОПКА 2", 200, 8, 177, 41)
;GUICtrlSetFont(-1, 12, 400, 0, "Days")

$aBttns[1] = GUICtrlCreateButton("КНОП 1", 8, 56, 225, 25)
;GUICtrlSetFont(-1, 10, 400, 0, "Days")
$aBttns[2] = GUICtrlCreateButton("КНОП 2", 8, 88, 225, 25)
;GUICtrlSetFont(-1, 10, 400, 0, "Days")
$aBttns[3] = GUICtrlCreateButton("КНОП 3", 8, 120, 225, 25)
;GUICtrlSetFont(-1, 10, 400, 0, "Days")

GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
	
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
		Case $Button1
			If $aFlags[0] Then
				$aFlags[0] = 0
				ContinueLoop
			EndIf
			
			$aFlags[0] = 1
			
            _GUICtrlButton_SetState($Button1, True)
            _GUICtrlButton_SetState($Button2, False)
			
			For $i = 1 To $aBttns[0]
				GUICtrlSetState($aBttns[$i], $GUI_SHOW)
			Next
        Case $Button2
			If $aFlags[1] Then
				$aFlags[1] = 0
				ContinueLoop
			EndIf
			
			$aFlags[1] = 1
			
            _GUICtrlButton_SetState($Button1, False)
            _GUICtrlButton_SetState($Button2, True)
			
			For $i = 1 To $aBttns[0]
				GUICtrlSetState($aBttns[$i], $GUI_HIDE)
			Next
    EndSwitch
WEnd
 
Автор
S

saraconor

Новичок
Сообщения
404
Репутация
3
Yashied
Благодарю за идею со вставкой кнопок через цикл с массивами. Очень компактный и удобный в дальнейшем скрипт получается
 

Vintets

Новичок
Сообщения
12
Репутация
4
CreatoR сказал(а):
Потому что _GUICtrlButton_SetState вызывает событие кнопок.

А зачем он это делает? Или это просто вредные особенности реализации?
Сколько проблем добавляет. И в чистом виде выходит функцией пользоваться не получается.

Даже с таким использованием флагов, при повторном клике на нажатой кнопке, она отжимается.
Покумекал тут, попереставлял флаги и вынес _GUICtrlButton_SetState со значениями True в начала блоков Case. Теперь вроде всё корректно.

Код:
#include <ButtonConstants.au3>
#include <GuiButton.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Opt("TrayIconDebug", 1)

Global $aBttns[4] = [3]
Global $aFlags[2] = [0, 0]

$hForm = GUICreate("Метадатер", 938, 290, 192, 124)

$Button1 = GUICtrlCreateButton("КНОПКА 1", 8, 8, 185, 41)
;GUICtrlSetFont(-1, 12, 400, 0, "Days")
$Button2 = GUICtrlCreateButton("КНОПКА 2", 200, 8, 177, 41)
;GUICtrlSetFont(-1, 12, 400, 0, "Days")

$aBttns[1] = GUICtrlCreateButton("КНОП 1", 8, 56, 225, 25)
;GUICtrlSetFont(-1, 10, 400, 0, "Days")
$aBttns[2] = GUICtrlCreateButton("КНОП 2", 8, 88, 225, 25)
;GUICtrlSetFont(-1, 10, 400, 0, "Days")
$aBttns[3] = GUICtrlCreateButton("КНОП 3", 8, 120, 225, 25)
;GUICtrlSetFont(-1, 10, 400, 0, "Days")

GUISetState(@SW_SHOW)
_GUICtrlButton_SetState($Button1, True)
$aFlags[0] = 1

While 1
    $nMsg = GUIGetMsg()

    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button1
			_GUICtrlButton_SetState($Button1, True)
            If $aFlags[0] Then
                ContinueLoop
            EndIf

            $aFlags[0] = 1
			$aFlags[1] = 0
            _GUICtrlButton_SetState($Button2, False)

            For $i = 1 To $aBttns[0]
                GUICtrlSetState($aBttns[$i], $GUI_SHOW)
            Next
        Case $Button2
			_GUICtrlButton_SetState($Button2, True)
            If $aFlags[1] Then
                ContinueLoop
            EndIf

            $aFlags[1] = 1
			$aFlags[0] = 0

            _GUICtrlButton_SetState($Button1, False)

            For $i = 1 To $aBttns[0]
                GUICtrlSetState($aBttns[$i], $GUI_HIDE)
            Next
    EndSwitch
WEnd
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
saraconor,
Предупреждение За нарушение общих правил (пункт В.2):
Старайтесь избегать “Over quoting” (преувеличенное цитирование) - цитируйте только необходимую часть сообщения, которая наилучшим образом подчеркнёт суть цитируемого.


С уважением, ваш Глобальный модератор.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Vintets [?]
А зачем он это делает?
Неверный вопрос. Из справки:
Устанавливает состояние вдавленной кнопки. Состояние вдавленной кнопки имеет вид, как если бы пользователь нажал её.
Получается что при отжатии, срабатывает событие, и это правильно.

saraconor [?]
а если там 150 кнопок, 150 флагов делать?
Как вариант:
Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Global $aBttns[4] = [3]

$hForm = GUICreate("Метадатер", 938, 290, 192, 124)

$Button1 = GUICtrlCreateButton("КНОПКА 1", 10, 8, 185, 41)
$Button2 = GUICtrlCreateButton("КНОПКА 2", 200, 8, 177, 41)

$aBttns[1] = GUICtrlCreateButton("КНОП 1", 8, 56, 225, 25)
;GUICtrlSetFont(-1, 10, 400, 0, "Days")
$aBttns[2] = GUICtrlCreateButton("КНОП 2", 8, 88, 225, 25)
;GUICtrlSetFont(-1, 10, 400, 0, "Days")
$aBttns[3] = GUICtrlCreateButton("КНОП 3", 8, 120, 225, 25)
;GUICtrlSetFont(-1, 10, 400, 0, "Days")

GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
    
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button1
			_GUICtrlButton_SetStateEx($Button2, False)
			_GUICtrlButton_SetStateEx($Button1, True)
			
            For $i = 1 To $aBttns[0]
                GUICtrlSetState($aBttns[$i], $GUI_SHOW)
            Next
		Case $Button2
			_GUICtrlButton_SetStateEx($Button2, True)
			_GUICtrlButton_SetStateEx($Button1, False)
			
            For $i = 1 To $aBttns[0]
                GUICtrlSetState($aBttns[$i], $GUI_HIDE)
            Next
    EndSwitch
WEnd

Func _GUICtrlButton_SetStateEx($iCtrlID, $fState = True)
	GUICtrlSetState($iCtrlID, $GUI_DISABLE)
	GUICtrlSendMsg($iCtrlID, $BM_SETSTATE, $fState, 0)
	GUICtrlSetState($iCtrlID, $GUI_ENABLE)
EndFunc
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
А вообще вот так это делается (один флаг на все кнопки):

Код:
#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>

Global $aBttns[4] = [3]
Global $aSubBttns[4] = [3]

$hForm = GUICreate("Метадатер", 938, 290, 192, 124)

$aBttns[1] = GUICtrlCreateButton("КНОПКА 1", 10, 8, 185, 41)
$aBttns[2] = GUICtrlCreateButton("КНОПКА 2", 200, 8, 177, 41)
$aBttns[3] = GUICtrlCreateButton("КНОПКА 3", 380, 8, 177, 41)

$aSubBttns[1] = GUICtrlCreateButton("КНОП 1", 8, 56, 225, 25)
$aSubBttns[2] = GUICtrlCreateButton("КНОП 2", 8, 88, 225, 25)
$aSubBttns[3] = GUICtrlCreateButton("КНОП 3", 8, 120, 225, 25)

GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
    
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $aBttns[1] To $aBttns[$aBttns[0]]
			If _CheckFlag() Then
				ContinueLoop
			EndIf
			
			_SetState($nMsg)
			
            For $i = 1 To $aSubBttns[0]
				GUICtrlSetState($aSubBttns[$i], ($nMsg = $aBttns[2] ? $GUI_HIDE : $GUI_SHOW))
            Next
    EndSwitch
WEnd

Func _SetState($iCtrlID)
	GUICtrlSendMsg($iCtrlID, $BM_SETSTATE, True, 0)
	
	For $i = 1 To $aBttns[0]
		If $aBttns[$i] <> $iCtrlID Then
			GUICtrlSendMsg($aBttns[$i], $BM_SETSTATE, False, 0)
		EndIf
	Next
EndFunc

Func _CheckFlag()
	Local Static $fFlag = False
	
	$fFlag = Not $fFlag
	Return Not $fFlag
EndFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
CreatoR,
ИМХО, функцию _CheckFlag можно сократить до двух строк:
Код:
Func _CheckFlag(ByRef $f_Flag)
	$f_Flag = Not $f_Flag
	Return Not $f_Flag
EndFunc   ;==>_CheckFlag
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
madmasles [?]
функцию _CheckFlag можно сократить до двух строк
Так и сделал в начале, но мне показалось что оно вызывало проблемы.

А ещё можно так сделать (дабы не объявлять глобально переменную):

Код:
Func _CheckFlag()
	Local Static $fFlag = False
	
	$fFlag = Not $fFlag
	Return Not $fFlag
EndFunc
 

Vintets

Новичок
Сообщения
12
Репутация
4
CreatoR сказал(а):
Из справки:
Устанавливает состояние вдавленной кнопки. Состояние вдавленной кнопки имеет вид, как если бы пользователь нажал её.
Получается что при отжатии, срабатывает событие, и это правильно.
C толку сбивает примечание
Примечания
Этот влияет только на внешний вид кнопки.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Верх