C语言编辑中应用画图程序技巧
在开发县级电网调度自动化系统的过程中,碰到一个要绘制电力系统一次接线图的问题。由于电力系统一次接线图比较复杂,用一般的编程方法来绘制比较困难,因此,用C语言开发了一个手工绘制电力系统一次接线图的键盘绘图程序,使用该程序绘制的一次接线图符合用户需求,效果良好。下面小编给大家分享下技巧,希望可以帮助到大家解决困难。
一、使用方法
程序中定义了几个特殊键:
\"V":画笔提起
\"W":开始画图
\"R":开始擦图
\"S":当前图形存入文件
\"E":调出已有文件
\"C":画圆
程序一运行,屏幕上出现一个黄色的边框来设定画图的区域,区域中间出现提起的画笔符号 ,当按下"W"键时,画笔符号变为 ,此时可移动方向键(上、下、左、右、左上、左下、右上、右下)来画图;当按下"R"键时,画笔符号变为 ,此时可移动方向键来擦图;在画图过程中,按下"C"键,可画出一个半径为20个象素点的圆;当结束画图时,按下"S"键,将画好的图形存盘;按下"E"键可调出已有的图形进行编辑.
二、源程序清单
# 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 */[Page]
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);
三、结束语
该程序在Turbo C 2.0环境下运行通过,使用效果良好.可以根据具体需要,对该程序进行扩充,以增加绘图功能.
相关文章
vscode怎么检测工作区是否有问题? vscode调出问题指令的两种方法
vscode中可以检查是否有问题,如果有问题该怎么调出有问题的指令呢?下面我们就来看看详细的教程2024-09-28怎么在VScode中设置账号同步? Vscode账号同步的实现方法
VScode是一款免费开源的现代化轻量级代码编辑器,使用该软件时,可以设置账号同步,今天小编就来说明一下具体的操作步骤2024-09-28VSCode如何格式化XML? VSCode实现UltraEdit中XML格式化的方法
最近很喜欢使用 VS Code,所以会遇到很多 VS Code 的日常使用问题,比如,我想要在 VS Code 中实现 UltraEdit 中 XML 格式化的问题,该如何做呢?详细请看下文介绍2024-09-26VScode编译python画布闪现怎么办? 只加两行代码即可解决
vscode使用python画图时闪退,该怎么解决这个问题呢?我们只需要添加两行代码就可以了,详细请看下文介绍2024-09-26vscode怎么运行vue代码? vscode启动vue项目的教程
vscode可以运行vue项目,该怎么运行呢?下面我们就来看看新手第一次运行vue项目的方法,详细请看下文介绍2024-09-26Vscode怎么拆分窗口? Vscode拆分编辑器窗口实现分屏显示技巧
Vscode编辑代码的时候,想要分屏,该怎么操作呢?我们可以拆分编辑器窗口,比如上下拆分,左右拆分等等,详细请看下文介绍2024-09-26怎么让vscode显示文件图标? vscode添加icon文件图标的教程
可以使VScode左侧的资源管理器根据文件类型显示图标,要在VSCode中显示文件夹图标,可以按照以下步骤进行操作2024-09-26助力开发者迅速上手! Visual Studio Code推出Office加载项开发工具预览
这一工具包旨在为开发者提供便捷的加载项开发平台,尤其是那些希望仅通过manifest文件来开发XML格式加载项的开发者,详细请看下文介绍2024-09-10- JDK是java软件开发包的简称,要想开发java程序就必须安装JDK,没有JDK的话,无法编译Java程序,很多朋友安装不会配置环境,这里就为大家提供了具体的安装与配置方法,需要的2024-07-04
TypeScript5.5更新! VS Code使用TypeScript的技巧
微软前两天昨日正式发布 TypeScript 5.5,开发者如果在 Visual Studio 和 VS Code 等编辑器中使用 TypeScript,还能实现自动完成、代码导航和重构等功能,通过一下命令可以2024-06-22
最新评论