2013-01-22 52 views
1

嘿我试图打电话给我的嵌入字体亚伯拉罕·林肯到我的标签,虽然当我运行它从不改变字体程序...呼叫嵌入式字体到标签

Private Sub slackerR_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load 
    Dim sMyFonts As String() = {"AbrahamLincoln.ttf"} 
    Dim fEmbedded As New Font(GetFont(sMyFonts).Families(0), 10) 
    Label1.Font = fEmbedded 
End Sub 

Public Function GetFont(ByVal FontResource() As String) As Drawing.Text.PrivateFontCollection 
    'Get the namespace of the application  
    Dim NameSpc As String = Reflection.Assembly.GetExecutingAssembly().GetName().Name.ToString() 
    Dim FntStrm As IO.Stream 
    Dim FntFC As New Drawing.Text.PrivateFontCollection() 
    Dim i As Integer 
    For i = 0 To FontResource.GetUpperBound(0) 
     'Get the resource stream area where the font is located 
     FntStrm = Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(NameSpc + "." + FontResource(i)) 
     'Load the font off the stream into a byte array 
     Dim ByteStrm(CType(FntStrm.Length, Integer)) As Byte 
     FntStrm.Read(ByteStrm, 0, Int(CType(FntStrm.Length, Integer))) 
     'Allocate some memory on the global heap 
     Dim FntPtr As IntPtr = Runtime.InteropServices.Marshal.AllocHGlobal(Runtime.InteropServices.Marshal.SizeOf(GetType(Byte)) * ByteStrm.Length) 
     'Copy the byte array holding the font into the allocated memory. 
     Runtime.InteropServices.Marshal.Copy(ByteStrm, 0, FntPtr, ByteStrm.Length) 
     'Add the font to the PrivateFontCollection 
     FntFC.AddMemoryFont(FntPtr, ByteStrm.Length) 
     'Free the memory 
     Runtime.InteropServices.Marshal.FreeHGlobal(FntPtr) 
    Next 
    Return FntFC 
End Function 

我都试过{“AbrahamLincoln.ttf”}{“AbrahamLincoln”}和两者都不起作用。

使用VB.net 2010

+0

查找范围的输出窗口“第一次机会例外”通知。 –

+0

代码行中类型为'System.NullReferenceException'**的@HansPassant ** ** Dim ByteStrm(CType(FntStrm.Length,Integer))作为字节** – StealthRT

+0

[VS2010的可能重复未显示未处理的异常消息在64位版本的Windows上的WinForms应用程序](http://stackoverflow.com/questions/4933958/vs2010-does-not-show-unhandled-exception-message-in-a-winforms-application-on-a) –

回答

1

这可能是你在你的资源更简单的方法...

认沽字体。

添加这样的模块:(修改下面的资源名称 “My.Resources [你的资源名称]”)

Module agencyFontNormal 
Private _pfc As PrivateFontCollection = Nothing 
Public ReadOnly Property GetInstance(ByVal Size As Single, ByVal style As FontStyle) As Font 
    Get 
     If _pfc Is Nothing Then LoadFont() 
     Return New Font(_pfc.Families(0), Size, style) 
    End Get 
End Property 
Private Sub LoadFont() 
    Try 
     _pfc = New PrivateFontCollection 
     Dim fontMemPointer As IntPtr = Marshal.AllocCoTaskMem(My.Resources.AGENCYNORMAL.Length) 
     Marshal.Copy(My.Resources.AGENCYNORMAL, 0, fontMemPointer, My.Resources.AGENCYNORMAL.Length) 
     _pfc.AddMemoryFont(fontMemPointer, My.Resources.AGENCYNORMAL.Length) 
     Marshal.FreeCoTaskMem(fontMemPointer) 
    Catch ex As Exception 
    End Try 
End Sub 
End Module 

通过电话:

Dim ff As Font = agencyFontNormal.GetInstance(12, FontStyle.Regular)