0

您可能知道 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 不会更新此内部值。而且,如果您标记出该内部值,则会再次重新选择。

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

4

1 回答 1

0

只有未经验证的想法:

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

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

于 2010-03-26T17:57:13.690 回答