2013-04-11 9 views
8

Dodałem niestandardową czcionkę za pomocą poniższego kodu:addFontFile ze środków

PrivateFontCollection pfc = new PrivateFontCollection(); 
pfc.AddFontFile("C:\\Path To\\YourFont.ttf"); 
label1.Font = new System.Drawing.Font(pfc.Families[0], 16, FontStyle.Regular); 

Dodałem plik czcionki w zasobach. Jak dodać z addFontFile zasobów?

Odpowiedz

4

Jeśli włączone czcionkę w zasobach

Spróbuj funkcję

private void addfontfrommemory() 
{ 
Stream fontStream = this.GetType().Assembly.GetManifestResourceStream("yourfont.ttf"); 

     byte[] fontdata = new byte[fontStream.Length]; 
     fontStream.Read(fontdata,0,(int)fontStream.Length); 
     fontStream.Close(); 
     unsafe 
     { 
     fixed(byte * pFontData = fontdata) 
     { 
      pfc.AddMemoryFont((System.IntPtr)pFontData,fontdata.Length); 
     } 
     } 
    } 

redakcją

Jak zasób obciążenie z zespołu (YourNamespace.file.ttf)

Stream fontStream = Assembly.GetExecutingAssembly() 
.GetManifestResourceStream("WindowsFormsApplication1.SBADR.TTF"); 

Mój eksplorator rozwiązań:

enter image description here

+0

i jak zmienić czcionkę etykiety po tym? – Ladessa

+1

Spróbuj tego 'label.Font = new Font (pfc.Families [0], 18, FontStyle.Regular);' – KF2

+0

Otrzymuję zerowy wyjątek w 'Stream fontStream = this.GetType(). Assembly.GetManifestResourceStream (" BOOKOS .TTF "); ' ale już dodałem plik czcionki w zasobach. * Właściwość * build * BOOKOS.TFF jest osadzona ... to prawda? – Ladessa

9
private static void AddFontFromResource(PrivateFontCollection privateFontCollection, string fontResourceName) 
{ 
    var fontBytes = GetFontResourceBytes(typeof (App).Assembly, fontResourceName); 
    var fontData = Marshal.AllocCoTaskMem(fontBytes.Length); 
    Marshal.Copy(fontBytes, 0, fontData, fontBytes.Length); 
    privateFontCollection.AddMemoryFont(fontData, fontBytes.Length); 
    Marshal.FreeCoTaskMem(fontData); 
} 

private static byte[] GetFontResourceBytes(Assembly assembly, string fontResourceName) 
{ 
    var resourceStream = assembly.GetManifestResourceStream(fontResourceName); 
    if (resourceStream == null) 
     throw new Exception(string.Format("Unable to find font '{0}' in embedded resources.", fontResourceName)); 
    var fontBytes = new byte[resourceStream.Length]; 
    resourceStream.Read(fontBytes, 0, (int)resourceStream.Length); 
    resourceStream.Close(); 
    return fontBytes; 
} 
+1

To dla mnie jest lepszym rozwiązaniem unikanie użycia "niebezpiecznego {}" przy użyciu klasy System.Runtime.InteropServices.Marshal. Użyłem również "GetFontResourceBytes (System.Reflection.MethodBase.GetCurrentMethod(). DeclaringType.Assembly, fontResourceName)" dla mojego rozwiązania. – HidekiAI

+0

Też wolałem to rozwiązanie, zamiast zmieniać cały proces kompilacji dla jedynego "niebezpiecznego" wywołania. Również dla zestawu użyłem 'GetFontResourceBytes (Assembly.GetExecutingAssembly(), fontResourceName);' –

3

ten sposób to zrobić.

Najpierw pobierz plik Font.ttf i za pomocą programu Visual Studio przeciągnij i upuść plik do folderu głównego lub folderu zasobów.

W oknie Solution Explorer kliknij prawym przyciskiem myszy plik i kliknij właściwości. Wybierz opcję Build Action = Content. Spowoduje to wyświetlenie pliku w plikach aplikacji w obszarze Właściwości projektu> Publikuj> Pliki aplikacji. Zobaczysz, że plik można teraz wybrać (domyślnie jest on automatycznie dołączany).

ClickOnce będzie teraz skopiować plik do StartupPath

Aby go użyć, należy wykonać następujące próbki:

PrivateFontCollection pfc = new PrivateFontCollection(); 

pfc.AddFontFile(Path.Combine(Application.StartupPath, "font_name.ttf")); 

textBox1.Font = new Font(pfc.Families[0], 18, FontStyle.Regular); 
+0

Jeśli plik czcionki w folderze głównym, myślę, że nie można powiązać go z Application.StartupPath, ponieważ otrzymasz ścieżkę z "bin"/debug "folder. Więc musisz użyć w ten sposób; string path = Application.StartupPath.Substring (0, Application.StartupPath.IndexOf ("bin")) + fontName.ttf; – Erdogan

0

To będzie załadować czcionkę do prywatnej kolekcji czcionek i uniknąć jakiegokolwiek odniesienia do obiektu i pamięci błędy w czasie wykonywania, które możesz zobaczyć, korzystając z powyższych przykładów.

Ze względów wydajności chcieliśmy tylko raz załadować czcionkę i zachować odniesienia do czcionki dla wielu operacji rysowania między połączeniami. Sztuką jest upewnienie się, że PrivateFontCollection nie wykracza poza zakres, jeśli zachowujesz odniesienie do utworzonego obiektu Font.

Dodaj kilka statycznych (udostępnianych) zmienne

Private Shared _sharedFont As Font 
Private Shared _sharedFontCollection As Text.PrivateFontCollection 
Private Shared _sharedFontSize As Integer 

Następnie deklarować te funkcje

Private Function LoadSharedFont(ByVal fontName As String, ByVal size As Integer, ByVal style As FontStyle) As Font 
    'Check if font name or size has changed, then clear cache 
    If size <> _sharedFontSize Then _sharedFont = Nothing 

    If _sharedFont Is Nothing Then 

     'Make this shared so this variable doesnt go out of scope and is garbage collected 
     _sharedFontCollection = New Text.PrivateFontCollection() 
     _sharedFont = LoadFont(fontName, size, style) 
     _sharedFontSize = size 
    End If 

    Return _sharedFont 
End Function 

i

Private Function LoadFont(ByVal fontName As String, ByVal size As Integer, ByVal style As FontStyle) As Font 
    Dim executingAssembly As System.Reflection.Assembly = Reflection.Assembly.GetCallingAssembly() 
    Dim myNamespace As String = executingAssembly.GetName().Name.ToString() 

    Try 
     Using fontstream = executingAssembly.GetManifestResourceStream(myNamespace + "." + fontName) 
      Dim fontBytes(CInt(fontstream.Length)) As Byte 
      fontstream.Read(fontBytes, 0, CInt(fontstream.Length)) 

      Dim fontData As System.IntPtr = Marshal.AllocCoTaskMem(fontBytes.Length) 
      Marshal.Copy(fontBytes, 0, fontData, fontBytes.Length) 
      _sharedFontCollection.AddMemoryFont(fontData, fontBytes.Length) 
      Marshal.FreeCoTaskMem(fontData) 
     End Using 

     Return New Font(_sharedFontCollection.Families(0), size, style) 

    Catch ex As Exception 
     'An unexpected error has occurred so return a default Font just in case. 
     Return New Drawing.Font("Arial", size, FontStyle.Regular) 
    End Try 

End Function 

stosować w następujący sposób:

Dim font = LoadSharedFont("OpenSans-CondBold.ttf", 12, FontStyle.Bold) 
Powiązane problemy