📄 drawview.cpp
字号:
// drawView.cpp : implementation of the CDrawView class
//
#include "stdafx.h"
#include "draw.h"
#include "TsFont.h"
#include "word.h"
#include "drawDoc.h"
#include "drawView.h"
#include<math.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDrawView
IMPLEMENT_DYNCREATE(CDrawView, CScrollView)
BEGIN_MESSAGE_MAP(CDrawView, CScrollView)
//{{AFX_MSG_MAP(CDrawView)
ON_WM_LBUTTONDOWN()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONUP()
ON_WM_RBUTTONUP()
ON_COMMAND(ID_DRAW_FONT, OnDrawFont)
//}}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)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDrawView construction/destruction
CDrawView::CDrawView()
{
// TODO: add construction code here
m_Dragging = 0;
m_IsRect = FALSE;
m_hArrow = AfxGetApp()->LoadStandardCursor(IDC_ARROW);
m_hCross = AfxGetApp()->LoadStandardCursor(IDC_CROSS);
m_PenDotted.CreatePen(PS_DOT, 1, RGB(0,0,0));
m_cTextColor = RGB(0,0,0);
m_lf.lfHeight = 30;
m_lf.lfWidth = 0;
m_lf.lfEscapement = 0;
m_lf.lfOrientation = 0;
m_lf.lfWeight = FW_NORMAL;
m_lf.lfItalic = FALSE;
m_lf.lfUnderline = FALSE;
m_lf.lfStrikeOut = FALSE;
m_lf.lfCharSet = GB2312_CHARSET;
m_lf.lfOutPrecision = OUT_STROKE_PRECIS;
m_lf.lfClipPrecision = CLIP_STROKE_PRECIS;
m_lf.lfQuality = DRAFT_QUALITY;
m_lf.lfPitchAndFamily = VARIABLE_PITCH|FF_MODERN;
strcpy(m_lf.lfFaceName, "仿宋_GB2312");
}
CDrawView::~CDrawView()
{
}
BOOL CDrawView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
m_ClassName = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW, 0,
(HBRUSH)::GetStockObject(WHITE_BRUSH), 0);
cs.lpszClass = m_ClassName;
return CScrollView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CDrawView drawing
void CDrawView::OnDraw(CDC* pDC)
{
CDrawDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CSize ScrollSize = GetTotalSize();
pDC->MoveTo(ScrollSize.cx, 0);
pDC->LineTo(ScrollSize.cx, ScrollSize.cy);
pDC->LineTo(0, ScrollSize.cy);
CRect ClipRect;
CRect DimRect;
CRect IntRect;
CDrawBase *pDraw;
pDC->GetClipBox(&ClipRect);
int NumDraws = pDoc->GetNumDraws();
for(int Index = 0; Index < NumDraws; ++Index)
{
pDraw = pDoc->GetDraw(Index);
DimRect = pDraw->GetDimRect();
if(IntRect.IntersectRect(DimRect, ClipRect))
pDraw->Draw(pDC);
}
}
void CDrawView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
CSize sizeTotal;
sizeTotal.cx = 800;
sizeTotal.cy = 600;
SetScrollSizes(MM_TEXT, sizeTotal);
}
/////////////////////////////////////////////////////////////////////////////
// CDrawView printing
BOOL CDrawView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
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
}
/////////////////////////////////////////////////////////////////////////////
// CDrawView diagnostics
#ifdef _DEBUG
void CDrawView::AssertValid() const
{
CScrollView::AssertValid();
}
void CDrawView::Dump(CDumpContext& dc) const
{
CScrollView::Dump(dc);
}
CDrawDoc* CDrawView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDrawDoc)));
return (CDrawDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CDrawView message handlers
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
CClientDC ClientDC(this);
OnPrepareDC(&ClientDC);
CDrawApp *pApp = (CDrawApp *)AfxGetApp();
if(m_IsRect)
{
CDC *pDC = GetDC();
CRect rect(m_PointOrigin.x, m_PointOrigin.y, m_PointOld.x, m_PointOld.y);
rect.NormalizeRect();
pDC->DrawFocusRect(rect);
ReleaseDC(pDC);
m_IsRect = FALSE;
}
if(pApp->m_CurrentTool != ID_DRAW_SELECT && pApp->m_CurrentTool != ID_DRAW_WORD)
ClientDC.DPtoLP(&point);
CSize ScrollSize = GetTotalSize();
CRect ScrollRect(0, 0, ScrollSize.cx, ScrollSize.cy);
if(!ScrollRect.PtInRect(point))
return;
m_PointOrigin = point;
m_PointOld = point;
SetCapture();
m_Dragging = 1;
ClientDC.LPtoDP(&ScrollRect);
CRect ViewRect;
GetClientRect(&ViewRect);
CRect IntRect;
IntRect.IntersectRect(&ScrollRect, &ViewRect);
ClientToScreen(&IntRect);
::ClipCursor(&IntRect);
CScrollView::OnLButtonDown(nFlags, point);
}
void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
CClientDC ClientDC(this);
OnPrepareDC(&ClientDC);
CDrawApp *pApp = (CDrawApp *)AfxGetApp();
if(pApp->m_CurrentTool != ID_DRAW_SELECT && pApp->m_CurrentTool != ID_DRAW_WORD)
ClientDC.DPtoLP(&point);
if(!m_Dragging)
{
CSize ScrollSize = GetTotalSize();
CRect ScrollRect(0,0,ScrollSize.cx, ScrollSize.cy);
if(ScrollRect.PtInRect(point))
::SetCursor(m_hCross);
else
::SetCursor(m_hArrow);
return;
}
ClientDC.SetROP2(R2_NOT);
ClientDC.SelectObject(&m_PenDotted);
ClientDC.SetBkColor(TRANSPARENT);
ClientDC.SelectStockObject(NULL_BRUSH);
switch(((CDrawApp *)AfxGetApp())->m_CurrentTool)
{
case ID_DRAW_LINE:
ClientDC.MoveTo(m_PointOrigin);
ClientDC.LineTo(m_PointOld);
ClientDC.MoveTo(m_PointOrigin);
ClientDC.LineTo(point);
break;
case ID_DRAW_SELECT:
case ID_DRAW_WORD:
{
CDC *pDC = GetDC();
CRect rect(m_PointOrigin.x, m_PointOrigin.y, m_PointOld.x, m_PointOld.y);
rect.NormalizeRect();
pDC->DrawFocusRect(rect);
rect.SetRect(m_PointOrigin.x, m_PointOrigin.y, point.x, point.y);
rect.NormalizeRect();
pDC->DrawFocusRect(rect);
m_IsRect = TRUE;
ReleaseDC(pDC);
break;
}
case ID_DRAW_RECT:
case ID_DRAW_RECTFILL:
ClientDC.Rectangle(m_PointOrigin.x, m_PointOrigin.y,
m_PointOld.x, m_PointOld.y);
ClientDC.Rectangle(m_PointOrigin.x, m_PointOrigin.y,
point.x, point.y);
break;
case ID_DRAW_RECTROUND:
case ID_DRAW_RECTROUNDFILL:
{
int SizeRound = (abs(m_PointOld.x - m_PointOrigin.x) +
abs(m_PointOld.y - m_PointOrigin.x))/6;
ClientDC.RoundRect(m_PointOrigin.x, m_PointOrigin.y,
m_PointOld.x, m_PointOld.y,
SizeRound, SizeRound);
SizeRound = (abs(point.x - m_PointOrigin.x) +
abs(point.y - m_PointOrigin.x))/6;
ClientDC.RoundRect(m_PointOrigin.x, m_PointOrigin.y,
point.x, point.y, SizeRound, SizeRound);
break;
}
case ID_DRAW_CIRCLE:
case ID_DRAW_CIRCLEFILL:
{
int dim = int(sqrt((m_PointOld.x - m_PointOrigin.x) * (m_PointOld.x - m_PointOrigin.x)
+ (m_PointOld.y - m_PointOrigin.y) * (m_PointOld.y - m_PointOrigin.y)));
ClientDC.Ellipse(m_PointOrigin.x - dim,m_PointOrigin.y - dim,
m_PointOrigin.x + dim, m_PointOrigin.y + dim);
dim = int(sqrt((point.x - m_PointOrigin.x) * (point.x - m_PointOrigin.x)
+ (point.y - m_PointOrigin.y) * (point.y - m_PointOrigin.y)));
ClientDC.Ellipse(m_PointOrigin.x - dim,m_PointOrigin.y - dim,
m_PointOrigin.x + dim, m_PointOrigin.y + dim);
break;
}
case ID_DRAW_ELLIPSE:
case ID_DRAW_ELLIPSEFILL:
ClientDC.Ellipse(m_PointOrigin.x, m_PointOrigin.y,
m_PointOld.x, m_PointOld.y);
ClientDC.Ellipse(m_PointOrigin.x, m_PointOrigin.y,
point.x, point.y);
break;
}
m_PointOld = point;
CScrollView::OnMouseMove(nFlags, point);
}
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
if(!m_Dragging) return;
m_Dragging = 0;
::ReleaseCapture();
::ClipCursor(NULL);
CClientDC ClientDC(this);
OnPrepareDC(&ClientDC);
ClientDC.DPtoLP(&point);
ClientDC.SelectObject(&m_PenDotted);
ClientDC.SetROP2(R2_NOT);
ClientDC.SetBkMode(TRANSPARENT);
ClientDC.SelectStockObject(NULL_BRUSH);
CDrawApp *pApp = (CDrawApp *)AfxGetApp();
CDrawBase *pDraw;
BOOL flag = FALSE;
switch(pApp->m_CurrentTool)
{
case ID_DRAW_LINE:
ClientDC.MoveTo(m_PointOrigin);
ClientDC.LineTo(m_PointOld);
pDraw = new CLine(m_PointOrigin.x, m_PointOrigin.y,
point.x, point.y, pApp->m_PenColor, pApp->m_CurrentPenThickness);
break;
case ID_DRAW_RECT:
ClientDC.Rectangle(m_PointOrigin.x, m_PointOrigin.y,
m_PointOld.x, m_PointOld.y);
pDraw = new CRectangle(m_PointOrigin.x, m_PointOrigin.y,point.x, point.y,
pApp->m_PenColor, pApp->m_CurrentPenThickness);
break;
case ID_DRAW_RECTFILL:
ClientDC.Rectangle(m_PointOrigin.x, m_PointOrigin.y,
m_PointOld.x, m_PointOld.y);
pDraw = new CRectFill(m_PointOrigin.x, m_PointOrigin.y, point.x, point.y,
pApp->m_FillColor);
break;
case ID_DRAW_RECTROUND:
{
int SizeRound = (abs(m_PointOld.x - m_PointOrigin.x) +
abs(m_PointOld.y - m_PointOrigin.x))/6;
ClientDC.RoundRect(m_PointOrigin.x, m_PointOrigin.y,
m_PointOld.x, m_PointOld.y,
SizeRound, SizeRound);
pDraw = new CRectRound(m_PointOrigin.x, m_PointOrigin.y, point.x, point.y,
pApp->m_PenColor, pApp->m_CurrentPenThickness);
break;
}
case ID_DRAW_RECTROUNDFILL:
{ int SizeRound = (abs(m_PointOld.x - m_PointOrigin.x) +
abs(m_PointOld.y-m_PointOrigin.x))/6;
ClientDC.RoundRect(m_PointOrigin.x, m_PointOrigin.y,
m_PointOld.x, m_PointOld.y,
SizeRound, SizeRound);
pDraw = new CRectRoundFill(m_PointOrigin.x, m_PointOrigin.y, point.x, point.y,
pApp->m_FillColor);
break;
}
case ID_DRAW_CIRCLE:
{
int dim = int(sqrt((m_PointOld.x - m_PointOrigin.x) * (m_PointOld.x - m_PointOrigin.x)
+ (m_PointOld.y - m_PointOrigin.y) * (m_PointOld.y - m_PointOrigin.y)));
ClientDC.Ellipse(m_PointOrigin.x - dim, m_PointOrigin.y - dim,
m_PointOrigin.x + dim, m_PointOrigin.y + dim);
dim = int(sqrt((point.x - m_PointOrigin.x) * (point.x - m_PointOrigin.x)
+ (point.y - m_PointOrigin.y) * (point.y - m_PointOrigin.y)));
ClientDC.Ellipse(m_PointOrigin.x - dim, m_PointOrigin.y - dim,
m_PointOrigin.x + dim, m_PointOrigin.y + dim);
pDraw = new CCircle(m_PointOrigin.x - dim, m_PointOrigin.y - dim,
m_PointOrigin.x + dim, m_PointOrigin.y + dim,
pApp->m_PenColor, pApp->m_CurrentPenThickness);
break;
}
case ID_DRAW_CIRCLEFILL:
{
ClientDC.MoveTo(m_PointOrigin);
ClientDC.LineTo(m_PointOld);
int dim = int(sqrt((m_PointOld.x - m_PointOrigin.x) * (m_PointOld.x - m_PointOrigin.x)
+ (m_PointOld.y - m_PointOrigin.y) * (m_PointOld.y - m_PointOrigin.y)));
ClientDC.Ellipse(m_PointOrigin.x - dim,m_PointOrigin.y - dim,
m_PointOrigin.x + dim, m_PointOrigin.y + dim);
dim = int(sqrt((point.x - m_PointOrigin.x) * (point.x - m_PointOrigin.x)
+ (point.y - m_PointOrigin.y) * (point.y - m_PointOrigin.y)));
ClientDC.Ellipse(m_PointOrigin.x - dim, m_PointOrigin.y - dim,
m_PointOrigin.x + dim, m_PointOrigin.y + dim);
pDraw = new CCircleFill(m_PointOrigin.x - dim, m_PointOrigin.y - dim,
m_PointOrigin.x + dim, m_PointOrigin.y + dim,
pApp->m_FillColor);
break;
}
case ID_DRAW_ELLIPSE:
{
ClientDC.Ellipse(m_PointOrigin.x, m_PointOrigin.y,
m_PointOld.x, m_PointOld.y);
pDraw = new CCircle(m_PointOrigin.x, m_PointOrigin.y, point.x, point.y,
pApp->m_PenColor, pApp->m_CurrentPenThickness);
break;
}
case ID_DRAW_ELLIPSEFILL:
ClientDC.Ellipse(m_PointOrigin.x, m_PointOrigin.y,
m_PointOld.x, m_PointOld.y);
pDraw = new CCircleFill(m_PointOrigin.x, m_PointOrigin.y, point.x, point.y,
pApp->m_FillColor);
break;
case ID_DRAW_WORD:
{
CPoint PointOrigin = m_PointOrigin;
ClientDC.DPtoLP(&PointOrigin);
CString str;
CWord WordDlg;
if(WordDlg.DoModal() == IDOK)
{
str = WordDlg.m_Word;
pDraw = new CText(PointOrigin.x, PointOrigin.y, point.x, point.y, m_cTextColor, m_lf, str);
flag = TRUE;
}
if(m_IsRect)
{
CRect rect(m_PointOrigin.x, m_PointOrigin.y, m_PointOld.x, m_PointOld.y);
rect.NormalizeRect();
ClientDC.DrawFocusRect(rect);
m_IsRect = FALSE;
}
}
}
if(pApp->m_CurrentTool != ID_DRAW_SELECT && pApp->m_CurrentTool != ID_DRAW_WORD)
{
ClientDC.SetROP2(R2_COPYPEN);
pDraw->Draw(&ClientDC);
CDrawDoc *pDoc = GetDocument();
pDoc->AddDraw(pDraw);
pDoc->UpdateAllViews(this, 0, pDraw);
}
else if(pApp->m_CurrentTool == ID_DRAW_WORD&&flag)
{
ClientDC.SetROP2(R2_COPYPEN);
pDraw->Draw(&ClientDC);
CDrawDoc *pDoc = GetDocument();
pDoc->AddDraw(pDraw);
pDoc->UpdateAllViews(this, 0, pDraw);
}
CScrollView::OnLButtonUp(nFlags, point);
}
void CDrawView::OnRButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(m_IsRect)
{
CDC *pDC = GetDC();
CRect rect(m_PointOrigin.x, m_PointOrigin.y, m_PointOld.x, m_PointOld.y);
rect.NormalizeRect();
pDC->DrawFocusRect(rect);
ReleaseDC(pDC);
m_IsRect = FALSE;
}
CScrollView::OnRButtonUp(nFlags, point);
}
void CDrawView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
if(pHint != 0)
{
CRect InvalidRect = ((CLine *)pHint)->GetDimRect();
CClientDC ClientDC(this);
OnPrepareDC(&ClientDC);
ClientDC.LPtoDP(&InvalidRect);
InvalidateRect(&InvalidRect);
}
else
CScrollView::OnUpdate(pSender,lHint,pHint);
}
void CDrawView::OnDrawFont()
{
CTsFont TsFont;
TsFont.m_lfHeight = m_lf.lfHeight;
TsFont.m_lfWidth = m_lf.lfWidth;
TsFont.m_lfEscapement = m_lf.lfEscapement;
TsFont.m_lfOrientation = m_lf.lfOrientation;
TsFont.m_lfWeight = m_lf.lfWeight;
TsFont.m_crColor = m_cTextColor;
if(TsFont.DoModal() == IDOK)
{
m_lf.lfHeight = TsFont.m_lfHeight;
m_lf.lfWidth = TsFont.m_lfWidth;
m_lf.lfEscapement = TsFont.m_lfEscapement;
m_lf.lfOrientation = TsFont.m_lfOrientation;
m_lf.lfWeight = TsFont.m_lfWeight;
m_cTextColor = TsFont.m_crColor;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -