简体   繁体   中英

MFC C++ CListBox get selected item

First let me say that I've been searching for a solution for couple of days now...

I'm trying to get selected item for ListBox. This is my code:

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);

Now when i try this i get an error message saying "The Parameter is incorect"

Your code looks OK except error handling. Also MessageBox parameters look incorrect. The first parameter should be of type HWND . I believe that this is the root cause of your problems. Use MFC standard AfxMessageBox instead:

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

int nSel = pList1->GetCurSel();
if (nSel != LB_ERR)
{
    CString ItemSelected; 
    pList1->GetText(nSel, ItemSelected);
    AfxMessageBox(ItemSelected);
}

If the CListBox is in single selection mode, the CListBox::GetCurSel will return the selected index.

If the CListBox is in multi-selection mode, you should use CListBox::GetSelItems which will return a list of indices.

You cannot mix'n'match the functions.

And always check return codes (as others already wrote).

If You already have a data member MyList(of classCListBox) :

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

CWnd class has a MessageBox function which does not need a HWND parameter. But yes, AfxMessageBox is a little bit more easier to use and can be called anywhere in the MFC code without having a CWnd-derived object. And a beside note: if call a WinAPI function inside MFC code (not needed here, but possible in other cases) it's good to prepend it with scope resolution operator in order to avoid any confusion, mistake and/or name conflict (eg ::MessageBox ...).

One possible cause for "invalid parameter" error in OP code is that it uses an ANSI string literal ("TEST") in a UNICODE build configuration. This case, must use an UNICODE string literal (L"TEST") or a little bit better, use _T macro (_T("TEST")) that makes it possible to build in both ANSI and UNICODE configurations.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM