• Drawcli分析


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

    Drawcli介绍:

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

     

    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;
    }
  • 相关阅读:
    Supermap全面接触
    期末小结(二).应用技术
    发展需要大师,繁荣更需批评——GIS现状堪忧
    期末小结(三).我是玻璃缸里的鱼
    地信空间数据库实习讲稿(Oracle spatial)
    .net会取代JavaScript
    空间聚类(等回来之后完成)
    .Net Windows服务安装完成后自动启动
    规划网站,本教程将以图示为例构建网站;
    漫谈CSS和页面布局
  • 原文地址:https://www.cnblogs.com/dongc/p/5225127.html
Copyright © 2020-2023  润新知