Элемент управления шрифтом

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

Введение

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

На следующем снимке экрана показан элемент управления шрифтом ленты в WordPad для Windows 7.

Снимок экрана: элемент fontcontrol с атрибутом richfont, который имеет значение true.

Согласованный интерфейс

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

Этот согласованный интерфейс включает в себя

  • Стандартизированное форматирование и выбор шрифтов в приложениях ленты.

  • Стандартизированное представление шрифтов в приложениях ленты.

  • Автоматическая активация шрифта в Windows 7 на основе параметра Показать или скрыть для каждого шрифта на панели управления Шрифты . Элемент управления шрифтом отображает только те шрифты, для которых задано значение Показать.

    Примечание

    В Windows Vista панель управления Шрифты не предлагает функции Показать или Скрыть , поэтому активируются все шрифты.

  • Управление шрифтами, доступное непосредственно из элемента управления .

    На следующем снимке экрана показано, что доступ к панели управления Шрифты можно получить непосредственно из элемента управления шрифтами.

    Снимок экрана: список семейства шрифтов в wordpad для Windows 7.

  • Поддержка автоматического предварительного просмотра.

  • Раскрытие шрифтов, которые наиболее важны для пользователя, например

    • Локализованные списки шрифтов для международных пользователей.
    • Списки шрифтов на основе устройства ввода.

    Примечание

    Поддержка этой функции недоступна на любой платформе старше Windows 7.

Простая интеграция и настройка

Благодаря стандартной, многократно используемой и легко используемой функции элемент управления шрифтами на ленте упрощает интеграцию поддержки шрифтов в приложение.

Сведения о выборе и форматировании шрифта упаковываются в один автономный логический элемент, который

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

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

Другие функции элемента управления шрифтами:

  • Автоматическое создание точечных изображений WYSIWYG (то, что вы видите) с учетом DPI для каждого шрифта в меню семейства шрифтов .

  • Интеграция интерфейса графических устройств Windows (GDI).

  • Локализованные точечные изображения семейства шрифтов и подсказки.

  • Перечисление, группирование и метаданные шрифтов для управления шрифтами и их представления.

    Примечание

    Поддержка этой функции недоступна на любой платформе старше Windows 7.

  • Раскрывающиеся элементы выбора цвета текста и Выделения цвета текста, которые зеркало поведение раскрывающегося цвета ленты.

  • Поддержка автоматического просмотра всеми вложенными элементами управления на основе коллекции элементов управления шрифтами: семейство шрифтов, размер шрифта, цвет текста и цвет выделения текста.

Выравнивание с использованием общих текстовых структур GDI

Компоненты стека текста интерфейса графических устройств Windows (GDI) используются для предоставления функций выбора и форматирования шрифта с помощью элемента управления шрифтами ленты. Различные функции шрифтов, поддерживаемые структурой LOGFONT, структурой CHOOSEFONT и структурой CHARFORMAT2 , предоставляются с помощью вложенных элементов управления, включенных в элемент управления шрифтом.

Вложенные элементы управления, отображаемые в элементе управления шрифтом, зависят от шаблона FontType, объявленного в разметке ленты. Шаблоны FontType (подробно описанные в следующем разделе) предназначены для согласования с общими текстовыми структурами интерфейса графических устройств Windows (GDI ).

Добавление Элемента управления FontControl

В этом разделе описаны основные шаги по добавлению элемента управления шрифтом в приложение ленты.

Объявление Элемента управления FontControl в разметке

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

Примечание

Если идентификатор команды в разметке FontControl не объявлен, он создается платформой.

Так как вложенные элементы управления шрифтом не предоставляются напрямую, настройка элемента управления шрифтами ограничена тремя шаблонами макета FontType , определенными платформой.

Дополнительную настройку элемента управления шрифтом можно выполнить путем объединения шаблона макета с атрибутами FontControl , такими как IsHighlightButtonVisible, IsStrikethroughButtonVisible и IsUnderlineButtonVisible.

Примечание

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

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

Шаблон Поддерживает
FontOnly Структура LOGFONT
FontWithColor Структура CHOOSEFONT
RichFont Структура CHARFORMAT2

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

Элементы управления

Шаблоны

RichFont

FontWithColor

FontOnly

Значение по умолчанию

Необязательно

Значение по умолчанию

Необязательно

Значение по умолчанию

Необязательно

Поле со списком "Размер шрифта"

Да

Нет

Да

Нет

Да

Нет

Поле со списком семейства шрифтов

Да

Нет

Да

Нет

Да

Нет

Кнопка увеличения шрифта

Да

Да

Да

Да

-

-

Кнопка "Сжать шрифт"

Да

Да

Да

Да

-

-

Кнопка полужирного шрифта

Да

Нет

Да

Нет

Да

Нет

Кнопка курсивом

Да

Нет

Да

Нет

Да

Нет

Кнопка подчеркивания

Да

Нет

Да

Да

Да

Да

Зачеркивная кнопка

Да

Нет

Да

Да

Да

Да

Кнопка "Подстрочный"

Да

Нет

-

-

-

-

Надстрочные кнопки

Да

Нет

-

-

-

-

Кнопка "Цвет выделения текста"

Да

Нет

Да

Да

-

-

Кнопка цвета текста

Да

Нет

Да

Нет

-

-

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

Добавление FontControl на ленту

В следующих примерах кода демонстрируются основные требования к разметке для добавления элемента управления шрифтом на ленту:

В этом разделе кода показана разметка объявления FontControl Command, включая команды tab и group , необходимые для отображения элемента управления на ленте.

<Command Name="cmdTab1"
  Comment="These comments are optional and are inserted into the header file."
  Symbol="cmdTab1" Id="10000" >
  <Command.LabelTitle>Tab 1</Command.LabelTitle>
</Command>
<Command Name="cmdGroup1" Comment="Group #1" Symbol="cmdGroup1" Id="20000">
  <!-- This image is used when the group scales to a pop-up. -->
  <Command.SmallImages>
    <Image>res/Button_Image.bmp</Image>
  </Command.SmallImages>
</Command>
<Command Name="cmdFontControl" Symbol="cmdFontControl" Comment="FontControl" Id="25001" Keytip="F" />

В этом разделе кода показана разметка, необходимая для объявления и связывания FontControl с Command с помощью идентификатора команды. Этот конкретный пример включает объявления Tab и Group с параметрами масштабирования.

<Ribbon.Tabs>
  <Tab CommandName="cmdTab1">
    <Tab.ScalingPolicy>
      <ScalingPolicy>
        <ScalingPolicy.IdealSizes>
          <Scale Group="cmdGroup1" Size="Large" />
        </ScalingPolicy.IdealSizes>
        <!-- Describe how the FontControl group scales. -->
        <Scale Group="cmdGroup1" Size="Medium" />
        <Scale Group="cmdGroup1" Size="Popup" />
      </ScalingPolicy>
    <Group CommandName="cmdGroup1" SizeDefinition="OneFontControl">
      <FontControl CommandName="cmdFontControl" FontType="RichFont" />
    </Group>
  </Tab>
</Ribbon.Tabs>

Добавление FontControl в ContextPopup

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

В следующих примерах кода демонстрируются основные требования к разметке для добавления элемента управления шрифтом во всплывающее окно контекста:

В этом разделе кода показана разметка объявления FontControl Command, необходимая для отображения FontControl в ContextPopup.

<Command Name="cmdFontControl" Symbol="cmdFontControl" Comment="FontControl" Id="25001" />

В этом разделе кода показана разметка, необходимая для объявления и связывания FontControl с Command с помощью идентификатора команды.

<ContextPopup.MiniToolbars>
  <MiniToolBar Name="MiniToolbar1">
    <MenuCategory Class="StandardItems">
      <FontControl CommandName="cmdFontControl" />
    </MenuCategory>
  </MiniToolBar>
</ContextPopup.MiniToolbars>

Подсказки клавиш

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

Если значение атрибута Keytip присваивается элементу FontControl в разметке, это значение добавляется в качестве префикса к подсказке клавиши, определенной платформой.

Примечание

Приложение должно применять односимвольный правило для этого префикса.

В следующей таблице перечислены подсказки ключей, определенные платформой.

Вложенный элемент управления Подсказка клавиши
Семейство шрифтов F
Стиль шрифта T
Размер шрифта S
Увеличение шрифта G
Сжатие шрифта K
Полужирный шрифт B
Курсив I
Underline U
Зачеркнутый X
Надстрочный Y или Z Примечание. Если атрибут Keytip не объявлен в разметке, подсказка клавиши по умолчанию — Y; в противном случае подсказка клавиш по умолчанию — Keytip + Z.
Подстрочный A
Цвет шрифта C
Выделение шрифта H

Рекомендуемый префикс для ленты EN-US для многоязычного пользовательского интерфейса (MUI) — "F", как показано в следующем примере.

<Command Name="cmdFontControl" Symbol="cmdFontControl" Comment="FontControl" Id="25001" Keytip="F" />

На следующем снимке экрана показаны подсказки клавиш элемента управления шрифтом, как они определены в предыдущем примере.

Снимок экрана: подсказки клавиш fontcontrol в wordpad для Windows 7.

Файл ресурсов ленты

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

Пример простого файла ресурсов:

// ******************************************************************************
// * This is an automatically generated file containing the ribbon resource for *
// * your application.                                                          *
// ******************************************************************************

#include ".\ids.h"

STRINGTABLE 
BEGIN
  cmdTab1_LabelTitle_RESID L"Tab 1" 
    /* LabelTitle cmdTab1_LabelTitle_RESID: These comments are optional and are 
       inserted into the header file. */
END

cmdGroup1_SmallImages_RESID    BITMAP    "res\\Button_Image.bmp" 
  /* SmallImages cmdGroup1_SmallImages_RESID: Group #1 */
STRINGTABLE 
BEGIN
  cmdFontControl_Keytip_RESID L"F" /* Keytip cmdFontControl_Keytip_RESID: FontControl */
END

FCSAMPLE_RIBBON    UIFILE    "Debug\\FCSample.bml"

Свойства элемента управления шрифтом

Платформа ленты определяет коллекцию ключей свойств для элемента управления шрифтом и его составных элементов управления.

Как правило, свойство элемента управления шрифтом обновляется в пользовательском интерфейсе ленты путем аннулирования команды, связанной с элементом управления, путем вызова метода IUIFramework::InvalidateUICommand . Событие недействительности обрабатывается и свойство обновляется с помощью метода обратного вызова IUICommandHandler::UpdateProperty .

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

Примечание

В некоторых случаях свойство можно получить с помощью метода IUIFramework::GetUICommandProperty и задать с помощью метода IUIFramework::SetUICommandProperty .

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

Ключ свойства Примечания
UI_PKEY_FontProperties Предоставляет в агрегате как объект IPropertyStore все свойства подконтроля элемента управления шрифтом.
Платформа запрашивает это свойство, когда UI_INVALIDATIONS_VALUE передается в качестве значения флагов в вызове IUIFramework::InvalidateUICommand.
UI_PKEY_FontProperties_ChangedProperties Предоставляет в агрегате как объект IUISimplePropertySet только измененные свойства элемента управления шрифтом.
UI_PKEY_Keytip Может быть обновлено только через недействительность.
UI_PKEY_Enabled Поддерживает IUIFramework::GetUICommandProperty и IUIFramework::SetUICommandProperty.

В дополнение к свойствам, поддерживаемым самим элементом управления шрифтом, платформа ленты также определяет ключ свойства для каждого вложенного элемента управления шрифтом. Эти ключи свойств и их значения предоставляются платформой через реализацию интерфейса IPropertyStore , которая определяет методы управления коллекцией( также называемой контейнером свойств) пар "имя- значение".

Приложение преобразует структуры шрифтов в свойства, доступные с помощью методов интерфейса IPropertyStore . Эта модель подчеркивает различие между компонентами стека текста элемента управления шрифтом и интерфейсом GDI windows (структура LOGFONT, структура CHOOSEFONT и структура CHARFORMAT2), которые поддерживаются платформой.

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

Элементы управления Ключ свойства Примечания
Размер шрифта UI_PKEY_FontProperties_Size При выделении фрагмента текста разнородного размера платформа ленты задает для элемента управления Размер шрифта значение пустое, а для UI_PKEY_FontProperties_Size значение 0. При нажатии кнопки Увеличить шрифт или Сжать шрифт весь выделенный текст изменяется, но относительная разница в размерах текста сохраняется.
Семейство шрифтов UI_PKEY_FontProperties_Family Имена семейств шрифтов GDI зависят от языкового стандарта системы. Таким образом, если значение UI_PKEY_FontProperties_Family сохраняется в сеансах приложения, это значение должно быть получено в каждом новом сеансе.
Увеличение шрифта UI_PKEY_FontProperties_Size См. раздел Размер шрифта.
Сжатие шрифта UI_PKEY_FontProperties_Size См. раздел Размер шрифта.
Полужирный UI_PKEY_FontProperties_Bold
Наклонный UI_PKEY_FontProperties_Italic
Подчеркнуть UI_PKEY_FontProperties_Underline
Зачеркнутый UI_PKEY_FontProperties_Strikethrough
Подстрочный UI_PKEY_FontProperties_VerticalPositioning Если задана кнопка "Подстрочный ", то также нельзя задать надстрочный .
Надстрочный UI_PKEY_FontProperties_VerticalPositioning Если задана кнопка "Надстрочный ", то также нельзя задать подстрочный индекс.
Цвет выделения текста UI_PKEY_FontProperties_BackgroundColor, UI_PKEY_FontProperties_BackgroundColorType Предоставляет те же функциональные возможности, что и HighlightColors шаблон элемента DropDownColorPicker .
Настоятельно рекомендуется задавать приложением только начальное значение цвета выделения текста . Последнее выбранное значение должно сохраняться и не задаваться при изменении положения курсора в документе. Это обеспечивает быстрый доступ к последнему выбору пользователя, и выбор цвета не требуется повторно открывать.
Не удается настроить цветовые образцы.
Цвет текста UI_PKEY_FontProperties_ForegroundColor, UI_PKEY_FontProperties_ForegroundColorType Предоставляет те же функциональные возможности, что и StandardColors шаблон элемента DropDownColorPicker .
Настоятельно рекомендуется задавать приложением только начальное значение цвета текста . Последнее выбранное значение должно сохраняться и не задаваться при изменении положения курсора в документе. Это обеспечивает быстрый доступ к последнему выбору пользователя, и выбор цвета не требуется повторно открывать.
Не удается настроить цветовые образцы.

Определение обработчика команд FontControl

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

Предупреждение

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

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

//
//  FUNCTION: OnCreateUICommand(UINT, UI_COMMANDTYPE, IUICommandHandler)
//
//  PURPOSE: Called by the Ribbon framework for each command specified in markup, to allow
//           the host application to bind a command handler to that command.
//
STDMETHODIMP CApplication::OnCreateUICommand(
  UINT nCmdID,
  __in UI_COMMANDTYPE typeID,
  __deref_out IUICommandHandler** ppCommandHandler)
{
  UNREFERENCED_PARAMETER(typeID);
  UNREFERENCED_PARAMETER(nCmdID);

  if (NULL == m_pCommandHandler)
  {
    HRESULT hr = CCommandHandler::CreateInstance(&m_pCommandHandler);
    if (FAILED(hr))
    {
      return hr;
    }
  }

  return m_pCommandHandler->QueryInterface(IID_PPV_ARGS(ppCommandHandler));
}

В следующем примере кода показано, как реализовать метод IUICommandHandler::Execute для элемента управления шрифтом.

//
//  FUNCTION: Execute()
//
//  PURPOSE: Called by the Ribbon framework when a command is executed 
//           by the user. For example, when a button is pressed.
//
STDMETHODIMP CCommandHandler::Execute(
  UINT nCmdID,
  UI_EXECUTIONVERB verb,
  __in_opt const PROPERTYKEY* key,
  __in_opt const PROPVARIANT* ppropvarValue,
  __in_opt IUISimplePropertySet* pCommandExecutionProperties)
{
  UNREFERENCED_PARAMETER(nCmdID);

  HRESULT hr = E_NOTIMPL;
  if ((key) && (*key == UI_PKEY_FontProperties))
  {
    // Font properties have changed.
    switch (verb)
    {
      case UI_EXECUTIONVERB_EXECUTE:
      {
        hr = E_POINTER;
        if (pCommandExecutionProperties != NULL)
        {
          // Get the changed properties.
          PROPVARIANT varChanges;
          hr = pCommandExecutionProperties->GetValue(UI_PKEY_FontProperties_ChangedProperties, &varChanges);
          if (SUCCEEDED(hr))
          {
            IPropertyStore *pChanges;
            hr = UIPropertyToInterface(UI_PKEY_FontProperties, varChanges, &pChanges);
            if (SUCCEEDED(hr))
            {
              // Using the changed properties, set the new font on the selection on RichEdit control.
              g_pFCSampleAppManager->SetValues(pChanges);
              pChanges->Release();
            }
            PropVariantClear(&varChanges);
          }
        }
        break;
      }
      case UI_EXECUTIONVERB_PREVIEW:
      {
        hr = E_POINTER;
        if (pCommandExecutionProperties != NULL)
        {
          // Get the changed properties for the preview event.
          PROPVARIANT varChanges;
          hr = pCommandExecutionProperties->GetValue(UI_PKEY_FontProperties_ChangedProperties, &varChanges);
          if (SUCCEEDED(hr))
          {
            IPropertyStore *pChanges;
            hr = UIPropertyToInterface(UI_PKEY_FontProperties, varChanges, &pChanges);
            if (SUCCEEDED(hr))
            {
              // Set the previewed values on the RichEdit control.
              g_pFCSampleAppManager->SetPreviewValues(pChanges);
              pChanges->Release();
            }
            PropVariantClear(&varChanges);
          }
        }
        break;
      }
      case UI_EXECUTIONVERB_CANCELPREVIEW:
      {
        hr = E_POINTER;
        if (ppropvarValue != NULL)
        {
          // Cancel the preview.
          IPropertyStore *pValues;
          hr = UIPropertyToInterface(UI_PKEY_FontProperties, *ppropvarValue, &pValues);
          if (SUCCEEDED(hr))
          {   
            g_pFCSampleAppManager->CancelPreview(pValues);
            pValues->Release();
          }
        }
        break;
      }
    }
  }

  return hr;
}

В следующем примере кода показано, как реализовать метод IUICommandHandler::UpdateProperty для элемента управления шрифтом.

//
//  FUNCTION: UpdateProperty()
//
//  PURPOSE: Called by the Ribbon framework when a command property (PKEY) needs to be updated.
//
//  COMMENTS:
//
//    This function is used to provide new command property values, such as labels, icons, or
//    tooltip information, when requested by the Ribbon framework.  
//    
//
STDMETHODIMP CCommandHandler::UpdateProperty(
  UINT nCmdID,
  __in REFPROPERTYKEY key,
  __in_opt const PROPVARIANT* ppropvarCurrentValue,
  __out PROPVARIANT* ppropvarNewValue)
{
  UNREFERENCED_PARAMETER(nCmdID);

  HRESULT hr = E_NOTIMPL;
  if (key == UI_PKEY_FontProperties)
  {
    hr = E_POINTER;
    if (ppropvarCurrentValue != NULL)
    {
      // Get the font values for the selected text in the font control.
      IPropertyStore *pValues;
      hr = UIPropertyToInterface(UI_PKEY_FontProperties, *ppropvarCurrentValue, &pValues);
      if (SUCCEEDED(hr))
      {
        g_pFCSampleAppManager->GetValues(pValues);

        // Provide the new values to the font control.
        hr = UIInitPropertyFromInterface(UI_PKEY_FontProperties, pValues, ppropvarNewValue);
        pValues->Release();
      }
    }
  }

  return hr;
}

Библиотека элементов управления Windows Ribbon Framework

Элемент FontControl

Свойства элемента управления шрифтом

Пример FontControl