1

Тема: 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

Ранее создавал тему с вопросом "как это сделать?", но никто так и не дал дельного совета. Нашел решение самостоятельно. Пользуйтесь

2

Re: AHK: Прозрачность элементов GUI

Идея думаю хорошая, один недостаток - при перемещении окна анимация зависает.

Win10x64, AHK v1.1.33.09 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

3

Re: AHK: Прозрачность элементов GUI

Изменять прозрачность можно так же и у контролов, например:

Gui, Margin, 0, 0
Gui, Font, s15 bold, Segoe UI
Gui, Add, Text, y50 w400 Center hwndhText1, Элемент №1
Gui, Font, s10
Gui, Add, Text, y+10 wp Center hwndhText2, Элемент №2
Gui, Show, h300
trans := 0
Elems := [hText1, hText2]
SetTrans(Elems, trans)
incr := 8
delay := 0
count := 3, counter := 0
SetTimer, Timer, 10
Return

GuiClose:
   ExitApp

Timer() {
   global
   if (trans <= 0)
      k := ++delay < 0 ? 0 : 1
   if (trans >= 255)
      k := -1, delay := -30, counter++
   if (counter = count)
      SetTimer,, Off
   SetTrans(Elems, trans += incr*k)
}

SetTrans(Elems, trans) {
   for k, v in Elems
      WinSet, Transparent, % trans, ahk_id %v%
}

Одна проблема — такой код будет работать только на десятке.

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

4

Re: AHK: Прозрачность элементов GUI

А где можно узнать, что именно на win10 только будет работать код?

Win10x64, AHK v1.1.33.09 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

5

Re: AHK: Прозрачность элементов GUI

Чтобы сделать окно частично прозрачным, к нему нужно применить стиль WS_EX_LAYERED (что и делает WinSet, Transparent). Окна, о которых идёт речь, в обоих примерах дочерние, а со стилем WS_EX_LAYERED окна могут быть дочерними только начиная с Windows 8:

Beginning with Windows 8, WS_EX_LAYERED can be used with child windows and top-level windows. Previous Windows versions support WS_EX_LAYERED only for top-level windows.

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

6 (изменено: __Михаил__, 2021-04-07 23:17:56)

Re: AHK: Прозрачность элементов GUI

На работе win7 x64. Проверял прозрачность и всё работало исправно.
Нужно будет этот код проверить завтра.

Win10x64, AHK v1.1.33.09 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

7

Re: AHK: Прозрачность элементов GUI

__Михаил__ пишет:

Проверял прозрачность

Прозрачность чего именно?

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