您可能知道 CComboBox(DropDownList 样式)只有在您不让它对其内容进行自动排序时才能通过键入正确选择。这是我的意思的一个例子:你输入A然后B。如果它没有自动排序,它将首先选择下一个以A开头的条目,然后选择下一个以B开头的条目。如果它被排序,它将选择下一个条目与 A 然后下一个以 AB 开头。
我有一个继承自 CComboBox 的类,它的内容没有按内置排序机制排序。我想要一个正确的按类型选择的行为,所以我自己实现了。我通过使用 SetCurSel 选择条目,然后将 CBN_SELCHANGE 消息发送到父窗口。
在 Windows XP 上,这工作得非常好。我们现在使用的是 Windows 7,现在出现以下问题:如果我使用鼠标打开下拉列表,通过键入来选择一个条目,然后使用 Tab 跳转到下一个控件,开始时选择的值是自动重新选择。
如果我覆盖 OnKillFocus 并执行以下操作:
int index = GetCurSel();
CComboBox::OnKillFocus();
SetCurSel(index);
它通常可以工作,但是有一段时间旧的选择值仍然会闪现,这很丑陋。
如果我不调用 CComboBox::OnKillFocus() 正确的条目仍然被选中,但组合框仍然被下拉。
所以我的下一个尝试是手动调用 SetDropDown(FALSE)(在 OnKillFocus() 中没有其他内容),但问题又出现了。
所以我的猜测是,如果您打开下拉列表,则当前选择会在内部存储。调用 SetCurSel 不会更新此内部值。而且,如果您标记出该内部值,则会再次重新选择。
有什么想法可以解决这个问题吗?