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

📄 drawview.cpp

📁 交互式画图的应用例子! 希望可以供大家学习
💻 CPP
字号:
// DrawView.cpp : implementation of the CDrawView class
//

#include "stdafx.h"
#include "Draw.h"

#include "DrawDoc.h"
#include "DrawView.h"

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

/////////////////////////////////////////////////////////////////////////////
// CDrawView

IMPLEMENT_DYNCREATE(CDrawView, CView)

BEGIN_MESSAGE_MAP(CDrawView, CView)
	//{{AFX_MSG_MAP(CDrawView)
	ON_COMMAND(ID_LINE_MENU, OnLineMenu)
	ON_COMMAND(ID_RECT_MENU, OnRectMenu)
	ON_COMMAND(ID_ELLI_MENU, OnElliMenu)
	ON_UPDATE_COMMAND_UI(ID_ELLI_MENU, OnUpdateElliMenu)
	ON_UPDATE_COMMAND_UI(ID_LINE_MENU, OnUpdateLineMenu)
	ON_UPDATE_COMMAND_UI(ID_RECT_MENU, OnUpdateRectMenu)
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_MOUSEMOVE()
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDrawView construction/destruction

CDrawView::CDrawView()
{
	// TODO: add construction code here
	m_bLine=m_bRect=m_bElli=false;//初始化三个画图标识工具
    m_drawing=false;//初始化画图标记
	m_Hcursor=AfxGetApp()->LoadStandardCursor(IDC_CROSS);//初始化光标为十字形光标
}

CDrawView::~CDrawView()
{
}

BOOL CDrawView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CDrawView drawing

void CDrawView::OnDraw(CDC* pDC)
{
	CDrawDoc *pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	int index;
	index=pDoc->m_Shape.GetSize();//把m_Shape的长度值赋给index

	while(index--)//处理m_Shape的每一个图形对象
		pDoc->GetShape(index)->Draw(pDC);//把m_Shape中所有对象重绘出来

}

/////////////////////////////////////////////////////////////////////////////
// CDrawView printing

BOOL CDrawView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CDrawView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CDrawView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CDrawView diagnostics

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

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

CDrawDoc* CDrawView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDrawDoc)));
	return (CDrawDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CDrawView message handlers

void CDrawView::OnLineMenu() //直线菜单项的消息处理函数
{
	// TODO: Add your command handler code here
m_bLine=true;//直线菜单项的绘图工具标志为true
m_bRect=false;//矩形菜单项的绘图工具标志为false
m_bElli=false;//椭圆菜单项的绘图工具标志为false	
}

void CDrawView::OnRectMenu() //矩形菜单项的消息处理函数
{
	// TODO: Add your command handler code here
m_bLine=false;//直线菜单项的绘图工具标志为false
m_bRect=true;//矩形菜单项的绘图工具标志为true
m_bElli=false;//椭圆菜单项的绘图工具标志为false
	
}

void CDrawView::OnElliMenu() //椭圆菜单项的消息处理函数
{
	// TODO: Add your command handler code here
m_bLine=false;//直线菜单项的绘图工具标志为false
m_bRect=false;//矩形菜单项的绘图工具标志为false
m_bElli=true;//椭圆菜单项的绘图工具标志为true
}

void CDrawView::OnUpdateElliMenu(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
    //在椭圆菜单项前设置复选标志,并使椭圆按钮呈按下状态
	pCmdUI->SetCheck(m_bElli);	
}

void CDrawView::OnUpdateLineMenu(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	//在直线菜单项前设置复选标志,并使直线按钮呈按下状态
	pCmdUI->SetCheck(m_bLine);
}

void CDrawView::OnUpdateRectMenu(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
    //在矩形菜单项前设置复选标志,并使矩形按钮呈按下状态
	pCmdUI->SetCheck(m_bRect);	
}

void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)//按下鼠标左键的消息处理函数 
{
	// TODO: Add your message handler code here and/or call default
	SetCursor(m_Hcursor);//把鼠标光标设置成自定义光标

	m_Start=point;//开始画图时初始化起点为鼠标当前值
	m_End=point;  //开始画图时初始化终点为鼠标当前值
    SetCapture();  //捕获鼠标
	RECT rect;     //声明一个RECT类变量
	GetClientRect(&rect); //获取程序窗口的客户区坐标
	ClientToScreen(&rect);//把客户区坐标转化为屏幕坐标
	ClipCursor(&rect);    //限制鼠标的移动范围

	m_drawing=true;//按下左键开始画图,设置画图标志为true

	CView::OnLButtonDown(nFlags, point);
}

void CDrawView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default

	if(m_drawing)
	{
	m_End=point;   //松开左键时鼠标当前值是图形终点
    ReleaseCapture();  //释放捕获鼠标
	ClipCursor(NULL);    //取消对鼠标的限制,使其可以在屏幕任意位置移动	
	CClientDC pDC(this);//创建设备环境
    m_drawing=false;//如果左键释放前正在画图,画图完毕标志置为false
	
    CDrawDoc *pDoc=GetDocument();//声明一个指向文档对象的指针
	ASSERT_VALID(pDoc); //确保能成功获取文件对象指针

	if(m_bLine)//画直线
	{
	    //CPen SolidPen(PS_SOLID,3,RGB(255,0,0));//创建红色画笔
	    //pDC.SelectObject(&SolidPen);//将画笔选入设备环境	
		pDC.MoveTo(m_Start);
		pDC.LineTo(m_End);

		pDoc->AddShape(1,m_Start.x,m_Start.y,m_End.x,m_End.y);//把图形信息加到m_Shape中

	}
	
    if(m_bRect)//画矩形
	{
		//CBrush BlueBrush(RGB(0,0,255));//蓝色画刷
	    //pDC.SelectObject(&BlueBrush); //将画刷选入设备环境
		pDC.Rectangle(m_Start.x,m_Start.y,m_End.x,m_End.y);

		pDoc->AddShape(2,m_Start.x,m_Start.y,m_End.x,m_End.y);//把图形信息加到m_Shape中

	}
	
	if(m_bElli)//画椭圆
	{
		//CBrush GreenBrush(RGB(0,255,0));//绿色画刷
	    //pDC.SelectObject(&GreenBrush); //将画刷选入设备环境
		pDC.Ellipse(m_Start.x,m_Start.y,m_End.x,m_End.y);
			
		pDoc->AddShape(3,m_Start.x,m_Start.y,m_End.x,m_End.y);//把图形信息加到m_Shape中

	}
	}//END if(m_drawing)

	CView::OnLButtonUp(nFlags, point);
}

void CDrawView::OnMouseMove(UINT nFlags, CPoint point)//移动鼠标时的消息处理函数 
{
	// TODO: Add your message handler code here and/or call default
	if(m_drawing)
	{
		CClientDC pDC(this);//创建设备环境
	    SetCursor(m_Hcursor);//把鼠标设置为自定义光标
	    pDC.SetROP2(R2_NOT);//设置绘图模式,使用与当前屏幕颜色相反的颜色绘图
		
		if(m_bLine)//如果当前正在画直线
		{	
	      pDC.MoveTo(m_Start);
	      pDC.LineTo(m_End);
	      pDC.MoveTo(m_Start);
	      pDC.LineTo(point);
		} 	      
		
	    if(m_bRect)//如果当前正在画矩形
		{
		pDC.SelectStockObject(NULL_BRUSH);//将空画刷选入设备环境
		pDC.Rectangle(m_Start.x,m_Start.y,m_End.x,m_End.y);
	    pDC.Rectangle(m_Start.x,m_Start.y,point.x,point.y);
 	    }
	
		if(m_bElli)//如果当前正在画椭圆
		{
		pDC.SelectStockObject(NULL_BRUSH);//将空画刷选入设备环境
		pDC.Ellipse(m_Start.x,m_Start.y,m_End.x,m_End.y);
	    pDC.Ellipse(m_Start.x,m_Start.y,point.x,point.y);
 	    }
		m_End=point;//把当前点记录为终点
	}
	CView::OnMouseMove(nFlags, point);
}

⌨️ 快捷键说明

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