Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > C/C++ > DooDle(涂鸦)画图程序(C++课题设计)
【标  题】:DooDle(涂鸦)画图程序(C++课题设计)
【关键字】:DooDle,C++
【来  源】:http://blog.csdn.net/snailbreak/archive/2006/10/16/1336899.aspx

DooDle(涂鸦)画图程序(C++课题设计)

Your Ad Here 程序运行界面:
1.
2. 
设计概要:
1 引言
1.1编写目的
  对C++学习收获的一次测试,以及对自己学习能力的一中考验。
1.2背景
  说明:
  a.软件名称:涂鸦(DooDle);
  b.此画图软件由Bring.Zhang独立完成设计与实现。
1.3定义
此画图软件定义了自己的文件存储格式*.dle,只能打开.dle格式的文件
1.4参考资料
a.  《Visual C++ 6.0编程实用技术与案例》陈元琰等编著
b.《深入浅出MFC》 简体中文版(侯俊杰);
  c.<<VC++技术内幕>> 潘爱民。
2 总体设计
2.1需求规定
  设计目标:设计一个简单的图形编辑器(类似于一个简单的windows画图程序),具有基本图形形状的绘制、涂色等功能,并能够保存和打开自定义格式图形文件。要求使用MFC编程。
功能设计要求:
a.      图形编辑功能
(1)        能够在画图区域中实现对矩形、圆、椭圆、直线等各种基本图元的绘制。
(2)        能够对所绘制的各种图元内部任意选择颜色进行涂色
(3)        能够对各种图形编辑操作实现undo(撤消)功能
b.   文件保存与打开功能
(1)        能够将在图形编辑区中所输入的各种图形对象存储到文件中。
(2)        能够打开所保存的自定义格式的图形文件,并在文件打开时将文件中存储的所有图形对象显示出来。
c.   测试程序
2
2运行环境
  此画图软件是在visual stdio 2005环境下编写的,并成功通过编译。
2
3基本设计流程
  a.运用MFC AppWizard建立画图程序的基本框架(SDI);
         b.设计所用图元类(具体设计见总体框架);
         c.实现动态画图操作;
         d.实现画图文件的文件操作。 
22运行环境
  此画图软件是在visual stdio 2005环境下编写的,并成功通过编译。
2
3基本设计流程
  a.运用MFC AppWizard建立画图程序的基本框架(SDI);
         b.设计所用图元类(具体设计见总体框架);
         c.实现动态画图操作;
         d.实现画图文件的文件操作。
2
4系统总框图 
2
5模块的设计分析
a.图元特性设计:
图元基类:
class CShape:public CObject 
{
protected:
     COLORREF m_pColor; 
//线条颜色
     int m_pWidth;//线条宽度
     int m_pStyle;//线条样式
     CShape(){}
     DECLARE_SERIAL(CShape)
public:
     
virtual void Drawing(CDC* pDC){}//画图操作
     virtual void Serialize(CArchive& ar);//
       virtual ~CShape();
}
;
其它图元都是从此基类继承得到的
b.动态画图:
        
      CClientDC dc(this);
          OnPrepareDC(
&dc);
          dc.DPtoLP(
&point);//滚动条坐标转换代码
          dc.SelectStockObject(NULL_BRUSH);
     
          SetCursor(m_HCursor);
          
if(m_Drag){
              CDooDleDoc
* pDoc = GetDocument();
              CPen NewPen,
*pOldPen;
              
switch(pDoc->m_pStyle)
              
{
                   
case PEN_STYLE_SOLID:
                        NewPen.CreatePen(PS_SOLID,pDoc
->m_pWidth,pDoc->m_pColor);
                        Break;
                   
//…………….
              }

         pOldPen 
= dc.SelectObject(&NewPen);
         dc.SetROP2(R2_NOT);
 
         
if(pDoc->CurrentDraw == DRAW_LINE){//直线
              dc.MoveTo(m_pOrigin);
              dc.LineTo(m_pPrev);
//擦掉上一次画的线
 
              dc.MoveTo(m_pOrigin);
              dc.LineTo(point);
//画线
         }

         
if(pDoc->CurrentDraw == DRAW_RECTANGLE){//矩形
              
//……………………….
     鼠标移动是画图操作的主要动作之一,处理鼠标移动事件在程序中尤为重要。
     c.撤消功能
  
       void CDooDleDoc::OnEditUndo() 
{
     
// TODO: Add your command handler code here
     int index = m_ObArray.GetUpperBound();
     
if(index>=0 && m_pModifiedCount > 0){              //m_pModifiedCount为撤消标志
         delete m_ObArray.GetAt(index);
         m_ObArray.RemoveAt(index);
         m_pModifiedCount
--;
     }

     UpdateAllViews(NULL);
     SetModifiedFlag();
}

d.文件操作
2.6  设计与算法
个人认为此画图程序最有提处的设计在于其结构的清晰,可读性较好。
下面从程序的存储说起:
void CDooDleDoc::Serialize(CArchive& ar) //序列化
{
     
if (ar.IsStoring())
     
{
         
// TODO: add storing code here
         m_ObArray.Serialize(ar);
     }

     
else
     
{
         
// TODO: add loading code here
         m_ObArray.Serialize(ar);
     }

}

m_ObArray
的类型为CObArray,是一个类似容器的封装MFC中的预定义类。而m_ObArray存储的CShape(图元基类),Serialize是virtual类型的,因此保存文件时程序会动态调用Serialize函数。以椭圆为例:
void CEllipse::Serialize(CArchive& ar)
{
     
if(ar.IsStoring()){
         ar
<<m_pFirstCorner.x<<m_pFirstCorner.y<<m_pSecondCorner.x
              
<<m_pSecondCorner.y;
     }

     
else{
         ar
>>m_pFirstCorner.x>>m_pFirstCorner.y>>m_pSecondCorner.x
              
>>m_pSecondCorner.y;
     }

     CShape::Serialize(ar);
}

同样将各种画出图形存储时也是非常的方便。
void CDooDleDoc::AddShape(CShape* pShape)
{
     
//CLine* pLine = new CLine(pStart,pEnd,Width,Style,Color);
     m_ObArray.Add(pShape);
     SetModifiedFlag();
     m_pModifiedCount
++;
}

 
3
.设计总结
3
1.存在的问题与不足及对策
在处理曲线、圆弧和多边型绘画成型的问题存在缺陷,本程序中曲线和圆弧的画图方法是鼠标单击4次后右击,相应的图形才会出现,多边型单击次数大于两次后右击,才会出现图形,不够实用、方便。相信随着MFC学习的深入将会解决这个以及与次类似的问题
32.收获
         经过一周的MFC学习和编程,对MFC有了大致的了解,能够编写一般的MFC应用程序。对事件驱动程序运行的过程也有较深刻的印象。
4 使用说明(操作手册)
4
1打开(.dle)格式文件

4
2画图
在工具栏或绘图惨淡中选择适当的图形,可以在选项菜单中选择线条类型和颜色
4
3保存
5 附录
5.1 直线类定义,其它图元类定义类似
class CLine:public CShape 
{
protected:
     CPoint m_pStart;
//起点
     CPoint m_pEnd;//终点
     DECLARE_SERIAL(CLine)//序列化宏
     CLine(){}
public:
     
     CLine(CPoint pStart,CPoint pEnd,
int Width,int Style,COLORREF Color);
     
void Drawing(CDC* pDC);//画直线
     virtual void Serialize(CArchive& ar);
     
virtual ~CLine();
}
;
5
.2 鼠标单击完成事件处理:
void CDooDleView::OnLButtonUp(UINT nFlags, CPoint point) 
{
     
// TODO: Add your message handler code here and/or call default
     CClientDC dc(this);
     OnPrepareDC(
&dc);
     dc.DPtoLP(
&point);//滚动条坐标转换代码
     dc.SelectStockObject(NULL_BRUSH);
 
     
if(m_Drag){
         m_Drag 
= 0;
         ReleaseCapture();
         ClipCursor(NULL);
         CDooDleDoc
* pDoc = GetDocument();
         
         CShape
* pShape;
         
if(pDoc->CurrentDraw == DRAW_LINE){//直线
              pShape = new CLine(m_pOrigin,point,pDoc->m_pWidth,pDoc->m_pStyle,pDoc->m_pColor);//所画直线数据
         }

         
if(pDoc->CurrentDraw == DRAW_RECTANGLE){//矩形
              pShape = new CRectangle(m_pOrigin,point,pDoc->m_pWidth,pDoc->m_pStyle,pDoc->m_pColor);
         }

         
if(pDoc->CurrentDraw == DRAW_ROUNDRECT){//圆矩形
              int r = (abs(m_pOrigin.x-point.x)+abs(m_pOrigin.y-point.y))/6;
              pShape 
= new CRoundRect(m_pOrigin,point,r,pDoc->m_pWidth,pDoc->m_pStyle,pDoc->m_pColor);
         }

         
if(pDoc->CurrentDraw == DRAW_FILLRECT){//填充矩形
              pShape = new CFillRect(m_pOrigin,point,pDoc->m_pWidth,pDoc->m_pStyle,pDoc->m_pColor,
                   pDoc
->m_pFColor,pDoc->m_pHatch,pDoc->m_pHatchFlag);
         }

         
if(pDoc->CurrentDraw == DRAW_CIRCLE){//
              pShape = new CCircle(m_pOrigin,m_pPrev,pDoc->m_pWidth,pDoc->m_pStyle,pDoc->m_pColor);
         }

         
if(pDoc->CurrentDraw == DRAW_ELLIPSE){//椭圆
              pShape = new CEllipse(m_pOrigin,m_pPrev,pDoc->m_pWidth,pDoc->m_pStyle,pDoc->m_pColor);
         }

 
         pDoc
->AddShape(pShape);//保存图形数据
         pDoc->UpdateAllViews(NULL);
     }

     
     CScrollView::OnLButtonUp(nFlags, point);
}

 

程序源代码下载

欢迎大家评论!

《C算法》——堆排序:【上一篇】
[收藏]C语言测试:想成为嵌入式程序员应知道的0x10个基本问题:【下一篇】
【相关文章】
  • VC++中可能遇到的问题
  • C++ 中不能重载的运算符
  • C++文曲星里的猜数字游戏
  • c++中char * 和 char []的区别
  • 【转】摩托罗拉C++面试题
  • 《C++捷径教程》读书笔记--Chapter 18--C++的I/O系统--1
  • 用VC写Assembly代码(7)--在Visual C++中使用内联汇编
  • 编程交流与学习--More Effective C++的学习-Item M17:考虑使用lazy evaluation(懒惰计算法)
  • C++ convert int to string
  • C++函数对象学习笔记
  • 【随机文章】
  • 某君的一点软件测试思考
  • 巧妙配合asp木马取得管理权限
  • [导入]Common Ground 国际双行线
  • 无线局域网的技术与进展
  • 14M电力线USB网卡PLUSB10
  • 使用 AppFuse 的七个理由之二
  • C语言常用的三种排序方法总结与探讨
  • Wi-Fi更有前途 可能取代3G
  • 大数阶乘
  • Is extern "C" needed in both .c and .h files
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 bbb软讯网络 All Rigths Reserved.