Création et sélection de polices

La boîte de dialogue Police commune simplifie le processus de création et de sélection de polices. En initialisant la structure CHOOSEFONT et en appelant la fonction CHOOSEFONT , une application peut prendre en charge la même interface de sélection de police qu’auparavant de nombreuses lignes de code personnalisé. (Pour plus d’informations sur la boîte de dialogue Police commune, voir Bibliothèque de boîtes de dialogue communes.)

Sélection par l’utilisateur

La plupart des opérations de création et de sélection de police impliquent l’utilisateur. Par exemple, les applications de traitement de texte permettent à l’utilisateur de sélectionner des polices uniques pour les titres, les notes de bas de page et le corps du texte. Une fois que l’utilisateur a sélectionné une police à l’aide de la boîte de dialogue Police et appuie sur le bouton OK , la fonction CHOOSEFONT initialise les membres d’une structure LOGFONT avec les attributs de la police demandée. Pour utiliser cette police pour les opérations de sortie de texte, une application doit d’abord créer une police logique, puis sélectionner cette police dans son contexte d’appareil. Une police logique est une description fournie par l’application d’une police idéale. Un développeur peut créer une police logique en appelant les fonctions CreateFont ou CreateFontIndirect . Dans ce cas, l’application appelle CreateFontIndirect et fournit un pointeur vers la structure LOGFONT initialisée par CHOOSEFONT. En général, il est plus efficace d’appeler CreateFontIndirect , car CreateFont nécessite plusieurs paramètres, tandis que CreateFontIndirect ne nécessite qu’un seul pointeur vers LOGFONT.

Pour qu’une application puisse réellement commencer à dessiner du texte avec une police logique, elle doit trouver la correspondance la plus proche des polices stockées en interne sur l’appareil et les polices dont les ressources ont été chargées dans le système d’exploitation. Les polices stockées sur l’appareil ou dans le système d’exploitation sont appelées polices physiques. Le processus de recherche de la police physique qui correspond le plus étroitement à une police logique spécifiée est appelé mappage de polices. Ce processus se produit lorsqu’une application appelle la fonction SelectObject et fournit un handle identifiant une police logique. Le mappage de polices est effectué à l’aide d’un algorithme interne qui compare les attributs de la police logique demandée aux attributs des polices physiques disponibles. Lorsque l’algorithme du mappeur de police termine sa recherche et détermine la correspondance la plus proche possible, la fonction SelectObject retourne et l’application peut commencer à dessiner du texte avec la nouvelle police.

La fonction SetMapperFlags spécifie si l’algorithme de mappeur de police recherche uniquement les polices physiques avec des proportions qui correspondent à l’appareil physique. Le rapport d’aspect d’un appareil est le rapport formé par la largeur et la hauteur d’un pixel sur cet appareil.

La police système (également appelée interpréteur de commandes ou police par défaut) est la police utilisée pour le texte dans les barres de titre, les menus et les boîtes de dialogue.

Considérations relatives à la sélection de polices spéciales

Bien que la plupart des opérations de sélection de police impliquent l’utilisateur, il existe certaines instances où cela n’est pas vrai. Par exemple, un développeur peut utiliser une police unique dans une application pour dessiner du texte dans une fenêtre de contrôle. Pour sélectionner une police appropriée, l’application doit être en mesure de déterminer les polices disponibles, de créer une police logique qui décrit l’une de ces polices disponibles, puis de sélectionner cette police dans le contexte de périphérique approprié.

Une application peut énumérer les polices disponibles à l’aide des fonctions EnumFonts ou EnumFontFamilies . EnumFontFamilies est recommandé, car il énumère tous les styles associés à un nom de famille. Cela peut être utile pour les polices avec de nombreux styles ou inhabituels et pour les polices qui franchissent les frontières internationales.

Une fois qu’une application a énuméré les polices disponibles et localisé une correspondance appropriée, elle doit utiliser les valeurs retournées par la fonction d’énumération de police pour initialiser les membres d’une structure LOGFONT . Ensuite, il peut appeler la fonction CreateFontIndirect , en lui transmettant un pointeur vers la structure LOGFONT initialisée. Si la fonction CreateFontIndirect réussit, l’application peut ensuite sélectionner la police logique en appelant la fonction SelectObject . Lors de l’initialisation des membres de la structure LOGFONT , veillez à spécifier un jeu de caractères spécifique dans le membre lfCharSet . Ce membre est important dans le processus de mappage de police et les résultats sont incohérents si ce membre n’est pas initialisé correctement. Si vous spécifiez un nom de police dans le membre lfFaceName de la structure LOGFONT , assurez-vous que la valeur lfCharSet correspond au jeu de caractères de la police spécifiée dans lfFaceName. Par exemple, si vous souhaitez sélectionner une police telle que MS Mincho, lfCharSet doit être définie sur la valeur prédéfinie SHIFTJIS_CHARSET.

Les polices de nombreuses langues d’Asie de l’Est ont deux noms de police : un nom anglais et un nom localisé. CreateFont, CreateFontIndirect et CreateFontIndirectEx prennent le nom de police localisé pour les paramètres régionaux système qui correspondent à la langue, mais ils prennent le nom de police anglais pour tous les autres paramètres régionaux système. La meilleure méthode consiste à essayer un nom et, en cas d’échec, essayez l’autre. Notez que EnumFonts, EnumFontFamilies et EnumFontFamiliesEx retournent le nom de police en anglais si les paramètres régionaux système ne correspondent pas à la langue de la police. À compter de Windows 2000, il ne s’agit plus d’un problème, car le mappeur de police pour CreateFont, CreateFontIndirectEx et CreateFontIndirectEx reconnaît l’un ou l’autre nom de police, indépendamment des paramètres régionaux.