1. gzyueqian
      18529173453
      首頁 > 新聞中心 > > 正文

      用C語言實現鍵盤畫圖

      更新時間: 2007-05-31 14:29:54來源: 粵嵌教育瀏覽量:801


        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環境下運行通過,使用效果良好。可以根據具體需要,對該程序進行擴充,以增加繪圖功能。

      免費預約試聽課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 中文字幕在线第一页 | 一本大道AV伊人久久综合 | 中国老熟女精品久久国产精 | 日韩∧V精品在线 | 开心五月激情中文在线观看 | 亚洲高清网站在线 |