VC ++ MFC - > ComboBox,GetCurSel()?

时间:2018-03-07 08:04:17

标签: mfc

我哪里错了?我有这个代码:

CComboBox m_item;

if((m_item.GetCurSel()) == atoi("TC001"))
    MessageBox(L"TC001");

if((m_item.GetCurSel()) == atoi("TC002"))
    MessageBox(L"TC002");

如果我选择" TC001"在ComboxBox中,它会弹出两者" TC001"和" TC002"消息框。

如果我选择" TC002"在ComboxBox中,它没有显示任何 MessageBox

为什么?

2 个答案:

答案 0 :(得分:3)

来自atoi的文档:

  

解释str。

指向的字节字符串中的整数值      

丢弃任何空白字符,直到找到第一个非空白字符,然后获取尽可能多的字符以形成有效的整数表示并将它们转换为整数值。有效整数值由以下部分组成:

     
      
  • (可选)加号或减号
  •   
  • 数字数字
  •   
     

[...]如果无法执行转换,则会返回0

字符串"TC001""TC002"无法转换为整数,因此在{2}中调用atoi会返回0

CComboBox::GetCurSel返回

  

组合框[...]

列表框中当前所选项目的从零开始的索引

因此,如果带有显示字符串"TC001"的项目是第一项,GetCurSel返回0,则atoi在非整数输入上返回相同的值。两个比较都返回true,因此会显示两个消息框。

解决方案有两个方面:

  • 了解如何使用调试器。
  • 请勿使用字符串比较或转换来确定所选值。而是使用位置索引,或将自定义数据附加到每个项目。这需要调用CComboBox::SetItemData或切换到提供CComboBoxEx成员的InsertItem类,这样您就可以传递COMBOBOXITEM结构并使用其lParam成员

答案 1 :(得分:3)

您希望比较所选文字,而不是所选项目编号。为此,请使用CComboBox::GetLBText()

CStringW text;
m_item.GetLBText(m_item.GetCurSel(), text);

if (text == L"TC001")
    MessageBox(L"TC001");
else if (text == L"TC002")
    MessageBox(L"TC002");