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

📄 painterview.cpp

📁 很不错的简单的矢量图形开发软件
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// PainterView.cpp : implementation of the CPainterView class
//

#include "stdafx.h"
#include "Painter.h"
#include "mainfrm.h"
#include "EnterTexdlg.h"

#include "PainterDoc.h"
#include "PainterView.h"
#include <math.h>

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

/////////////////////////////////////////////////////////////////////////////
// CPainterView

IMPLEMENT_DYNCREATE(CPainterView, CScrollView)

BEGIN_MESSAGE_MAP(CPainterView, CScrollView)
	//{{AFX_MSG_MAP(CPainterView)
	ON_WM_LBUTTONDOWN()
	ON_BN_CLICKED(IDC_COLOR, OnColor)
	ON_BN_CLICKED(IDC_PEN_COLOR, OnPenColor)
	ON_CBN_SELCHANGE(IDC_LINE_WIDTH, OnSelchangeLineWidth)
	ON_CBN_SELCHANGE(IDC_LINE_TYPE, OnSelchangeLineType)
	ON_CBN_SELCHANGE(IDC_FILL_PATTERN, OnSelchangeFillPattern)
	ON_COMMAND(ID_DRAW_LINE, OnDrawLine)
	ON_COMMAND(ID_DRAW_RECTANGLE, OnDrawRectangle)
	ON_WM_LBUTTONUP()
	ON_WM_MOUSEMOVE()
	ON_COMMAND(ID_DRAW_ELLIPSE, OnDrawEllipse)
	ON_COMMAND(ID_DRAW_FILL, OnDrawFill)
	ON_COMMAND(ID_DRAW_SELECT, OnDrawSelect)
	ON_COMMAND(ID_MODIFY_MOVE, OnModifyMove)
	ON_UPDATE_COMMAND_UI(ID_EDIT_DELETE, OnUpdateEditDelete)
	ON_COMMAND(ID_EDIT_DELETE, OnEditDelete)
	ON_COMMAND(ID_EDIT_COPY, OnEditCopy)
	ON_UPDATE_COMMAND_UI(ID_EDIT_COPY, OnUpdateEditCopy)
	ON_COMMAND(ID_EDIT_PASTE, OnEditPaste)
	ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, OnUpdateEditPaste)
	ON_COMMAND(ID_EDIT_CUT, OnEditCut)
	ON_UPDATE_COMMAND_UI(ID_EDIT_CUT, OnUpdateEditCut)
	ON_COMMAND(ID_EDIT_REDO, OnEditRedo)
	ON_UPDATE_COMMAND_UI(ID_EDIT_UNDO, OnUpdateEditUndo)
	ON_UPDATE_COMMAND_UI(ID_EDIT_REDO, OnUpdateEditRedo)
	ON_COMMAND(ID_EDIT_UNDO, OnEditUndo)
	ON_COMMAND(ID_DRAW_TRIANGLE, OnDrawTriangle)
	ON_COMMAND(ID_TEXT, OnText)
	ON_WM_DESTROY()
	ON_COMMAND(ID_DRAW_GRID, OnDrawGrid)
	ON_UPDATE_COMMAND_UI(ID_DRAW_GRID, OnUpdateDrawGrid)
	ON_UPDATE_COMMAND_UI(ID_DRAW_FILL, OnUpdateDrawFill)
	ON_COMMAND(ID_FILE_SAVE, OnFileSave)
	ON_COMMAND(ID_FILE_SAVE_AS, OnFileSaveAs)
	ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
	ON_WM_KEYDOWN()
	ON_WM_KEYUP()
	ON_COMMAND(ID_DRAW_NOTILT, OnDrawNotilt)
	ON_UPDATE_COMMAND_UI(ID_DRAW_NOTILT, OnUpdateDrawNotilt)
	ON_COMMAND(ID_ENLARGE, OnEnlarge)
	ON_WM_CONTEXTMENU()
	ON_COMMAND(ID_EDIT_MODIFY, OnEditModify)
	ON_UPDATE_COMMAND_UI(ID_EDIT_MODIFY, OnUpdateEditModify)
	ON_UPDATE_COMMAND_UI(ID_DRAW_ELLIPSE, OnUpdateDrawEllipse)
	ON_UPDATE_COMMAND_UI(ID_DRAW_LINE, OnUpdateDrawLine)
	ON_UPDATE_COMMAND_UI(ID_DRAW_RECTANGLE, OnUpdateDrawRectangle)
	ON_UPDATE_COMMAND_UI(ID_DRAW_TRIANGLE, OnUpdateDrawTriangle)
	ON_UPDATE_COMMAND_UI(ID_DRAW_SELECT, OnUpdateDrawSelect)
	ON_UPDATE_COMMAND_UI(ID_TEXT, OnUpdateText)
	ON_UPDATE_COMMAND_UI(ID_MODIFY_MOVE, OnUpdateModifyMove)
	ON_COMMAND(ID_VIEW_100, OnView100)
	ON_COMMAND(ID_VIEW_200, OnView200)
	ON_COMMAND(ID_VIEW_25, OnView25)
	ON_COMMAND(ID_VIEW_50, OnView50)
	ON_COMMAND(ID_VIEW_75, OnView75)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
	ON_NOTIFY(TBN_DROPDOWN, AFX_IDW_TOOLBAR, OnDropDown)
	ON_COMMAND(ID_ENLARGE, DoNothing)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CPainterView construction/destruction

CPainterView::CPainterView()
{
	// TODO: add construction code here
	//初始化变量
	hatchIndex=0;//当前填充方式
	CurColor=(0,255,0);//当前颜色
	PenCurColor=(0,0,0);//画笔颜色
	penType=0;//画笔种类为1
	penWidth=1;//画笔宽度为1
	DrawStep=0;//绘图状态为未完成
	DrawType=new BYTE;
	*DrawType=SELECT;//当前无绘图种类
	m_IsSelected=FALSE;//当前未选择图元
	m_bCopy=FALSE;//当前没有拷贝图元
	m_bRedo=FALSE;//不能恢复当前操作
	m_bUndo=FALSE;//不能撤消当前操作
	m_bGrid=FALSE;//没有绘制辅助网点
	bFileSaved=FALSE;//没有保存过文件
	bShiftDown=FALSE;//没有按下Shift键
	OppIndex=0;//当前没有绘制图元
	m_bNoTilt=FALSE;//当前不禁止绘制斜线
	ZoomFactor=1;
	m_bModify=FALSE;
	m_nModifyStep=0;
	m_bIsRect=FALSE;
}

CPainterView::~CPainterView()
{
}

BOOL CPainterView::PreCreateWindow(CREATESTRUCT& cs)
{
	// 如果需要修改窗口的风格则修改cs

	return CScrollView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CPainterView drawing

void CPainterView::OnDraw(CDC* pDC)
{
	CPainterDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	CRect rect;
	GetClientRect(rect);

	if(m_bGrid)
	{
	    int i,j;
	    for(i=0;i<rect.right;i+=10)
		     for(j=0;j<rect.bottom;j+=10)
			     pDC->SetPixel(i,j,(COLORREF)0xf);
	 }

	if(m_bModify)
	{
		DrawSnapList();
	}
	// TODO: add draw code for native data here
	//重画对话框条
	CBrush Brush,*OldBrush;
	CMainFrame *OwnWnd;
	OwnWnd=(CMainFrame *)GetParentOwner();
	OwnWnd->m_wndMyDialogBar.OnPaint();//首先使对话框条发出WM_PAINT消息告知
	                                   //应用程序重绘对话框条
	CWnd* pWnd = OwnWnd->m_wndMyDialogBar.GetDlgItem(IDC_FILL_PREVIEW);//得到指向预览框的指针
	pWnd->GetClientRect(rect);//得到预览框矩形
	CDC* dc=pWnd->GetDC();//得到预览框的设备表述表
	Brush.CreateHatchBrush(hatchIndex,CurColor);
	rect.left+=1;
	rect.right-=1;
	rect.top+=1;
	rect.bottom-=1;
	dc->FillRect(rect,&Brush);

	CPen pen(penType,penWidth,PenCurColor),*OldPen;
	pWnd = OwnWnd->m_wndMyDialogBar.GetDlgItem(IDC_LINE_PREVIEW);//得到指向预览框的指针
	dc=pWnd->GetDC();//得到预览框的设备表述表
	pWnd->GetClientRect(rect);//得到预览框矩形
	
	dc->Rectangle(rect);
	OldPen=dc->SelectObject(&pen);
	dc->MoveTo(rect.left+5, (rect.bottom-rect.top)/2);
	dc->LineTo(rect.right-5, (rect.bottom-rect.top)/2);
	dc->SelectObject(OldPen);

	//重绘图元
	HPEN hPen,hOldPen;
	HBRUSH hBrush;
	POSITION pos=pDoc->RecordList.GetHeadPosition();
	while(pos!=NULL)
	{
		BYTE *drawtype;
		drawtype=(BYTE*)pDoc->RecordList.GetNext(pos);
		switch(*drawtype)
		{
		case LINE:
			LINENODE *line;
			line=(LINENODE *)pDoc->RecordList.GetNext(pos);
			if(line->bDo>0)
			{
				//另一种创建画笔的方法
				if(line->bDo!=2)//如果图元不处于选择状态则创建其原始画笔
                    hPen=CreatePen(line->pen.iStyle,line->pen.iWidth,line->pen.Color);
				else//否则创建红色虚线画笔
					hPen=CreatePen(PS_DASHDOT,1,RGB(255,0,0));
			    hOldPen=(HPEN)SelectObject(pDC->m_hDC,hPen);
			    pDC->MoveTo(line->Start);
			    pDC->LineTo(line->End);
			    pDC->SelectObject(OldPen);
			    DeleteObject(SelectObject(pDC->m_hDC,hOldPen));
			}
			break;
		case RECTANGLE:
			RECTANGLENODE *rectangle;
			rectangle=(RECTANGLENODE *)pDoc->RecordList.GetNext(pos);
			if(rectangle->bDo>0)
			{
			    if(rectangle->bDo!=2)
			        hPen=CreatePen(rectangle->pen.iStyle,rectangle->pen.iWidth,rectangle->pen.Color);
			    else
				    hPen=CreatePen(PS_DASHDOT,1,RGB(255,0,0));
			    hOldPen=(HPEN)SelectObject(pDC->m_hDC,hPen);
			    pDC->MoveTo(rectangle->rT.left,rectangle->rT.top);
			    pDC->LineTo(rectangle->rT.right,rectangle->rT.top);
			    pDC->LineTo(rectangle->rT.right,rectangle->rT.bottom);
			    pDC->LineTo(rectangle->rT.left,rectangle->rT.bottom);
			    pDC->LineTo(rectangle->rT.left,rectangle->rT.top);
			    DeleteObject(SelectObject(pDC->m_hDC,hOldPen));
			}
			break;
		case TRIANGLE:
			TRIANGLENODE *triangle;
			triangle=(TRIANGLENODE *)pDoc->RecordList.GetNext(pos);
			if(triangle->bDo>0)
			{
			    if(triangle->bDo!=2)
			        hPen=CreatePen(triangle->pen.iStyle,triangle->pen.iWidth,triangle->pen.Color);
			    else
				    hPen=CreatePen(PS_DASHDOT,1,RGB(255,0,0));
			    hOldPen=(HPEN)SelectObject(pDC->m_hDC,hPen);
			    DrawTriangle(pDC,triangle->rT);
			    DeleteObject(SelectObject(pDC->m_hDC,hOldPen));
			}
			break;
		case TEXT:
			TEXTNODE *text;
			text=(TEXTNODE *)pDoc->RecordList.GetNext(pos);
			if(text->bDo>0)
			{
				if(text->bDo!=2)
					pDC->SetTextColor(text->color);
				else
					pDC->SetTextColor(RGB(255,0,0));
				pDC->TextOut(text->point.x,text->point.y,text->str);
			}
			break;
		case ELLIPSE:
			ELLIPSENODE *ellipse;
			ellipse=(ELLIPSENODE *)pDoc->RecordList.GetNext(pos);
			if(ellipse->bDo>0)
			{
			    if(ellipse->bDo!=2)
			        hPen=CreatePen(ellipse->pen.iStyle,ellipse->pen.iWidth,ellipse->pen.Color);
			    else
				    hPen=CreatePen(PS_DASHDOT,1,RGB(255,0,0));
			    hOldPen=(HPEN)SelectObject(pDC->m_hDC,hPen);
			    Arc(pDC->m_hDC,ellipse->rT.left,ellipse->rT.top,
					ellipse->rT.right,ellipse->rT.bottom,0,0,0,0);
			    DeleteObject(SelectObject(pDC->m_hDC,hOldPen));
			}
			break;
		case FILL:
			FILLNODE *fill;
			fill=(FILLNODE *)pDoc->RecordList.GetNext(pos);
			if(fill->bDo)
			{
			   hBrush=CreateHatchBrush(fill->brush.iStyle,fill->brush.Color);
			   OldBrush=(CBrush *)SelectObject(pDC->m_hDC,hBrush);
			   pDC->ExtFloodFill(fill->Seed.x,fill->Seed.y,fill->BoundColor,
				              FLOODFILLSURFACE);
			   DeleteObject(SelectObject(pDC->m_hDC,OldBrush));
			}
			break;
		}		
	}
}

/////////////////////////////////////////////////////////////////////////////
// CPainterView printing
//打印处理函数,如没有特别要求,不需添加任何代码即可完成打印
BOOL CPainterView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

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

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

/////////////////////////////////////////////////////////////////////////////
// CPainterView diagnostics

#ifdef _DEBUG
void CPainterView::AssertValid() const
{
	CScrollView::AssertValid();
}

void CPainterView::Dump(CDumpContext& dc) const
{
	CScrollView::Dump(dc);
}

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

/////////////////////////////////////////////////////////////////////////////
// CPainterView message handlers
//处理按下鼠标左键
void CPainterView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CPen pen(penType,penWidth,PenCurColor),*OldPen;
	CBrush brush(hatchIndex,CurColor),*OldBrush;
	CPainterDoc* pDoc=GetDocument();
	CDC* dc=GetDC();
	OldPen=dc->SelectObject(&pen);

	PrePoint=TempPoint=point;
	int i;

	if(m_bModify==FALSE){
	switch(*DrawType)//根据绘图类型作不同处理
	{
	case SELECT:
		PickComponent(/*dc*/);//拾取图元
		break;
	case TEXT:
		{//注意在switc-case语句中定义非指针变量必须用括号括起来
		CEnterTexDlg dlg;
        if(dlg.DoModal()==IDOK)
			m_strText=dlg.m_str;
		}

		CStatusBar* pStatus;//得到状态栏指针
		pStatus=(CStatusBar*)AfxGetApp()->m_pMainWnd->GetDescendantWindow(ID_VIEW_STATUS_BAR);
    	pStatus->SetPaneText(0,"选择文本输出点");
		
		if(m_strText==_T(""))
			break;
		dc->SetTextColor(PenCurColor);
        dc->TextOut(point.x,point.y,m_strText);
		textnode=new TEXTNODE;
		textnode->point=point;
		textnode->str=m_strText;
		textnode->color=PenCurColor;
		OppIndex+=1;
		textnode->Index=OppIndex;
		if(textnode->str!=_T(""))
		{
		    pDoc->RecordList.AddTail(DrawType);
		    pDoc->RecordList.AddTail(textnode);
		    m_strText="";//清空字符串
		}
		break;
	case PASTE:
		DrawStep=1;
		break;
	case MOVE:
		DrawStep=1;
		break;
	case LINE:
		if(!DrawStep)
		{
			linenode=new LINENODE;
			linenode->Start=point;
			DrawStep=1;
		}
		else
		{
			if(!m_bNoTilt)//如果不处于禁止斜线状态
				linenode->End=point;
			else
			{
				if(abs(linenode->Start.x-point.x)>abs(linenode->Start.y-point.y))
				{
					linenode->End.x=point.x;
					linenode->End.y=linenode->Start.y;
				}
				else
				{
					linenode->End.x=linenode->Start.x;
					linenode->End.y=point.y;
				}
			}
			DrawStep=0;
			dc->MoveTo(linenode->Start);
			dc->LineTo(linenode->End);
			linenode->pen.Color=PenCurColor;
			linenode->pen.iStyle=penType;
			linenode->pen.iWidth=penWidth;
			OppIndex+=1;
			linenode->Index=OppIndex;
			pDoc->RecordList.AddTail(DrawType);
			pDoc->RecordList.AddTail(linenode);
		}
		break;
	case RECTANGLE:
		if(!DrawStep)
		{
			rectanglenode=new RECTANGLENODE;
			rectanglenode->rT.left=point.x;
			rectanglenode->rT.top=point.y;
			rectanglenode->rT.right=point.x;
			rectanglenode->rT.bottom=point.y;
			DrawStep=1;
		}
		break;
	case TRIANGLE:
		if(!DrawStep)
		{
			trianglenode=new TRIANGLENODE;
			trianglenode->rT.left=point.x;
			trianglenode->rT.top=point.y;
			trianglenode->rT.right=point.x;
			trianglenode->rT.bottom=point.y;
			DrawStep=1;
		}
		break;
	case ELLIPSE:
		if(!DrawStep)
		{
			ellipsenode=new ELLIPSENODE;
			ellipsenode->rT.left=point.x;
			ellipsenode->rT.top=point.y;
			ellipsenode->rT.right=point.x;
			ellipsenode->rT.bottom=point.x;
			DrawStep=1;
		}
		break;
	case FILL:
		OldBrush=dc->SelectObject(&brush);
		fillnode=new FILLNODE;
		fillnode->brush.Color=CurColor;
		fillnode->brush.iStyle=hatchIndex;
		fillnode->Seed=point;
		fillnode->BoundColor=dc->GetPixel(point.x,point.y);
		dc->ExtFloodFill(fillnode->Seed.x,fillnode->Seed.y,fillnode->BoundColor
			             ,FLOODFILLSURFACE);
		pDoc->RecordList.AddTail(DrawType);
		pDoc->RecordList.AddTail(fillnode);
		dc->SelectObject(OldBrush);
		break;
	default:
		break;
	} }

    else if(m_bModify==TRUE)
	{
		POSITION pos=SnapList.GetHeadPosition();
		BOOL finish=FALSE;
		float fFX,fFY;
	
		fFX=1.0;
		fFY=1.0;
	
		while(pos!=NULL && !finish)
		{
			int   *index;
			POINT *pPoint;

		    index=(int *)SnapList.GetNext(pos);
			pPoint=(POINT *)SnapList.GetNext(pos);
			CRect rect((pPoint->x-5)*fFX,(pPoint->y-5)*fFY,
				(pPoint->x+5)*fFX,(pPoint->y+5)*fFY);
			if(rect.PtInRect(point))
			{
				finish=TRUE;
			    m_nModifyIndex=*index;
				if(!m_bIsRect)
					m_pModifyPoint=pPoint;
				else
				{
					for(i=0;i<4;i++)
					{
						m_pModifyPoints[i]=(POINT *)SnapList.GetAt(SnapList.FindIndex(i*2+1));
					}
				}
				m_nModifyStep=1;
			}
		}
	}

	dc->SelectObject(OldPen);
	CScrollView::OnLButtonDown(nFlags, point);
}

//处理选择填充颜色
void CPainterView::OnColor() 
{
	// TODO: Add your control notification handler code here
	CColorDialog	color;

	if(color.DoModal()==IDOK)
	{
	   CMainFrame *OwnWnd;
	   OwnWnd=(CMainFrame *)GetParentOwner();
	   //获得对话框工具条中填充预览框的指针
	   CWnd* pWnd = OwnWnd->m_wndMyDialogBar.GetDlgItem(IDC_FILL_PREVIEW);
	   //获得对话框工具条中填充模式组合框的指针

⌨️ 快捷键说明

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