Использование визуальных стилей Windows XP в Visual Basic.NET 2003

После выпуска 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

Сохраните работу. Теперь приступим к написанию манифеста. Для создания и редактирования манифеста используем следующее:

  1. В Solution Explorer щелкаем правой кнопкой мыши на имени проекта-выбираем пункт Add-New Item
  2. В появившемся диалоговом окне выбираем на левой панели (Categories) пункт Local Project.
  3. На правой панели (Templates) выбираем Text File. В текстовом поле пишем название файла следующим образом: <Executable Name>.exe.manifest. Таким образом, если ваше приложение имеет имя WindowsApplication1, ваш XML-файл будет иметь вид WindowsApplication1.exe.manifest.
  4. Щелкните на кнопке Open для создания XML-файла и закрытия диалогового окна. Пустой текстовый файл добавится в текстовый редактор.
  5. Вставьте в этот текстовый файл строчки следующего содержания:
  6. <?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>
  7. Замените name и description соответствующими описаниями вашего приложения.
  8. В меню Build выбираем Build, в меню File-Save All.

Подключаем манифест к приложению

Переместите созданный манифест (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

Реклама