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

用C语言实现键盘画图

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

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;
   

#p#副标题#e#

    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号 工商注册