В 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;
Попробуй протестировать наше небольшое приложение. Мой результат на рисунке ниже.