Я уже один раз упоминал в своем блоге об этом модуле, кода показывал как создавать миниатюры окон в своем приложении, но этот посты был скорее рассмотрением одной из возможностей, которые дает нам DWM. Сегодня рассмотрим ещё несколько полезных функций по работе с Desktop Window Manager Window 7 в Delphi 2010. Надеюсь, что эта информацию окажется для вас полезной.
Начнем с самой простой функции — включение/отключение DWM.
Функция DwmEnableComposition
DwmEnableComposition включает/отключает Desktop Window Manager. Синтаксис функции в Delphi:
function DwmEnableComposition(uCompositionAction: UINT):HRESULT
где в качестве параметра uCompositionAction могут использоваться две константы:
DWM_EC_DISABLECOMPOSITION = 0 — для отключения DWM;
DWM_EC_ENABLECOMPOSITION = 1; — для включения DWM;
При успешном выполнении функция возвращает S_OK.
Пример использования:
if DwmEnableComposition(DWM_EC_ENABLECOMPOSITION)=S_OK then label1.Caption:='DWM включен' else label1.Caption:='Включение не удалось'
Примечание: для того, чтобы проверить включено ли в ОС использование DWM достаточно воспользоваться функцией DwmIsCompositionEnabled.
Функция DwmEnableBlurBehindWindow
Включает эффект «Стекло» для окна.
Синтаксис:
function DwmEnableBlurBehindWindow(hWnd:HWND; pBlurBehind: DWM_BLURBEHIND):HRESULT;
Парамеры:
hWnd:HWND — хэндл окна для которого применяется эффект;
pBlurBehind: DWM_BLURBEHIND — структура, определяющая параметры эффекта.
DWM_BLURBEHIND = record dwFlags: DWORD; fEnable: BOOL; hRgnBlur: HRGN; fTransitionOnMaximized: BOOL; end;
dwFlags: DWORD — может содержать комбинацию следующих флагов:
DWM_BB_ENABLE — указывает на то, что значение fEnable было определено;
DWM_BB_BLURREGION — указывает на то, что значение hRgnBlur было определено;
DWM_BB_TRANSITIONONMAXIMIZED — указывает на то, что было указано значение fTransitionOnMaximized;
fEnable: BOOL — true указывает на то, что в создании эффекта будет участвовать окно, находящееся позади целевого.
hRgnBlur: HRGN — область окна к которому применяется эффект. Значение 0 указывает на то, что эффект будет применен ко всей клиентской области окна.
fTransitionOnMaximized: BOOL — TRUE, если раскрашиваемое окно должно переходить в состояние развернутого окна. Иначе FALSE.
В случае успешного выполнения функция вернет в результате S_OK.
Пример использования функции.
Для того, чтобы использовать эффект стекла для окон вашего приложения обязательно следует установить свойство Color формы как clBlack. Устанавливаем и в каком-либо обработчике пишем:
var Blur: DWM_BLURBEHIND; begin Blur.dwFlags:=DWM_BB_ENABLE+DWM_BB_BLURREGION+DWM_BB_TRANSITIONONMAXIMIZED; Blur.fEnable:=true; Blur.fTransitionOnMaximized:=false; Blur.hRgnBlur:=0;//применяе эффект ко всей клиентской области DwmEnableBlurBehindWindow(Handle, Blur); end;
В запущенном приложении эффект будет выглядеть следующим образом:
Если Вам необходим, чтобы эффекти применялся к части окна, то необходимо определеть поле hRgnBlur. Например, создадим эффект для вписанного в клиентскую область элипса. Для этого в исходном коде необходимо заменить всего одну строку:
... Blur.hRgnBlur:=CreateEllipticRgnIndirect(Form.ClientRect); ...
Примечание: для того, чтобы использовать «стеклянный» эффект в приложениях не обязательно использовать функцию DwmEnableBlurBehindWindow. В Delphi 2010 у форм появилось новое свойство TGlassFrame, регулируя которое можно добиться необходимого Вам эффекта. Однако для консольных приложений использование эффекта возможно только с использованием описанной выше функции.
Функция DwmEnableMMCSS
DwmEnableMMCSS позволяет или запрещает использование MMCSS для DWM.
MMCSS — cлужба Multimedia Class Scheduler Service впервые введена в Windows Vista и служит для того, чтобы управлять приоритетами мультимедийных потоков для выполнения процессором. В двух словах, суть MMCSS сводися к тому, чтобы обеспечить более качественное и ровное выполнение мультимедийных приложений. Более подробно про ту службу можно узнать, например, здесь.
Синтаксис:
function DwmEnableMMCSS(fEnableMMCSS: boolean):HRESULT;
fEnableMMCSS: boolean — true указывает на то, что DWM должен быть включен в MMCSS.
В случае успешного выполнения функция возвращает S_OK.
Пример использования:
DwmEnableMMCSS(false);//ислючили DWM из MMCSS
Вот, в принципе, ещё три функции, с помощью которых вы можете кправлять ОС и сделать свой приложения более красивыми. В статье рассмотрены не все функции для работы с DWM Windows 7 в Delphi, если вы хотите узнать о других возможностях работы, то можете обратиться к MSDN.
tnx за ссылку (:
Ты куда пропал?
На больничном я, Егор :) Чё-то перед окончанием отпуска приболел не по-деццки
Здрасте Вам :)!
DWMAPI хорош.
Чу! Какие люди в блог заглянули! :) Здарова-здарова, Сергей. Давненько не списывались
А как этой чудесной функцие (DwmEnableBlurBehindWindow), помочь адекватно заработать?
Ато она ну очень странно ведет себя на форме, местами «отбеливает», стеклит что не просили (шрифты например), а коегде вообще куски вырывает.
На скриншотах в теме это тоже отчетливо видно.
Может есть легкий путь, ато рыть гугл честно говоря по dwmapi не охота :).
SeregaAltmer, на сколько я понял — суть эффекта в том, что он «стеклит» всё, что чёрного цвета. Следовательно можно попробовать сделать шрифт, скажем тёмно-синего цвета и тогда эффект к тексту применяться не будет (сам не проверял)
Даже если закрыть глаза на цвет текста и поменять его скажем на ярко красный, он ведь всеравно нормально отображаться не будет, да и основную проблему это не решит, пока форма выглядет как минимум нелепо :(.
Немного поэксперементировав с контролами выяснил, что некорторые из них корректно отображаются на стекле, например TSpeedButton, TProgressBar, TImage.
Но лучше все-таки использовать новое свойство формы GlassFrame, с ним корректно отображаются еще и TEdit, TComboBox, возможно и некоторые другие.
В принципе довольно просто состряпать что-то в этом роде:
Что интересно, у контролов появилось новое состояние ControlState [csGlassPaint], которое фигурирует в реализации эфекта стекла с помощью свойства формы GlassFrame. Теоритически изменение этого состояния должно влиять на отображение контролов с включенным эфектом. Но на деле эффект применяется к ним не зависимо от этого состояния.
Так-что использовать Glass в Delphi пока не очень удобно.
Всем привет!
to SeregaAltmer: А картинка в сообщении у вас выглядит внушающе: ссылочку бы на исходник либо текстом файлы формы и модуля, очень надо… Пишите в асю 253-384-488. Спасибо! Всех благ…
исходник
Все настройке в свойстве формы Glass.
Спасибо за помощь! Уж очень непонятные проблемы со стеклом: то буквы теряются (при отключенном double buffered), то цвет формы на всех элементах по краю остаётся (как оказалось можно включить любой цвет, и тогда форма становится двухцветной — рамка одним и клиентская часть другим). Вообще в идеале, по-моему, использования стекла в утилите Гаджеты и у Оперы. Больше примеров не вспоминается. Лису новой версии не видел, быть может им тоже удалось сделать красиво. Ещё раз, спасибо! И всех благ…
Привет всем!
Вопрос к SeregaAltmer
Скажите, пожалуйста, как ты создавал PNG картинку из примера? У меня при подключении картинки в TImage в свойстве Picture пишется TPNGPicture и теряется прозрачность. А в Вашем примере пишется TPNGImage и все работает корректно. Как этого добиться?
Заранее спасибо!
Вопрос снят! Причина в AC (AlphaControl)