📄 recttool.cpp
字号:
#include "StdAfx.h"
#include ".\recttool.h"
#include "rectobj.h"
#include "visdrawdoc.h"
#include "visdrawview.h"
static CRectTool lineToolObj(lineTool);
static CRectTool hlineToolObj(hlineTool);
static CRectTool vlineToolObj(vlineTool);
static CRectTool rectToolObj(rectTool);
CRectTool::CRectTool(void)
{
}
CRectTool::CRectTool(DrawShape drawShape)
: CDrawTool(drawShape)
{
pObj = NULL;
}
CRectTool::~CRectTool(void)
{
}
void CRectTool::OnLButtonDown(CVisDrawView* pView, UINT nFlags, const CPoint& point)
{
CPoint local = point;
double x, y;
//把设备坐标转化为逻辑坐标
pView->ClientToDoc(local);
//把逻辑坐标转化为世界坐标
pView->ClientToWorld(local,x,y);
//申请与视图窗口相关的设备描述表
CDC* dc=pView->GetDC();
//用用笔的颜色绘图
dc->SetROP2(R2_NOT);
//选用空画刷
dc->SelectStockObject(NULL_BRUSH);
m_LMouseDownStep++;
switch(m_LMouseDownStep)
{
default:
break;
case 1: //第一次按下鼠标
//创建矩形对象
pObj = new CRectObj(CRect(local, CSize(0, 0)));
switch(m_drawShape)
{
default:
break;
case lineTool:
case hlineTool:
case vlineTool:
//图形类型为直线
pObj->m_nShape = CRectObj::lineshape;
break;
case rectTool:
//图形类型为矩形
pObj->m_nShape = CRectObj::rectshape;
break;
}
//把第一次按下的鼠标点设置矩形左上角
pObj->SetPoint(1,x,y);
pObj->CalcBounds(pView);
pView->GetDocument()->Add(pObj);
break;
case 2: //第二次按下鼠标
switch(m_drawShape)
{
default:
break;
case lineTool:
//删除第一点到前一个鼠标位置点之间的直线
dc->MoveTo(lastPoint);
dc->LineTo(prePoint);
//绘制第一个点到鼠标点的直线
dc->SetROP2(R2_COPYPEN);
dc->MoveTo(lastPoint);
dc->LineTo(point);
//把鼠标点设置为矩形右下角
pObj->SetPoint(2,x,y);
break;
case hlineTool:
//删除第一点到前一个鼠标位置点之间的直线
dc->MoveTo(lastPoint);
dc->LineTo(prePoint.x,lastPoint.y);
//绘制第一个点到鼠标点的直线
dc->SetROP2(R2_COPYPEN);
dc->MoveTo(lastPoint);
dc->LineTo(point.x,lastPoint.y);
local.x = point.x;
local.y = lastPoint.y;
//把设备坐标转化为逻辑坐标
pView->ClientToDoc(local);
//把坐标转化为世界坐标
pView->ClientToWorld(local,x,y);
pObj->SetPoint(2,x,y);
break;
case vlineTool:
local.x = lastPoint.x;
local.y = point.y;
//把设备坐标转化为逻辑坐标
pView->ClientToDoc(local);
//把坐标转化为世界坐标
pView->ClientToWorld(local,x,y);
pObj->SetPoint(2,x,y);
//CDrawTool::c_drawShape=selectTool;
break;
case rectTool:
CRect rect;
//删除以前一个鼠标点为矩形右下角的矩形
rect.TopLeft() = lastPoint;
rect.BottomRight() = prePoint;
dc->Rectangle(rect);
//绘制以当前鼠标点为矩形右下角的矩形
rect.BottomRight() = point;
dc->Rectangle(rect);
pObj->SetPoint(2,x,y);
break;
}
//刷新视图
// pView->Invalidate();
pObj->CalcBounds(pView);
pObj =NULL;
m_LMouseDownStep = 0;
}
lastPoint = point;
prePoint = point;
//释放设备描述表
pView->ReleaseDC(dc);
}
void CRectTool::OnLButtonUp(CVisDrawView* pView, UINT nFlags, const CPoint& point)
{
}
void CRectTool::OnMouseMove(CVisDrawView* pView, UINT nFlags, const CPoint& point)
{
CPoint local;
local = point;
//把设备坐标转化为逻辑坐标
pView->ClientToDoc(local);
if(!m_LMouseDownStep) return;
//申请与视图窗口相关的设备描述表
CDC* dc=pView->GetDC();
//用屏幕颜色的反色绘图
dc->SetROP2(R2_NOT);
dc->SelectStockObject(NULL_BRUSH);
switch(m_drawShape)
{
default:
break;
case lineTool:
//反转绘制前一条直线
dc->MoveTo(lastPoint);
dc->LineTo(prePoint);
//用画笔颜色绘制起点到终点的直线
// dc->SetROP2(R2_COPYPEN);
dc->MoveTo(lastPoint);
dc->LineTo(point);
break;
case hlineTool:
//删除第一点到前一个鼠标位置点之间的直线
dc->MoveTo(lastPoint);
dc->LineTo(prePoint.x,lastPoint.y);
//绘制第一个点到鼠标点的直线
dc->MoveTo(lastPoint);
dc->LineTo(point.x,lastPoint.y);
break;
case vlineTool:
//删除第一点到前一个鼠标位置点之间的直线
dc->MoveTo(lastPoint);
dc->LineTo(lastPoint.x,prePoint.y);
//绘制第一个点到鼠标点的直线
dc->MoveTo(lastPoint);
dc->LineTo(lastPoint.x,point.y);
break;
case rectTool:
CRect rect;
rect.TopLeft() = lastPoint;
rect.BottomRight() = prePoint;
dc->Rectangle(rect);
rect.BottomRight() = point;
dc->Rectangle(rect);
break;
}
pView->ReleaseDC(dc);
prePoint = point;
}
void CRectTool::OnLButtonDblClk(CVisDrawView* pView, UINT nFlags, const CPoint& point)
{
}
void CRectTool::CreateObj(CVisDrawView* pView, const CPoint& point)
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -