设文无忧为首页 | 把文无忧加入收藏夹 | 站务联系     论文格式网:论文格文下载,论文格式大全,论文格式范例,如何写论文,怎么把握论文的格式,分类最全的论文范文格式网。
你所在的位置:首页 > 论文大全 > 工科论文 > 电子通信
电子通信:DOS界面下通用图形编辑软件的设计
DOS界面下通用图形编辑软件的设计
| 文章出自:论文网 | 编辑:论文格式 | 点击: | 2012-05-09 15:39:10 |


   摘 要 该文介绍了一种竖立在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(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)功能:不竖立链表,边读图形文件,边显示。该函数不占用内存,合用于图素多、数据文件较年夜,而又不需动态改造的图形画面显示。  

作者:汪建平 陆志才 
友荐云推荐
相关论文列表
文无忧论文格式网是一个专业提供各类论文的标准格式,标准论文格式范文,各类论文范文模板,免费论文下载,各类应用文文书、合同范文等的论文网站。
Copyright©2012-2046 文无忧. All Rights Reserved .心无界 文无忧—文无忧 让你行文无忧 版权所有 文无忧lun.wen5u.com-论文无忧
网站合法性备案号:蜀ICP备14013885号-1