2010-05-18 7 views
5

Étant donnée une HFONT, comment puis-je savoir si c'est une police de symbole? Une bibliothèque pdf que j'utilise doit traiter les polices de symboles différemment, j'ai donc besoin d'un moyen de dire par programme si une police donnée est une police de symbole ou non.Comment savoir si une police est une police de symbole?

Répondre

5

Utilisez GetObject pour obtenir les propriétés de la police à une structure LOGFONT. Vérifiez le membre lfCharSet; si c'est SYMBOL_CHARSET, vous avez une police de symbole.

+0

Dayum! Je viens de lire la page LOGFONT à http://msdn.microsoft.com/en-us/library/dd145037%28v=VS.85%29.aspx et tu me bats à la réponse ... –

+0

Ce sera probablement dans la pratique, mais en théorie, il pourrait échouer. GetObject renvoie une copie de LOGFONT qui a été utilisée pour spécifier la police. Mais le mappeur de police aurait pu substituer une police différente. Bien qu'il semble extrêmement improbable que ce soit sous une police de symbole pour une police textuelle (ou vice versa), cela pourrait arriver en théorie. Il est donc préférable de vérifier le champ tmCharSet dans le TEXTMETRIC retourné par GetTextMetrics, car cela devrait représenter la police réelle plutôt que la police logique. –

+0

@AdrianMcCarthy Je pensais que '' GetObject' renvoie une LOGFONT' de la police qui a été effectivement sélectionné, pas celui qui a été initialement demandé; il pourrait être intéressant de vérifier une expérience, sauf si vous avez un lien corroborant. Si vous pensez que GetTextMetrics est meilleur, une autre réponse serait la bienvenue. –

1

La réponse de Mark Ransom va travailler 99,999% du temps, mais il y a une possibilité théorique que cela pourrait donner une mauvaise réponse.

Pour éviter cette possibilité, vous devez utiliser GetTextMetrics pour obtenir le TEXTMETRICS de la police réelle et vérifier si le tmCharSet est SYMBOL_CHARSET.

Quelle est la différence entre la vérification lfCharSet et tmCharSet? Lorsque vous créez un HFONT, Windows effectue une copie interne de LOGFONT. Il décrit la police que vous voulez, qui pourrait être différente de la police que vous obtenez.

Lorsque vous sélectionnez le HFONT dans un contexte appareil (ou information), le mappeur de police trouve la police réelle qui correspond le mieux à la LOGFONT associée à ce HFONT. Le meilleur match, cependant, pourrait ne pas correspondre exactement. Ainsi, lorsque vous avez besoin de savoir quelque chose au sujet de la police réelle, vous devez prendre soin d'interroger le HDC plutôt que le HFONT.

Si vous interrogez le HFONT avec GetObject, vous obtenez juste l'original LOGFONT de retour. GetObject ne vous dit rien au sujet de la police réelle, car il ne sait pas quelle police réelle le mappeur de police a choisi (ou choisira). Les API qui interrogent sur la police sélectionnée dans un contrôleur de domaine particulier, comme GetTextMetrics, GetTextFace, etc., vous donneront des informations sur la police actuelle.

Pour ce problème, la réponse de Mark (utilisant GetObject) va probablement toujours fonctionner, car les chances que le mappeur de police choisisse une police de symbole lorsque vous voulez une police textuelle (ou vice versa) sont minuscules. En général, cependant, lorsque vous voulez savoir quelque chose sur la police réelle, trouver un moyen de demander au HDC.

Questions connexes