Contrôle de police

Pour simplifier l’intégration et la configuration de la prise en charge des polices dans les applications qui nécessitent des fonctionnalités de traitement de texte et d’édition de texte, l’infrastructure du ruban Windows fournit un contrôle de police spécialisé qui expose un large éventail de propriétés de police, telles que le nom de police, le style, la taille de point et les effets.

Introduction

Le contrôle de police est un contrôle composite qui se compose de boutons, de boutons bascule, de zones de liste déroulante et de zones de liste déroulante, qui sont toutes utilisées pour spécifier une propriété de police ou une option de mise en forme particulière.

La capture d’écran suivante montre le contrôle de police du ruban dans WordPad pour Windows 7.

capture d’écran de l’élément fontcontrol avec l’attribut richfont défini sur true.

Une expérience cohérente

En tant que contrôle de ruban intégré, le contrôle de police améliore la gestion globale des polices, la sélection et la mise en forme, et offre une expérience utilisateur riche et cohérente dans toutes les applications du ruban.

Cette expérience cohérente inclut

  • Mise en forme standardisée et sélection des polices dans les applications du ruban.

  • Représentation de police standardisée dans les applications du ruban.

  • Automatique, dans Windows 7, activation des polices basée sur le paramètre Afficher ou Masquer pour chaque police dans le panneau de configuration Polices . Le contrôle de police affiche uniquement les polices définies sur Afficher.

    Notes

    Dans Windows Vista, le panneau de configuration Polices n’offre pas la fonctionnalité Afficher ou Masquer , de sorte que toutes les polices sont activées.

  • Gestion des polices disponible directement à partir du contrôle.

    La capture d’écran suivante montre que le panneau de configuration Polices est accessible directement à partir du contrôle police.

    capture d’écran de la liste de familles de polices dans le bloc-notes pour windows 7.

  • Prise en charge de la préversion automatique.

  • Exposition des polices les plus pertinentes pour un utilisateur, telles que

    • Listes de polices localisées pour les utilisateurs internationaux.
    • Listes de polices basées sur le périphérique d’entrée.

    Notes

    La prise en charge de cette fonctionnalité n’est disponible sur aucune plateforme antérieure à Windows 7.

Intégration et configuration faciles

En fournissant des fonctionnalités standard, réutilisables et faciles à utiliser, le contrôle de police du ruban facilite l’intégration de la prise en charge des polices dans une application.

Les détails de la sélection et de la mise en forme des polices sont encapsulés dans un élément logique autonome qui

  • Élimine la gestion complexe des interdépendances de contrôle typiques des implémentations de contrôle de police.
  • Nécessite un seul gestionnaire de commandes pour toutes les fonctionnalités exposées par les sous-contrôles Contrôle de police.

Ce gestionnaire de commandes unique permet au contrôle de police de gérer en interne les fonctionnalités de différents sous-contrôles . un sous-contrôle n’interagit jamais directement avec l’application, quelle que soit sa fonction.

D’autres fonctionnalités du contrôle de police incluent

  • Génération automatique et prenant en charge la résolution d’une représentation bitmap WYSIWYG (ce que vous voyez est ce que vous obtenez) pour chaque police dans le menu Famille de polices .

  • Intégration de l’interface GDI (Graphics Device Interface) Windows.

  • Bitmaps et info-bulles de famille de polices localisées.

  • Énumération des polices, regroupement et métadonnées pour la gestion et la présentation des polices.

    Notes

    La prise en charge de cette fonctionnalité n’est disponible sur aucune plateforme antérieure à Windows 7.

  • Les sélecteurs de couleurs déroulantes Couleur du texte et Couleur de mise en surbrillance du texte qui miroir le comportement du sélecteur de couleurs de liste déroulante du ruban.

  • Prise en charge de l’aperçu automatique par tous les sous-contrôles basés sur la galerie Font Control : famille de polices, taille de police, couleur du texte et couleur de mise en surbrillance du texte.

Alignement avec les structures de texte GDI courantes

Les composants de pile de texte GDI (Graphics Device Interface) Windows sont utilisés pour exposer les fonctionnalités de sélection et de mise en forme des polices via le contrôle de police du ruban. Les différentes fonctionnalités de police prises en charge par la structure LOGFONT, la structure CHOOSEFONT et la structure CHARFORMAT2 sont exposées via les sous-contrôles inclus dans le contrôle de police.

Les sous-contrôles affichés dans le contrôle de police dépendent du modèle FontType déclaré dans le balisage du ruban. Les modèles FontType (décrits plus en détail dans la section suivante) sont conçus pour s’aligner sur les structures de texte courantes de l’interface GDI (Graphics Device Interface) Windows .

Ajouter un FontControl

Cette section décrit les étapes de base de l’ajout d’un contrôle de police à une application ruban.

Déclaration d’un FontControl dans le balisage

Comme les autres contrôles du ruban, le contrôle de police est déclaré dans le balisage avec un élément FontControl et associé à une déclaration Command par le biais d’un ID de commande. Lorsque l’application est compilée, l’ID de commande est utilisé pour lier la commande à un gestionnaire de commandes dans l’application hôte.

Notes

Si aucun ID de commande n’est déclaré avec fontControl dans le balisage, l’infrastructure en génère un.

Étant donné que les sous-contrôles du contrôle de police ne sont pas exposés directement, la personnalisation du contrôle de police est limitée à trois modèles de disposition FontType définis par l’infrastructure.

Vous pouvez personnaliser davantage le contrôle de police en combinant le modèle de disposition avec des attributs FontControl tels que IsHighlightButtonVisible, IsStrikethroughButtonVisible et IsUnderlineButtonVisible.

Notes

Les fonctionnalités de police au-delà de celles exposées par les modèles et attributs de contrôle de police standard nécessitent une implémentation de contrôle de police personnalisée qui n’entre pas dans le cadre de cet article.

Le tableau suivant répertorie les modèles de contrôle de police et le type de contrôle de modification sur lequel chaque modèle est aligné.

Modèle Prise en charge
FontOnly LOGFONT, structure
FontWithColor CHOOSEFONT, structure
RichFont CHARFORMAT2, structure

Le tableau suivant répertorie les contrôles associés à chaque modèle et identifie les contrôles facultatifs pour un modèle associé.

Contrôles

Modèles

RichFont

FontWithColor

FontOnly

Default

Facultatif

Default

Facultatif

Default

Facultatif

Zone de liste déroulante Taille de police

Oui

Non

Oui

Non

Oui

Non

Zone de liste déroulante Famille de polices

Oui

Non

Oui

Non

Oui

Non

Bouton Développer la police

Oui

Oui

Oui

Oui

-

-

Bouton Réduire la police

Oui

Oui

Oui

Oui

-

-

Bouton gras

Oui

Non

Oui

Non

Oui

Non

Bouton italique

Oui

Non

Oui

Non

Oui

Non

Bouton Souligner

Oui

Non

Oui

Oui

Oui

Oui

Bouton barré

Oui

Non

Oui

Oui

Oui

Oui

Bouton Indice

Oui

Non

-

-

-

-

Bouton Exposant

Oui

Non

-

-

-

-

Bouton Couleur de mise en surbrillance du texte

Oui

Non

Oui

Oui

-

-

Bouton Couleur du texte

Oui

Non

Oui

Non

-

-

Lorsque le comportement de disposition d’un contrôle de police est déclaré, l’infrastructure du ruban fournit un modèle de disposition SizeDefinition facultatif, OneFontControl, qui définit deux configurations de sous-contrôle en fonction de la taille du ruban et de l’espace disponible pour le contrôle de police. Pour plus d’informations, consultez Personnalisation d’un ruban via des définitions de taille et des stratégies de mise à l’échelle.

Ajout d’un FontControl à un ruban

Les exemples de code suivants illustrent les exigences de balisage de base pour l’ajout d’un contrôle de police à un ruban :

Cette section de code présente le balisage de déclaration de la commande FontControl , y compris les commandes Tab et Group requises pour afficher un contrôle dans le ruban.

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

Cette section de code montre le balisage requis pour déclarer et associer un FontControl à une commande via un ID de commande. Cet exemple particulier inclut les déclarations Tab et Group , avec des préférences de mise à l’échelle.

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

Ajout d’un FontControl à un ContextPopup

L’ajout d’un contrôle de police à une fenêtre contextuelle nécessite une procédure similaire à celle de l’ajout d’un contrôle de police au ruban. Toutefois, un contrôle de police dans un MiniToolbar est limité à l’ensemble des sous-contrôles par défaut qui sont communs à tous les modèles de contrôle de police : famille de polices, taille de police, gras et italique.

Les exemples de code suivants illustrent les exigences de balisage de base pour l’ajout d’un contrôle de police à une fenêtre contextuelle :

Cette section de code présente le balisage de déclaration de la commande FontControl qui est requis pour afficher un FontControl dans contextPopup.

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

Cette section de code montre le balisage requis pour déclarer et associer un FontControl à une commande via un ID de commande.

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

Touches d’accès

Chaque sous-contrôle du contrôle de police du ruban est accessible via un raccourci clavier ou une info-bulle. Cette info-bulle est prédéfinie et affectée à chaque sous-contrôle par l’infrastructure.

Si une valeur d’attribut Keytip est affectée à l’élément FontControl dans le balisage, cette valeur est ajoutée en tant que préfixe à l’info-bulle définie par l’infrastructure.

Notes

L’application doit appliquer une règle à caractère unique pour ce préfixe.

Le tableau suivant répertorie les info-bulles définies par le framework.

Sous-contrôle Info-bulle
Famille de polices F
Style de police T
Taille de police S
Faire croître la police G
Réduire la police K
Gras B
Italique I
Souligner U
Barré X
Superscript Y ou Z Remarque : si l’attribut Keytip n’est pas déclaré dans le balisage, l’info-bulle par défaut est Y ; sinon, l’info-bulle par défaut est Keytip + Z.
Indice Un
Couleur de police C
Mise en surbrillance de la police H

Le préfixe recommandé pour un ruban MULTILINGUE EN-US est « F », comme illustré dans l’exemple suivant.

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

La capture d’écran suivante illustre les info-bulles du contrôle de police telles qu’elles sont définies dans l’exemple précédent.

capture d’écran des info-bulles fontcontrol dans le bloc-notes pour windows 7.

Fichier de ressources du ruban

Lorsque le fichier de balisage est compilé, un fichier de ressources qui contient toutes les références de ressources pour l’application Ruban est généré.

Exemple de fichier de ressources simple :

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

Propriétés du contrôle de police

L’infrastructure du ruban définit une collection de clés de propriété pour le contrôle de police et ses sous-contrôles constitutifs.

En règle générale, une propriété Font Control est mise à jour dans l’interface utilisateur du ruban en invalidant la commande associée au contrôle par un appel à la méthode IUIFramework::InvalidateUICommand . L’événement d’invalidation est géré et les mises à jour de propriété définies par la méthode de rappel IUICommandHandler::UpdateProperty .

La méthode de rappel IUICommandHandler::UpdateProperty n’est pas exécutée et l’application interrogée pour obtenir une valeur de propriété mise à jour, jusqu’à ce que la propriété soit requise par le framework. Par exemple, lorsqu’un onglet est activé et qu’un contrôle est révélé dans l’interface utilisateur du ruban, ou lorsqu’une info-bulle est affichée.

Notes

Dans certains cas, une propriété peut être récupérée via la méthode IUIFramework::GetUICommandProperty et définie avec la méthode IUIFramework::SetUICommandProperty .

Le tableau suivant répertorie les clés de propriété associées au contrôle de police.

Clé de propriété Notes
UI_PKEY_FontProperties Expose, dans l’agrégat en tant qu’objet IPropertyStore , toutes les propriétés de sous-contrôle Font Control.
Le framework interroge cette propriété quand UI_INVALIDATIONS_VALUE est passé comme valeur d’indicateurs dans l’appel à IUIFramework::InvalidateUICommand.
UI_PKEY_FontProperties_ChangedProperties Expose, dans l’agrégat en tant qu’objet IUISimplePropertySet , uniquement les propriétés de sous-contrôle Font Control qui ont changé.
UI_PKEY_Keytip Peut être mis à jour uniquement par invalidation.
UI_PKEY_Enabled Prend en charge IUIFramework::GetUICommandProperty et IUIFramework::SetUICommandProperty.

En plus des propriétés prises en charge par le contrôle de police lui-même, l’infrastructure du ruban définit également une clé de propriété pour chaque sous-contrôle Contrôle de police. Ces clés de propriété et leurs valeurs sont exposées par l’infrastructure via une implémentation d’interface IPropertyStore qui définit les méthodes de gestion d’une collection, également appelée conteneur de propriétés, de paires nom-valeur.

L’application traduit les structures de police en propriétés accessibles via les méthodes d’interface IPropertyStore . Ce modèle met l’accent sur la distinction entre le contrôle de police et les composants de pile de texte GDI (Windows Graphics Device Interface) (structure LOGFONT, STRUCTURE CHOOSEFONT et STRUCTURE CHARFORMAT2) pris en charge par l’infrastructure.

Le tableau suivant répertorie les contrôles individuels et leurs clés de propriété associées.

Contrôles Clé de propriété Notes
Taille de la police UI_PKEY_FontProperties_Size Lorsqu’une exécution de texte de taille hétérogène est mise en surbrillance, l’infrastructure du ruban définit le contrôle Taille de police sur vide et la valeur de UI_PKEY_FontProperties_Size sur 0. Lorsque vous cliquez sur le bouton Augmenter la police ou Réduire la police , tout le texte en surbrillance est redimensionné, mais la différence relative de tailles de texte est conservée.
Famille de polices UI_PKEY_FontProperties_Family Les noms de familles de polices GDI varient selon les paramètres régionaux système. Par conséquent, si la valeur de UI_PKEY_FontProperties_Family est conservée entre les sessions d’application, cette valeur doit être récupérée à chaque nouvelle session.
Faire croître la police UI_PKEY_FontProperties_Size Voir Taille de police.
Réduire la police UI_PKEY_FontProperties_Size Voir Taille de police.
Gras UI_PKEY_FontProperties_Bold
Italique UI_PKEY_FontProperties_Italic
Souligner UI_PKEY_FontProperties_Underline
Barré UI_PKEY_FontProperties_Strikethrough
Indice UI_PKEY_FontProperties_VerticalPositioning Si le bouton Indice est défini, l’exposant ne peut pas également être défini.
Superscript UI_PKEY_FontProperties_VerticalPositioning Si le bouton Exposant est défini, l’Indice ne peut pas également être défini.
Couleur de surbrillance du texte UI_PKEY_FontProperties_BackgroundColor, UI_PKEY_FontProperties_BackgroundColorType Fournit les mêmes fonctionnalités que le HighlightColors modèle de l’élément DropDownColorPicker .
Nous recommandons vivement que seule une valeur de couleur de surbrillance texte initiale soit définie par l’application. La dernière valeur sélectionnée doit être conservée et non définie lorsque le curseur est repositionné dans un document. Cela permet un accès rapide à la dernière sélection de l’utilisateur, et le sélecteur de couleurs n’a pas besoin d’être rouvert.
Les nuances de couleur ne peuvent pas être personnalisées.
Couleur du texte UI_PKEY_FontProperties_ForegroundColor, UI_PKEY_FontProperties_ForegroundColorType Fournit les mêmes fonctionnalités que le StandardColors modèle de l’élément DropDownColorPicker .
Nous recommandons vivement que seule une valeur de couleur texte initiale soit définie par l’application. La dernière valeur sélectionnée doit être conservée et non définie lorsque le curseur est repositionné dans un document. Cela permet un accès rapide à la dernière sélection de l’utilisateur, et le sélecteur de couleurs n’a pas besoin d’être rouvert.
Les nuances de couleur ne peuvent pas être personnalisées.

Définir un gestionnaire de commandes FontControl

Cette section décrit les étapes nécessaires pour lier un contrôle de police à un gestionnaire de commandes.

Avertissement

Toute tentative de sélection d’une nuance de couleur à partir du sélecteur de couleurs d’un contrôle de police peut entraîner une violation d’accès si aucun gestionnaire de commande n’est associé au contrôle.

L’exemple de code suivant montre comment lier des commandes déclarées dans le balisage à un gestionnaire de commandes.

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

L’exemple de code suivant montre comment implémenter la méthode IUICommandHandler::Execute pour un contrôle de police.

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

L’exemple de code suivant montre comment implémenter la méthode IUICommandHandler::UpdateProperty pour un contrôle de police.

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

Bibliothèque de contrôles de l’infrastructure du ruban Windows

Élément FontControl

Propriétés du contrôle de police

FontControl, exemple