网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > C/C++
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.C++ Builder 使用动作.
.基于VC++的OpenGL编程讲座之曲线.
.用C语言解决鬼谷算题.
.TC(V2.0)编译错误信息.
.数据结构C语言实现系列——二叉树.
.初学者入门:C++指针使用方法.
.VC的若干实用小技巧(三).
.用C++访问SQL Server .
.基于Visual C++的Winsock API研究.
.C/C++编程新手错误分析(1).
.BDE错误码对照表.
.C语言初学者入门讲座 第二讲 数据.
.用任务条跟踪文件下载.
.[收藏]ASP.Net生成静态HTML页 .
.全国计算机编程大赛复赛试题2.
.C++箴言:了解C++偷偷加上和调用了.
.Awk 基础入门:Awk 实例编程.
.TDecisionCube.
.在CB中使用ACCESS数据库.
.指针与数组.

DOS界面下通用图形编辑软件的设计

发表日期:2008-3-8


摘  要  该文介绍了一种建立在DOS界面下生成图素文件的通用图形编辑程序的设计方法。
    要害词  图形编辑  数据结构  图素
    目前用作DDC的PC总线工控机(IPC)大部分工作在DOS界面上,而DOS不具有像Windows那样美观方便的图形用户接口(GUI)。生成工艺流程图等复杂图形若用程序设计语言直接编程需花费大量精力和代码,且不易修改。设计出数据文件小,占用内存少的图形编辑软件是控制界的一个研究课题。这里介绍一种生成图素数据文件的通用图形编辑软件的设计方法

    一、数据结构与数据文件格式
    由于所有的操作都基本建立在图素的基础之上,故数据结构也以图素为中心。以下以圆、直线、矩形、字符串为例,其它图素类似。
    1.定义所需图素
    strUCt circle  /*定义圆 */
        {
        int x,y,r; /* 圆心,半径 */
        char linecolor,linestyle; /* 圆外围线的颜色,线型 */
        char fillcolor,fillstyle; /* 填充颜色,模式 */
        };
    struct line /* 定义直线 */
        {
        int x1,y1;
        int x2,y2;
        char linecolor,linestyle,linethick; /* 线颜色,模式,粗细 */
        };
    struct box  /* 定义矩形 */
        {
        int x1,y1;
        int x2,y2;
        char linecolor,linestyle;
        char fillcolor,fillstyle;
        };
    struct string /* 定义字符串 */
        {
        int x,y;
        char str[10]
        char backcolor,dir;
        char str-color,str-style;
        };
        .
        . /* 定义其它图素 */
        .
    2.将各图素置于一条链表之中
    typedef struct tagElementList
        {
        char ElementType; /* 标识元素类别 */
        int ElementID; /* 元素标识符,在接口中用来控制其属性 */
        union tagElement {
        struct circle circle;
        struct box box;
        struct string string;
        struct line line;
        .
        .  /* 可在此说明其它元素 */
        .
        }Element;
        struct tagElementList *next;
    }ElementList;
    利用这种数据结构可在内存中形成一个图素链表,所有操作都可以此链表为基础。
    3.定义几个指针,以备各种操作
    ElementList *List-head. *List-end,*List-temp, *List-here;
    4.定义一个全局变量,记录图素个数
    static int Elementcount=0;
    图形文件格式为:第一字节(char),表示整个图形的背景颜色;接下来一个字(Word),对应于Elementcount,表示图素个数;后面是内存链表中每个图素的属性值。
    二、图形编辑功能的实现
    本软件包含的图形编辑功能主要有:作图、修改、移动、删除、复制,下面仅举几例说明实现的方法。
    1.作图
    以圆为例,其它图形类似。
    drawcircle()
    {
    int i;
    char s[20],c;
    int cx,cy,cr;
    int cls,clc,cfc,cfs;
    movecursor();   /* 移动光标,确定圆心 */
    cx=cursor-x;
    cy=cursor-y;
    movecursor();   /* 确定半径 */
    cr=(int)sqrt((cursor-x-cx)*(cursor-x-cx)+(cursor-y-cy)*(cursor-y-cy);
    setcolor(WH99vE);
    circle (cx,cy,cr);   /* 画圆 */
    cls=selectlinestyle();
    clc=selectcolor ("select-line-color");
    setcolor(clc);
    for(i=0;i<=cls;i++)
      circle(cx,cy,cr-i);
    cfs=selectfillstyle();
    cfc=selectcolor("set-fill-color");
    setfillstyle(cfs.cfc);
    floodfill(cx,cy,clc);   /* 填充 */
    temp(ElementList *) malloc(sizeof(ElementList));
     temp->ElementType= 'c';
     temp->Element.circle.x=cx;
     temp->Element.circle.y=cy;
     temp->Element.circle.r=cr;
     temp->Element.circle.lcolor=clc;
     temp->Element.circle.lstyle=cls;
     temp->Element.circle.fcolor=cfc;
     temp->Element.circle.fstyle=cfs;
     addtolist(temp); /* 将图素加入图素链表 */
    }
    其中 addtolist ()可以如下实现:
    addtolist (ElementList *Etemp)
    {
      if(List-head==NULL)
      {
        List-head=Etemp;
        List-end=Etemp;
      }
      else
      { List-end->next=Etemp;
        List-end=Etemp;
        Etemp->next=NULL;
      }
      Elementcount++;
    }
    2.图形的移动、删除、复制功能
    以移动为例,首先用箭头键或鼠标框取要移动的区域,区域矩形的左上,右下坐标分别为(block-x1,block-y1),(block-x2,block-y2),然后移动标识矩形到要到达的地方,确定。这样标识矩形的终止位置与初始位置存在一个偏差,水平与垂直偏差分别为dl-x,dl-y。
    接下来搜索内存图素链表,确定每个图素的外接矩形,判定外接矩形是否在初始标识矩形内,若在,则将该图素的坐标属性值改变dl-x,dl-y。清除图形区,根据新的图素链表作图。
    图形的删除功能类似,只需将符合条件的图素从链表中清除,再修改Elementcount值即可。
    拷贝图形则只需将符合条件的图素备份一个结点,修改结点的坐标属性值,再将该结点加入链表,相应增加Elementcount的值。
    以下为移动图形的代码。
    fnMove ()
    {
    Rect rect; /* 定义的矩形 */
    int i;
    selectblock (); /* 选择要移动的块 */
    moveblock (); /* 移动块 */
    List-temp=List-head;
    for (i=0;i<Elementcount; i++)
    {
      getrect (&rect, List-temp); /* 计算List-temp所指图素的外接矩形 */
      if (inblock(rect.x1,rect.x2,rect.y1.rect.y2))
    &nb

上一篇:Creating Reusable Software Libraries 人气:419
下一篇:C程序开发经典实例之3 人气:526
浏览全部C/C++的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐