⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 paintor.cpp

📁 C语言库函数(包括所有的C语言库函数)
💻 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 + -