zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    Python学习札记(十五) 高级特性1 切片
    LeetCode Longest Substring Without Repeating Characters
    Python学习札记(十四) Function4 递归函数 & Hanoi Tower
    single number和变体
    tusen 刷题
    实验室网站
    leetcode 76. Minimum Window Substring
    leetcode 4. Median of Two Sorted Arrays
    leetcode 200. Number of Islands 、694 Number of Distinct Islands 、695. Max Area of Island 、130. Surrounded Regions 、434. Number of Islands II(lintcode) 并查集 、178. Graph Valid Tree(lintcode)
    刷题注意事项
  • 原文地址:https://www.cnblogs.com/dongc/p/5225127.html
Copyright © 2011-2022 走看看