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

📄 tool_zuoview.cpp

📁 模拟windows自带的画板 模拟windows自带的画板 模拟windows自带的画板 模拟windows自带的画板
💻 CPP
字号:
// Tool_zuoView.cpp : implementation of the CTool_zuoView class
//

#include "stdafx.h"
#include "Tool_zuo.h"
#include "Mainfrm.h"
#include "Tool_zuoDoc.h"
#include "Tool_zuoView.h"

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

/////////////////////////////////////////////////////////////////////////////
// CTool_zuoView

IMPLEMENT_DYNCREATE(CTool_zuoView, CView)

BEGIN_MESSAGE_MAP(CTool_zuoView, CView)
	//{{AFX_MSG_MAP(CTool_zuoView)
	ON_COMMAND(ID_BUTTON_LINE, OnButtonLine)
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_MOUSEMOVE()
	ON_WM_CREATE()
	ON_COMMAND(ID_BUTTON_RECT, OnButtonRect)
	//}}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()

/////////////////////////////////////////////////////////////////////////////
// CTool_zuoView construction/destruction

CTool_zuoView::CTool_zuoView()
{
	// TODO: add construction code here
    m_bDrawing = FALSE;
	m_bFirstDraw = FALSE;
	m_pdcMem = new CDC;
	m_pbmBackground = new CBitmap;
}

CTool_zuoView::~CTool_zuoView()
{
	delete m_pdcMem;
	delete m_pbmBackground;
}

BOOL CTool_zuoView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CTool_zuoView drawing

void CTool_zuoView::OnDraw(CDC* pDC)
{
	CTool_zuoDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	pDC->BitBlt(0,0,m_nScreenW,m_nScreenH, m_pdcMem, 0, 0, SRCCOPY);
}

/////////////////////////////////////////////////////////////////////////////
// CTool_zuoView printing

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CTool_zuoView diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CTool_zuoView message handlers

void CTool_zuoView::OnButtonLine() 
{
	// TODO: Add your command handler code here
	m_emPaintType = LINE;
	SetSelBox(SEL_PENWIDTH);
}

void CTool_zuoView::SetSelBox(int type)
{
    ((CMainFrame*)AfxGetMainWnd())->m_wndToolBar.SetSelType((SELTYPE)type);
}

void CTool_zuoView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CDC* pDC = GetDC();
	switch(m_emPaintType)
	{
	case LINE:
	case RECT:
		m_ptStart = point;
		m_bFirstDraw = TRUE;
		break;
	default:
		break;
	}
	m_bDrawing = TRUE;
	ReleaseDC(pDC);
	CView::OnLButtonDown(nFlags, point);
}

void CTool_zuoView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CDC* pDC = GetDC();
	switch(m_emPaintType)
	{
	case LINE:
		XorLine(m_ptStart,m_ptEnd);	
	    Line(m_ptStart,m_ptEnd);
		break;
	
	default:
		break;
	}
	ReleaseDC(pDC);
	m_bDrawing = FALSE;
	Invalidate();
	CView::OnLButtonUp(nFlags, point);
}

void CTool_zuoView::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
		if ( m_bDrawing )
	{
		CDC* pDC = GetDC();
		switch(m_emPaintType)
		{
		case LINE:
			if ( point != m_ptEnd )
			{
				if ( !m_bFirstDraw )
					XorLine(m_ptStart,m_ptEnd);	
				else
					m_bFirstDraw = FALSE;
				XorLine(m_ptStart,point);	
				m_ptEnd = point;
			}
			break;
		
		default:
			break;
		}
		ReleaseDC(pDC);
	}

	CView::OnMouseMove(nFlags, point);
}

void CTool_zuoView::XorLine(CPoint pt1, CPoint pt2)
{

	CDC *pDC = GetDC();
	CPen pen;
	pen.CreateStockObject(WHITE_PEN);
	CPen* pOldPen = (CPen*)pDC->SelectObject(&pen);
	pDC->SetROP2(R2_XORPEN);

	pDC->MoveTo(pt1);
	pDC->LineTo(pt2);	

	pDC->SelectObject(pOldPen);
	
	ReleaseDC(pDC);
}



void CTool_zuoView::Line(CPoint point1, CPoint point2)
{
	CPen pen;
	pen.CreatePen(PS_SOLID, GetPenWidth(), GetPaintColor());
	CPen* pOldPen = (CPen*)m_pdcMem->SelectObject(&pen);

	m_pdcMem->MoveTo(point1);
	m_pdcMem->LineTo(point2);

	m_pdcMem->SelectObject(pOldPen);

}

int CTool_zuoView::GetPenWidth() const
{
	CMainFrame* pFrame = (CMainFrame*)AfxGetMainWnd();
	if ( pFrame )
		return pFrame->GetPenWidth();
	else
		return 1;

}

int CTool_zuoView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	// TODO: Add your specialized creation code here
	m_nScreenW = ::GetSystemMetrics(SM_CXSCREEN);
	m_nScreenH = ::GetSystemMetrics(SM_CYSCREEN);

	CDC *pDC = GetDC();
	m_pdcMem->CreateCompatibleDC(pDC);
	m_pbmBackground->CreateCompatibleBitmap(pDC,m_nScreenW,m_nScreenH);
	m_bmBackup.CreateCompatibleBitmap(pDC,m_nScreenW,m_nScreenH);

	m_pdcMem->SelectObject(m_pbmBackground);

	

	ReleaseDC(pDC);
  
	
	return 0;
}

void CTool_zuoView::OnButtonRect() 
{
	// TODO: Add your command handler code here
	m_emPaintType = RECT;
	SetSelBox(SEL_RECTTYPE);
}



COLORREF CTool_zuoView::GetPaintColor() const
{
    CMainFrame* pFrame = (CMainFrame*)AfxGetMainWnd();
	if ( pFrame )
		return pFrame->m_clrPaint;
	else
		return RGB(0,0,0);
}

⌨️ 快捷键说明

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