?? 48.txt
字號:
向量圖的製作 (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的大小,由於是向量圖的放大效果,因此沒有鋸齒現象
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -