利用API函数LineTo绘图的问题
上个帖子萌发了对矢量图的兴趣,正好手上另外一个项目需要绘制极化曲线,由于窗口比较小(程序界面就很小),绘制出来的像素图放大之后效果不好,被说好像是网上找的。目前的解决方法是后台弄一个大的窗口,在那里面重绘一遍再输出。只能说是应付一下,效果也不是太好。毕竟矢量图才是真正解决之道
言归正传,我在网上找到了一个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