论坛风格切换
 
  • 帖子
  • 日志
  • 用户
  • 版块
  • 群组
帖子
购买邀请后未收到邀请联系sdbeta@qq.com
  • 4259阅读
  • 7回复

[求助-硬件]用C语言实现键盘画图 [复制链接]

上一主题 下一主题
离线ylj-18
 
发帖
*
今日发帖
最后登录
1970-01-01
只看楼主 倒序阅读 使用道具 楼主  发表于: 2010-05-07 20:18:30
— 本帖被 加贝518 执行锁定操作(2010-07-27) —
1.引言

  笔者在开发县级电网调度自动化系统的过程中,碰到一个要绘制电力系统一次接线图的问题。由于电力系统一次接线图比较复杂,图上有一
些特殊的符号,象变压器符号、开关符号等等,用一般的编程方法来绘制比较困难,因此,笔者用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 */
else
k2=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环境下运行通过,使用效果良好。可以根据具体需要,对该程序进行扩充,以增加绘图功能。
离线加贝518

发帖
26274
今日发帖
最后登录
2015-10-24
只看该作者 沙发  发表于: 2010-05-07 20:44:08
这个C语言,效果不错。

不过,发错地方了
[ 此帖被加贝518在2010-05-07 20:44重新编辑 ]
离线suy1000
发帖
*
今日发帖
最后登录
1970-01-01
只看该作者 板凳  发表于: 2010-05-07 22:12:57
应该发到技术区去
离线csq8295131
发帖
*
今日发帖
最后登录
1970-01-01
只看该作者 地板  发表于: 2010-05-08 09:11:03
学习一下   帮助学C了
离线不用动手
发帖
*
今日发帖
最后登录
1970-01-01
只看该作者 地下室  发表于: 2010-05-08 10:54:31
发错地方了

发帖
2421
今日发帖
最后登录
2016-09-15
只看该作者 5 发表于: 2010-05-16 21:15:00
用户被禁言,该主题自动屏蔽!

发帖
2421
今日发帖
最后登录
2016-09-15
只看该作者 6 发表于: 2010-05-17 17:46:29
用户被禁言,该主题自动屏蔽!
离线无疆驴者
发帖
*
今日发帖
最后登录
1970-01-01
只看该作者 7 发表于: 2010-05-29 16:51:58
不错,多谢楼主