以文本方式查看主题 - 中文XML论坛 - 专业的XML技术讨论区 (http://bbs.xml.org.cn/index.asp) -- 『 C/C++编程思想 』 (http://bbs.xml.org.cn/list.asp?boardid=61) ---- 用VC实现小型矢量图形系统的开发 (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=61156) |
-- 作者:卷积内核 -- 发布时间:4/10/2008 4:01:00 PM -- 1. 基于文档-视图结构的类 在图1可以看到,本软件是基于多文档界面(MDI)的。由AppWizard选取多文档界面后,它会帮助我们生成基本的基于文档-视图结构的类。本软件使用DrawGraph为应用程序名,故有以下类:CMainFrame,CChildFrame,CDrawGraphApp,CDrawGraphDoc ,CDrawGraphView。 其中:CDrawGraphApp(以后我用是应用程序类,支持应用程序的建立和基本交互,我们可以不必改它。CChildFrame类是视图文档的容器,除了在显示图标上的定制外,我们也可以不修改它。 CMainFrame,CDrawGraphDoc ,CDrawGraphView用于分别实现主窗口、文档、视图的功能。 1). 主窗口(CMainFrame)主要需要定制图标、工具条的建立、显示和交互。下面是类的定义,阴影部分是自己定制的(非AppWizard自动生成) class CMainFrame : public CMDIFrameWnd { DECLARE_DYNAMIC(CMainFrame)//支持动态建立 public: CMainFrame(); // Attributes public: // Operations public: // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CMainFrame) public: virtual BOOL PreCreateWindow(CREATESTRUCT& cs); //}}AFX_VIRTUAL // Implementation public: int m_Depth;//立体深度 COLORREF m_fillcolor;//填充色 COLORREF m_pencolor;//边框色 LOGFONT m_font;//字体 int m_penstyle;//线型 UINT m_penwidth;//笔宽 void SaveToReg();//记录退出前的窗口状态 void ReadFromReg();//读取退出前的窗口状态 objecttype GetDrawType();//返回当前选中的绘图工具类别 virtual ~CMainFrame(); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif protected: // control bar embedded members CReBar m_wndReBar;//标准栏和属性栏的容器工具条 CDialogBar m_wndDlgBar;//属性栏 CToolBar m_wndToolBar;//标准栏 CToolBar m_wndDrawTool;//绘图工具条 UINT objtype;//选中工具的ID号 // Generated message map functions protected: afx_msg void OnDropDown(NMHDR* pNotifyStruct,LRESULT* result); //{{AFX_MSG(CMainFrame) afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); afx_msg void OnShowdrawtool();//显隐工具条 afx_msg void OnUpdateShowdrawtool(CCmdUI* pCmdUI); afx_msg void OnFont(); afx_msg void OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized); afx_msg void OnColor(); afx_msg void OnUpdateColor(CCmdUI* pCmdUI); afx_msg void OnFillcolor(); afx_msg void OnUpdateFillcolor(CCmdUI* pCmdUI); //}}AFX_MSG afx_msg void OnSelectTool(UINT ID);//选中工具 afx_msg void OnUpdateButtons(CCmdUI* pCmdUI);//处理按钮按下状态 afx_msg void onchangedpenwidth(); DECLARE_MESSAGE_MAP() }; |
-- 作者:卷积内核 -- 发布时间:4/10/2008 4:02:00 PM -- 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() }; |
-- 作者:卷积内核 -- 发布时间:4/10/2008 4:02:00 PM -- 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); //}}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/10/2008 4:03:00 PM -- 4). 各图形对象的基类CGraph的考虑是关键,所以是需要关注的。 它定义了绘图类别和绘制状态两个枚举类型。当你把它定义好后,可以在stdafx.h加上#include “graph.h”来使得所有文件都能自由引用它,并且获得预编译。 enum state{notstart=0,startstroke,continuedrag,enddraw}; typedef enum {line ,bezier,solid,light,stroke,circle,rectangle,filledrectangle,& 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){m_color=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的面向对象软件开发的尝试,很有教学意义。 至此,基本完成了“概要设计”。以后将把“详细设计”和“编码”结合起来讲。至于“测试”和“维护”(改错、升级)有兴趣的读者可以自己完成。 |
W 3 C h i n a ( since 2003 ) 旗 下 站 点 苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》 |
7,753.906ms |