Использование визуальных стилей 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 = 50
End Sub

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

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

При написании статьи использовались материалы с MSDN

15 июня 2004

Реклама