Windows XP манифест в Delphi

 

Delphi.Diagnostinc.Ru

Данная статья рассказывает о том как сделать чтобы ваши проекты выглядели как Windows XP программы.

Зачем?

В Windows XP есть менеджер тем (theme manager) который изменяет вид большинства стандартных объектов Windows. Misrosoft утверждает что старые версии библиотеки comctl32.dll содержат код для поддержки различных платформ семейства Windows. Microsoft разумно решила почистить содержимое comctl32.dll для улучшения работы тем в Windows XP. Теперь получается что существует две версии библиотеки: старая (версия 5.8) которая имеет обратную совместимость всех предыдущих версий Windows (в том числе и XP) и новую версию (версия 6) которая совместима только с XP (ну и следующими версиями Windows).

По умолчанию все программы разработанные под Windows XO используют версию 5.8, получая тот же вид что и предыдущие приложения Windows. Для того чтобы использовать компоненты из библиотеки 6 версии в вашем приложении вы должны подключить к вашему приложению Manifest который Windows будет читать для того чтобы отрисовка компонентов производилось через новую библиотеку.

 
Пример использования:

 

Code:

// bitmap

SetWindowLong(hwndButton,GWL_STYLE,GetWindowLong(hwndButton,GWL_STYLE) or BS_BITMAP);         

Button_SetImageEx(hwndButton,LoadBitmap(hInstance,'IDB_BITMAP1'),IMAGE_BITMAP);

 

// иконка

SetWindowLong(hwndButton,GWL_STYLE,GetWindowLong(hwndButton,GWL_STYLE) or BS_ICON);

Button_SetImageEx(hwndButton,LoadIcon(hInstance,'IDI_ICON1'),IMAGE_ICON);

 

 
Автор: Krid

 

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

 

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

  

Code:

uses

Themes;

...

if ThemeServices.ThemesEnabled then // Тема использется

 

TActionManager является своего рода "командным пунктом", из которого должны управляться элементы управления приложения. Нас интересует только одно свойство этого компонента

Code:

property Style: TActionBarStyle;

 

 

 

Темы должны быть включены и манифест лежать на форме:
 

Code:

unit Unit1;

{©Drkb v.3(2007): www.drkb.ru}

 

interface

 

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, ExtCtrls, StdCtrls, ComCtrls, XPMan;

 

 

type

TForm1 = class(TForm)

   Button1: TButton;

   Button2: TButton;

   Button3: TButton;

   Button4: TButton;

   Button5: TButton;

   XPManifest1: TXPManifest;

   procedure FormCreate(Sender: TObject);

private

   procedure Unload2Themes(var M:TMSG); message WM_USER+1;

public

   { Public declarations }

end;

 

var

Form1: TForm1;

 

implementation

 

{$R *.dfm}

 

function SetWindowTheme(hwnd: HWND; pszSubAppName: LPCWSTR;

                       pszSubIdList: LPCWSTR): HRESULT; stdcallexternal 'uxtheme.dll';

 

 

procedure TForm1.Unload2Themes(var M: TMSG);

begin

SetWindowTheme(Button4.Handle, ' ', ' ');

SetWindowTheme(Button5.Handle, ' ', ' ');

SetWindowTheme(Form1.Handle, ' ', ' ');

end;

 

procedure TForm1.FormCreate(Sender: TObject);

begin

PostMessage(Handle,WM_USER+1,0,0)

end;

 

end.

 

 

Автор: Krid

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

 

Начиная с операционной системы Widows 95 пользователям был доступен пакет обновления Microsoft Plus!, который позволял использовать темы оформления рабочего стола Windows. Темой называется совокупность настроек цветов, шрифтов, курсоров и прочих ресурсов, необходимых для создания унифицированного пользовательского интерфейса.

 

Все параметры одной темы сохраняются в файле с расширением theme в виде секций и значений, подобно файлам INI. Существующие темы доступны для выбора в системном диалоге Display Options.

 

Визуальные стили, интегрированные в Windows ХР, управляют внешним видом и поведением элементов управления. При этом визуальный стиль использует настройки параметров пользовательского интерфейса, заданные текущей темой. Для управления темами визуального стиля операционная система использует менеджер тем.

 

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

 

Совместно с Windows XP поставляется только один визуальный стиль, и он составляет приятное и свежее впечатление о пользовательском интерфейсе операционной системы.

 

 

   
 

 

 

Code:

uses ComObj, SyncObjs;

 

var

GetCurrentThemeName: function (pszThemeFileName: LPWSTR; cchMaxNameChars: Integer;

   pszColorBuff: LPWSTR; cchMaxColorChars: Integer; pszSizeBuff: LPWSTR;

   cchMaxSizeChars: Integer): HRESULT; stdcall;

 

procedure TForm1.Button1Click(Sender: TObject);

var

FileName, ColorScheme, SizeName: WideString;

hThemeLib: THandle;

begin

try

   hThemeLib := LoadLibrary('uxtheme.dll');

   if hThemeLib > 0 then

     GetCurrentThemeName := GetProcAddress(hThemeLib, 'GetCurrentThemeName');

   if Assigned(GetCurrentThemeName) then

   begin

     SetLength(FileName, 255);

     SetLength(ColorScheme, 255);

     SetLength(SizeName, 255);

     OleCheck(GetCurrentThemeName(PWideChar(FileName), 255,

       PWideChar(ColorScheme), 255, PWideChar(SizeName), 255));

     // show the the theme path and file name.

     ShowMessage(PWideChar(FileName));

     // show the color scheme name

     ShowMessage(PWideChar(ColorScheme));

     // show the size name

     ShowMessage(PWideChar(SizeName));

   end;

finally

   FreeLibrary(hThemeLib);

end;

end;

 

 

 

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

 

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

 

1 24 "ХР.manifest"

 

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

 

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

 

И последняя операция добавьте в исходный код файла проекта директиву подключения ресурса манифеста:

Code:

{$R xpmanifest.res}

 

 

 

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

 

 

 

 

 

Code:

const

WM_THEMECHANGED = $031A;

 

type

TForm1 = class(TForm)

   {...}

private

public

   procedure WMTHEMECHANGED(var Msg: TMessage); message WM_THEMECHANGED;

end;

 

{...}

 

implementation

 

{...}

 

procedure TForm1.WMTHEMECHANGED(var Msg: TMessage);

begin

Label1.Caption := 'Theme changed';

Msg.Result := 0;

end;

 

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