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 OnPaintO;
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();