Я уже один раз упоминал в своем блоге об этом модуле, кода показывал как создавать миниатюры окон в своем приложении, но этот посты был скорее рассмотрением одной из возможностей, которые дает нам 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. Кстати, про Microsoft в целом, у этой корпорации есть специальная программа - MSDN AA с помощью которой можно купить лицензионное ПО для учебных заведений по минимальным ценам и купленне по этой программе ПО могут легально использовать на своих домашних ПК студенты и преподаватели.
-----------------------------------------------------------------------
Подведем итоги "Акции" за вчерашний день. И на этот раз победителем стал один из самых интересных, на мой взгляд, блогов по Delphi - small delphi programming blog. Как и полагается в серьезных блогах по программированию, в bBlog'е есть интересные циклы статей. И один из таких циклов статей как нельзя кстати подходит к сегодняшней теме - работе с Windows 7 в Delphi, а именно работа с "Direct2D". Nак что, если Вас заинтересовали возможности Windows 7, nj обязательно посетие блог "dBlog" - не пожалеете.
-----------------------------------------------------------------------
| Делись! | Загружай! | Плюсуй! |
| | |










19 Авг 2010 в 10:20 пп
tnx за ссылку (:
20 Авг 2010 в 1:57 дп
Ты куда пропал?
20 Авг 2010 в 12:39 пп
На больничном я, Егор :) Чё-то перед окончанием отпуска приболел не по-деццки
20 Авг 2010 в 2:13 пп
Здрасте Вам :)!
DWMAPI хорош.
20 Авг 2010 в 11:31 пп
Чу! Какие люди в блог заглянули! :) Здарова-здарова, Сергей. Давненько не списывались
23 Авг 2010 в 3:14 дп
А как этой чудесной функцие (DwmEnableBlurBehindWindow), помочь адекватно заработать?
Ато она ну очень странно ведет себя на форме, местами «отбеливает», стеклит что не просили (шрифты например), а коегде вообще куски вырывает.
На скриншотах в теме это тоже отчетливо видно.
Может есть легкий путь, ато рыть гугл честно говоря по dwmapi не охота :).
23 Авг 2010 в 3:23 дп
SeregaAltmer, на сколько я понял — суть эффекта в том, что он «стеклит» всё, что чёрного цвета. Следовательно можно попробовать сделать шрифт, скажем тёмно-синего цвета и тогда эффект к тексту применяться не будет (сам не проверял)
23 Авг 2010 в 4:16 дп
Даже если закрыть глаза на цвет текста и поменять его скажем на ярко красный, он ведь всеравно нормально отображаться не будет, да и основную проблему это не решит, пока форма выглядет как минимум нелепо :(.
28 Авг 2010 в 5:31 пп
Немного поэксперементировав с контролами выяснил, что некорторые из них корректно отображаются на стекле, например TSpeedButton, TProgressBar, TImage.
Но лучше все-таки использовать новое свойство формы GlassFrame, с ним корректно отображаются еще и TEdit, TComboBox, возможно и некоторые другие.
В принципе довольно просто состряпать что-то в этом роде:
Что интересно, у контролов появилось новое состояние ControlState [csGlassPaint], которое фигурирует в реализации эфекта стекла с помощью свойства формы GlassFrame. Теоритически изменение этого состояния должно влиять на отображение контролов с включенным эфектом. Но на деле эффект применяется к ним не зависимо от этого состояния.
Так-что использовать Glass в Delphi пока не очень удобно.
03 Сен 2010 в 5:00 пп
Всем привет!
to SeregaAltmer: А картинка в сообщении у вас выглядит внушающе: ссылочку бы на исходник либо текстом файлы формы и модуля, очень надо… Пишите в асю 253-384-488. Спасибо! Всех благ…
03 Сен 2010 в 8:24 пп
исходник
Все настройке в свойстве формы Glass.
04 Сен 2010 в 7:12 дп
Спасибо за помощь! Уж очень непонятные проблемы со стеклом: то буквы теряются (при отключенном double buffered), то цвет формы на всех элементах по краю остаётся (как оказалось можно включить любой цвет, и тогда форма становится двухцветной — рамка одним и клиентская часть другим). Вообще в идеале, по-моему, использования стекла в утилите Гаджеты и у Оперы. Больше примеров не вспоминается. Лису новой версии не видел, быть может им тоже удалось сделать красиво. Ещё раз, спасибо! И всех благ…
05 Июл 2011 в 11:08 пп
Привет всем!
Вопрос к SeregaAltmer
Скажите, пожалуйста, как ты создавал PNG картинку из примера? У меня при подключении картинки в TImage в свойстве Picture пишется TPNGPicture и теряется прозрачность. А в Вашем примере пишется TPNGImage и все работает корректно. Как этого добиться?
Заранее спасибо!
06 Июл 2011 в 2:19 дп
Вопрос снят! Причина в AC (AlphaControl)