C语言编辑中应用画图程序技巧

所属分类: 软件教程 / 编程开发 阅读数: 1691
收藏 0 赞 0 分享

  在开发县级电网调度自动化系统的过程中,碰到一个要绘制电力系统一次接线图的问题。由于电力系统一次接线图比较复杂,用一般的编程方法来绘制比较困难,因此,用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环境下运行通过,使用效果良好.可以根据具体需要,对该程序进行扩充,以增加绘图功能.

更多精彩内容其他人还在看

Unity3D摄像机跟随小球移动而不旋转的设置方法

Unity3D中怎样让摄像机跟随小球移动而不旋转?Unity3D中使用摄像机拍小球,它在移动的过程中,自身是不断旋转的,所以,摄像机也会跟着一起旋转,怎么让摄像机不转呢?请看下文详细介绍
收藏 0 赞 0 分享

Myeclipse断点不起作用出现斜线该怎么办呢?

Myeclipse断点不起作用出现斜线该怎么办呢?Myeclipse断点处如果出现斜线,那就说明断点不起作用了,该怎么处理这种情况呢?下面我们一起来看看详细的解决办法,需要的朋友可以参考下
收藏 0 赞 0 分享

Visual Studio中无法查找或打开PDB文件怎么办?

Visual Studio中无法查找或打开PDB文件怎么办?在VS底部的“输出”框中提示“无法查找或打开 PDB 文件”,出现这个问题该怎么解决呢?下面我们来看看详细的解决办法,需要的朋友可以参考下
收藏 0 赞 0 分享

VS2013调试代码时怎么避免加载符号?

VS2013调试代码时怎么避免加载符号?VS2013调试代码时候,当电脑接入网络后系统会自动从Microsoft 符号服务器加载PDB符号文件,一旦加载符号就会变得很慢,下面我们来看看详细的解决办法
收藏 0 赞 0 分享

eclipse怎么更换工作空间?eclipse更换工作区的方法

eclipse怎么更换工作空间?eclipse经常编辑代码,eclipse默认的的工作区在C盘,经常使用eclipse写代码会导致C盘空间缩小,该怎么更换工作区呢?下面我们来看看eclipse更换工作区的方法
收藏 0 赞 0 分享

vs2010怎么更换默认的起始页?vs2010起始页添加命令按钮的方法

vs2010怎么更换默认的起始页?vs2010起始页就是vs启动的时候默认打开的页面,当然我们可以根据自己的需要来设置起始页,下面我们来看看vs2010起始页添加命令按钮的方法
收藏 0 赞 0 分享

eclipse中sdk与adt版本不兼容该怎么解决? 三种方法帮你搞定

eclipse中sdk与adt版本不兼容该怎么解决?出现这种问题基本上是因为sdk版本过高,今天我们来看看三种比较简单的解决办法,图文教程很简单,需要的朋友可以参考下
收藏 0 赞 0 分享

vb怎么输出菱形图案?vb绘制菱形的教程

vb怎么输出菱形图案?vb编辑的代码可以实现很多功能,今天我们就来看看怎么使用vb绘制菱形图案,这篇教程很简单,适合新手学习,需要的朋友可以参考下
收藏 0 赞 0 分享

Android Studio怎么导出设置?

Android Studio怎么导出设置?Android Studio中设置了很多符合自己习惯的东西,但是如果重新安装软件,之前设置的东西都会消失,该怎么将这些设置导出来呢?下面我们一起来看看详细教程
收藏 0 赞 0 分享

怎么使用arcgis对进行地图投影?

怎么使用arcgis对进行地图投影?没有投影过的地图该怎么投影?我们想将是西安80的shp数据,但是一般的搜不带号,想转换成带号的,就需要使用arcgis对进行地图投影,详细教程请看下文
收藏 0 赞 0 分享
查看更多