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 polices 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 communes.)

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 titres, les notes de bas de page et le corps de texte. Une fois que l’utilisateur a sélectionné une police à l’aide de la boîte de dialogue police et qu’il 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 de périphérique. 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 requiert plusieurs paramètres alors que CreateFontIndirect requiert un seul pointeur vers LOGFONT.

Avant 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 des polices physiques. Le processus de recherche de la police physique qui correspond le mieux à 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 des 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 polices 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 polices recherche uniquement les polices physiques dont les proportions correspondent à l’appareil physique. Les proportions pour un appareil sont le rapport formé par la largeur et la hauteur d’un pixel sur cet appareil.

La police système (également appelée Shell 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 spéciales relatives à la sélection des polices

Bien que la plupart des opérations de sélection de police impliquent l’utilisateur, il y a des cas 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, de créer une police logique décrivant 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 des styles nombreux ou inhabituels et pour les polices qui traversent les bordures 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 font pour initialiser les membres d’une structure LOGFONT . Il peut ensuite appeler la fonction CreateFontIndirect , en lui transmettant un pointeur vers la structure LOGFONT initialisée. Si la fonction CreateFontIndirect est réussie, 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 des polices et les résultats seront incohérents si ce membre n’est pas correctement initialisé. 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 pour de nombreuses langues d’Extrême-Orient ont deux noms de police : un nom en anglais et un nom localisé. CreateFont, CreateFontIndirectet CreateFontIndirectEx prennent le nom de la police localisée pour les paramètres régionaux du système qui correspondent à 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 que EnumFonts, EnumFontFamilieset EnumFontFamiliesEx retournent le nom de police 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 polices pour CreateFont, CreateFontIndirectet CreateFontIndirectEx reconnaît le nom de la police, quels que soient les paramètres régionaux.