Condividi tramite


Controllo carattere

Per semplificare l'integrazione e la configurazione del supporto dei tipi di carattere nelle applicazioni che richiedono funzionalità di elaborazione di parole e modifica del testo, il framework della barra multifunzione di Windows offre un controllo carattere specializzato che espone un'ampia gamma di proprietà del tipo di carattere, ad esempio il nome del carattere, lo stile, lo stile, la dimensione del punto e gli effetti.

Introduzione

Il controllo carattere è un controllo composito costituito da pulsanti, pulsanti attivati, caselle di riepilogo a discesa e caselle combinate, tutte usate per specificare una determinata proprietà del carattere o un'opzione di formattazione.

La schermata seguente mostra il controllo carattere della barra multifunzione in WordPad per Windows 7.

screenshot dell'elemento fontcontrol con l'attributo richfont impostato su true.

Esperienza coerente

Come controllo barra multifunzione predefinito, il controllo carattere migliora la gestione complessiva dei tipi di carattere, la selezione e la formattazione e offre un'esperienza utente completa e coerente in tutte le applicazioni della barra multifunzione.

Questa esperienza coerente include

  • Formattazione e selezione standard dei tipi di carattere nelle applicazioni della barra multifunzione.

  • Rappresentazione standard dei caratteri tra applicazioni della barra multifunzione.

  • Automatico, in Windows 7, l'attivazione dei tipi di carattere basata sull'impostazione Mostra o Nascondi per ogni tipo di carattere nel pannello di controllo Tipi di carattere. Il controllo carattere visualizza solo i tipi di carattere impostati su Mostra.

    Nota

    In Windows Vista il pannello di controllo Tipi di carattere non offre la funzionalità Mostra o Nascondi , quindi tutti i tipi di carattere vengono attivati.

  • Gestione dei tipi di carattere disponibile direttamente dal controllo.

    La schermata seguente mostra che il pannello di controllo Tipi di carattere può essere accessibile direttamente dal controllo carattere.

    screenshot dell'elenco di famiglie di caratteri in wordpad per windows 7.

  • Supporto per l'anteprima automatica.

  • Esposizione dei tipi di carattere più rilevanti per un utente, ad esempio

    • Elenchi di caratteri localizzati per gli utenti internazionali.
    • Elenchi di caratteri in base al dispositivo di input.

    Nota

    Il supporto per questa funzionalità non è disponibile in alcuna piattaforma precedente a Windows 7.

Facile integrazione e configurazione

Fornendo funzionalità standard, riutilizzabili e facilmente utilizzate, il controllo carattere della barra multifunzione semplifica l'integrazione del supporto del tipo di carattere in un'applicazione.

I dettagli della selezione e della formattazione dei tipi di carattere vengono inseriti in un elemento logico autonomo che

  • Elimina la gestione complessa delle interdipendenza dei controlli tipici delle implementazioni dei controlli dei tipi di carattere.
  • Richiede un singolo gestore comandi per tutte le funzionalità esposte dai sotto-controlli controllo carattere.

Questo singolo gestore comandi consente al controllo carattere di gestire la funzionalità di vari sotto-controlli internamente; un sotto-controllo non interagisce mai direttamente con l'applicazione, indipendentemente dalla sua funzione.

Altre funzionalità del controllo carattere includono

  • Generazione automatica e con riconoscimento DPI di una rappresentazione bitmap WYSIWYG (ciò che viene visualizzato) per ogni tipo di carattere nel menu Famiglia di caratteri.

  • Integrazione di Windows Graphics Device Interface (GDI).

  • Bitmap della famiglia di caratteri localizzate e descrizioni comandi.

  • Enumerazione del tipo di carattere, raggruppamento e metadati per la gestione e la presentazione dei tipi di carattere.

    Nota

    Il supporto per questa funzionalità non è disponibile in alcuna piattaforma precedente a Windows 7 .

  • Selezione colori testo e colore evidenziazione testo che rispecchiano il comportamento selezione colori barra multifunzione.

  • Supporto dell'anteprima automatica in base a tutti i controlli secondari basati sulla raccolta di tipi di carattere: famiglia di caratteri, dimensioni del carattere, colore del testo e colore evidenziazione testo.

Allineamento con strutture di testo GDI comuni

I componenti dello stack di testo di Windows Graphics Device Interface (GDI) vengono usati per esporre la selezione e la formattazione dei tipi di carattere tramite il controllo carattere della barra multifunzione. Le varie funzionalità dei tipi di carattere supportate dalla struttura LOGFONT, la struttura CHOOSEFONT e CHARFORMAT2 vengono esposte tramite i sotto-controlli inclusi nel controllo carattere.

I controlli secondari visualizzati nel controllo carattere dipendono dal modello FontType dichiarato nel markup della barra multifunzione. I modelli FontType (descritti in dettaglio nella sezione seguente) sono progettati per allinearsi alle strutture di testo comuni di Windows Graphics Device Interface (GDI).

Aggiungere un oggetto FontControl

Questa sezione descrive i passaggi di base per l'aggiunta di un controllo carattere a un'applicazione della barra multifunzione.

Dichiarazione di un oggetto FontControl nel markup

Analogamente ad altri controlli della barra multifunzione, il controllo carattere viene dichiarato nel markup con un elemento FontControl e associato a una dichiarazione command tramite un ID comando. Quando l'applicazione viene compilata, l'ID comando viene usato per associare il comando a un gestore comandi nell'applicazione host.

Nota

Se non viene dichiarato alcun ID comando con fontControl nel markup, ne viene generato uno dal framework.

Poiché i controlli secondari del controllo carattere non vengono esposti direttamente, la personalizzazione del controllo carattere è limitata a tre modelli di layout FontType definiti dal framework.

È possibile eseguire ulteriori personalizzazioni del controllo carattere combinando il modello di layout con attributi FontControl, ad esempio IsHighlightButtonVisible, IsStrike throughButtonVisible e IsUnderlineButtonVisible.

Nota

La funzionalità dei tipi di carattere oltre a quella esposta dai modelli di controllo carattere standard e gli attributi richiede un'implementazione del controllo del carattere personalizzata esterna all'ambito di questo articolo.

Nella tabella seguente sono elencati i modelli di controllo carattere e il tipo di controllo di modifica a cui ogni modello è allineato.

Modello Supporti
FontOnly Struttura LOGFONT
FontWithColor Struttura CHOOSEFONT
RichFont Struttura CHARFORMAT2

Nella tabella seguente sono elencati i controlli associati a ogni modello e identifica i controlli facoltativi per un modello associato.

Controlli

Modelli

RichFont

FontWithColor

FontOnly

Predefinito

Facoltativo

Predefinito

Facoltativo

Predefinito

Facoltativo

Casella combinata dimensioni carattere

No

No

No

Casella combinata famiglia di caratteri

No

No

No

Pulsante Aumentare il carattere

-

-

Pulsante Compatta carattere

-

-

Pulsante Grassetto

No

No

No

Pulsante Corsivo

No

No

No

Pulsante Sottolineatura

No

Pulsante barrato

No

Pulsante di sottoscrizione

No

-

-

-

-

Pulsante di trascrizione

No

-

-

-

-

Pulsante colore evidenziazione testo

No

-

-

Pulsante Colore testo

No

No

-

-

Quando viene dichiarato il comportamento del layout di un controllo carattere, il framework della barra multifunzione fornisce un modello di layout SizeDefinition facoltativo, OneFontControlche definisce due configurazioni di controllo secondario in base alle dimensioni della barra multifunzione e allo spazio disponibile per il controllo carattere. Per altre informazioni, vedere Personalizzazione di una barra multifunzione tramite definizioni di dimensioni e criteri di scalabilità.

Aggiunta di un fontControl a una barra multifunzione

Gli esempi di codice seguenti illustrano i requisiti di markup di base per l'aggiunta di un controllo carattere a una barra multifunzione:

Questa sezione di codice mostra il markup della dichiarazione del comando FontControl , inclusi i comandi tabulazione e gruppo necessari per la visualizzazione di un controllo nella barra multifunzione.

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

Questa sezione di codice mostra il markup necessario per dichiarare e associare fontControl a un comando tramite un ID comando. Questo esempio particolare include le dichiarazioni tabulazioni e gruppi , con preferenze di ridimensionamento.

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

Aggiunta di un fontControl a un contestoPopup

L'aggiunta di un controllo carattere a un popup contesto richiede una procedura simile a quella dell'aggiunta di un controllo carattere alla barra multifunzione. Tuttavia, un controllo carattere in una miniToolbar è limitato al set di controlli secondari predefiniti comuni a tutti i modelli di controllo carattere: famiglia di caratteri, dimensioni del carattere, grassetto e corsivo.

Gli esempi di codice seguenti illustrano i requisiti di markup di base per l'aggiunta di un controllo carattere a un popup di contesto:

Questa sezione di codice mostra il markup della dichiarazione del comando FontControl richiesto per la visualizzazione di un fontControl nel contestoPopup.

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

Questa sezione di codice mostra il markup necessario per dichiarare e associare fontControl a un comando tramite un ID comando.

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

Suggerimenti per i tasti di scelta

Ogni sotto-controllo nel controllo carattere della barra multifunzione è accessibile tramite una scelta rapida da tastiera o una descrizione chiave. Questa descrizione chiave è predefinita e assegnata a ogni sotto-controllo dal framework.

Se un valore dell'attributo Keytip viene assegnato all'elemento FontControl nel markup, questo valore viene aggiunto come prefisso alla descrizione chiave definita dal framework.

Nota

L'applicazione deve applicare una regola a caratteri singolo per questo prefisso.

Nella tabella seguente sono elencate le descrizioni chiave definite dal framework.

Sotto-controllo Keytip
Famiglia di caratteri F
Stile carattere T
Dimensioni del carattere S
Aumentare il tipo di carattere G
Compattare il tipo di carattere K
Bold B
Corsivo I
Sottolineato U
barrato X
Apice Nota Y o Z : se l'attributo Keytip non è dichiarato nel markup, la descrizione chiave predefinita è Y; in caso contrario, la descrizione chiave predefinita è Keytip + Z.
Indice Una
Colore carattere C
Evidenziazione del carattere H

Il prefisso consigliato per una barra multifunzione dell'interfaccia utente multilingue (MUI) EN-US è "F", come illustrato nell'esempio seguente.

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

La schermata seguente illustra le descrizioni dei tasti di controllo carattere definite nell'esempio precedente.

schermata delle descrizioni tasti fontcontrol nel wordpad per windows 7.

File di risorse della barra multifunzione

Quando viene compilato il file di markup, viene generato un file di risorse contenente tutti i riferimenti alle risorse per l'applicazione della barra multifunzione.

Esempio di un file di risorse semplice:

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

Proprietà del controllo carattere

Il framework della barra multifunzione definisce una raccolta di chiavi di proprietà per il controllo carattere e i relativi sotto-controlli costitutivi.

In genere, una proprietà Controllo carattere viene aggiornata nell'interfaccia utente della barra multifunzione invalidando il comando associato al controllo tramite una chiamata al metodo IUIFramework::InvalidateUICommand . L'evento di invalidazione viene gestito e gli aggiornamenti delle proprietà definiti dal metodo di callback IUICommandHandler::UpdateProperty .

Il metodo di callback IUICommandHandler::UpdateProperty non viene eseguito e l'applicazione esegue una query per un valore di proprietà aggiornato, fino a quando la proprietà non è richiesta dal framework. Ad esempio, quando viene attivata una scheda e un controllo visualizzato nell'interfaccia utente della barra multifunzione o quando viene visualizzata una descrizione comando.

Nota

In alcuni casi, una proprietà può essere recuperata tramite il metodo IUIFramework::GetUICommandProperty e impostato con il metodo IUIFramework::SetUICommandProperty.

Nella tabella seguente sono elencate le chiavi delle proprietà associate al controllo carattere.

Chiave della proprietà Note
UI_PKEY_FontProperties Espone, in aggregazione come oggetto IPropertyStore , tutte le proprietà del controllo secondario del controllo carattere.
Il framework esegue una query su questa proprietà quando UI_INVALIDATIONS_VALUE viene passato come valore di flag nella chiamata a IUIFramework::InvalidateUICommand.
UI_PKEY_FontProperties_ChangedProperties Espone, in aggregazione come oggetto IUISimplePropertySet , solo le proprietà del sotto-controllo font modificate.
UI_PKEY_Keytip Può essere aggiornato solo tramite l'invalidazione.
UI_PKEY_Enabled Supporta IUIFramework::GetUICommandProperty e IUIFramework::SetUICommandProperty.

Oltre alle proprietà supportate dal controllo carattere stesso, il framework della barra multifunzione definisce anche una chiave di proprietà per ogni sotto-controllo controllo carattere. Queste chiavi di proprietà e i relativi valori vengono esposti dal framework tramite un'implementazione dell'interfaccia IPropertyStore che definisce i metodi per la gestione di una raccolta, denominata anche un contenitore di proprietà, di coppie nome e valore.

L'applicazione converte le strutture dei tipi di carattere in proprietà accessibili tramite i metodi di interfaccia IPropertyStore . Questo modello sottolinea la distinzione tra il controllo carattere e i componenti dello stack di testo GDI (Windows Graphics Device Interface) (STRUTTURA LOGFONT, STRUTTURA CHOOSEFONT e CHARFORMAT2) supportati dal framework.

Nella tabella seguente sono elencati i singoli controlli e le relative chiavi di proprietà associate.

Controlli Chiave della proprietà Note
Dimensioni carattere UI_PKEY_FontProperties_Size Quando viene evidenziata un'esecuzione di testo di dimensioni eterogenee, il framework della barra multifunzione imposta il controllo Dimensioni carattere su vuoto e il valore di UI_PKEY_FontProperties_Size su 0. Quando viene fatto clic sul pulsante Aumenta carattere o Compatta carattere, tutto il testo evidenziato viene ridimensionato, ma la differenza relativa nelle dimensioni del testo viene mantenuta.
Famiglia di caratteri UI_PKEY_FontProperties_Family I nomi della famiglia di caratteri GDI variano con le impostazioni locali del sistema. Di conseguenza, se il valore di UI_PKEY_FontProperties_Family viene mantenuto tra le sessioni dell'applicazione, tale valore deve essere recuperato in ogni nuova sessione.
Aumentare il tipo di carattere UI_PKEY_FontProperties_Size Vedere Dimensioni carattere.
Compattare il tipo di carattere UI_PKEY_FontProperties_Size Vedere Dimensioni carattere.
Grassetto UI_PKEY_FontProperties_Bold
Corsivo UI_PKEY_FontProperties_Italic
Sottolineato UI_PKEY_FontProperties_Underline
barrato UI_PKEY_FontProperties_Strikethrough
Indice UI_PKEY_FontProperties_VerticalPositioning Se il pulsante Sottoscript è impostato, non è possibile impostare anche il codice Superscript .
Apice UI_PKEY_FontProperties_VerticalPositioning Se il pulsante Superscript è impostato, non è possibile impostare anche il sottoscritto .
Colore evidenziazione del testo UI_PKEY_FontProperties_BackgroundColor, UI_PKEY_FontProperties_BackgroundColorType Fornisce la stessa funzionalità HighlightColors del modello dell'elemento DropDownColorPicker .
È consigliabile impostare solo un valore di colore di evidenziazione testo iniziale dall'applicazione. L'ultimo valore selezionato deve essere mantenuto e non impostato quando il cursore viene riposizionato all'interno di un documento. Ciò consente l'accesso rapido all'ultima selezione dell'utente e il selettore colori non deve essere riaperto.
Non è possibile personalizzare i campioni di colore.
Colore del testo UI_PKEY_FontProperties_ForegroundColor, UI_PKEY_FontProperties_ForegroundColorType Fornisce la stessa funzionalità StandardColors del modello dell'elemento DropDownColorPicker .
È consigliabile impostare solo un valore di colore testo iniziale dall'applicazione. L'ultimo valore selezionato deve essere mantenuto e non impostato quando il cursore viene riposizionato all'interno di un documento. Ciò consente l'accesso rapido all'ultima selezione dell'utente e il selettore colori non deve essere riaperto.
Non è possibile personalizzare i campioni di colore.

Definire un gestore dei comandi FontControl

Questa sezione descrive i passaggi necessari per associare un controllo carattere a un gestore comandi.

Avviso

Qualsiasi tentativo di selezionare un controllo colore dalla selezione colori di un controllo carattere può causare una violazione di accesso se nessun gestore comandi è associato al controllo.

Nell'esempio di codice seguente viene illustrato come associare i comandi dichiarati nel markup a un gestore comandi.

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

Nell'esempio di codice seguente viene illustrato come implementare il metodo IUICommandHandler::Execute per un controllo carattere.

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

Nell'esempio di codice seguente viene illustrato come implementare il metodo IUICommandHandler::UpdateProperty per un controllo carattere.

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

Libreria di controllo di Windows Ribbon Framework

Elemento FontControl

Proprietà del controllo carattere

Esempio di FontControl