После выпуска Windows XP пользователи увидели новый графический интерфейс. Элементы управления с закругленными углами, подсвечивание при прохождении мыши над объектом, необычная для глаз полоска индикатора. Многим такая разноцветная палитра пришлась по душе. Возник вопрос - Как использовать всю эту красоту в своих приложениях?
В этой статье я попытаюсь дать ответ на данный вопрос. Имейте в виду, что данное описание относится только к Windows XP.
Сначала давайте сравним для наглядности два рисунка
Слева вы видите новый вид контролов для Windows XP, справа - элементы, используемые в Visual Basic.
Небольшое замечание. Как вы знаете, форма состоит из клиентской области и неклиентской области. В неклиентскую входит заголовок формы, границы формы и полосы прокрутки формы. Так вот эти элементы будут иметь стиль Windows XP без всякого кода с вашей стороны. А мы будем работать с элементами в клиентской области.
Новый вид контролов связан с файлом Comctl32.dll версии 6.0. Вот список элементов управления, связанных с этим файлом:
Кнопочные элементы (Button, RadioButton, GroupBox и CheckBox) кроме связи с файлом Comctl32.dll, должны иметь также стиль System в свойстве FlatStyle.
Переходим к главному. Если вы хотите использовать визуальные стили в ваших приложениях, то должны добавить так называемый манифест, то есть файл, показывающий системе, что приложение должно при возможности использовать файл Comctl32.dll 6 версии.
Windows XP содержит две версии этого файла - пятую и шестую. По умолчанию, система использует стандартную пятую версию. Таким образом, чтобы использовать новые стили, мы должны сообщить об этом системе.
А, как? Для этого и существует манифест. По своей сути, манифест - это XML-файл, который внедряется в приложение как ресурс, или располагается отдельным файлом в одной папке с приложением.
Перейдем к практике. Создаем новый проект. Размещаем на форме элементы управления - Button, RadioButton, ProgressBar, CheckBox и Label. Присвоим у всех элементов свойству FlatStyle значение System.
Добавим код для кнопки Button
Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click ProgressBar1.Value = 50End Sub
Сохраните работу. Теперь приступим к написанию манифеста. Для создания и редактирования манифеста используем следующее:
<?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.YourApp" 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>
Переместите созданный манифест (Executable Name.exe.manifest) в одну папку с исполняемым файлом. Это может быть папка Debug или Release в папке obj в зависимости от ваших настроек.
Запустив теперь исполняемый файл, вы увидите ваши контролы с работающими визуальными стилями.
Можно добавить манифест в исполняемый файл как ресурс.
В меню File откройте пункт Open и выберите File. В появившемся дереве найдите ваш проект. Откройте папку obj и затем папку Debug или Release Затем необходимо щелкнуть правой кнопкой мыши на папке с именем приложения (самая верхняя), затем Add Resource. В диалоговом окне выбираем кнопку Import (в строке Files of type нужно выбрать All files) и откройте созданный файл манифеста двойным щелчком. В качестве Resource type введите RT_MANIFEST и измените ID у вновь добавленного ресурса на 1. Сохраните сделанные изменения в .exe файле.
Несколько примеров помогут вам глубже понять применения манифеста. Пройдемся по всем кнопкам и присвоим им свойство FlatStyle.
Private Sub RecursivelyFormatForWinXP(control As Control) Dim x As Integer For x = 0 To control.Controls.Count - 1 ' If the control derives from ButtonBase, ' set its FlatStyle property to FlatStyle.System. If control.Controls(x).GetType().BaseType Is _GetType(ButtonBase) Then CType(control.Controls(x), ButtonBase).FlatStyle = _ FlatStyle.System End If ' If the control holds other controls, iterate through them also. If control.Controls.Count > 0 Then RecursivelyFormatForWinXP(control.Controls(x)) End If Next xEnd Sub
После этого необходимо изменить код для обработчика события Load формы, чтобы проверить версию Windows XP и присутствие манифеста.
Private Sub Form1_Load(sender As Object, e As System.EventArgs) ' Makes sure Windows XP is running and ' a .manifest file exists for the EXE. If Environment.OSVersion.Version.Major > 4 And _Environment.OSVersion.Version.Minor > 0 And _System.IO.File.Exists((Application.ExecutablePath + ".manifest")) Then ' Iterate through the controls. Dim x As Integer For x = 0 To (Me.Controls.Count) - 1 ' If the control derives from ButtonBase, ' set its FlatStyle property to FlatStyle.System. If Me.Controls(x).GetType().BaseType Is _GetType(ButtonBase) Then CType(Me.Controls(x), ButtonBase).FlatStyle = _FlatStyle.System End If RecursivelyFormatForWinXP(Me.Controls(x)) Next x End IfEnd Sub
При написании статьи использовались материалы с MSDN.
15 июня 2004