📄 painterview.cpp
字号:
// 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 + -