我在对话框中有一个按字母顺序排序的组合框。此组合包含多个字符串,但有些字符串因大小写不同而重复。即我们有一个“开”和一个“开”,一个“关”和一个“关”。这似乎是多余的,但这是有原因的,尽管现在这并不重要。
重复项显然一个接一个地出现在列表中,大写的字符串在前。IE:
离开
离开
上
上
当用户选择“开”(小写)时,正确的索引设置为CurSel
并显示正确的字符串。但是,当我单击组合框的箭头以下拉列表时,它不会突出显示CurSel
,而是突出显示它之前的大写字符串。请参阅下面的图片。
这是在下拉列表中选择的:
这是展开下拉列表时在组合框中选择的内容。
我已经捕获了ON_CBN_DROPDOWN
消息,并检查了curcel值,它与我预期的一样。
我也已经对这个组合框进行了子类化,以便我可以以区分大小写的方式在此列表中搜索字符串,因为我知道它没有正常实现,所以它可能是导致我的问题的原因。
但是我不明白为什么在这个阶段字符串会覆盖curcel值?该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:我已经从代码项目 中实现了区分大小写的组合框,效果很好。