Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Полупрозрачные окна

507
29 августа 2002 года
PASS
45 / / 20.09.2000
Народ! Подскажите, пожалуйста, как можно сделать полупрозрачное окно (как в Winamp3).
Аноним
Цитата:

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). Перепечатка или публикация отдельных ее частей или целиком разрешена с обязательным указанием источника.





















Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог