Создание приложения ленты

Платформа ленты Windows состоит из двух разных, но зависимых платформ разработки: языка разметки на основе XAML для объявления элементов управления и их визуального макета, а также набора интерфейсов на основе com-модели C++ для определения функций команд и перехватчиков приложений. Это разделение работы в архитектуре платформы ленты требует, чтобы разработчик, желающий воспользоваться широкими возможностями пользовательского интерфейса, предоставляемыми платформой, должен разработать и описать пользовательский интерфейс в разметке, а затем использовать COM-интерфейсы платформы ленты для подключения платформы к ведущему приложению.

Дорожная карта ленты

Визуальные аспекты приложения ленты, такие как отображаемые элементы управления и место их размещения, объявляются в разметке (см. статью Объявление команд и элементов управления с помощью разметки ленты). Логика команд приложения, например то, что происходит при нажатии кнопки, реализована в коде.

Процесс реализации ленты и ее включения в приложение Windows требует четырех основных задач: написание разметки, компиляция разметки, написание кода, а также компиляция и связывание всего приложения.

На следующей схеме показан рабочий процесс для типичной реализации ленты.

схема, показывающая рабочий процесс для типичной реализации ленты.

В следующих разделах этот процесс описывается более подробно.

Написание разметки

После разработки пользовательского интерфейса ленты первой задачей для разработчика приложения является описание пользовательского интерфейса с помощью разметки ленты.

Важно!

Файл схемы разметки платформы ленты UICC.xsd устанавливается вместе с пакетом средств разработки программного обеспечения (SDK) Microsoft Windows для Windows 7 и платформа .NET Framework 4.0. Используя стандартный путь установки, файл находится в папке %ProgramFiles%\Microsoft SDK\Windows\[номер версии]\Bin, где многие редакторы XML могут ссылаться на него для указания и автозавершения.

 

Элементы управления ленты, команды ленты (элементы, независимые от элемента управления, предоставляющие базовые функциональные возможности для элементов управления лентой), а также все макеты элементов управления и визуальные связи объявляются в разметке. Структура разметки ленты подчеркивает различие между элементами управления ленты и командами с помощью двух иерархий основных узлов: дерева "Команды и ресурсы " и " Представления ".

Все контейнеры и действия, предоставляемые лентой, объявляются в дереве Команды и ресурсы . Каждый элемент Command связан с набором ресурсов в соответствии с требованиями пользовательского интерфейса.

После создания команд для приложения вы объявляете элементы управления в дереве Представления и привязываете каждый элемент управления к команде, чтобы предоставить функциональные возможности команды. Платформа ленты определяет фактическое расположение элементов управления на основе объявленной здесь иерархии элементов управления.

В следующем примере кода показано, как объявить элемент управления Button с меткой Exit application и связать его с командой exit.

<Application xmlns="http://schemas.microsoft.com/windows/2009/Ribbon">
  <Application.Commands>
    <Command Name="cmdExit" LabelTitle="Exit application" />
  </Application.Commands>

  <Application.Views>
    <Ribbon>
      <Ribbon.Tabs>
        <Tab>
          <Group>
            <Button CommandName="cmdExit" />
          </Group>
        </Tab>
      </Ribbon.Tabs>
    </Ribbon>
  </Application.Views>
</Application>
        

Совет

Хотя для файла разметки ленты можно использовать любое расширение имени файла, .xml является рекомендуемым расширением, которое используется во всей документации.

 

Компиляция разметки

После создания файла разметки ленты он должен быть скомпилирован в двоичный формат компилятором разметки ленты, компилятором команд пользовательского интерфейса (UICC), который входит в состав пакета средств разработки программного обеспечения (SDK) для Windows. Ссылка на этот двоичный файл передается в метод IUIFramework::LoadUI во время инициализации платформы ленты ведущим приложением.

UICC можно выполнить непосредственно из окна командной строки или добавить в Visual Studio как "Пользовательский шаг сборки".

На следующем рисунке показан компилятор разметки UICC в окне оболочки CMD пакета SDK для Windows 7.

снимок экрана: uicc.exe в окне командной строки.

На следующем рисунке показан uiCC, добавленный в качестве пользовательского шага сборки в Visual Studio.

Снимок экрана: uicc.exe добавлен в качестве настраиваемого шага сборки в Visual Studio.

UICC создает три файла: двоичную версию разметки (BML-файл), заголовок определения идентификатора (H-файл) для предоставления элементов разметки ведущему приложению ленты и скрипт определения ресурсов (RC-файл ) для связывания изображений и строковых ресурсов ленты с ведущим приложением во время компиляции.

Дополнительные сведения о компиляции разметки платформы ленты см. в разделе Компиляция разметки ленты.

Построение приложения

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

Важно!

Так как платформа ленты основана на COM, рекомендуется, чтобы проекты ленты использовали оператор __uuidof() для ссылки на guid для интерфейсов платформы ленты (IID). В тех случаях, когда невозможно использовать оператор __uuidof(), например когда используется сторонний компилятор или ведущее приложение на основе C, идентификаторы IID должны быть определены приложением, так как они не содержатся в uuid.lib.

Если идентификаторы IID определены приложением, необходимо использовать идентификаторы GUID, указанные в uiRibbon.idl.

UIRibbon.idl поставляется в составе пакета средств разработки программного обеспечения Windows (SDK) и находится по стандартному пути установки %ProgramFiles%\Microsoft SDK\Windows\v7.0\Include.

 

Инициализация ленты

На следующей схеме показаны шаги, необходимые для реализации простого приложения ленты.

схема, показывающая шаги, необходимые для реализации простой реализации ленты.

Ниже подробно описано, как реализовать простое приложение ленты.

  1. CoCreateInstance

    Приложение вызывает стандартную функцию COM CoCreateInstance с идентификатором класса платформы ribbon для получения указателя на платформу.

    IUIFramework* pFramework = NULL;
    HRESULT hr = ::CoCreateInstance(
                CLSID_UIRibbonFramework, 
                NULL,
                CLSCTX_INPROC_SERVER, 
                IID_PPV_ARGS(&pFramework));
    if (FAILED(hr))
    {
      return hr;
    }
    
  2. Initialize(hwnd, IUIApplication*)

    Приложение вызывает IUIFramework::Initialize, передавая два параметра: дескриптор в окно верхнего уровня, которое будет содержать ленту, и указатель на реализацию IUIApplication , которая позволяет платформе выполнять обратные вызовы к приложению.

    Важно!
    Платформа ленты инициализируется как однопоточный объект (STA).

     

    hr = pFramework->Initialize(hWndHost, pApplication);
    if (FAILED(hr))
    {
      return hr;
    }
    
  3. LoadUI(instance, resourceName)

    Приложение вызывает IUIFramework::LoadUI для привязки ресурса разметки. Первым параметром этой функции является дескриптор экземпляра приложения ленты. Второй параметр — это имя скомпилированного ранее двоичного ресурса разметки. Передав двоичную разметку на платформу ленты, приложение сообщает, какой должна быть структура ленты и как должны быть упорядочены элементы управления. Он также предоставляет платформе манифест команд для предоставления (например, Вставка, Вырезать, Найти), которые используются платформой при выполнении обратных вызовов, связанных с командой во время выполнения.

    hr = pFramework->LoadUI(GetModuleHandle(NULL), L"APPLICATION_RIBBON");
    if (FAILED(hr))
    {
      return hr;
    }
    
  4. Обратные вызовы IUIApplication::OnCreateUICommand

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

    Эти два элемента функциональности обрабатываются через интерфейс IUICommandHandler . В частности, для каждой команды, объявленной в двоичной разметке (см. шаг 3 выше), платформа вызывает IUIApplication::OnCreateUICommand, чтобы запросить у приложения объект IUICommandHandler для этой команды.

    Примечание

    Интерфейс IUICommandHandler позволяет привязать обработчик команд к одной или нескольким командам.

     

Как минимум, приложение требуется для реализации заглушки методов IUIApplication , возвращающих E_NOTIMPL, как показано в следующем примере.

STDMETHOD(OnViewChanged)(UINT32 viewId,
                         UI_VIEWTYPE typeID,
                         IUnknown *view,
                         UI_VIEWVERB verb,
                         INT32 uReasonCode)
{ 
  return E_NOTIMPL; 
}

STDMETHOD(OnCreateUICommand)(UINT32 commandId,
                             UI_COMMANDTYPE typeID,
                             IUICommandHandler **commandHandler)
{ 
  return E_NOTIMPL; 
}

STDMETHOD(OnDestroyUICommand)(UINT32 commandId,
                              UI_COMMANDTYPE typeID,
                              IUICommandHandler *commandHandler) 
{ 
  return E_NOTIMPL; 
}

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

#include "ribbonUI.rc"

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

Компиляция приложения

После компиляции приложения ленты его можно запустить и протестировать пользовательский интерфейс. Если пользовательский интерфейс требует настройки и в основном коде приложения нет изменений в связанных обработчиках команд, измените исходный файл разметки, перекомпилируйте разметку с помощью UICC.exe и свяжите новые файлы ресурсов разметки. При перезапуске приложения отображается измененный пользовательский интерфейс.

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

Обновления и выполнения во время выполнения

Структура взаимодействия во время выполнения платформы ленты основана на модели принудительной отправки и извлечения или двустороннего вызывающего объекта.

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

Платформа извлекает обновленные сведения о свойствах из приложения ленты с помощью метода обратного вызова IUICommandHandler::UpdateProperty . Идентификатор команды и ключ свойства, который идентифицирует обновляемое свойство Command, передаются методу , который затем возвращает или отправляет значение для этого ключа свойства в платформу.

Платформа вызывает IUICommandHandler::Execute при выполнении команды, определяя идентификатор команды и тип выполненного выполнения (UI_EXECUTIONVERB). Здесь приложение задает логику выполнения для команды.

На следующей схеме показан обмен данными во время выполнения команд между платформой и приложением.

схема, показывающая пример взаимодействия во время выполнения между платформой ленты и ведущим приложением.

Примечание

Реализация функций IUICommandHandler::UpdateProperty и IUICommandHandler::Execute не требуется для первоначального отображения ленты в приложении. Однако эти методы необходимы для обеспечения правильной работы приложения при выполнении команд пользователем.

 

Поддержка OLE

Приложение ленты можно настроить в качестве сервера OLE для поддержки активации OLE вне места.

Объекты, созданные в серверном приложении OLE, сохраняют связь с серверным приложением при вставке (вставленном или помещенном) в клиентское приложение OLE (или контейнер). При активации OLE вне места двойной щелчок объекта в клиентском приложении открывает выделенный экземпляр серверного приложения и загружает объект для редактирования. При закрытии серверного приложения все изменения, внесенные в объект , отражаются в клиентском приложении.

Примечание

Платформа ленты не поддерживает активацию OLE на месте. Объекты, созданные на сервере OLE на ленте, нельзя изменять из клиентского приложения OLE. Требуется внешний выделенный экземпляр серверного приложения.

Объявление команд и элементов управления с помощью разметки ленты

Руководство по взаимодействию с пользователем ленты

Процесс проектирования ленты