我正在尝试创建一个动态对话框,可以根据语言进行RTL。但我有以下问题:每当我更改组合框的RTL样式时,文本都会反转。我尝试使用InvalidateRect
,RedrawWindow
等功能,但无法使其正常工作。
相关代码(带WTL的WinAPI):
CComboBox combo = hWndCtl;
if(combo.GetCurSel() == 0)
combo.ModifyStyleEx(WS_EX_LAYOUTRTL, 0);
else
combo.ModifyStyleEx(0, WS_EX_LAYOUTRTL);
演示项目:here。
该问题的演示:
答案 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;