📄 paintroundrect.cpp
字号:
// PaintRoundrect.cpp: implementation of the CPaintRoundrect class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "const.h"
#include "paintobj.h"
#include "painted.h"
#include "paintdoc.h"
#include "SearchPath.h"
#include "SearchNode.h"
#include "paintvw.h"
#include "PaintRoundrect.h"
#include "FillColorStatic.h"
#include "RoundrectAttrDlg.h"
#include "DeviceRoundrectAttrDlg.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
extern double fscale;
extern void DPtoVP1(double length,int& length1);//把实际长度变换为用于显示的逻辑长度
extern void DPtoVP(CPnt pnt,CPoint& point);
extern void VPtoDP(CPoint point,CPnt& pnt);
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
IMPLEMENT_SERIAL(CPaintRoundrect, CObject, VERSIONABLE_SCHEMA)
CPaintRoundrect::CPaintRoundrect()
{
m_bFilled=TRUE;
m_rgbInside=RGB(125,125,125);
}
CPaintRoundrect::~CPaintRoundrect()
{
}
void CPaintRoundrect::Draw(CDC* pDC)
{
CPen* pOldPen;
CPen pDrawPen;
CBrush DrawBrush;
CBrush* pOldBrush;
if (m_bFilled)
{
DrawBrush.CreateSolidBrush(m_rgbInside);
pOldBrush = pDC->SelectObject(&DrawBrush);
}
else
{
pOldBrush = (CBrush*) pDC->SelectStockObject(WHITE_BRUSH);
}
pDrawPen.CreatePen(PS_SOLID, m_nWidth, m_rgbPrimary);
pOldPen = pDC->SelectObject(&pDrawPen);
CPoint m_pointPrimary1;
CPoint m_pointEnd1;
int m_ellwidth1;
int m_ellheight1;
DPtoVP1(m_ellwidth,m_ellwidth1);
DPtoVP1(m_ellheight,m_ellheight1);
DPtoVP(m_pointPrimary,m_pointPrimary1);
DPtoVP(m_pointEnd,m_pointEnd1);//把最终实际坐标变换为用于显示的逻辑坐标
pDC->RoundRect(m_pointPrimary1.x,
m_pointPrimary1.y,
m_pointEnd1.x,
m_pointEnd1.y,
m_ellwidth1,
m_ellheight1);
pDC->SelectObject(pOldBrush);
pDC->SelectObject(pOldPen);
}
void CPaintRoundrect::DrawSelected(CDC* pDC, void* pTemp)
{
pDC->SetROP2(R2_COPYPEN);
CPen* pOldPen;
CPen pDrawPen;
CBrush* pOldBrush;
CBrush DrawBrush;
DrawBrush.CreateHatchBrush(HS_FDIAGONAL, 0);
pOldBrush = pDC->SelectObject(&DrawBrush);
pDrawPen.CreatePen(PS_SOLID, m_nWidth, m_rgbPrimary);
pOldPen = pDC->SelectObject(&pDrawPen);
CPoint m_pointPrimary1;
CPoint m_pointEnd1;
int m_ellwidth1;
int m_ellheight1;
DPtoVP1(m_ellwidth,m_ellwidth1);
DPtoVP1(m_ellheight,m_ellheight1);
DPtoVP(m_pointPrimary,m_pointPrimary1);
DPtoVP(m_pointEnd,m_pointEnd1);//把最终实际坐标变换为用于显示的逻辑坐标
pDC->RoundRect(m_pointPrimary1.x,
m_pointPrimary1.y,
m_pointEnd1.x,
m_pointEnd1.y,
m_ellwidth1,
m_ellheight1);
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);
}
void CPaintRoundrect::DragDraw(CDC* pDC, CPnt& pointDragged)
{
pDC->SetROP2(R2_NOT);
CPen* pOldPen;
CPen pDrawPen;
CPoint m_pointPrimary1;
CPoint m_pointEnd1;
int m_ellwidth1;
int m_ellheight1;
DPtoVP1(m_ellwidth,m_ellwidth1);
DPtoVP1(m_ellheight,m_ellheight1);
pDC->SelectStockObject(HOLLOW_BRUSH);
pDrawPen.CreatePen(PS_SOLID, int(fscale*m_nWidth), m_rgbPrimary);
pOldPen = pDC->SelectObject(&pDrawPen);
DPtoVP(m_pointPrimary,m_pointPrimary1);
DPtoVP(m_pointEnd,m_pointEnd1);//把最终实际坐标变换为用于显示的逻辑坐标
pDC->RoundRect(m_pointPrimary1.x,
m_pointPrimary1.y,
m_pointEnd1.x,
m_pointEnd1.y,
m_ellwidth1,
m_ellheight1);
m_pointEnd.x = pointDragged.x;
m_pointEnd.y = pointDragged.y;
DPtoVP(m_pointEnd,m_pointEnd1);//把最终实际坐标变换为用于显示的逻辑坐标
pDC->RoundRect(m_pointPrimary1.x,
m_pointPrimary1.y,
m_pointEnd1.x,
m_pointEnd1.y,
m_ellwidth1,
m_ellheight1);
pDC->SelectObject(pOldPen);
}
void CPaintRoundrect::Move(double x_Move,double y_Move)
{
//移动起点和终点坐标
m_pointPrimary.x+=x_Move;
m_pointEnd.x+=x_Move;
m_pointPrimary.y+=y_Move;
m_pointEnd.y+=y_Move;
}
void CPaintRoundrect::MoveDraw(CDC* pDC, CPnt& p1,CPnt& p2)
{
pDC->SetROP2(R2_XORPEN);//R2_XORPEN
CPen* pOldPen;
CPen pDrawPen;
CPoint m_pp1;
CPoint m_pp2;
CPoint pp1;
CPoint pp2;
DPtoVP(m_p1,m_pp1);
DPtoVP(m_p2,m_pp2);//把最终实际坐标变换为用于显示的逻辑坐标
DPtoVP(p1,pp1);
DPtoVP(p2,pp2);
pDrawPen.CreatePen(PS_DOT, 0, m_rgbPrimary);
pOldPen = pDC->SelectObject(&pDrawPen);
if(m_bFirstMove)//第一次移动
{
m_bFirstMove=FALSE;
pDC->MoveTo(pp1.x,pp1.y);
pDC->LineTo(pp2.x,pp2.y);
}
else
{
pDC->MoveTo(m_pp1.x,m_pp1.y);
pDC->LineTo(m_pp2.x,m_pp2.y);
pDC->MoveTo(pp1.x,pp1.y);
pDC->LineTo(pp2.x,pp2.y);
}
m_p1=p1;
m_p2=p2;
pDC->SelectObject(pOldPen);
}
/*
void CPaintRoundrect::DrawSpecialNode(CDC* pDC)//显示断点非相切点
{
CPen* pOldPen;
CPen pDrawPen;
CBrush* pOldBrush;
pOldBrush = (CBrush *) pDC->SelectStockObject(WHITE_BRUSH);
CPoint m_pointPrimary1;
CPoint m_pointEnd1;
DPtoVP(m_pointPrimary,m_pointPrimary1);
DPtoVP(m_pointEnd,m_pointEnd1);//把最终实际坐标变换为用于显示的逻辑坐标
pDrawPen.CreatePen(PS_SOLID, m_nWidth, m_rgbPrimary);
pOldPen = pDC->SelectObject(&pDrawPen);
pDC->MoveTo(m_pointPrimary1.x,m_pointPrimary1.y);
pDC->LineTo(m_pointEnd1.x,m_pointEnd1.y);
//起点状态0=相切点1=非相切点2=断点
if(m_uStartNodeState==2)//断点
{
pDC->MoveTo(m_pointPrimary1.x-3,m_pointPrimary1.y-3);
pDC->LineTo(m_pointPrimary1.x+4,m_pointPrimary1.y+4);
pDC->MoveTo(m_pointPrimary1.x-3,m_pointPrimary1.y+3);
pDC->LineTo(m_pointPrimary1.x+4,m_pointPrimary1.y-4);
}
else if(m_uStartNodeState==1)//非相切点
{
pDC->Rectangle(m_pointPrimary1.x-4,m_pointPrimary1.y-4,m_pointPrimary1.x+4,m_pointPrimary1.y+4);
}
//终点状态0=相切点1=非相切点2=断点
if(m_uEndNodeState==2)//断点
{
pDC->MoveTo(m_pointEnd1.x-3,m_pointEnd1.y-3);
pDC->LineTo(m_pointEnd1.x+4,m_pointEnd1.y+4);
pDC->MoveTo(m_pointEnd1.x-3,m_pointEnd1.y+3);
pDC->LineTo(m_pointEnd1.x+4,m_pointEnd1.y-4);
}
else if(m_uEndNodeState==1)//非相切点
{
pDC->Rectangle(m_pointEnd1.x-4,m_pointEnd1.y-4,m_pointEnd1.x+4,m_pointEnd1.y+4);
}
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);
}
*/
void CPaintRoundrect::OnDown(CPnt& pointDown)
{
m_pointEnd.x = m_pointPrimary.x = pointDown.x;
m_pointEnd.y = m_pointPrimary.y = pointDown.y;
}
/*
void CPaintRoundrect::ChangeOrigin(CPnt pnt)//改变坐标原点
{
m_pointPrimary.x=m_pointPrimary.x-pnt.x;
m_pointPrimary.y=m_pointPrimary.y-pnt.y;
m_pointEnd.x=m_pointEnd.x-pnt.x;
m_pointEnd.y=m_pointEnd.y-pnt.y;
}
*/
void CPaintRoundrect::OnDown2(CPnt& pointDown)
{
}
void CPaintRoundrect::OnUp(CPnt& pointUp, CWnd* pWnd)
{
CClientDC tempDC(pWnd);
Draw(&tempDC);
}
/*
//
//判断是否点击了某节点
//返回0==没击中,1==击中起点,2==击中终点
UINT CPaintRoundrect::IsHit1(CPnt& pointBang)
{
UINT forreturn=0;
CPoint m_pointPrimary1;
CPoint m_pointEnd1;
CPoint m_pointBang1;
DPtoVP(m_pointPrimary,m_pointPrimary1);
DPtoVP(m_pointEnd,m_pointEnd1);
DPtoVP(pointBang,m_pointBang1);
if(Distance(m_pointBang1.x,m_pointBang1.y,m_pointPrimary1.x,m_pointPrimary1.y)<4)
{
forreturn=1;
}
else if(Distance(m_pointBang1.x,m_pointBang1.y,m_pointEnd1.x,m_pointEnd1.y)<4)
{
forreturn=2;
}
return forreturn;
}
*/
void CPaintRoundrect::IsDblClk(void* pTemp1,void* pTemp2)//是否被双击选中
{
if(m_uObjectType==1)//地图对象的类型0=路径1=建筑2=设备
IsDblClkBuilding(pTemp1,pTemp2);
else if(m_uObjectType==2)
IsDblClkDevice(pTemp1,pTemp2);
}
BOOL CPaintRoundrect::IsHit(CPnt& pointBang)
{
CRgn rgn;
CPoint m_pointPrimary1;
CPoint m_pointBang1;
CPoint m_pointEnd1;
int m_ellwidth1;
int m_ellheight1;
DPtoVP(m_pointPrimary,m_pointPrimary1);
DPtoVP(m_pointEnd,m_pointEnd1);
DPtoVP(pointBang,m_pointBang1);
DPtoVP1(m_ellwidth,m_ellwidth1);
DPtoVP1(m_ellheight,m_ellheight1);
rgn.CreateRoundRectRgn(m_pointPrimary1.x,
m_pointPrimary1.y,
m_pointEnd1.x,
m_pointEnd1.y,
m_ellwidth1,
m_ellheight1);
if (rgn.PtInRegion(m_pointBang1.x,m_pointBang1.y)==0)
{
rgn.DeleteObject();
return FALSE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -