📄 drawview.cpp
字号:
// DrawView.cpp : implementation of the CDrawView class
//
#include "stdafx.h"
#include "Draw.h"
#include "DrawDoc.h"
#include "DrawView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDrawView
IMPLEMENT_DYNCREATE(CDrawView, CView)
BEGIN_MESSAGE_MAP(CDrawView, CView)
//{{AFX_MSG_MAP(CDrawView)
ON_COMMAND(ID_LINE_MENU, OnLineMenu)
ON_COMMAND(ID_RECT_MENU, OnRectMenu)
ON_COMMAND(ID_ELLI_MENU, OnElliMenu)
ON_UPDATE_COMMAND_UI(ID_ELLI_MENU, OnUpdateElliMenu)
ON_UPDATE_COMMAND_UI(ID_LINE_MENU, OnUpdateLineMenu)
ON_UPDATE_COMMAND_UI(ID_RECT_MENU, OnUpdateRectMenu)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
//}}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()
/////////////////////////////////////////////////////////////////////////////
// CDrawView construction/destruction
CDrawView::CDrawView()
{
// TODO: add construction code here
m_bLine=m_bRect=m_bElli=false;//初始化三个画图标识工具
m_drawing=false;//初始化画图标记
m_Hcursor=AfxGetApp()->LoadStandardCursor(IDC_CROSS);//初始化光标为十字形光标
}
CDrawView::~CDrawView()
{
}
BOOL CDrawView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CDrawView drawing
void CDrawView::OnDraw(CDC* pDC)
{
CDrawDoc *pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
int index;
index=pDoc->m_Shape.GetSize();//把m_Shape的长度值赋给index
while(index--)//处理m_Shape的每一个图形对象
pDoc->GetShape(index)->Draw(pDC);//把m_Shape中所有对象重绘出来
}
/////////////////////////////////////////////////////////////////////////////
// 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
{
CView::AssertValid();
}
void CDrawView::Dump(CDumpContext& dc) const
{
CView::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::OnLineMenu() //直线菜单项的消息处理函数
{
// TODO: Add your command handler code here
m_bLine=true;//直线菜单项的绘图工具标志为true
m_bRect=false;//矩形菜单项的绘图工具标志为false
m_bElli=false;//椭圆菜单项的绘图工具标志为false
}
void CDrawView::OnRectMenu() //矩形菜单项的消息处理函数
{
// TODO: Add your command handler code here
m_bLine=false;//直线菜单项的绘图工具标志为false
m_bRect=true;//矩形菜单项的绘图工具标志为true
m_bElli=false;//椭圆菜单项的绘图工具标志为false
}
void CDrawView::OnElliMenu() //椭圆菜单项的消息处理函数
{
// TODO: Add your command handler code here
m_bLine=false;//直线菜单项的绘图工具标志为false
m_bRect=false;//矩形菜单项的绘图工具标志为false
m_bElli=true;//椭圆菜单项的绘图工具标志为true
}
void CDrawView::OnUpdateElliMenu(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
//在椭圆菜单项前设置复选标志,并使椭圆按钮呈按下状态
pCmdUI->SetCheck(m_bElli);
}
void CDrawView::OnUpdateLineMenu(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
//在直线菜单项前设置复选标志,并使直线按钮呈按下状态
pCmdUI->SetCheck(m_bLine);
}
void CDrawView::OnUpdateRectMenu(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
//在矩形菜单项前设置复选标志,并使矩形按钮呈按下状态
pCmdUI->SetCheck(m_bRect);
}
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)//按下鼠标左键的消息处理函数
{
// TODO: Add your message handler code here and/or call default
SetCursor(m_Hcursor);//把鼠标光标设置成自定义光标
m_Start=point;//开始画图时初始化起点为鼠标当前值
m_End=point; //开始画图时初始化终点为鼠标当前值
SetCapture(); //捕获鼠标
RECT rect; //声明一个RECT类变量
GetClientRect(&rect); //获取程序窗口的客户区坐标
ClientToScreen(&rect);//把客户区坐标转化为屏幕坐标
ClipCursor(&rect); //限制鼠标的移动范围
m_drawing=true;//按下左键开始画图,设置画图标志为true
CView::OnLButtonDown(nFlags, point);
}
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(m_drawing)
{
m_End=point; //松开左键时鼠标当前值是图形终点
ReleaseCapture(); //释放捕获鼠标
ClipCursor(NULL); //取消对鼠标的限制,使其可以在屏幕任意位置移动
CClientDC pDC(this);//创建设备环境
m_drawing=false;//如果左键释放前正在画图,画图完毕标志置为false
CDrawDoc *pDoc=GetDocument();//声明一个指向文档对象的指针
ASSERT_VALID(pDoc); //确保能成功获取文件对象指针
if(m_bLine)//画直线
{
//CPen SolidPen(PS_SOLID,3,RGB(255,0,0));//创建红色画笔
//pDC.SelectObject(&SolidPen);//将画笔选入设备环境
pDC.MoveTo(m_Start);
pDC.LineTo(m_End);
pDoc->AddShape(1,m_Start.x,m_Start.y,m_End.x,m_End.y);//把图形信息加到m_Shape中
}
if(m_bRect)//画矩形
{
//CBrush BlueBrush(RGB(0,0,255));//蓝色画刷
//pDC.SelectObject(&BlueBrush); //将画刷选入设备环境
pDC.Rectangle(m_Start.x,m_Start.y,m_End.x,m_End.y);
pDoc->AddShape(2,m_Start.x,m_Start.y,m_End.x,m_End.y);//把图形信息加到m_Shape中
}
if(m_bElli)//画椭圆
{
//CBrush GreenBrush(RGB(0,255,0));//绿色画刷
//pDC.SelectObject(&GreenBrush); //将画刷选入设备环境
pDC.Ellipse(m_Start.x,m_Start.y,m_End.x,m_End.y);
pDoc->AddShape(3,m_Start.x,m_Start.y,m_End.x,m_End.y);//把图形信息加到m_Shape中
}
}//END if(m_drawing)
CView::OnLButtonUp(nFlags, point);
}
void CDrawView::OnMouseMove(UINT nFlags, CPoint point)//移动鼠标时的消息处理函数
{
// TODO: Add your message handler code here and/or call default
if(m_drawing)
{
CClientDC pDC(this);//创建设备环境
SetCursor(m_Hcursor);//把鼠标设置为自定义光标
pDC.SetROP2(R2_NOT);//设置绘图模式,使用与当前屏幕颜色相反的颜色绘图
if(m_bLine)//如果当前正在画直线
{
pDC.MoveTo(m_Start);
pDC.LineTo(m_End);
pDC.MoveTo(m_Start);
pDC.LineTo(point);
}
if(m_bRect)//如果当前正在画矩形
{
pDC.SelectStockObject(NULL_BRUSH);//将空画刷选入设备环境
pDC.Rectangle(m_Start.x,m_Start.y,m_End.x,m_End.y);
pDC.Rectangle(m_Start.x,m_Start.y,point.x,point.y);
}
if(m_bElli)//如果当前正在画椭圆
{
pDC.SelectStockObject(NULL_BRUSH);//将空画刷选入设备环境
pDC.Ellipse(m_Start.x,m_Start.y,m_End.x,m_End.y);
pDC.Ellipse(m_Start.x,m_Start.y,point.x,point.y);
}
m_End=point;//把当前点记录为终点
}
CView::OnMouseMove(nFlags, point);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -