Drawcli分析

当前环境:windows7 32位旗舰版、VS2010旗舰版

 

Drawcli介绍:

Drawcli是VS2010中的一个示例程序,能够进行简单的绘图操作,例如线、矩形、圆角矩形、多边形等,位于VS安装目录"Microsoft Visual Studio 10.0\Samples\2052\VC2010Samples\C++\MFC\ole\drawcli"下。

 

1、对象的绘画。

void CDrawView::OnDraw(CDC* pDC)
{
 pDoc->Draw(pDrawDC, this);//CDrawDoc::Draw()
}

void CDrawDoc::Draw(CDC* pDC, CDrawView* pView)
{
 POSITION pos = m_objects.GetHeadPosition();
 while (pos != NULL)
 {
  CDrawObj* pObj = m_objects.GetNext(pos);
  pObj->Draw(pDC);//绘画图形
  if (pView->m_bActive &&
  !pDC->IsPrinting() &&
  pView->IsSelected(pObj)//判断对象是否在视图的选中列表中,视图使用CDrawObjList m_selection来存储选中图形的指针。
  )
  {
   pObj->DrawTracker(pDC, CDrawObj::selected);//绘画选中图形时的靶点
  }
 }
}

2、对象的存储。

通过对象的绘画我们可以知道,对象存储在文档类CDrawDoc的中,即CDrawObjList m_objects中,视图中存储了选中对象的指针在列表中,即CDrawObjList m_selection中。

3、对象的操作。

添加线、添加矩形、添加圆角矩形、添加椭圆等操作由CRectTool类进行处理;添加多边形由CPolyTool类进行处理;操作以存在的对象由CSelectTool类进行处理。 

static CSelectTool selectTool;
static CRectTool lineTool(line);
static CRectTool rectTool(rect);
static CRectTool roundRectTool(roundRect);
static CRectTool ellipseTool(ellipse);
static CPolyTool polyTool;

这里使用Tool类来完成一个特定功能,例如添加线条、添加矩形、添加多边形等等,有点类似于命令模式,这样做的好处是符合封装的特性,降低耦合度,修改一个功能不影响其他的功能。一般绘图软件都需要这样的类,用tool来处理特定功能的鼠标操作,而在不涉及鼠标操作,可以使用命令模式。

void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
	if (!m_bActive)
		return;
	CDrawTool* pTool = CDrawTool::FindTool(CDrawTool::c_drawShape);
	if (pTool != NULL)
	{
		pTool->OnLButtonDown(this, nFlags, point);
	}
}

void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
	if (!m_bActive)
		return;
	CDrawTool* pTool = CDrawTool::FindTool(CDrawTool::c_drawShape);
	if (pTool != NULL)
		pTool->OnLButtonUp(this, nFlags, point);
}

void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
	if (!m_bActive)
		return;
	CDrawTool* pTool = CDrawTool::FindTool(CDrawTool::c_drawShape);
	if (pTool != NULL)
		pTool->OnMouseMove(this, nFlags, point);
}

在选择不同的功能时,只需要设置CDrawTool::c_drawShape的值,便会在执行鼠标操作时选择相互匹配的工具来进行处理。

void CDrawView::OnDrawSelect()//选择工具
{
	CDrawTool::c_drawShape = selection;
}

void CDrawView::OnDrawRoundRect()//添加圆角矩形
{
	CDrawTool::c_drawShape = roundRect;
}

void CDrawView::OnDrawRect()//添加矩形
{
	CDrawTool::c_drawShape = rect;
}

void CDrawView::OnDrawLine()//添加直线
{
	CDrawTool::c_drawShape = line;
}

void CDrawView::OnDrawEllipse()//添加椭圆
{
	CDrawTool::c_drawShape = ellipse;
}

void CDrawView::OnDrawPolygon()//添加多边形
{
	CDrawTool::c_drawShape = poly;
}

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值