Compartir a través de


Asegúrese de que el texto se muestra con la dirección de lectura correcta.

Algunos idiomas, como árabe y hebreo, requieren una dirección de lectura de derecha a izquierda. Para un objeto de formato de texto DirectWrite, la dirección de lectura predeterminada es de izquierda a derecha. DirectWrite no deduce automáticamente la dirección de lectura de la configuración regional, por lo que debe hacerlo usted mismo.

En primer lugar, obtenga las marcas de estilo extendidas de la ventana en la que se representará el texto mediante la macro GetWindowStyleEx definida en windowsx.h.

// Get the window extended style flagsfor the current window.
DWORD dwStyle = GetWindowExStyle(hwnd_);

La macro devuelve un valor DWORD formado por varias marcas combinadas con operaciones OR bit a bit. Debe determinar si hay marcas específicas que afectan a la dirección de lectura.

Hay 2 marcas diferentes relacionadas con la dirección de lectura: WS_EX_LAYOUTRTL y WS_EX_RTLREADING.

Use el operador AND bit a bit (&) con la variable dwStyle y la macro WS_EX_LAYOUTRTL para almacenar un valor BOOL que indica si se refleja el diseño.

// Is the WS_EX_LAYOUTRTL flag present?
BOOL bWSLayout = dwStyle & WS_EX_LAYOUTRTL;

Haga lo mismo para la marca WS_EX_RTLREADING.

// Is the WS_EX_RLTREADING flag present?
BOOL bWSReading = dwStyle & WS_EX_RTLREADING;

Establezca la dirección de lectura mediante el método IDWriteTextFormat::SetReadingDirection . El valor predeterminado es de izquierda a derecha, por lo que solo tiene que establecer la dirección de lectura si está de derecha a izquierda.

Nota

WS_EX_LAYOUTRTL refleja todo el diseño e implica la dirección de lectura de derecha a izquierda, por lo que establece la dirección de lectura solo si hay una de estas marcas. Si ambos están presentes, se cancelan entre sí y la dirección de lectura del formato de texto debe ser de izquierda a derecha.

 

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