Создание графических объектов (Лабораторная работа № 2), страница 3

         CClientDC dc(this);

         HPEN Pen;                                                         // объявление карандаша для линий сетки

// создание карандаша с указанными параметрами (сплошной, толщина - 1,

         Pen=CreatePen(PS_SOLID,1,ColorLine);           // цвет выбраный пользователем

         dc.SelectObject(Pen);                                          // выбор используемого карандаша

// рисование линий сетки по х        

         for(int i=0;i<=Nx;i++)

         {

                   dc.MoveTo(D+i*Sx, D);                             // переход карандаша в начало прямой

                   dc.LineTo(D+i*Sx, rec.bottom-D);             // рисование прямой

         }

// рисование линий сетки по у

         for(int j=0;j<=Ny;j++)

         {

                   dc.MoveTo(D          ,D+j*Sy);                    // переход карандаша в начало прямой

                   dc.LineTo(rec.right-D,D+j*Sy);                 // рисование прямой

         }

         HPEN PenAxis;                                                   // объявление карандаша для осей

         PenAxis=CreatePen(PS_SOLID,3,ColorLine);    // создание карандаша тройной толщины

         dc.SelectObject(PenAxis);                                   // выбор используемого карандаша

         int Ox,Oy;                                                           // позиция осей координат в форме

         if(GridGlg.Xmin>0) Ox=D;

         if(GridGlg.Xmax<0) Ox=D+Nx*Sx;

         if((GridGlg.Xmax>0)&&(GridGlg.Xmin<0))

                   Ox=D-Sx*(int)(GridGlg.Xmin/GridGlg.Hx);

         dc.MoveTo(Ox, D);                                             // переход карандаша в начало оси Y

         dc.LineTo(Ox, rec.bottom-D);                             // рисование оси Y

         if(GridGlg.Ymin>0) Oy=D;

         if(GridGlg.Ymax<0) Oy=D+Ny*Sy;

         if((GridGlg.Ymax>0)&&(GridGlg.Ymin<0))

                   Oy=D-Sy*(int)(GridGlg.Ymin/GridGlg.Hy);

         dc.MoveTo(D                 , Oy);                  // переход карандаша в начало оси X

         dc.LineTo(rec.right-D    , Oy);                  // рисование оси X

}

Рисование графика

Создаем функцию DrawGraph в классе CGraphDlg для рисования графика

void CGraphDlg::DrawGraph()

{

// объявление экземпляра класса CClientDC для работы с клиентской областью окна

// связывает его с контекстом устройства (device context) текущего диалогового окна

         CClientDC dc(this);

         HPEN Pen;                                                // объявление карандаша для линий сетки

// создание карандаша с указанными параметрами (сплошной, толщина - 3,

         Pen=CreatePen(PS_SOLID,3,ColorGrid);// цвет выбраный пользователем)  

         dc.SelectObject(Pen);                                 // выбор используемого карандаша

         const  N=100;                                             // количество точек при построении графика

         float H;                                                      // интервал между точками при построении графика

         H=(GridGlg.Xmax-GridGlg.Xmin)/N;

         float X=GridGlg.Xmin;

         int Xs=XScreen(X);

         int Ys=YScreen(F(X));

         dc.MoveTo(Xs,Ys);                                    // переход карандаша в начало оси Y

         for(int i=1;i<=N;i++)

         {

                   X+=H;

                   Xs=XScreen(X);

                   Ys=YScreen(F(X));

                   dc.LineTo(Xs,Ys);

         }

         CRect rec;                                                 // параметры клиентской области

         GetClientRect(&rec);                                // получение параметров клиентской области

         HPEN PenWhite;                                       // объявление белого карандаша

         PenWhite=CreatePen(PS_SOLID,1,0x00FFFFFF);      

         dc.SelectObject(PenWhite);                       // выбор используемого карандаша

         dc.Rectangle(0,0,1300,D);

         dc.Rectangle(0,rec.bottom-D+1,1300,rec.bottom);

}

Вычисление функции

float CGraphDlg::F(float x)

{

         float A=ConstDlg.A;

         float B=ConstDlg.B;

         float C=ConstDlg.C;

         float D=ConstDlg.D;

         return A*(B*x+C)*(B*x+C)*(B*x+C)+D;

}

int CGraphDlg::XScreen(float x)

{

         CRect rec;                                        // параметры клиентской области

         GetClientRect(&rec);                       // получение параметров клиентской области

         return (x-GridGlg.Xmin)/(GridGlg.Xmax-GridGlg.Xmin)*(rec.right-2*D)+D;

}

int CGraphDlg::YScreen(float y)

{

         CRect rec;                                        // параметры клиентской области

         GetClientRect(&rec);                       // получение параметров клиентской области

         return (GridGlg.Ymax-y)/(GridGlg.Ymax-GridGlg.Ymin)*(rec.bottom-2*D)+D;

}

Окно программы