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

📄 lwq6231view.cpp

📁 简单画图
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// LWQ6231View.cpp : implementation of the CLWQ6231View class
//

#include "stdafx.h"
#include "LWQ6231.h"

#include "LWQ6231Doc.h"
#include "LWQ6231View.h"

#include "Draw.h"
#include "bitmap.h"
#include <windowsx.h>
#include "structure.h"
#include "TextDlg.h"

#define WIDTH_THIN  1
#define WIDTH_NORMAL  3
#define WIDTH_WIDE  5
#define UD_WHITE  0xffffff
#define UD_BLACK  0
#define UD_YELLOW  0x00ffff
#define UD_PINK  0xff80ff
#define UD_CYAN 0xffff00
#define UD_GRAY 0x4080

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CLWQ6231View

IMPLEMENT_DYNCREATE(CLWQ6231View, CView)

BEGIN_MESSAGE_MAP(CLWQ6231View, CView)
	//{{AFX_MSG_MAP(CLWQ6231View)
	ON_WM_LBUTTONDOWN()
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONUP()
	ON_UPDATE_COMMAND_UI(IDT_ARROW, OnUpdateArrow)
	ON_UPDATE_COMMAND_UI(IDT_LINE, OnUpdateLine)
	ON_UPDATE_COMMAND_UI(IDT_RECTANGLE, OnUpdateRectangle)
	ON_UPDATE_COMMAND_UI(IDT_ELLIPSE, OnUpdateEllipse)
	ON_UPDATE_COMMAND_UI(IDT_CIRCLE, OnUpdateCircle)
	ON_UPDATE_COMMAND_UI(IDT_PLINE, OnUpdatePline)
	ON_UPDATE_COMMAND_UI(IDT_FONT, OnUpdateFont)
	ON_COMMAND(IDT_LINE, OnLine)
	ON_COMMAND(IDT_RECTANGLE, OnRectangle)
	ON_COMMAND(IDT_ELLIPSE, OnEllipse)
	ON_COMMAND(IDT_CIRCLE, OnCircle)
	ON_COMMAND(IDT_FONT, OnFont)
	ON_COMMAND(ID_FILE_NEW, OnFileNew)
	ON_UPDATE_COMMAND_UI(IDT_DELETE, OnUpdateDelete)
	ON_COMMAND(IDT_SELECT, OnSelect)
	ON_COMMAND(ID_EDIT_COPY, OnEditCopy)
	ON_COMMAND(ID_EDIT_CUT, OnEditCut)
	ON_COMMAND(ID_EDIT_PASTE, OnEditPaste)
	ON_COMMAND(ID_FILE_SAVE, OnFileSave)
	ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
	ON_COMMAND(ID_COLOR_BLACK, OnColorBlack)
	ON_COMMAND(ID_COLOR_CYAN, OnColorCyan)
	ON_COMMAND(ID_COLOR_GRAY, OnColorGray)
	ON_COMMAND(ID_COLOR_GREEN, OnColorGreen)
	ON_COMMAND(ID_COLOR_PINK, OnColorPink)
	ON_COMMAND(ID_COLOR_RED, OnColorRed)
	ON_COMMAND(ID_COLOR_WHITE, OnColorWhite)
	ON_COMMAND(ID_COLOR_YELLOW, OnColorYellow)
	ON_COMMAND(ID_COLOR_BLUE, OnColorBlue)
	ON_UPDATE_COMMAND_UI(ID_EDIT_CUT, OnUpdateEditCut)
	ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, OnUpdateEditPaste)
	ON_UPDATE_COMMAND_UI(ID_EDIT_COPY, OnUpdateEditCopy)
	ON_UPDATE_COMMAND_UI(IDT_SELECT, OnUpdateSelect)
	ON_COMMAND(ID_EDIT_REDO, OnEditRedo)
	ON_UPDATE_COMMAND_UI(ID_EDIT_REDO, OnUpdateEditRedo)
	ON_COMMAND(ID_EDIT_UNDO, OnEditUndo)
	ON_UPDATE_COMMAND_UI(ID_EDIT_UNDO, OnUpdateEditUndo)
	ON_WM_PAINT()
	ON_COMMAND(IDT_CURVE, OnCurve)
	ON_COMMAND(IDT_POLY, OnPoly)
	ON_WM_LBUTTONDBLCLK()
	ON_COMMAND(ID_WIDTH_NORMAL, OnWidthNormal)
	ON_COMMAND(ID_WIDTH_THIN, OnWidthThin)
	ON_COMMAND(ID_WIDTH_WIDE, OnWidthWide)
	ON_COMMAND(ID_FILL_FALSE, OnFillFalse)
	ON_COMMAND(ID_FILL_TRUE, OnFillTrue)
	ON_UPDATE_COMMAND_UI(ID_FILL_TRUE, OnUpdateFillTrue)
	ON_UPDATE_COMMAND_UI(ID_FILL_FALSE, OnUpdateFillFalse)
	ON_UPDATE_COMMAND_UI(ID_WIDTH_NORMAL, OnUpdateWidthNormal)
	ON_UPDATE_COMMAND_UI(ID_WIDTH_THIN, OnUpdateWidthThin)
	ON_UPDATE_COMMAND_UI(ID_WIDTH_WIDE, OnUpdateWidthWide)
	ON_COMMAND(ID_EXAMINE_COLOR, OnExamineColor)
	ON_COMMAND(ID_EXAMINE_TOOL, OnExamineTool)
	ON_COMMAND(grid, Ongrid)
	ON_UPDATE_COMMAND_UI(ID_COLOR_RED, OnUpdateColorRed)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CLWQ6231View construction/destruction

CLWQ6231View::CLWQ6231View()
{
	// TODO: add construction code here
	m_bDrawing=false;
	m_nMouseMode = IDT_LINE;
	m_usrCurrentObject = NULL;
	m_nCurrentColor = UD_RED;
	m_iPenWidth = WIDTH_THIN;
	m_bFill = false;
	m_pSelect = NULL;
	m_bClip = false;
	virtualline=false;
	m_pStack =new Stack(4);
	m_bFirstSave = true;
	showgrid=false;
	

}

CLWQ6231View::~CLWQ6231View()
{
	if(m_pSelect)
	{
		delete m_pSelect;
		m_pSelect = NULL;
	}
	if(m_pStack)
	{
		delete m_pStack;
		m_pStack = NULL;
	}
	if(m_usrCurrentObject)
	{
		delete m_usrCurrentObject;
		m_usrCurrentObject = NULL;
	}
}

BOOL CLWQ6231View::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs
	//加载自定义光标资源
	m_hcurCross = (HCURSOR)::LoadImage(cs.hInstance,
		MAKEINTRESOURCE(IDC_USERDRAW), IMAGE_CURSOR,
		32, 32, LR_DEFAULTCOLOR);

	//加载光标的类方法(与上述方法功能类似)
	CWinApp* pApp = ::AfxGetApp();//获得当前CWinApp对象指针

	m_hcurMoving = pApp->LoadCursor(IDC_USERMOVING);
	m_hcurArrow = pApp->LoadCursor(IDC_USERARROW);

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CLWQ6231View drawing

void CLWQ6231View::OnDraw(CDC* pDC)
{
	CLWQ6231Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

//	CClient  dc(this);
	
	// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CLWQ6231View printing

BOOL CLWQ6231View::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CLWQ6231View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CLWQ6231View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CLWQ6231View diagnostics

#ifdef _DEBUG
void CLWQ6231View::AssertValid() const
{
	CView::AssertValid();
}

void CLWQ6231View::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CLWQ6231Doc* CLWQ6231View::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CLWQ6231Doc)));
	return (CLWQ6231Doc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CLWQ6231View message handlers

void CLWQ6231View::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CDC* pDC = GetDC();//获得DC
	OnPrepareDC(pDC);//设置DC的滚动属性,与ScollView的滚动有关
	pDC->DPtoLP(&point);//转换当前点为逻辑位置坐标
	CLWQ6231Doc* pDoc = GetDocument();

	CRect client;
	GetClientRect(&client);//获得客户区范围
	ClientToScreen(&client);//转化为屏幕坐标
	::ClipCursor(&client);//锁定鼠标移动范围

	switch(m_nMouseMode)
	{
	case IDT_SELECT:
		if(!m_pSelect)//如果没选中
		{
			m_bDrawing = true;
			m_pSelect = new CDrawSelect(m_nCurrentColor);
			m_pSelect->NewPoint(point.x, point.y);
			break;
		}
		else//如果选中
		{
			CDC * pDC = GetDC();
			//如果以前有虚线则清除
			if (virtualline)
				m_pSelect->Clear(pDC);
			m_bDrawing = false;

			if (m_pSelect->isin(point))//如果鼠标进入
			{ 
				m_pSelect->maponmouse=true;	
				m_pSelect->p_maponmouse.x=point.x;
				m_pSelect->p_maponmouse.y=point.y;
				if (!(m_pSelect->copied))//如果没有存储两个图	
				{
					m_pSelect->maponmouse=true;
					m_pSelect->copied=true;
					//m_bClip = true;
					
					Selected_Copy();				
					Back_CutCopy();
					
					ReleaseDC(pDC);
				}
				break;
			}
			else//如果落在选中的矩形外边
			{	
				//SaveInStack();
				virtualline=false;
				delete m_pSelect;
				m_pSelect = NULL;
				break;
			}		
		}
	case IDT_LINE:
		m_bDrawing = true;
		m_usrCurrentObject = new CDrawLine(m_nCurrentColor, m_iPenWidth);
		m_usrCurrentObject->NewPoint(point.x, point.y);
		break;
	case IDT_CURVE:
		m_bDrawing = true;
		m_usrCurrentObject = new CDrawCurve(m_nCurrentColor, m_iPenWidth);
		m_usrCurrentObject->NewPoint(point.x, point.y);
		break;
	case IDT_RECTANGLE:
		m_bDrawing = true;
		m_usrCurrentObject = new CDrawRect(m_nCurrentColor, m_iPenWidth, m_bFill);
		m_usrCurrentObject->NewPoint(point.x, point.y);
		break;
	case IDT_ELLIPSE:
		m_bDrawing = true;
		m_usrCurrentObject = new CDrawEllipse(m_nCurrentColor, m_iPenWidth, m_bFill);
		m_usrCurrentObject->NewPoint(point.x, point.y);
		break;
	case IDT_CIRCLE:
		m_bDrawing = true;
		m_usrCurrentObject = new CDrawCircle(m_nCurrentColor, m_iPenWidth, m_bFill);
		m_usrCurrentObject->NewPoint(point.x, point.y);
		break;
	case IDT_POLY:
		if(m_usrCurrentObject)
		{
			m_usrCurrentObject->AddPoint(point.x, point.y);
//			if(!m_nMoveMode)
//			{//输入端点超过20个
//				OnRButtonDown(nFlags, point);
//			}
		}
		else
		{
			m_bDrawing = true;
			m_usrCurrentObject = new CDrawPoly(m_nCurrentColor, m_iPenWidth);
			m_usrCurrentObject->NewPoint(point.x, point.y);
		}
		break;
	}
	if ((m_pSelect)&&(m_nMouseMode!=IDT_SELECT))
		{	
			//SaveInStack();
			if (virtualline)
				m_pSelect->Clear(GetDC());
			delete m_pSelect;
			m_pSelect = NULL;
		}	


	ReleaseDC(pDC);//释放DC资源
	CView::OnLButtonDown(nFlags, point);
}

void CLWQ6231View::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CDC* pDC = GetDC();
	OnPrepareDC(pDC);
	pDC->DPtoLP(&point);
	if(m_bDrawing && m_usrCurrentObject)
	{
		m_usrCurrentObject->MoveAt(pDC, point.x, point.y);	
	}
	if( m_pSelect && m_nMouseMode==IDT_SELECT)//如果是选中状态
		if(m_bDrawing )//如果在画虚框
			m_pSelect->MoveAt(pDC, point.x, point.y);
		else
			if (m_pSelect->maponmouse)	//如果拖动选中则移动选中的部分
			{

			CDC  dc;
			CClientDC pdc(this);
			if(!dc.CreateCompatibleDC(pDC))
				return;
			BITMAP  bm;	
			
			if(showgrid)
				Grid();	

			//	Sleep(100);
			m_pSelect->backmap.GetBitmap(&bm);
			CBitmap *pOldBitmap=dc.SelectObject(&m_pSelect->backmap);
			pdc.BitBlt(0,0,bm.bmWidth, bm.bmHeight, &dc, 0, 0, SRCCOPY);
			m_pSelect->map_select.GetBitmap(&bm);
			pOldBitmap=dc.SelectObject(&m_pSelect->map_select);
			//	Sleep(100);
			pdc.BitBlt(m_pSelect->GetX()+point.x-m_pSelect->p_maponmouse.x
				, m_pSelect->GetY()+point.y-m_pSelect->p_maponmouse.y,
				bm.bmWidth, bm.bmHeight, &dc, 0, 0, SRCCOPY);
			dc.SelectObject(&pOldBitmap);
			if(showgrid)
				Grid();	
			
	

			}
	ReleaseDC(pDC);//释放DC资源
	
	CView::OnMouseMove(nFlags, point);
}

void CLWQ6231View::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CDC* pDC = GetDC();//获得DC
	OnPrepareDC(pDC);//设置DC的滚动属性,与ScollView的滚动有关
	pDC->DPtoLP(&point);//转换当前点为逻辑位置坐标
	CLWQ6231Doc* pDoc = GetDocument();

	switch(m_nMouseMode)
	{
	case IDT_LINE:
	case IDT_RECTANGLE:
	case IDT_ELLIPSE:
	case IDT_CIRCLE:
	case IDT_CURVE:

		
		m_usrCurrentObject->Draw(pDC);
		SaveInStack();
		::ClipCursor(NULL);//释放鼠标锁定
		m_bDrawing = false;
		
		delete m_usrCurrentObject;
		m_usrCurrentObject = NULL;
		
        
		break;
	case IDT_SELECT:
		::ClipCursor(NULL);//释放鼠标锁定
		if (m_pSelect)
			if (m_bDrawing)
			{
				
				m_bDrawing=false;
				virtualline=true;
			}
			else//不在画虚框则释放鼠标
			{			
				if  (m_pSelect->maponmouse==true)
				{
					m_pSelect->maponmouse=false;
					long w=m_pSelect->GetWidth();
					long h=m_pSelect->GetHeight();
					long x=m_pSelect->GetX()+point.x-m_pSelect->p_maponmouse.x;
					long y=m_pSelect->GetY()+point.y-m_pSelect->p_maponmouse.y;
					m_pSelect->Set(pDC,x,y,w,h);
					m_bDrawing=false;
					virtualline=true;
					SaveInStack();
					
				}
			}
					
			break;
	}

	ReleaseDC(pDC);//释放DC资源

	CView::OnLButtonUp(nFlags, point);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -