确保文本以正确的阅读方向显示
某些语言(如阿拉伯语和希伯来语)需要从右到左的阅读方向。 对于DirectWrite文本格式对象,默认阅读方向为从左到右。 DirectWrite不会自动从区域设置推断出读取方向,因此必须自行执行此操作。
首先,使用 windowsx.h 中定义的 GetWindowStyleEx 宏获取文本将呈现到的窗口的扩展样式标志。
// Get the window extended style flagsfor the current window.
DWORD dwStyle = GetWindowExStyle(hwnd_);
宏返回一个 DWORD 值,该值由多个标志与按位 OR 操作组合而成。 必须确定是否存在影响阅读方向的特定标志。
有 2 个不同的标志与阅读方向相关:WS_EX_LAYOUTRTL和WS_EX_RTLREADING。
使用按位 AND 运算符 (&) dwStyle 变量和 WS_EX_LAYOUTRTL 宏来存储指示布局是否镜像的 BOOL 值。
// Is the WS_EX_LAYOUTRTL flag present?
BOOL bWSLayout = dwStyle & WS_EX_LAYOUTRTL;
对 WS_EX_RTLREADING 标志执行相同操作。
// Is the WS_EX_RLTREADING flag present?
BOOL bWSReading = dwStyle & WS_EX_RTLREADING;
使用 IDWriteTextFormat::SetReadingDirection 方法设置阅读方向。 默认值为从左到右,因此只需设置从右到左的阅读方向。
注意
WS_EX_LAYOUTRTL镜像整个布局并表示从右到左的阅读方向,因此仅当存在其中一个标志时设置阅读方向。 如果两者都存在,则它们相互取消,文本格式的阅读方向应为从左到右。
// 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);
}