Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
23
Добавлен:
02.05.2014
Размер:
4.1 Кб
Скачать
// 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