请教高手:我现在想实现在VFP中绘制曲线,该曲线是由许多坐标点构成,我想实现的功能是将这些坐标点通过某种算法绘制成曲线,并显示出来,且能够打印出来,最好是够附带一些用于计算诸如两点距离等的算法,我想问题有点难度,但我更相信网络高手很多,一定有办法解决的,谢谢!
---------------------------------------------------------------
参考地址:
http://www.gz9f.com/bbs/printpage.asp?boardID=1&ID=281450
http://www.gz9f.com/bbs/printpage.asp?boardid=1&id=284270
http://www.gz9f.com/bbs/printpage.asp?BoardID=1&ID=280004
--------------------------------------------------------------
有关 MSGraph 详细例程可以到这里下载.
http://www.foxer.net/lun/dispbbs.asp?BoardID=10&ID=2951
---------------------------------------------------------------
可以用VFP9的GDI+画点连线并保存成图片,然后进行打印。下面是我做的一个示例,可以把你所要绘制的点的坐标依次填充到一个数组中,然后进行绘制。DrawLines类中GetLength方法用于计算两点间的距离。
test.prg:
SET SAFETY OFF
LOCAL laArray[6, 5], loDrawLines
laArray[1, 1] = 100
laArray[1, 2] = 100
laArray[2, 1] = 200
laArray[2, 2] = 100
laArray[3, 1] = 200
laArray[3, 2] = 50
laArray[4, 1] = 300
laArray[4, 2] = 50
laArray[5, 1] = 300
laArray[5, 2] = 100
laArray[6, 1] = 400
laArray[6, 2] = 100
loDrawLines = CREATEOBJECT("DrawLines")
loDrawLines.UpdatePoints(@laArray)
loDrawLines.ImageWidth = 500
loDrawLines.ImageHeight = 500
loDrawLines.LineColor = GETCOLOR()
loDrawLines.FileName = PUTFILE("", "", "JPG")
IF loDrawLines.LineColor > 0 AND EMPTY(loDrawLines.FileName) = .F.
loDrawLines.DrawLine()
ENDIF
DEFINE CLASS DrawLines AS Custom
ImageWidth = 400
ImageHeight = 400
LineColor = RGB(0, 0, 0)
FileName = [TEMP.JPG]
DIMENSION Points[1, 2]
PROCEDURE Init
SET CLASSLIB TO HOME() + "FFC\_GDIPLUS.VCX" ADDITIVE
ENDPROC
PROCEDURE UpdatePoints
LPARAMETERS taArray
PRIVATE lnRowCount, lnColumnCount, i, j
lnRowCount = ALEN(taArray, 1)
lnColumnCount = ALEN(taArray, 2)
DIMENSION THIS.Points[lnRowCount, lnColumnCount]
FOR i = 1 TO lnRowCount
FOR j = 1 TO lnColumnCount
THIS.Points[i, j] = taArray[i, j]
ENDFOR
ENDFOR
ENDPROC
PROCEDURE DrawLine
LOCAL lcTempFile, lcFile, loImage, loGraphics, loColor, loPen, i, j
IF FILE(THIS.FileName) = .T.
lcTempFile = THIS.FileName
ELSE
lcTempFile = ADDBS(SYS(2023)) + SUBSTR(SYS(2015), 3, 10) + ".BMP"
TEXT TO lcFile NOSHOW
424D3A0000000000000036000000280000000100000001000000010018000000000004000000C40E0000C40E00000000000000000000FFFFFF00
ENDTEXT
= STRTOFILE(STRCONV(lcFile, 16), lcTempFile)
ENDIF
loImage = CREATEOBJECT("GpImage")
loImage.CreateFromFile(lcTempFile)
IF FILE(THIS.FileName) = .F.
loImage = loImage.GetThumbnailImage(THIS.ImageWidth, THIS.ImageHeight)
ENDIF
loGraphics = CREATEOBJECT("GpGraphics")
loGraphics.CreateFromImage(loImage)
loColor = CREATEOBJECT("GpColor")
loColor.FoxRGB = THIS.LineColor
loPen = CREATEOBJECT("GpPen", loColor)
FOR i = 1 TO (ALEN(THIS.Points, 1) - 1)
loGraphics.DrawLine(loPen, THIS.Points[i, 1], THIS.Points[i, 2], THIS.Points[i + 1, 1], THIS.Points[i + 1, 2])
ENDFOR
loImage.SaveToFile(THIS.FileName, "image/jpeg", "quality=100")
IF FILE(THIS.FileName) = .F.
DELETE FILE (lcTempFile)
ENDIF
ENDPROC
PROCEDURE GetLength
LPARAMETERS tnX1, tnY1, tnX2, tnY2
RETURN ((tnX1 - tnX2)^2 + (tnY1 - tnY2)^2)^0.5
ENDPROC
ENDDEFINE
---------------------------------------------------------------
DrawLines.prg:
------------------------------------------------------------
DEFINE CLASS DrawLines AS Custom
ImageWidth = 400
ImageHeight = 400
LineColor = RGB(0, 0, 0)
FileName = [TEMP.JPG]
DIMENSION Points[1, 2]
PROTECTED Safety
PROCEDURE Init
SET CLASSLIB TO HOME() + "FFC\_GDIPLUS.VCX" ADDITIVE
THIS.Safety = SET("Safety")
SET TALK OFF
ENDPROC
PROCEDURE Destroy
IF UPPER(THIS.Safety) == "ON"
SET SAFETY ON
ENDIF
ENDPROC
PROCEDURE UpdatePoints
LPARAMETERS taArray
PRIVATE lnRowCount, lnColumnCount, i, j
lnRowCount = ALEN(taArray, 1)
lnColumnCount = ALEN(taArray, 2)
DIMENSION THIS.Points[lnRowCount, lnColumnCount]
FOR i = 1 TO lnRowCount
FOR j = 1 TO lnColumnCount
THIS.Points[i, j] = taArray[i, j]
ENDFOR
ENDFOR
ENDPROC
PROCEDURE DrawLine
LOCAL lcTempFile, lcFile, loImage, loGraphics, loColor, loPen, i, j
IF FILE(THIS.FileName) = .T.
lcTempFile = THIS.FileName
ELSE
lcTempFile = ADDBS(SYS(2023)) + SUBSTR(SYS(2015), 3, 10) + ".BMP"
TEXT TO lcFile NOSHOW
424D3A0000000000000036000000280000000100000001000000010018000000000004000000C40E0000C40E00000000000000000000FFFFFF00
ENDTEXT
= STRTOFILE(STRCONV(lcFile, 16), lcTempFile)
ENDIF
loImage = CREATEOBJECT("GpImage")
loImage.CreateFromFile(lcTempFile)
IF FILE(THIS.FileName) = .F.
loImage = loImage.GetThumbnailImage(THIS.ImageWidth, THIS.ImageHeight)
ENDIF
loGraphics = CREATEOBJECT("GpGraphics")
loGraphics.CreateFromImage(loImage)
loColor = CREATEOBJECT("GpColor")
loColor.FoxRGB = THIS.LineColor
loPen = CREATEOBJECT("GpPen", loColor)
FOR i = 1 TO (ALEN(THIS.Points, 1) - 1)
loGraphics.DrawLine(loPen, THIS.Points[i, 1], THIS.Points[i, 2], THIS.Points[i + 1, 1], THIS.Points[i + 1, 2])
ENDFOR
loImage.SaveToFile(THIS.FileName, "image/jpeg", "quality=100")
IF FILE(THIS.FileName) = .F.
DELETE FILE (lcTempFile)
ENDIF
ENDPROC
PROCEDURE GetLength
LPARAMETERS tnX1, tnY1, tnX2, tnY2
RETURN ((tnX1 - tnX2)^2 + (tnY1 - tnY2)^2)^0.5
ENDPROC
ENDDEFINE
------------------------------------------------------
Test.scx(Command1, Command2, Image1)
------------------------------------------------------
Test.DrawLines():
----------------------------
LPARAMETERS taArray, tnWidth, tnHeight, tnColor
PRIVATE loDrawLines, lcImage
loDrawLines = NEWOBJECT("DrawLines", "DrawLines.prg")
lcImage = ADDBS(SYS(2023)) + SUBSTR(SYS(2015), 3, 10) + ".JPG"
loDrawLines.UpdatePoints(@taArray)
loDrawLines.ImageWidth = IIF(EMPTY(tnWidth) = .T., 400, tnWidth)
loDrawLines.ImageHeight = IIF(EMPTY(tnHeight) = .T., 400, tnHeight)
loDrawLines.LineColor = IIF(TYPE("tnColor") <> "N", 0, tnColor)
loDrawLines.FileName = lcImage
loDrawLines.DrawLine()
loDrawLines = NULL
THIS.Image1.Picture = lcImage
--------------------
Test.Refresh():
--------------------
THIS.Image1.Visible = FILE(THIS.Image1.Picture)
--------------------
Test.Command1.Click():
--------------------
LOCAL laArray[6, 5], i
RAND(-1)
FOR i = 1 TO 6
laArray[i, 1] = CEILING(RAND()*360)
laArray[i, 2] = CEILING(RAND()*360)
ENDFOR
THISFORM.DrawLines(@laArray, 360, 360, CEILING(RAND()*RGB(255, 255, 255)))
THISFORM.Refresh()
-------------------
Test1.Command2.Click():
-------------------
IF FILE(THISFORM.Image1.Picture) = .T.
CREATE CURSOR Temp (Image C(254))
INSERT INTO Temp VALUES (THISFORM.Image1.Picture)
REPORT FORM TEST.FRX PREVIEW
USE IN Temp
ENDIF
-------------------
---------------------------------------------
Test.frx: 细节带区放入一个图像控件,数据来源设为ALLTRIM(Image),类型为表达式或变量。