[VB.net] 程式中使用外掛字形檔的方法(一)經由實體字形檔載入

有些場合我們會用到一些特殊的字形到程式裡,像是條碼形的 39 碼或是在遊戲程式中放上「數位效果」的字形…
當然我們可以先安裝字形檔再從程式中引用它們,但要 User 先安裝字形才能執行程式不是理想的做法,而且 User 未必喜歡在它的系統上加裝一些其他的字形,所以我們經常會用暫時安裝的手法把字形檔帶過去,當程式執行中使用它,再於程式結束時移除它們。

有些場合我們會用到一些特殊的字形到程式裡,像是條碼形的 39 碼或是在遊戲程式中放上「數位效果」的字形…

當然我們可以先安裝字形檔再從程式中引用它們,但要 User 先安裝字形才能執行程式不是理想的做法,而且 User 未必喜歡在它的系統上加裝一些其他的字形,所以我們經常會用暫時安裝的手法把字形檔帶過去,當程式執行中使用它,再於程式結束時移除它們。

過去在 VB6 時我的做法是把封裝時把字形檔加入安裝包,而 User 在執行 Setup 時就會跟主程式一起存在於 Programfiles 資料夾,再於程式中使用 AddFontResource 和 RemoveFontResource 這兩支 API(在 Gdi32.dll 裡面)來控制暫時加入和移除。

在 VB.net 中的命名空間 System.Drawing.Text 裡有一個 PrivateFontCollection 類別,做的恰好是加掛字形的動作,並且它還有一個直從記憶體掛載字形的 AddMemoryFont() 方法。

 

image

 

把實作的心得分享一下:

  1. 這個網站( http://font.chinaz.com/ )有超多的字形檔可供下載,先取得用來做測試的字形檔複製到 D:\ 備用。
  2. 接下來先做最基本的測試,寫一個函式傳入字形檔徑名,傳回字形的 FontFamily 給控制項使用。
  3. 程式碼如下:

    Imports System.Drawing.Text
    Imports System.Runtime.InteropServices
    Public Class Form2
        Private Sub Form2_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            Label1.Font = New Font(外掛字形檔("d:\code39.TTF"), Label1.Font.Size)
            Label2.Font = New Font(外掛字形檔("d:\digifaw.TTF"), Label2.Font.Size)
        End Sub
        Function 外掛字形檔(字形檔徑名 As String) As FontFamily
            Dim 自訂字形集合 As New PrivateFontCollection
            Dim 系統字形集合 As New InstalledFontCollection
            Dim 輸出字形 As FontFamily
            Try
                自訂字形集合.AddFontFile(字形檔徑名)
                輸出字形 = 自訂字形集合.Families(0)
            Catch ex As Exception
                輸出字形 = 系統字形集合.Families(0)
            End Try
            Return 輸出字形
        End Function
    End Class
    


  4. 這部分並不困難,可以輕易的成功。
  5. 以下是效果:


    image

 

下回再做經由資源檔夾帶字形的做法。


ku3