⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 line.cpp

📁 VC++ 编程宝典,电子工业出版社,源代码,第三部分
💻 CPP
字号:
// line.cpp : implementation of the CPaintLine class
//

#include "stdafx.h"
#include "line.h"
#include "math.h"

#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CPaintLine

IMPLEMENT_SERIAL(CPaintLine, CPainted, VERSIONABLE_SCHEMA)

void CPaintLine::Draw(CDC* pDC)
{
	CPen*	pOldPen;
	CPen	pDrawPen;

	pDrawPen.CreatePen(PS_SOLID, m_nWidth, m_rgbPrimary);
	pOldPen = pDC->SelectObject(&pDrawPen);

	pDC->MoveTo(m_pointPrimary);
	pDC->LineTo(m_pointEnd);

	pDC->SelectObject(pOldPen);
}

void CPaintLine::DragDraw(CDC* pDC, CPoint& pointDragged)
{
	pDC->SetROP2(R2_NOT);
	
	CPen*	pOldPen;
	CPen	pDrawPen;

	pDrawPen.CreatePen(PS_SOLID, m_nWidth, m_rgbPrimary);
	pOldPen = pDC->SelectObject(&pDrawPen);

	pDC->MoveTo(m_pointPrimary);
	pDC->LineTo(m_pointEnd);

	pDC->MoveTo(m_pointPrimary);
	pDC->LineTo(pointDragged);

	m_pointEnd = pointDragged;
	pDC->SelectObject(pOldPen);
}

void CPaintLine::DrawSelected(CDC* pDC)
{
	CPen*	pOldPen;
	CPen	pDrawPen;

	pDrawPen.CreatePen(PS_DASH, m_nWidth, m_rgbPrimary);
	pOldPen = pDC->SelectObject(&pDrawPen);

	pDC->MoveTo(m_pointPrimary);
	pDC->LineTo(m_pointEnd);

	pDC->SelectObject(pOldPen);
}

void CPaintLine::OnDown(CPoint& pointDown)
{
	m_pointEnd = m_pointPrimary = pointDown;
}

void CPaintLine::OnUp(CPoint& pointUp, CWnd* pWnd)
{
	m_pointEnd = pointUp;
 	NormalizePoints(m_pointPrimary, m_pointEnd);
}

BOOL CPaintLine::IsHit(CPoint& pointBang)
{
	// Warning: this routine was written by a fellow
	// who does not own a good book on graphics algorithms.
	// It would be much more efficient to do thi with integers...

	if (!((m_pointPrimary.x < pointBang.x) && (pointBang.x < m_pointEnd.x) &&
		  (m_pointPrimary.y < pointBang.y) && (pointBang.y < m_pointEnd.y)))
	{
		return FALSE;
	}

	double dSlope;
	double b;

	if (m_pointPrimary.x == m_pointEnd.x)
	{
		if (abs(pointBang.x - m_pointPrimary.x) < (5+m_nWidth))
		{
			if (pointBang.y <= m_pointEnd.y &&
				pointBang.y >= m_pointPrimary.y)
			{
				return TRUE;
			}
			else
			{
				return FALSE;
			}
		}
		else
		{
			return FALSE;
		}
	}
	else
	{
		dSlope = ((double) m_pointEnd.y - m_pointPrimary.y) /
				 ((double) m_pointEnd.x - m_pointPrimary.x);

		b = m_pointPrimary.y - dSlope*m_pointPrimary.x;

		if (fabs((pointBang.y - dSlope*pointBang.x) - b) <= (10+m_nWidth))
		{
			return TRUE;
		}
		else
		{
			return FALSE;
		}
	}

}

void CPaintLine::GetBoundingRect(CRect* pRect)
{
	pRect->left = m_pointPrimary.x;
	pRect->top = m_pointPrimary.y;
	pRect->right = m_pointEnd.x;
	pRect->bottom = m_pointEnd.y;
}

void CPaintLine::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
		ar << m_pointEnd;
	}
	else
	{
		ar >> m_pointEnd;
	}

	CPainted::Serialize(ar);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -