Делаем стеклянный эффект

altВ Windows 7/Vista появились прикольные визуальные эффекты. Один из таких – эффект стекла (glass effect). Я не знаю как правильно следует переводить его название на наш великий и могучий, поэтому попробую объяснить на пальцах.

Суть эффекта glass в том, что он позволяет сделать окно полупрозрачным. Нет, это не знакомый нам еще с Windows 2000 эффект прозрачности. Glass эффект выглядит по-другому. Применив его к любому окну, ты сможешь видеть все, что расположено позади, но как бы через не очень чистое (пардон) стекло. Приведу небольшой пример. Если мы создадим в каком-нибудь редакторе текстовый документ, запишем в него немного текста, а поверх окна с редактором текста расположим окно с glass эффектом, то получим примерно следующую картинку:

Сквозь консольное приложение виден текст, набранный в редакторе, но он размыт. Подобную картину ты можешь также наблюдать, если подведешь к тексту заголовок какого-нибудь окна.

Эффект смотрится симпатично и сейчас я покажу тебе каким-образом ты можешь его применить для своего приложения.

Бежим в MSDN.
Итак, функция DwmEnableBlurBehindWindow() предназначена для включения эффекта «размытие» для определенного окна. В MSDN функция описана следующим образом:

HRESULT DwmEnableBlurBehindWindow(
HWND hWnd,
__in const DWM_BLURBEHIND *pBlurBehind
);
Как и видно, из описания, для работы функции требуется передать всего лишь два параметра:

hWND – handle окна к которому мы хотим применить эффект размытия.
pBlurBehind [in] – указатель на структуру DWM_BLURBEHIND.

Если звезды правильно выстроются в ряд, то функция вернет S_OK, иначе код ошибки в виде HRESULT. С функцией разобрались, теперь посмотрим на то как выглядит упомянутая выше структура DWM_BLURBEHIND. В священных свитках MS она описана так:

typedef struct _DWM_BLURBEHIND {
DWORD dwFlags;
BOOL fEnable;
HRGN hRgnBlur;
BOOL fTransitionOnMaximized;
} DWM_BLURBEHIND, *PDWM_BLURBEHIND;
Для пущего понимания рассмотрим все ее свойства.

dwFlags – комбинация флагов DWM Blur Behind Constants.

fEnable – Значение «TRUE» в данном свойстве выполняет регистрацию эффекта размытия для окна, а «FALSE» наоборот, снимает.

hRgnBlur – отдельный регион окна к которуму должен примениться эффект размытия. Если на регион тебе по фигу, то нужно поставить NIL.

fTransitionOnMaximized – TRUE, если раскрашиваемое окно должно переходить в состояние развернутого окна. Иначе FALSE.

В структуре нет ничего ужасающего, поэтому я думаю, что трудностей с ее пониманием у тебя не возникло. Раз так, то посмотрим на последний элемент теоретической части – константы DWM Blur Behind Constants. Всего их три:

DWM_BB_ENABLE (0x00000001) – указывает значение для fEnable.
DWM_BB_BLURREGION (0x00000002) – указывает значение для hRgnBlur
DWM_BB_TRANSITIONONMAXIMIZED (0x00000004) – указывает значение для fTransionOnMaximized.

Закрепим все примером

Скорей запускай Delphi и создавай новый проект типа Console Application (консольное приложение). Сохрани созданный проект и возвращайся к тексту статьи. Первым делом нам предстоит описать в нем рассмотренную выше структуру. Сделать это совсем несложно:

type
DWM_BLURBEHIND = record
dwFlags : DWORD;
fEnable : BOOL;
hRgnBlur : HRGN;
fTransitionOnMaximized : BOOL;
end;
Теперь нам точно также опишем функцию DwmEnableBlurBehindWindow. Я уже говорил, что Delphi о ней ни черта не знает. Делается это так:

function DwmEnableBlurBehindWindow(hWnd : HWND; const pBlurBehind : DWM_BLURBEHIND) : HRESULT; stdcall; external ‘dwmapi.dll’ name ‘DwmEnableBlurBehindWindow’;
function GetConsoleWindow: HWND; stdcall; external kernel32 name ‘GetConsoleWindow’;
Помимо рассмотренной DwmEnableBlurBehindWindow я еще описал функцию GetConsoleWindow. Мы воспользуемся ей для получения handle нашего окна.

Теперь посмотрим на тело функции DWM_EnableBlurBehind, с помощью которой мы и будем активировать glass эффект:

function DWM_EnableBlurBehind(hwnd : HWND; AEnable: Boolean; hRgnBlur : HRGN = 0; ATransitionOnMaximized: Boolean = False; AFlags: Cardinal = 1): HRESULT;
var
pBlurBehind : DWM_BLURBEHIND;
begin
pBlurBehind.dwFlags:=AFlags;
pBlurBehind.fEnable:=AEnable;
pBlurBehind.hRgnBlur:=hRgnBlur;
pBlurBehind.fTransitionOnMaximized:=ATransitionOnMaximized;
Result:=DwmEnableBlurBehindWindow(hwnd, pBlurBehind);
end;
Как видишь, в теле функции мы лишь заполняем описанную выше структуру. Описание всех свойств я приводил выше, поэтому повторяться не стану. Результатом функции будет результат функции DwmEnableBlurBehindWindow().

На этом можно считать, что все готово. Юзаем данный код следующим образом:

begin
try
DWM_EnableBlurBehind(GetConsoleWindow(), True);
Writeln(‘See my glass effect’);
Writeln(‘Go Delphi Go’);
Readln;
except
on E:Exception do
Writeln(E.Classname, ‘: ‘, E.Message);
end;
Попробуй протестировать наше небольшое приложение. Мой результат на рисунке ниже.


Понравилась статья? Поделиться с друзьями: