发信人: 0123() 
整理人: jinhu(1999-07-13 10:42:24), 站内信件
 | 
 
 
利用终端控制码为FOXBASE增加图形功能 
 安徽南陵县建行计算机科 
 赵路 
 ---- 虽然在DOS系统中FOXBASE已逐步被FOXPRO所代替,但在XENIX系统中FOXBAS E仍在占有很大比例。由于 FOXBASE没有提供图形功能,要想在应用程序中作图就 必须借助于 C等其它语言,其实在XENIX系统中,一般的应用系统都是在终端上运 行的,而现在的终端基本上都是图文终端,终端本身就具有丰富的图形功能,并 提供了命令接口,有的还提供了C语言编的子程序库。 我们如果能了解接口命令 中的控制码的含意,灵活运用FOXBASE中的CHR()函数,也可以在终端上作出各种 图形。下面给出本人根据终端使用手册编写的FOXBASE画图过程文件,以供同行参 考。 
 
 ---- 说明:zf是只有一个数值型字段名为FF的库,内容为直方图和圆饼图中统计 对象的值;line是有二个数值型字段名分别为FX,FY的库,内容为折线图中各点 的坐标,其字段长度可根据实际需要来定。在实际运用中也可以采用其它的参数 传递形式来调用过程文件,对于直方图和圆饼图,当统计对象较多时,其图形的 填充方式还可参照终端的使用手册采用自定义图案,对程序稍加修改即可。本人 使用的终端为STAR-500中西文终端,系统为XENIX2.3.2。 
 
 ****draw.prg***
 *** 打点 ***
 proc dot
 ***(x,y)为点坐标***
 para x,y
 ? chr(27)+"!"+str(x)"+";"++str(y)+"f"
 retu
 *** 画线 ***
 proc line
 *** (x1,y1)(x2,y2)为两点坐标 ***
 para x1,y1,x2,y2
 ? chr(27)+"!"+str(x1)+";"+str(y1)+";"
 	+str(x2)+";"+str(y2)+"d"
 retu
 *** 画圆 ***
 proc circle
 *** (x0,y0)为圆心,r为半径,mode为填充类型 ***
 para x0,y0,r,mode
 ? chr(27)+"!"+str(x0)+";"+str(y0)+";"
 	+str(r)+";"+str(mode)+"c"
 retu
 *** 画矩形 ***
 proc rectangle
 *** (x1,y1)(x2,y2)为矩形对角坐标 ***
 para x1,y1,x2,y2
 ? chr(27)+"!"+str(x1)+";"+str(y1)+";"
 	+str(x2)+";"+str(y2)+"e"
 retu
 *** 画弧 ***
 proc arch
 *** (x0,y0)为圆心,r为半径,a1为起始角度,
 a2为终止角度,mode为填充类型***
 para x0,y0,r,a1,a2,mode
 ? chr(27)+"!"+str(x0)+";"+str(y0)+";"+str(r)
 	+";"+str(a1)+";"+str(a2)+";"+str(mode)+"g"
 retu
 *** 直方图过程文件 ***
 proc zf
 ***(x,y)为坐标系原点,max为直方图高度参考标准***
 para x,y,max
 use zf
 go top
 n=recc()
 clear
 a=600-x
 b=400-y
 i=1
 fac=0
 ?? chr(27)+"!"+str(x)+";"+str(y)+";"
 	+"600"+";"+str(y)+"t"
 ?? chr(27)+"!"+str(x)+";"+str(y)+";"
 	+str(x)+";"+"400"+"t"
 fac=int(a/(4*n+4))
 do while i7
   @ 0,i say chr(27)+"!"+str(x1)+";"+str(y1)
 	+";"+str(x2)+";"+str(y2)+";"+str(i-7)+"e"
 else
   @ 0,i say chr(27)+"!"+str(x1)+";"+str(y1)
 	+";"+str(x2)+";"+str(y2)+";"+str(i)+"e"
 endif
   i=i+1
   skip
 enddo
 use
 retu
 *** 折线图过程文件 ***
 proc bline
 *** (x,y) 为坐标原点 ***
 para x,y
 use line
 go top
 n=recc()
 a=600-x
 b=400-y
 i=1
 clear
 ?? chr(27)+"!"+str(x)+";"+str(y)
 	+";"+"600"+";"+str(y)+"t"
 ?? chr(27)+"!"+str(x)+";"+str(y)+";"
 	+str(x)+";"+"400"+"t"
 do while i<=n-1
 x1=fx+x
 y1=fy+y
 skip
 x2=fx+x
 y2=fy+y
 @ 0,i say chr(27)+"!"+str(x1)+";"+str(y1)
 	+";"+str(x2)+";"+str(y2)+"d"
 i=i+1
 enddo
 use 
 retu
 *** 圆饼图过程文件 ***
 proc pie
 *** (x,y) 为圆心,r为半径 ***
 para x,y,r
 use zf
 go top
 n=recc()
 clear
 i=1
 part=0
 part0=0
 sum1=0
 do while .not.eof()
 sum1=sum1+ff
 skip
 enddo
 go top
 do while i<=n
 part0=part
 part=part+360*ff/sum1
 if i=n
 @0,i say chr(27)+"!"+str(x)+";"+str(y)+";"
 	+str(r)+";"+str(part0)+";"+"360"+";"+"0"+"g"
 else
  if i>7
  @0,i say chr(27)+"!"+str(x)+";"+str(y)+";"+str(r)+";"
 	+str(part0)+";"+str(part)+";"+str(i-7)+";"+"g"
  else
  @0,Isay chr(27)+"!"+str(x)+";"+str(y)+";"
 	+str(r)+";"+str(part0)+";"+str(part)+";"+str(i)+"g"
  endif
 endif
 i=i+1
 skip
 enddo
 use
 retu
 
  -- HomePage:www.gw.com.cn   精灵世界欢迎您!!!
 www.gw.com.cn/games   精灵游戏咨讯正在建设中
  ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.102.155.212]
  | 
 
 
 |