| 网站首页 | 文秘范文 | 论文中心 | 小品剧本 | 小说 | 藏金阁 | 留言簿 | 汇款帮助 | 客服中心 | FAQ | 电视 | 免费文秘 | 代写 | | |
您现在的位置: 中国文秘网 >> 论文中心 >> 计算机类论文 >> 正文 | 用户登录 新用户注册 |
→中国文秘网温馨提示:为方便你访问本站,请将本站设为首页或加入收藏夹中(点击加入收藏)。 |
紧急公告:近来发现有些不法网站复制本站版面进行欺骗,为防止上当,敬请会员记好本站网址或把本站加入收藏夹中。 |
轻松入会,年卡、点卡任君选择,QQ及电话24小时服务,付款后5分钟开通,在线QQ:87651921 ,客服电话:013923833528,详情见"汇款须知" |
|
|||||
DOS界面下通用图形编辑软件的设计 | |||||
作者:佚名 论文来源:中国文秘网 点击数:2453 更新时间:2006-4-5 | |||||
将此页收藏到: 网摘中国 | 新浪 | 热门 | Hao6 | 和讯 | 天极 | YouNote | 5Seek | 365Fav | 365key |博采 | 亿友响享 | 狐摘 | |||||
目前用作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(WHITE); 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)) /* 判断外接矩形是否在所选块内 */ change (List-temp, dl-x,dl-y); /* 改变图素的坐标属性 */ List-temp=List-temp->next; } clearscreeen (); /* 清除作图区 */ drawlink (); /* 依据图素链表画图 */ } 其中,change ( )可以实现如下。 change(ElementList *Ctemp, int dl-x,int dl-y) { switch (Ctemp->ElementType) { case 'c': Ctemp->Element.circle.x+=dl-x; Ctemp->Element.circle.y+=dl-y; break; case 'b': Ctemp->Element.box.x1+=dl-x; Ctemp->Element.box.x2+=dl-x; Ctemp->Element.box.y1+=dl-y; Ctemp->Element.box.y2+=dl-y; break; case 'l': Ctemp->Element.line.x1+=dl-x; Ctemp->Element.line.y1+=dl-y; Ctemp->Element.line.x2+=dl-x; Ctemp->Element.line.y2+=dl-y; break; case 's': Ctemp->Element.string.x+=dl-x; Ctemp->Element.string.y+=dl-y; break; . . . } } 三、文件功能的实现 存盘时,打开文件,写入图形的背景颜色,写入图素个数Elementcount,再将内存链表中各图素的属性值依次写入文件即可。 读盘时,在内存中动态建立图素链表,将文件中的图素属性值依次放入链表中,再根据背景颜色、图素属性值在屏幕上显示图形。 存盘过程实现如下。 savefile(char * filename) { FILE *fp; int i; List-temp=List-head; Eid=0; if((fp=fopen(filename,"w+b"))==NULL) { printf ("%s", "Cant't open the file "); exit(1); } fwrite(&back-color, sizeof(char),1,fp); fwrite(&Elementcount,sizeof(int),1,fp); for(i=0;i<Elementcount;i++) { List-temp->ElementID=Eid; fwrite(List-temp,sizeof(ElementList),1,fp); List-temp=List-temp->next; Eid++; } fclose(fp); } 四、应用程序编程接口 应用程序编程接口主要功能是读图形文件并显示,对画面图素进行动态刷新。这些接口均以函数形式出现,供控制应用程序调用。 1.draw-chart (char * filename)功能:读图形文件,在内存中建立图素链表,显示图形。 2.change-chart(int Element-ID, int how)功能:改变图素Element-ID的特性,怎样改变由how决定。该接口能方便地实现图形的动态刷新。 3.clear-chart( )功能:释放图素链表占用的内存。 4.draw ( char * filename)功能:不建立链表,边读图形文件,边显示。该函数不占用内存,适用于图素多、数据文件较大,而又不需动态刷新的图形画面显示。 作者:汪建平 陆志才 转贴于 中国文秘网 http://www.zgwmw.com 《DOS界面下通用图形编辑软件的设计》来源于中国文秘网,中国最专业的文秘网站,欢迎阅读DOS界面下通用图形编辑软件的设计。 |
|||||
论文录入:中国文秘网 责任编辑:中国文秘网 | |||||
【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 |
最新热点 | 最新推荐 | 相关论文 | ||
在Windows中显示多幅彩色图像… Windows NT/2000系统下进程的… 展OSH体系认证提高安全生产科… 关于质量(Q)、环境(E)和… 浅论我国推行OSHMS存在的主要… 在Windows中显示多幅彩色图像… 用FDISK重建DOS硬盘主引导记… DOS界面下通用图形编辑软件的… 基于Windows NT平台网站的结… |
网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
| 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 管理登录 | | |
Copyright © 2005-2012 中国文秘网 WWW.ZGWMW.COM 版权所有 中华人民共和国信息产业部ICP编号:粤ICP备05123715号
在线客服 QQ:87651921 客服电话:(0)13923833528
本站实名:中国文秘网
注意:本站的文章只提供会员交流、参考用,旨在提高会员的写作能力和拓宽写作思路,请不要将本站文章转载或拿去发表,由此引起的后果会员自负;另外本站的文章部分来源于网络,如发现有侵权行为,请第一时间联系我们管理员给予删除!
站长:卧龙先生 Powered By Edong.com |