![]() |
#2
xzlxzlxzl2017-09-22 22:45
用下述代码似乎打开了你画的那个图元文件,是不是就是一条斜线?窗口在屏幕不同位置,斜线斜率不同。
![]() Private Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type Private Type RECTL Left As Long Top As Long Right As Long Bottom As Long End Type Private Type SIZEL cx As Long cy As Long End Type Private Type ENHMETAHEADER iType As Long nSize As Long rclBounds As RECTL rclFrame As RECTL dSignature As Long nVersion As Long nBytes As Long nRecords As Long nHandles As Integer sReserved As Integer nDescription As Long offDescription As Long nPalEntries As Long szlDevice As SIZEL szlMillimeters As SIZEL End Type Private Declare Function GetEnhMetaFile Lib "gdi32" Alias "GetEnhMetaFileA" (ByVal lpszMetaFile As String) As Long Private Declare Function GetEnhMetaFileHeader Lib "gdi32" (ByVal hemf As Long, ByVal cbBuffer As Long, lpemh As ENHMETAHEADER) As Long Private Declare Function PlayEnhMetaFile Lib "gdi32" (ByVal hdc As Long, ByVal hemf As Long, lpRect As RECT) As Long Private Sub aaa() Picture1.Cls '清除图形 Dim ret, lp As ENHMETAHEADER, lpRect As RECT If Dir("c:\w3.emf") <> "" Then '判断文件是否存在 hwd = GetEnhMetaFile("c:\w3.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 Else MsgBox "缺失地图文件" End End If End Sub Private Sub Form_Click() aaa End Sub |
目前的解决方法是后台弄一个大的窗口,在那里面重绘一遍再输出。只能说是应付一下,效果也不是太好。毕竟矢量图才是真正解决之道
言归正传,我在网上找到了一个emf格式的论文,按照上面的示例做了一下,但是出不来结果。
请各位帮助看看
http://www.
窗体:

Private Sub Form_Click()
DrawCurve
End Sub
Sub DrawCurve()
Dim T As Double
Dim Xs As Long, Ys As Long
Dim P0 As POINTAPI
Dim Xp As Long, Yp As Long
Dim hwMFC As Long, hwMF As Long, Box As RECT
'设定绘图区域, 大小与窗体一致,尺寸大小以0.01mm为单位
Box.Left = 0
Box.Top = 0
Box.Right = Form1.ScaleX(Form1.ScaleWidth, Form1.ScaleMode, vbMillimeters) * 100
Box.Bottom = Form1.ScaleX(Form1.ScaleHeight, Form1.ScaleMode, vbMillimeters) * 100
'获取窗体的宽度和高度,单位像素
Xs = Form1.ScaleX(Form1.ScaleWidth, Form1.ScaleMode, vbPixels)
Ys = Form1.ScaleX(Form1.ScaleHeight, Form1.ScaleMode, vbPixels)
'建立一个元文件
hwMFC = CreateEnhMetaFile(Form1.hdc, "C:\w3.emf", Box, "MetaFile Creater")
If hwMFC = 0 Then
MsgBox "元文件建立错误"
Exit Sub
End If
For T = 0 To 6.283 Step 0.01
Xp = Xs * (1 + Sin(4 * T)) / 2
Yp = Xs * (1 + Sin(5 * T)) / 2
If T = 0 Then
MoveToEx hwMFC, Xp, Yp, P0
Else
LineTo hwMFC, Xp, Yp
End If
Next T
MoveToEx hwMFC, 0, 0, P0
LineTo hwMFC, 800, 600
hwMF = CloseEnhMetaFile(hwMFC)
Box.Left = 0
Box.Top = 0
Box.Right = Xs
Box.Bottom = Ys
PlayEnhMetaFile Form1.hdc, hwMF, Box
DeleteEnhMetaFile hwMF
Clipboard.Clear
Clipboard.SetData LoadPicture("C:\w3.emf"), vbCFMetafile
End Sub
模块:

'POINTAPI 结构定义
Type POINTAPI
X As Long
Y As Long
End Type
'RECT 结构定义
Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
'******************************* API 函数 CreateEnhMetaFile
'功能: 创建一个增强型的图元文件设备场景
'hdcRef 一个参考设备场景,即绘图设备句柄如窗口,打印机等。 如为0,则为整个屏幕
'lpFileName 图元文件的磁盘路径和文件名, 可用vbNullString传递一个NULL,从而创建内存图元文件。
'lpRect 绘图的矩形区域
'lpDescription 对图元文件的一段说明。 如果不愿意包含一段说明,也可设为vbNullString。
'返回值 增强型图元文件设备场景的句柄。 零表示函数执行出错
Public Declare Function CreateEnhMetaFile Lib "gdi32" Alias "CreateEnhMetaFileA" (ByVal hdcRef As Long, ByVal lpFileName As String, lpRect As RECT, ByVal lpDescription As String) As Long
'******************************* API 函数 CloseEnhMetaFile
'功能: 关闭指定的增强型图元文件设备场景,并将新建的图元文件返回一个句柄
'hdc 增强型图元文件设备场景的句柄,对应CreateEnhMetaFile的返回值
'返回值 增强型图元文件的一个句柄。 零表示函数执行出错
Public Declare Function CloseEnhMetaFile Lib "gdi32" (ByVal hdc As Long) As Long
'******************************* API 函数 PlayEnhMetaFile
'功能: 指定的设备中绘制(显示)一个增强型图元文件
'hdc 用于显示的设备句柄,如窗口、控件等
'hemf 增强型图元文件的句柄
'lpRect 绘图的矩形区域
'返回值 非零表示成功,零表示失败
Public Declare Function PlayEnhMetaFile Lib "gdi32" (ByVal hdc As Long, ByVal hemf As Long, lpRect As RECT) As Long
'******************************* API 函数 DeleteEnhMetaFile
'功能: 使用完图元文件之后,释放其所使用的系统资源(清除内存,不删除文件)
'hwMF 增强型图元文件的句柄
'返回值 非零表示成功,零表示失败
Public Declare Function DeleteEnhMetaFile Lib "gdi32" (ByVal hwMF As Long) As Long
'******************************* API 函数 MoveToEx
'功能: 将当前绘图位置移动到设备的指定位置——设置画笔位置
'hdc 绘图的目标设备
'X、Y 位置坐标(相对于目标设备)
'lpPoint 指向POINT结构的指针,用来存放上一个点的位置,若此参数为NULL,则不保存上一个点的位置
'返回值 返回TRUE代表移动成功,FALSE代表失败
Public Declare Function MoveToEx Lib "gdi32" (ByVal hdc As Long, X As Long, Y As Long, lpPoint As POINTAPI) As Long
'******************************* API 函数 LineTo
'功能: 以指定设备的当前位置为起点,向终点位置划一条直线
'hdc 绘图的目标设备
'X、Y 终点位置坐标(相对于目标设备)
'返回值 返回TRUE代表移动成功,FALSE代表失败
Public Declare Function LineTo Lib "gdi32" (ByVal hdc As Long, X As Long, Y As Long) As Long
'******************************* API 函数 CreatePen
'功能: 设置画笔格式
'nPenStyle 线条样式
'nWidth 线条宽度
'crColor 线条颜色
'返回值 返回新画笔的句柄,零表示失败
Public Declare Function CreatePen Lib "gdi32" (ByVal nPenStyle As Long, ByVal nWidth As Long, ByVal crColor As Long) As Long
Public Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
'其他函数 Arc Rectangle TextOut