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

时间:2016-08-17 09:53:48

标签: windows winapi combobox wtl

我正在尝试创建一个动态对话框,可以根据语言进行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

该问题的演示:

enter image description here

1 个答案:

答案 0 :(得分:2)

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

您应该回复CBN_SELENDOK。在CBN_SELENDOK之前发送CBN_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具有淡入/淡出效果。如果使用键盘更改组合选择,当颜色渐渐消失时,文本仍会向后移动。

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;