Диалог для исследования решений
В уже существующие заготовки функций обработки нажатия на кнопки введите такие коды:
void CParamDlg::OnClickedApply(void) { //====== Считываем данные из окон UpdateDataO; //====== Заново решаем систему и выводим график m_jpView › Solve (); } void CParamDlg::OnClickedAddsource(void) { UpdateData(); //====== Изменяем контейнер m_f (источников поля) for (int i=m_Src!dl; i <= m_Srdd2; i + +) { if (0 <= i && i < m_pView~>m_n) m_pView › m_f[i] = – m_Source;) m_pView › Solve0; } void CParamDlg::OnClickedAddprop(void) { UpdateDataO; //====== Изменяем контейнер m_r (свойств среды) for (int i=m_Prop!dl; i <= m_PropId2; i++) { if (0 <= i &i i < m_pView › m_n && m_Prop > 0.) m_pView › ra_r[i] = m_Prop; } m_pView › Solve(); } void CParamDlg::OnClickedCancel (void) { //====== Закрываем немодальный диалог m_pView › m_pDlg = 0; DestroyWindow(); }
Измените коды конструктора класса так, чтобы запоминался обратный указатель на объект оконного класса. Заодно сверьте начало файла ParamDlg.h с тем фрагментом, что приведен ниже:
#include "stdafx.h" #include "Heat.h" #include "ParamDlg.h" IMPLEMENT_DYNAMIC(CParamDlg, CDialog) CParamDlg::CParamDlg(CChildView* p) : CDialog(CParamDlg::IDD, p) { m_pView = p; //===== Начальное значение свойств среды //===== не должно равняться нулю m_Prop =1.0; m_PropIdl = 0; m_PropId2 = 0; m_Source =0.0; m_SrcIdl = 0; m_Srdd2 = 0; } CParamDlg::~CParamDlg() { }
Инициализация диалога, как вы помните, должна производиться в обработчике сообщения WM_INITDIALOG. Здесь я опять попадаю в ловушку. В рамках Visual C++ Studio .NET вы не найдете WM_INITDIALOG в списке доступных сообщений, но вместо этого найдете функцию OnlnitDialog в списке виртуальных функций (overrides). Введите в класс CParamDlg эту функцию. В ней мы просто отодвинем окно диалога, чтобы оно при появлении на экране не заслоняло график. Другие установки должны происходить автоматически:
BOOL CParamDlg::OnInitDialog(void) { CDialog:rOnlnitDialog(); CRect r; //===== С помощью контекста устройства //===== узнаем размеры всего экрана CClientDC dc(this); int w = dc.GetDeviceCaps(HORZRES); int h = dc.GetDeviceCaps(VERTRES); //===== Узнаем размеры окна диалога GetWindowRect(&r); //===== Смещаем его вправо и вниз r.OffsetRect(w-r.right-10,h-r.bottom-30); MoveWindow(Sr); return TRUE; }