Ваша ошибка - это бесконечная рекурсия:
public double getDiscriminant() {
double discriminant = (b * 2) - (4 * a * c);
return getDiscriminant();
}
Эта функция вызывает себя бесконечно, пока стек не переполнится. Я полагаю, что вы хотели вместо этого вернуть переменную discriminant
?
То же самое для ваших функций getRoot1
, getRoot2
, getA
, getB
и getC
.
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 ...
}
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.