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

📄 mousedrawview.cpp

📁 vc++程序设计与技巧中第8章“图形图像编程”部分的VC++原代码
💻 CPP
字号:
// MouseDrawView.cpp : implementation of the CMouseDrawView class
//

#include "stdafx.h"
#include "MouseDraw.h"

#include "MouseDrawDoc.h"
#include "MouseDrawView.h"
#include <math.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMouseDrawView
#define LINE 0
#define CIRCLE 1
#define RECTANGLE 2

IMPLEMENT_DYNCREATE(CMouseDrawView, CView)

BEGIN_MESSAGE_MAP(CMouseDrawView, CView)
	//{{AFX_MSG_MAP(CMouseDrawView)
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_COMMAND(IDC_DRAW_CIRCLE, OnDrawCircle)
	ON_COMMAND(IDC_DRAW_LINE, OnDrawLine)
	ON_COMMAND(IDC_DRAW_RECT, OnDrawRect)
	ON_WM_MOUSEMOVE()
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMouseDrawView construction/destruction

CMouseDrawView::CMouseDrawView()
{
	// TODO: add construction code here
	m_StartP.x = 0 ;
	m_StartP.y = 0 ;
	m_EndP.x = 0 ;
	m_EndP.y = 0 ;
	m_Step = 0 ;
	m_bLine = FALSE ;
	m_CenterP.x = 0 ;
	m_CenterP.y = 0 ;
	m_AroundP.x = 0 ;
	m_AroundP.y = 0 ;
	m_bCircle = FALSE ;
	m_ltP.x = 0;
	m_ltP.y = 0;
	m_rbP.x = 0;
	m_rbP.y = 0;
	m_bRect = FALSE ;
}

CMouseDrawView::~CMouseDrawView()
{
}

BOOL CMouseDrawView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CMouseDrawView drawing

void CMouseDrawView::OnDraw(CDC* pDC)
{
	CMouseDrawDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	if(m_bRect)
	{
		DrawRect(pDC,m_ltP,m_rbP) ;
		m_bRect = !m_bRect;
	}
}

/////////////////////////////////////////////////////////////////////////////
// CMouseDrawView printing

BOOL CMouseDrawView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CMouseDrawView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CMouseDrawView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CMouseDrawView diagnostics

#ifdef _DEBUG
void CMouseDrawView::AssertValid() const
{
	CView::AssertValid();
}

void CMouseDrawView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CMouseDrawDoc* CMouseDrawView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMouseDrawDoc)));
	return (CMouseDrawDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMouseDrawView message handlers

void CMouseDrawView::DrawLine(CDC *pDC, CPoint start, CPoint end)
{

	pDC->SelectStockObject(BLACK_PEN);
	pDC->MoveTo(start);
	pDC->LineTo(end);

}

void CMouseDrawView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CDC *pDC = GetDC();
	switch(m_DrawType)
	{
	case LINE:
		{
			switch(m_Step)
			{
			case 0://当第一次按下鼠标左键
				//确定直线段的起点
				m_StartP = m_EndP = point;	
				DrawCross(pDC,m_StartP);
				//等待输入直线段的终点
				m_Step++;
				break;
			case 1://当第二次按下鼠标左键
				//确定直线段的终点
				m_EndP = point;
				m_Step = 0;
				//标志生成该直线段
				m_bLine = true;
				//绘制新直线
				DrawLine(pDC,m_StartP,m_EndP);
				DrawCross(pDC,m_EndP);
				break;
			default:;
			}
		}
		break;
	case CIRCLE:
		{
			switch(m_Step) 
			{
				case 0://当第一次按下鼠标左键
					//确定圆的中心点
					m_CenterP = m_AroundP = point ;
					DrawCross(pDC,m_CenterP);
					//等待输入圆周上的任意点
					m_Step++ ;
					break;
				case 1://当第二次按下鼠标左键
					//确定圆周上的点
					m_AroundP = point ;
					m_Step = 0 ;
					//标志生成该圆
					m_bCircle = true ;
					//绘制新圆
					DrawCircle(pDC,m_CenterP, m_AroundP) ;
					break;
				default:;//为空操作,表示不再绘制新的圆
			}
		}
		break;
	case RECTANGLE:
		{
			switch(m_Step)
			{
				case 0://当第一次按下鼠标左键
					//确定矩形的左上角点
					m_ltP = m_rbP = point ;
					//等待输入矩形的右下角点
					m_Step++ ;
					break;
				case 1://当第二次按下鼠标左键
					//确定矩形的右下角点
					m_rbP = point ;
					m_Step = 0 ;
					//标志生成该矩形
					m_bRect = true;
					//绘制新矩形
					DrawRect(pDC,m_ltP, m_rbP) ;
					break;
				default:;//为空操作,表示不再绘制新的矩形
			}
		}
		break;
	}
	ReleaseDC(pDC);
	CView::OnLButtonDown(nFlags, point);
}

void CMouseDrawView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CView::OnLButtonUp(nFlags, point);
}

void CMouseDrawView::DrawCircle(CDC* pDC, CPoint cenp, CPoint ardp)//add by user
{
	int radius = ComputeRadius(cenp, ardp) ;
	CRect rc(cenp.x - radius,cenp.y - radius, cenp.x + radius, cenp.y + radius) ;
	
	pDC->Ellipse(rc) ;
}
//计算半径
int CMouseDrawView::ComputeRadius(CPoint cenp, CPoint ardp)
{
	int dx = cenp.x - ardp.x ;
	int dy = cenp.y - ardp.y ;
	return (int)sqrt(dx*dx + dy*dy) ;
}

void CMouseDrawView::DrawRect(CDC* pDC, CPoint ltp,CPoint rbp) 
{
	pDC->Rectangle(ltp.x,ltp.y, rbp.x, rbp.y) ;
}

void CMouseDrawView::OnDrawCircle() 
{
	// TODO: Add your command handler code here
	m_DrawType = CIRCLE;
}

void CMouseDrawView::OnDrawLine() 
{
	// TODO: Add your command handler code here
	m_DrawType = LINE;
}

void CMouseDrawView::OnDrawRect() 
{
	// TODO: Add your command handler code here
	m_DrawType = RECTANGLE;
}

void CMouseDrawView::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CDC *pDC = GetDC();
	//设置绘图模式,并将先前的绘图模式加以保存
	int nDrawmode = pDC->SetROP2(R2_NOT) ;
	//将库存GDI对象选进设备环境
	pDC->SelectStockObject(NULL_BRUSH) ;
	switch(m_DrawType)
	{
	case LINE:
		{
			if(m_Step != 0)//如果不是起始点,拉出橡皮线
			{
				if (m_EndP.x != 0)
				{
					// 如果不是第一次绘制直线, 则擦除上一条直线
					DrawLine(pDC,m_StartP,m_EndP);
				}

				// 更新直线终点的坐标值
				m_EndP.x = point.x;
				m_EndP.y = point.y;

				// 绘制新的直线
				DrawLine(pDC,m_StartP,m_EndP);
			}
		}
		break;
	case CIRCLE:
		{
			if(m_Step != 0)//如果不是圆心点,拉出橡皮线
			{
				if (m_AroundP.x != 0)
				{
					// 如果不是第一次绘制圆, 则擦除上一个圆
					DrawCircle(pDC,m_CenterP,m_AroundP);
				}

				// 更新圆上任意点的坐标值
				m_AroundP.x = point.x;
				m_AroundP.y = point.y;

				// 绘制新的圆
				DrawCircle(pDC,m_CenterP,m_AroundP);
			}
		}
		break;
	case RECTANGLE:
		{
			if(m_Step != 0)//如果不是矩形左上角点,拉出橡皮线
			{
				if (m_rbP.x != 0)
				{
					// 如果不是第一次绘制矩形, 则擦除上一个矩形
					DrawRect(pDC,m_ltP,m_rbP);
				}

				// 更新矩形右下角点的坐标值
				m_rbP.x = point.x;
				m_rbP.y = point.y;

				// 绘制新的矩形
				DrawRect(pDC,m_ltP,m_rbP);
			}
		}
		break;
	default:;
	}
	//恢复到先前的绘图模式
	pDC->SetROP2(nDrawmode) ;
	ReleaseDC(pDC);
	CView::OnMouseMove(nFlags, point);
}

void CMouseDrawView::DrawCross(CDC *pDC, CPoint point)
{
	CPen NewPen(PS_SOLID, 1, RGB(255,0,0));
	CPen *pOldPen = pDC->SelectObject(&NewPen);

	pDC->MoveTo(point.x-4,point.y);
	pDC->LineTo(point.x+4,point.y);
	pDC->MoveTo(point.x,point.y-4);
	pDC->LineTo(point.x,point.y+4);

	pDC->SelectObject(pOldPen);
}

⌨️ 快捷键说明

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