2013-04-11 5 views
8

Tôi đã thêm một phông chữ tùy chỉnh sử dụng mã dưới đây:addFontFile từ Tài

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

tôi đã thêm các tập tin phông chữ trong tài nguyên. Tôi làm cách nào để thêm bằng addFontFile từ tài nguyên?

Trả lời

4

Nếu bạn đã bao gồm phông chữ của bạn trong các nguồn

Hãy thử chức năng này

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); 
     } 
     } 
    } 

Sửa

Làm thế nào tài nguyên tải từ lắp ráp: (YourNamespace.file.ttf)

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

Trình khám phá giải pháp của tôi:

enter image description here

+0

và cách tôi thay đổi phông chữ của nhãn sau này? – Ladessa

+1

Hãy thử 'label.Font = new Font (pfc.Families [0], 18, FontStyle.Regular);' – KF2

+0

Tôi nhận được ngoại lệ null trong 'Stream fontStream = this.GetType(). Assembly.GetManifestResourceStream (" BOOKOS .TTF "); ' nhưng tôi đã thêm tệp phông chữ vào tài nguyên. Thuộc tính * build * của BOOKOS.TFF được nhúng ... đúng không? – 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

Điều này với tôi, là một giải pháp tốt hơn tránh việc sử dụng 'không an toàn {}' bằng cách sử dụng lớp System.Runtime.InteropServices.Marshal. Ngoài ra, tôi đã sử dụng 'GetFontResourceBytes (System.Reflection.MethodBase.GetCurrentMethod(). DeclaringType.Assembly, fontResourceName)' cho giải pháp của tôi. – HidekiAI

+0

Tôi cũng rất thích giải pháp này thay vì thay đổi toàn bộ quá trình xây dựng cho cuộc gọi duy nhất 'không an toàn'. Ngoài ra cho assembly tôi đã sử dụng 'GetFontResourceBytes (Assembly.GetExecutingAssembly(), fontResourceName);' –

3

Đây là cách tôi làm điều đó.

Đầu tiên hãy lấy tệp Font.ttf của bạn và sử dụng Visual Studio, kéo và thả tệp vào thư mục gốc hoặc thư mục tài nguyên.

Trong giải pháp Explorer, bấm chuột phải vào tệp và bấm thuộc tính. Chọn Build Action = Content. Điều này sẽ hiển thị tệp trong Tệp ứng dụng trong Thuộc tính dự án> Xuất bản> Tệp ứng dụng. Bạn sẽ thấy rằng các tập tin bây giờ có thể được chọn (Theo mặc định nó sẽ tự động bao gồm).

ClickOnce bây giờ sẽ sao chép các tập tin vào StartupPath

Để sử dụng nó, hãy làm theo mẫu này:

PrivateFontCollection pfc = new PrivateFontCollection(); 

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

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

Nếu tệp phông chữ của bạn trong thư mục gốc, tôi nghĩ bạn không thể liên kết nó với Application.StartupPath vì bạn sẽ nhận được đường dẫn với "bin/gỡ lỗi "thư mục. Vì vậy, bạn phải sử dụng như thế; string path = Application.StartupPath.Substring (0, Application.StartupPath.IndexOf ("bin")) + fontName.ttf; – Erdogan

0

này sẽ được tải một phông chữ thành một bộ sưu tập font chữ riêng, và tránh bất kỳ tham chiếu đối tượng và bộ nhớ lỗi thời gian chạy mà bạn có thể thấy bằng cách sử dụng các ví dụ ở trên.

Vì lý do hiệu suất, chúng tôi chỉ muốn tải phông chữ một lần và giữ tham chiếu đến phông chữ cho nhiều thao tác vẽ giữa các cuộc gọi. Bí quyết là để đảm bảo PrivateFontCollection không đi ra ngoài phạm vi nếu bạn giữ một tham chiếu đến đối tượng Font mà bạn đã tạo.

Thêm một số biến tĩnh (chia sẻ)

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

Sau đó tuyên bố các chức năng này

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 

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 

Sử dụng như sau:

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