Assicurarsi che il testo venga visualizzato con la direzione di lettura corretta
Alcune lingue, ad esempio l'arabo e l'ebraico, richiedono una direzione di lettura da destra a sinistra. Per un oggetto formato testo DirectWrite , la direzione di lettura predefinita è da sinistra a destra. DirectWrite non deduce automaticamente la direzione di lettura dalle impostazioni locali, quindi è necessario eseguire questa operazione manualmente.
Innanzitutto, ottenere i flag di stile estesi per la finestra in cui verrà eseguito il rendering del testo usando la macro GetWindowStyleEx definita in windowsx.h.
// Get the window extended style flagsfor the current window.
DWORD dwStyle = GetWindowExStyle(hwnd_);
La macro restituisce un valore DWORD costituito da diversi flag combinati con operazioni OR bit per bit. È necessario determinare se sono presenti flag specifici che influiscono sulla direzione di lettura.
Esistono due flag diversi correlati alla direzione di lettura: WS_EX_LAYOUTRTL e WS_EX_RTLREADING.
Utilizzare l'operatore AND bit per bit (&) con la variabile dwStyle e la macro WS_EX_LAYOUTRTL per archiviare un valore BOOL che indica se il layout è con mirroring.
// Is the WS_EX_LAYOUTRTL flag present?
BOOL bWSLayout = dwStyle & WS_EX_LAYOUTRTL;
Eseguire la stessa operazione per il flag di WS_EX_RTLREADING.
// Is the WS_EX_RLTREADING flag present?
BOOL bWSReading = dwStyle & WS_EX_RTLREADING;
Impostare la direzione di lettura usando il metodo IDWriteTextFormat::SetReadingDirection. Il valore predefinito è da sinistra a destra, quindi è necessario impostare la direzione di lettura solo se è da destra a sinistra.
Nota
WS_EX_LAYOUTRTL rispecchia l'intero layout e implica la direzione di lettura da destra a sinistra, quindi impostare la direzione di lettura solo se è presente uno di questi flag. Se entrambi sono presenti, annullano l'uno dall'altro e la direzione di lettura per il formato di testo deve essere da sinistra a destra.
// 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);
}