Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

VAST 4.02 : Как сделать окно прозрачным?

197 views
Skip to first unread message

Д.Ю. Левенцов

unread,
Dec 22, 2005, 4:10:46 AM12/22/05
to
Добрый день!
Хотелось бы получить совет, как в VAST 4.02 в среде WinXP SP1 сделать окно
прозрачным, а также менять степень прозрачности. Я так полагаю, что нужно
использовать функции WinAPI, но вот мне не удаётся правильно вызвать их из
VAST.
Причём скрипт, делающий окно "always on top" удалось запустить:

alwaysOnTop
"Perform the alwaysOnTop action."
|minWin|
minWin := PlatformFunction callingConvention: 'c'
function: 'SetWindowPos'
library: 'user32.dll'
parameterTypes:#(uint32 uint32 int32 int32 int32 int32 uint32)
returnType: #void.
minWin callWith:(self parentPart widget window shellHandle) with: -1
with: 0 with: 0 with: 0 with: 0 with: (1 bitOr: 2).

Но в данном случае я смог подсмотреть значения необходимых параметров в
недрах VAST, впрочем как и сам вызов. В случае же с прозрачность окна
необходимой информации в недрах VAST нет ибо эта функция появилась только в
Win2K.
Описание действий, которые необходимо выполнить, чтобы сделать окно
прозрачным есть:

Чтобы сделать диалоговое окно прозрачным, сперва необходимо создать
обычный диалог. А затем, в обработчике сообщения WM_INITDIALOG, установить
бит прозрачности в дополнительных свойствах окна, и вызвать
SetLayeredWindowAttributes с желаемым значением альфы. Программно это
выглядит так:
// Устанавливаем WS_EX_LAYERED на это окно
SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd,
GWL_EXSTYLE) | WS_EX_LAYERED);
// Делаем это окно на 70% прозрачным
SetLayeredWindowAttributes(hwnd, 0, (255 * 70) / 100,
LWA_ALPHA);
Обратите внимание, что третий параметр SetLayeredWindowAttributes
имеет значение в пределах от 0 до 255. При этом 0 делает окно полностью
прозрачным, 255 полностью НЕ прозрачным.

Функции находятся в модуле user32.dll, причём функция SetWindowLong имеет
alias SetWindowLongA. Проблемой также является то, что я не знаю значений
констант GWL_EXSTYLE, WS_EX_LAYERED и LWA_ALPHA.

Буду признателен, если кто-нибудь сможет продемонстрировать скрипт для VAST,
вызывающий функцию GetWindowLong с параметром GWL_EXSTYLE для существующего
окна, затем вызывающий функцию SetWindowLong, используя результат выполнения
предыдущей функции как один из параметров, а также вызов функции
SetLayeredWindowAttributes.
А может всё гораздо проще и я излишне заморачиваюсь?

С уважением,
Дмитрий Левенцов.


Д.Ю. Левенцов

unread,
Dec 26, 2005, 6:42:45 AM12/26/05
to
Спасибо!!!
Очень помогло!

С уважением,
Дмитрий Левенцов


"Maxim Annenkov" <m...@bbt.ru> сообщил/сообщила в новостях следующее:
news:dogmvj$s36$1...@ddt.demos.su...
>
> Здравствуйте,
>
> Вот dat - файл из VAST 6.03 с апликухой, которая делает то, что вам нужно.
> Там же и пример.
>

Д.Ю. Левенцов

unread,
Dec 30, 2005, 2:53:40 AM12/30/05
to
Здравствуйте!
Небольшой сопутствующий предыдущему вопрос. До того как Максим преслал мне
приложение из VAST 6.03, иллюстрирующее работу с прозрачностю окон, я
пробовал играться с вызовом функции WinAPI SetWindowLong пытаясь передавать
ей различные параметры. На прозрачности окна это в тот момент никак не
сказалась, но вот получались довольно интерсные стили окна. К сожалению это
было очень хаотично и я сам не понял, что сделал. Нет ли информации по
поводу применения этой фунцкии для изменения стиля окна и соответсвующих
параметрах.

Maxim Annenkov

unread,
Dec 30, 2005, 6:00:55 AM12/30/05
to
Привет,

Все описано в MSDN. Можно или купить на рынке, или в онлайне
http://msdn.microsoft.com
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/WindowsUserInterface/Windowing/Windows/WindowReference/WindowStyles.asp


"Д.Ю. Левенцов" <l...@aaanet.ru> wrote in message
news:dp2p1c$1g7j$1...@pa.aaanet.ru...

0 new messages