Controle de fonte

Para simplificar a integração e a configuração do suporte à fonte em aplicativos que exigem recursos de processamento de texto e edição de texto, a estrutura da Faixa de Opções do Windows fornece um Controle de Fonte especializado que expõe uma ampla gama de propriedades de fonte, como nome da face de tipo, estilo, tamanho do ponto e efeitos.

Introdução

O Controle de Fonte é um controle composto que consiste em botões, botões de alternância, caixas de listagem suspensas e caixas de combinação, que são usadas para especificar uma determinada propriedade de fonte ou opção de formatação.

A captura de tela a seguir mostra o Controle de Fonte da Faixa de Opções no WordPad para Windows 7.

captura de tela do elemento fontcontrol com o atributo richfont definido como true.

Uma experiência consistente

Como um controle de Faixa de Opções interno, o Controle de Fonte melhora a funcionalidade geral de gerenciamento, seleção e formatação de fontes e fornece uma experiência de usuário avançada e consistente em todos os aplicativos da Faixa de Opções.

Essa experiência consistente inclui

  • Formatação padronizada e seleção de fontes em aplicativos da Faixa de Opções.

  • Representação de fonte padronizada em aplicativos da Faixa de Opções.

  • Automática, no Windows 7, ativação de fonte baseada na configuração Mostrar ou Ocultar para cada fonte no painel de controle Fontes . O Controle de Fonte exibe apenas as fontes definidas como Mostrar.

    Observação

    No Windows Vista, o painel de controle Fontes não oferece a funcionalidade Mostrar ou Ocultar , portanto, todas as fontes são ativadas.

  • Gerenciamento de fontes que está disponível diretamente do controle.

    A captura de tela a seguir mostra que o painel de controle Fontes pode ser acessado diretamente do Controle de Fontes.

    captura de tela da lista de família de fontes no wordpad para windows 7.

  • Suporte para visualização automática.

  • Exposição de fontes mais relevantes para um usuário, como

    • Listas de fontes localizadas para usuários internacionais.
    • Listas de fontes com base no dispositivo de entrada.

    Observação

    O suporte para essa funcionalidade não está disponível em nenhuma plataforma anterior ao Windows 7.

Fácil integração e configuração

Ao fornecer funcionalidades padrão, reutilizáveis e facilmente consumidas, o Controle de Fontes da Faixa de Opções facilita a carga de integração do suporte à fonte em um aplicativo.

Os detalhes da seleção e da formatação da fonte são encapsulados em um elemento lógico autocontido que

  • Elimina o gerenciamento complexo de interdependências de controle típicas de implementações de controle de fonte.
  • Requer um único manipulador de comando para todas as funcionalidades expostas pelos subcontroles de Controle de Fonte.

Esse único manipulador de comando permite que o Controle de Fonte gerencie a funcionalidade de vários subcontroles internamente; um subcontrole nunca interage diretamente com o aplicativo, independentemente de sua função.

Outros recursos do Controle de Fonte incluem

  • Geração automática com reconhecimento de DPI de uma representação de bitmap WYSIWYG (o que você vê é o que você obtém) para cada fonte no menu Família de fontes.

  • Integração da GDI (Interface de Dispositivo Gráfico do Windows).

  • Bitmaps e dicas de ferramentas da família de fontes localizadas.

  • Enumeração de fonte, agrupamento e metadados para gerenciar e apresentar fontes.

    Observação

    O suporte para essa funcionalidade não está disponível em nenhuma plataforma anterior ao Windows 7.

  • Os seletores de cores da lista suspensa Cor do texto e Texto realçam cores que espelho o comportamento do Seletor de Cores da Lista Suspensa da Faixa de Opções.

  • Suporte à visualização automática por todos os subcontroles baseados na galeria de Controle de Fontes: Família de fontes, Tamanho da fonte, Cor do texto e Cor de realce de texto.

Alinhamento com estruturas de texto GDI comuns

Os componentes da pilha de texto da GDI (Interface de Dispositivo gráfico do Windows) são usados para expor a funcionalidade de seleção e formatação de fontes por meio do Controle de Fonte da Faixa de Opções. Os vários recursos de fonte compatíveis com a Estrutura LOGFONT, a Estrutura CHOOSEFONT e a Estrutura CHARFORMAT2 são expostos por meio dos subcontroles incluídos no Controle de Fonte.

Os subcontroles exibidos no Controle de Fonte dependem do modelo FontType declarado na marcação da Faixa de Opções. Os modelos FontType (discutidos mais detalhadamente na seção a seguir) foram projetados para se alinhar com as estruturas de texto comuns da GDI (Interface de Dispositivo Gráfico do Windows ).

Adicionar um FontControl

Esta seção descreve as etapas básicas para adicionar um Controle de Fonte a um aplicativo da Faixa de Opções.

Declarando um FontControl na marcação

Assim como outros controles da Faixa de Opções, o Controle de Fonte é declarado na marcação com um elemento FontControl e associado a uma declaração Command por meio de uma ID de Comando. Quando o aplicativo é compilado, a ID de Comando é usada para associar o Comando a um manipulador de comando no aplicativo host.

Observação

Se nenhuma ID de Comando for declarada com FontControl na marcação, uma será gerada pela estrutura.

Como os subcontroles do Controle de Fonte não são expostos diretamente, a personalização do Controle de Fonte é limitada a três modelos de layout FontType definidos pela estrutura.

A personalização adicional do Controle de Fontes pode ser realizada combinando o modelo de layout com atributos FontControl , como IsHighlightButtonVisible, IsStrikethroughButtonVisible e IsUnderlineButtonVisible.

Observação

A funcionalidade de fonte além da exposta pelos modelos e atributos padrão do Controle de Fontes requer uma implementação de controle de fonte personalizada que está fora do escopo deste artigo.

A tabela a seguir lista os modelos de Controle de Fonte e o tipo de controle de edição com o qual cada modelo está alinhado.

Modelo Suporta
FontOnly Estrutura LOGFONT
FontWithColor Estrutura CHOOSEFONT
RichFont Estrutura CHARFORMAT2

A tabela a seguir lista os controles associados a cada modelo e identifica os controles que são opcionais para um modelo associado.

Controles

Modelos

RichFont

FontWithColor

FontOnly

Padrão

Opcional

Padrão

Opcional

Padrão

Opcional

Caixa de combinação Tamanho da fonte

Sim

No

Sim

No

Sim

No

Caixa de combinação família de fontes

Sim

Não

Sim

No

Sim

No

Botão Aumentar fonte

Sim

Sim

Sim

Sim

-

-

Botão Reduzir fonte

Sim

Sim

Sim

Sim

-

-

Botão Negrito

Sim

No

Sim

Não

Sim

Não

Botão Itálico

Sim

No

Sim

No

Sim

No

Botão Sublinhar

Sim

No

Sim

Sim

Sim

Sim

Botão Tachado

Sim

No

Sim

Sim

Sim

Sim

Botão Subscrito

Sim

No

-

-

-

-

Botão Sobrescrito

Sim

No

-

-

-

-

Botão cor de realce de texto

Sim

No

Sim

Sim

-

-

Botão Cor do texto

Sim

Não

Sim

Não

-

-

Quando o comportamento de layout de um Controle de Fonte é declarado, a estrutura da Faixa de Opções fornece um modelo de layout SizeDefinition opcional, OneFontControl, que define duas configurações de subcontrole com base no tamanho da Faixa de Opções e no espaço disponível para o Controle de Fonte. Para obter mais informações, consulte Personalizando uma faixa de opções por meio de definições de tamanho e políticas de dimensionamento.

Adicionando um FontControl a uma faixa de opções

Os exemplos de código a seguir demonstram os requisitos básicos de marcação para adicionar um Controle de Fonte a uma Faixa de Opções:

Esta seção de código mostra a marcação de declaração comando FontControl , incluindo os comandos Tab e Group que são necessários para exibir um controle na Faixa de Opções.

<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" />

Esta seção de código mostra a marcação necessária para declarar e associar um FontControl a um Command por meio de uma ID de comando. Este exemplo específico inclui as declarações Tab e Group , com preferências de dimensionamento.

<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>

Adicionando um FontControl a um ContextPopup

Adicionar um Controle de Fonte a um Pop-up de Contexto requer um procedimento semelhante ao da adição de um Controle de Fonte à Faixa de Opções. No entanto, um Controle de Fonte em uma MiniToolbar é restrito ao conjunto de subcontroles padrão que são comuns a todos os modelos de Controle de Fonte: Família de fontes, Tamanho da fonte, Negrito e Itálico.

Os exemplos de código a seguir demonstram os requisitos básicos de marcação para adicionar um controle de fonte a um pop-up de contexto:

Esta seção de código mostra a marcação de declaração comando FontControl que é necessária para exibir um FontControl no ContextPopup.

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

Esta seção de código mostra a marcação necessária para declarar e associar um FontControl a um Command por meio de uma ID de comando.

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

Dicas de tecla

Cada subcontrole no Controle de Fonte da Faixa de Opções é acessível por meio de um atalho de teclado ou dica de tecla. Essa dica de chave é predefinida e atribuída a cada subcontrole pela estrutura.

Se um valor de atributo Keytip for atribuído ao elemento FontControl na marcação, esse valor será adicionado como um prefixo à dica de chave definida pela estrutura.

Observação

O aplicativo deve impor uma regra de caractere único para esse prefixo.

A tabela a seguir lista as dicas de chave definidas pela estrutura.

Subcontrole Keytip
Família de fontes F
Estilo da fonte T
Tamanho da fonte S
Aumentar fonte G
Reduzir fonte K
Negrito B
Itálico I
Underline U
Tachado X
Sobrescrito Observação Y ou Z: se o atributo Keytip não for declarado na marcação, a dica de chave padrão será Y; caso contrário, a dica de chave padrão é Dica de chave + Z.
Subscrito Um
Cor da fonte C
Realce da fonte H

O prefixo recomendado para uma faixa de opções EN-US da MUI (Interface do Usuário Multilíngue) é 'F', conforme mostrado no exemplo a seguir.

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

A captura de tela a seguir ilustra as dicas de chave do Controle de Fonte conforme elas são definidas no exemplo anterior.

captura de tela das dicas de tecla fontcontrol no wordpad para windows 7.

O arquivo de recurso da faixa de opções

Quando o arquivo de marcação é compilado, um arquivo de recurso que contém todas as referências de recurso para o aplicativo Ribbon é gerado.

Exemplo de um arquivo de recurso simples:

// ******************************************************************************
// * 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"

Propriedades de controle de fonte

A estrutura da Faixa de Opções define uma coleção de chaves de propriedade para o Controle de Fonte e seus subcontroles constituintes.

Normalmente, uma propriedade Controle de Fonte é atualizada na interface do usuário da faixa de opções invalidando o Comando associado ao controle por meio de uma chamada para o método IUIFramework::InvalidateUICommand . O evento de invalidação é tratado e as atualizações de propriedade definidas pelo método de retorno de chamada IUICommandHandler::UpdateProperty .

O método de retorno de chamada IUICommandHandler::UpdateProperty não é executado e o aplicativo consultou um valor de propriedade atualizado até que a propriedade seja exigida pela estrutura. Por exemplo, quando uma guia é ativada e um controle revelado na interface do usuário da faixa de opções ou quando uma dica de ferramenta é exibida.

Observação

Em alguns casos, uma propriedade pode ser recuperada por meio do método IUIFramework::GetUICommandProperty e definida com o método IUIFramework::SetUICommandProperty .

A tabela a seguir lista as chaves de propriedade associadas ao Controle de Fonte.

Chave de Propriedade Observações
UI_PKEY_FontProperties Expõe, em agregação como um objeto IPropertyStore , todas as propriedades de subcontrole do Controle de Fonte.
A estrutura consulta essa propriedade quando UI_INVALIDATIONS_VALUE é passada como o valor de sinalizadores na chamada para IUIFramework::InvalidateUICommand.
UI_PKEY_FontProperties_ChangedProperties Expõe, em agregação como um objeto IUISimplePropertySet , apenas propriedades de subcontrole de Controle de Fonte que foram alteradas.
UI_PKEY_Keytip Só pode ser atualizado por meio de invalidação.
UI_PKEY_Enabled Dá suporte a IUIFramework::GetUICommandProperty e IUIFramework::SetUICommandProperty.

Além das propriedades compatíveis com o próprio Controle de Fonte, a estrutura da Faixa de Opções também define uma chave de propriedade para cada subcontrole de Controle de Fonte. Essas chaves de propriedade e seus valores são expostos pela estrutura por meio de uma implementação de interface IPropertyStore que define os métodos para gerenciar uma coleção, também chamada de recipiente de propriedades, de pares de nome e valor.

O aplicativo converte as estruturas de fonte em propriedades acessíveis por meio dos métodos de interface IPropertyStore . Esse modelo enfatiza a distinção entre o Controle de Fonte e os componentes de pilha de texto GDI (Interface do Dispositivo Gráfico do Windows) (Estrutura LOGFONT, Estrutura CHOOSEFONT e Estrutura CHARFORMAT2) compatíveis com a estrutura.

A tabela a seguir lista os controles individuais e suas chaves de propriedade associadas.

Controles Chave de Propriedade Observações
Tamanho da fonte UI_PKEY_FontProperties_Size Quando uma execução de texto de tamanho heterogêneo é realçada, a estrutura da Faixa de Opções define o controle Tamanho da fonte como em branco e o valor de UI_PKEY_FontProperties_Size como 0. Quando o botão Aumentar fonte ou Fonte de redução é clicado, todo o texto realçado é redimensionado, mas a diferença relativa nos tamanhos de texto é preservada.
Família de fontes UI_PKEY_FontProperties_Family Os nomes da família de fontes GDI variam de acordo com a localidade do sistema. Dessa forma, se o valor de UI_PKEY_FontProperties_Family for preservado entre as sessões do aplicativo, esse valor deverá ser recuperado em cada nova sessão.
Aumentar fonte UI_PKEY_FontProperties_Size Consulte Tamanho da fonte.
Reduzir fonte UI_PKEY_FontProperties_Size Consulte Tamanho da fonte.
Negrito UI_PKEY_FontProperties_Bold
Itálico UI_PKEY_FontProperties_Italic
Sublinhar UI_PKEY_FontProperties_Underline
Tachado UI_PKEY_FontProperties_Strikethrough
Subscrito UI_PKEY_FontProperties_VerticalPositioning Se o botão Subscrito estiver definido, o Sobrescrito também não poderá ser definido.
Sobrescrito UI_PKEY_FontProperties_VerticalPositioning Se o botão Sobrescrito estiver definido, o Subscrito também não poderá ser definido.
Cor de realce de texto UI_PKEY_FontProperties_BackgroundColor, UI_PKEY_FontProperties_BackgroundColorType Fornece a mesma funcionalidade que o HighlightColors modelo do elemento DropDownColorPicker .
É altamente recomendável que apenas um valor de cor de realce de Texto inicial seja definido pelo aplicativo. O último valor selecionado deve ser preservado e não definido quando o cursor é reposicionado em um documento. Isso permite acesso rápido à última seleção do usuário e o seletor de cores não precisa ser reaberto.
Amostras de cores não podem ser personalizadas.
Cor do texto UI_PKEY_FontProperties_ForegroundColor, UI_PKEY_FontProperties_ForegroundColorType Fornece a mesma funcionalidade que o StandardColors modelo do elemento DropDownColorPicker .
É altamente recomendável que apenas um valor de cor de Texto inicial seja definido pelo aplicativo. O último valor selecionado deve ser preservado e não definido quando o cursor é reposicionado em um documento. Isso permite acesso rápido à última seleção do usuário e o seletor de cores não precisa ser reaberto.
Amostras de cores não podem ser personalizadas.

Definir um manipulador de comando FontControl

Esta seção descreve as etapas necessárias para associar um Controle de Fonte a um manipulador de comando.

Aviso

Qualquer tentativa de selecionar uma amostra de cor no seletor de cores de um Controle de Fonte poderá resultar em uma violação de acesso se nenhum manipulador de comando estiver associado ao controle.

O exemplo de código a seguir demonstra como associar comandos declarados na marcação a um manipulador de comando.

//
//  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));
}

O exemplo de código a seguir ilustra como implementar o método IUICommandHandler::Execute para um Controle de Fonte.

//
//  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;
}

O exemplo de código a seguir ilustra como implementar o método IUICommandHandler::UpdateProperty para um Controle de Fonte.

//
//  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;
}

Biblioteca de Controle da Estrutura da Faixa de Opções do Windows

Elemento FontControl

Propriedades de controle de fonte

Exemplo de FontControl