1 (изменено: mozers, 2017-03-29 18:06:08)

Тема: AHK: Button с картинкой (функция)

Поискал на разных форумах, маленько подкорректировал, получилось простенько и очень даже прилично.
Картинки для кнопок хранятся в ресурсах (простите, без разрешения использовал ClipMgrIcons.dll уважаемого teadrinker).

FileInstall, ClipMgrIcons.dll, ClipMgrIcons.dll
IcoDll := A_ScriptDir "\ClipMgrIcons.dll"
if !FileExist(IcoDll)  {
   URLDownloadToFile, % "http://content.screencast.com/users/teadrinker/folders/Files/media/7d4f94ae-cdd3-467d-b3d1-786f5e8af91c/ClipMgrIcons.dll?downloadOnly=true", % IcoDll
}

; Иконка в заголовке окна и в трее
Menu, Tray, Icon, %IcoDll%, 4

; Иконка на "кнопке"
size := 32 ; или 16
szdown := size+2
xyup := size+6
Gui, Add , Picture, w%szdown% h%szdown% E0x200 vStateDown icon1 gButton_OnClik, %IcoDll%
Gui, Add , Picture, x+-%xyup% y+-%xyup% w%size% h%size% E0x001 vStateUp icon1 gButton_OnClik, %IcoDll%

Gui, Show, w200 h70
Return

Button_OnClik:
	GuiControl Hide, StateUp
	tc := A_TickCount
	While, GetKeyState("LButton", "P"){
		If A_TickCount-tc > 1000
			Break
	}
	GuiControl Show, StateUp
	MsgBox, Ok
Return

mAction:
	Return

GuiClose:
GuiEscape:
	ExitApp

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

AddPicButton (xpos, ypos, size, num_icon, goto_action)

жестоко обломалось на том, что Gui, Add не понимает переданные параметры.
Вопрос: Может быть есть какой то обходной путь чтобы передать в команду Gui, Add (и другие, ей подобные) изменяемые параметры? Как поступают профессионалы? Неужели тупо дублируют код?

2 (изменено: stealzy, 2017-03-30 00:20:31)

Re: AHK: Button с картинкой (функция)

Не понял в чем конкретно ваша проблема, вы не привели код и не расписали что значит "не понимает".
А вдруг Gui, Add вас не уважает?
Поэтому и не подчиняется, вот ведь какой строптивый! :-)
Попробуем воспользоваться телепатией:
AhkCommand, qwert%y% 123 a%sdf%, hjkl

AhkCommand, % "qwert" y " " 123 " a" sdf, hjkl
Вместо Label можно писать (и передавать, соответственно) имя ф-ии.

3 (изменено: mozers, 2017-03-30 18:07:59)

Re: AHK: Button с картинкой (функция)

Простите, что пришлось применять телепатию. Я полагал что описал задачу достаточно ясно. Ну, если не так, то приведу полностью неработающий вариант моей идеи:

FileInstall, ClipMgrIcons.dll, ClipMgrIcons.dll
IcoDll := A_ScriptDir "\ClipMgrIcons.dll"
if !FileExist(IcoDll)  {
   URLDownloadToFile, % "http://content.screencast.com/users/teadrinker/folders/Files/media/7d4f94ae-cdd3-467d-b3d1-786f5e8af91c/ClipMgrIcons.dll?downloadOnly=true", % IcoDll
}

; Иконка в заголовке окна и трее
Menu, Tray, Icon, %IcoDll%, 4

Gui, Show, w200 h70

; Добавляем одну кнопку
AddPicButton(8, 8, 32, 1, Action1)
; Добавляем еще одну кнопку
AddPicButton(8, 40, 16, 6, Action2)

Return

; --------------------------------------------------------------
; Функция добавляет "кнопку" с графическим рисунком
AddPicButton(xpos, ypos, size, num_icon, goto_action) {
	szdown := size+2
	xyup := size+6
	Global Gui, Add , Picture, x%xpos% y%ypos% w%szdown% h%szdown% E0x200 vStateDown icon%num_icon% gButton_OnClik, %IcoDll%
	Global Gui, Add , Picture, x+-%xyup% y+-%xyup% w%size% h%size% E0x001 vStateUp icon%num_icon% gButton_OnClik, %IcoDll%

Button_OnClik:
	GuiControl Hide, StateUp
	tc := A_TickCount
	While, GetKeyState("LButton", "P"){
		If A_TickCount-tc > 1000
			Break
	}
	GuiControl Show, StateUp
	Gosub, %goto_action%
}

; Реакция на нажатие первой кнопки
Action1:
	MsgBox, This Action1
	Return

; Реакция на нажатие второй кнопки
Action2:
	MsgBox, This Action2
	Return

GuiClose:
GuiEscape:
	ExitApp

Можно это заставить работать?

4

Re: AHK: Button с картинкой (функция)

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

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

5 (изменено: mozers, 2017-03-30 14:44:49)

Re: AHK: Button с картинкой (функция)

teadrinker,
Строчку с Gui, Show поместил выше создания кнопок. С идентификатором не понял.
Главная проблема тут в том, что Global Gui, Add , Picture, никак не хочет понимать параметры. Пробую так:

Global Gui, Add, Picture, % "x" xpos " y" ypos " w" szdown " h" szdown " E0x200 vStateDown icon" num_icon " gButton_OnClik", IcoDll

Ругается illegal character: "%"
Поправьте, пожалуйста, мой пример если несложно.

6 (изменено: stealzy, 2017-03-30 17:34:33)

Re: AHK: Button с картинкой (функция)

А что за Global Gui? Первый раз такое встречаю, судя по неприятию, интерпретатор со мной солидарен.
А, это вы так в одной строке решили и кнопку добавить, и переменные глобальными объявить, да? Гениально! Осталось убедить Lexikos принять новый синтаксис.
Что содержат переменные Action1 и Action2? Ok, пусть это будут строки, тогда как бы вы передали в ф-ию переменную?
Почему в MsgBox значения обрамлены кавычками? Это не ф-ия, это обычная команда ahk, а значит принимает не выражение, а строку. Чтобы обычная команда в параметре принимала выражение, в начале параметра ставят "% ".

Интерпретатор говорит, что переменные для Gui должны быть глобальными или статическими.
Можно создать статические переменные внутри ф-ии, и присваивать им значения из параметров, но тогда интерпретатор скажет, что одна и таже переменная не может быть использована больше чем для одного Gui. Можно попробовать создавать новые статические переменные каждый раз, но подозреваю, это невозможно. Тут неплохо бы узнать, чем вызваны подобные ограничения использования переменных в Gui.

7

Re: AHK: Button с картинкой (функция)

Ещё непонятно, когда должно выполняться Button_OnClik, а когда Action.

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

8 (изменено: stealzy, 2017-03-30 17:40:12)

Re: AHK: Button с картинкой (функция)

В текущем варианте Action выполняется после Button_OnClik, т.е. общую часть ТС вынес внутрь ф-ии в Button_OnClik.
Можно поставить g%goto_action% для теста.

9

Re: AHK: Button с картинкой (функция)

А, понял, запутано немного.

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

10 (изменено: stealzy, 2017-03-30 17:48:04)

Re: AHK: Button с картинкой (функция)

Я как раз недавно смотрел один class для Gui, так они используют обычный синтаксис для этого дела, так что видимо ф-ого решения тут нет.
https://autohotkey.com/board/topic/8453 … -easy-gui/
У меня одного провайдер блокирует доступ к autohotkey.com? Хожу ч/з vpn .

11

Re: AHK: Button с картинкой (функция)

stealzy
1. Global поставил потому что компилятор ругается Error:  A control's variable must be global or static. А как надо объявлять Gui контрол глобальным (ну или статическим) ???
2. Action1 и Action2 - названия меток. Че это - строки или нет? Если что - кавычки поставить недолго.
3. Кавычки из MsgBox убрал - синтаксис знаю, просто ошибся, бывает.
4. Короче я понял, что из за этих глобальных/статических ограничений нельзя сделать мой код рабочим.

teadrinker
Пока сочинял ответ, вы тут уже все и так поняли... Запутано? Что, есть более простое решение?

12 (изменено: teadrinker, 2017-03-30 18:37:09)

Re: AHK: Button с картинкой (функция)

Что касается идентификаторов окон. Так как окон может быть много, окна должны быть как-то однозначно идентифицированы. Идентификатором может служить имя окна (или номер) или его хэндл. Если имя не указано явно, значит оно равно 1. Но если точно известно, что окно будет только одно, это не имеет значения.

Я это всё примерно так вижу (кое-что упростил для краткости):

SetWorkingDir, % A_ScriptDir
IcoDll := "ClipMgrIcons.dll"
if !FileExist(IcoDll)
   URLDownloadToFile, http://content.screencast.com/users/teadrinker/folders/Files/media/7d4f94ae-cdd3-467d-b3d1-786f5e8af91c/ClipMgrIcons.dll?downloadOnly=true, % IcoDll

Menu, Tray, Icon, %IcoDll%, 4

AddPicButton(8, 8, 32, IcoDll, 1, Func("Action1"))
AddPicButton(60, 8, 32, IcoDll, 6, Func("Action2"))
Gui, Show

AddPicButton(x, y, size, IcoDll, n, action, GuiID := 1)  {
   static WS_EX_CLIENTEDGE := 0x200, WS_EX_DLGMODALFRAME := 0x1
   
   sizeDown := size + 2
   Gui, %GuiID%: Add, Pic, x%x% y%y% w%sizeDown% h%sizeDown% +E%WS_EX_CLIENTEDGE% Icon%n%, % IcoDll
   Gui, %GuiID%: Add, Pic, x%x% y%y% w%size% h%size% hwndhButton +E%WS_EX_DLGMODALFRAME% Icon%n%, % IcoDll
   OnClick := Func("OnClick").Bind(hButton, action, GuiID)
   GuiControl, +g, % hButton, % OnClick
}

OnClick(ButtonID, action, GuiID)  {
   GuiControl, %GuiID%: Hide, %ButtonID%
   KeyWait, LButton
   GuiControl, %GuiID%: Show, %ButtonID%
   MouseGetPos,,,, ControlID, 2
   ( ControlID = ButtonID && action.Call() )
}
   
Action1()  {
   MsgBox, Action1
}

Action2()  {
   MsgBox, Action2
}
mozers пишет:

Запутано? Что, есть более простое решение?

Просто не сразу понял.

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

13

Re: AHK: Button с картинкой (функция)

teadrinker, работает!
Да, я до такого самостоятельно бы точно не додумался. Может быть через несколько лет...

14

Re: AHK: Button с картинкой (функция)

teadrinker, чтобы разместить эти кнопки в окне стороннего приложения, а не в GUI AHK, необходимо изменять функции? Сделайте, пожалуйста. пример, как добавить одну из этих кнопок в стандартный блокнот.

15 (изменено: stealzy, 2017-03-30 20:30:43)

Re: AHK: Button с картинкой (функция)

Здорово, как я понимаю, проблема касается переменных состояния vState и teadrinker обошел ее таким путем.
А так работает:

Gui Show, w200 h70
AddPicButton(8, 8, 32, 1, "Action1")
AddPicButton(8, 40, 16, 6, "Action2")
Return

AddPicButton(xpos, ypos, size, num_icon, goto_action) {
	Gui Add, Picture, % "x" xpos " y" ypos " w" size+2 " h" size+2 " E0x200 icon" num_icon " g" goto_action, % IcoDll
	Gui Add, Picture, % "x+-" size+6 " y+-" size+6 " w" size " h" size " E0x001 icon" num_icon " g" goto_action, % IcoDll
	GuiControl Show, StateUp
}
Action1:
	MsgBox mAction1
	Return
Action2:
	MsgBox % "mAction2"
	Return
GuiClose:
	ExitApp

becauseim, это совершенно другая задача и к теме отношения не имеет.
И кстати, на нее развернуто отвечали на нашем форуме пять лет назад. Первая ссылка в поиске, если вас не забанили в гугле. Если забанили, я не удивлен .

16

Re: AHK: Button с картинкой (функция)

stealzy, про бан в системе Google. Напишите в приват, пожалуйста, почему не удивляетесь такой вероятности.

17 (изменено: mozers, 2017-03-30 22:21:52)

Re: AHK: Button с картинкой (функция)

Вариант stealzy, конечно, проще и компактнее, но он не работает. Функция игнорирует все передаваемые параметры и лепит пустышки.
Но самое непонятное для меня в обоих последних вариантах - почему компилятор перестал требовать must be global or static ?
teadrinker, и почему если я пишу внутри функции AddPicButton

   param1 := x%x% y%y% w%sizeDown% h%sizeDown% +E%WS_EX_CLIENTEDGE% Icon%n%
   MsgBox, % param1

то в MsgBox - пустая строка?
Еще одна странность: Если разница между sizeDown и size меньше 1 пикселя, то кнопки нажимаются, но Action почему то не работают. При чем тут размер???

18 (изменено: Malcev, 2017-03-30 22:25:20)

Re: AHK: Button с картинкой (функция)

mozers пишет:

Вариант stealzy, конечно, проще и компактнее, но он не работает. Функция игнорирует все передаваемые параметры и лепит пустышки.

Чтобы не ингорировала объявите IcoDll глобальной.

19 (изменено: mozers, 2017-03-30 23:18:47)

Re: AHK: Button с картинкой (функция)

Malcev, да, спасибо, помогло! Только в этом варианте анимация нажатия отсутствует (тупо клик по картинке).

20 (изменено: stealzy, 2017-03-30 23:30:07)

Re: AHK: Button с картинкой (функция)

mozers, в 17 сообщении вы в пятый раз наступили на те же грабли - := ожидает выражение, а строку ожидает =.
Не уверен, что = справится с пробелами, так что лучше перепишите как выражение.
Переменные про кот. ругается интерпретатор - это vState и gButton.
Как видите, я их просто выкинул, а teadrinker нашел обходной путь, для сохранения их функциональности.

21

Re: AHK: Button с картинкой (функция)

Можно сохранить их функциональность объявив в функции все переменные глобальными.

22

Re: AHK: Button с картинкой (функция)

Malcev, такую ф-ию можно будет вызвать только один раз . В 6 сообщении писал почему.

23 (изменено: mozers, 2017-03-31 23:49:23)

Re: AHK: Button с картинкой (функция)

Проблемки выявились при попытке динамически добавить/скрыть кнопку. Поправил код. Есть замечания? Может в коллекцию ? Вроде штука то - востребованная...

FileInstall, ClipMgrIcons.dll, ClipMgrIcons.dll
global IcoDll
IcoDll := A_ScriptDir "\ClipMgrIcons.dll"
if !FileExist(IcoDll) ; Загрузка библиотеки иконок при её отсутствии
	URLDownloadToFile, % "http://content.screencast.com/users/teadrinker/folders/Files/media/7d4f94ae-cdd3-467d-b3d1-786f5e8af91c/ClipMgrIcons.dll?downloadOnly=true", % IcoDll

; Иконка в заголовке окна и трее
Menu, Tray, Icon, %IcoDll%, 4
Gui, Show, w200 h70

AddPicButton(8, 8, 32, 1, "Action1")
global hButton2 ; указатель на эту кнопку используется в нашем Action2
hButton2 := AddPicButton(60, 8, 16, 2, "Action2")
Return

; Функция добавляет "кнопку" с графическим рисунком и возвращает указатель на неё
AddPicButton(x, y, size, n, action, GuiID := 1) {
	static WS_EX_CLIENTEDGE := 0x200, WS_EX_DLGMODALFRAME := 0x1

	sizeDown := size + 2
	Gui, %GuiID%: Add, Pic, x%x% y%y% w%sizeDown% h-1 hwndhButtonDown +E%WS_EX_CLIENTEDGE% hidden Icon%n%, % IcoDll ; Вдавленная кнопка (скрываем)
	Gui, %GuiID%: Add, Pic, x%x% y%y% w%size% h-1 hwndhButtonUp +E%WS_EX_DLGMODALFRAME% Icon%n%, % IcoDll ; Отжатая кнопка (показываем)
	handler := Func("OnClick").Bind(hButtonUp, hButtonDown, action, GuiID)
	GuiControl, +g, % hButtonUp, % handler
	Return hButtonUp
}
; Обработка нажатия на кнопку
OnClick(IdButtonUp, IdButtonDown, action, GuiID) {
	GuiControl, %GuiID%: Hide, % IdButtonUp
	GuiControl, %GuiID%: Show, % IdButtonDown
	KeyWait, LButton
	GuiControl, %GuiID%: Hide, % IdButtonDown
	GuiControl, %GuiID%: Show, % IdButtonUp
	MouseGetPos,,,, ControlID, 2
	( ControlID = IdButtonUp && Func(action).Call() )
}

Action1() {
	MsgBox, This Action1
}

Action2() {
	AddPicButton(94, 8, 16, 6, "Action3")
	GuiControl, 1: Hide, % hButton2
}

Action3() {
	MsgBox, This Action3
}

GuiClose:
	ExitApp

24

Re: AHK: Button с картинкой (функция)

stealzy, почему один?

SetWorkingDir, % A_ScriptDir
IcoDll := "ClipMgrIcons.dll"
if !FileExist(IcoDll)
   URLDownloadToFile, http://content.screencast.com/users/teadrinker/folders/Files/media/7d4f94ae-cdd3-467d-b3d1-786f5e8af91c/ClipMgrIcons.dll?downloadOnly=true, % IcoDll

Menu, Tray, Icon, %IcoDll%, 4

AddPicButton(8, 8, 32, IcoDll, 1, "Action1")
AddPicButton(60, 8, 32, IcoDll, 6, "Action2")
Gui, Show
return

AddPicButton(x, y, size, IcoDll, n, action, GuiID := 1)  {
   Global
   WS_EX_CLIENTEDGE := 0x200, WS_EX_DLGMODALFRAME := 0x1
   
   sizeDown := size + 2
   Gui, %GuiID%: Add, Pic, x%x% y%y% w%sizeDown% h%sizeDown% +E%WS_EX_CLIENTEDGE% Icon%n% v%Action% gAnimation, % IcoDll
   Gui, %GuiID%: Add, Pic, x%x% y%y% w%size% h%size% hwndh%Action% +E%WS_EX_DLGMODALFRAME% Icon%n% vUp%Action%, % IcoDll
}

Animation:
GuiControl, %A_Gui%: Hide, Up%A_GuiControl%
KeyWait, LButton
GuiControl, %A_Gui%: Show, Up%A_GuiControl%
MouseGetPos,,,, ControlID, 2
if (ControlID = h%A_GuiControl%)
   GoTo %A_GuiControl%
return

Action1:
msgbox Action1
return

Action2:
msgbox Action2
return

25

Re: AHK: Button с картинкой (функция)

mozers пишет:

Может в коллекцию ?

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

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

26 (изменено: mozers, 2017-03-31 23:48:16)

Re: AHK: Button с картинкой (функция)

teadrinker
Функция Ваша - решать Вам. Исправления, которые я внес, рассчитаны на то, чтобы мне указали на ошибки и неверный подход.

Malcev
Ваш вариант не менее интересен - в коллекцию! Но та же проблема при динамическом добавлении кнопок, что и у teadrinker. Поправил сам. Жду замечаний.

SetWorkingDir, % A_ScriptDir
global IcoDll
IcoDll := "ClipMgrIcons.dll"
If !FileExist(IcoDll) ; Загрузка библиотеки иконок при её отсутствии
	URLDownloadToFile, http://content.screencast.com/users/teadrinker/folders/Files/media/7d4f94ae-cdd3-467d-b3d1-786f5e8af91c/ClipMgrIcons.dll?downloadOnly=true, % IcoDll

Menu, Tray, Icon, %IcoDll%, 4 ; Иконка в заголовке окна и трее
Gui, Show, w200 h70
AddPicButton(8, 8, 32, 1, "Action1")
AddPicButton(60, 8, 16, 2, "Action2")
Return

; Функция добавляет "кнопку" с графическим рисунком
AddPicButton(x, y, size, n, action, GuiID := 1)  {
	global
	WS_EX_CLIENTEDGE := 0x200, WS_EX_DLGMODALFRAME := 0x1

	sizeDown := size + 2
	Gui, %GuiID%: Add, Pic, x%x% y%y% w%sizeDown% h-1 +E%WS_EX_CLIENTEDGE% hidden Icon%n% vDown%Action%, % IcoDll ; Вдавленная кнопка (скрываем)
	Gui, %GuiID%: Add, Pic, x%x% y%y% w%size% h-1 +E%WS_EX_DLGMODALFRAME% Icon%n% v%Action% gAnimation, % IcoDll ; Отжатая кнопка (показываем)
}

Animation: ; Обработка нажатия на кнопку
	GuiControl, %A_Gui%: Hide, %A_GuiControl%
	GuiControl, %A_Gui%: Show, Down%A_GuiControl%
	KeyWait, LButton
	GuiControl, %A_Gui%: Show, %A_GuiControl%
	MouseGetPos,,,, ControlID, 2
	GoTo %A_GuiControl%
Return

Action1:
	MsgBox This Action1
Return

Action2:
	AddPicButton(94, 8, 16, 6, "Action3")
	GuiControl, 1: Hide, %A_GuiControl%
	GuiControl, 1: Hide, Down%A_GuiControl%
Return

Action3:
	MsgBox This Action3
Return

GuiClose:
	ExitApp

All
Остались вопросы:
1. Если разница между sizeDown и size меньше 1 пикселя, то кнопки нажимаются, но Action почему то не работают. При чем тут размер???
2. Зафигом перед E%WS_EX_CLIENTEDGE% Вы ставите + ?

27

Re: AHK: Button с картинкой (функция)

2. Добавление стиля к уже существующим вместо замены их на него. Если мой склероз меня не подводит.

28

Re: AHK: Button с картинкой (функция)

YMP, спасибо! Был неправ когда убрал плюсики.

Подкорректировал оба шикарных (на мой взгляд) варианта (исправил свои предыдущие 2 поста).
Остался только вопрос про нелогичную связь между размером и действием. Хотя, м.б. просто маленький баг AHK?

29 (изменено: stealzy, 2017-04-01 12:15:16)

Re: AHK: Button с картинкой (функция)

У меня независимо от размеров, первая кнопка нажимается и действует, вторая после нажатия исчезает.
Dll не качал, заменил на случайный exe с иконками.
Не очень понимаю, зачем вам ф-ия добавления контролов. Разве что вы собираетесь показывать gui с заранее неизвестным их кол-вом(?).

30

Re: AHK: Button с картинкой (функция)

mozers, я тоже не понимаю, чего вы хотите добиться.

31 (изменено: teadrinker, 2017-04-02 01:46:56)

Re: AHK: Button с картинкой (функция)

В принципе не очень правильно создавать контрол "динамически". Лучше заранее создать их скрытыми и показывать/скрывать, когда нужно.

IcoDll := "Shell32.dll"

handles := []
while (i := A_Index) < 3
   Loop 3
      handles.Push( AddPicButton(10 + (A_Index - 1)*52, 40, 32, IcoDll, 22 + (i - 1)*3 + A_Index, Func("Action")) )

Gui, Add, Radio, vRadio1 x20 y10 Checked, Set1
Gui, Add, Radio, vRadio2 x+30 yp, Set2
toggle := Func("ChangeSet").Bind(handles, "", 1)
Loop 2
   GuiControl, +g, Radio%A_Index%, % toggle

ChangeSet(handles, 1)
Gui, Show, w166 h90
Return

AddPicButton(x, y, size, IcoDll, n, action, GuiID := 1)  {
   static WS_EX_CLIENTEDGE := 0x200, WS_EX_DLGMODALFRAME := 0x1
   
   Gui, %GuiID%: Add, Pic, x%x% y%y% w%size% h-1 hwndhButtonDown +E%WS_EX_CLIENTEDGE% Icon%n% hidden, % IcoDll
   Gui, %GuiID%: Add, Pic, x%x% y%y% w%size% h-1 hwndhButtonUp +E%WS_EX_DLGMODALFRAME% Icon%n% hidden, % IcoDll
   OnClick := Func("OnClick").Bind(hButtonUp, hButtonDown, action, GuiID)
   GuiControl, +g, % hButtonUp, % OnClick
   Return hButtonUp
}

OnClick(hUp, hDown, action, GuiID)  {
   GuiControl, %GuiID%: Hide, % hUp
   GuiControl, %GuiID%: Show, % hDown
   KeyWait, LButton
   GuiControl, %GuiID%: Hide, % hDown
   GuiControl, %GuiID%: Show, % hUp
   MouseGetPos,,,, ControlID, 2
   ( ControlID = hUp && action.Call() )
}
   
Action()  {
   MouseGetPos,,,, Control
   MsgBox, % "Кнопка " . RegExReplace(Control, ".*?(\d+)", "$1")//2
}

ChangeSet(handles, set, GuiID := 1)  {
   ( !set && set := SubStr(A_GuiControl, 0) )
   for k, v in handles
      GuiControl, % GuiID . ":" . ( (set = 2) ^ (k < 4) ? "Show" : "Hide" ), % v
}

GuiClose()  {
   ExitApp
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

32 (изменено: mozers, 2017-04-02 09:57:30)

Re: AHK: Button с картинкой (функция)

stealzy пишет:

первая кнопка нажимается и действует, вторая после нажатия исчезает.

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

Malcev пишет:

mozers, я тоже не понимаю, чего вы хотите добиться.

Цель - создать максимально простую и максимально полноценную функцию, которую потом без "допиливания" можно будет использовать где угодно.

teadrinker
И опять - интересный и наглядный код, который можно использовать в самых разнообразных проектах.