Unknown
Unknown

Reputation: 21

Need help solving an issue in CListBox

I'm still learning C++ MFC and my question is: how can I get the CurSel of 2 listbox as the number, then add them and print the result? The result displays a weird 659998896 number instead of 2. What have I done wrong here?

BOOL CEngravingCalculatorDlg::OnInitDialog(){
    CListBox* emplistbox1 = static_cast<CListBox*>(GetDlgItem(IDC_LIST1));
    emplistbox1->AddString(L"1");
    emplistbox1->SetCurSel(0);

    CListBox* emplistbox3 = static_cast<CListBox*>(GetDlgItem(IDC_LIST3));
    emplistbox3->AddString(L"1");
    emplistbox3->SetCurSel(0);
    }

void CEngravingCalculatorDlg::OnBnClickedButton1()
{
   CListBox* emplistbox1 = static_cast<CListBox*>(GetDlgItem(IDC_LIST1));
   CListBox* emplistbox3 = static_cast<CListBox*>(GetDlgItem(IDC_LIST3));
   int num1 = emplistbox1->GetCurSel();
   int num2 = emplistbox3->GetCurSel();
   int equal = num1 + num2;
   CString str;
   str.Format(_T("%d", equal));
    GetDlgItem(IDC_Display)->SetWindowTextW(str);
}

Upvotes: 1

Views: 169

Answers (2)

ObliteratedJillo
ObliteratedJillo

Reputation: 5166

See this snippet. GetCurSel() is used to get the cursor position and not the content. Use GetText() to get the content of the Listbox.

void CEngravingCalculatorDlg::OnBnClickedButton1()
{
    CListBox* emplistbox1 = static_cast<CListBox*>(GetDlgItem(IDC_LIST1));
    CListBox* emplistbox3 = static_cast<CListBox*>(GetDlgItem(IDC_LIST3));
    int num1 = emplistbox1->GetCurSel();
    int num2 = emplistbox3->GetCurSel();

    CString ItemSelected1, ItemSelected2;
    if (num1 != LB_ERR && num2 != LB_ERR)   {
        emplistbox1->GetText(num1, ItemSelected1);      
        emplistbox3->GetText(num2, ItemSelected2);      

        int equal = atoi(CStringA(ItemSelected1).GetString()) + atoi(CStringA(ItemSelected2).GetString());
        CString str;
        str.Format(L"%d", equal);
        SetDlgItemText(IDC_Display, str);
    }

}

Upvotes: 3

Mark Ransom
Mark Ransom

Reputation: 308530

_T is a macro that takes only a single parameter. Because of a typo, you've given it two parameters. The second one is ignored and effectively lost. This means your format call is only getting a single parameter, and you're seeing undefined behavior. Fix it with:

str.Format(_T("%d"), equal);

P.S. This means your error had absolutely nothing to do with the listbox.

Upvotes: 3

Related Questions