向量圖的製作 (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的大小,由於是向量圖的放大效果,因此沒有鋸齒現象