📄 llview.cpp
字号:
// llView.cpp : implementation of the CLlView class
//
#include "stdafx.h"
#include "ll.h"
#include "llDoc.h"
#include "llView.h"
#include "MainFrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CLlView
IMPLEMENT_DYNCREATE(CLlView, CView)
BEGIN_MESSAGE_MAP(CLlView, CView)
//{{AFX_MSG_MAP(CLlView)
ON_COMMAND(IDM_LINE, OnLine)
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDOWN()
ON_COMMAND(ID_ELLIPSE, OnEllipse)
ON_COMMAND(ID_RECTANGLE, OnRectangle)
ON_COMMAND(ID_SQUARE, OnSquare)
ON_COMMAND(ID_CIRCLE, OnCircle)
ON_COMMAND(ID_RANDOM, OnRandom)
ON_COMMAND(ID_DASH, OnDash)
ON_COMMAND(ID_DASHDOT, OnDashdot)
ON_COMMAND(ID_SOLID, OnSolid)
ON_COMMAND(ID_PENWIDTH1, OnPenwidth1)
ON_COMMAND(ID_PENWIDTH2, OnPenwidth2)
ON_COMMAND(ID_PENWIDTH3, OnPenwidth3)
ON_COMMAND(ID_PENWIDTH4, OnPenwidth4)
ON_COMMAND(ID_BRUSHCOLOR, OnBrushcolor)
ON_COMMAND(ID_PENCOLOR, OnPencolor)
ON_UPDATE_COMMAND_UI(ID_DASH, OnUpdateDash)
ON_UPDATE_COMMAND_UI(ID_DASHDOT, OnUpdateDashdot)
ON_UPDATE_COMMAND_UI(ID_SOLID, OnUpdateSolid)
ON_UPDATE_COMMAND_UI(ID_PENWIDTH1, OnUpdatePenwidth1)
ON_UPDATE_COMMAND_UI(ID_PENWIDTH2, OnUpdatePenwidth2)
ON_UPDATE_COMMAND_UI(ID_PENWIDTH3, OnUpdatePenwidth3)
ON_UPDATE_COMMAND_UI(ID_PENWIDTH4, OnUpdatePenwidth4)
ON_COMMAND(ID_ERASER, OnEraser)
ON_COMMAND(ID_BRUSH4, OnBrush4)
ON_COMMAND(ID_BRUSH1, OnBrush1)
ON_COMMAND(ID_BRUSH2, OnBrush2)
ON_COMMAND(ID_BRUSH3, OnBrush3)
ON_COMMAND(ID_BRUSH5, OnBrush5)
ON_COMMAND(ID_BRUSH6, OnBrush6)
ON_COMMAND(ID_BRUSH7, OnBrush7)
ON_UPDATE_COMMAND_UI(ID_BRUSH1, OnUpdateBrush1)
ON_UPDATE_COMMAND_UI(ID_BRUSH2, OnUpdateBrush2)
ON_UPDATE_COMMAND_UI(ID_BRUSH3, OnUpdateBrush3)
ON_UPDATE_COMMAND_UI(ID_BRUSH4, OnUpdateBrush4)
ON_UPDATE_COMMAND_UI(ID_BRUSH5, OnUpdateBrush5)
ON_UPDATE_COMMAND_UI(ID_BRUSH6, OnUpdateBrush6)
ON_UPDATE_COMMAND_UI(ID_BRUSH7, OnUpdateBrush7)
ON_COMMAND(ID_MOVE, OnMove)
ON_COMMAND(ID_DELETE, OnDelete)
ON_COMMAND(ID_COLORPANE, OnColorpane)
ON_COMMAND(ID_EDIT_REDO, OnEditRedo)
ON_COMMAND(ID_EDIT_UNDO, OnEditUndo)
//}}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()
/////////////////////////////////////////////////////////////////////////////
// CLlView construction/destruction
CLlView::CLlView()
{
m_bStart=false;
// TODO: add construction code here
m_nLinetype=PS_SOLID;
m_nBrushtype=6;
m_nPenwidth=4;
m_euDraw_Type=DRAW_LINE;
m_Brushcolor=RGB(208,208,255);
m_Pencolor=RGB(200,205,150);
//IsMove=false;
// IsDelete=false;
m_IsSelect=false;
m_IsGet=false;
}
CLlView::~CLlView()
{CLlDoc* pDoc = GetDocument();
POSITION pos=pDoc->m_listRecord.GetHeadPosition();
while(pos)
{
CShape *shape=(CShape*)pDoc->m_listRecord.GetNext(pos);
delete shape;
}
}
BOOL CLlView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CLlView drawing
void CLlView::OnDraw(CDC* pDC)
{
CLlDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
POSITION pos=pDoc->m_listDraw.GetHeadPosition();
while(pos){
CShape *shape=(CShape*)pDoc->m_listDraw.GetNext(pos);
shape->Draw(pDC);
}
}
/////////////////////////////////////////////////////////////////////////////
// CLlView printing
BOOL CLlView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CLlView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CLlView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CLlView diagnostics
#ifdef _DEBUG
void CLlView::AssertValid() const
{
CView::AssertValid();
}
void CLlView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CLlDoc* CLlView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CLlDoc)));
return (CLlDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CLlView message handlers
void CLlView::OnLine()
{
// TODO: Add your command handler code here
m_euDraw_Type=DRAW_LINE;
}
void CLlView::OnLButtonUp(UINT nFlags, CPoint point)
{
//CPen *pen;
// TODO: Add your message handler code here and/or call default
if(m_bStart)
{
m_pShape->SetPoint(m_ptOrigin,point);
m_pShape->SetPen(m_nLinetype,m_nPenwidth,m_Pencolor);
m_pShape->SetBrush(m_Brushcolor);
m_pShape->SetAttribute(m_nLinetype,m_nPenwidth,m_Pencolor,m_nBrushtype);
CLlDoc *pDoc=GetDocument();
pDoc->m_listRecord.AddTail(m_pShape);
pDoc->m_listDraw.AddTail(m_pShape);
Invalidate();
}
m_IsGet=false;
m_IsSelect=false;
m_bStart=false;
Invalidate();
CView::OnLButtonUp(nFlags, point);
}
void CLlView::OnMouseMove(UINT nFlags, CPoint point)
{
CDC *pDC=this->GetDC();
int oldDrawMode=pDC->SetROP2(R2_NOTXORPEN);
//CPen pen(m_nLinetype,m_nPenwidth,m_Pencolor);
//CPen *pOldPen=pDC->SelectObject(&pen);
//CBrush brush(m_Brushcolor);
//CBrush *pOldBrush=pDC->SelectObject(&brush);
// TODO: Add your message handler code here and/or call default
if(m_bStart)
{
switch(m_euDraw_Type)
{case DRAW_LINE:
pDC->MoveTo(m_ptOrigin);
pDC->LineTo(m_ptEnd);
m_ptEnd=point;
pDC->MoveTo(m_ptOrigin);
pDC->LineTo(m_ptEnd);
break;
case DRAW_RANDOM:
pDC->MoveTo(m_ptOrigin);
pDC->LineTo(point);
m_pShape->SetPoint(m_ptOrigin,point);
m_ptOrigin=point;
break;
case DRAW_ERASER:
pDC->MoveTo(m_ptOrigin);
pDC->LineTo(point);
m_pShape->SetPoint(m_ptOrigin,point);
m_ptOrigin=point;
break;
case DRAW_RECTANGLE:
pDC->Rectangle(m_ptOrigin.x,m_ptOrigin.y,m_ptEnd.x,m_ptEnd.y);
m_ptEnd=point;
pDC->Rectangle(m_ptOrigin.x,m_ptOrigin.y,m_ptEnd.x,m_ptEnd.y);
break;
case DRAW_SQUARE:
pDC->Rectangle(m_ptOrigin.x,m_ptOrigin.y,m_ptEnd.x,m_ptOrigin.y+m_ptEnd.x-m_ptOrigin.x);
m_ptEnd=point;
pDC->Rectangle(m_ptOrigin.x,m_ptOrigin.y,m_ptEnd.x,m_ptOrigin.y+m_ptEnd.x-m_ptOrigin.x);
break;
case DRAW_ELLIPSE:
pDC->Ellipse(m_ptOrigin.x,m_ptOrigin.y,m_ptEnd.x,m_ptEnd.y);
m_ptEnd=point;
pDC->Ellipse(m_ptOrigin.x,m_ptOrigin.y,m_ptEnd.x,m_ptEnd.y);
break;
case DRAW_CIRCLE:
pDC->Ellipse(m_ptOrigin.x,m_ptOrigin.y,m_ptEnd.x,m_ptOrigin.y+m_ptEnd.x-m_ptOrigin.x);
m_ptEnd=point;
pDC->Ellipse(m_ptOrigin.x,m_ptOrigin.y,m_ptEnd.x,m_ptOrigin.y+m_ptEnd.x-m_ptOrigin.x);
break;
}
}
if(m_IsSelect)
{
CPoint pt1=point- m_ptTemp+m_pshapeSelect->GetOriginPoint();
CPoint pt2=point- m_ptTemp+m_pshapeSelect->GetEndPoint();
m_pshapeSelect->Draw(pDC);
m_ptTemp=point;
m_pshapeSelect->SetPoint(pt1,pt2);
m_pshapeSelect->Draw(pDC);
// IsMove=false;
// IsDelete=false;
}
pDC->SetROP2(oldDrawMode);
CView::OnMouseMove(nFlags, point);
}
void CLlView::OnLButtonDown(UINT nFlags, CPoint point)
{
CDC *pDC=this->GetDC();
// TODO: Add your message handler code here and/or call default
m_ptOrigin=point;
m_ptEnd=point;
m_bStart=true;
switch (m_euDraw_Type)
{
case IsMove:
m_IsSelect=IsInArea(point);
m_bStart=false;//只要选中就不画图
if(m_IsSelect)
{
m_ptTemp=point;
}
break;
case IsDelete:
m_IsGet=IsInArea(point);
//if(m_IsGet)
// {
m_bStart=false;//只要选中就不画图
//m_ptTemp=point;
//}
}
/* if(IsMove)
{
m_IsSelect=IsInArea(point);
if(m_IsSelect)
{
m_bStart=false;
m_ptTemp=point;
}
}
if(IsDelete)
{
m_IsGet=IsInArea(point);
if(m_IsGet)
{
m_bStart=false;
//m_ptTemp=point;
}
}*/
if(m_IsGet)
{
//CPoint pt1=point- m_ptTemp+m_pshapeSelect->GetOriginPoint();
// CPoint pt2=point- m_ptTemp+m_pshapeSelect->GetEndPoint();
m_pshapeSelect->Draw(pDC);
m_ptTemp=point;
m_pshapeSelect->SetPoint(0,0);
m_pshapeSelect->Draw(pDC);
//IsMove=false;
// IsDelete=false;
}
if(m_bStart)
{
switch (m_euDraw_Type)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -