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

         ColorLine=0; ColorGrid=0;

         .    .    .     .

}

Вызываем окно выбора цвета в функции обработки события:

// функция обработки щелчка по пункту меню Цвет линии

void CGraphDlg::OnColorLine()

{

         CColorDialog ColDlg;                                // объявление экземпляра класса CColorDialog

                                                                            // DoModal - открывает окно выбора цвета

         if(ColDlg.DoModal()==IDOK)          // если при закрытии окна пользователь нажал кнопку ОК

         {       

                   ColorLine = ColDlg.GetColor();       // запоминаем цвет, выбранный пользователем

                   SendMessage(WM_PAINT);            // команда родительскому окну перерисовать окно

         }

}

Аналогичным образом осуществляется процедура выбора цвета сетки.

Создание диалогового окна констант заданной функции

В настоящем проекте значения констант A, B, C, D заданной функции предполагается изменять в отдельном диалоговом окне, которое вызывается с помощью соответствующего пункта меню. Создаем это окно следующим образом:

Ø  В меню Insert выбираем New Form

Ø  В диалоговом окне New Form в поле Name указываем имя CONST, нажимаем ОК

Ø  Для нового ресурса IDD_CONST_DIALOG создаем новый класс CConstDlg

Ø  Создаем ресурс типа  BitMap с именем IDB_FORMUL содержащий растровое изображение заданной функции

Ø  Добавляем в форму элемент управления типа Picture.

Ø  В окне свойств этого элемента управления в поле Type выбираем BitMap, в поле Image - IDB_FORMUL

Ø  Добавляем в форму 4 надписи и 4 текстовых поля, которым даем имена IDC_A, IDC_B, IDC_C, IDC_D.

Создаем переменные, ассоциируемые с текстовыми полями

Ø  В контекстном меню диалогового окна IDC_CONST_DIALOG выбираем Class Wizard

Ø  В диалоговом окне  Class Wizard на вкладке Member Variables с помощью кнопки Add Variable создаем переменные a, b, c, d категории Value, типа float ассоциированные c тестовыми полями IDC_A, IDC_B, IDC_C, IDC_D.

Вызов диалогового окна констант заданной функции

Мы должны открыть диалоговое окно констант заданной функции, которые установил пользователь, и применить его к графическим объектам. Поскольку инициализация констант заданной функции и их  использование предполагается осуществлять с помощью функций одного класса CGraphDlg, то целесообразно включить заголовочный файл ConstDlg.h в файл GraphDlg.h и объявить екземпляр класса CConstDlg в файле GraphDlg.h:

#include "ConstDlg.h"

.    .    .  

class CGraphDlg : public CDialog

{

public:

         CConstDlg ConsDlg;

         .    .    .  

}

Создаем функцию обработки щелчка по пункту меню Константы

void CGraphDlg::OnConst()

{

         if(ConsDlg.DoModal()==IDOK)        // если при закрытии окна пользователь нажал кнопку ОК

                   SendMessage(WM_PAINT);   // посылаем команду родительскому окну перерисовать окно

}

В диалоговом окне CGridGlg создаем функцию обработки щелчка по кнопке ОК

void CGridGlg::OnOK()

{

         float buf;

//считывание данных из всех элементов управления в ассоциированные переменные

         UpdateData(true);

// Если нижняя граница больше верхней, то границы меняются местами

         if(Xmin>Xmax){   buf=Xmin;  Xmin=Xmax;       Xmax=buf;    }

         if(Ymin>Ymax){   buf=Ymin;  Ymin=Ymax;       Ymax=buf;    }

// вычисление границ, кратных шагу сетки

         Xmin=Round(Xmin,Hx);         Xmax=Round(Xmax,Hx);

         Ymin=Round(Ymin,Hy);         Ymax=Round(Ymax,Hy);

// Диапазон переменной не менее двух шагов

         if(Xmax-Xmin<2*Hx)    Xmax=Xmin+2*Hx;      

         if(Ymax-Ymin<2*Hy)    Ymax=Ymin+2*Hy;      

// Диапазон переменной не более двенадцати шагов

         if(Xmax-Xmin>12*Hx)  Xmax=Xmin+12*Hx;

         if(Ymax-Ymin>12*Hy)  Ymax=Ymin+12*Hy;

//считывание данных из всех ассоциированных переменных в элементы управления

         UpdateData(false);        

         CDialog::OnOK();

}

Рисование сетки

Создаем функцию DrawGrid в классе CgraphDlg для рисования сетки

void CGraphDlg::DrawGrid()

{

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

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

         int Nx,Ny;                                         // количество интервалов сетки по X и Y

         Nx=(int)((GridGlg.Xmax-GridGlg.Xmin)/GridGlg.Hx);

         Ny=(int)((GridGlg.Ymax-GridGlg.Ymin)/GridGlg.Hy);

         float Sx,Sy;                                       // расстояние между линиями сетки в форме по X и Y

         Sx=(rec.right -2*D)/(float)Nx;                   

         Sy=(rec.bottom-2*D)/(float)Ny;                 

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

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