📄 circleobj.cpp
字号:
//Circle.cpp 图形元圆类的实现文档
#include "StdAfx.h"
#include ".\circleobj.h"
#include "visdrawview.h"
#include "visdrawdoc.h"
#include <math.h>
IMPLEMENT_SERIAL(CCircleObj, CFigureObj, 0)
CCircleObj::CCircleObj(void)
{
}
CCircleObj::~CCircleObj(void)
{
}
CCircleObj::CCircleObj(const CRect& position)
: CFigureObj(position)
{
ASSERT_VALID(this);
m_CenterPointx = 0.0;
m_CenterPointy = 0.0;
m_Radium = 0.0;//半径
}
void CCircleObj::Draw(CVisDrawView* pView, CDC* pDC)
{
ASSERT_VALID(this);
//创建画刷
CBrush brush;
if (!brush.CreateBrushIndirect(&m_logbrush))
return;
//创建画笔
CPen pen;
if (!pen.CreatePenIndirect(&m_logpen))
return;
//设置DC
CBrush* pOldBrush;
CPen* pOldPen;
if (m_bBrush)
pOldBrush = pDC->SelectObject(&brush);
else
pOldBrush = (CBrush*)pDC->SelectStockObject(NULL_BRUSH);
if (m_bPen)
pOldPen = pDC->SelectObject(&pen);
else
pOldPen = (CPen*)pDC->SelectStockObject(NULL_PEN);
//用圆的外接矩形绘制圆
CRect rect = CalcBounds(pView);
pDC->Ellipse(rect);
//恢复DC
pDC->SelectObject(pOldBrush);
pDC->SelectObject(pOldPen);
}
void CCircleObj::Serialize(CArchive& ar)
{
ASSERT_VALID(this);
//调用基类串行化
CFigureObj::Serialize(ar);
if (ar.IsStoring())
{
ar << m_CenterPointx << m_CenterPointy << m_Radium;
}
else
{
// WORD wTemp;
ar >> m_CenterPointx >> m_CenterPointy >> m_Radium;
}
}
//设定圆心坐标,为世界坐标
void CCircleObj::SetCenterPoint(double ptx, double pty)
{
m_CenterPointx = ptx;
m_CenterPointy = pty;
}
//获得圆心坐标
void CCircleObj::GetCenterPoint(double& ptx, double& pty)
{
ptx = m_CenterPointx;
pty = m_CenterPointy;
}
//计算矩形图形元边界矩形,以逻辑坐标表示
CRect CCircleObj::CalcBounds(CVisDrawView* pView)
{
long Radium;
CPoint nPoint;
CRect rect;
//把圆心坐标转化为逻辑坐标
pView->WorldToClient(nPoint, m_CenterPointx, m_CenterPointy);
//把半径转化为逻辑半径
Radium = (long)pView->WorldToClient(m_Radium);
//计算外接矩形
rect.top = nPoint.y + Radium;
rect.left = nPoint.x - Radium;
rect.bottom = nPoint.y - Radium;
rect.right = nPoint.x + Radium;
m_position = rect;
return rect;
}
//计算圆的半径,以世界坐标表示
double CCircleObj::CalcRadium(double ptx, double pty)
{
double radium;
double dx,dy;
dx = ptx - m_CenterPointx;
dy = pty - m_CenterPointy;
radium =sqrt(dx*dx + dy*dy);
return radium;
}
void CCircleObj::SetRadium(double radium)
{
m_Radium = radium;
}
double CCircleObj::GetRadium(void)
{
return m_Radium;
}
BOOL CCircleObj::IsSelected(CVisDrawView* pView, const CPoint& point)
{
//参数point是鼠标的逻辑坐标
double distance,radium;
int nSelectDistance;
CPoint local;
local = point;
//鼠标点的设备坐标
pView->DocToClient(local);
//识别精度值
nSelectDistance = pView->GetDocument()->GetSetectDistance()/2;
CPoint pt;
//把圆心坐标转化为逻辑坐标
pView->WorldToClient(pt, m_CenterPointx, m_CenterPointy);
//把圆心坐标由逻辑坐标转化为设备坐标
pView->DocToClient(pt);
//计算鼠标点point与圆心之间的像素距离
distance = PointToPoint(pt,local);
radium = pView->WorldToClient(m_Radium);
distance = fabs(distance - radium);
//根据拾取条件判断图元是否被拾取
return (distance < nSelectDistance);
}
//返回手柄个数
int CCircleObj::GetHandleCount()
{
ASSERT_VALID(this);
return 5;
}
// 返回手柄中心逻辑坐标
CPoint CCircleObj::GetHandle(CVisDrawView* pView, int nHandle)
{
ASSERT_VALID(this);
if(nHandle < 5)
nHandle = 2*nHandle;
else
nHandle = 9;
//调整手柄号后调用基类成员函数
return CFigureObj::GetHandle(pView, nHandle);
}
//移动手柄
void CCircleObj::MoveHandleTo(int nHandle, CPoint point, CVisDrawView* pView)
{
ASSERT_VALID(this);
//把鼠标逻辑坐标转化为世界坐标
double pointx,pointy;
pView->ClientToWorld(point, pointx, pointy);
double radium = CalcRadium(pointx,pointy);
SetRadium(radium);
CalcBounds(pView);
}
// delta为逻辑坐标
void CCircleObj::MoveTo(CPoint delta, CVisDrawView* pView)
{
ASSERT_VALID(this);
//把delta转化为世界坐标
double pointx,pointy;
pointx = pView->ClientToWorld(delta.x);
pointy = -pView->ClientToWorld(delta.y);
//修改圆心坐标
m_CenterPointx = m_CenterPointx + pointx;
m_CenterPointy = m_CenterPointy + pointy;
//重新计算边界矩形
CalcBounds(pView);
//修改文档标志
m_pDocument->SetModifiedFlag();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -