CComboBox не выбирает CurSel, когда выпадает

У меня есть сортировка по алфавиту в диалоговом окне. Эта комбинация содержит несколько строк, но некоторые дублируются в разных случаях. у нас есть «On» и «ON», «Off» и «OFF». Это может показаться излишним, но есть причина, хотя сейчас это не важно.

Дубликаты, очевидно, появляются в списке одна за другой, строки с заглавными буквами в первую очередь. т.е .:

OFF

от

НА

На

Когда пользователь выбирает «Вкл.» (Нижний регистр), правильный индекс устанавливается как CurSel, и отображается правильная строка. Однако, когда я щелкаю стрелку в выпадающем списке, чтобы раскрыть список, он выделяет не CurSel, а предыдущую строку с заглавной строкой. Смотрите изображения ниже.

Это было выбрано в выпадающем списке:

Выбранный элемент перед выпадающим

Это то, что выбирается в выпадающем списке при раскрытии раскрывающегося списка.

Выбранный элемент после выпадающего

Я захватил сообщение ON_CBN_DROPDOWN и проверил значение курсора, и оно соответствует ожиданиям.

Я также уже подклассил этот комбинированный список, так что я могу искать строки в этом списке с учетом регистра, так как я знаю, что он не реализован нормально, поэтому это может быть причиной моей проблемы.

Но я не понимаю, почему строка будет переопределять значение курсора на этом этапе? Разве значение CurSel не должно быть тем, которое используется для выбора соответствующего элемента?

Любые идеи о том, как я могу это исправить, будут с благодарностью.

РЕДАКТИРОВАТЬ:
Я попытался перехватить сообщение CBN_DROPDOWN, переписав OnWndMsg. Когда появляется это сообщение, я получаю выбранный в данный момент элемент (который является правильным элементом) перед выпадением меню. Затем я опускаю меню и вызываю SetCurSel к тому, что я извлек раньше.

BOOL CMyComboBox::OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam,    LRESULT *pResult)
{
if(message == CBN_DROPDOWN)
{
int nCurSel = GetCurSel();
if(nCurSel != CB_ERR)
{
ShowDropDown();
SetCurSel(nCurSel);
return TRUE;
}

}
return CComboBox::OnWndMsg(message, wParam, lParam, pResult);
}

это вид работает, но когда я убиваю фокус или нажимаю стрелку раскрывающегося списка, чтобы скрыть раскрывающийся список, в текстовом поле отображается неправильный элемент. Это действительный метод, или я полностью не в курсе?
Какое сообщение отправляется, когда раскрывающийся список свернут?

РЕДАКТИРОВАТЬ 2:
Я реализовал чувствительный к регистру комбинированный список из код проекта и это прекрасно работает.

3

Решение

В дополнение к моему комментарию. Я думаю, вы обнаружите, что внутренняя механика использует SelectString установить индекс, когда это падать стиль.

Побочным эффектом является то, что он может не выбрать нужную запись для вас из списка. Поэтому, учитывая характер содержания в вашей комбо, попробуйте это:

int iIndex = m_cbData.FindStringExact(-1, "On");
m_cbData.SetCurSel(iIndex);

Или же

int iIndex = m_cbData.FindStringExact(-1, "OFF");
m_cbData.SetCurSel(iIndex);

Однако, будьте осторожны, документ для FindStringExact говорит, что поиск не чувствителен к регистру. Но SelectString (поведение по умолчанию) еще хуже.

Альтернативой, которая может решить все это, является использование SetWindowText и делай так. Таким образом, не имеет значения, что находится в компоненте списка. Например:

m_cbData.SetWindowText("On");
m_cbData.SetWindowText("ON");

И получить значение для переменной, либо сопоставляя строку, либо непосредственно с помощью GetWindowText.

ОБНОВИТЬ: Кто-то уже сделал работу! Вот класс чувствительного к регистру ComboBox:

http://www.codeproject.com/Articles/1363/Case-sensitive-ComboBox

1

Другие решения

Других решений пока нет …