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

📄 childview.cpp

📁 这些源代码
💻 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 + -