向量图的制作(Windows MetaFile)
出处:网络
常见的图形格式有两大类,一种是位图,譬如 bmp、jpg、gif;另一种是向量图,譬如 wmf、emf。两者最大的差别在于向量图放大或缩小之后不易失真,位图则否。向量图储存的是一连串的绘图指令码,因此档案较小,但是每次绘图的速度可能比较慢。在 VB 的环境下要制作位图只要在 Form 或 PictureBox 内使用图形方法来绘图,并令其 AutoRedraw=True,则其 Image 属性储存的就是位图,若要将此位图存盘可使用 SavePicture 方法。在 VB 的环境下要制作向量图就必须呼叫 API 来帮忙了,以下是制作 Windows Standard MetaFile 最基本的五个步骤:
使用 CreateMetaFile API 取得 device context。
使用任何的 API 绘图函数,譬如 LineTo、MoveToEx、Ellipse、SetRect、Pie、Chord、Arc、DrawText 等,在刚取得的 device context 上绘图。
图形绘制完成后使用 CloseMetaFile API 取得此 MetaFile 的 handle。
使用 PlayMetaFile API 可将绘制好的 MetaFile 显示于具有 hDc 属性的控件上,譬如 PictureBox、Form。
最后使用 DeleteMetaFile API 将 MetaFile 占用的内存释放出来。
关于 Windows Enhanced Metafile 的制作以及如何将绘制好的 MetaFile 储存成 *.wmf 或 *.emf 档案,请参考 ZD Press 出版的 VB5.0 Programmer's Guide To The Win32 API 一书。
以下程序代码置于 Form1。
Private Sub Command1_Click()
Dim dc As Long, DCsize As SIZE, hMF As Long, font As LOGFONT
Dim hFont As Long, oldfont As Long
dc = CreateMetaFile(vbNullString)
'用Windows API 的图形方法来画图 ,以下以输出文字为例
RtlMoveMemory font.lfFaceName(0), ByVal CStr("新细明体"), _
LenB(StrConv("新细明体", vbFromUnicode)) + 1
font.lfHeight = (8 * 20) / Screen.TwipsPerPixelY
font.lfWidth = (5 * 20) / Screen.TwipsPerPixelY
font.lfCharSet = DEFAULT_CHARSET
hFont = CreateFontIndirect(font)
oldfont = SelectObject(dc, hFont)
TextOut dc, 0, 0, "VB实战网 http://fly.to/jaric", LenB(StrConv("VB实战网 http://fly.to/jaric", vbFromUnicode))
hFont = SelectObject(dc, oldfont)
DeleteObject hFont
'将画好的向量图显示在picture1中
hMF = CloseMetaFile(dc)
Picture1.Cls
PlayMetaFile Picture1.hdc, hMF
'将picture1放大成picture3的大小,由于是位图的放大效果,因此有锯齿现象
Picture3.Cls
StretchBlt Picture3.hdc, 0, 0, Picture3.ScaleWidth, Picture3.ScaleHeight, _
Picture1.hdc, 0, 0, Picture1.ScaleWidth, Picture1.ScaleHeight, vbSrcCopy
Picture2.Cls
dc = Picture2.hdc
'将画好的向量图放大成picture2的大小,由于是向量图的放大效果,因此没有锯齿现象
[返回] |