在 Windows 7 上 SetCurSel 之后的 MFC CComboBox OnKillFocus/ShowDropDown
Posted
技术标签:
【中文标题】在 Windows 7 上 SetCurSel 之后的 MFC CComboBox OnKillFocus/ShowDropDown【英文标题】:MFC CComboBox OnKillFocus/ShowDropDown after SetCurSel on Windows 7 【发布时间】:2010-03-26 15:56:56 【问题描述】:您可能知道 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】:只有未经验证的想法:
覆盖 CB_SHOWDROPDOWN 处理。如果下拉列表关闭,可能调用 SetCurSel 用于存储的项目。
覆盖 CB_SETCURSEL 处理,添加指示是否处理 CB_SETCURSEL 消息的标志。关闭代码示例中调用 CComboBox::OnKillFocus() 时的标志。
【讨论】:
以上是关于在 Windows 7 上 SetCurSel 之后的 MFC CComboBox OnKillFocus/ShowDropDown的主要内容,如果未能解决你的问题,请参考以下文章
Windows Server 2012活动目录基础配置与应用(新手教程)之7---OU的管理权利委派
Windows 7 上安装Visual Studio 2015 失败解决方案
历史上的今天:GPG 作者诞生;激光器之父出生;Windows Phone 停运