如何用C语言实现画图程序

在开发县级电网调度自动化系统的过程中,碰到一个要绘制电力系统一次接线图的问题。由于电力系统一次接线图比较复杂,图上有一些特殊的符号,象变压器符号、开关符号等等,用一般的编程方法来绘制比较困难,因此,小编用C语言开发了一个手工绘制电力系统一次接线图的键盘绘图程序,使用该程序绘制的一次接线图符合用户需求,效果良好。

2.使用方法


(相关资料图)

程序中定义了几个特殊键:

"V”:画笔提起

"W”:开始画图

"R”:开始擦图

"S”:当前图形存入文件

"E”:调出已有文件

"C”:画圆

程序一运行,屏幕上出现一个黄色的边框来设定画图的区域,区域中间出现提起的画笔符号 ,当按下”W“键时,画笔符号变为 ,此时可移动方向键(上、下、左、右、左上、左下、右上、右下)来画图;当按下”R“键时,画笔符号变为 ,此时可移动方向键来擦图;在画图过程中,按下“C”键,可画出一个半径为20个象素点的圆;当结束画图时,按下“S”键,将画好的图形存盘;按下“E”键可调出已有的图形进行编辑。

3.源程序清单

# include "graphics.h"# include "stdio.h"# include "fcntl.h"# include "stdlib.h"main()void save(),load();void *wg,*rg,*vg,*fy;int driver,mode;int c=RED;int x=320,y=225;int x1,y1,x2,y2;int k,k1,k2;/* initialize grapher */detectgraph(&driver,&mode);initgraph(&driver,&mode,"c:\tc");/* write the pen */bar(200,10,206,16);line(203,7,200,10);line(203,7,206,10);line(243,7,240,16);line(243,7,246,16);line(283,7,280,10);line(283,7,286,10);line(283,7,283,16);/* save the pen */wg=malloc(imagesize(200,7,206,16));rg=malloc(imagesize(240,7,246,16));vg=malloc(imagesize(280,7,286,16));fy=malloc(imagesize(200,7,206,16));getimage(200,7,206,16,wg);getimage(240,7,246,16,rg);getimage(280,7,286,16,vg);cleardevice();/* write the box */setcolor(YELLOW);rectangle(4,19,637,447);x1=x-3;y1=y+1;x2=x+3;y2=y+10;getimage(x1,y1,x2,y2,fy);putimage(x1,y1,vg,XOR_PUT);/* receive the command */for (;;)while (bioskey(1)==0);k=bioskey(0);putimage(x1,y1,fy,AND_PUT);if (((k&0x00ff)|0x00)==0)k1=k&0xff?0:k>>8; /* k1 is the specialkey value */elsek2=k&0x00ff; /* k2 is the non-specialkey value */if (((k&0x00ff)|0x00)==0) /* Special key */switch(k1)case 45:restorecrtmode();exit(0);case 72:if (y>20)y=y-1;break;case 75:if (x>5)x=x-1;break;case 77:if (x<636)x=x+1;break;case 80:if (y<446)y=y+1;break;case 71:if ((x>5)&&(y>20))x=x-1;y=y-1;break;case 79:if ((x>5)&&(y<446))x=x-1;y=y+1;break;case 73:if ((x<636 y="">20))x=x+1;y=y-1;break;case 81:if ((x<636)&&(y<446))x=x+1;y=y+1;break;x1=x-3;y1=y+1;x2=x+3;y2=y+10;getimage(x1,y1,x2,y2,fy);/* non-special key */switch(k2)case 118: /* "v" */case 86: /* "V" */putimage(x1,y1,vg,OR_PUT);break;case 119: /* "w" */case 87: /* "W" */putimage(x1,y1,wg,OR_PUT);putpixel(x,y,c);break;case 114: /* "r" */case 82: /* "R" */putimage(x1,y1,rg,OR_PUT);putpixel(x,y,BLACK);break;case 115: /* "s" */case 83: /* "S" */save("pic.dat");break;case 101: /* "e" */case 69: /* "E" */load("pic.dat");break;case 99: /*"c"*/case 67: /*"C"*/setcolor(RED);circle(x,y,20);break;default:continue;/* function for screen picture save*/void save(char *fname)FILE *fp;int i;register long j;char far *ptr;fp=fopen(fname,"wb");for(i=0;i<4;i++)outportb(0x3CE,4);outportb(0x3CF,i);ptr=(char far *) 0xA0000000L;for (j=0;j<38400L;j++)putc(*ptr,fp);ptr++;fclose(fp);outportb(0x3CF,0);/* function for screen picture display*/void load(char *fname)FILE *fp;register int i;int k4=1;register long j;char far *ptr;fp=fopen(fname,"rb");for (i=0;i<4;i++)outportb(0x3C4,2);outportb(0x3C5,k4);ptr=(char far *)0xA0000000L;for (j=0;j<38400L;j++)*ptr=getc(fp);ptr++;k4*=2;fclose(fp); outportb(0x3C5,0xF);

4.总结

该程序在Turbo C 2.0环境下运行通过,使用效果良好。可以根据具体需要,对该程序进行扩充,以增加绘图功能。

时间财富网为广大企业、商家、个人,提供平面设计、装修设计、建筑设计、起名改名、策划文案、网站建设、营销推广等服务。若您有类似需要,请点击立即发布项目

另,时间财富网上也有着各式各样的任务,无论您是拥有技能的专业人士,还是技术小白。都能在时间财富网上找到您能参与的项目。点击进入悬赏大厅

无论你有什么疑难杂症,威客们都能一一为您解决,点击进入:问答平台。

关键词: 如何用C语言实现画图程序