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

📄 drawview.cpp

📁 采用VC6.0做的一个画图板程序
💻 CPP
字号:
// drawView.cpp : implementation of the CDrawView class
//

#include "stdafx.h"
#include "draw.h"

#include "drawDoc.h"
#include "drawView.h"
#include "drawView.h"
#include "Setting.h"
#include "TestLine.h"


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

/////////////////////////////////////////////////////////////////////////////
// CDrawView

IMPLEMENT_DYNCREATE(CDrawView, CView)

BEGIN_MESSAGE_MAP(CDrawView, CView)
	//{{AFX_MSG_MAP(CDrawView)
	ON_WM_LBUTTONDOWN()
	ON_COMMAND(ID_DRAW_LINE, OnDrawLine)
	ON_WM_LBUTTONUP()
	ON_WM_CANCELMODE()
	ON_WM_MOUSEMOVE()
	ON_COMMAND(ID_DRAW_RECT, OnDrawRect)
	ON_COMMAND(ID_DRAW_ELLIPSE, OnDrawEllipse)
	ON_COMMAND(ID_DRAW_BEZIER, OnDrawBezier)
	ON_COMMAND(ID_DRAW_BSPLINE, OnDrawBspline)
	ON_WM_RBUTTONDOWN()
	ON_COMMAND(ID_DRAW_CIRCLE, OnDrawCircle)
	ON_COMMAND(ID_DRAW_CUBE, OnDrawCube)
	ON_COMMAND(IDR_TOOL_PEN, OnToolPen)
	ON_COMMAND(IDR_DRAW_CONFIG, OnDrawConfig)
	ON_COMMAND(ID_DDA, OnDdaTest)
	//}}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()

/////////////////////////////////////////////////////////////////////////////
// CDrawView construction/destruction

CDrawView::CDrawView()
{
	// TODO: add construction code here
	m_nDrawType=0;
	m_OriginPos=0;
	m_IsDrawing=false;
	m_BezierPointNum=-1;
}

CDrawView::~CDrawView()
{
}

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

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

BOOL CDrawView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs
	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CDrawView drawing

void CDrawView::OnDraw(CDC* pDC)
{
	CDrawDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	m_lines.DrawLine((CClientDC *)pDC);
	m_rects.DrawRect((CClientDC *)pDC);
	m_ellipses.DrawEllipse((CClientDC *)pDC);
	m_handpoints.DrawPoint((CClientDC *)pDC);
	
	if(m_BezierPointNum>=1)
	{
		DPoint p[100];
        pDC->SetROP2(R2_COPYPEN);    
 		memcpy(p,m_BezierPoints,sizeof(p));
		
		CPen pen, *oldPen;
		pen.CreatePen(PS_SOLID,1,RGB(255,0,0));  
		oldPen = pDC->SelectObject(&pen);
 		DrawBezier(p,m_BezierPointNum,(CClientDC *)pDC);
		pDC->SelectObject(oldPen);
		
		for(int i=0;i<=m_BezierPointNum-1;i++)
		{
			pDC->MoveTo(m_BezierPoints[i].x,m_BezierPoints[i].y);    
			pDC->LineTo(m_BezierPoints[i+1].x,m_BezierPoints[i+1].y); 
		}
		for(int j=0;j<=m_BezierPointNum;j++)
		{   
			pDC->Ellipse(m_BezierPoints[j].x-3,m_BezierPoints[j].y-3,m_BezierPoints[j].x+3,m_BezierPoints[j].y+3);
		}
	}
	// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CDrawView printing

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

/////////////////////////////////////////////////////////////////////////////
// CDrawView diagnostics

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

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

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

void CDrawView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CClientDC* m_pDC;
	m_pDC=new CClientDC(this);
	m_pDC->SelectStockObject(NULL_BRUSH); 
    CPen pen, *oldPen;
	pen.CreatePen(PS_SOLID,1,RGB(0,0,0));  
	oldPen = m_pDC->SelectObject(&pen);
	switch(m_nDrawType)
	{
	case 1:
		m_OriginPos=point;
		m_TargetPos=point;
		m_IsDrawing=true;
		break;
	case 2:
		m_OriginPos=point;
		m_TargetPos=point;
		m_IsDrawing=true;
		break;
	case 3:
		m_OriginPos=point;
		m_TargetPos=point;
		m_IsDrawing=true;
		break;
	case 4:
		//如果控制点数大于2,则画控制多边形
		if(m_BezierPointNum>=1)
		{
			m_pDC->SetROP2(R2_COPYPEN);
			m_pDC->MoveTo(m_BezierPoints[m_BezierPointNum].x,m_BezierPoints[m_BezierPointNum].y);   
			m_pDC->LineTo(point.x,point.y);
		}
		//增加新控制点
		m_BezierPointNum++;
		m_BezierPoints[m_BezierPointNum].x=point.x;
		m_BezierPoints[m_BezierPointNum].y=point.y;
		//将控制点放大为圆
        m_pDC->SetROP2(R2_COPYPEN);    
		m_pDC->Ellipse(CRect(point.x-3,point.y-3,point.x+3,point.y+3));
		break;
	case 6:
		m_OriginPos=point;
		m_TargetPos=point;
		m_IsDrawing=true;
		break;
	case 7:
		m_OriginPos=point;
		m_TargetPos=point;
		m_IsDrawing=true;
		break;
	case 8:
		m_handpoints.AddPoint(point);
		m_IsDrawing=true;
		break;
	}
	m_pDC->SelectObject(oldPen);
	delete m_pDC;
	CView::OnLButtonDown(nFlags, point);
}

void CDrawView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CPoint PointBuffer;
	double R;
	switch(m_nDrawType)
	{
	case 1:
		m_IsDrawing=false;
		m_TargetPos=point;
		m_lines.AddLine(m_OriginPos,m_TargetPos);
		RedrawWindow();
		break;
	case 2:
		m_IsDrawing=false;
		m_TargetPos=point;
		m_rects.AddRect(m_OriginPos,m_TargetPos);
		RedrawWindow();
		break;
	case 3:
		m_IsDrawing=false;
		m_TargetPos=point;
		m_ellipses.AddEllipse(m_OriginPos,m_TargetPos);
		RedrawWindow();
		break;
	case 4:
		m_TargetPos=point;
		RedrawWindow();
 		break;	
	case 6:
		m_IsDrawing=false;
		PointBuffer.x=point.x-m_OriginPos.x;
		m_TargetPos.x=m_OriginPos.x+PointBuffer.x;
		m_TargetPos.y=m_OriginPos.y+PointBuffer.x;
		m_rects.AddRect(m_OriginPos,m_TargetPos);
		RedrawWindow();
		break;
	case 7:
		m_IsDrawing=false;
		PointBuffer=m_OriginPos;
		R=point.x-m_OriginPos.x;
		m_OriginPos.x=PointBuffer.x-R*(2^(1/2))/2;
		m_OriginPos.y=PointBuffer.y-R*(2^(1/2))/2;
		m_TargetPos.x=PointBuffer.x+R*(2^(1/2))/2;
		m_TargetPos.y=PointBuffer.y+R*(2^(1/2))/2;
		m_ellipses.AddEllipse(m_OriginPos,m_TargetPos);
		RedrawWindow();
		break;
	case 8:
		m_IsDrawing=false;
		PointBuffer=m_OriginPos;
		RedrawWindow();
		break;
	}
	CView::OnLButtonUp(nFlags, point);
}

void CDrawView::OnCancelMode() 
{
	CView::OnCancelMode();
	// TODO: Add your message handler code here	
}

void CDrawView::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if(m_IsDrawing==false)
		return;
	CClientDC* m_pDC;
	m_pDC=new CClientDC(this);
	m_pDC->SelectStockObject(NULL_BRUSH);
	CPen pen, *oldPen;
	pen.CreatePen(PS_SOLID,1,RGB(0,0,0));  
	oldPen = m_pDC->SelectObject(&pen);

	CPoint PointBuffer;
	CPoint PointBuffer1;
	CPoint PointBuffer2;
	double R;

	switch(m_nDrawType)
	{
	case 1:   
		m_pDC->SetROP2(R2_NOT);
		m_pDC->MoveTo(m_OriginPos.x,m_OriginPos.y);    
		m_pDC->LineTo(m_TargetPos.x,m_TargetPos.y);     
		m_TargetPos = point;     
		m_pDC->MoveTo(m_OriginPos.x,m_OriginPos.y);    
		m_pDC->LineTo(m_TargetPos.x,m_TargetPos.y);    
		break;
	case 2:  
		m_pDC->SetROP2(R2_NOT);
		m_pDC->Rectangle(CRect(m_OriginPos,m_TargetPos));    
		m_TargetPos = point;     
		m_pDC->Rectangle(CRect(m_OriginPos,m_TargetPos));    
		break;
	case 3: 
		m_pDC->SetROP2(R2_NOT);
		m_pDC->Ellipse(CRect(m_OriginPos,m_TargetPos));    
		m_TargetPos = point;    
		m_pDC->Ellipse(CRect(m_OriginPos,m_TargetPos));    
		break;
	case 4:
		break;
	case 6: 	
		m_pDC->SetROP2(R2_NOT);
		PointBuffer.x=m_TargetPos.x;
		PointBuffer.y=m_OriginPos.y+(m_TargetPos.x-m_OriginPos.x);
		m_pDC->Rectangle(CRect(m_OriginPos,PointBuffer));    
		m_TargetPos = point; 
		PointBuffer.x=m_TargetPos.x;
		PointBuffer.y=m_OriginPos.y+(m_TargetPos.x-m_OriginPos.x);
		m_pDC->Rectangle(CRect(m_OriginPos,PointBuffer));    
		break;
	case 7: 	
		m_pDC->SetROP2(R2_NOT);
		PointBuffer=m_OriginPos;	
		R=point.x-m_OriginPos.x;
		PointBuffer1.x=PointBuffer.x-R*(2^(1/2))/2;
		PointBuffer1.y=PointBuffer.y-R*(2^(1/2))/2;
		PointBuffer2.x=PointBuffer.x+R*(2^(1/2))/2;
		PointBuffer2.y=PointBuffer.y+R*(2^(1/2))/2;
		m_pDC->MoveTo(m_OriginPos.x,m_OriginPos.y);    
		m_pDC->LineTo(m_TargetPos.x,m_TargetPos.y);
		m_pDC->Ellipse(CRect(PointBuffer1,PointBuffer2));

		m_TargetPos = point; 
		
		PointBuffer=m_OriginPos;
		R=point.x-m_OriginPos.x;
		PointBuffer1.x=PointBuffer.x-R*(2^(1/2))/2;
		PointBuffer1.y=PointBuffer.y-R*(2^(1/2))/2;
		PointBuffer2.x=PointBuffer.x+R*(2^(1/2))/2;
		PointBuffer2.y=PointBuffer.y+R*(2^(1/2))/2;
		m_pDC->MoveTo(m_OriginPos.x,m_OriginPos.y);    
		m_pDC->LineTo(m_TargetPos.x,m_TargetPos.y);
		m_pDC->Ellipse(CRect(PointBuffer1,PointBuffer2));   
		break;
	case 8:
		m_handpoints.AddPoint(point);
		m_pDC->SetPixel(point,RGB(255,0,0));
		PointBuffer.x=point.x-1;
		PointBuffer.y=point.y-1;
		m_pDC->SetPixel(point,RGB(255,0,0));
		break;
	}
	m_pDC->SelectObject(oldPen);
	delete m_pDC;
	CView::OnMouseMove(nFlags, point);
}

void CDrawView::OnDrawLine()
{
	// TODO: Add your command handler code here
	m_nDrawType=1;
}

void CDrawView::OnDrawRect() 
{
	// TODO: Add your command handler code here
	m_nDrawType=2;
}

void CDrawView::OnDrawEllipse() 
{
	// TODO: Add your command handler code here
	m_nDrawType=3;
}

void CDrawView::OnDrawBezier()
{
	// TODO: Add your command handler code here
	m_nDrawType=4;
}

void CDrawView::OnDrawBspline() 
{
	// TODO: Add your command handler code here
	m_nDrawType=5;
}

void CDrawView::OnDrawCube() 
{
	// TODO: Add your command handler code here
	m_nDrawType=6;
}
void CDrawView::OnDrawCircle() 
{
	// TODO: Add your command handler code here
	m_nDrawType=7;
}

void CDrawView::OnToolPen() 
{
	// TODO: Add your command handler code here
	m_nDrawType=8;	
}


void CDrawView::DrawBezier(DPoint * p,int n,CClientDC * m_pDC)
{
	
	if (n <= 0) return;
	if((p[n].x < p[0].x+1) && (p[n].x > p[0].x-1) && (p[n].y < p[0].y+1) && (p[n].y > p[0].y-1))
	{
		m_pDC->SetPixel(p[0].x, p[0].y, RGB(0,0,0));
		return;
	}
	DPoint *p1;
	p1 = new DPoint[n+1];
	
	int i, j;
	p1[0] = p[0];
	for(i=1; i<=n; i++)
	{
		for(j=0; j<=n-i;j++)
		{
			p[j].x = (p[j].x + p[j+1].x)/2;
			p[j].y = (p[j].y + p[j+1].y)/2;
		}
		p1[i] = p[0];
	}
	DrawBezier(p,n,m_pDC);
	DrawBezier(p1,n,m_pDC);
	delete p1;
}


void CDrawView::OnRButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	m_nDrawType=0;
	m_BezierPointNum=-1;
	CView::OnRButtonDown(nFlags, point);
}

CLine::CLine()
{
	m_LinesNum=0;
}
CLine::~CLine()
{
}

void CLine::AddLine(CPoint StartPoint, CPoint EndPoint)
{
	m_StartPoint[m_LinesNum]=StartPoint;
	m_EndPoint[m_LinesNum]=EndPoint;
	m_LinesNum++;
	return;
}

void CLine::DrawLine(CClientDC * pDC)
{
	if(m_LinesNum<=0)	
		return;
	
	pDC->SelectStockObject(NULL_BRUSH); 
    CPen pen, *oldPen;
	pen.CreatePen(PS_SOLID,1,RGB(255,0,0));  
	oldPen = pDC->SelectObject(&pen);

	for(int i=0;i<=m_LinesNum-1;i++)
	{
		pDC->SetROP2(R2_COPYPEN);   
		pDC->MoveTo(m_StartPoint[i].x,m_StartPoint[i].y);   
		pDC->LineTo(m_EndPoint[i].x,m_EndPoint[i].y);	
	}
	pDC->SelectObject(oldPen);
	
	return;
}

CHandPoints::CHandPoints()
{
	m_PointsNum=0;
}
CHandPoints::~CHandPoints()
{
}

void CHandPoints::AddPoint(CPoint Point)
{
	m_Point[m_PointsNum]=Point;
	m_PointsNum++;
	return;
}

void CHandPoints::DrawPoint(CClientDC * pDC)
{
	if(m_PointsNum<=0)	
		return;
	
	pDC->SelectStockObject(NULL_BRUSH); 
    CPen pen, *oldPen;
	pen.CreatePen(PS_SOLID,1,RGB(255,0,0));  
	oldPen = pDC->SelectObject(&pen);

	for(int i=0;i<=m_PointsNum-1;i++)
	{
		pDC->SetROP2(R2_COPYPEN);   
		pDC->SetPixel(m_Point[i],RGB(255,0,0));
	}
	pDC->SelectObject(oldPen);
	return;
}

CNewRect::CNewRect()
{
	m_RectsNum=0;
}

void CNewRect::AddRect(CPoint StartPoint, CPoint EndPoint)
{
	m_StartPoint[m_RectsNum]=StartPoint;
	m_EndPoint[m_RectsNum]=EndPoint;
	m_RectsNum++;
	return;
}

void CNewRect::DrawRect(CClientDC *pDC)
{

	if(m_RectsNum<=0)	
		return;
	
	pDC->SelectStockObject(NULL_BRUSH); 
    CPen pen, *oldPen;
	pen.CreatePen(PS_SOLID,1,RGB(255,0,0));  
	oldPen = pDC->SelectObject(&pen);

	for(int i=0;i<=m_RectsNum-1;i++)
	{
		pDC->SetROP2(R2_COPYPEN);   
		pDC->Rectangle(CRect(m_StartPoint[i],m_EndPoint[i]));	
	}
	pDC->SelectObject(oldPen);
	
	return;
}

CEllipse::CEllipse()
{
	m_EllipsesNum=0;
}

void CEllipse::AddEllipse(CPoint StartPoint, CPoint EndPoint)
{
	m_StartPoint[m_EllipsesNum]=StartPoint;
	m_EndPoint[m_EllipsesNum]=EndPoint;
	m_EllipsesNum++;
	return;
}

void CEllipse::DrawEllipse(CClientDC *pDC)
{

	if(m_EllipsesNum<=0)	
		return;
	
	pDC->SelectStockObject(NULL_BRUSH); 
    CPen pen, *oldPen;
	pen.CreatePen(PS_SOLID,1,RGB(255,0,0));  
	oldPen = pDC->SelectObject(&pen);

	for(int i=0;i<=m_EllipsesNum-1;i++)
	{
		pDC->SetROP2(R2_COPYPEN);   
		pDC->Ellipse(CRect(m_StartPoint[i],m_EndPoint[i]));	
	}
	pDC->SelectObject(oldPen);
	
	return;
}
void CDrawView::OnDrawConfig() 
{
	// TODO: Add your command handler code here
	CSetting drawconfig("画图属性");
	drawconfig.DoModal();
}

void CDrawView::OnDdaTest() 
{
	// TODO: Add your command handler code here
	CTestLine my_test;
	my_test.DoModal();
}

⌨️ 快捷键说明

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