У меня есть сортировка по алфавиту в диалоговом окне. Эта комбинация содержит несколько строк, но некоторые дублируются в разных случаях. у нас есть «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:
Я реализовал чувствительный к регистру комбинированный список из код проекта и это прекрасно работает.
В дополнение к моему комментарию. Я думаю, вы обнаружите, что внутренняя механика использует 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
Других решений пока нет …