Суббота, 18.05.2024
Королевство Delphi
Главное меню
Статьи
Наш опрос
Нужен форум на сайте?
Всего ответов: 90
Статистика
Онлайн всего: 1
Гостей: 1
Пользователей: 0
Форма входа
Главная » Статьи » Разные » Пользовательский интерфейс

Windows XP и Delphi 7

Элементы управления Windows XP

В Delphi 7 появилась возможность настраивать пользовательский интерфейс приложений для использования в Windows XP. Для этого в состав ресурсов приложений должен включаться манифест Windows XP. Это дополнение призвано обеспечить корректное взаимодействие элементов управления приложений с системной библиотекой ComCTL32.dll версии 6 , используемой в Windows XP. Собственно все особенности работы приложений под управлением в Windows XP вызвано именно появлением новой версии этой библиотеки. Впрочем, об этом подробнее рассказывается ниже.

В этой статье рассматриваются следующие вопросы:

  • динамическая библиотека ComCtl32.dll v.6 и особенности пользовательского интерфейса Windows XP;
  • что такое манифест Windows XP;
  • компонент TXPManifest;
  • как включить манифест Windows Xp в ресурсы приложения;
  • стили приложения и компоненты настройки цветовой палитры;

Пользовательский интерфейс Windows XP

При первом запуске Windows XP сразу же обращаешь внимание на существенные изменения в оформлении пользовательского интерфейса этой операционной системы. Все нововведения основаны на использовании нового способа отрисовки элементов управления, который реализован в системной динамической библиотеке ComCtl32.ll версии 6. Эта библиотека входит в состав операционной системы Windows XP.


Примечание

Обратите внимание, что все более ранние операционные системы фирмы Microsoft используют ComCtl32.dll версии 5 с традиционным стилем оформления элементов управления. И, конечно, нельзя заставить Windows 2000 выглядеть как Windows XP простой заменой версии ComCtl32.dll. Операционная система должна уметь использовать новые возможности.


Теперь элементы управления в стиле Windows XP могут иметь собственную цветовую палитру, текстуры, стили заполнения и, самое главное различные методы отрисовки своих составных частей. Например, элемент управления может рисовать собственное поле ввода данных обычным способом, а рамку - с использованием маски XOR.

Совокупность правил и методов поведения, оформления и отрисовки элементов называется визуальным стилем (visual style). Совместно с Windows XP поставляется один готовый стиль.

Если разработчик хочет, чтобы его приложение могло использовать новые возможности Windows XP, он должен включить в состав пакета специальный ресурс - манифест. Манифест представляет собой документ XML, содержащий необходимую для библиотеки ComCtl32.dll версии 6 информацию.

Такое приложение будет чувствовать себя комфортно в среде Windows XP. Но и при запуске в старых ОС оно просто будет использовать стандартный набор возможностей ComCtl32.dll версии 5 и именно она используется по умолчанию.

Манифест Windows XP

Итак, начнем с манифеста. Он представляет собой документ в формате XML, содержащий всю информацию, необходимую для взаимодействия приложения ComCtl32.dll версии 6.


Примечание

Следует отметить, что манифесты широко используются во многих продуктах и технологиях, работающих в операционных системах Microsoft. С полной схемой XML манифеста вы можете ознакомиться в документации Microsoft MSDN.


Пример манифеста:

Манифест Windows XP


<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
type="win32"
name="App"
processorArchitecture="x86"
version="1.0.0.0"/>
<description>
Application description
</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="x86"
publicKeyToken="6595b64144ccf1df"
language="*"/>
</dependentAssembly>
</dependency>
</assembly>

При загрузке приложения ОС Windows XP считывает манифест (если он есть) и получает информацию о том, что для выполнения приложения потребуется библиотека ComCtl32.dll версии 6.

Помимо этой информации манифест может содержать и другие необходимые сведения о приложении и условиях его работы. Например, общая информация о приложении и его версии представлены элементом <assemblyIdentity> .

Вы можете добавить манифест в ваше приложение двумя способами:

  • использовать компонент TXPManifest;
  • добавить манифест в ресурсы приложения вручную.

Рассмотрим их.

Компонент TXPManifest

На странице Win32 Палитры компонентов Delphi 7 имеется компонент TXPManifest. Будучи добавленным в проект, он обеспечивает компиляцию манифеста Windows XP в исполняемый файл приложения. В качестве основы используется стандартный манифест DELPHI для Windows XP, содержащийся в файле Dephi7\Lib\Windows XP.res

Манифест Delphi для Windows XP

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
type="win32"
name="DelphiApplication"
version="1.0.0.0"
processorArchitecture="*"/>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
publicKeyToken="6595b64144ccf1df"
language="*"
processorArchitecture="*"/>
</dependentAssembly>
</dependency>
</assembly>

К сожалению, версия программного продукта (ProdutVersion), а также любая другая информация о версии, содержащаяся в проекте (файлы DOF и RES) и настраиваемая в диалоге Project Options среды разработки Delphi, никак не влияет на содержимое манифеста. Поэтому при настройке манифеста в соответствии  с потребностями приложения вам придется предварительно отредактировать файл WindowsXP.res или поправить манифест прямо в исполняемом файле.  (Ввиду частых перекомпиляций проекта второй вариант представляется довольно обременительно.)

Включение манифеста Windows XP в ресурсы приложения

Так как использование стандартного компонента TXPManifest требует настройки исходного манифеста Delphi для каждого проекта, было бы неплохо изыскать более удобный способ. В качестве альтернативы вы можете подключить манифест к файлу вашего проекта и по мере надобности редактировать его, не опасаясь, что ваша забывчивость может отразиться на версиях в манифестах других приложений.

Для начала необходимо создать исходный файл ресурса RC, включающий единственную строку:

1 24 "XP.manifest"

где 1 - номер ресурса версии библиотеки ComCtl32.dll, а 24 - номер ресурса манифеста (нумерация соответствует заголовочным файлам, распространяемых Microsoft); "XP.manifest" - имя файла с документом XML, содержащим манифест. Естественно, манифест нужно настроить в соответствии с потребностями вашего проекта.

Теперь нужно откомпилировать файл ресурса при помощи строчного компилятора ресурсов \Delphi7\Bin\brcc32.exe и разместить его в папке проекта.

И последняя операция - добавьте в исходный код файла проекта директиву подключения ресурса манифеста: {$R xpmanifest.res}

В результате при компиляции проекта манифест из ресурса будет добавлен в исполняемый файл приложения.

Визуальные стили в DELPHI

Теперь мы детально поговорим о роли действий при разработке пользовательского интерфейса приложения и специальном компонента для управления действиями - TActionManager. Немного забегая вперед скажем, что этот компонент является своего рода "командным пунктом!, из которого должны управляться элементы управления приложения. Сейчас же нас интересует только свойство этого компонента

property Style: TActionBarStyle;

По умолчанию сред разработки Delphi предлагает к использованию два стиля:

  • Standart - приложение использует системную библиотеку ComCtl32.dll версии 5;
  • Windows XP - приложение использует системную библиотеку ComCtl32.dll версии 6 и единственный стандартный визуальный стиль Windows XP.

Эти стили применимы только к элементам управления, размещенным на панелях инструментов  (TActionToolBar), созданных в компоненте TActionManager.

Однако не торопитесь возмущаться явной ограниченностью выбора. Вы можете создать свой собственных стиль самостоятельно. Правда, это потребует очень много усилий - ведь не основе базовых классов элементов управления вам потребуется создать собственные классы с нужным вам поведением и внешним видом.

Для этого необходимо создать класс нового визуального стиля на основе класса TActionBarStyleEx. Затем новый стиль регистрирует при помощи процедуры

procedure RegisterActnBarStyle (AStyle: TActionBarStyleEx);

После этого ваш стиль становится доступным для свойства style компонента TActionManager.

Чтобы отменить стиль, используйте процедуру

procedure UnRegisterActnBarStyle (AStyle: TActionBarStyleEx);

Например, обе эти операции удобно выполнить при инициализации и деинициализации модуля, описывающего класс стиля:

Вариант регистрации и отмены собственного визуального стиля

var MyStyle: TMyStyleActionBars;
...
initialization
MyStyle:=TMyStyleActionBars.Create;
RegisterActnBarStyle (MyStyle);

finitialization
UnregisterActnBarStyle(MyStyle);
MyStyle.Free;
end.

Для смены стиля приложения можно использовать глобальную переменную нового стиля. Ее достаточно присвоить свойству Style:

ActionManager1.Style:=MyStyle;

При смене стиля все элементы управления, расположенные на панелях компонента ActionManager1, будут уничтожены и созданы заново с использованием настроек нового стиля.

Класс TActionBarStyleEx имеет всего несколько методов, которые необходимо перекрыть при создании собственного стиля. Все они возвращают классы объектов, используемых при создании пользовательского интерфейса.

Рассмотрим их.

Функция

function GetStyleName: string;

возвращает имя стиля.

Функция

function GetColorMapClass (ActionBar: TCustomActionBar):
TCustomColorMapClass;

позволяет получить ссылку на класс компонента настройки цветовой палитры, используемый панелью инструментов.

Следующие три метода дают информацию о классах различных типов элементов управления, используемых при проектировании пользовательского интерфейса с помощью компонента TActionManager.

Для того чтобы получить доступ к элементам управления, связанным со стилем, предназначен метод

function GetControlClass (ActionBar: TCustomActionBar; AnItem:
TActionClientItem): TCustomActionControlClass;

Он возвращает класс элемента управления из панели ActionBar, связанного с элементом управления AnItem. Именно эта функция вызывается при создании элементов управления в панелях инструментов компонента TActionManager.

Как уже говорилось выше, при присвоении свойству Style компонента TActionManager нового значения (экземпляра класса разработанного вами визуального стиля) уничтожаются все существующие элементы управления и затем создаются новые. И в процессе создания каждого визуального компонента вызывается функция GetControlClass нового стиля, а возвращенное ею значение для вызова конструктора соответствующего класса.

Аналогично, для получения класса, используемого в панели меню, применяется метод

function GetPopupClass (ActionBar: TCustomActionBar): TGetPopupClass;

и для классов кнопок панели инструментов применяется функция

function GetScrollBtnClass: TCustomScrollBtnClass;

А класс самой панели инструментов возвращает функция

function GetAddRemoveItemClass (ActionBar: TcustomActionBar):
TCustomAddRemoveItemClass;

Итак, после разработки и отладки собственных классов элементов управления с заданными свойствами вам потребуется создать потомка от класса TActionBarStyleEx  и перекрыть все перечисленные выше функции так, чтобы они возвращали нужные классы для используемых типов элементов управления.

Theme API

Помимо описанного создания и управления визуальными стилями разработчик может использовать функции Theme API, разработанные Microsoft для этих целей.

Для того чтобы использовать Theme API, можно стандартным способом подключить к проекту динамическую библиотеку Theme.dll:

var ThemeDLL: HINST;
...
begin
 ThemeDLL:=LoadLibrary('theme.dll')'
 if ThemeDLL<>0 then
 begin
 ...
 end;
end.

Затем можно использовать возможности этого программного интерфейса напрямую. С деталями его реализации вы можете ознокомиться в документации Microsoft MSDN.

Однако можно поступить проще. В составе Delphi 7 имеется модуль UxTheme.pas, в который как раз и реализованы возможности Theme API. Кроме этого, модуль Theme.pas содержит классы для основных элементов управления, которые могут использоваться при создании визуальных стилей, а так же класс менеджера тем TThemeServices.

Пример, показывающий как загрузить динамическую библиотеку theme.dll и получить ссылку на тему визуального стиля для текущего окна и кнопочного элемента управления.

Пример использования функций Theme API в Delphi

var DC: HDC;
 CurrentThemeData: HTHEME;

begin
 if UseThemes and InitThemeLibrary then
 try
 DC:=GetWindowsDC(HANDLE);
 try
 CurrentThemeData:=OpenThemeData(0,'button');

 CloseThemeData(CurrentThemeData);
 finally
 ReleaseDC(HANDLE, DC);
 end
 finally
 FreeThemeLibrary;
 end
 else
 ShowMessage('Приложение или операционная система не поддрерживают использование Theme API');
end;

Функция

function UseThemes:Boolean;

повторяет способность ОС и приложения использовать Theme API

Методы

function InitThemeLibrary:Boolean;
procedure FreeThemeLibrary;

соответственно инициализируют и выгружают библиотеку theme.dll.

Графический контекст DC наверняка понадобится при отрисовки элементов управления

Функция

OpenThemeData: function(hwnd: HWND; pszClassList: LPCWSTR): HTHEME;
stdcall;

Возвращает дескриптор темы для текущего визуального стиля и класса, имя которого представлено параметром pszClassList.

После того как тема загружена. можно использовать разнообразные графические функции, входящие в состав программного интерфейса.

При завершении работы не забудьте освободить занятые дескрипторы графического контекста и темы. Ждя темы используйте функции

CloseThemeData: function(hThemeL HTHEME): HRESULT; stdcall;

Заинтересованный читатель найдет подробное описание нужных функций Theme API в Microsoft MSDN или же может полюбопытствовать содержимым модулей UxTheme.pas и Theme.pas.

Ну вот, пожалуй, и все. Старался объяснить, чтобы было понятно всем.

Автор статьи: Фефилов Дмитрий

Получить ссылку на материал

Категория: Пользовательский интерфейс | Добавил: Барон (08.12.2011)
Просмотров: 2028 | Теги: Windows, delphi | Рейтинг: 1.0/1
[ Пожертвования для сайта ] [ Пожаловаться на материал ]

Если вам помог материал сайта кликните по оплаченной рекламе размещенной в центре

Поиск
Категории раздела
Delphi.NET [3]
Kylix Delphi for Linux [9]
Советы Дельферу [6]
Хитрости в Delphi [2]
Обзор Delphi [45]
Инсталлятор [11]
Пользовательский интерфейс [18]
Примеры Delphi [93]
Функции и процедуры [15]
Разные [31]
Королевство Delphi © 2010-2024
Яндекс цитирования