1 (изменено: gosha.pudin, 2018-02-05 14:23:05)

Тема: AHK: Чередование изображения по нажатию.

Доброго времени суток уважаемые знатоки.

Первое, потрясающий форум.

Второе, помогите разобраться с следующим кодом.
Большую часть кода нашел на форуме но правильной работы добиться не удалось.

Суть такова есть 2 рисунка: при нажатии на 1 должен отработать сценарий и появится второй рисунок по нажатию на который должен отработать другой сценарий и показать первую картинку.

Столкнулся с проблемой что скрипит срабатывает только при втором нажатии на картинку 3 сделанную по аналогии описанного выше.

Помогите пожалуйста разобраться:

#NoEnv
#Persistent

WS_EX_TRANSPARENT := 0x20
WS_EX_LAYERED := 0x80000

Gui, -Caption +AlwaysOnTop +Lastfound +ToolWindow
WinGet, ID
Gui, Color, EEAA99
WinSet TransColor, EEAA99
Gui, Add, Picture, y635 x1075 w60 h-1 gLabel1, C:\ONOFF.BMP
Gui, Add, Picture, y670 x1100 w60 h-1 gLabel2, C:\ONOFF.BMP
Gui, Add, Picture, y635 x955 w60 h-1 gLabel3, C:\ONOFF.BMP
Gui, Add, Picture, y670 x980 w60 h-1 gLabel4, C:\ONOFF.BMP
Gui, Show, NA

~F6::
Label1:
;GuiControl, hide, static1
;Loop 
{
		Sleep 1000
	GuiControl, hide, % "static" . 2 - pt := !pt
	GuiControl, Show, % "static" . 1 + pt 
Return
	WinSet, ExStyle, % "+" WS_EX_TRANSPARENT | WS_EX_LAYERED, ahk_id %ID%
Reload
} 
~F7::
Label2:
{
		Sleep 1000
	GuiControl, hide, % "static" . 2 - pt := !pt
	GuiControl, Show, % "static" . 1 + pt 
Return
	WinSet, ExStyle, % "+" WS_EX_TRANSPARENT | WS_EX_LAYERED, ahk_id %ID%
Return
}
~F8::
Label3:
{
		Sleep 1000
	GuiControl, hide, % "static" . 4 - pt := !pt
	GuiControl, Show, % "static" . 3 + pt 
Return
	WinSet, ExStyle, % "+" WS_EX_TRANSPARENT | WS_EX_LAYERED, ahk_id %ID%
Return
}
~F9::
Label4:
{
		Sleep 1000
	GuiControl, hide, % "static" . 4 - pt := !pt
	GuiControl, Show, % "static" . 3 + pt 
Return
	WinSet, ExStyle, % "+" WS_EX_TRANSPARENT | WS_EX_LAYERED, ahk_id %ID%
Return
}
Post's attachments

ONOFF.bmp 468.8 kb, 9 downloads since 2018-02-05 

You don't have the permssions to download the attachments of this post.

2

Re: AHK: Чередование изображения по нажатию.

gosha.pudin пишет:

Столкнулся с проблемой что скрипит

Не слышу.

Pic1 := "C:\0.png", Pic2 := "C:\9.png"
Gui Add, Picture, w200 h200 gClick vPicture, % Pic1
Gui Show
Return

Click:
	GuiControl -Redraw, Picture
	GuiControl,, Picture, % Pic2
	GuiControl +Redraw, Picture
	
	KeyWait LButton, Up
	
	GuiControl -Redraw, Picture
	GuiControl,, Picture, % Pic1
	GuiControl +Redraw, Picture
Return

3 (изменено: gosha.pudin, 2018-02-05 14:48:49)

Re: AHK: Чередование изображения по нажатию.

stealzy

Огромное спасибо за ответ, но к моему разочарованию приложенный пример не отвечает первоначальным условиям. 

Предложенный вами пример как мне кажется прекрасно подходит как графическая кнопка, огромное спасибо за приложенный код в дальнейшем станет очень полезен.
Но…
Пожалуйста, если вас не затруднит, прошу ознакомиться детально с приложенным кодом, и помочь разобраться где допущена ошибка.

4

Re: AHK: Чередование изображения по нажатию.

gosha.pudin, pt := !pt возьмите везде в скобки:

GuiControl, hide, % "static" . 2 - (pt := !pt)
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5

Re: AHK: Чередование изображения по нажатию.

teadrinker пишет:

gosha.pudin, pt := !pt возьмите везде в скобки:

GuiControl, hide, % "static" . 2 - (pt := !pt)

По ощущениям стабильность увеличилась, но основная проблема сохранилась.

Попробую описать своими словами:

Код подгружает 2 картинки (Красная, Зеленая)
Создается Х количество блоков, состоявших из данных элементов, попросту Вкл. Выкл.

При нажатии на любой из элементов картинка меняет состояние, и соответственно вложенное действие.

На текущий момент с правками получается следующая ситуация:

При нажатии на картинку 1 происходит смена состояния на картинку 2, при повторном нажатии на картинку 2 происходит возврат на к. 1, тут все работает как надо.

Но, к примеру если нажать на к.1 затем на к. 3 требуется 2 нажатия.

При этом нажатие на к. 1 затем нажать на к. 2, нажатие на к. 3 не потребует 2-х нажатий.
Получается что все работает когда блоки находятся в одинаковом состоянии, если какой-то из блоков находится в измененном состоянии то требуется 2 нажатия, на любую другую картинку.

Возможно, Я в принципе выбрал не правильную конструкцию?
Может кто-нибудь может предложить альтернативу?

6

Re: AHK: Чередование изображения по нажатию.

Для каждого блока используйте отдельную переменную.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7

Re: AHK: Чередование изображения по нажатию.

teadrinker пишет:

Для каждого блока используйте отдельную переменную.

Данное решение конечно устраняет, но не снимает вопроса почему текучий пример работает именно так как описано, а хочется понять где закрался секрет данного бага (фичи)

8

Re: AHK: Чередование изображения по нажатию.

Когда меняете состояние переменной для одного блока, оно меняется также для второго, хотя клика по нему не было.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

9

Re: AHK: Чередование изображения по нажатию.

teadrinker пишет:

Когда меняете состояние переменной для одного блока, оно меняется также для второго, хотя клика по нему не было.

Напрашивается тогда вопрос почему не происходит визуальной смены картинки для второго блока?!
Ведь его статус изменился вместе с первым нажатием.

10 (изменено: gosha.pudin, 2018-02-06 14:49:29)

Re: AHK: Чередование изображения по нажатию.

stealzy пишет:

Статус ??? Это че за зверь? И почему элементы gui должны исчезать и появляться из-за него?
Я то думал действия происходят из-за команд, а оказывается дело в статусе .

Смею предположить что вы пребываете здесь главным троллем?!
Или все же нет?
Очень признателен, за фиксация очевидных фактов.

Я прошу объяснить поведение конструкции логика которого мне до конца не ясна, но по всем изначальным должна вести себя абсолютно предсказуемо, чего не происходит, следствие появился данный топ.

Может для начала стоит взглянуть, а не бегло читать и делать выводы…
Данный форум один из немногих который меня заинтересовал высоким уровнем аудитории, информативностью ответов.

Ваш ответ не такой!
Ваш ответ как это по русский? Флуд?

Повторюсь, меня интересует факт того почему происходит то что происходит и где логика AHK расходится с моим представлением приложенного кода.

11

Re: AHK: Чередование изображения по нажатию.

gosha.pudin, если что-то непонятно, пытайтесь упростить пример.
Например по-вашему при нажатии f1 tooltip должен перерисоваться?

p := 0
tooltip % p
f1:: p:=!p

12

Re: AHK: Чередование изображения по нажатию.

gosha.pudin, да, я тролль и грубиян, но факты для меня совсем не очевидны.
Покажите мне команду, которая должна скрывать картинки второго блока, и где эта команда вызывается и вызывается ли она вообще. Судя по вашей логике команда вызывается сама по себе из-за изменения некого "статуса".

13

Re: AHK: Чередование изображения по нажатию.

Malcev пишет:

gosha.pudin, если что-то непонятно, пытайтесь упростить пример.
Например по-вашему при нажатии f1 tooltip должен перерисоваться?

p := 0
tooltip % p
f1:: p:=!p

Спасибо за дельный совет.

tooltip не используется, или под ним подразумевается сам элемент picture?

Да куда уж проще?
Тут только красоту наводить для так сказать эстетичности (чтоб возможные «личности» не сетовали на примитивность), но это уже после понимания, где появляется неожиданная логика.

14

Re: AHK: Чередование изображения по нажатию.

Этим примером я хотел показать, что для изменения какой-либо команды недостаточно просто изменить переменную, используемую в команде, а нужно еще выполнить команду:

p := 0
tooltip % p
f1:: 
p:=!p
tooltip % p

15

Re: AHK: Чередование изображения по нажатию.

stealzy

Покажите мне команду, которая должна скрывать картинки второго блока

GuiControl, hide

где эта команда вызывается и вызывается

~F6::
Label1:

Судя по вашей логике команда вызывается сама по себе

Не верно, команда не вызывается при первом действии, только после повторения действия, причины данного поведения и вызвали интерес (Назначенная кнопка или тап мыши по картинке).

16

Re: AHK: Чередование изображения по нажатию.

Malcev пишет:

Этим примером я хотел показать, что для изменения какой-либо команды недостаточно просто изменить переменную, используемую в команде, а нужно еще выполнить команду:

p := 0
tooltip % p
f1:: 
p:=!p
tooltip % p

Понимаю направление к которому вы подводите, но тогда логика становится иной, не так-ли?

Повышенный интерес вызвала именно приложенная конструкция.
И я скорее допускаю мою не осведомленность в тонкостях синтаксиса, но код работает в его изначальном варианте…
Вопрос почему именно так вед аналоги на другом схожем синтаксисе работает без подобных непредвиденных (багов, фич, особенностей).

17

Re: AHK: Чередование изображения по нажатию.

Я упростил ваш код.
Что именно в нём непонятно?

#NoEnv
#Persistent

WS_EX_TRANSPARENT := 0x20
WS_EX_LAYERED := 0x80000

Gui, -Caption +AlwaysOnTop +Lastfound +ToolWindow
WinGet, ID
Gui, Color, EEAA99
WinSet TransColor, EEAA99
Gui, Add, Picture, y635 x1075 w60 h-1 gLabel1, C:\ONOFF.BMP
Gui, Add, Picture, y670 x1100 w60 h-1 gLabel1, C:\ONOFF.BMP
Gui, Add, Picture, y635 x955 w60 h-1 gLabel2, C:\ONOFF.BMP
Gui, Add, Picture, y670 x980 w60 h-1 gLabel2, C:\ONOFF.BMP
Gui, Show, NA
return

Label1:
GuiControl, hide, % "static" . 2 - (pt := !pt)
GuiControl, Show, % "static" . 1 + pt 
Return

Label2:
GuiControl, hide, % "static" . 4 - (pt := !pt)
GuiControl, Show, % "static" . 3 + pt
Return

18

Re: AHK: Чередование изображения по нажатию.

Я несколько раз прочитал тему, но так и не увидел чётко сформулированной задачи.
Нужно чтобы по нажатию на картинку картинка изменялась?

19

Re: AHK: Чередование изображения по нажатию.

Malcev

Ну упрощение тут не принципиально, суть это не меняет, особенность работы сохранилась в изначальном варианте, но я очень признателен что Вы углубились в процесс познания данной особенности AHK.

Код мне отлично понятен, непонятна его странная работа!

Для быстрого понимания я рекомендую собрать скрипт и вставить картинку 60х60 (подразумевается не крупную).
И в разных последовательностях нажимать на картинки и тогда станет ясна суть заинтересовавшего меня предмета.

20 (изменено: gosha.pudin, 2018-02-06 18:04:23)

Re: AHK: Чередование изображения по нажатию.

ypppu пишет:

Я несколько раз прочитал тему, но так и не увидел чётко сформулированной задачи.
Нужно чтобы по нажатию на картинку картинка изменялась?

Изначальная цель действительно была: создать несколько графических элементов по нажатию на любой происходило действие и элемент скрывался.

Как таковой задачи нет, существует масса возможностей получения необходимого результата и одна (приложенная в шапке).

Но в процессе была обнаружена особенность, базовые принципы которой не ясна (по крайней мере для меня)…
Следствие: попытка разобраться почему так!

21

Re: AHK: Чередование изображения по нажатию.

При каждом выполнении (pt := !pt), pt меняет значение с 0 на 1 и наоборот.
Теперь считайте, при первом вызове Label1, когда pt = "":

GuiControl, hide, % "static" . 2 - (pt := !pt)
GuiControl, Show, % "static" . 1 + pt 

Это будет идентично:

GuiControl, hide, % "static" . 2 - 1
GuiControl, Show, % "static" . 1 + 1

То есть, чтобы теперь спрятать static2 и показать static1, pt должно быть равно 1.
Но если вы после этого вызовите Label2, то то в результате этого pt у вас будет равно 0.
И поэтому при повторном вызове Label1 вы повторите предыдущее действие:

GuiControl, hide, % "static" . 2 - 1
GuiControl, Show, % "static" . 1 + 1

22

Re: AHK: Чередование изображения по нажатию.

stealzy пишет:
gosha.pudin пишет:

Напрашивается тогда вопрос почему не происходит визуальной смены картинки для второго блока?!

Потому что вы не задали команду для смены.

gosha.pudin пишет:

~F6::
Label1:

Это для первых двух катринок, а вы спрашиваете про другие. Доходит или нет?

gosha.pudin пишет:

данной особенности AHK

gosha.pudin пишет:

Код мне отлично понятен, непонятна его странная работа!

Пока что вы не поняли ничего о чем вам говорят. Составьте четкий алгоритм на своем языке, а потом переводите его в код.
Вы далеко не первый, кто начал пытаться программировать и уже обвиняет во всех своих бедах язык.

stealzy

Вынужден с Вами не согласится.

Я не пытаюсь винить все что не Я.

Скорее вижу Ваше поверхностное отношение к поднятому мной вопросу.
И уважительно прошу Вас не писать более в данный топ сообщения не относящееся к нему, ради написания что-нибудь, куда-нибудь, как-нибудь. (Прошу не видеть в моих словах попытку коим образом оскорбить или унизить Ваши знания предметной области, или оскорбить Ваше эго, Я пытаюсь выразить свою обеспокоенность пустотой ваших ответов и бессмысленностью утверждений, если Вы не способны дать четкий ответ почему выполнение происходит так как происходит, не стоит пытается).


Задача проста:

Создание нескольких графический элементов (кнопок) по нажатию на любой происходило действие и элемент скрывался (Показывается 1 или несколько других работающие по схожему принципу).

п.с. Форум АНК считаю дурным тоном выкладывать не АНК примеры.

23 (изменено: gosha.pudin, 2018-02-06 18:48:08)

Re: AHK: Чередование изображения по нажатию.

Malcev

Яркий пример развернутого ответа и явного указания на ошибку автора.
Конечно тяжело переключится с полноценной отладки на блокнот.
Мое заблуждение было видеть счетчик а не переменную.
Огромное спасибо.

п.с. Если не затруднит, заключительная просьба, прошу приложить свое виденье подомного кода но сокращенного до абсолютного минимума.
Дабы поисковики приводили на форум к рабочему варианту кода от шефов.

Выражаю всем свою глубокую признательность за потраченное время.

24

Re: AHK: Чередование изображения по нажатию.

Не знаю насчет абсолютного минимума, но если при нажатии каждой кнопки должно выполнятьсяься своё действие, то можно так:

#NoEnv
#Persistent

WS_EX_TRANSPARENT := 0x20
WS_EX_LAYERED := 0x80000

Gui, -Caption +AlwaysOnTop +Lastfound +ToolWindow
WinGet, ID
Gui, Color, EEAA99
WinSet TransColor, EEAA99
Gui, Add, Picture, y635 x1075 w60 h-1 g1, C:\ONOFF.BMP
Gui, Add, Picture, y670 x1100 w60 h-1 g2, C:\ONOFF.BMP
Gui, Add, Picture, y635 x955 w60 h-1 g3, C:\ONOFF.BMP
Gui, Add, Picture, y670 x980 w60 h-1 g4, C:\ONOFF.BMP
Gui, Show, NA
return

1:
; код
ShowHide(A_ThisLabel)
Return

2:
; код
ShowHide(A_ThisLabel)
Return

3:
; код
ShowHide(A_ThisLabel)
Return

4:
; код
ShowHide(A_ThisLabel)
Return

ShowHide(Number)
{
   GuiControl, hide, % "static" Number
   if Mod(Number, 2) = 0
      GuiControl, Show, % "static" Number-1
   else
      GuiControl, Show, % "static" Number+1
}