在VB6中绘制矢量图并没有想象中那么困难,其实只要使用一个增强型图元文件(EMF文件)并配合3个API函数就可以实现矢量图的绘制。上述的API函数分别是GetEnhMetaFile、GetEnhMetaFileHeader、PlayEnhMetaFile。
以下是上述函数的原型:
(1)Declare Function GetEnhMetaFile Lib "gdi32" Alias "GetEnhMetaFileA" (ByVal lpszMetaFile As String) As Long
说明:取得磁盘文件中包含的一个增强型图元文件的图元文件句柄
参数表:
lpszMetaFile --- String,包含了增强型图元文件的一个磁盘文件的名字
返回值:Long,指向图元文件的句柄。零表示出错
(2)Declare Function GetEnhMetaFileHeader Lib "gdi32" Alias "GetEnhMetaFileHeader" (ByVal hemf As Long, ByVal cbBuffer As Long, lpemh As ENHMETAHEADER) As Long
说明:取得增强型图元文件的图元文件头
参数表:hemf ----------- Long,指向一个增强型图元文件的句柄
cbBuffer ------- Long,ENHMETAHEADER结构的大小
lpemh ---------- ENHMETAHEADER
(3)Declare Function PlayEnhMetaFile Lib "gdi32" Alias "PlayEnhMetaFile" (ByVal hdc As Long, ByVal hemf As Long, lpRect As RECT) As Long
说明:在指定的设备场景中画一个增强型图元文件。与标准图元文件不同,完成回放后,增强型图元文件会恢复设备场景以前的状态
返回值:Long,非零表示成功,零表示失败。会设置GetLastError
参数表:参数 类型及说明 hdc Long,目标设备场景
hemf Long,欲描绘的增强型图元文件的句柄
lpRect RECT,一个约束矩形,定义了在哪里描绘图元文件
以下是使用以上函数实现矢量图绘制的主要代码,另外需要说明的是上述函数只对增强型图元(EMF)有效,并不支持(WMF)。
Private Sub Form_Activate()
Picture1.Cls'清除图形
Dim ret
If Dir(App.Path & "/map.emf") <> "" Then'判断文件是否存在
hwd = GetEnhMetaFile(App.Path & "/map.emf")'获取图元文件句柄
GetEnhMetaFileHeader hwd, Len(lp), lp'获取图元文件头,主要目的是获取结构中有关图元文件坐标的信息
With lprect'设置RECT结构成员主要用于定义了在哪里描绘图元文件
.Left = 0
.Top = 0
.Right = lp.rclBounds.Right
.Bottom = lp.rclBounds.Bottom
End With
ret = PlayEnhMetaFile(Picture1.hdc, hwd, lprect)'绘制绘图元文件
P = 1
Check1.value = 0
first
Else
MsgBox "缺失地图文件map.emf"
End
End If
End Sub