更改组合框 RTL 样式时的镜像文本
Mirrored text when changing a combobox RTL style
我正在尝试创建一个动态对话框,可以根据语言将其设为 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。
问题演示:
您似乎正在回复 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 具有淡入淡出 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;
我正在尝试创建一个动态对话框,可以根据语言将其设为 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。
问题演示:
您似乎正在回复 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 具有淡入淡出 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;