Добрый день!
Хотелось бы получить совет, как в 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.
А может всё гораздо проще и я излишне заморачиваюсь?
С уважением,
Дмитрий Левенцов.