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

📄 mdrowpenview.cpp

📁 提供一个图形工具界面
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// mDrowPenView.cpp : implementation of the CMDrowPenView class
//

#include "stdafx.h"
#include "mDrowPen.h"
#include "iostream"
#include "mDrowPenDoc.h"
#include "mDrowPenView.h"
#include "stdio.h"
#include <stdlib.h>
#include "SetSize.h"
#include "sizeDlg.h"
#include "SetColorDlg.h"
#include "MainFrm.h"

#include <math.h>
#include "cmath"
//using namespace std;


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

/////////////////////////////////////////////////////////////////////////////
// CMDrowPenView

IMPLEMENT_DYNCREATE(CMDrowPenView, CView)

BEGIN_MESSAGE_MAP(CMDrowPenView, CView)
	//{{AFX_MSG_MAP(CMDrowPenView)
	ON_WM_LBUTTONDBLCLK()
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_MOUSEMOVE()
	ON_COMMAND(ID_DRAW_LINE, OnDrawLine)
	ON_COMMAND(ID_DROW_THREAD, OnDrowThread)
	ON_COMMAND(ID_DROW_MLINE, OnDrowMline)
	ON_COMMAND(ID_DROW_ARC, OnDrowArc)
	ON_COMMAND(ID_DROW_CECLE, OnDrowCecle)
	ON_COMMAND(ID_DORW_RECT, OnDorwRect)
	ON_COMMAND(ID_DROW_ELLIPSE, OnDrowEllipse)
	ON_COMMAND(ID_SIZE, OnSize)
	ON_COMMAND(ID_COLOR, OnColor)
	ON_UPDATE_COMMAND_UI(ID_LEFT,OnUpdateXY)   //手动添加的消息映射
	ON_UPDATE_COMMAND_UI(ID_RIGHT,OnUpdateXY)  //手动
	//}}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()

/////////////////////////////////////////////////////////////////////////////
// CMDrowPenView construction/destruction

CMDrowPenView::CMDrowPenView()
{
	// TODO: add construction code here
	m_nFlag = 1;
	m_bFlag = false;

}

CMDrowPenView::~CMDrowPenView()
{
}

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

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CMDrowPenView drawing

void CMDrowPenView::OnDraw(CDC* pDC)
{
	CMDrowPenDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	pDC = GetDC();

	CBrush *pbrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH)); //用刷子防止画的封闭图形是实心的,
	pDC->SelectObject(pbrush);                                             // 因为画图模式SetROP2(R2_NOT)
	CBrush * pOldBrush = (CBrush *)pDC->SelectStockObject(NULL_BRUSH);

//重绘直线
	CPen mypen;
	for (p = head; p->next != NULL; p = p->next)
	{
		CPen pen;
		pen.CreatePen(PS_COSMETIC, p->nPenSize, RGB(p->nmyRed, p->nmyGreen, p->nmyBlue));
		pDC->SelectObject(&pen);
		pDC->SetROP2(R2_COPYPEN);
		
		pDC->MoveTo(p->Startpoint);
		pDC->LineTo(p->EndPoint);
		DeleteObject(&pen);

	}
	mypen.CreatePen(PS_COSMETIC, p->nPenSize, RGB(p->nmyRed, p->nmyGreen, p->nmyBlue));
	pDC->SelectObject(&mypen);
	pDC->SetROP2(R2_COPYPEN);
	
	pDC->MoveTo(p->Startpoint);
	pDC->LineTo(p->EndPoint);
	DeleteObject(&mypen);

//重绘折线
	CPen zmypen;
	for (zp = zhead; zp->next != NULL; zp = zp->next)
	{
		CPen pen;
		pen.CreatePen(PS_COSMETIC, zp->nPenSize, RGB(zp->nmyRed, zp->nmyGreen, zp->nmyBlue));
		pDC->SelectObject(&pen);
		pDC->SetROP2(R2_COPYPEN);
		
		pDC->MoveTo(zp->Startpoint);
		pDC->LineTo(zp->EndPoint);
		DeleteObject(&pen);
	}
	zmypen.CreatePen(PS_COSMETIC, zp->nPenSize, RGB(zp->nmyRed, zp->nmyGreen, zp->nmyBlue));
	pDC->SelectObject(&zmypen);
	pDC->SetROP2(R2_COPYPEN);
	
	pDC->MoveTo(zp->Startpoint);
	pDC->LineTo(zp->EndPoint);
	DeleteObject(&zmypen);

//重绘圆形
	CPen cpen;
	long NewLenth;
	for (cp = chead; cp->next != NULL; cp = cp->next)
	{
		CPen pen;
		pen.CreatePen(PS_COSMETIC, cp->nPenSize, RGB(cp->nmyRed, cp->nmyGreen, cp->nmyBlue));
		pDC->SelectObject(&pen);
		pDC->SetROP2(R2_COPYPEN);
		
		NewLenth = sqrtf((cp->EndPoint.x-cp->Startpoint.x)*(cp->EndPoint.x-cp->Startpoint.x)+
			(cp->EndPoint.y-cp->Startpoint.y)*(cp->EndPoint.y-cp->Startpoint.y));
		
		pDC->Ellipse(cp->Startpoint.x+NewLenth,cp->Startpoint.y-NewLenth,cp->Startpoint.x-NewLenth,
			cp->Startpoint.y+NewLenth);

		DeleteObject(&pen);
	}
	cpen.CreatePen(PS_COSMETIC, cp->nPenSize, RGB(cp->nmyRed, cp->nmyGreen, cp->nmyBlue));
	pDC->SelectObject(&cpen);
	pDC->SetROP2(R2_COPYPEN);
	
	NewLenth = sqrtf((cp->EndPoint.x-cp->Startpoint.x)*(cp->EndPoint.x-cp->Startpoint.x)+
		(cp->EndPoint.y-cp->Startpoint.y)*(cp->EndPoint.y-cp->Startpoint.y));
	
	pDC->Ellipse(cp->Startpoint.x+NewLenth,cp->Startpoint.y-NewLenth,cp->Startpoint.x-NewLenth,
			cp->Startpoint.y+NewLenth);

	DeleteObject(&cpen);

//重绘矩形
	CPen rpen;
	for (rp = rhead; rp->next != NULL; rp = rp->next)
	{
		CPen pen;
		pen.CreatePen(PS_COSMETIC, rp->nPenSize, RGB(rp->nmyRed, rp->nmyGreen, rp->nmyBlue));
		pDC->SelectObject(&pen);
		pDC->SetROP2(R2_COPYPEN);
		
		pDC->Rectangle(CRect(rp->Startpoint,rp->EndPoint));
		DeleteObject(&pen);
	}
	rpen.CreatePen(PS_COSMETIC, rp->nPenSize, RGB(rp->nmyRed, rp->nmyGreen, rp->nmyBlue));
	pDC->SelectObject(&rpen);
	pDC->SetROP2(R2_COPYPEN);
	
	pDC->Rectangle(CRect(rp->Startpoint,rp->EndPoint));
	DeleteObject(&rpen);

	// 重绘椭圆
	CPen epen;
	for (ep = ehead; ep->next != NULL; ep = ep->next)
	{
		CPen pen;
		pen.CreatePen(PS_COSMETIC, ep->nPenSize, RGB(ep->nmyRed, ep->nmyGreen, ep->nmyBlue));
		pDC->SelectObject(&pen);
		pDC->SetROP2(R2_COPYPEN);
		
		pDC->Ellipse(CRect(ep->Startpoint,ep->EndPoint));
		DeleteObject(&pen);
	}
	epen.CreatePen(PS_COSMETIC, ep->nPenSize, RGB(ep->nmyRed, ep->nmyGreen, ep->nmyBlue));
	pDC->SelectObject(&epen);
	pDC->SetROP2(R2_COPYPEN);
	
	pDC->Ellipse(CRect(ep->Startpoint,ep->EndPoint));
	DeleteObject(&epen);


	ReleaseDC(pDC);
}

/////////////////////////////////////////////////////////////////////////////
// CMDrowPenView printing

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CMDrowPenView diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CMDrowPenView message handlers

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

void CMDrowPenView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	m_bFlag = true;
	m_pStartPoint = point;
	m_oldPoint    = point;
	if (m_nFlag == 3)       //设置画折线的中间起始点
	{
		if (nCount ==0)
		{
			m_pzStarpoint = point;
			mOldPoint     = point;
			nCount++;
		}	
	}
	else
		nCount = 0;
	
	CView::OnLButtonDown(nFlags, point);
}

void CMDrowPenView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CDC *pDC = GetDC();
	CPen mypen;
	CPen *mOldPen ;
	CPoint EndPoint;
	m_pEndPoint = point;
	mypen.CreatePen(PS_COSMETIC, m_nPenSize, RGB(nRed,nGreen,nBlue));
	mOldPen = &mypen;
	pDC->SelectObject(mOldPen);
	CBrush *pbrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH)); //用刷子防止画的封闭图形是实心的,
	pDC->SelectObject(pbrush);                                             // 因为画图模式SetROP2(R2_NOT)
	CBrush * pOldBrush = (CBrush *)pDC->SelectStockObject(NULL_BRUSH);
	
	switch (m_nFlag)    //m_nFlag是图形的区分标志
	{
	case 1:
		pDC->SetROP2(R2_COPYPEN);
		m_pEndPoint = point;
		pDC->MoveTo(m_pStartPoint);
		pDC->LineTo(m_pEndPoint);
		ReleaseDC(pDC);
		break;
	case 2:
		m_pEndPoint = point;
		pDC->MoveTo(m_pStartPoint);
		pDC->LineTo(m_pEndPoint);
		m_pStartPoint = m_pEndPoint;
		ReleaseDC(pDC);
		break;
	case 3:
		pDC->SetROP2(R2_COPYPEN);
		m_pzEndpoint = point;
		pDC->MoveTo(m_pzStarpoint);
		pDC->LineTo(m_pzEndpoint);
		break;
	case 4:
		pDC->SetROP2(R2_COPYPEN);
		m_pEndPoint = point;
		
		EndPoint.x = m_pEndPoint.x;
		EndPoint.y = m_pStartPoint.y;

⌨️ 快捷键说明

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