Delphi: Интерфейс в XPерементальном стиле

Источник: codingclub

Как вы уже, наверное, заметили, приложения, созданные с помощью Delphi и C++ Builder не имеют поддержки тем новой ОС. Ваш рабочий стол и все такое выглядит красиво, стильно, а вот ваше приложение до сих пор мозолит глаза прямоугольными невыразительными кнопками Win9x/Me. Все это можно изменить, главное - дочитать эту статью до конца. 

Изначально поддержка тем ХР осуществляется через ComCtl32.dll версии 6, которая поставляется с этой ОС и не является redistributable (т.е. перераспостраняемой), так что в WinMe вам не удастся устроить поддержку визуальных тем, просто скопировав в нее библиотеку из XP. Но вернемся к нашей задаче... Для того чтобы организовать поддержку тем, нужно использовать так называемый «манифест» приложения, написанный на XML (Extensible Markup Language). Итак, создаем текстовый файл и набираем в нем следующее (попутно заменив CompanyName… на имя приложения и остальные данные о нем):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
  version="1.0.0.0"
  processorArchitecture="X86"
  name="CompanyName.ProductName.YourApplication"
  type="win32"
/>
<description>Your application description here.</description>
<dependency>
  <dependentAssembly>
    <assemblyIdentity
      type="win32"
      name="Microsoft.Windows.Common-Controls"
      version="6.0.0.0"
      processorArchitecture="X86"
      publicKeyToken="6595b64144ccf1df"
      language="*"
    />
  </dependentAssembly>
</dependency>
</assembly>
 
Теперь сохраните файл на жесткий диск в папку с приложением с именем имя_файла.exe.manifest (где имя файла - имя исполняемого модуля вашего приложения) и запустите программу - и вот она перед вами, только с контролами XP :-)! Вдаваться в подробности не буду, хочу лишь добавить, что этот «манифест» придется поставлять с приложением, или прикомпилировать его в качестве ресурса к исполняемому модулю (в .rc-файле должен быть текст типа 1 24 XPTheme.manifest). Впрочем, и тут есть свои нюансы (например, при использовании плагинов).

Если вам этот способ показался неудобным, то чтобы лишний раз не сбивать пальцы о клавиатуру (и складывать руки в ожидании Delphi 7, в котором осуществили поддержку тем автоматически), можете воспользоваться прекрасным компонентом Theme Manager для Delphi (и Borland C++ Builder, соответственно). Автор компонента - Майк Лишке (Mike Lischke - кстати, спасибо ему за то, что разрешил написать статью о данном компоненте). Заходите к нему на сайт http://www.delphi-gems.com/, Скачиваете оттуда комплект Themes Manager, распаковываете и устанавливаете пакет ThemeManager.dpk, после чего у вас в палитре компонентов появится закладка XP с двумя новыми. Чтобы добавить в ваше приложение поддержку стилей, достаточно бросить TThemeManager на форму - и все (в некоторых случаях, если поддержка не работает, придется добавлять ресурс WinXp.res из папки с компонентом, но с такими ситуациями я пока не сталкивался). Откомпилируйте ваш продукт и проверьте - все окна приложения имеют красивые кнопки и контролы а ля XP. Но рано ставить точку - а вдруг любезный читатель захочет написать собственные контролы, используя красивые рамки и шрифты XP? Например, с левой стороны окна сделать панель, как у Проводника... Ну-с, приступим.

Компонент ThemeManager предоставляет все необходимое для рисования отдельно каждого элемента ХР. Для примера мы нарисуем на теле компонента PaintBox красивую рамку от ProgressBar’a. Для этого положите на форму компонент ThemeManager и PaintBox. В обработчике OnPaint PaintBox’a напишите этот код:

var
 Details: TThemedElementDetails;
begin
Details := ThemeManager.ThemeServices.GetElementDetails(tpBar);
ThemeManager.ThemeServices.DrawElement(paintbox.Canvas.Handle, Details, paintbox.ClientRect);
end;
 
Откомпилируйте все это и посмотрите на результат. По краю PaintBox’a выводится красивая рамка с гладкими углами, аналогичная выводимой вокруг компонента ProgressBar. Теперь поясню код по строкам. В переменную Details мы присваиваем детали элемента tpBar (рамка вокруг индикатора прогресса). Затем средствами компонента менеджера тем мы выводим заданный в переменной элемент на канву PaintBox’a. Откуда брать названия элементов? Из файла ThemeSrv.pas или из программы Theme Explorer, созданной автором компонента (закачать ее вместе с исходным кодом вы можете с того же сайта). Откройте файл и поищите там то, что вас интересует. Например, вы наткнулись на такой участок кода:

 // 'Edit' theme data
 TThemedEdit = (
  teEditDontCare, ... );
 
Перед вами описывается стиль компонента Edit. Вам достаточно скопировать любое из его состояний и вставить в код GetElementDetails() - вместо рамки индикатора нарисуется рамка редактора текста. В этом файле (themeSrv.pas) можно найти описание TaskBar, StartMenu, ExplorerBar. Смотрите таблицу краткого пояснения (или воспользуйтесь Theme Explorer), чтобы быстрей найти компонент, который вам нужен.

И еще один важный момент - вывод текста в стиле выбранного компонента. Специально для этого я написал коротенькую процедуру, которая вызывается при перерисовке (в примере PaintBox’a):

DrawXPStart_Text(PaintBox.Canvas,PaintBox.ClientRect,tspUserPane,-10,-55,'Super font, isn''t it?');
 
Это приведет к тому, что наш текст будет выведен стилем надписи имени пользователя панели меню «Пуск». Вот сама процедура:

procedure TForm1.DrawXPStart_Text(Canvas: TCanvas; R: TRect;
 Element: TThemedStartPanel; dx, dy: integer; Text: string);
var
 Details: TThemedElementDetails;
begin
Details := ThemeManager.ThemeServices.GetElementDetails(Element);
InflateRect(R, dx, dy);
ThemeManager.ThemeServices.DrawText(Canvas.Handle, Details, Text, R, DT_VCENTER, 0);
end;
 
В ней нет ничего сложного, как и в прорисовке компонентов - попросту устанавливаете стиль и с помощью процедуры вывода текста выводите его.

Ну, думаю, теперь точно хватит. Впрочем, если вы кое-что недопоняли, то разобраться вам поможет мой пример, в котором с левой стороны окна выводится синяя панель, аналогичная панели Проводника. И в заключение еще пару слов о компоненте - он оказался настолько хорош и функционален, что Borland взяла именно его для поддержки тем в своих последующих продуктах (Delphi 7)...

P.S. Если вы желаете присвоить стиль ХР другим программам автоматически, то существует программа XPSkins, в окне которой достаточно выбрать ехе-файл и нажать на кнопку установитьубрать стиль ХР (она автоматически создает «манифесты»).


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=2269