0

私はこれに従っていました: http://zerosandtheone.com/blogs/vb/archive/2009/11/20/vb-net-include-a-font-as-an-embedded-resource-in-your-application.aspxアプリケーションがラベルでカスタム フォントを使用できるようにします。それに関する問題は、自分のコンピューターでアプリケーションを実行できることです (おそらく、このフォントがインストールされているためです)。他の人が自分のコンピューターでコンパイルされたアプリケーションを実行すると、問題が発生します。例外キャッチからの次のエラーが表示されます: 53 File doesn't exists.

この例外はどこにありますか?

上記でリンクしたモジュールについて話している:

'MATTHEW KLEINWAKS
'ZerosAndTheOne.com
'2009
'CUSTOM FONT LOADED DYNAMICALLY FROM A RESOURCE

Imports System.Drawing.Text
Imports System.Runtime.InteropServices

Module CustomFont

    'PRIVATE FONT COLLECTION TO HOLD THE DYNAMIC FONT
    Private _pfc As PrivateFontCollection = Nothing


    Public ReadOnly Property GetInstance(ByVal Size As Single, _
                                         ByVal style As FontStyle) As Font
        Get
            'IF THIS IS THE FIRST TIME GETTING AN INSTANCE
            'LOAD THE FONT FROM RESOURCES
            If _pfc Is Nothing Then LoadFont()

            'RETURN A NEW FONT OBJECT BASED ON THE SIZE AND STYLE PASSED IN
            Return New Font(_pfc.Families(0), Size, style)

        End Get
    End Property

    Private Sub LoadFont()
        Try
            'INIT THE FONT COLLECTION
            _pfc = New PrivateFontCollection

            'LOAD MEMORY POINTER FOR FONT RESOURCE
            Dim fontMemPointer As IntPtr = _
                Marshal.AllocCoTaskMem( _
                My.Resources.DIGITALDREAMNARROW.Length)

            'COPY THE DATA TO THE MEMORY LOCATION
            Marshal.Copy(My.Resources.DIGITALDREAMNARROW, _
                         0, fontMemPointer, _
                         My.Resources.DIGITALDREAMNARROW.Length)

            'LOAD THE MEMORY FONT INTO THE PRIVATE FONT COLLECTION
            _pfc.AddMemoryFont(fontMemPointer, _
                               My.Resources.DIGITALDREAMNARROW.Length)

            'FREE UNSAFE MEMORY
            Marshal.FreeCoTaskMem(fontMemPointer)
        Catch ex As Exception
            MessageBox.Show(& Err.Number & " " & Err.Description)
        End Try

    End Sub

End Module

正確にはこれ:

   Catch ex As Exception
        MessageBox.Show(& Err.Number & " " & Err.Description)
    End Try

メッセージを含むメッセージボックスを表示してい53 File doesn't existsます。

私のコンピューターでは問題なく動作するため、なぜそれが起こるのか本当にわかりません...助けを求めていただければ幸いです!

4

1 に答える 1

1

このコードを使用してみてください

''' <summary>Adds the specified font to the private font collection.</summary>
''' <param name="font">The font to be added.</param>
Public Sub AddFont(ByVal font As Byte())
    If font Is Nothing Then Throw New ArgumentNullException("The font cannot be null.", "font")
    If font.Length = 0 Then Throw New ArgumentException("The length of the font array cannot be 0.", "font")
    Try
        privateFonts.AddMemoryFont(Marshal.UnsafeAddrOfPinnedArrayElement(font, 0), font.Length)
    Catch ex As Exception
        'handle you exceptions here
    End Try
End Sub

この方法でフォントをコレクションに追加します

Private Sub LoadFont()
    Try
        'INIT THE FONT COLLECTION
        privateFonts = New PrivateFontCollection
        AddFont(My.Resources.DIGITALDREAMNARROW)
    Catch
    
    '   
    ' the rest of your code
    '
End Sub

AddFontフォント リソースをファイルとして追加したと仮定すると、バイト配列としてメソッドに渡されます。

言うまでもなく、このメソッドは、メソッドのスコープ内でアクセス可能なAddFont、初期化された PrivateFontCollection オブジェクトが呼び出されていることを前提としています。privateFonts

アップデート

私のソリューションが機能していないとおっしゃっているので、ここにサンプル プロジェクトをアップロードしました。ダウンロードして、リソースからプライベート フォントを読み込んで使用する方法を参照してください。

于 2012-11-30T12:46:13.427 に答える