Полупрозрачные окна
On 2002-08-29 1141, PASS wrote
Народ! Подскажите, пожалуйста, как можно сделать полупрозрачное окно (как в Winamp3).
Окна в Windows нестандартной формы. Прозрачность.
Статья не связанная с тематикой сайта. Каждый из нас запустив у себя на компьютере Mp3 проигрыватель Sonique наверняка задавлся вопросом - каким образом они создали окно приложения такой формы ? Ответ прост и займет всего-то пару абзацев - в windows мы можем задавать область окна специальными регионопределяющими функциями. Самое время скачать ПРИМЕР к статье. Форма окна конечно не самая удачная, я думаю у тебя получится гораздо лучше. А задается она одной единственной строкой
SetWindowRgn(hwnd,CreateRoundRectRgn(rect.left,rect.top,rect.right,rect.bottom,800,800),TRUE);
Определенный заранее регион позволяет задать форму окна. В Win32 большое количество различных функций определения региона и взаимодействия с ним CombineRgn, CreateEllipticRgn, CreateEllipticRgnIndirect, CreatePolygonRgn, CreatePolyPolygonRgn, CreateRectRgn, CreateRectRgnIndirect, CreateRoundRectRgn, ExtCreateRegion, PathToRegion. Именно в их описание стоит вчитаться при создании окон необычной формы.
Теперь поговорим о прозрачности. Если у тебя установлен Windows 2000 или Windows XP ты наверняка обратил внимание на то, что "окошко" у примера прозрачно. В этих двух операционных системах добавлены различные эффекты визуализации. Реализовано это конечно же через API ядра - библиотеку user32.dll в которое присутствует функция SetLayeredWindowAttributes(). Однако вот не задача - поскольку эта возможность не была доступна сразу, в заголовочных *.h файлах отсутствует прототип функции и вспомогательные константы, а в lib библиотеках настройки адресов для этой функции. Можно конечно попытаться скачать свежий SDK с сайта MS... На самом деле нельзя сказать, что это очень плохо - дело в том, что если бы lib файл был, и ты прилинковал бы библиотеку load-time способом (Как ? ты не знаешь разницы load-time и run-time линковки ? Тогда тебе СЮДА), то после запуска этого приложения в ОС не имеющей в составе User32.dll вызова SetLayeredWindowAttributes ты бы получил окошко сообщающее что-то вроде "Ссылка на несуществующий компонент в User32.dllSetLayeredWindowAttributes". Единственно правильным решением является run-time линковка что и реализованно в примере. Далее по исходному тексту
Определим необходимые флаги и константы назначение которых станет ясно из исходного текста
#define WS_EX_LAYERED 0x80000
#define LWA_ALPHA 0x02
Следующий шаг - проверка ядра на наличие необходимой мне функции
HINSTANCE hLib = LoadLibrary("user32.dll");
if (hLib != NULL)
{
pfnSetLayeredWindowAttributes = (PFN_SETLAYEREDWINDOWATTRIBUTES)GetProcAddress(hLib,"SetLayeredWindowAttributes");
}
Для того, чтобы окно можно было сделать прозрачным, при создании оно должно иметь новый атрибут появившийся в Windows 2000+. Конечно никто не мешает изменить свойства окна уже после его создания, что я и делаю в примере
if (pfnSetLayeredWindowAttributes)
{
SetWindowLong(hwnd,GWL_EXSTYLE,GetWindowLong(hwnd,GWL_EXSTYLE) | WS_EX_LAYERED);
pfnSetLayeredWindowAttributes(hwnd,0,128,LWA_ALPHA);
}
Вызов самой функции SetLayeredWindowAttributes устанавливает 50% (значение третьего параметра - 0-255) прозрачность для выбранного окна.
Эта статья является интеллектуальной собственностью автора (JM). Перепечатка или публикация отдельных ее частей или целиком разрешена с обязательным указанием источника.