📄 childview.cpp
字号:
// ChildView.cpp : implementation of the CChildView class
//
#include "stdafx.h"
#include "MetaFile.h"
#include "ChildView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CChildView
CChildView::CChildView()
{
m_bTracking = false;
m_ptLineStart.x = m_ptLineStart.y = 0;
m_ptLineEnd.x = m_ptLineEnd.y = 0;
m_ptLast.x = m_ptLast.y = -1;
m_bSave = false;
m_hm = NULL;
}
CChildView::~CChildView()
{
}
BEGIN_MESSAGE_MAP(CChildView,CWnd )
//{{AFX_MSG_MAP(CChildView)
ON_WM_PAINT()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDOWN()
ON_WM_RBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_RBUTTONUP()
ON_COMMAND(IDM_METAFILE_PLAY, OnFilePlaymetafile)
ON_COMMAND(IDM_METAFILE_RECORD, OnMetafileRecord)
ON_COMMAND(IDM_METAFILE_STOP, OnMetafileStop)
ON_COMMAND(IDM_METAFILE_CLEAR, OnMetafileClear)
ON_COMMAND(IDM_FILE_RECTANGLES, OnFileRectangles)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CChildView message handlers
BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs)
{
if (!CWnd::PreCreateWindow(cs))
return FALSE;
cs.dwExStyle |= WS_EX_CLIENTEDGE;
cs.style &= ~WS_BORDER;
cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS,
::LoadCursor(NULL, IDC_ARROW), HBRUSH(COLOR_WINDOW+1), NULL);
return TRUE;
}
void CChildView::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
// Do not call CWnd::OnPaint() for painting messages
}
void CChildView::DoMouseEvent (UINT message, UINT nFlags, POINT & point)
{
CWindowDC dc (this);
switch (message)
{
case WM_LBUTTONDOWN:
m_ptLineStart = point;
break;
case WM_LBUTTONUP:
m_bTracking = false;
m_ptLineStart.x = -1;
m_ptLineStart.y = -1;
break;
case WM_RBUTTONUP:
m_ptLast.x = -1;
m_ptLast.y = -1;
break;
case WM_RBUTTONDOWN:
dc.SetPixel (point, 0);
if (m_bSave)
m_mdc.SetPixel (point, 0);
if (m_ptLast.x >= 0)
{
DoMouseLine (dc, m_ptLast, point);
}
m_ptLast = point;
break;
case WM_MOUSEMOVE:
if (nFlags & MK_RBUTTON)
{
DoMouseEvent (WM_RBUTTONDOWN, nFlags, point);
break;
}
if (!(nFlags & MK_LBUTTON))
return;
if (m_bTracking)
{
POINT pt;
pt = point;
if (m_ptLineStart.x >= 0)
{
DoMouseLine (dc, m_ptLineStart, m_ptLineEnd);
DoMouseLine (dc, m_ptLineStart, pt);
}
}
m_ptLineEnd = point;
m_bTracking = true;
break;
}
}
void CChildView::DoMouseLine (CWindowDC& dc, POINT & ptLineStart, POINT & ptLineEnd)
{
CPen *penOld, *penMetaOld, Pen;
Pen.CreatePen (PS_SOLID, 2, (COLORREF) 0x00ffffff);
int nOldMode = dc.SetROP2 (R2_XORPEN);// R2_NOT);
dc.MoveTo (ptLineStart);
penOld = dc.SelectObject (&Pen);
dc.LineTo (ptLineEnd);
dc.SetROP2 (nOldMode);
dc.SelectObject (penOld);
if (m_bSave)
{
int nOldMetaMode = m_mdc.SetROP2 (R2_XORPEN);
m_mdc.MoveTo (ptLineStart);
penMetaOld = m_mdc.SelectObject (&Pen);
m_mdc.LineTo (ptLineEnd);
m_mdc.SetROP2 (nOldMetaMode);
m_mdc.SelectObject (penMetaOld);
}
Pen.DeleteObject ();
Pen.CreatePen (PS_SOLID, 1, (COLORREF) 0x0);
}
void CChildView::OnMouseMove(UINT nFlags, CPoint point)
{
DoMouseEvent (WM_MOUSEMOVE, nFlags, point);
}
void CChildView::OnLButtonDown(UINT nFlags, CPoint point)
{
DoMouseEvent (WM_LBUTTONDOWN, nFlags, point);
}
void CChildView::OnRButtonDown(UINT nFlags, CPoint point)
{
DoMouseEvent (WM_LBUTTONDOWN, nFlags, point);
}
void CChildView::OnLButtonUp(UINT nFlags, CPoint point)
{
DoMouseEvent (WM_LBUTTONDOWN, nFlags, point);
}
void CChildView::OnRButtonUp(UINT nFlags, CPoint point)
{
DoMouseEvent (WM_LBUTTONDOWN, nFlags, point);
}
void CChildView::OnFilePlaymetafile()
{
if (m_hm == NULL)
return;
CWindowDC dc(this);
dc.PlayMetaFile (m_hm);
}
void CChildView::OnMetafileRecord()
{
m_mdc.Create ();
m_bSave = true;
}
void CChildView::OnMetafileStop()
{
m_hm = m_mdc.Close ();
m_bSave = false;
}
void CChildView::OnMetafileClear()
{
Invalidate ();
}
void CChildView::OnFileRectangles()
{
CWindowDC dc(this);
CPen pen;
RECT rcBlue = {20, 20, 120, 200};
RECT rcGreen = {22, 22, 118, 198};
RECT rcRed = {24, 24, 116, 196};
pen.CreatePen (PS_SOLID, 2, RGB(0x00, 0x00, 0xFF));
dc.SelectObject (&pen);
dc.Rectangle (&rcBlue);
pen.DeleteObject();
pen.CreatePen (PS_SOLID, 2, RGB(0x00, 0xFF, 0x00));
dc.SelectObject (&pen);
dc.Rectangle (&rcGreen);
pen.DeleteObject();
pen.CreatePen (PS_SOLID, 2, RGB(0xFF, 0x00, 0x00));
dc.SelectObject (&pen);
dc.Rectangle (&rcRed);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -