Vb.net 如何在Visual Basic.Net应用程序中嵌入字体?

Vb.net 如何在Visual Basic.Net应用程序中嵌入字体?,vb.net,fonts,Vb.net,Fonts,如何在Visual Basic.Net应用程序中嵌入字体?这应该在每个操作系统上都有效。您不能。目前,标准Winforms应用程序中的嵌入式字体没有跨平台标准。您所能做的最好的事情是嵌入特定于操作系统的单个字体文件,检测您所在的操作系统,然后以编程方式安装字体 另一方面,VB.net中的WPF应用程序可能满足您的需要,但我有一种感觉,这不是您要去的地方。有关如何使用WPF应用程序打包字体的信息,请参阅。如果用户系统上没有字体,则可以在应用程序中嵌入字体并使用该字体 您只需创建一个应用程序并用您的

如何在Visual Basic.Net应用程序中嵌入字体?这应该在每个操作系统上都有效。

您不能。目前,标准Winforms应用程序中的嵌入式字体没有跨平台标准。您所能做的最好的事情是嵌入特定于操作系统的单个字体文件,检测您所在的操作系统,然后以编程方式安装字体


另一方面,VB.net中的WPF应用程序可能满足您的需要,但我有一种感觉,这不是您要去的地方。有关如何使用WPF应用程序打包字体的信息,请参阅。

如果用户系统上没有字体,则可以在应用程序中嵌入字体并使用该字体

您只需创建一个应用程序并用您的字体填充它,然后您就可以随心所欲地使用它们。根据,此方法不适用于Windows 2000之前的操作系统

从方法的备注部分:

在Windows 2000之前的操作系统上使用专用字体时,将替换默认字体(通常为Microsoft Sans Serif)

如果您打算在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"), 18), br, New Point(20, 100))
        End Using
    End Sub
End Class
公共类表单1
Dim pfc作为System.Drawing.Text.PrivateFontCollection
将ifc设置为System.Drawing.Text.InstalledFontCollection
次新
'设计器需要此调用。
初始化组件()
'在InitializeComponent()调用之后添加任何初始化。
pfc=新系统.Drawing.Text.PrivateFontCollection()
ifc=新系统.Drawing.Text.InstalledFontCollection()
LoadPrivateFonts({My.Resources.Series_60_ZDigi,My.Resources.Times_NR_拼音_2})
端接头
''加载专用字体。
''要加载到专用字体集合的字体。
Private子加载privatefonts(Byte()的ByVal字体作为IEnumerable)
对于字体中的每个字体
pfc.AddMemoryFont(Runtime.InteropServices.Marshal.UnsafeAddrOfPinnedArrayElement(resFont,0),resFont.Length)
下一个
端接头
''获取名称与指定名称匹配的FontFamily。
''要返回的FontFamily的名称。
''' 
''可选。未找到指定字体时返回的默认字体系列
''' 
私有函数GetFontFamily(ByVal fontName作为字符串,可选ByVal defaultFamily作为FontFamily=Nothing)作为FontFamily
如果String.IsNullOrEmpty(fontName),则
抛出新的ArgumentNullException(“fontName”,“字体名称不能为null”)
如果结束
Dim foundFonts=来自ifc.Families.Union(pfc.Families)中的字体,其中font.Name.ToLower()=fontName.ToLower()
如果找到foundFonts.Any(),则
返回foundFonts.First()
其他的
如果返回(defaultFamily,FontFamily.GenericSansSerif)
如果结束
端函数
私有子表单1u Disposed(ByVal sender作为对象,ByVal e作为System.EventArgs)处理Me.Disposed
'释放字体集合使用的资源
pfc.Dispose()
ifc.Dispose()
端接头
私有子表单1_Paint(ByVal sender作为对象,ByVal e作为System.Windows.Forms.PaintEventArgs)处理Me.Paint
尺寸g=e.图形
使用br作为笔刷=笔刷。黑色
g、 抽绳(“1234567890ABCDEF”,新字体(GetFontFamily(“60系列ZDigi”),18),br,新点(20,20))
g、 抽绳(“ABCDEFGHIJKLMNOP”,新字体(GetFontFamily(“Times NR Phopologics 2”),18),br,新点(20100))
终端使用
端接头
末级
我将应用程序中使用的两种字体(诺基亚手机中的60系列ZDigi字体和字典应用程序中的Times NR Physics 2字体)从资源加载到
Sub New()
中的专用字体集合中
然后,我调用
GetFontFamily
方法来获取要在表单上绘制的所需字体

将其整合到应用程序中应该不会太难


干杯。

我不想让你的泡沫破灭,但这是可以做到的。它可能无法在所有操作系统上运行,但在Win2k以后的版本上确实可以运行。看看我的答案是如何做到的。