Подписка

добавить на Яндекс

Наши проекты

Delphi+Google

Google API

Google API в Delphi - проект с открытым исходным кодом.

Chrono

Chrono

Хронометр - программа для ведения списка задач.

ODFProc

ODFProc

ODFProc - работа с документами OpenOffice в Lazarus и FreePascal.

Поддержка блога

А тут я коплю на лицензию Delphi XE на iPad =).
Сумма пожертвования не фиксирована.

Публикации

Год назад

Случайный пост

Последние

Сообщения форума

Комментарии

Социальные сети

Google

Facebook

Twitter

Опрос

Вы сейчас или в ближайшем обозримом будущем планируете разрабатывать кроссплатформенное приложение с использованием Firemonkey?



Loading ... Loading ...

Блоги и сообщества

Статьи по Delphi DelphiFeeds.ru - Все Delphi-блоги Рунета Сообщество умных людей VR-Online.RU Бесплатный журнал для программистов и всех, кто интересуется IT Статьи и уроки по Delphi Новостной блог о высоких технологиях
Система Orphus
Опубликовал Vlad 19 августа 2010 в 20:12.
Категории: Основы Delphi.


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

-----------------------------------------------------------------------

Понравилась статья? Тогда:
Делись! Загружай! Плюсуй!
   Отправить PDF на   
Читай ещё статьи на WebDelphi.ru

Комментарии (14)

WP_Cloudy
  • ter пишет:

    tnx за ссылку (:

  • Егор пишет:

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

  • Vlad пишет:

    На больничном я, Егор :) Чё-то перед окончанием отпуска приболел не по-деццки

  • SeregaAltmer пишет:

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

    DWMAPI хорош.

  • Vlad пишет:

    Чу! Какие люди в блог заглянули! :) Здарова-здарова, Сергей. Давненько не списывались

  • SeregaAltmer пишет:

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

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

  • Vlad пишет:

    SeregaAltmer, на сколько я понял — суть эффекта в том, что он «стеклит» всё, что чёрного цвета. Следовательно можно попробовать сделать шрифт, скажем тёмно-синего цвета и тогда эффект к тексту применяться не будет (сам не проверял)

  • SeregaAltmer пишет:

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

  • SeregaAltmer пишет:




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

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

  • azard пишет:

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

  • SeregaAltmer пишет:

    исходник

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

  • azard пишет:

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

  • ayder пишет:

    Привет всем!

    Вопрос к  SeregaAltmer

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

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

  • ayder пишет:

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

Ваш ответ

Внимание: Все комментарии модерируются, и это может вызвать задержку их публикации. Отправлять комментарий заново не требуется.

Пожалуйста, заключайте исходный код в тэги [code][/code].
Если код большой, то воспользуйтесь Вставкой кода на отдельной странице и оставьте в комментарии ссылку на исходник