可以在应用程序中嵌入字体,如果该字体在用户系统上不可用,则可以使用它.
您只需创建一个PrivateFontCollection并使用您的字体填充它,然后您可以随意使用它们.根据MSDN,此方法不适用于Windows 2000之前的操作系统.
From Remarks section of 07002 method:
When using a private font on operating systems before Windows 2000,the default font,typically Microsoft Sans Serif,will be substituted.
如果您打算在Windows 2000及更高版本上使用您的应用程序,您可以按照我编写的代码来了解如何实现私有字体.
Public Class Form1
Dim pfc As System.Drawing.Text.PrivateFontCollection
Dim ifc As System.Drawing.Text.InstalledFontCollection
Sub New()
' This call is required by the designer.
InitializeComponent()
' Add any initialization after the InitializeComponent() call.
pfc = New System.Drawing.Text.PrivateFontCollection()
ifc = New System.Drawing.Text.InstalledFontCollection()
LoadPrivateFonts({My.Resources.Series_60_ZDigi,My.Resources.Times_NR_Phonetics_2})
End Sub
''' <summary>Loads the private fonts.</summary>
''' <param name="fonts">The fonts to be loaded into the private font collection.</param>
Private Sub LoadPrivateFonts(ByVal fonts As IEnumerable(Of Byte()))
For Each resFont In fonts
pfc.AddMemoryFont(Runtime.InteropServices.Marshal.UnsafeAddrOfPinnedArrayElement(resFont,0),resFont.Length)
Next
End Sub
''' <summary>Gets the FontFamily whose name matches the one specified.</summary>
''' <param name="fontName">Name of the FontFamily to be returned.</param>
''' <param name="defaultFamily">
''' Optional. The default font family to be returned if the specified font is not found
''' </param>
Private Function GetFontFamily(ByVal fontName As String,Optional ByVal defaultFamily As FontFamily = Nothing) As FontFamily
If String.IsNullOrEmpty(fontName) Then
Throw New ArgumentNullException("fontName","The name of the font cannont be null.")
End If
Dim foundFonts = From font In ifc.Families.Union(pfc.Families) Where font.Name.ToLower() = fontName.ToLower()
If foundFonts.Any() Then
Return foundFonts.First()
Else
Return If(defaultFamily,FontFamily.GenericSansSerif)
End If
End Function
Private Sub Form1_Disposed(ByVal sender As Object,ByVal e As System.EventArgs) Handles Me.Disposed
'free the resources used by the font collections
pfc.Dispose()
ifc.Dispose()
End Sub
Private Sub Form1_Paint(ByVal sender As Object,ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
Dim g = e.Graphics
Using br As Brush = Brushes.Black
g.DrawString("1234567890ABCDEF",New Font(GetFontFamily("Series 60 ZDigi"),18),br,New Point(20,20))
g.DrawString("ABCDEFGHIJKLMNOP",New Font(GetFontFamily("Times NR Phonetics 2"),100))
End Using
End Sub
End Class
我将我在应用程序中使用的两种字体(Series 60 ZDigi,我的诺基亚手机中的字体,Times NR Phonetics 2,我的字典应用程序中的字体)从资源加载到Sub New()中的私有字体集合中.
然后我调用GetFontFamily方法来获取所需的字体以在表单上绘制.
将它合并到您的应用程序中应该不会太难.
干杯.