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 + -
显示快捷键?