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
- Uma experiência consistente
- Fácil integração e configuração
- Alinhamento com estruturas de texto GDI comuns
- Adicionar um FontControl
- Definir um manipulador de comando FontControl
- Tópicos relacionados
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.
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.
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.
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;
}