paintdlg.cpp

来自「学习VC的一些例子」· C++ 代码 · 共 261 行

CPP
261
字号
// PaintDlg.cpp : implementation file
//

#include "stdafx.h"
#include "Graphics.h"
#include "GraphicsDlg.h"
#include "PaintDlg.h"

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

/////////////////////////////////////////////////////////////////////////////
// CPaintDlg dialog

const COLORREF CPaintDlg::m_crColor[8] = {
	RGB(   0,   0,   0),
	RGB(   0,   0, 255),
	RGB(   0, 255,   0),
	RGB(   0, 255, 255),
	RGB( 255,   0,   0),
	RGB( 255,   0, 255),
	RGB( 255, 255,   0),
	RGB( 255, 255, 255)
};

CPaintDlg::CPaintDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CPaintDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CPaintDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
}


void CPaintDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CPaintDlg)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CPaintDlg, CDialog)
	//{{AFX_MSG_MAP(CPaintDlg)
	ON_WM_PAINT()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CPaintDlg message handlers

void CPaintDlg::DrawLine(CPaintDC *pdc, int iColor)
{
	CPen lSolidPen (PS_SOLID, 1, m_crColor[iColor]);
	CPen lDotPen (PS_DOT, 1, m_crColor[iColor]);
	CPen lDashPen (PS_DASH, 1, m_crColor[iColor]);
	CPen lDashDotPen (PS_DASHDOT, 1, m_crColor[iColor]);
	CPen lDashDotDotPen (PS_DASHDOTDOT, 1, m_crColor[iColor]);
	CPen lNullPen (PS_NULL, 1, m_crColor[iColor]);
	CPen lInsidePen (PS_INSIDEFRAME, 1, m_crColor[iColor]);

	CRect lRect;
	GetClientRect(lRect);
	lRect.NormalizeRect();

	CPoint pStart;
	CPoint pEnd;
	int liDist = lRect.Height()/8;
	CPen *lOldPen;

	pStart.y = lRect.top;
	pStart.x = lRect.left;
	pEnd.y = pStart.y;
	pEnd.x = lRect.right;

	for (int i = 0; i < 7; i++)
	{
		switch (i)
		{
		case 0:
			lOldPen = pdc->SelectObject(&lSolidPen);
			break;
		case 1:
			pdc->SelectObject(&lDotPen);
			break;
		case 2:
			pdc->SelectObject(&lDashPen);
			break;
		case 3:
			pdc->SelectObject(&lDashDotPen);
			break;
		case 4:
			pdc->SelectObject(&lDashDotDotPen);
			break;
		case 5:
			pdc->SelectObject(&lNullPen);
			break;
		case 6:
			pdc->SelectObject(&lInsidePen);
			break;
		}
		pStart.y = pStart.y + liDist;
		pEnd.y = pStart.y;

		pdc->MoveTo(pStart);
		pdc->LineTo(pEnd);			
	}
	pdc->SelectObject(lOldPen);
}

void CPaintDlg::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	// TODO: Add your message handler code here
	CGraphicsDlg *pWnd = (CGraphicsDlg*) GetParent();
	if (pWnd)
	{
		if (pWnd->m_iTool == 2)
		{
			if (pWnd->m_sBitmap != "")
				ShowBitmap(&dc, pWnd);
		}
		else
		{
			if (pWnd->m_iShape == 0)
				DrawLine(&dc, pWnd->m_iColor);
			else
				DrawRegion(&dc, pWnd->m_iColor, pWnd->m_iTool, pWnd->m_iShape);
		}
	}
	
	// Do not call CDialog::OnPaint() for painting messages
}

void CPaintDlg::DrawRegion(CPaintDC *pdc, int iColor, int iTool, int iShape)
{
	CPen lSolidPen (PS_SOLID, 1, m_crColor[iColor]);
	CPen lDotPen (PS_DOT, 1, m_crColor[iColor]);
	CPen lDashPen (PS_DASH, 1, m_crColor[iColor]);
	CPen lDashDotPen (PS_DASHDOT, 1, m_crColor[iColor]);
	CPen lDashDotDotPen (PS_DASHDOTDOT, 1, m_crColor[iColor]);
	CPen lNullPen (PS_NULL, 1, m_crColor[iColor]);
	CPen lInsidePen (PS_INSIDEFRAME, 1, m_crColor[iColor]);

	CBrush lSolidBrush(m_crColor[iColor]);
	CBrush lBDiagBrush(HS_BDIAGONAL, m_crColor[iColor]);
	CBrush lCrossBrush(HS_CROSS, m_crColor[iColor]);
	CBrush lDiagCrossBrush(HS_DIAGCROSS, m_crColor[iColor]);
	CBrush lFDiagBrush(HS_FDIAGONAL, m_crColor[iColor]);
	CBrush lHorizBrush(HS_HORIZONTAL, m_crColor[iColor]);
	CBrush lVertBrush(HS_VERTICAL, m_crColor[iColor]);
	CBrush lNullBrush(RGB(192, 192, 192));

	CRect lRect;
	GetClientRect(lRect);
	lRect.NormalizeRect();
	int liVert = lRect.Height() / 2;
	int liHeight = liVert - 10;
	int liHorz = lRect.Width() / 4;
	int liWidth = liHorz - 10;

	CRect lDrawRect;
	CPen *lOldPen;
	CBrush *lOldBrush;
	for (int i = 0; i < 7; i++)
	{
		switch (i)
		{
		case 0:
			lDrawRect.top    = lRect.top + 5;
			lDrawRect.left   = lRect.left + 5;
			lDrawRect.bottom = lDrawRect.top + liHeight;
			lDrawRect.right  = lDrawRect.left + liWidth;

			lOldPen   = pdc->SelectObject(&lSolidPen);
			lOldBrush = pdc->SelectObject(&lSolidBrush);
			break;
		case 1:
			lDrawRect.left  = lDrawRect.left + liHorz;
			lDrawRect.right = lDrawRect.left + liWidth;

			pdc->SelectObject(&lDotPen);
			pdc->SelectObject(&lBDiagBrush);
			break;
		case 2:
			lDrawRect.left  = lDrawRect.left + liHorz;
			lDrawRect.right = lDrawRect.left + liWidth;

			pdc->SelectObject(&lDashPen);
			pdc->SelectObject(&lCrossBrush);
			break;
		case 3:
			lDrawRect.left  = lDrawRect.left + liHorz;
			lDrawRect.right = lDrawRect.left + liWidth;

			pdc->SelectObject(&lDashDotPen);
			pdc->SelectObject(&lDiagCrossBrush);
			break;
		case 4:
			lDrawRect.top    = lDrawRect.top + liVert;
			lDrawRect.left   = lRect.left + 5;
			lDrawRect.bottom = lDrawRect.top + liHeight;
			lDrawRect.right  = lDrawRect.left + liWidth;

			pdc->SelectObject(&lDashDotDotPen);
			pdc->SelectObject(&lFDiagBrush);
			break;
		case 5:
			lDrawRect.left  = lDrawRect.left + liHorz;
			lDrawRect.right = lDrawRect.left + liWidth;

			pdc->SelectObject(&lNullPen);
			pdc->SelectObject(&lHorizBrush);
			break;
		case 6:
			lDrawRect.left  = lDrawRect.left + liHorz;
			lDrawRect.right = lDrawRect.left + liWidth;

			pdc->SelectObject(&lInsidePen);
			pdc->SelectObject(&lVertBrush);
			break;
		}

		if (iTool == 0)
			pdc->SelectObject(lNullBrush);
		else
			pdc->SelectObject(lNullPen);

		if (iShape == 1)
			pdc->Ellipse(lDrawRect);
		else
			pdc->Rectangle(lDrawRect);
	}
	pdc->SelectObject(lOldBrush);
	pdc->SelectObject(lOldPen);
}

void CPaintDlg::ShowBitmap(CPaintDC *pdc, CWnd *pWnd)
{
	CGraphicsDlg *lpWnd = (CGraphicsDlg*) pWnd;

	BITMAP bm;
	lpWnd->m_bmpBitmap.GetBitmap(&bm);
	CDC dcMem;
	dcMem.CreateCompatibleDC(pdc);
	CBitmap* pOldBitmap = (CBitmap *) dcMem.SelectObject(lpWnd->m_bmpBitmap);

	CRect lRect;
	GetClientRect(lRect);
	lRect.NormalizeRect();

	pdc->StretchBlt(10, 10, (lRect.Width()-20),
		(lRect.Height()-20), &dcMem, 0, 0,
		bm.bmWidth, bm.bmHeight, SRCCOPY);
}

⌨️ 快捷键说明

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