Scripts complexes
Bien que les fonctions décrites dans le précédent fonctionnent bien pour de nombreux langages, elles peuvent ne pas répondre aux besoins des scripts complexes. Les scripts complexes sont des langages dont le formulaire imprimé n’est pas rendu de manière simple. Par exemple, un script complexe peut autoriser le rendu bidirectionnel, la mise en forme contextuelle des glyphes ou la combinaison de caractères. En raison de ces exigences particulières, le contrôle de la sortie de texte doit être très flexible.
Les fonctions qui affichent du texte TextOut, ExtTextOut, TabbedTextOut, DrawText et GetTextExtentExPoint ont été étendues pour prendre en charge les scripts complexes. En général, cette prise en charge est transparente pour l’application. Toutefois, les applications doivent enregistrer des caractères dans une mémoire tampon et afficher une ligne de texte entière à la fois, afin que les modules de mise en forme de script complexes puissent utiliser le contexte pour réorganiser et générer correctement des glyphes. En outre, étant donné que la largeur d’un glyphe peut varier selon le contexte, les applications doivent utiliser GetTextExtentExPoint pour déterminer la longueur des lignes plutôt que d’utiliser des largeurs de caractères mis en cache.
En outre, les applications complexes prenant en charge les scripts doivent envisager d’ajouter la prise en charge de l’ordre de lecture de droite à gauche et de l’alignement à droite à leurs applications. Vous pouvez basculer l’ordre de lecture ou l’alignement entre la gauche et la droite avec le code suivant :
// Save lAlign (this example uses static variables)
static LONG lAlign = TA_LEFT;
// When user toggles alignment (assuming TA_CENTER is not supported).
lAlign = TA_RIGHT;
// When the user toggles reading order.
lAlign = TA_RTLREADING;
// Before calling ExtTextOut, for example, when processing WM_PAINT
SetTextAlign (hDc, lAlign);
Pour activer les deux attributs à la fois, exécutez l’instruction suivante, puis appelez SetTextAlign et ExtTextOut, comme indiqué précédemment :
lAlign = TA_RIGHT^TA_RTLREADING; //pre-inline !
Vous pouvez également traiter des scripts complexes avec Uniscribe. Uniscribe est un ensemble de fonctions qui permettent un degré de contrôle précis pour les scripts complexes. Pour plus d’informations, consultez Uniscribe and Processing Complex Scripts.