📄 circletool.cpp
字号:
#include "StdAfx.h"
#include ".\circletool.h"
#include <math.h>
#include "circleobj.h"
#include "visdrawdoc.h"
#include "visdrawview.h"
CCircleTool::CCircleTool(void)
{
}
CCircleTool::~CCircleTool(void)
{
}
CCircleTool::CCircleTool(DrawShape drawShape)
: CDrawTool(drawShape)
{
pObj = NULL;
}
void CCircleTool::OnLButtonDown(CVisDrawView* pView, UINT nFlags, const CPoint& point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
double ptx, pty;
CPoint local = point;
//把设备坐标转化为逻辑坐标
pView->ClientToDoc(local);
pView->ClientToWorld(local, ptx,pty);
if(!m_LMouseDownStep)
{
pObj = new CCircleObj(CRect(local, CSize(0, 0)));
m_LMouseDownStep = 1;
pView->GetDocument()->Add(pObj);
//把第一个点指定为圆心
pObj->SetCenterPoint(ptx,pty);
}
else
{
CDC* dc=pView->GetDC();
dc->SetROP2(R2_COPYPEN);
dc->SelectStockObject(NULL_BRUSH);
double radium;
//计算圆半径
radium = pObj->CalcRadium(ptx, pty);
pObj->SetRadium(radium);
pObj->CalcBounds(pView);
CRect rect = CalcBounds(point);
dc->Ellipse(rect);
dc->SetROP2(R2_NOT);
dc->MoveTo(lastPoint);
dc->LineTo(point);
pObj = NULL;
m_LMouseDownStep = 0;
pView->ReleaseDC(dc);
}
lastPoint = point;
prePoint = point;
}
void CCircleTool::OnLButtonUp(CVisDrawView* pView, UINT nFlags, const CPoint& point)
{
}
void CCircleTool::OnMouseMove(CVisDrawView* pView, UINT nFlags, const CPoint& point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CPoint local = point;
double ptx, pty;
//把设备坐标转化为逻辑坐标
pView->ClientToDoc(local);
pView->ClientToWorld(local,ptx,pty);
if(m_LMouseDownStep)
{
//申请与视图窗口相关的设备描述表
CDC* dc=pView->GetDC();
//用屏幕颜色的反色绘图
dc->SetROP2(R2_NOT);
dc->SelectStockObject(NULL_BRUSH);
switch(m_drawShape)
{
default:
break;
case circleTool:
//绘制前一条直线
dc->MoveTo(lastPoint);
dc->LineTo(prePoint);
//绘制起点到当前鼠标点位置的直线
dc->MoveTo(lastPoint);
dc->LineTo(point);
double radium;
CRect rect;
radium = pObj->CalcRadium(ptx,pty);
pObj->SetRadium(radium);
rect = CalcBounds(prePoint);
dc->Ellipse(rect);
rect = CalcBounds(point);
dc->Ellipse(rect);
break;
}
prePoint = point;
pView->ReleaseDC(dc);
}
}
void CCircleTool::OnLButtonDblClk(CVisDrawView* pView, UINT nFlags, const CPoint& point)
{
}
void CCircleTool::CreateObj(CVisDrawView* pView, const CPoint& point)
{
}
CRect CCircleTool::CalcBounds(CPoint pt)
{
CRect rect;
long dx,dy;
double r;
long Radium;
dx = pt.x - lastPoint.x;
dy = pt.y - lastPoint.y;
r = sqrt((double)(dx*dx+dy*dy));
Radium = (long)r;
rect.top = (long)(lastPoint.y + Radium);
rect.left = (long)(lastPoint.x - Radium);
rect.bottom = (long)(lastPoint.y - Radium);
rect.right = (long)(lastPoint.x + Radium);
return rect;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -