更改comboboxRTL样式时出现镜像文本

我试图创build一个dynamic的对话框,可以根据语言进行RTL。 但是我有以下问题:每当我改变combobox的RTL风格,文本出现颠倒。 我尝试使用函数,如InvalidateRectRedrawWindow等,但不能使其正常工作。

相关代码(WinAPI与WTL):

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

演示项目: 在这里 。

这个问题的演示:

在这里输入图像说明

看来你正在回应CBN_SELCHANGE通知。 这是ComboBox在其编辑框中设置文本后发送的通知。

您应该回应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具有淡入/淡出效果。 如果用键盘改变组合选择,当颜色变淡时,文字仍然向后。

ComboBox有一个编辑控件可能会导致这个问题。 最好使用WS_EX_RIGHT | WS_EX_RTLREADING 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;