📄 easydrawview.cpp
字号:
// EasyDrawView.cpp : CEasyDrawView 类的实现
//
#include "stdafx.h"
#include "EasyDraw.h"
#include "EasyDrawDoc.h"
#include "EasyDrawView.h"
#include "MainFrm.h"
#include "DrawToolDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CEasyDrawView
IMPLEMENT_DYNCREATE(CEasyDrawView, CView)
BEGIN_MESSAGE_MAP(CEasyDrawView, CView)
// 标准打印命令
ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_COMMAND(ID_TOOL_LINE, &CEasyDrawView::OnToolLine)
ON_COMMAND(ID_TOOL_RECT, &CEasyDrawView::OnToolRect)
ON_COMMAND(ID_TOOL_CIRCLE, &CEasyDrawView::OnToolCircle)
ON_UPDATE_COMMAND_UI(ID_TOOL_LINE, &CEasyDrawView::OnUpdateToolLine)
ON_UPDATE_COMMAND_UI(ID_TOOL_RECT, &CEasyDrawView::OnUpdateToolRect)
ON_UPDATE_COMMAND_UI(ID_TOOL_CIRCLE, &CEasyDrawView::OnUpdateToolCircle)
ON_WM_ERASEBKGND()
ON_WM_MOUSEMOVE()
END_MESSAGE_MAP()
/******************************************************************************
* 作用: 构造函数
******************************************************************************/
CEasyDrawView::CEasyDrawView()
{
m_bStartDraw = false;
m_nGraphType = EG_LINE;
}
/******************************************************************************
* 作用: 析构函数
******************************************************************************/
CEasyDrawView::~CEasyDrawView()
{
EasyGraphics* graph = NULL;
for (INT_PTR i = 0; i < m_GraphAry.GetCount(); i++)
{
graph = (EasyGraphics*)m_GraphAry[i];
SAFE_DELETE (graph);
}
}
/******************************************************************************
* 作用: 重绘视图
* 参数:
pDC 上下文设备CDC指针
******************************************************************************/
void CEasyDrawView::OnDraw(CDC* pDC)
{
CEasyDrawDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
CRect rect;
GetClientRect(rect);
CDC memDC;
CBitmap MemBitmap;
// 设备描述表初始化
memDC.CreateCompatibleDC(NULL);
// 建立与屏幕显示兼容的内存显示设备
MemBitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());
// 选取空白位图
memDC.SelectObject(MemBitmap);
memDC.FillSolidRect(0, 0, rect.Width(), rect.Height(), RGB(255,255,255));
EasyGraphics* graph = NULL;
// 逐个绘制图形容器中的图形
for (INT_PTR i = 0; i < m_GraphAry.GetCount(); i++)
{
graph = (EasyGraphics*)m_GraphAry[i];
DrawGraphics(&memDC, graph);
}
pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);
}
// CEasyDrawView 打印
BOOL CEasyDrawView::OnPreparePrinting(CPrintInfo* pInfo)
{
// 默认准备
return DoPreparePrinting(pInfo);
}
void CEasyDrawView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 添加额外的打印前进行的初始化过程
}
void CEasyDrawView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 添加打印后进行的清除过程
}
// CEasyDrawView 诊断
#ifdef _DEBUG
void CEasyDrawView::AssertValid() const
{
CView::AssertValid();
}
void CEasyDrawView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CEasyDrawDoc* CEasyDrawView::GetDocument() const // 非调试版本是内联的
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CEasyDrawDoc)));
return (CEasyDrawDoc*)m_pDocument;
}
#endif //_DEBUG
/******************************************************************************
* 作用: 绘制一个图形
* 参数:
* pDC 上下文设备CDC指针
* graph 图形对象指针
* 备注: 具体绘制方法根据图形类型确定
******************************************************************************/
void CEasyDrawView::DrawGraphics(CDC* pDC, EasyGraphics* graph)
{
LOGBRUSH logBrush;
logBrush.lbStyle = BS_SOLID;
logBrush.lbColor = graph->m_clrColor;
CPen pen(graph->m_nLineType |PS_GEOMETRIC|PS_ENDCAP_ROUND,
graph->m_nLineWidth, &logBrush);
// 选中新的笔对象
CPen* oldPen = pDC->SelectObject(&pen);
// 使用透明画刷
CBrush* oldBrush = (CBrush*)pDC->SelectStockObject(NULL_BRUSH);
switch (graph->m_nType)
{
case EG_RECT:
// 绘制矩形
pDC->Rectangle(graph->m_PtTopLeft.x,
graph->m_PtTopLeft.y,
graph->m_PtBottomRight.x,
graph->m_PtBottomRight.y);
break;
case EG_CIRCLE:
// 绘制椭圆
pDC->Ellipse(graph->m_PtTopLeft.x,
graph->m_PtTopLeft.y,
graph->m_PtBottomRight.x,
graph->m_PtBottomRight.y);
break;
default:
// 绘制直线
pDC->MoveTo(graph->m_PtTopLeft);
pDC->LineTo(graph->m_PtBottomRight);
}
pDC->SelectObject(oldPen);
pDC->SelectObject(oldBrush);
}
/******************************************************************************
* 作用: 用户选中“工具”下的“直线工具”时的响应函数
******************************************************************************/
void CEasyDrawView::OnToolLine()
{
m_nGraphType = EG_LINE;
}
/******************************************************************************
* 作用: 用户选中“工具”下的“矩形工具”时的响应函数
******************************************************************************/
void CEasyDrawView::OnToolRect()
{
m_nGraphType = EG_RECT;
}
/******************************************************************************
* 作用: 用户选中“工具”下的“椭圆工具”时的响应函数
******************************************************************************/
void CEasyDrawView::OnToolCircle()
{
m_nGraphType = EG_CIRCLE;
}
/******************************************************************************
* 作用: “直线工具”的动态更新函数
******************************************************************************/
void CEasyDrawView::OnUpdateToolLine(CCmdUI *pCmdUI)
{
pCmdUI->SetCheck(m_nGraphType == EG_LINE);
}
/******************************************************************************
* 作用: “矩形工具”的动态更新函数
******************************************************************************/
void CEasyDrawView::OnUpdateToolRect(CCmdUI *pCmdUI)
{
pCmdUI->SetCheck(m_nGraphType == EG_RECT);
}
/******************************************************************************
* 作用: “椭圆工具”的动态更新函数
******************************************************************************/
void CEasyDrawView::OnUpdateToolCircle(CCmdUI *pCmdUI)
{
pCmdUI->SetCheck(m_nGraphType == EG_CIRCLE);
}
/******************************************************************************
* 作用: 视图中按下鼠标左键的响应函数
******************************************************************************/
void CEasyDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
m_bStartDraw = true;
m_PtPress = m_PtLast = point;
}
/******************************************************************************
* 作用: 视图中释放鼠标左键的响应函数
* 备注: 创建图形对象
******************************************************************************/
void CEasyDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
CDrawToolDlg* dlg = CMainFrame::GetDrawTool();
if (m_bStartDraw)
{
// 创建新图形对象
EasyGraphics* graph = new EasyGraphics;
// 对图形属性赋值
graph->m_nType = m_nGraphType;
graph->m_clrColor = dlg->GetLineColor();
graph->m_nLineType = dlg->GetLineType();
graph->m_nLineWidth = dlg->GetLineWidth();
graph->m_PtTopLeft = m_PtPress;
graph->m_PtBottomRight = point;
// 添加到图形容器中
m_GraphAry.Add(graph);
// 一个绘制结束
m_bStartDraw = false;
// 让视图重绘
Invalidate();
}
}
/******************************************************************************
* 作用: 视图中移动鼠标的响应函数
* 备注: 绘制移动轨迹过程
******************************************************************************/
void CEasyDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
if (m_bStartDraw)
{
CDC* pDC = GetDC();
int nDrawMode = pDC->SetROP2(R2_NOTXORPEN); // 设置为“异或模式”
CDrawToolDlg* dlg = CMainFrame::GetDrawTool();
EasyGraphics* graph = new EasyGraphics; // 临时绘制对象
// 对图形属性赋值
graph->m_nType = m_nGraphType;
graph->m_clrColor = dlg->GetLineColor();
graph->m_nLineType = dlg->GetLineType();
graph->m_nLineWidth = dlg->GetLineWidth();
graph->m_PtTopLeft = m_PtPress;
graph->m_PtBottomRight = m_PtLast;
DrawGraphics(pDC, graph); // 擦除上次绘制图形
graph->m_PtBottomRight = point;
DrawGraphics(pDC, graph); // 绘制新图形
m_PtLast = point; // 保存当前鼠标坐标
pDC->SetROP2(nDrawMode);
SAFE_DELETE (graph);
ReleaseDC(pDC);
}
CView::OnMouseMove(nFlags, point);
}
/******************************************************************************
* 作用: 禁止背景重绘,防止画面闪烁
******************************************************************************/
BOOL CEasyDrawView::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
// return CView::OnEraseBkgnd(pDC);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -