Файл: Приложение с графическим интерфейсом на языке.doc

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 25.10.2023

Просмотров: 83

Скачиваний: 4

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Алгоритм для ON_WM_PAINT():

  1. Создание переменной для прорисовки.

  2. Обозначение области рисования при помощи переменной.

  3. Обозначение старта.

  4. Обозначение шага сетки по X и по Y.

  5. Окраска области рисования.

  6. Создание выбора кисти для области рисования.

  7. Рисовка сетки при помощи цикла.

  8. Создание выбора кисти для X и Y.

  9. Непосредственное рисование осей.

  10. Обозначение размера вектора.

  11. Установка пера в обозначенный старт.

  12. Рисование графиков функции (создание и выбор кисти, цикл перемещения кисти, установка пера в начальную точку), если параметр отображения этого графика равен true.

  13. Непосредственное рисование графика

Алгоритм для таймера:

  1. Очистка List (1,2,3).

  2. Создание переменных для хранения рассчитанных значений графиков функций.

  3. Вычисление значений графиков функций

  4. Запись в вектор этих значений

  5. Удаление начальных значений векторов, если значение таймера больше области рисования.

  6. Округление значений графиков функций в новых переменных

  7. Масштабирование графиков, если выполняется условие

  8. Перерисовка поля элемента Static Text при помощи макроса ON_WM_PAINT.

  9. Увеличение таймера на +1.

  10. Очистка и заполнение 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(dc.GetSafeHdc()), 0);
// Выравнивание значка по центру клиентского прямоугольника

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

}

//таймер

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 m_vecGraph1;

std::vector m_vecGraph2;

std::vector m_vecGraph3;

std::vector m_vecGraph4;

//цвета

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 – Некорректное значение

заключение

Проект реализован в соответствии с заданием. Графики функций отображаются корректно и в нужном месте, графическая кастомизация функционирует стабильно, изменение соответствующих параметров работает исправно. Интерфейс приложения включает в себя разнообразные инструменты настройки отображения графиков функции.