从右到左的阅读顺序:为什么不自动计算?

Right-to-left reading order: why isn't this calculated automatically?

本文关键字:计算 为什么不 顺序 从右到左      更新时间:2023-10-16

在Visual Studio中,您需要设置扩展窗口样式以获得从右到左的读取顺序(ws_ex_layouttl)。为什么需要这样做,因为如果我使用UNICODE并显示阿拉伯字符,那么唯一可能的显示方式是从右向左?我很惊讶这个系统没有简单地以正确的方式呈现它。注意:这是在Windows Mobile系统上,我复制了Arial Unicode的MS字体,这也许可以解释为什么它不能处理。

Windows对RTL的支持比文本更复杂:ws_ex_layouttl实际上是关于控制窗口中其他元素的布局-来自MSDN:

窗口布局适用于文本,但也会影响窗口的其他GDI元素,包括位图、图标、原点的位置、按钮、层叠树控件,以及水平坐标在向左或向右移动时是否增加。例如,在应用程序设置了RTL布局后,原点位于窗口或设备的右边缘,并且表示水平坐标的数字随着向左移动而增加。

因此,如果你创建一个具有此功能的对话框,该对话框将自动"翻转"(因为坐标颠倒了)。如果存在滚动条,它将位于窗口的左侧,而不是右侧。树视图的展开/折叠框和连接线在右边,而不是左边,以此类推。

在不包含其他窗口的静态情况下,样式可能不会产生太大的差异-但它可能会翻转对齐:使用SS_RIGHT右对齐的静态可能最终在使用ws_ex_layouttl时实际上是左对齐的。

另外,正如另一个答案所指出的,并非所有文本都是一种语言的跨度。有可能使用单个字符串混合脚本:您可以在R-to-L中使用L-to-R跨度,反之亦然,因此让Windows根据所使用的文本"做正确的事情"将非常脆弱。

还考虑在阿拉伯语系统上显示文件名的树视图的情况:即使用户碰巧浏览的目录或文件系统碰巧有英文文件名,树视图也应该保持从右到左的布局(与右侧对齐)。

长话短说:ws_ex_layouttl实际上是关于整个窗口布局,而不是具体的文本方向本身。即使没有这个标志,如果使用标准api/控件,您仍然可以将阿拉伯语/希伯来语正确地呈现为r到l。

大概是因为它无法确定您将在窗口级别显示什么-您可能不显示任何内容,从左向右阅读的语言或从右向左阅读的语言。因此,您需要显式地设置它,而不是让它尝试根据不完整的信息进行推断。