分享
 
 
 

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

王朝other·作者佚名  2008-06-01
窄屏简体版  字體: |||超大  

摘 要 该文介绍了一种建立在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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有