📄 pointobj.cpp
字号:
#include "StdAfx.h"
#include ".\pointobj.h"
#include "visdrawview.h"
#include "visdrawdoc.h"
IMPLEMENT_SERIAL(CPointObj, CFigureObj, 0)
CPointObj::CPointObj(void)
{
}
CPointObj::~CPointObj(void)
{
}
CPointObj::CPointObj(const CRect& position)
: CFigureObj(position)
{
ASSERT_VALID(this);
m_pointx = 0.0;
m_pointy = 0.0;
}
void CPointObj::Draw(CVisDrawView* pView, CDC* pDC)
{
ASSERT_VALID(this);
CBrush brush;
if (!brush.CreateBrushIndirect(&m_logbrush))
return;
CPen pen;
if (!pen.CreatePenIndirect(&m_logpen))
return;
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);
//把点的世界坐标转化为逻辑坐标
CPoint nPoint;
pView->WorldToClient(nPoint,m_pointx,m_pointy);
pDC->SetPixel(nPoint.x,nPoint.y,m_logpen.lopnColor);
pDC->SelectObject(pOldBrush);
pDC->SelectObject(pOldPen);
}
void CPointObj::Serialize(CArchive& ar)
{
ASSERT_VALID(this);
//调用基类串行化
CFigureObj::Serialize(ar);
if (ar.IsStoring())
{
ar << m_pointx << m_pointy;
}
else
{
ar >> m_pointx >> m_pointy;
}
}
void CPointObj::SetPoint(double pointx, double pointy)
{
m_pointx = pointx;
m_pointy = pointy;
}
void CPointObj::GetPoint(double& pointx, double& pointy)
{
pointx = m_pointx;
pointy = m_pointy;
}
//计算外接矩形,以逻辑坐标表示
CRect CPointObj::CalcBounds(CVisDrawView* pView)
{
CPoint nPoint;
pView->WorldToClient(nPoint,m_pointx,m_pointy);
m_position = CRect(nPoint, CSize(1, 1));
return m_position;
}
//图元拾取判断函数
BOOL CPointObj::IsSelected(CVisDrawView* pView, const CPoint& point)
{
//参数point是鼠标的逻辑坐标
int distance, nSelectDistance;
CPoint local;
local = point;
//鼠标点的设备坐标
pView->DocToClient(local);
//识别精度值
nSelectDistance = pView->GetDocument()->GetSetectDistance()/2;
CPoint pt;
//把点的坐标转化为逻辑坐标
pView->WorldToClient(pt, m_pointx, m_pointy);
//把点的坐标由逻辑坐标转化为设备坐标
pView->DocToClient(pt);
//计算鼠标点point与点pt之间的像素距离
distance = (int)PointToPoint(pt,local);
//根据拾取条件判断图元是否被拾取
return (distance < nSelectDistance);
}
//返回手柄个数
int CPointObj::GetHandleCount()
{
ASSERT_VALID(this);
return 1;
}
// 返回手柄中心逻辑坐标
CPoint CPointObj::GetHandle(CVisDrawView* pView, int nHandle)
{
ASSERT_VALID(this);
return CFigureObj::GetHandle(pView, nHandle);
}
// delta为逻辑坐标
void CPointObj::MoveTo(CPoint delta, CVisDrawView* pView)
{
ASSERT_VALID(this);
//把delta转化为世界坐标
double pointx,pointy;
pointx = pView->ClientToWorld(delta.x);
pointy = -pView->ClientToWorld(delta.y);
//修改点坐标
m_pointx += pointx;
m_pointy += pointy;
//重新计算边界矩形
CalcBounds(pView);
//修改文档标志
m_pDocument->SetModifiedFlag();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -