2010-03-26 137 views
0

正如你可能知道一个CComboBox(DropDownList样式)只能通过键入正确选择,如果你不让它autosort它的内容。这里是我的意思的一个例子: 您键入A然后B键。如果它不是自动排序,它将首先选择以A开头的下一个条目,然后选择以B开头的下一个条目。如果排序它将选择下一个用A输入,然后用AB输入下一个。MFC CComboBox OnKillFocus/ShowDropDown Windows 7上的SetCurSel后

我有一个继承自CComboBox的类,它的内容没有按内置的排序机制排序。我想要一个正确的按键输入行为,所以我自己实现了。我使用SetCurSel选择条目,然后将CBN_SELCHANGE消息发送到父窗口。

在Windows XP上,这工作得很好。我们现在正在使用Windows 7,并且现在出现以下问题: 如果我使用鼠标打开下拉列表,请通过键入它来选择一个条目,然后使用Tab跳转到下一个控件,即开始时选择的值会自动重新选择。

如果我覆盖OnKillFocus并执行以下操作:

int index = GetCurSel(); 
CComboBox::OnKillFocus(); 
SetCurSel(index); 

一般工作,但一会儿老选定值仍然会闪烁发光,这是丑陋的。

如果我不调用CComboBox :: OnKillFocus()正确的条目保持选中,但组合框仍然下降。

所以我的下一个尝试是手动调用SetDropDown(FALSE)(并没有任何其他的OnKillFocus()),但随后问题再次出现。

所以我的猜测是,如果你打开下拉列表,当前选择内部存储。调用SetCurSel不会更新此内部值。如果你标出内部值再次被重新选择。

任何想法如何我可以解决这个问题?

回答

0

只有未经证实的观点:

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

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