Création et sélection de polices
La boîte de dialogue Police commune simplifie le processus de création et de sélection des 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 qui nécessitait auparavant de nombreuses lignes de code personnalisé. (Pour plus d’informations sur la boîte de dialogue Police commune, consultez Bibliothèque de boîtes de dialogue commune.)
Sélection par l’utilisateur
La plupart des opérations de création et de sélection de polices impliquent l’utilisateur. Par exemple, les applications de traitement de texte permettent à l’utilisateur de sélectionner des polices uniques pour les en-têtes, 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 appuyé 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 à partir des polices stockées en interne sur l’appareil et des 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 à 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 du mappeur de police recherche uniquement les polices physiques avec des proportions correspondant à 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 des instances où cela n’est pas vrai. Par exemple, un développeur peut vouloir 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, créer une police logique qui décrit l’une de ces polices disponibles, puis sélectionner cette police dans le contexte d’appareil 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 des styles nombreux ou inhabituels et pour les polices qui traversent les frontières internationales.
Une fois qu’une application a énuméré les polices disponibles et trouvé une correspondance appropriée, elle doit utiliser les valeurs retournées par la fonction d’énumération de polices pour initialiser les membres d’une structure LOGFONT . Ensuite, il peut appeler la fonction CreateFontIndirect , en lui passant un pointeur vers la structure LOGFONT initialisée. Si la fonction CreateFontIndirect réussit, l’application peut 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 seront 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éfini 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 de type localisé pour un paramètre régional système qui correspond à la langue, mais ils prennent le nom de police en anglais pour tous les autres paramètres régionaux système. La meilleure méthode consiste à essayer un nom et, en cas d’échec, à essayer l’autre. Notez qu’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, ce n’est plus un problème, car le mappeur de police pour CreateFont, CreateFontIndirect et CreateFontIndirectEx reconnaît l’un ou l’autre nom de police, quels que soient les paramètres régionaux.