Зеркальный текст при изменении стиля комбинированного списка 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;
Другие вопросы по тегам