Windows Vista Bridge Sample Library – управляемые API для Windows 7

У многих читателей возникает вопрос, почему мы так часто говорим о Windows Vista в блоге Windows 7 для разработчиков? Все очень просто: мы говорим о Windows Vista, так как Windows 7 построена на базе Windows Vista и обладает обратной совместимостью с программной моделью Windows Vista. Это, несомненно, является огромным преимуществом для разработчиков.

Ни для кого не секрет, что операционная система Windows написана на С и С++, и, как следствие, использует наследственную программную модель, известную как WinAPI или Win32 API. Windows API представляет собой либо чистый C API или COM-based API. Это делает использование API очень простым и удобным для тех, кто программирует на C или C++. Но что мы можем предложить разработчикам управляемого кода? Есть ли какие-либо API управляемого кода в Windows Vista или Windows 7?

.NET Framework предлагает простую и понятную программную модель, ориентированную на Windows-клиентов (веб, серверы, мобильные устройства). А в сочетании с набором инструментов и библиотек .NET Framework является эффективной и продуктивной средой для создания клиентских Windows-приложений. Одно из преимуществ .NET Framework состоит в том, что эта среда основана на библиотеках, поэтому кто угодно может добавлять библиотеки для расширения функциональности. В состав .NET Framework по умолчанию входит масса библиотек, которые расширяют собственные Windows API, делая разработку приложений для Windows независимо от ее версии – XP, Vista или 7 – намного более простым занятием, чем при использовании Windows API.

Хорошим примером является компонент (так называют библиотеки в .NET) .NET WinForms, содержащий набор интерфейсных классов, которые используют традиционный Win32 API для создания и обработки окон в Windows. Абстрагируя встроенный API, .NET WinForms гарантирует, что нам не нужно напрямую работать с указателями (HWND), дескрипторами (HINSTANCE) или другими собственными конструкциями Windows API. В противном случае код выглядел бы следующим образом:

clip_image002

Да, WinForms основан на HWND. Разработчики на .NET могут легко получить доступ к HWND, используя свойство класса System.Windows.Interop в компоненте WindowsBase (WindowsBase.dll).

Но несмотря на всесторонние связи .NET Framework, данная среда исполнения не предлагает управляемые API для всех собственных Windows API. Поэтому у разработчиков управляемого кода нет никаких управляемых API для работы с UAC API, Restart Manager API или новым Windows Vista Search API. Это всего лишь несколько примеров собственных Windows API, для работы с которыми в .NET Framework нет интерфейсов, но которые играют ключевую роль при развертывании некоторых приложений в Windows.

Windows Vista Bridge Sample Library (VBSL) является развитием одной из идей команды Microsoft SDK по созданию своеобразного моста между .NET Framework и Windows API. VBSL является библиотекой классов, которая облегчает разработчикам управляемого кода доступ к наиболее важным функциям Windows Vista без необходимости заботиться об уровне взаимодействия. Vista Bridge 1.3 предлагает набор классов, библиотек и примеров, написанных на .NET, которые позволяют разработчику использовать такие функции Vista, как UAC, Power Management, Restart & Recovery, Restart Manager, Network, Aero Glass и многие другие. Необходимо отметить, что управляемые библиотеки Vista Bridge 1.3 отлично работают и с Windows 7 API и будут работать в будущих релизах по мере того, как команда SDK будет продолжать поддержку данного проекта.

Vista Bridge Sample Library входит в состав Windows SDK, но мы считаем, что этот проект достаточно важен для того, чтобы быть размещенным в MSDN Code Gallery. В будущих статьях мы подробней расскажем о некоторых новых функциях, упомянутых выше, чтобы продемонстрировать, каким образом сегодня можно использовать преимущества Windows Vista, чтобы в дальнейшем облегчить переход на Windows 7.

Одной из областей, в которых VBSL может облегчить труд разработчиков – это диалоговые окна. Windows Vista предлагает множество диалоговых окон для разных целей. Например, если вы используете Windows Vista, то, вероятно, знакомы со следующим форматом пользовательского интерфейса:

clip_image004

или таким:

clip_image006

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

Вот пример типичного набора командных ссылок:

clip_image008

Командные ссылки похожи на переключатели (radio buttons) в том смысле, что они используются для выбора из набора взаимно исключающих, но связанных между собой вариантов ответа. Как и переключатели, командные ссылки всегда представлены в наборе и никогда по одной. У командных ссылок упрощенный внешний вид, как и обычных гиперссылок – без рамки и других явных атрибутов нажатия. Командные ссылки также похожи на командные кнопки (command buttons) тем, что они также могут иметь «ссылку по умолчанию» и для них тоже может быть назначена «быстрая комбинация клавиш». Подобно кнопкам с фиксацией положения ( commit buttons) командные ссылки при нажатии или закрывают диалоговые окна или переводят на следующую страницу пошагового мастера.

Используя Windows Vista Bridge Sample Library, вы можете создать симпатичные диалоги Task Dialog, которые будут выглядеть следующим образом:

clip_image010

Диалог Task Dialog является объектом Vista Bridge Sample Library, Microsoft.SDK.Samples.VistaBridge.Library.TaskDialog и не имеет свойств времени. Именно поэтому вы должны настроить диалоговое окно. Но это просто и мы покажем это на следующем примере.

Во-первых, создайте Task Dialog:

 

 TaskDialog td = new TaskDialog();

После чего начните настраивать его атрибуты – заголовок, инструкции, основную область и основную иконку:

 //main content section
  
 td.Caption = "Fancy \"Vista\" Task Dialog on Win 7";
  
 td.Instruction = "Your instructions go here";
  
 td.Content = "Download Windows Vista Bridge Library";
  
 td.MainIcon = TaskDialogStandardIcon.Information;
  

Теперь добавьте (необязательный) нижний колонтитул и иконку:

 

 td.FooterText = "Footer text goes here";
  
 td.FooterIcon = TaskDialogStandardIcon.Shield;
  

Но самое интересное начнется, когда вы начнете разбираться с TaskDialog.Controls – коллекцией элементов управления TaskDialog:

 

 DialogControlCollection<TaskDialogControl> 

к которому можно добавить объекты TaskDialogControl:

 

 td.Controls.Add(new TaskDialogCommandLink("new tdcl", "main text here", "instruction"));

В дополнение к добавлению командных ссылок, Task Dialog также может выводить набор событий, которые позволят манипулировать и взаимодействовать с пользователем во время его работы с диалоговым окном. Объекты Task Dialog используют событие Tick для работы с индикатором выполнения задачи, Open и Closing, а также HelpInvoked и HyperLinkClick для управления пользовательскими запросами о помощи и информации.

 

 //events that you can catch
  
 td.Tick += new EventHandler<TaskDialogTickEventArgs>(OnMyTick);
  
 td.Opened += new EventHandler(OnOpenInvoked);
  
 td.HelpInvoked += new EventHandler(OnHelpInvoked);
  

Также вы можете добавить компоненты Progress Bar, CheckBox и Radio Button. По сути, Windows Vista Task Dialogs API является мини-версией среды исполнения Dialog, которая позволяет вам сохранить много времени при работе с мастерами и диалоговыми окнами.

Код всего примера:

 

 1: td = new TaskDialog();
  
 2:
  
 3: //
  
 4: td.StartupLocation = TaskDialogStartupLocation.CenterOwner;
  
 5: td.Cancelable = true;
  
 6:
  
 7: //main content section
  
 8: td.Caption = "Fancy \"Vista\" Task Dialog on Win 7";
  
 9: td.Instruction = "Your instructions go here";
  
 10: td.Content = "Download Windows Vista Bridge Library Sample";
  
 11: td.MainIcon = TaskDialogStandardIcon.Information;
  
 12:
  
 13: //setting footer content
  
 14: td.FooterText = "Footer text goes here";
  
 15: td.FooterIcon = TaskDialogStandardIcon.Shield;
  
 16:
  
 17: //Command Links
  
 18: td.Controls.Add(new TaskDialogCommandLink("new tdcl", "Main text here", "Instruction"));
  
 19: td.Controls.Add(new TaskDialogCommandLink
  
 ("Another new tdcl", " Another main text here", "More instruction"));
  
 20:
  
 21: //Expanding
  
 22: td.ExpansionMode = TaskDialogExpandedInformationLocation.ExpandContent;
  
 23: td.ExpandedControlText = "Expanded Control Text";
  
 24: td.ExpandedText = "This is some expanded text, only visible when expanded";
  
 25: td.CollapsedControlText = "Collapsed Control Text";
  
 26: td.HyperlinksEnabled = true;
  
 27:
  
 28: //Prograss Bar
  
 29: TaskDialogProgressBar tdpb = new TaskDialogProgressBar();
  
 30: tdpb.Name = "myPrograssBar1";
  
 31: tdpb.Minimum = 0;
  
 32: tdpb.Maximum = 100;
  
 33: td.ProgressBar = tdpb; //adding to main Task Dialog
  
 34:
  
 35: // Check Box
  
 36: td.CheckBoxChecked = true;
  
 37: td.CheckBoxText = "This is a checkbox, we can register to listen for its events";
  
 38:
  
 39: //events that you can catch
  
 40: td.Tick += new EventHandler<TaskDialogTickEventArgs>(OnMyTick);
  
 41: td.Opened += new EventHandler(OnOpenInvoked);
  
 42: td.HelpInvoked += new EventHandler(OnHelpInvoked);
  
 43: td.Closing += new EventHandler<TaskDialogClosingEventArgs>(OnDialogClosing);
  
 44: td.HyperlinkClick += new EventHandler<TaskDialogHyperlinkClickedEventArgs>(td_HyperlinkClick);
  
 45:
  
 46: td.Show();