Тема: AHK: Прозрачность элементов GUI
Всем привет
Однажды, когда мне нужно было сделать красивую анимацию в окне, я задумался: как мне изменить прозрачность элементов у GUI. Не прозрачность окна, а именно прозрачность элементов.
До меня дошло, что можно поэкспериментировать с WinSet. Зная, что с помощью Transparent'а можно менять прозрачность окна, я решил через параметр +Parent "присоединить" окно в другое окно. Чтобы не было заголовка, добавил параметр -Caption.
Получился такой код:
; Создаем основное окно, где будут расположены элементы.
; Color должен быть идентичный в обоих окнах, во избежание артефактов. Допустим, будет White.
title := "Transparent Window"
; Добавляем hwnd для упрощения работы.
Gui, main:-MinimizeBox +hwndmainwid
Gui, main:Color, White
Gui, main:Show, w479 h379, % title
; Теперь создаем пустое окошко и применяем к нему параметры (это окно будет отвечать за показ элементов).
; Именно пустое. Потому что если туда что-то добавить, то элементы этого окна будут в приоритете и могут создать артефакты.
Gui, secondary:+ParentMain -Caption +hwndsecondwid
Gui, secondary:Show, x0 y0 w479 h379, % title
; Ставим нулевую прозрачность с целью незаметного создания элементов окна и анимацией "проявления" в будущем.
WinSet, Transparent, 0, ahk_id %secondwid%
sleep, 1000 ; хотя бы одну мс. Потому что если убрать эту задержку появятся артефакты. Будут видны серые границы элементов.
; Создаем элементы, которые будут отображаться в будущем.
Gui, secondary:Color, White
Gui, secondary:Font, S15 CDefault bold, Segoe UI
Gui, secondary:Add, Text, x12 y59 w450 h30 +Center, Элемент №1
Gui, secondary:Font, S10 CDefault norm, Segoe UI
Gui, secondary:Add, Text, x12 y94 w450 h20 +Center, Элемент №2
moment_transparent = 0 ; значение, которое будет использоваться в цикле (в WinSet, Transparent).
delay = 1 ; значение, которое будет использоваться в цикле (задержка перед повтором цикла).
speed = 10 ; значение, которое будет использоваться в цикле (число которое будет добавляться в новом круге цикла к переменной moment_transparent).
loop, 5 ; для демонстрации
{
; Сама "анимация"
loop {
if moment_transparent > 255
break
moment_transparent+=%speed%
WinSet, Transparent, % moment_transparent, ahk_id %secondwid%
sleep, %delay%
}
; Теперь та же анимация, но наоборот
loop {
if moment_transparent < 0
break
moment_transparent-=%speed%
WinSet, Transparent, % moment_transparent, ahk_id %secondwid%
sleep, %delay%
}
}
sleep, 500
MainGuiClose:
ExitApp
Ранее создавал тему с вопросом "как это сделать?", но никто так и не дал дельного совета. Нашел решение самостоятельно. Пользуйтесь