📄 paintor.cpp
字号:
// Paintor.cpp: implementation of the Paintor class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "PainterUsePattern.h"
#include "Paintor.h"
#include "Math.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//=================================================================
//
//=================================================================
Paintor::Paintor()
{
m_commonFactory = CommonFactory::Instance();
m_pCurSelItem = 0;
m_startPaint = false;
m_workStatus = PS_IDLE;
m_newPenPaint.CreatePen( PS_DASH , 1 , RGB(125,125,125) );
m_newPenErase.CreatePen( PS_DASH , 1 , RGB(255,255,255) );
}
//=================================================================
//
//=================================================================
Paintor::~Paintor()
{
delete m_commonFactory;
}
//=================================================================
//
//=================================================================
void Paintor::LButtonDown( CPoint point ,CDC* pDC )
{
ASSERT( pDC != NULL );
CGraphicItem* pFindItem ;//查找被选中图元;
bool find; //是否有图元被选中标志;
Point* newPoint ;//创建新点图元;
switch( m_workStatus )
{
case PS_IDLE : //空闲状态;
m_startPaint = true;
m_startPoint = point;
break;
case PS_SELECT: //选择状态;
m_startPaint = true;
m_startPoint = point;
m_pCurSelItem = 0;
find = false;
pFindItem = m_itemCollection.GetFirstItem();
for( ; !m_itemCollection.IsDone() ; pFindItem = m_itemCollection.GetNextItem() )
{
if( pFindItem->Intersects( point ) == true )
{
find = true;
break;
}
}
//选中其中某一个图形元素;
if( find == true && pFindItem != 0 )
m_pCurSelItem = pFindItem;
break;
case PS_POINT: //画点模式;
//创建点;
newPoint = m_commonFactory->CreatePoint();
//设置点位置;
newPoint->SetCentrePoint( point );
//绘制点;
newPoint->Accept( m_paintVisitor ,pDC);
//放入图元容器;
m_itemCollection.Add( newPoint );
break;
case PS_LINE: //画线模式;
m_startPaint = true;
//确定线段起点;
m_startPoint = point;
break;
case PS_CIRCLE: //画圆模式;
m_startPaint = true;
//确定圆心位置;
m_startPoint = point;
break;
case PS_RECT: //画矩形模式;
m_startPaint = true;
//确定矩形其中一个顶点;
m_startPoint = point;
break;
default :
break;
}
}
//=================================================================
//
//=================================================================
void Paintor::LButtonUp( CPoint point ,CDC* pDC )
{
ASSERT( pDC != NULL );
Line* newLine ;
Circle* newCircle;
int radix; //圆的半径;
Rect* newRect;
CRect rect; //矩形区域;
switch( m_workStatus )
{
case PS_IDLE : //空闲状态;
/*
m_oldPen = pDC->SelectObject( &m_newPenPaint );
rect.top = ( m_startPoint.y <= m_endPoint.y )?m_startPoint.y : m_endPoint.y;
rect.bottom = ( m_startPoint.y > m_endPoint.y )?m_startPoint.y : m_endPoint.y;
rect.left = ( m_startPoint.x <= m_endPoint.x )?m_startPoint.x : m_endPoint.x;
rect.right = ( m_startPoint.x > m_endPoint.x )?m_startPoint.x : m_endPoint.x;
pDC->Rectangle( &rect );
newPen.Detach();
pDC->SelectObject( oldPen );
*/
m_startPaint = false;
break;
case PS_SELECT: //选择状态;
if( m_pCurSelItem != 0 )
{
//被选中图元位置发生了移动;
if( point != m_startPoint )
{
int offsetX = m_endPoint.x - m_startPoint.x;
int offsetY = m_endPoint.y - m_startPoint.y;
m_pCurSelItem->SetOffset( offsetX , offsetY );
m_pCurSelItem->Accept( m_paintVisitor ,pDC );
}
}
m_startPaint = false;
break;
case PS_POINT: //画点模式;
break;
case PS_LINE: //画线模式;
m_startPaint = false;
//确定线段终点;
m_endPoint = point;
//创建新线段图元;
newLine = m_commonFactory->CreateLine();
//设置线段位置;
newLine->SetStartPoint( m_startPoint );
newLine->SetEndPoint ( m_endPoint );
//绘制线段;
newLine->Accept( m_paintVisitor , pDC );
//放入图元容器;
m_itemCollection.Add( newLine );
break;
case PS_CIRCLE: //画圆模式;
m_startPaint = false;
//确定圆心位置;
m_endPoint = point;
radix = (int)sqrt(
( m_endPoint.x - m_startPoint.x )*( m_endPoint.x - m_startPoint.x )
+( m_endPoint.y - m_startPoint.y )*( m_endPoint.y - m_startPoint.y )
);
newCircle = m_commonFactory->CreateCircle();
newCircle->SetCentrePoint( m_startPoint );
newCircle->SetRadix( radix );
newCircle->Accept( m_paintVisitor , pDC );
m_itemCollection.Add( newCircle );
break;
case PS_RECT: //画矩形模式;
m_startPaint = false;
m_endPoint = point ;
//确定矩形其中一个顶点;
rect.top = ( m_startPoint.y <= m_endPoint.y )?m_startPoint.y : m_endPoint.y;
rect.bottom = ( m_startPoint.y > m_endPoint.y )?m_startPoint.y : m_endPoint.y;
rect.left = ( m_startPoint.x <= m_endPoint.x )?m_startPoint.x : m_endPoint.x;
rect.right = ( m_startPoint.x > m_endPoint.x )?m_startPoint.x : m_endPoint.x;
//创建矩形;
newRect = m_commonFactory->CreateRectangle();
//设置矩形位置;
newRect->SetRect( rect );
//绘制矩形;
newRect->Accept( m_paintVisitor ,pDC );
m_itemCollection.Add( newRect );
break;
default :
break;
}
}
//=================================================================
//
//=================================================================
void Paintor::MouseMove( CPoint point ,CDC* pDC )
{
ASSERT( pDC != NULL );
CRect rect; //矩形区域;
CString itemType;//被选中图元类型;
int radix; //圆的半径;
CPoint startPoint;
CPoint endPoint;
int offsetX[2];
int offsetY[2];
switch( m_workStatus )
{
case PS_IDLE : //空闲状态;
if( m_startPaint == true )
{
m_oldPen = pDC->SelectObject( &m_newPenErase );
rect.top = ( m_startPoint.y <= m_endPoint.y )?m_startPoint.y : m_endPoint.y;
rect.bottom = ( m_startPoint.y > m_endPoint.y )?m_startPoint.y : m_endPoint.y;
rect.left = ( m_startPoint.x <= m_endPoint.x )?m_startPoint.x : m_endPoint.x;
rect.right = ( m_startPoint.x > m_endPoint.x )?m_startPoint.x : m_endPoint.x;
pDC->Rectangle( &rect );
pDC->SelectObject( m_oldPen );
m_oldPen = pDC->SelectObject( &m_newPenPaint );
m_endPoint = point;
rect.top = ( m_startPoint.y <= m_endPoint.y )?m_startPoint.y : m_endPoint.y;
rect.bottom = ( m_startPoint.y > m_endPoint.y )?m_startPoint.y : m_endPoint.y;
rect.left = ( m_startPoint.x <= m_endPoint.x )?m_startPoint.x : m_endPoint.x;
rect.right = ( m_startPoint.x > m_endPoint.x )?m_startPoint.x : m_endPoint.x;
pDC->Rectangle( &rect );
pDC->SelectObject( m_oldPen );
}
break;
case PS_SELECT: //选择状态;
if( m_pCurSelItem != 0 && m_startPaint == true )
{
itemType = m_pCurSelItem->GetOwnType();
if( itemType == _T("Circle") )
{
m_oldPen = pDC->SelectObject( &m_newPenErase );
radix = m_pCurSelItem->GetRadix();
rect.top = m_endPoint.y - radix;
rect.bottom = m_endPoint.y + radix;
rect.left = m_endPoint.x - radix;
rect.right = m_endPoint.x + radix;
pDC->Ellipse( &rect );
pDC->SelectObject(m_oldPen);
m_oldPen = pDC->SelectObject( &m_newPenPaint );
m_endPoint = point;
rect.top = m_endPoint.y - radix;
rect.bottom = m_endPoint.y + radix;
rect.left = m_endPoint.x - radix;
rect.right = m_endPoint.x + radix;
pDC->Ellipse( &rect );
pDC->SelectObject( m_oldPen );
}
else if( itemType == _T("Line") )
{
m_oldPen = pDC->SelectObject( &m_newPenErase );
offsetX[0] = m_pCurSelItem->GetEndPoint().x - m_startPoint.x;
offsetY[0] = m_pCurSelItem->GetEndPoint().y - m_startPoint.y;
offsetX[1] = m_pCurSelItem->GetStartPoint().x - m_startPoint.x;
offsetY[1] = m_pCurSelItem->GetStartPoint().y - m_startPoint.y;
endPoint.x = m_endPoint.x + offsetX[0];
endPoint.y = m_endPoint.y + offsetY[0];
startPoint.x = m_endPoint.x + offsetX[1];
startPoint.y = m_endPoint.y + offsetY[1];
pDC->MoveTo( startPoint );
pDC->LineTo( endPoint );
pDC->SelectObject( m_oldPen );
m_oldPen = pDC->SelectObject( &m_newPenPaint );
m_endPoint = point;
startPoint.x = m_endPoint.x + offsetX[1];
startPoint.y = m_endPoint.y + offsetY[1];
endPoint.x = m_endPoint.x + offsetX[0];
endPoint.y = m_endPoint.y + offsetY[0];
pDC->MoveTo( startPoint );
pDC->LineTo( endPoint );
pDC->SelectObject( m_oldPen );
}
else if( itemType == _T("Point") )
{
m_oldPen = pDC->SelectObject( &m_newPenErase );
radix = m_pCurSelItem->GetRadix();
rect.top = m_endPoint.y - radix;
rect.bottom = m_endPoint.y + radix;
rect.left = m_endPoint.x - radix;
rect.right = m_endPoint.x + radix;
pDC->Ellipse( &rect );
pDC->SelectObject( m_oldPen );
m_oldPen = pDC->SelectObject( &m_newPenPaint );
m_endPoint = point;
rect.top = m_endPoint.y - radix;
rect.bottom = m_endPoint.y + radix;
rect.left = m_endPoint.x - radix;
rect.right = m_endPoint.x + radix;
pDC->Ellipse( &rect );
pDC->SelectObject( m_oldPen );
}
else if( itemType == _T("Rect") )
{
m_oldPen = pDC->SelectObject( &m_newPenErase );
rect = m_pCurSelItem->GetRect();
offsetY[0] = rect.top - m_startPoint.y;
offsetX[0] = rect.left - m_startPoint.x;
offsetY[1] = rect.bottom - m_startPoint.y;
offsetX[1] = rect.right - m_startPoint.x;
rect.top = m_endPoint.y + offsetY[0];
rect.left = m_endPoint.x + offsetX[0];
rect.bottom = m_endPoint.y + offsetY[1];
rect.right = m_endPoint.x + offsetX[1];
pDC->Rectangle( &rect );
pDC->SelectObject( m_oldPen );
m_oldPen = pDC->SelectObject( &m_newPenPaint );
m_endPoint = point;
rect.top = m_endPoint.y + offsetY[0];
rect.left = m_endPoint.x + offsetX[0];
rect.bottom = m_endPoint.y + offsetY[1];
rect.right = m_endPoint.x + offsetX[1];
pDC->Rectangle( &rect );
pDC->SelectObject( m_oldPen );
}
Draw( pDC );
}
break;
case PS_POINT: //画点模式;
break;
case PS_LINE: //画线模式;
if( m_startPaint == true )
{
/* m_oldPen = pDC->SelectObject( &m_newPenErase );
pDC->MoveTo( m_startPoint );
pDC->LineTo( m_endPoint );
pDC->SelectObject( m_oldPen );*/
m_oldPen = pDC->SelectObject( &m_newPenPaint );
m_endPoint = point;
pDC->MoveTo( m_startPoint );
pDC->LineTo( m_endPoint );
pDC->SelectObject( m_oldPen );
}
break;
case PS_CIRCLE: //画圆模式;
if( m_startPaint == true )
{
m_oldPen = pDC->SelectObject( &m_newPenErase );
radix = (int)sqrt( (m_startPoint.x - m_endPoint.x)*(m_startPoint.x - m_endPoint.x)
+(m_startPoint.y - m_endPoint.y)*(m_startPoint.y - m_endPoint.y)
);
rect.top = m_startPoint.y - radix;
rect.bottom = m_startPoint.y + radix;
rect.left = m_startPoint.x - radix;
rect.right = m_startPoint.x + radix;
pDC->Ellipse( &rect );
pDC->SelectObject( m_oldPen );
m_oldPen = pDC->SelectObject( &m_newPenPaint );
m_endPoint = point ;
radix = (int)sqrt( (m_startPoint.x - m_endPoint.x)*(m_startPoint.x - m_endPoint.x)
+(m_startPoint.y - m_endPoint.y)*(m_startPoint.y - m_endPoint.y)
);
rect.top = m_startPoint.y - radix;
rect.bottom = m_startPoint.y + radix;
rect.left = m_startPoint.x - radix;
rect.right = m_startPoint.x + radix;
pDC->Ellipse( &rect );
pDC->SelectObject( m_oldPen );
}
break;
case PS_RECT: //画矩形模式;
if( m_startPaint == true )
{
m_oldPen = pDC->SelectObject( &m_newPenErase );
rect.top = ( m_startPoint.y <= m_endPoint.y )?m_startPoint.y : m_endPoint.y;
rect.bottom = ( m_startPoint.y > m_endPoint.y )?m_startPoint.y : m_endPoint.y;
rect.left = ( m_startPoint.x <= m_endPoint.x )?m_startPoint.x : m_endPoint.x;
rect.right = ( m_startPoint.x > m_endPoint.x )?m_startPoint.x : m_endPoint.x;
pDC->Rectangle( rect );
pDC->SelectObject( m_oldPen );
m_oldPen = pDC->SelectObject( &m_newPenPaint );
m_endPoint = point ;
rect.top = ( m_startPoint.y <= m_endPoint.y )?m_startPoint.y : m_endPoint.y;
rect.bottom = ( m_startPoint.y > m_endPoint.y )?m_startPoint.y : m_endPoint.y;
rect.left = ( m_startPoint.x <= m_endPoint.x )?m_startPoint.x : m_endPoint.x;
rect.right = ( m_startPoint.x > m_endPoint.x )?m_startPoint.x : m_endPoint.x;
pDC->Rectangle( &rect );
pDC->SelectObject( m_oldPen );
}
break;
default :
break;
}
}
//=================================================================
//
//=================================================================
void Paintor::RButtonDown( CPoint point ,CDC* pDC )
{
}
//=================================================================
//
//=================================================================
void Paintor::RButtonUp( CPoint point , CDC* pDC )
{
}
//=================================================================
//
//=================================================================
void Paintor::Draw( CDC* pDC )
{
CGraphicItem* pFindItem = m_itemCollection.GetFirstItem();
for( ; !m_itemCollection.IsDone() ; pFindItem = m_itemCollection.GetNextItem() )
{
pFindItem->Accept( m_paintVisitor ,pDC );
}
}
//=================================================================
//撤销上一步操作;
//=================================================================
void Paintor::PreStep( CDC* pDC )
{
int count = m_itemCollection.GetItemCount();
if( count != 0 )
{
CGraphicItem* deleteItem = m_itemCollection.GetAt( count );
deleteItem->SetColor( RGB(255,255,255) );
deleteItem->Accept( m_paintVisitor , pDC );
m_itemCollection.RemoveAt( count-1 );
Draw( pDC );
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -