2009-02-17 16 views
22

Đây có lẽ là lãnh thổ Noob nhưng những gì heck:Làm thế nào để nhanh chóng và dễ dàng nhúng phông chữ trong ứng dụng winforms trong C#

Tôi muốn nhúng phông chữ trong ứng dụng winforms của tôi vì vậy mà tôi không cần phải lo lắng về việc họ bị được cài đặt trên máy. Tôi đã tìm kiếm một chút trên trang MSDN và tìm thấy một vài gợi ý về việc sử dụng các cuộc gọi API Windows nguyên bản, ví dụ như Michael Caplans (sp?) Hướng dẫn được liên kết bởi Scott Hanselman. Bây giờ, tôi có thực sự phải trải qua tất cả những rắc rối đó không? Tôi không thể sử dụng phần tài nguyên của ứng dụng của mình được không?

Nếu không, tôi có thể sẽ đi tuyến đường cài đặt. Trong trường hợp đó, tôi có thể làm điều đó theo chương trình không? Chỉ cần sao chép tệp phông chữ vào thư mục Windows \ Fonts?

Chỉnh sửa: Tôi biết vấn đề cấp phép, cảm ơn sự quan tâm.

+2

Bạn có thể làm điều đó, nhưng cũng lưu ý rằng phông chữ phần mềm cũng có giấy phép và bạn cần đảm bảo rằng bạn không vi phạm bất kỳ giấy phép nào cấm nhúng và triển khai. – Rad

Trả lời

1

Tôi không thể sử dụng phần tài nguyên của ứng dụng của mình?

Có, nhưng cần phải là tài nguyên gốc chứ không phải tài nguyên .NET (tức là sử dụng rc.exe, trình biên dịch tài nguyên gốc).

4
// specify embedded resource name 
string resource = "embedded_font.PAGAP___.TTF"; 

// receive resource stream 
Stream fontStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resource); 

// create an unsafe memory block for the font data 
System.IntPtr data = Marshal.AllocCoTaskMem((int)fontStream.Length); 

// create a buffer to read in to 
byte[] fontdata = new byte[fontStream.Length]; 

// read the font data from the resource 
fontStream.Read(fontdata, 0, (int)fontStream.Length); 

// copy the bytes to the unsafe memory block 
Marshal.Copy(fontdata, 0, data, (int)fontStream.Length); 

// pass the font to the font collection 
private_fonts.AddMemoryFont(data, (int)fontStream.Length); 

// close the resource stream 
fontStream.Close(); 

// free up the unsafe memory 
Marshal.FreeCoTaskMem(data); 
28

Đây là những gì đã làm việc cho tôi trong VS 2013 mà không phải sử dụng khối không an toàn.

Nhúng tài nguyên

  1. Bấm đúp Resources.resx, và trong thanh công cụ cho các nhà thiết kế nhấn Add Resource/Thêm hiện File và chọn tập tin .ttf bạn
  2. Trong giải pháp thám hiểm của bạn, bấm chuột phải vào tệp .ttf của bạn (bây giờ trong thư mục Tài nguyên) và đi đến Thuộc tính. Đặt Action xây dựng để "Embedded Resource"

tải font vào bộ nhớ

  1. Thêm using System.Drawing.Text; để Form1.cs bạn nộp

  2. Thêm mã trên và bên trong constructor mặc định của bạn để tạo phông chữ trong bộ nhớ (không sử dụng "không an toàn" như các ví dụ khác đã được hiển thị). Dưới đây là toàn bộ Form1.cs tôi:

    using System; 
    using System.Collections.Generic; 
    using System.ComponentModel; 
    using System.Data; 
    using System.Drawing; 
    using System.Linq; 
    using System.Text; 
    using System.Threading.Tasks; 
    using System.Windows.Forms; 
    using System.Reflection; 
    
    using System.Drawing.Text; 
    
    namespace WindowsFormsApplication1 
    { 
        public partial class Form1 : Form 
        { 
         [System.Runtime.InteropServices.DllImport("gdi32.dll")] 
         private static extern IntPtr AddFontMemResourceEx(IntPtr pbFont, uint cbFont, 
          IntPtr pdv, [System.Runtime.InteropServices.In] ref uint pcFonts); 
    
         private PrivateFontCollection fonts = new PrivateFontCollection(); 
    
         Font myFont; 
    
         public Form1() 
         { 
          InitializeComponent(); 
    
          byte[] fontData = Properties.Resources.MyFontName; 
          IntPtr fontPtr = System.Runtime.InteropServices.Marshal.AllocCoTaskMem(fontData.Length); 
          System.Runtime.InteropServices.Marshal.Copy(fontData, 0, fontPtr, fontData.Length); 
          uint dummy = 0; 
          fonts.AddMemoryFont(fontPtr, Properties.Resources.MyFontName.Length); 
          AddFontMemResourceEx(fontPtr, (uint)Properties.Resources.MyFontName.Length, IntPtr.Zero, ref dummy); 
          System.Runtime.InteropServices.Marshal.FreeCoTaskMem(fontPtr); 
    
          myFont = new Font(fonts.Families[0], 16.0F); 
         } 
        } 
    } 
    

Sử dụng phông chữ của bạn

  1. Thêm nhãn mẫu chính của bạn, và thêm một sự kiện tải để thiết lập font trong Form1. cs:

    private void Form1_Load(object sender, EventArgs e) 
    { 
        label1.Font = myFont; 
    } 
    
+0

Điều này không phù hợp với tôi. Phông chữ của tôi không xuất hiện trong phần 'Properties.Resources'. –

+0

@JamesDonnelly Nó không có nghĩa là để xuất hiện dưới 'Properties.Resources'. Có một thư mục riêng biệt được gọi là 'Tài nguyên' được tạo tại gốc của dự án khi bạn nhập tài nguyên. – Pyroglyph

0

tôi kéo và bỏ một số tài nguyên của tôi và điều này đã làm việc. Sử dụng một tập tin mặc dù. Tôi đoán bạn có thể sử dụng này cũng như để cài đặt phông chữ?

public Form1() 
{ 
    string filename = @"C:\lady.gaga"; 
    File.WriteAllBytes(filename, Resources.KBREINDEERGAMES); 
    PrivateFontCollection pfc = new PrivateFontCollection(); 
    pfc.AddFontFile(filename); 

    Label label = new Label(); 
    label.AutoSize = true; 
    label.Font = new Font(pfc.Families[0], 16); 
    label.Text = "hello world"; 
    Controls.Add(label); 
}