Ловля, когда пользователь выбирает объект из CComboBox

Ваша ошибка - это бесконечная рекурсия:

public double getDiscriminant() {
    double discriminant = (b * 2) - (4 * a * c);
    return getDiscriminant();
}

Эта функция вызывает себя бесконечно, пока стек не переполнится. Я полагаю, что вы хотели вместо этого вернуть переменную discriminant?

То же самое для ваших функций getRoot1, getRoot2, getA, getB и getC.

7
задан Andrew Truckle 8 July 2018 в 19:11
поделиться

2 ответа

CBN_SELENDOK должно быть сообщение, что Вы ищете. Это отправляется после того, как пользовательский выбор завершен, но прежде чем поле комбинированного списка закрывается (если это делает). CBN_SELCHANGE отправляется, прежде чем выбор на самом деле сохраняется к управлению полем комбинированного списка.

Эта ссылка MSDN имеет больше информации (Вы, вероятно, видели его уже...),

Вот код, который я обещал Вам. Одна вещь, которую я заметил при собирании этого, состоит в том, что возможно подавить это сообщение, если Вы используете ON_CONTROL_REFLECT обработчик в классе, полученном из CComboBox. Это заставило бы само управление обрабатывать сообщение и не передавать его на родителя. Можно обойти ту проблему при помощи ON_CONTROL_REFLECT_EX с надлежащим кодом возврата, который сделает само и поле и родителя, получают сообщение.

Так или иначе вот фрагмент кода:

class SPC_DOCK_CLASS ProcessingExceptionDockDlg : public CSPCDockDialog
{
    SPC_DOCK_DECLARE_SERIAL(ProcessingExceptionDockDlg);

public:
    // ... redacted ...

    //{{AFX_DATA(ProcessingExceptionDockDlg)
    CComboBox                   m_comboFilter;
    //}}AFX_DATA

    //{{AFX_VIRTUAL(ProcessingExceptionDockDlg)
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);
    //}}AFX_VIRTUAL

protected:

    //{{AFX_MSG(ProcessingExceptionDockDlg)
    afx_msg void OnSelendokComboTreeFilter();
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
};

/****************/

// ProcessingExceptionDockDlg.cpp : implementation file
//

#include "stdafx.h"
#include "resource.h"
#include "ProcessingExceptionDockDlg.h"

// ... much code redacted ...

void ProcessingExceptionDockDlg::DoDataExchange(CDataExchange* pDX)
{
    CSPCDockDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(ProcessingExceptionDockDlg)
    DDX_Control(pDX, IDC_COMBO_TREE_FILTER, m_comboFilter);
    //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(ProcessingExceptionDockDlg, CSPCDockDialog)
    //{{AFX_MSG_MAP(ProcessingExceptionDockDlg)
    ON_CBN_SELENDOK(IDC_COMBO_TREE_FILTER, OnSelendokComboTreeFilter)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

void ProcessingExceptionDockDlg::OnSelendokComboTreeFilter() 
{
    // ... code redacted ...
}
1
ответ дан 7 December 2019 в 05:30
поделиться

Unfortunately, it seems that all messages (even SELEND_OK) for combo box changing are sent before the text has actually changed, so DoDataExchange will give you the previous text in the CComboBox. I have used the following method, as suggested by MSDN:

void MyDialog::DoDataExchange(CDataExchange* pDX)
{
    DDX_Text(pDX, IDC_COMBO_LOCATION, m_sLocation);
    CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(MyDialog, CDialog)
    ON_CBN_SELENDOK(IDC_COMBO1, &MyDialog::OnComboChanged)
    ON_CBN_EDITUPDATE(IDC_COMBO1, &MyDialog::OnComboEdited) // This one updates immediately
END_MESSAGE_MAP()

...

void MyDialog::OnComboChanged()
{
    m_myCombo.GetLBText(m_myCombo.GetCurSel(), m_sSomeString);
}

void MyDialog::OnComboEdited()
{
    UpdateData();
}

It seems to work quite nicely.

7
ответ дан 7 December 2019 в 05:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: