从右到左的阅读顺序:为什么不自动计算?
Right-to-left reading order: why isn't this calculated automatically?
在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。
大概是因为它无法确定您将在窗口级别显示什么-您可能不显示任何内容,从左向右阅读的语言或从右向左阅读的语言。因此,您需要显式地设置它,而不是让它尝试根据不完整的信息进行推断。
- 为什么不;名字在地图上是按顺序排列的吗
- 为什么不能修改对象中的值?另外,我如何改进此链表?
- 断言中的Fold表达式在某些计算机上编译,但在其他计算机上不编译
- 为什么不调用移动构造函数?(默认情况下只有构造器,没有别的)
- 模板参数列表中的 false 在模板初始化期间计算为什么?
- C++ 基本 CTOR 说明 - 为什么不调用赋值/复制构造函数
- 为什么不递增?(构造函数)
- 为什么不允许成员函数和非成员函数之间的函数重载?
- 为什么不允许使用可变长度数组作为向量元素?
- C++:为什么不调用移动构造函数?
- 在 C++ 中声明 const 对象需要用户定义的默认构造函数.如果我有一个可变成员变量,为什么不呢?
- 为什么不能用常量表达式声明数组?
- 为什么不能直接引用作用域枚举类成员,而不能为无作用域枚举生成类成员?
- 我收到此错误:错误 c2064:term 的计算结果不是采用 0 个参数的函数,但我不明白为什么
- 为什么 2 个 NULL 指针的计算结果不为 false
- 无法弄清楚为什么不计算空格数
- 为什么我的程序在另一台计算机上不起作用?
- CreateProcess在某些计算机上工作,而在其他计算机上不起作用.为什么
- 从右到左的阅读顺序:为什么不自动计算?
- 我无法弄清楚为什么这个值在一个函数中计算而不在另一个函数中计算