Sicherstellen, dass Text mit der richtigen Leserichtung angezeigt wird
Für einige Sprachen, z. B. Arabisch und Hebräisch, ist eine Leserichtung von rechts nach links erforderlich. Bei einem DirectWrite Textformatobjekt ist die Standardleserichtung von links nach rechts. DirectWrite leitet die Leserichtung nicht automatisch aus dem Gebietsschema ab, sodass Sie dies selbst tun müssen.
Rufen Sie zunächst die erweiterten Formatvorlagenflags für das Fenster ab, in dem der Text mithilfe des in windowsx.h definierten Makros GetWindowStyleEx gerendert wird.
// Get the window extended style flagsfor the current window.
DWORD dwStyle = GetWindowExStyle(hwnd_);
Das Makro gibt einen DWORD-Wert zurück, der aus mehreren Flags in Kombination mit bitweisen OR-Vorgängen besteht. Sie müssen bestimmen, ob die spezifischen Flags, die sich auf die Leserichtung auswirken, vorhanden sind.
Es gibt zwei verschiedene Flags, die sich auf die Leserichtung beziehen: WS_EX_LAYOUTRTL und WS_EX_RTLREADING.
Verwenden Sie den bitweisen AND-Operator (&) mit der dwStyle-Variablen und dem makro WS_EX_LAYOUTRTL, um einen BOOL-Wert zu speichern, der angibt, ob das Layout gespiegelt wird.
// Is the WS_EX_LAYOUTRTL flag present?
BOOL bWSLayout = dwStyle & WS_EX_LAYOUTRTL;
Führen Sie dasselbe für das flag WS_EX_RTLREADING aus.
// Is the WS_EX_RLTREADING flag present?
BOOL bWSReading = dwStyle & WS_EX_RTLREADING;
Legen Sie die Leserichtung mithilfe der IDWriteTextFormat::SetReadingDirection-Methode fest. Der Standardwert ist von links nach rechts, sodass Sie die Leserichtung nur festlegen müssen, wenn sie von rechts nach links ist.
Hinweis
WS_EX_LAYOUTRTL spiegelt das gesamte Layout und impliziert die Leserichtung von rechts nach links. Legen Sie daher die Leserichtung nur fest, wenn eines dieser Flags vorhanden ist. Wenn beide vorhanden sind, brechen sie sich gegenseitig ab, und die Leserichtung für das Textformat sollte von links nach rechts liegen.
// 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);
}