Класс окна для отображения графика
Откройте файл ChildView.cpp, который содержит коды реализации методов класса CChildView. Его имя содержит ложный намек на происхождение от CView. На самом деле он происходит от класса CWnd и инкапсулирует функциональность окна, оккупирующего клиентскую область окна рамки, которое управляется классом CMainFrame. Простое окно, как вы помните, для перерисовки своего содержимого, вместо метода OnDraw использует метод OnPaint. Найдите этот метод в классе CChildView и убедитесь, что в нем контекст устройства создается, а не приходит в качестве параметра от каркаса приложения, как это было в приложениях, поддерживающих архитектуру документ – представление. Вставьте внутрь этого метода вызов конструктора класса CGraph с последующим сообщением Draw:
void CChildView::OnPaint() { CPaintDC dc(this); CGraph(m_Points, "Field Distribution", "x[m]","Field").Draw(&dc); }
Класс CGraph разработаем позже. Он будет создавать двухмерный график функции – решения краевой задачи, автоматически масштабируемый и подстраивающийся под текущий размер окна CChildView. Перейдите к файлу с определением оконного класса (ChildFrame.h) и введите следующие коррективы:
# pragma once #include "Graph.h" Class CChildView: public CWnd { // Вспомогательные классы будут пользоваться данными friend class CParamDlg; friend class CGraph; private: //===== Контейнер координат точек графика vector<CDPoint> m_Points; //===== Вектор источников и свойств среды (см .f и р) vector<double> m_f, m_r; //===== Размерность задачи (см. N) int m_n; //===== Параметры double m_k, // Коэффициент k m_L, // Протяженность расчетной области m_g0, // Коэффициенты, задающие ГУ слева m_d0, m_gn, // Коэффициенты, задающие ГУ справа m_dn; CParamDlg *m_pDlg; // Немодальный диалог параметров public: CChildView(); virtual – CChildViewO; virtual BOOL PreCreateWindow(CREATESTRUCT& cs); //===== Изменение размерности задачи void Resize(); //===== Решение системы методом прогонки void Solve(); protected: afx_msg void OnPaint(); DECLARE_MESSAGE_MAP() };
Точки графика будем хранить в контейнере объектов класса CDPoint, который мы неоднократно использовали, так как исследователи реальных систем работают с вещественными координатами. Переход к экранным координатам будет произведен в классе CGraph. Инициализацию данных проведите в конструкторе оконного класса:
CChildView::CChildView() { m_n = 200; m_k = -0.0005; m_L = 200.; //====== Слева ГУ первого рода Uo=100 m_g0 = 0.; m_d0 =100.; m_gn = 0.; m_dn = 0.; Resize (); m_pDlg = 0; }
В деструктор вставьте коды освобождения памяти, занимаемой контейнерами:
CChildView::~CChildView() { m_Points.clear(); m_f.clear(); m_r.clear(); }