通过 AddString 增加一行数据。
这个时候鼠标点击下拉列表(无论是否选择),保持下拉的状态。在保持下拉状态的过程中程序内部逻辑处理调用了ResetContent,把下拉列表的内容清空。
这个时候问题来了,当鼠标点击某处,让下拉状态恢复,我发现此时调用GetCurSel的值为0,而不是CB_ERROR(-1),导致调用GetLBText函数出错。
我知道可以利用GetCurSel的值小于GetCount来判断是否调用GetLBText来避免此问题,但是为什么调用ResetContent之后GetCurSel会得到0这个值呢?
如果不保持下拉状态来调用ResetContent,此问题就不会出现。请问高人是如何处理该问题的呢?本人菜鸟,了解的不深入啊。combobox选择

解决方案 »

  1.   

    而且当调用ResetContent之后,恢复下拉状态,选中的当前行为0,且选择框里有内容为"??????"。
      

  2.   

    在下拉状态中,会多出一个列表窗口
    在这个列表窗口准备显示的时候,CComboBox 会把存储在内部的字符数据复制一份到这个列表中
    当你在这个列表中选择一个项目后,列表会自动消失并清理列表中的数据(这个列表中的数据并不是 CComboBox 中的数据),最后返回所选择的序号给 CComboBox,CComboBox 再把这个序号通过消息的形式发送给父窗口而你调用 ResetContent 时,因为下拉列表并没有消失,也就是说列表中的数据并没有被删除,而 ResetContent 只是清空 CComboBox 中的数据,并不是说连列表的数据也清空了!
    所以就会发生你所说的那种情况了!
      

  3.   

    那么请问,我如何在调用ResetContent之前通过代码先把下拉框给去掉呢?
      

  4.   

    查查看有没有消息能做到,如果没有的话,就先把 CComboBox 焦点去掉,再重新设置 CComboBox 的焦点
    因为它下拉出来的列表,默认是失去焦点后或选择后就会消失或者你在收到 CComboBox 准备下拉的通知消息时,设置一个全局变量标记它已经下拉
    然后在你调用 ResetContent 的函数体内判断一下这个标记
    最后在下拉列表收起的通知消息里把这个标记去掉
      

  5.   

    我记得 CComboBox 类里面有个成员函数,是获取下拉列表的
    你调用这个函数后,判断一下返回值是否为 NULL,如果不是 NULL,则判断它是否已显示(IsWindowVisibled)
    如果已显示,则先不要调用 ResetContent
      

  6.   

    已经弄明白了 在删除combobox中元素之前,先关闭下拉框,就可以避免此问题。
    例如:
    m_ComboBox.SendMessage(CBN_CLOSEUP);
    m_ComboBox.DeleteString(i);
    非常感谢sandrer。