更改组合框 RTL 样式时的镜像文本

Mirrored text when changing a combobox RTL style

我正在尝试创建一个动态对话框,可以根据语言将其设为 RTL。但我有以下问题:每当我更改组合框的 RTL 样式时,文本就会颠倒过来。我尝试使用InvalidateRectRedrawWindow等函数,但无法使其正常工作。

相关代码(带WTL的WinAPI):

CComboBox combo = hWndCtl;
if(combo.GetCurSel() == 0)
    combo.ModifyStyleEx(WS_EX_LAYOUTRTL, 0);
else
    combo.ModifyStyleEx(0, WS_EX_LAYOUTRTL);

一个演示项目:here

问题演示:

您似乎正在回复 CBN_SELCHANGE 通知。这是在组合框在其编辑框中设置文本后发送的通知。

您应该回复 CBN_SELENDOKCBN_SELENDOKCBN_SELCHANGE 之前发送,这让您有时间在组合框设置文本之前修改样式。

switch (HIWORD(wParam))
{
case CBN_SELENDOK:// CBN_SELCHANGE:
    if (SendMessage(hComboBox, CB_GETCURSEL, 0, 0) == 0)
        ModifyStyleEx(hComboBox, WS_EX_LAYOUTRTL, 0);
    else
        ModifyStyleEx(hComboBox, 0, WS_EX_LAYOUTRTL);
    break;
default:break;
}



编辑:Windows 10 具有淡入淡出 in/out 效果。如果您使用键盘更改组合选择,当颜色变淡时,文本仍然向后移动。

ComboBox 有一个可能导致此问题的编辑控件。最好使用 WS_EX_RIGHT | WS_EX_RTLREADING 而不是 WS_EX_LAYOUTRTL。这也适用于 CBN_SELCHANGE.

case CBN_SELENDOK: //(or CBN_SELCHANGE)
    if (SendMessage(hComboBox, CB_GETCURSEL, 0, 0) == 0)
        ModifyStyleEx(hComboBox, WS_EX_RIGHT | WS_EX_RTLREADING, 0);
    else
        ModifyStyleEx(hComboBox, 0, WS_EX_RIGHT | WS_EX_RTLREADING);
    break;