点击这里给我发消息 点击这里给我发消息

C语言实现键盘画图

添加时间:2013-12-7
    相关阅读: 开发 程序 C语言 系统

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环境下运行通过,使用效果良好。可以根据具体需要,对该程序进行扩充,以增加绘图功能。

相关C语言实现键盘画图

咨询热线:020-85648757 85648755 85648616 0755-27912581 客服:020-85648756 0755-27912581 业务传真:020-32579052
广州市网景网络科技有限公司 Copyright◎2003-2008 Veelink.com. All Rights Reserved.
广州商务地址:广东省广州市黄埔大道中203号(海景园区)海景花园C栋501室
= 深圳商务地址:深圳市宝源路华丰宝源大厦606
研发中心:广东广州市天河软件园海景园区 粤ICP备05103322号 工商注册