用VC实现小型矢量图形系统的开发(下)

发表于:2007-06-17来源:作者:点击数: 标签:
2).文档(CDrawGraphDoc)用于实现矢量图形对象的建立、存储和读取(即序列化)。 classCDrawGraphDoc:publicCDocument { protected://createfromserializationonly CDrawGraphDoc(); DECLARE_DYNCREATE(CDrawGraphDoc) //Attributes public: //Operations p

          
  2). 文档(CDrawGraphDoc)用于实现矢量图形对象的建立、存储和读取(即序列化)。

class CDrawGraphDoc : public CDocument

{

 protected: // create from serialization only

 CDrawGraphDoc();

 DECLARE_DYNCREATE(CDrawGraphDoc)

  // Attributes

 public:

  // Operations

 public:

  // Overrides

  // ClassWizard generated virtual function overrides

  //{{AFX_VIRTUAL(CDrawGraphDoc)

 public:

  virtual BOOL OnNewDocument();

  virtual void Serialize(CArchive& ar);

  virtual BOOL OnOpenDocument(LPCTSTR lpszPathName);

  virtual void DeleteContents();

 //}}AFX_VIRTUAL

 // Implementation

 public:

  CMainFrame* GetMainFrame();//获得对主框架窗口的指针

  BOOLEAN m_fillmode;//两种填充方式

  void Cancel();//删除当前正在建立的绘图对象

  COLORREF m_color;

  COLORREF m_filledcolor;

  UINT m_PenWidth;

  CGraph* NewDrawing();

  CObList m_graphoblist;//绘图对象列表

  CObList m_redolist;//为redo功能提供的历史记录对象列表

  //以后可以添加下面的功能,把图形存储为流行的图形交互格式。

  //SaveAsBitmap();

  //SaveAsWMF();

  //SaveAsJPEG();

  //SaveAsGIF();

  virtual ~CDrawGraphDoc();

  #ifdef _DEBUG

  virtual void AssertValid() const;

  virtual void Dump(CDumpContext& dc) const;

  #endif

  protected:

   // Generated message map functions

   protected:

    void Refresh();//用于更新视图

    void InitDocument();

    //{{AFX_MSG(CDrawGraphDoc)

     afx_msg void OnFillinborder();

     afx_msg void OnUpdateFillinborder(CCmdUI* pCmdUI);

     afx_msg void OnFilloncolor();

     afx_msg void OnUpdateFilloncolor(CCmdUI* pCmdUI);

     afx_msg void OnPenwidth();

     afx_msg void OnEditUndo();

     afx_msg void OnUpdateEditUndo(CCmdUI* pCmdUI);

     afx_msg void OnClear();

     afx_msg void OnUpdateClear(CCmdUI* pCmdUI);

     afx_msg void OnEditRedo();

     afx_msg void OnUpdateEditRedo(CCmdUI* pCmdUI);

    //}}AFX_MSG

  DECLARE_MESSAGE_MAP()

  }; 
 
  3). 视图(CDrawGraphView)接收用户的对特定图形对象的操作并绘制图形对象。

class CDrawGraphView : public CView

{

 protected: // create from serialization only

  CDrawGraphView();

  DECLARE_DYNCREATE(CDrawGraphView)

  // Attributes

 public:

  CDrawGraphDoc* GetDocument();

  // Operations

  public:

   // Overrides

   // ClassWizard generated virtual function overrides

   //{{AFX_VIRTUAL(CDrawGraphView)

  public:

   virtual void OnDraw(CDC* pDC); // overridden to draw this view

   virtual BOOL PreCreateWindow(CREATESTRUCT& cs);

  protected:

   virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);

   virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
 
   virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);

  //}}AFX_VIRTUAL

  // Implementation

  public:

   virtual ~CDrawGraphView();

   #ifdef _DEBUG

    virtual void AssertValid() const;

    virtual void Dump(CDumpContext& dc) const;

   #endif

  protected:

   // Generated message map functions

  protected:

   CPoint m_ptPrev;//前面一次点击的位置

   CGraph* m_curGraph;//当前正在绘制的图形对象

   state bdrawbegin;//绘制状态

   //{{AFX_MSG(CDrawGraphView)

   afx_msg void OnLButtonDown(UINT nFlags, CPoint point);

   afx_msg void OnMouseMove(UINT nFlags, CPoint point);

   afx_msg void OnRButtonDown(UINT nFlags, CPoint point);

   afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);

   afx_msg void OnLButtonUp(UINT nFlags, CPoint point);

  //}}AFX_MSG

  DECLARE_MESSAGE_MAP()

}; 

  视图类在界面上改得少,主要是处理鼠标事件和调用各图形对象的绘制方法,实现上也尽量统一,充分利用图形对象的多态性。

  4). 各图形对象的基类CGraph的考虑是关键,所以是需要关注的。

  它定义了绘图类别和绘制状态两个枚举类型。当你把它定义好后,可以在stdafx.h加上#include “graph.h”来使得所有文件都能自由引用它,并且获得预编译。

enum state;

typedef enum {line ,bezier,solid,light,stroke,circle,rectangle,filledrectangle,&
polyline,filledcircle,filledpolygon,ellipse,fill,text} objecttype;

class CGraph : public CObject

{protected:

CGraph( ){};

DECLARE_DYNAMIC( CGraph )

// Attributes

protected:

COLORREF m_color;//所有图形对象都有颜色

public:

// Operations

public:

virtual state SetNext(CPoint pt)=0;//再次点击,由返回值确定是否结束绘制

virtual void SetStart(CPoint pt)=0;//一次点击,产生第一点的位置

virtual void Draw( CDC* pDC )=0;//图形对象绘制自己的方法

inline void SetColor(COLORREF color);//设置图形对象颜色

virtual void DrawXOR(CDC*pDC,CPoint pt)=0;//在拖动状态,图形对象绘制自己的方法

virtual void Serialize( CArchive& ar );//图形对象序列化的方法

//以后可以扩展以下功能

// virtual void IsHit(CPoint pt);//确定对象是否被点击

// virtual void Highlight();//被点击后突出显示

// virtual CRect GetBoundRect();//获得图形矩阵,可以用线索的方法局部更新视图,免除闪烁和时延等。

// virtual void Move(CPoint shift);//移动

// virtual void Rotate(int Degree);//旋转

// virtual void Scale(int scalecoef);//缩放

// virtual void Copy();//拷贝、粘贴、剪切功能

// virtual void Paste();

// virtual void Cut();

}; 

  虽然是个小软件,“开发过程”还是可以和“软件工程”的步骤基本对应的。

  本软件的“需求分析”是人们需要一个比Windows画笔功能强大,但十分小巧易用的小而精的基于矢量的(易于编辑)的图形工具。而且,另一方面,这个小软件的开发是一个典型的基于VC的面向对象软件开发的尝试,很有教学意义。

  至此,基本完成了“概要设计”。以后将把“详细设计”和“编码”结合起来讲。至于“测试”和“维护”(改错、升级)有兴趣的读者可以自己完成。

原文转自:http://www.ltesting.net