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 获取选中项的主要内容,如果未能解决你的问题,请参考以下文章