Зеркальный текст при изменении стиля комбинированного списка RTL
Я пытаюсь создать динамический диалог, в котором можно сделать RTL в зависимости от языка. Но у меня есть следующая проблема: всякий раз, когда я изменяю стиль RTL поля со списком, текст появляется в обратном порядке. Я пытался использовать такие функции, как InvalidateRect
, RedrawWindow
и т. д., но не может заставить его работать правильно.
Соответствующий код (WinAPI с WTL):
CComboBox combo = hWndCtl;
if(combo.GetCurSel() == 0)
combo.ModifyStyleEx(WS_EX_LAYOUTRTL, 0);
else
combo.ModifyStyleEx(0, WS_EX_LAYOUTRTL);
Демонстрационный проект: здесь.
Демонстрация вопроса:
1 ответ
Кажется, вы отвечаете на CBN_SELCHANGE
уведомление. Это уведомление отправляется после того, как выпадающий список устанавливает текст в поле ввода.
Вы должны ответить на CBN_SELENDOK
вместо. CBN_SELENDOK
отправлено раньше CBN_SELCHANGE
, это дает вам время изменить стиль, прежде чем combobox установит текст.
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;