2010-03-11 18 views
7

Supposons que vous ayez une chaîne avec du texte dans deux ou plusieurs scripts. Lorsque vous utilisez une fonction GDI comme TextOut, (versions modernes de) Windows fera "font-linking". C'est-à-dire que GDI dessine ce qu'il peut avec la police sélectionnée et dessine le reste dans une police appropriée qu'il choisit automagiquement. Par exemple, si une partie de votre texte est en anglais (en utilisant l'alphabet romain) et qu'une partie est en chinois (en utilisant les caractères CJK) et que vous avez sélectionné Arial, la partie en anglais sera dessinée en Arial et la partie en chinois être dessiné dans une autre police qui a les glyphes CJK.Est-il possible de déterminer les polices que Windows choisit pour la liaison de fontes?

Ma question est, est-il un moyen de déterminer quelles polices TextOut choisira (ou a choisi) pour la liaison des polices?

Je dois dessiner du texte avec l'API Uniscribe de bas niveau, qui ne fait pas de liaison de police automatique. J'ai implémenté ma propre liaison de police, mais parfois mon algorithme choisit une police différente de TextOut pour le même texte. J'essaie de mieux comprendre l'algorithme de Windows, mais je ne suis pas vraiment bon pour identifier les polices à vue (surtout dans les scripts non familiers).

Répondre

2

La police est sélectionnée par une entrée de registre. Il est bien décrit dans this article. Citant la partie pertinente:

Si la liaison de polices est activé sur votre appareil , vous pouvez examiner le registre en énumérant les sous-clés de la clé de Registre à HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ FontLink \ SystemLink pour déterminer les mappages des polices liées aux polices de base. Vous pouvez ajouter des liens en utilisant Regedit pour créer des sous-clés supplémentaires .

+3

Merci, c'est une excellente ressource. Mais j'ai lu dans un autre blog que ces clés de registre sont là juste pour la rétrocompatibilité et qu'elles ne conduisent plus vraiment les polices. Par exemple, sur ma machine, TextOut effectuera une liaison de polices pour les polices de base qui ne sont pas dans cette partie du registre. Et ce n'est pas non plus une solution de secours, car les polices sélectionnées pour les autres scripts sont différentes en fonction de la police de base. –

+0

Extrayez IMLangFontLink: http://msdn.microsoft.com/en-us/library/aa767872%28v=VS.85%29.aspx –

+0

J'ai utilisé IMLangFontLink2 dans une itération antérieure, mais cela a causé des problèmes lorsque j'ai mélangé des scripts LTR avec des scripts RTL. Je pense que c'est une vieille solution et il reste probablement pour la rétrocompatibilité. –