уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Я уже один раз упоминал в своем блоге об этом модуле, кода показывал как создавать миниатюры окон в своем приложении, но этот посты был скорее рассмотрением одной из возможностей, которые дает нам 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.

0 0 голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
14 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии
ter
ter
19/08/2010 22:20

tnx за ссылку (:

Егор
20/08/2010 01:57

Ты куда пропал?

SeregaAltmer
20/08/2010 14:13

Здрасте Вам :)!

DWMAPI хорош.

SeregaAltmer
23/08/2010 03:14

А как этой чудесной функцие (DwmEnableBlurBehindWindow), помочь адекватно заработать?
Ато она ну очень странно ведет себя на форме, местами «отбеливает», стеклит что не просили (шрифты например), а коегде вообще куски вырывает.
На скриншотах в теме это тоже отчетливо видно.

Может есть легкий путь, ато рыть гугл честно говоря по dwmapi не охота :).

SeregaAltmer
23/08/2010 04:16
Ответить на  Vlad

Даже если закрыть глаза на цвет текста и поменять его скажем на ярко красный, он ведь всеравно нормально отображаться не будет, да и основную проблему это не решит, пока форма выглядет как минимум нелепо :(.

SeregaAltmer
28/08/2010 17:31
Ответить на  SeregaAltmer




Немного поэксперементировав с контролами выяснил, что некорторые из них корректно отображаются на стекле, например TSpeedButton, TProgressBar, TImage.
Но лучше все-таки использовать новое свойство формы GlassFrame, с ним корректно отображаются еще и TEdit, TComboBox, возможно и некоторые другие.
В принципе довольно просто состряпать что-то в этом роде:

Что интересно, у контролов появилось новое состояние ControlState [csGlassPaint], которое фигурирует в реализации эфекта стекла с помощью свойства формы GlassFrame. Теоритически изменение этого состояния должно влиять на отображение контролов с включенным эфектом. Но на деле эффект применяется к ним не зависимо от этого состояния.
Так-что использовать Glass в Delphi пока не очень удобно.

azard
azard
03/09/2010 17:00

Всем привет!
to SeregaAltmer: А картинка в сообщении у вас выглядит внушающе: ссылочку бы на исходник либо текстом файлы формы и модуля, очень надо… Пишите в асю 253-384-488. Спасибо! Всех благ…

SeregaAltmer
03/09/2010 20:24
Ответить на  azard

исходник

Все настройке в свойстве формы Glass.

azard
azard
04/09/2010 07:12

Спасибо за помощь! Уж очень непонятные проблемы со стеклом: то буквы теряются (при отключенном double buffered), то цвет формы на всех элементах по краю остаётся (как оказалось можно включить любой цвет, и тогда форма становится двухцветной — рамка одним и клиентская часть другим). Вообще в идеале, по-моему, использования стекла в утилите Гаджеты и у Оперы. Больше примеров не вспоминается. Лису новой версии не видел, быть может им тоже удалось сделать красиво. Ещё раз, спасибо! И всех благ…

ayder
ayder
05/07/2011 23:08

Привет всем!

Вопрос к  SeregaAltmer

Скажите, пожалуйста, как ты создавал PNG картинку из примера? У меня при подключении картинки в TImage в свойстве Picture пишется TPNGPicture и теряется прозрачность. А в Вашем примере пишется TPNGImage и все работает корректно. Как этого добиться? 

Заранее спасибо!

ayder
ayder
06/07/2011 02:19

Вопрос снят! Причина в AC (AlphaControl)