2009-08-19 10 views
9

Tôi có một nhãn trên Winform của mình và tôi muốn sử dụng phông chữ tùy chỉnh có tên là XCalibur để làm cho nó xuất hiện dễ thấy hơn.Sử dụng phông chữ tùy chỉnh trên Nhãn trên Winforms

Nếu tôi sử dụng phông chữ tùy chỉnh trên nhãn và sau đó xây dựng giải pháp và sau đó .ZIP tệp trong \ bin \ Release sẽ người dùng cuối xem nhãn bằng ứng dụng tùy chỉnh của tôi mà tôi đã sử dụng bất kể họ đã cài đặt phông chữ hay không phải?

Nếu đây không phải là trường hợp, cách thích hợp để sử dụng Phông chữ tùy chỉnh trên Nhãn.Tiếp theo là gì?

Trả lời

20

Nhúng font như một nguồn tài nguyên (hoặc chỉ cần đưa nó vào trong thư mục bin), và sau đó sử dụng PrivateFontCollection để tải font (Xem chức năng AddFontFileAddMemoryFont). Sau đó bạn sử dụng phông chữ bình thường như nó đã được cài đặt trên máy.

Lớp PrivateFontCollection phép ứng dụng để cài đặt một phiên bản tin của một phông chữ hiện tại mà không yêu cầu để thay thế cho phiên bản hệ điều của phông chữ. Ví dụ: GDI + có thể tạo ra một phiên bản riêng của phông chữ Arial ngoài phông chữ Arial mà hệ thống sử dụng. PrivateFontCollection cũng có thể được sử dụng để cài đặt phông chữ không tồn tại trong hệ điều hành.

Source

21

Sau khi xem qua có thể là 30-50 bài viết về vấn đề này, tôi cuối cùng đã được thể đưa ra một giải pháp mà thực sự hoạt động! Vui lòng làm theo các bước theo thứ tự:

1.) Bao gồm tệp phông chữ (trong trường hợp của tôi là tệp ttf) trong tài nguyên ứng dụng của bạn. Để thực hiện việc này, hãy nhấp đúp vào tệp "Resources.resx".

enter image description here

2.) Chọn "Thêm tài nguyên" tùy chọn và nhấp vào mũi tên xuống. Chọn tùy chọn "Thêm tệp hiện có". Bây giờ, tìm kiếm tệp phông chữ của bạn, chọn tệp đó và nhấp vào OK. Lưu tệp "Resources.resx".

enter image description here

3.) Tạo một hàm (nói, InitCustomLabelFont()), và thêm đoạn mã sau vào nó.

 //Create your private font collection object. 
     PrivateFontCollection pfc = new PrivateFontCollection(); 

     //Select your font from the resources. 
     //My font here is "Digireu.ttf" 
     int fontLength = Properties.Resources.Digireu.Length; 

     // create a buffer to read in to 
     byte[] fontdata = Properties.Resources.Digireu; 

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

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

     // pass the font to the font collection 
     pfc.AddMemoryFont(data, fontLength); 

Phông chữ tùy chỉnh của bạn hiện đã được thêm vào PrivateFontCollection.

4.) Tiếp theo, gán phông chữ cho Nhãn của bạn và thêm một số văn bản mặc định vào nhãn.

 //After that we can create font and assign font to label 
     label1.Font = new Font(pfc.Families[0], label1.Font.Size); 
     label1.Text = "My new font"; 

5.) Chuyển đến bố cục biểu mẫu và chọn nhãn của bạn.Nhấp chuột phải vào nó và chọn "Thuộc tính". Tìm thuộc tính "UseCompatibleTextRendering" và đặt thành "True".

6.) Nếu cần thiết, bạn có thể nhả phông chữ sau khi chắc chắn rằng nó không bao giờ được sử dụng lại. Gọi số PrivateFontCollection.Dispose() method, sau đó bạn có thể gọi Marshal.FreeCoTaskMem (dữ liệu) một cách an toàn. Nó là khá phổ biến để không bận tâm và để lại các font tải cho cuộc sống của ứng dụng.

7.) Chạy ứng dụng của bạn. Bây giờ bạn sẽ thấy rằng bạn đã đặt phông chữ tùy chỉnh cho nhãn đã cho.

Chúc mừng!

+0

** UseCompatibleTextRendering ** là không cần thiết nếu bạn đăng ký font với ** AddFontMemResourceEx() **. Như một phần thưởng, phông chữ cũng trở nên có thể sử dụng với TextBoxes và các điều khiển khác. Xem [câu trả lời này] (http://stackoverflow.com/a/1956043/25312) và [tài liệu MSDN] (https://msdn.microsoft.com/en-us/library/dd183325 (v = vs.85) .aspx). – SWB

+0

Điều này có thể được thêm vào thuộc tính của điều khiển để chọn một trong các phông chữ được nhúng hoặc phông chữ thông thường không? Ví dụ: 'private Font m_FontFace = UserControl.DefaultFont; công khai Font FontFace {get {return m_FontFace; } đặt {m_FontFace = giá trị; }} ' –

+0

Đề xuất nhỏ để sử dụng trong thế giới thực, đảm bảo FreeCoTaskMem nằm trong khối Cuối cùng, vì vậy trong trường hợp ngoại lệ, bộ nhớ đệm sẽ được giải phóng. – Rushyo

2

Thêm phông chữ bạn muốn sử dụng.

enter image description here

'

PrivateFontCollection modernFont = new PrivateFontCollection(); 

    modernFont.AddFontFile("Font.otf"); 

    label.Font = new Font(modernFont.Families[0], 40);` 

tôi đã thực hiện một phương pháp là tốt.

void UseCustomFont(string name, int size, Label label) 
    { 

     PrivateFontCollection modernFont = new PrivateFontCollection(); 

     modernFont.AddFontFile(name); 

     label.Font = new Font(modernFont.Families[0], size); 


    } 

enter image description here

+1

Cung cấp cho "System.Runtime.InteropServices.ExternalException: General Error in GDI +" – Fusseldieb