c++ - CComboBox 下拉时不选择 CurSel

标签 c++ winapi combobox mfc ccombobox

我在对话框中有一个按字母顺序排序的组合框。这个组合包含多个字符串,但有些字符串在不同情况下是重复的。即我们有一个“开”和一个“开”,一个“关”和一个“关”。这似乎是多余的,但这是有原因的,尽管现在这并不重要。

重复项显然在列表中一个接一个出现,大写字符串在前。即:

OFF

Off

ON

On

当用户选择“On”(小写)时,正确的索引设置为 CurSel 并显示正确的字符串。但是,当我单击组合框的箭头以下拉列表时,它不会突出显示 CurSel,而是突出显示它前面的大写字符串。请参见下图。

这是在下拉列表中选择的:

Selected item before dropdown

这是展开下拉列表时在组合框中选择的内容。

Selected item after dropdown

我已经捕获了 ON_CBN_DROPDOWN 消息,并检查了 cursel 值,它符合我的预期。

我也已经将这个组合框子类化,这样我就可以以区分大小写的方式在这个列表中搜索字符串,因为我知道它没有正常实现,所以它可能是导致我的问题的原因。

但我不明白为什么在这个阶段字符串会覆盖 cursel 值? CurSel 值不应该是用于选择相关项的值吗?

如果有任何关于如何解决此问题的想法,我们将不胜感激。

编辑: 我试图通过覆盖 OnWndMsg 来捕获 CBN_DROPDOWN 消息。出现此消息时,我会在下拉菜单之前获取当前选择的项目(这是正确的项目)。然后我放下菜单,并调用 SetCurSel 到我之前检索到的内容。

BOOL CMyComboBox::OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam,    LRESULT *pResult)
{
    if(message == CBN_DROPDOWN)
    {
        int nCurSel = GetCurSel();
        if(nCurSel != CB_ERR)
        {
            ShowDropDown();
            SetCurSel(nCurSel);
            return TRUE;
        }

    }
    return CComboBox::OnWndMsg(message, wParam, lParam, pResult);
}

这种有点有效,但是当我关闭焦点,或再次单击下拉箭头以隐藏下拉列表时,文本框中显示了错误的项目。这是一种有效的方法,还是我完全偏离了这里? 折叠下拉列表时会发送什么消息?

编辑 2: 我已经从 code project 实现了区分大小写的组合框效果很好。

最佳答案

进一步补充我的评论。我想你会发现内部机制是使用 SelectString 来设置 dropdown 样式的索引。

副作用是它可能无法从列表中为您选择正确的条目。因此,鉴于您的组合中内容的性质,请尝试以下操作:

int iIndex = m_cbData.FindStringExact(-1, "On");
m_cbData.SetCurSel(iIndex);

或者

int iIndex = m_cbData.FindStringExact(-1, "OFF");
m_cbData.SetCurSel(iIndex);

但是,请注意,FindStringExact 的文档表示搜索不区分大小写。但是SelectString (默认行为)更糟。

另一种可能会解决所有这些问题的方法是使用 SetWindowText 并以这种方式进行。这样,列表框组件中的内容就无关紧要了。例如:

m_cbData.SetWindowText("On");
m_cbData.SetWindowText("ON");

并通过映射到字符串或直接使用 GetWindowText 获取变量的值。

更新:有人已经完成了这项工作!这是一个区分大小写的 ComboBox 类:

http://www.codeproject.com/Articles/1363/Case-sensitive-ComboBox

关于c++ - CComboBox 下拉时不选择 CurSel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36502743/

相关文章:

c++ - 将字符串的子字符串设置为 vector 的 char 元素时的 EXC_BAD_ACCESS (C++)

C++——OpenProcess 返回错误代码 87

c++ - 查看winapi函数是否可用

php - 使用组合框将值获取到文本字段

c# - 如何在C#中动态连接两个组合框?

c++ - 未定义的函数引用 (c++)

c++ - 使用宏检测 gcc 而不是 msvc/clang

java - 删除 JComboBox 内的文件

C++ 如何迭代到动态数组的末尾?

c++ - 我可以使用成员函数作为 EnumWindows 的第一个参数吗