by Bob Johnson.

Думаю, что практически все из Вас, у кого уже установлен Windows XP, заметили, что в нем изменился стиль практически всех стандартных компонентов (кнопки, поля ввода, полосы прокрутки и т.д.), но тем не менее, старые программы, написанные раньше выхода этой операционной системы продолжают сохранять прежний вид. Да и если написать какую-либо свою программу на любом языке программирования (кроме Visual Studio .Net), то все компоненты будут иметь обычный стиль, идентичный предыдущим версиям операционной системы.

Причина здесь кроется в том, что теперь за эти компоненты отвечают библиотеки Common Controls (а не User32, как раньше) и чтобы Windows XP знала, что программа готова к использованию этих компонентов, она должна сообщить операционной системе об этом определенным образом.

Итак, что же нужно сделать для того, чтобы Ваша программа могла использовать новые компоненты Windows XP? Во-первых, необходимо инициализировать библиотеки Common Controls - для этого в начало программы вставляется вызов функции InitCommonControls () или InitCommonControlsEx (…) (для этого нужно подключить к проекту файл commctrl.h и библиотеку comctl32.lib). И во-вторых, необходимо сообщить ОС, что программа должна использовать новые компоненты. А вот для этого необходимо будет написать так называемый манифест (т.е. список требований), который представляет собой xml файл определенного вида. Пример такого файла приведен ниже:


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

Вы можете просто скопировать приведенный выше пример в файл, заменив только “Program Description” на описание Вашей программы и “Program Name” на название Вашей программы (хотя, в принципе, это не обязательно). И не исползуйте в файле манифеста русских букв, иначе программа не будет запускаться!

Далее, существуют два способа, как указать ОС, что данный файл манифеста должен быть отнесен именно к данной программе. Первый способ предельно прост. Вы копируете файл манифеста в тот же каталог, где расположена Ваша программа и переименовываете его так, чтобы его имя представляло собой следующее: “имя exe-файла программы.manifest”. Т.е. если Ваша программа называется “FooBar.exe”, то манифест необходимо будет переименовать в “FooBar.exe.manifest”. Больше никаких изменений в программе не потребуется! Вы можете создавать все компоненты обычным образом (CreateWindow(Ex)), но они все будут выглядеть в соответствии с новым стилем Windows XP. Если же Вы запустите эту программу на более ранней версии Windows, то она просто не обратит внимание на файл манифеста и будет работать как раньше.

У приведенного способа есть очевидный недостаток - добавление лишнего файла к Вашей программе. Если кто-либо в процессе эксплуатации программы удалит этот файл (или даже просто переименует запускаемый файл программы, но не переименует файл манифеста), то программа снова начнет использовать старый стиль компонентов. Более того, ведь ни в одной программе, которая использует новый стиль OC Windows XP, нет никаких файлов манифестов! Значит это можно сделать и другим способом…

В связи с этим существует еще один способ, как связать файл манифеста с программой. Его необходимо поместить в ресурсы вашей программы. Для этого необходимо на начальном этапе сохранить манифест в какой-либо файл. Пусть он будет называться “manifest.xml”. Теперь в скрипт ресурсов Вашей программы (это файл с расширением RC) необходимо добавить следующую строчку:

1 24 DISCARDABLE "manifest.xml"

Где 1 - это идентификатор ресурса (манифест обязательно должен быть под идентификатором 1) и 24 - это тип ресурса, а заканчивается строка именем файла, в котором находится информация, помещаемая в ресурсы - в данном случае это файл “manifest.xml”.

В данный момент времени в файле winuser.h от VC 6 не описан тип ресурса 24 - там описание заканчивается типом 23, который называется RT_HTML, но если посмотреть в других местах, то можно найти, что 24 - это RT_MANIFEST, а 1 (идентификатор ресурса) определен как CREATEPROCESS_MANIFEST_RESOURCE_ID. Поэтому, если Вы пишите на VC++, то можете добавить в файл winuser.h после строки

#define RT_HTML MAKEINTRESOURCE(23)

следующий текст:

#define RT_MANIFEST MAKEINTRESOURCE(24)
#define CREATEPROCESS_MANIFEST_RESOURCE_ID MAKEINTRESOURCE(1)
#define ISOLATIONAWARE_MANIFEST_RESOURCE_ID MAKEINTRESOURCE(2)
#define ISOLATIONAWARE_NOSTATICIMPORT_MANIFEST_RESOURCE_ID MAKEINTRESOURCE(3)
#define MINIMUM_RESERVED_MANIFEST_RESOURCE_ID MAKEINTRESOURCE(1 /*inclusive*/)
#define MAXIMUM_RESERVED_MANIFEST_RESOURCE_ID MAKEINTRESOURCE(16 /*inclusive*/)

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

1 24 DISCARDABLE "manifest.xml"

Это будет работать в VC 6, Borland C++ Builder, Delphi и программах, написанных на ассемблере (а может быть и еще где-либо).

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

Итак, еще раз повторю, что надо для того, чтобы Ваша программа стала выглядеть в соответствии с новым стилем ОС Windows XP:

1. Необходимо, чтобы в программе инициализировались компоненты Common Controls. Для этого необходимо вызвать функцию InitCommonControls () или InitCommonControlsEx (…). Следует иметь в виду, что Delphi или C++ Builder делают это автоматически.

2. Необходимо создать и связать с Вашим проектом файл манифеста - либо переименовать его в соответствии с именем Вашей программы, либо поместить его в ресурсы программы. В последнем случае может потребоваться создание и подключение к проекту файла скрипта ресурсов - “.rc”, который создается в любом текстовом редакторе.