?? 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 + -