Добавлен: 25.10.2023
Просмотров: 83
Скачиваний: 4
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Алгоритм для ON_WM_PAINT():
-
Создание переменной для прорисовки. -
Обозначение области рисования при помощи переменной. -
Обозначение старта. -
Обозначение шага сетки по X и по Y. -
Окраска области рисования. -
Создание выбора кисти для области рисования. -
Рисовка сетки при помощи цикла. -
Создание выбора кисти для X и Y. -
Непосредственное рисование осей. -
Обозначение размера вектора. -
Установка пера в обозначенный старт. -
Рисование графиков функции (создание и выбор кисти, цикл перемещения кисти, установка пера в начальную точку), если параметр отображения этого графика равен true. -
Непосредственное рисование графика
Алгоритм для таймера:
-
Очистка List (1,2,3). -
Создание переменных для хранения рассчитанных значений графиков функций. -
Вычисление значений графиков функций -
Запись в вектор этих значений -
Удаление начальных значений векторов, если значение таймера больше области рисования. -
Округление значений графиков функций в новых переменных -
Масштабирование графиков, если выполняется условие -
Перерисовка поля элемента Static Text при помощи макроса ON_WM_PAINT. -
Увеличение таймера на +1. -
Очистка и заполнение List (1,2,3)
8. текст программы
8.1 Файл Smirnov_KR_2193_V2Dlg.cpp
m_CGraph.SubclassDlgItem(IDC_STATIC, this);
m_CGraph.stepX = 2;
m_CGraph.stepY = 2;
ParA = 0.5;
ParB = 0.7;
ParPhi = M_PI/9.0;
ParK1 = 100;
ParK2 = 100;
ParK3 = 100;
Period = 100;
m_Radio10.SetCheck(1);
m_Slider1.SetRange(0, 255);
m_Slider1.SetPos(26);
m_Slider2.SetRange(0, 255);
m_Slider2.SetPos(81);
m_Slider3.SetRange(0, 255);
m_Slider3.SetPos(255);
m_Combo2.AddString(L"1");
m_Combo2.AddString(L"2");
m_Combo2.AddString(L"3");
m_List1_Var.Format(_T("A = %3.3f"), ParA);
m_List1.AddString(m_List1_Var);
m_List1_Var.Format(_T("B = %3.3f"), ParB);
m_List1.AddString(m_List1_Var);
m_List1_Var.Format(_T("Phi = %3.3f"), ParPhi);
m_List1.AddString(m_List1_Var);
m_List1_Var.Format(_T("K1 = %3.3f"), ParK1);
m_List1.AddString(m_List1_Var);
m_List1_Var.Format(_T("K2 = %3.3f"), ParK2);
m_List1.AddString(m_List1_Var);
m_List1_Var.Format(_T("K3 = %3.3f"), ParK3);
m_List1.AddString(m_List1_Var);
m_List1_Var.Format(_T("Period = %i"), Period);
m_List1.AddString(m_List1_Var);
return TRUE; // возврат значения TRUE, если фокус не передан элементу управления
}
void CSmirnovKR2193V2Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}
// При добавлении кнопки свертывания в диалоговое окно нужно воспользоваться приведенным ниже кодом,
// чтобы нарисовать значок. Для приложений MFC, использующих модель документов или представлений,
// это автоматически выполняется рабочей областью.
void CSmirnovKR2193V2Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // контекст устройства для рисования
SendMessage(WM_ICONERASEBKGND, reinterpret_cast
// Выравнивание значка по центру клиентского прямоугольника
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Нарисуйте значок
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}
// Система вызывает эту функцию для получения отображения курсора при перемещении
// свернутого окна.
HCURSOR CSmirnovKR2193V2Dlg::OnQueryDragIcon()
{
return static_cast
}
//таймер
void CSmirnovKR2193V2Dlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: добавьте свой код обработчика сообщений или вызов стандартного
//Расчет значений гр1
float varF1 = cos(ParA * cos(2.0 * M_PI * m_CGraph.m_iTimer / ParK1));
//Формирование координаты y
m_CGraph.m_y = int(m_CGraph.m_h / 2 * varF1);
//Добавление рассчитанного значения координаты y в конец вектора
m_CGraph.m_vecGraph1.push_back(m_CGraph.m_y);
//Расчет значений гр2
float varF2 = ParB * cos(2.0 * M_PI * m_CGraph.m_iTimer / ParK2 + ParPhi);
//Формирование координаты y
m_CGraph.m_y = int(m_CGraph.m_h / 2 * varF2);
//Добавление рассчитанного значения координаты y в конец вектора
m_CGraph.m_vecGraph2.push_back(m_CGraph.m_y);
//Расчет значений гр3
float varF3 = sin(2.0 * M_PI * m_CGraph.m_iTimer / ParK3 + 2.0 * M_PI / 9.0);
//Формирование координаты y
m_CGraph.m_y = int(m_CGraph.m_h / 2 * varF3);
//Добавление рассчитанного значения координаты y в конец вектора
m_CGraph.m_vecGraph3.push_back(m_CGraph.m_y);
//Расчет значений гр4
float varF4 = - varF1 + varF2 + varF3;
//Формирование координаты y
m_CGraph.m_y = int(m_CGraph.m_h / 2 * varF4);
//Добавление рассчитанного значения координаты y в конец вектора
m_CGraph.m_vecGraph4.push_back(m_CGraph.m_y);
//Сравнение значений таймера с количеством точек по ширине
if (m_CGraph.m_iTimer >= m_CGraph.m_w) {
//Если значение таймера больше, чем количество точек по ширине, то
//стирается первый элемент вектора
m_CGraph.m_vecGraph1.erase(m_CGraph.m_vecGraph1.begin());
m_CGraph.m_vecGraph2.erase(m_CGraph.m_vecGraph2.begin());
m_CGraph.m_vecGraph3.erase(m_CGraph.m_vecGraph3.begin());
m_CGraph.m_vecGraph4.erase(m_CGraph.m_vecGraph4.begin());
}
//изменение размера сетки
int CF[4] = { ceil(fabs(varF1)) , ceil(fabs(varF2)),ceil(fabs(varF3)),ceil(fabs(varF4)) };
int maxV12 = max(CF[0], CF[1]);
int maxV34 = max(CF[2], CF[3]);
int maxV = max(maxV12, maxV34);
if (m_CGraph.stepY < maxV) m_CGraph.stepY = maxV + 1;
//Метод, производящий перерисовку окна (в данном случае –
//поле элемента Static Text)
m_CGraph.Invalidate();
//Увеличение значения таймера
m_CGraph.m_iTimer = m_CGraph.m_iTimer + 1;
//вывод значений
for (int kkk = 0; kkk < m_List2.GetCount(); kkk++)
{
m_List2.DeleteString(kkk);
}
for (int kkk = 0; kkk < m_List2.GetCount(); kkk++)
{
m_List2.DeleteString(kkk);
}
for (int kkk = 0; kkk < m_List2.GetCount(); kkk++)
{
m_List2.DeleteString(kkk);
}
m_List2_Var.Format(_T("f1 = %3.3f"), varF1);
m_List2.AddString(m_List2_Var);
m_List2_Var.Format(_T("f2 = %3.3f"), varF2);
m_List2.AddString(m_List2_Var);
m_List2_Var.Format(_T("f3 = %3.3f"), varF3);
m_List2.AddString(m_List2_Var);
for (int kkk = 0; kkk < m_List3.GetCount(); kkk++)
{
m_List3.DeleteString(kkk);
}
for (int kkk = 0; kkk < m_List3.GetCount(); kkk++)
{
m_List3.DeleteString(kkk);
}
for (int kkk = 0; kkk < m_List3.GetCount(); kkk++)
{
m_List3.DeleteString(kkk);
}
m_List3_Var.Format(_T("f4 = %3.3f"), varF4);
m_List3.AddString(m_List3_Var);
CDialogEx::OnTimer(nIDEvent);
}
//запуск таймера
void CSmirnovKR2193V2Dlg::OnBnClickedButton1()
{
SetTimer(55555, Period, NULL);
}
//остановка таймера
void CSmirnovKR2193V2Dlg::OnBnClickedButton2()
{
KillTimer(55555);
}
//перезапуск
void CSmirnovKR2193V2Dlg::OnBnClickedButton4()
{
KillTimer(55555);
//очистка текста
for (int kkk = 0; kkk < m_List1.GetCount(); kkk++)
{
m_List1.DeleteString(kkk);
}
for (int kkk = 0; kkk < m_List1.GetCount(); kkk++)
{
m_List1.DeleteString(kkk);
}
for (int kkk = 0; kkk < m_List1.GetCount(); kkk++)
{
m_List1.DeleteString(kkk);
}
for (int kkk = 0; kkk < m_List2.GetCount(); kkk++)
{
m_List2.DeleteString(kkk);
}
for (int kkk = 0; kkk < m_List2.GetCount(); kkk++)
{
m_List2.DeleteString(kkk);
}
for (int kkk = 0; kkk < m_List2.GetCount(); kkk++)
{
m_List2.DeleteString(kkk);
}
for (int kkk = 0; kkk < m_List3.GetCount(); kkk++)
{
m_List3.DeleteString(kkk);
}
m_Edit1.SetWindowTextW(_T(""));
m_Combo2.DeleteString(0);
m_Combo2.DeleteString(0);
m_Combo2.DeleteString(0);
//установка начальных параметров и их вывод
m_CGraph.style = 2;
m_CGraph.backcolor[0] = 131;
m_CGraph.backcolor[1] = 255;
m_CGraph.backcolor[2] = 205;
m_Check1.SetCheck(0);
m_Check2.SetCheck(0);
m_Check3.SetCheck(0);
m_Check4.SetCheck(0);
m_Radio1.SetCheck(0);
m_Radio2.SetCheck(0);
m_Radio3.SetCheck(0);
m_Radio4.SetCheck(0);
m_Radio5.SetCheck(0);
m_Radio6.SetCheck(0);
m_Radio7.SetCheck(0);
m_Radio8.SetCheck(0);
m_Radio9.SetCheck(0);
m_Radio10.SetCheck(0);
m_Radio10.SetCheck(1);
m_Radio11.SetCheck(0);
m_CGraph.color1 = 26;
m_CGraph.color2 = 81;
m_CGraph.color3 = 255;
m_CGraph.display1 = true;
m_CGraph.display2 = true;
m_CGraph.display3 = true;
m_CGraph.display4 = true;
m_CGraph.stepX = 2;
m_CGraph.stepY = 2;
ParA = 0.5;
ParB = 0.7;
ParPhi = M_PI / 9.0;
ParK1 = 100;
ParK2 = 100;
ParK3 = 100;
Period = 100;
m_Slider1.SetPos(26);
m_Slider2.SetPos(81);
m_Slider3.SetPos(255);
m_Combo2.AddString(L"1");
m_Combo2.AddString(L"2");
m_Combo2.AddString(L"3");
m_List1_Var.Format(_T("A = %3.3f"), ParA);
m_List1.AddString(m_List1_Var);
m_List1_Var.Format(_T("B = %3.3f"), ParB);
m_List1.AddString(m_List1_Var);
m_List1_Var.Format(_T("Phi = %3.3f"), ParPhi);
m_List1.AddString(m_List1_Var);
m_List1_Var.Format(_T("K1 = %3.3f"), ParK1);
m_List1.AddString(m_List1_Var);
m_List1_Var.Format(_T("K2 = %3.3f"), ParK2);
m_List1.AddString(m_List1_Var);
m_List1_Var.Format(_T("K3 = %3.3f"), ParK3);
m_List1.AddString(m_List1_Var);
m_List1_Var.Format(_T("Period = %i"), Period);
m_List1.AddString(m_List1_Var);
//очистка значений
m_CGraph.m_vecGraph1.clear();
m_CGraph.m_vecGraph2.clear();
m_CGraph.m_vecGraph3.clear();
m_CGraph.m_vecGraph4.clear();
m_CGraph.m_iTimer = 0;
m_CGraph.Invalidate();
}
//выбор а
void CSmirnovKR2193V2Dlg::OnBnClickedRadio1()
{
choice = 1;
}
//выбор b
void CSmirnovKR2193V2Dlg::OnBnClickedRadio2()
{
choice = 2;
}
//выбор phi
void CSmirnovKR2193V2Dlg::OnBnClickedRadio3()
{
choice = 3;
}
//выбор k1
void CSmirnovKR2193V2Dlg::OnBnClickedRadio4()
{
choice = 4;
}
//выбор k2
void CSmirnovKR2193V2Dlg::OnBnClickedRadio5()
{
choice = 5;
}
//выбор k3
void CSmirnovKR2193V2Dlg::OnBnClickedRadio6()
{
choice = 6;
}
//выбор периода
void CSmirnovKR2193V2Dlg::OnBnClickedRadio7()
{
choice = 7;
}
//выбор отображения
void CSmirnovKR2193V2Dlg::OnBnClickedRadio8()
{
choice = 8;
}
//изменение параметров
void CSmirnovKR2193V2Dlg::OnBnClickedButton3()
{
UpdateData();
//Ввод значения m_Edit1_Var из элемента управления m_Edit1
m_Edit1.GetWindowTextW(m_Edit1_Var);
//Преобразование строковой переменной m_Edit1_Var в переменную с плавающей точкой
float Var = _wtof(m_Edit1_Var);
int Var7 = StrToInt(m_Edit1_Var);
switch (choice) {
case 1:
if (Var >= 0.5 && Var <= 5.0) {
ParA = Var;
}
else AfxMessageBox(_T("Некорректное значение"));
break;
case 2:
if (Var >= 0.7 && Var <= 1.9) {
ParB = Var;
}
else AfxMessageBox(_T("Некорректное значение"));
break;
case 3:
if (Var >= 0.349 && Var <= 5.12) {
ParPhi = Var;
}
else AfxMessageBox(_T("Некорректное значение"));
break;
case 4:
ParK1 = Var;
break;
case 5:
ParK2 = Var;
break;
case 6:
ParK3 = Var;
break;
case 7:
if (Var7 >= 100 && Var7 <= 1000) {
Period = Var;
}
else AfxMessageBox(_T("Некорректное значение"));
break;
case 8:
m_Check1.GetCheck();
m_Check2.GetCheck();
m_Check3.GetCheck();
m_Check4.GetCheck();
if (m_Check1_Var) {
m_CGraph.display1 = false;
}
else {
m_CGraph.display1 = true;
}
if (m_Check2_Var) {
m_CGraph.display2 = false;
}
else {
m_CGraph.display2 = true;
}
if (m_Check3_Var) {
m_CGraph.display3 = false;
}
else {
m_CGraph.display3 = true;
}
if (m_Check4_Var) {
m_CGraph.display4 = false;
}
else {
m_CGraph.display4 = true;
}
break;
}
for (int kkk = 0; kkk < m_List1.GetCount(); kkk++)
{
m_List1.DeleteString(kkk);
}
for (int kkk = 0; kkk < m_List1.GetCount(); kkk++)
{
m_List1.DeleteString(kkk);
}
for (int kkk = 0; kkk < m_List1.GetCount(); kkk++)
{
m_List1.DeleteString(kkk);
}
m_List1_Var.Format(_T("A = %3.3f"), ParA);
m_List1.AddString(m_List1_Var);
m_List1_Var.Format(_T("B = %3.3f"), ParB);
m_List1.AddString(m_List1_Var);
m_List1_Var.Format(_T("Phi = %3.3f"), ParPhi);
m_List1.AddString(m_List1_Var);
m_List1_Var.Format(_T("K1 = %3.3f"), ParK1);
m_List1.AddString(m_List1_Var);
m_List1_Var.Format(_T("K2 = %3.3f"), ParK2);
m_List1.AddString(m_List1_Var);
m_List1_Var.Format(_T("K3 = %3.3f"), ParK3);
m_List1.AddString(m_List1_Var);
m_List1_Var.Format(_T("Period = %i"), Period);
m_List1.AddString(m_List1_Var);
}
//выбор стиля сетки
void CSmirnovKR2193V2Dlg::OnBnClickedRadio9()
{
m_CGraph.style = 1;
}
void CSmirnovKR2193V2Dlg::OnBnClickedRadio10()
{
m_CGraph.style = 2;
}
void CSmirnovKR2193V2Dlg::OnBnClickedRadio11()
{
m_CGraph.style = 3;
}
//выбор фона
void CSmirnovKR2193V2Dlg::OnCbnSelchangeCombo2()
{
CString Str;
//Получение положения курсора
int Combo1SelItem = m_Combo2.GetCurSel();
//Получение текста из позиции курсора
m_Combo2.GetLBText(Combo1SelItem, Str);
//изменение периода
switch (StrToInt(Str)) {
case 1:
m_CGraph.backcolor[0] = 131;
m_CGraph.backcolor[1] = 255;
m_CGraph.backcolor[2] = 205;
break;
case 2:
m_CGraph.backcolor[0] = 255;
m_CGraph.backcolor[1] = 205;
m_CGraph.backcolor[2] = 131;
break;
case 3:
m_CGraph.backcolor[0] = 205;
m_CGraph.backcolor[1] = 131;
m_CGraph.backcolor[2] = 255;
break;
}
}
//изменение доли цвета
void CSmirnovKR2193V2Dlg::OnNMReleasedcaptureSlider1(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: добавьте свой код обработчика уведомлений
m_Slider1_Var = m_Slider1.GetPos();
m_CGraph.color1 = m_Slider1_Var;
*pResult = 0;
}
void CSmirnovKR2193V2Dlg::OnNMReleasedcaptureSlider2(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: добавьте свой код обработчика уведомлений
m_Slider2_Var = m_Slider2.GetPos();
m_CGraph.color2 = m_Slider2_Var;
*pResult = 0;
}
void CSmirnovKR2193V2Dlg::OnNMReleasedcaptureSlider3(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: добавьте свой код обработчика уведомлений
m_Slider3_Var = m_Slider3.GetPos();
m_CGraph.color3 = m_Slider3_Var;
*pResult = 0;
}
8.2 Файл Smirnov_KR_2193_V2Dlg.h
// Smirnov_KR_2193_V2Dlg.h: файл заголовка
//
#include "CGraph.h"
#pragma once
// Диалоговое окно CSmirnovKR2193V2Dlg
class CSmirnovKR2193V2Dlg : public CDialogEx
{
// Создание
public:
CSmirnovKR2193V2Dlg(CWnd* pParent = nullptr); // стандартный конструктор
// Данные диалогового окна
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_SMIRNOV_KR_2193_V2_DIALOG };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // поддержка DDX/DDV
// Реализация
protected:
HICON m_hIcon;
// Созданные функции схемы сообщений
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnTimer(UINT_PTR nIDEvent);
afx_msg void OnBnClickedButton1();
afx_msg void OnBnClickedButton2();
CGraph m_CGraph;
// параметр к графику 1
float ParA;
// параметр к графику 2
float ParB;
// параметр к графику 1
float ParPhi;
// коэфиценты дискретизации
float ParK1,ParK2,ParK3;
CListBox m_List1;
CString m_List1_Var;
// Период таймера
int Period;
afx_msg void OnBnClickedButton4();
// выбор параметра
int choice;
afx_msg void OnBnClickedRadio1();
afx_msg void OnBnClickedRadio2();
afx_msg void OnBnClickedRadio3();
afx_msg void OnBnClickedRadio4();
afx_msg void OnBnClickedRadio5();
afx_msg void OnBnClickedRadio6();
afx_msg void OnBnClickedRadio7();
afx_msg void OnBnClickedRadio8();
afx_msg void OnBnClickedButton3();
CEdit m_Edit1;
CString m_Edit1_Var;
CListBox m_List2;
CString m_List2_Var;
CListBox m_List3;
CString m_List3_Var;
afx_msg void OnBnClickedRadio9();
afx_msg void OnBnClickedRadio10();
afx_msg void OnBnClickedRadio11();
CComboBox m_Combo2;
afx_msg void OnCbnSelchangeCombo2();
CButton m_Check1;
CButton m_Check2;
CButton m_Check3;
CButton m_Check4;
BOOL m_Check4_Var;
BOOL m_Check3_Var;
BOOL m_Check2_Var;
BOOL m_Check1_Var;
CSliderCtrl m_Slider1;
CSliderCtrl m_Slider2;
CSliderCtrl m_Slider3;
int m_Slider3_Var;
int m_Slider2_Var;
int m_Slider1_Var;
afx_msg void OnNMReleasedcaptureSlider1(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnNMReleasedcaptureSlider2(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnNMReleasedcaptureSlider3(NMHDR* pNMHDR, LRESULT* pResult);
CButton m_Radio1;
CButton m_Radio2;
CButton m_Radio3;
CButton m_Radio4;
CButton m_Radio5;
CButton m_Radio6;
CButton m_Radio7;
CButton m_Radio8;
CButton m_Radio9;
CButton m_Radio10;
CButton m_Radio11;
};
8.3 Файл CGraph.cpp
void CGraph::OnPaint()
{
CPaintDC dc(this); // device context for painting
//CRect - класс, определяющий размеры прямоугольной области
CRect rc;
//Получение размеров прямоугольной области
GetClientRect(&rc);
//Получение ширины и высоты прямоугольной области
m_w = rc.Width();
m_h = rc.Height();
//Установка стартовой точки графика по x
int x_start = 0;
//Установка стартовой точки графика по y
int y_start = m_h / 2;
//Установка шага сетки по x
int y_Step_Grid = m_h / (stepY * 2);
//Установка шага сетки по y
int x_Step_Grid = m_w / (stepX);
//Класс CRgn предназначен для того, чтобы обрезать графическое изображение,
// если оно выйдет за пределы заданной прямоугольной области
CRgn rgn;
rgn.CreateRectRgn(rc.left, rc.top, rc.right, rc.bottom);
dc.SelectClipRgn(&rgn);
//Окрашивание прямоугольной области выбранным цветом
dc.FillSolidRect(rc, RGB(backcolor[0], backcolor[1], backcolor[2]));
//Класс CPen - предназначен для рисования, создает объект перо
//Рисуются линии сетки
//Точечная линия (PS_DOT) с толщиной 1 пиксель черного цвета
CPen pG(style, 1, RGB(0, 0, 0));
//Сохранение старого пера, чтобы можно было восстановить
HGDIOBJ old = dc.SelectObject(pG);
//Цикл прорисовки линий вертикальной сетки с заданным шагом
for (int j = 0; j <= m_h; j = j + y_Step_Grid)
{
//Установка пера в начальную точку с указанными координатами
dc.MoveTo(x_start, j);
//Прорисовка линии до точки с указанными координатами
dc.LineTo(m_w, j);
}
//Цикл прорисовки линий горизонтальной сетки с заданным шагом
for (int j = x_Step_Grid; j <= m_w; j = j + x_Step_Grid)
{
dc.MoveTo(j, 0);
dc.LineTo(j, m_h);
}
//Создание нового пера для рисования осей графика
//PS_SOLID - сплошная линия
CPen pG_Axis(PS_SOLID, 1, RGB(0, 0, 0));
dc.SelectObject(pG_Axis);
//Прорисовка линий осей
dc.MoveTo(x_start, y_start);
dc.LineTo(m_w, y_start);
dc.MoveTo(x_start, 0);
dc.LineTo(x_start, m_h);
//Создание нового пера для рисования линии графика функции
//Получение текущего размера вектора
int vecSize = m_vecGraph1.size();
//Прорисовка линии графика 1
if (display1) {
CPen pG_Graph(PS_SOLID, 1, RGB(81, color1, 255));
dc.SelectObject(pG_Graph);
//Установка пера в начальную точку со стартовыми координатами
dc.MoveTo(x_start, y_start);
//Прорисовка линии графика 1
for (int i = 0; i < vecSize; i++) {
dc.LineTo(x_start + i, y_start - m_vecGraph1.at(i) / stepY);
}
}
//Прорисовка линии графика 2
if (display2) {
CPen pG_Graph(PS_SOLID, 1, RGB(color2, 26, 255));
dc.SelectObject(pG_Graph);
//Установка пера в начальную точку со стартовыми координатами
dc.MoveTo(x_start, y_start);
//Прорисовка линии графика 1
for (int i = 0; i < vecSize; i++) {
dc.LineTo(x_start + i, y_start - m_vecGraph2.at(i) / stepY);
}
}
//Прорисовка линии графика 3
if (display3) {
CPen pG_Graph(PS_SOLID, 1, RGB(81, 26, 255));
dc.SelectObject(pG_Graph);
//Установка пера в начальную точку со стартовыми координатами
dc.MoveTo(x_start, y_start);
//Прорисовка линии графика 1
for (int i = 0; i < vecSize; i++) {
dc.LineTo(x_start + i, y_start - m_vecGraph3.at(i) / stepY);
}
}
//Прорисовка линии графика 4
if (display4) {
CPen pG_Graph(PS_SOLID, 1, RGB(81, 26, color3));
dc.SelectObject(pG_Graph);
//Установка пера в начальную точку со стартовыми координатами
dc.MoveTo(x_start, y_start);
//Прорисовка линии графика 1
for (int i = 0; i < vecSize; i++) {
dc.LineTo(x_start + i, y_start - m_vecGraph4.at(i) / stepY);
}
}
//Восстановление старого пера
dc.SelectObject(old);
}
8.4 Файл CGraph.h
#pragma once
#include
#include
class CGraph :
public CStatic
{
public:
DECLARE_MESSAGE_MAP()
afx_msg void OnPaint();
public:
//стиль сетки
int style = PS_DOT;
//цвет фона
int backcolor[3] = { 131, 255, 205 };
bool display1 = true;
bool display2 = true;
bool display3 = true;
bool display4 = true;
//значения функций
std::vector
std::vector
std::vector
std::vector
//цвета
int color1 = 26, color2 = 81, color3 = 255;
// шаги сетки
int stepX, stepY;
//значения таймера
int m_iTimer;
int m_x, m_y;
int m_w;
int m_h;;
};
9. результаты работы программы
Результат работы программы после запуска – рис.4
Рисунок 4 – По умолчанию
Результат работы программы при изменении стиля сетки– рис. 5, рис. 6
Рисунок 5 – Изменение сетки Рисунок 6 – Изменение сетки 2
Результат работы программы при изменении цвета фона– рис. 7, рис. 8
Рисунок 7 – Изменение цвета фона Рисунок 8 – Изменение цвета фона 2
Результат работы программы при изменении настроек отображения представлен на рисункках – 9, 10, 11
Рисунок 9 – Изм. Отображения Рисунок 10 – Изм. Отображения 2
Рисунок 11 – Изм. Отображения 3
Результат работы программы при изменении настроек ползунков представлен на рисунках 12 и 13.
Рисунок 12 – Изм. Настроек ползунка Рисунок 13 – Изм. Настроек ползунка 2
Результат работы программы при изменнении переменных в верхных диапазонах – рисунки 14 и 15.
Рисунок 14 – изменение параметров Рисунок 15 – изменение параметров 2
Результат работы программы при введении значения, не входящего в допустимый диапазон представлен на рисунке 16.
Рисунок 16 – Некорректное значение
заключение
Проект реализован в соответствии с заданием. Графики функций отображаются корректно и в нужном месте, графическая кастомизация функционирует стабильно, изменение соответствующих параметров работает исправно. Интерфейс приложения включает в себя разнообразные инструменты настройки отображения графиков функции.