通过 AddString 增加一行数据。
这个时候鼠标点击下拉列表(无论是否选择),保持下拉的状态。在保持下拉状态的过程中程序内部逻辑处理调用了ResetContent,把下拉列表的内容清空。
这个时候问题来了,当鼠标点击某处,让下拉状态恢复,我发现此时调用GetCurSel的值为0,而不是CB_ERROR(-1),导致调用GetLBText函数出错。
我知道可以利用GetCurSel的值小于GetCount来判断是否调用GetLBText来避免此问题,但是为什么调用ResetContent之后GetCurSel会得到0这个值呢?
如果不保持下拉状态来调用ResetContent,此问题就不会出现。请问高人是如何处理该问题的呢?本人菜鸟,了解的不深入啊。combobox选择
这个时候鼠标点击下拉列表(无论是否选择),保持下拉的状态。在保持下拉状态的过程中程序内部逻辑处理调用了ResetContent,把下拉列表的内容清空。
这个时候问题来了,当鼠标点击某处,让下拉状态恢复,我发现此时调用GetCurSel的值为0,而不是CB_ERROR(-1),导致调用GetLBText函数出错。
我知道可以利用GetCurSel的值小于GetCount来判断是否调用GetLBText来避免此问题,但是为什么调用ResetContent之后GetCurSel会得到0这个值呢?
如果不保持下拉状态来调用ResetContent,此问题就不会出现。请问高人是如何处理该问题的呢?本人菜鸟,了解的不深入啊。combobox选择
在这个列表窗口准备显示的时候,CComboBox 会把存储在内部的字符数据复制一份到这个列表中
当你在这个列表中选择一个项目后,列表会自动消失并清理列表中的数据(这个列表中的数据并不是 CComboBox 中的数据),最后返回所选择的序号给 CComboBox,CComboBox 再把这个序号通过消息的形式发送给父窗口而你调用 ResetContent 时,因为下拉列表并没有消失,也就是说列表中的数据并没有被删除,而 ResetContent 只是清空 CComboBox 中的数据,并不是说连列表的数据也清空了!
所以就会发生你所说的那种情况了!
因为它下拉出来的列表,默认是失去焦点后或选择后就会消失或者你在收到 CComboBox 准备下拉的通知消息时,设置一个全局变量标记它已经下拉
然后在你调用 ResetContent 的函数体内判断一下这个标记
最后在下拉列表收起的通知消息里把这个标记去掉
你调用这个函数后,判断一下返回值是否为 NULL,如果不是 NULL,则判断它是否已显示(IsWindowVisibled)
如果已显示,则先不要调用 ResetContent
例如:
m_ComboBox.SendMessage(CBN_CLOSEUP);
m_ComboBox.DeleteString(i);
非常感谢sandrer。