当前环境: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; }