利用WINDOWS API 为FOXPRO增加作图功能
戴立群
FOXPRO 2.6 FOR WINDOWS是一种功能强大的数据库语言,如果能作出各类漂亮的图表、图形,那将是激动人心的,遗憾的是,它在图形处理方面功能较弱。虽然可用它作出矩形、椭园、园形、直线,但如果想作一个复杂的图形,就有些力不从心了。WINDOWS API中提供了大量的函数,其中包括了作图功能的函数,是否可以利用这些函数来为FOXPRO 2.6 FOR WINDOWS 增加作图功能呢?答案是肯定的。FOXPRO 2.6 FOR WINDOWS 提供了一个工具FOXTOOLS.FLL,通过它提供的两个函数(REGFN 和 CALLFN),就可以使用WINDOWS API 中的函数了,其中REGFN 是登记一个函数,而CALLFN是执行一个函数,这两个函数的具体使用格式可参见FOXPRO 2.6 提供的文件FOXTOOLS.WRI。通过REGFN 和 CALLFN还可扩展FOXPRO其它方面的功能。
以下给出了使用WINDOWS API中部分作图函数的例子,若要使用其它作图函数,可参考WINDOWS API函数说明。
附:GRAPHLIB.PRG 作图函数库
DEMO.PRG 演示程序
***********************************
*程序名:GRAPHLIB。PRG
*功能:提供作图的函数的集合
*作者:戴立群
*日期:96/02/20
***********************************
PROCEDURE SETGRAPH
*图形初始化
CLEAR WINDOW
SET LIBRARY TO SYS(2004)+"foxtools.fll" ADDITIVE
PUBLIC HDC,HWND,COLOR
public Hsetpix,Hmoveto,Hlineto,Hpie,Hchord,Hrect,Hellipse
Hsetpix= REGFN("SetPixel", "IIIL", "I") &&以下为登录作图函数
Hmoveto=REGFN("MoveTo",'III' , "I")
Hlineto=REGFN("LineTo","III","I")
Hrect=REGFN("Rectangle","IIIII","I")
Hellipse=REGFN("Ellipse","IIIII","I")
Hpie=REGFN("Pie","IIIIIIIII","I")
Hchord=REGFN("Chord","IIIIIIIII","I")
PRIVATE FH,FH1
FH = REGFN("GetActiveWindow",'' , "I")
FH1 = REGFN("GetDC",'I' , "I")
HWND=CALLFN(FH) &&取得窗口句柄
HDC=CALLFN(FH1,HWND) &&取得设备句柄
RETURN
PROCEDURE PUTPIXEL
*画点函数
PARA X,Y,COLOR &&起点坐标(X,Y),颜色COLOR
*注:颜色值可由F_RGB()获得
=CALLFN(hsetpix,HDC,X,Y,COLOR)
RETURN
PROCEDURE FLINE
* 画线函数
PARA X1,Y1,X2,Y2 &&起点坐标,终点坐标
=CALLFN(HMOVETO,HDC,X1,Y1)
=CALLFN(HLINETO,HDC,X2,Y2)
RETURN
PROCEDURE SETPEN
*设置画笔
PARA P_COLOR,P_PEN,P_PENWIDTH &&颜色,线型,线宽
PRIVATE HCREATPEN,HPEN,HSELEOBJ,HPENOLD
HCREATPEN=REGFN("CreatePen","IIL","I")
HPEN = CALLFN(HCREATPEN,P_PEN,P_PENWIDTH,P_COLOR)
HSELEOBJ=REGFN("SelectObject","II","I")
HPENOLD=CALLFN(HSELEOBJ,HDC,HPEN)
RETURN
PROCEDURE RECT
*画矩形
PARA X1,Y1,X2,Y2 &&起点坐标,终点坐标
=CALLFN(hrect,HDC,X1,Y1,X2,Y2)
RETURN
PROCEDURE CIRCLE
*画园
PARA X,Y,LENGTH &&园心,半径
=CALLFN(hellipse,HDC,X-LENGTH,Y-LENGTH,X+LENGTH,Y+LENGTH)
PROCEDURE PIE
*扇形
PARA X1,Y1,X2,Y2,XEND1,YEND1,XEND2,YEND2
=CALLFN(Hpie,HDC,X1,Y1,X2,Y2,XEND1,YEND1,XEND2,YEND2)
RETURN
PROCEDURE CHORD
PARA X1,Y1,X2,Y2,XEND1,YEND1,XEND2,YEND2
=CALLFN(Hchord,HDC,X1,Y1,X2,Y2,XEND1,YEND1,XEND2,YEND2)
RETURN
PROCEDURE LINETO
*连线
PARA X,Y &&终点坐标
=CALLFN(HLINETO,HDC,X,Y)
RETURN
PROCEDURE SETFILL
*设置填充模式
PARA STYLE
PRIVATE HGETSTOCK,HSELECTOBJ,HSETFILL
HGETSTOCK=REGFN("GetStockObject","I","I")
HSELECTOBJ=REGFN("SelectObject","II","I")
HSETFILL=REGFN("SetPolyFillMode","II","I")
=CALLFN(HSELECTOBJ,hdc, CALLFN(HGETSTOCK,STYLE))
=CALLFN(HSETFILL,HDC,1)
RETURN
PROCEDURE MOVETO
*移动画笔
PARA X,Y &&画笔位置
=CALLFN(HMOVETO,HDC,X,Y)
RETURN
PROCEDURE SETCURSOR
*设置鼠标形壮
PARA SHARP
PRIVATE HSETCSR,LOADCSR
HSETCSR = REGFN("SetCursor", "I", "I")
LOADCSR = REGFN("LoadCursor", "IL", "I")
=CALLFN(HSETCSR,CALLFN(LOADCSR, 0, SHARP))
RETURN
PROCEDURE OUTTEXT
*输出文本
PARA X,Y,P_STRING &&起点坐标,字符串
PRIVATE HTEXTOUT
HTEXTOUT=regfn("TextOut","IIICI","I")
=CALLFN(HTEXTOUT,HDC,X,Y,P_STRING,LEN(P_STRING))
RETURN
FUNCTION F_RGB
*转换成颜色值
PARA R,G,B &&红、绿、蓝颜色分量
PRIVATE COLOR
COLOR=R*256*256+G*256+B
RETURN COLOR
PROCEDURE SETCOLOR &&设置文本前景颜色
PARA COLOR
PRIVATE HSETCOLOR
HSETCOLOR=REGFN("SetTextColor","IL","I")
=CALLFN(HSETCOLOR,HDC,COLOR)
RETURN
PROCEDURE SETBKCOLOR &&设置文本背景颜色
PARA COLOR
PRIVATE HSETBKCOLOR
HSETBKCOLOR=REGFN("SetBkColor","IL","I")
=CALLFN(HSETCOLOR,HDC,COLOR)
RETURN
******************************************
*调用WINDOWS API 作图演示程序
*DEMO。PRG
*****************************************
set proc to graphlib.prg
=setgraph() &&初始化图形
=SETPEN(F_RGB(255,0,0),0,1) &&红色,实线,线宽为1的画笔
=CIRCLE(100,200,50) &&画园
=FLINE(0,0,100,200) &&画斜线
=RECT(100,100,200,200)
=PIE(0,0,100,100,50,50,90,50)
=SETPEN(F_RGB(0,255,0),0,4) &&绿色,实线,线宽为4的画笔
=MOVETO(100,300)
=LINETO(400,200)
=SETCOLOR(F_RGB(0,0,255))
=SETBKCOLOR(F_RGB(0,255,0))
=OUTTEXT(200,300,'THAT IS O.K...') &&输出文本
COLOR=F_RGB(0,255,255)
FOR I=1 TO 200
=PUTPIXEL(200+I,300-I,COLOR) &&画点
ENDFOR