在Windows 7上的SetCurSel之后的MFC CComboBox OnKillFocus / ShowDropDown

时间:2010-03-26 15:56:56

标签: c++ mfc windows-7 ccombobox onkillfocus

您可能知道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不会更新此内部值。如果你发现内部值再次被重新选择。

我有什么想法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

只有未经证实的想法:

  • 覆盖CB_SHOWDROPDOWN处理。如果关闭下拉列表,可能会调用SetCurSel 对于存储的项目。

  • 覆盖CB_SETCURSEL处理,添加指示是否处理CB_SETCURSEL消息的标志。在代码示例中调用CComboBox :: OnKillFocus()时关闭标志。