利用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函数说明。

*程序名:GRAPHLIBPRG

*功能:提供作图的函数的集合

*作者:戴立群

*日期: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 &&起点坐标(XY),颜色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 作图演示程序

*DEMOPRG

*****************************************

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