论文网首页|会计论文|管理论文|计算机论文|医药学|经济学论文|法学论文|社会学论文|文学论文|教育论文|理学论文|工学论文|艺术论文|哲学论文|文化论文|外语论文|论文格式
中国论文网

用户注册

设为首页

您现在的位置: 中国论文网 >> 计算机论文 >> 软件工程论文 >> 正文 会员中心
 计算机应用论文   计算机理论论文   计算机网络论文   电子商务论文   软件工程论文   操作系统论文   通信技术论文
DOS界面下通用图形编辑软件的设计(1)

摘 要 该文介绍了一种建立在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;
利用这种数据结构可在内存中形成一个图素链表,所有操作都可以此链表为基础。www.11665.com
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{
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{ 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)功能:不建立链表,边读图形文件,边显示。该函数不占用内存,适用于图素多、数据文件较大,而又不需动态刷新的图形画面显示。

 

  • 上一个计算机论文:
  • 下一个计算机论文:
  •  作者:佚名 [标签: 界面 通用图 软件 ]
    姓 名: *
    E-mail:
    评 分: 1分 2分 3分 4分 5分
    评论内容:
    发表评论请遵守中国各项有关法律法规,评论内容只代表网友个人观点,与本网站立场无关。
    浅析Mostaganem700套项目工期索赔案例
    初探WindowsServer2003操作系统的安全配置
    浅谈利用GHOST软件维护操作系统
    《中文Windows 2003操作系统》教案
    展望Dextroscope虚拟现实手术规划系统在神经
    PHOTOSHOP教学网站的应用研究
    LabWindows/CVI的应用特点
    基于RRAS与虚拟专用网技术在Windows中的实现
    微软发布Windows8操作系统
    触摸Windows8
    避免误删,找回Windows8删除文件确认对话框
    Windows8是微软的翻身之战
    | 设为首页 | 加入收藏 | 联系我们 | 网站地图 | 手机版 | 论文发表

    Copyright 2006-2013 © 毕业论文网 All rights reserved 

     [中国免费论文网]  版权所有