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

📄 drawview.cpp

📁 《Visual C++.NET MFC类库应用详解》程序实例
💻 CPP
字号:
// DrawView.cpp : CDrawView 类的实现
//

#include "stdafx.h"
#include "Draw.h"
#include "PenDialog.h"
#include "DrawDoc.h"
#include "DrawView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CDrawView

IMPLEMENT_DYNCREATE(CDrawView, CScrollView)

BEGIN_MESSAGE_MAP(CDrawView, CScrollView)
	// 标准打印命令
	ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
	ON_WM_LBUTTONDOWN()
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONUP()
//	ON_WM_SETCURSOR()
END_MESSAGE_MAP()

// CDrawView 构造/销毁

CDrawView::CDrawView()
{
	// TODO: 在此处添加构造代码
    m_Drag=0;
	m_HCursor=AfxGetApp()->LoadStandardCursor(IDC_CROSS);

}

CDrawView::~CDrawView()
{
}

BOOL CDrawView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: 在此处通过修改 CREATESTRUCT cs 来修改窗口类或
	// 样式
     cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW,0,(HBRUSH)::GetStockObject(WHITE_BRUSH),0);

	return CScrollView::PreCreateWindow(cs);
}

// CDrawView 绘制

void CDrawView::OnDraw(CDC* pDC)
{
	CDrawDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	// TODO: 在此处为本机数据添加绘制代码
    int index=pDoc->GetDrawNumber();
    for(int i=0;i<index;i++)
	    pDoc->GetDraw (i)->Drawing(pDC);

	if(pDoc->IsSelect)
    {
        pDC->SelectStockObject(NULL_BRUSH);
		CPen NewPen,*pOldPen;
		NewPen.CreatePen(PS_DASH,1,RGB(250,0,0));
		pOldPen=pDC->SelectObject(&NewPen);
	    pDC->Rectangle(pDoc->m_SelectRect);
	    pDC->SelectObject(pOldPen);
		index=pDoc->m_SelectObArray.GetSize();
        for(int i=0;i<index;i++)
		{
			CLine *pLine=(CLine *)(pDoc->m_SelectObArray.GetAt(i));
			pLine->Drawing(pDC);
		}
//		CString str;
//		str.Format("n=%d",index);
//		pDC->TextOut(20,25,str);
	}
}


// CDrawView 打印

BOOL CDrawView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// 默认准备
	return DoPreparePrinting(pInfo);
}

void CDrawView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: 打印前添加额外的初始化
}

void CDrawView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: 打印后添加清除过程
}


// CDrawView 诊断

#ifdef _DEBUG
void CDrawView::AssertValid() const
{
	CScrollView::AssertValid();
}

void CDrawView::Dump(CDumpContext& dc) const
{
	CScrollView::Dump(dc);
}

CDrawDoc* CDrawView::GetDocument() const // 非调试版本是内联的
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDrawDoc)));
	return (CDrawDoc*)m_pDocument;
}
#endif //_DEBUG


// CDrawView 消息处理程序

void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	CDrawDoc *pDoc=GetDocument();

	CClientDC dc(this);
    OnPrepareDC(&dc);
    dc.DPtoLP(&point);
    if(pDoc->IsSelect)
    {
        m_SelectFirstPoint=point;
	    m_SelectSecondPoint=point;
    }
    else
    {
	    m_pPrev=point;
        m_pOrigin=point;
    }
    m_Drag=1;
    SetCapture();
    RECT rect;
    GetClientRect(&rect);
    ClientToScreen(&rect);
    ClipCursor(&rect);

	CScrollView::OnLButtonDown(nFlags, point);
}

void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
 	CDrawDoc *pDoc=GetDocument();

    CClientDC dc(this);
    OnPrepareDC(&dc);
    dc.DPtoLP(&point);

	SetCursor(m_HCursor);
    if(m_Drag)
    {
		CPen NewPen,*pOldPen;
        if(pDoc->IsSelect)
        {
            NewPen.CreatePen(PS_DASH,1,RGB(250,0,0));
        }
        else
        {
            switch(pDoc->m_pStyle)
		    {
		    case PEN_STYLE_SOLID:
                NewPen.CreatePen(PS_SOLID,pDoc->m_pWidth,pDoc->m_pColor);
		        break;
		    case PEN_STYLE_DASH:
		        NewPen.CreatePen(PS_DASH,pDoc->m_pWidth,pDoc->m_pColor);
		        break;
		    case PEN_STYLE_DOT:
		        NewPen.CreatePen(PS_DOT,pDoc->m_pWidth,pDoc->m_pColor);
		        break;
		    }
	    }
		pOldPen=dc.SelectObject(&NewPen);
		dc.SetROP2(R2_NOT);
        if(pDoc->IsSelect)
        {
            dc.MoveTo(m_SelectFirstPoint);
	        dc.LineTo(m_SelectSecondPoint.x,m_SelectFirstPoint.y);
	        dc.LineTo(m_SelectSecondPoint);
	        dc.LineTo(m_SelectFirstPoint.x,m_SelectSecondPoint.y);
	        dc.LineTo(m_SelectFirstPoint);

	        dc.MoveTo(m_SelectFirstPoint);
	        dc.LineTo(point.x,m_SelectFirstPoint.y);
	        dc.LineTo(point);
	        dc.LineTo(m_SelectFirstPoint.x,point.y);
	        dc.LineTo(m_SelectFirstPoint);

		    m_SelectSecondPoint=point;
	    }
	    else
	    {
		    dc.MoveTo(m_pOrigin);
     	    dc.LineTo(m_pPrev);
     	    dc.MoveTo(m_pOrigin);
     	    dc.LineTo(point);
            m_pPrev=point;
	    }
	    dc.SelectObject(pOldPen);
    }
	CScrollView::OnMouseMove(nFlags, point);
}

void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
    CDrawDoc *pDoc=GetDocument();
    CClientDC dc(this);
    OnPrepareDC(&dc);
    dc.DPtoLP(&point);

	if(m_Drag)
	{
	     m_Drag=0;
		 ReleaseCapture();
	     ClipCursor(NULL);
         if(pDoc->IsSelect)
         {
             pDoc->m_SelectRect.left=m_SelectFirstPoint.x;
		     pDoc->m_SelectRect.top=m_SelectFirstPoint.y;
		     pDoc->m_SelectRect.right=point.x;
		     pDoc->m_SelectRect.bottom=point.y;
	         pDoc->m_SelectObArray.RemoveAll();
             int index=pDoc->GetDrawNumber();
             for(int i=0;i<index;i++)
	         {
		         if(IsInArea(pDoc->GetDraw(i)->m_pStart,pDoc->m_SelectRect) && 
					   IsInArea(pDoc->GetDraw(i)->m_pEnd,pDoc->m_SelectRect))
			         pDoc->m_SelectObArray.Add(pDoc->GetDraw(i));
	         }
	     }
	     else
	     {
		     pDoc->AddDraw(m_pOrigin,point,pDoc->m_pWidth,pDoc->m_pStyle,pDoc->m_pColor);
	     }       
		 pDoc->UpdateAllViews(NULL);
	}

	CScrollView::OnLButtonUp(nFlags, point);
}

bool CDrawView::IsInArea(CPoint point,CRect rect)
{
	if(point.x>=rect.left && point.x<=rect.right && 
		point.y>rect.top && point.y<rect.bottom)
		return true;
	else 
		return false;
}


void CDrawView::OnInitialUpdate()
{

	// TODO: 在此添加专用代码和/或调用基类
    SIZE size={640,480};
	SetScrollSizes(MM_TEXT,size);
	CScrollView::OnInitialUpdate();

}

void CDrawView::PrintPageHeader(CDC* pDC,CPrintInfo* pInfo,CString& strHeader)
{
	pDC->SetTextAlign(TA_LEFT);
	pDC->TextOut(0,+25,strHeader);
	TEXTMETRIC textMetric;
	pDC->GetTextMetrics(&textMetric);
	int y=35+textMetric.tmHeight;
	pDC->MoveTo(0,y);
	pDC->LineTo(pInfo->m_rectDraw.right,y);
	y+=25;
	pInfo->m_rectDraw.top+=y;
}


void CDrawView::OnPrint(CDC* pDC, CPrintInfo* pInfo)
{
	// TODO: 在此添加专用代码和/或调用基类
    CString strHeader=GetDocument()->GetTitle();
	PrintPageHeader(pDC,pInfo,strHeader);
	pDC->SetWindowOrg(pInfo->m_rectDraw.left,-pInfo->m_rectDraw.top);
	OnDraw(pDC);

	CScrollView::OnPrint(pDC, pInfo);
}

⌨️ 快捷键说明

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