Vérifiez que le texte s’affiche avec le sens de lecture correct
Certaines langues, comme l’arabe et l’hébreu, nécessitent une lecture de droite à gauche. Pour un objet de format de texte DirectWrite, le sens de lecture par défaut est de gauche à droite. DirectWrite ne déduit pas automatiquement le sens de lecture des paramètres régionaux, vous devez donc le faire vous-même.
Tout d’abord, obtenez les indicateurs de style étendu pour la fenêtre vers laquelle le texte sera rendu à l’aide de la macro GetWindowStyleEx définie dans windowsx.h.
// Get the window extended style flagsfor the current window.
DWORD dwStyle = GetWindowExStyle(hwnd_);
La macro retourne une valeur DWORD composée de plusieurs indicateurs combinés à des opérations OR au niveau du bit. Vous devez déterminer si les indicateurs spécifiques affectant le sens de lecture sont présents.
Il existe 2 indicateurs différents liés au sens de lecture : WS_EX_LAYOUTRTL et WS_EX_RTLREADING.
Utilisez l’opérateur AND au niveau du bit (&) avec la variable dwStyle et la macro WS_EX_LAYOUTRTL pour stocker une valeur BOOL qui indique si la disposition est mise en miroir.
// Is the WS_EX_LAYOUTRTL flag present?
BOOL bWSLayout = dwStyle & WS_EX_LAYOUTRTL;
Faites de même pour l’indicateur WS_EX_RTLREADING.
// Is the WS_EX_RLTREADING flag present?
BOOL bWSReading = dwStyle & WS_EX_RTLREADING;
Définissez le sens de lecture à l’aide de la méthode IDWriteTextFormat::SetReadingDirection . La valeur par défaut est de gauche à droite. Vous n’avez donc besoin de définir le sens de lecture que s’il est de droite à gauche.
Notes
WS_EX_LAYOUTRTL reflète l’ensemble de la disposition et implique le sens de lecture de droite à gauche. Par conséquent, définissez le sens de lecture uniquement si l’un de ces indicateurs est présent. Si les deux sont présents, ils s’annulent l’un l’autre et le sens de lecture pour le format de texte doit être de gauche à droite.
// If either the WS_EX_LAYOUTRTL flag or the WS_EX_RLTREADING flag is present,
// but NOT BOTH, set the reading direction to right to left.
if ((bWSLayout && !bWSReading)
|| (!bWSLayout && bWSReading))
{
pTextFormat_->SetReadingDirection(DWRITE_READING_DIRECTION_RIGHT_TO_LEFT);
}