(495) 925-0049, ITShop интернет-магазин 229-0436, Учебный Центр 925-0049
  Главная страница Карта сайта Контакты
Поиск
Вход
Регистрация
Рассылки сайта
 
 
 
 
 

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, в окне которой достаточно выбрать ехе-файл и нажать на кнопку установитьубрать стиль ХР (она автоматически создает «манифесты»).

Ссылки по теме


 Распечатать »
 Правила публикации »
  Написать редактору 
 Рекомендовать » Дата публикации: 20.11.2006 
 

Магазин программного обеспечения   WWW.ITSHOP.RU
Quest Software. TOAD Xpert Edition
IBM Domino Utility Server Processor Value Unit (PVU) License + SW Subscription & Support 12 Months
Rational ClearCase Multisite Floating User License
NERO 2016 Classic ESD. Электронный ключ
VMware Workstation 14 Pro for Linux and Windows, ESD
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Безопасность компьютерных сетей и защита информации
Новости ITShop.ru - ПО, книги, документация, курсы обучения
Программирование на Microsoft Access
CASE-технологии
СУБД Oracle "с нуля"
ЕRP-Форум. Творческие дискуссии о системах автоматизации
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
 



    
rambler's top100 Rambler's Top100