MFC C++ CListBox 获取选中项

Posted

技术标签:

【中文标题】MFC C++ CListBox 获取选中项【英文标题】:MFC C++ CListBox get selected item 【发布时间】:2016-05-20 16:37:59 【问题描述】:

首先让我说我这几天一直在寻找解决方案......

我正在尝试获取 ListBox 的选定项。这是我的代码:

CListBox * pList1 = (CListBox *)GetDlgItem(IDC_LIST1);
CString ItemSelected;
// Get the name of the item selected in the Sample Tables list box 
// and store it in the CString variable declared above 
pList1->GetText(pList1->GetCurSel(), ItemSelected);
MessageBox(ItemSelected, "TEST", MB_OK);

现在,当我尝试此操作时,我收到一条错误消息,提示“参数不正确”

【问题讨论】:

pList1->GetCurSel() 不能保证成功(列表框可以完全没有选择)。在这种情况下,它返回 LB_ERR。这不是传递给CListBox::GetText 的有效索引。 但是有一个选择......还有其他方法吗? 先尝试完整编译。然后尝试调试它。此外,为了进行测试,请将 GetCurSel 值分配给一个变量,以便您确认。最后,您为什么不直接将CListBox 映射到CString 变量而只是调用UpdateData(TRUE) 并使用变量值? 你的ClistBox是单选还是多选? 【参考方案1】:

除了错误处理之外,您的代码看起来还不错。 MessageBox 参数看起来也不正确。第一个参数应该是HWND 类型。我相信这是你问题的根本原因。请改用 MFC 标准 AfxMessageBox

CListBox * pList1 = (CListBox *)GetDlgItem(IDC_LIST1);

int nSel = pList1->GetCurSel();
if (nSel != LB_ERR)

    CString ItemSelected; 
    pList1->GetText(nSel, ItemSelected);
    AfxMessageBox(ItemSelected);

【讨论】:

啊,是的,MessageBox 需要HWND 参数。尽管如此,调试代码应该隔离他的问题以及触发错误的行。【参考方案2】:

如果 CListBox 处于单选模式,CListBox::GetCurSel 将返回选定的索引。

如果 CListBox 处于多选模式,则应使用 CListBox::GetSelItems 它将返回索引列表。

你不能混搭功能。

并且总是检查返回码(正如其他人已经写的那样)。

【讨论】:

【参考方案3】:

如果你已经有一个数据成员 MyList(of classCListBox):

int nSel = MyList.GetCurSel();
    CString ItemSelected;
    if (nSel != LB_ERR)
    
        MyList.GetText(nSel, ItemSelected);
    

【讨论】:

【参考方案4】:

CWnd class has a MessageBox 不需要 HWND 参数的函数。但是,是的,AfxMessageBox 更易于使用,并且可以在 MFC 代码中的任何位置调用,而无需 CWnd 派生对象。另外注意:如果在 MFC 代码中调用 WinAPI 函数(此处不需要,但在其他情况下可能),最好在其前面加上范围解析运算符,以便避免任何混淆、错误和/或名称冲突(例如 ::MessageBox...)。

OP 代码中“无效参数”错误的一个可能原因是它在 UNICODE 构建配置中使用了 ANSI 字符串文字(“TEST”)。在这种情况下,必须使用 UNICODE 字符串文字 (L"TEST") 或更好一点,使用 _T 宏 (_T("TEST")) 可以在 ANSI 和 UNICODE 中构建配置。

【讨论】:

以上是关于MFC C++ CListBox 获取选中项的主要内容,如果未能解决你的问题,请参考以下文章

为啥我无法在 CListBox 中获取所选项目? MFC

(MFC) CListBox -> 编辑列表中的项目?

MFC中,怎么获取ComboBox的选中项

如何设置检查菜单项 mfc c++

如何为所有者绘制变量 CListBox (MFC) 设置高度

mfc clistbox 函数drawitem需要打开啥属性