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);
}