Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторные работы2 / MOLab2 / MOLab2 / GraphicDlg
.cpp// GraphicDlg.cpp : implementation file
//
#include "stdafx.h"
#include "MOLab2.h"
#include "GraphicDlg.h"
// CGraphicDlg dialog
IMPLEMENT_DYNAMIC(CGraphicDlg, CDialog)
CGraphicDlg::CGraphicDlg(CWnd* pParent /*=NULL*/)
: CDialog(CGraphicDlg::IDD, pParent)
{
}
CGraphicDlg::~CGraphicDlg()
{
}
void CGraphicDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CGraphicDlg, CDialog)
ON_WM_PAINT()
END_MESSAGE_MAP()
// CGraphicDlg message handlers
void CGraphicDlg::OnPaint()
{
CPaintDC dc(this);
DrawGraph(&dc);
}
void CGraphicDlg::DrawGraph(CDC* pDC)
{
pDC->SelectStockObject(WHITE_PEN);
pDC->Rectangle(m_Canvas);
CPen red_pen(PS_SOLID, 1, RGB(255, 0, 0));
CPen green_pen(PS_SOLID, 1, RGB(0, 180, 0));
CPen gray_pen(PS_SOLID, 1, RGB(78, 78, 78));
CBrush br(RGB(178, 178, 178));
pDC->SelectObject(br);
pDC->SelectObject(gray_pen);
pDC->MoveTo(m_Canvas.left, m_Canvas.Height() / 2 + m_Canvas.top);
pDC->LineTo(m_Canvas.right, m_Canvas.Height() / 2 + m_Canvas.top);
pDC->MoveTo(m_Canvas.Width() / 2 + m_Canvas.left, m_Canvas.top);
pDC->LineTo(m_Canvas.Width() / 2 + m_Canvas.left, m_Canvas.bottom);
pDC->SetBkColor(RGB(235, 235, 235));
pDC->SetTextAlign(TA_CENTER | TA_TOP);
pDC->ExtTextOut(m_Canvas.Width() / 2 + m_Canvas.left, 2, ETO_OPAQUE, NULL, "X2", NULL);
pDC->SetTextAlign(TA_RIGHT | TA_BASELINE);
pDC->ExtTextOut(m_Canvas.right + 10, m_Canvas.Height() / 2 + m_Canvas.top + 5, ETO_OPAQUE, NULL, "X1", NULL);
pDC->SetPixel(0, 0, RGB(0, 0, 0));
int x = 0, y = 0;
for (int i = 0; i < m_Lines.GetCount(); i++)
{
x = int(m_Lines[i][0][0] * kx) + m_Canvas.Width() / 2 + m_Canvas.left;
y = - int(m_Lines[i][0][1] * ky) + m_Canvas.Height() / 2 + m_Canvas.top;
pDC->MoveTo(x, y);
for (int j = 1; j < m_Lines[i].GetCount(); j++)
{
x = int(m_Lines[i][j][0] * kx) + m_Canvas.Width() / 2 + m_Canvas.left;
y = - int(m_Lines[i][j][1] * ky) + m_Canvas.Height() / 2 + m_Canvas.top;
pDC->SetPixel(x, y, RGB(0, 0, 0));
}
}
x = int(m_Path[0][0] * kx) + m_Canvas.Width() / 2 + m_Canvas.left;
y = - int(m_Path[0][1] * ky) + m_Canvas.Height() / 2 + m_Canvas.top;
pDC->MoveTo(x, y);
pDC->Ellipse(x - 2, y - 2 , x + 2, y + 2);
double d = 255.0 / m_Path.GetCount();
int r = 0, g = 0, b = 0;
for (int i = 0; i < m_Path.GetCount(); i++)
{
r = 255 - 2 * int(d * i);
if (r < 0)
r = 0;
g = 0;
b = 2 * int(d * i);
if (b > 255)
b = 255;
red_pen.DeleteObject();
red_pen.CreatePen(PS_SOLID, 1, RGB(r, g, b));
pDC->SelectObject(red_pen);
x = int(m_Path[i][0] * kx) + m_Canvas.Width() / 2 + m_Canvas.left;
y = - int(m_Path[i][1] * ky) + m_Canvas.Height() / 2 + m_Canvas.top;
pDC->LineTo(x, y);
pDC->SelectObject(green_pen);
pDC->Ellipse(x - 2, y - 2, x + 2, y + 2);
}
int nOldROP = pDC->SetROP2(R2_XORPEN);
pDC->Ellipse(x - 2, y - 2, x + 2, y + 2);
pDC->SetROP2(nOldROP);
}
BOOL CGraphicDlg::OnInitDialog()
{
CDialog::OnInitDialog();
GetDlgItem(IDC_GRAPHIC_MAP)->GetWindowRect(&m_Canvas);
ScreenToClient(&m_Canvas);
m_Canvas.DeflateRect(12, 12, 11, 11);
CClientDC dc(this);
dc.SelectStockObject(WHITE_PEN);
dc.Rectangle(m_Canvas);
nMinX = nMaxX = m_Path[0][0];
nMinY = nMaxY = m_Path[0][1];
for (int i = 1; i < m_Path.GetCount(); i++)
{
nMinX = nMinX > m_Path[i][0] ? m_Path[i][0] : nMinX;
nMaxX = nMaxX < m_Path[i][0] ? m_Path[i][0] : nMaxX;
nMinY = nMinY > m_Path[i][1] ? m_Path[i][1] : nMinY;
nMaxY = nMaxY < m_Path[i][1] ? m_Path[i][1] : nMaxY;
}
kx = double(m_Canvas.Width()) / ( 2.0 * max(abs(nMinX), abs(nMaxX)) );
ky = double(m_Canvas.Height()) / ( 2.0 * max(abs(nMinY), abs(nMaxY)) );
kx = ky = min(kx, ky);
SetWindowText(m_strDialogName);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
INT_PTR CGraphicDlg::DoModal(CString strDialogName)
{
m_strDialogName = strDialogName;
return CDialog::DoModal();
}
Соседние файлы в папке MOLab2