2009-08-19 17 views
9

Mam etykietę na mojej stronie WinForm i chcę użyć niestandardowej czcionki o nazwie XCalibur, aby wyglądała bardziej elegancko.Używanie niestandardowych czcionek na etykiecie na WinForm

Jeśli użyję niestandardowej czcionki na etykiecie, a następnie skompiluję rozwiązanie, a następnie .ZIP, pliki w \ bin \ Release będą widoczne dla użytkownika z moją niestandardową aplikacją, której użyłem niezależnie, czy mają zainstalowaną tę czcionkę, czy też nie. nie?

Jeśli tak nie jest, jaki jest właściwy sposób używania niestandardowych czcionek w etykietach.Tekst?

Odpowiedz

20

osadzić czcionki jako zasobu (lub po prostu umieścić go w katalogu bin), a następnie użyć PrivateFontCollection załadować czcionkę (Patrz funkcje AddFontFile i AddMemoryFont). Następnie używasz czcionki normalnie tak, jak zainstalowano ją na komputerze.

Klasa PrivateFontCollection pozwala aplikacji do zainstalowania prywatną wersję istniejącego czcionki bez wymóg, aby zastąpić wersję czcionki systemu . Na przykład GDI + może tworzyć prywatną wersję czcionki Arial oprócz czcionki Arial używanej przez system. PrivateFontCollection można również użyć do zainstalowania czcionek, które nie istnieją w systemie operacyjnym pod numerem .

Source

21

Po pominie ewentualnie 30-50 postów na tym, że w końcu udało się wymyślić rozwiązanie, które faktycznie działa! Należy wykonać następujące kroki:

1.) Dołącz plik czcionki (w moim przypadku plik ttf) do zasobów aplikacji. Aby to zrobić, kliknij dwukrotnie plik "Resources.resx".

enter image description here

2.) Zaznacz opcję "Dodaj zasób" i kliknij strzałkę w dół. Wybierz opcję "Dodaj istniejący plik". Teraz wyszukaj plik czcionki, wybierz go i kliknij OK. Zapisz plik "Resources.resx".

enter image description here

3.) Utwórz funkcję (powiedzmy, InitCustomLabelFont()), a następnie dodaj następujący kod w nim.

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

Twoja niestandardowa czcionka została dodana do kolekcji PrivateFontCollection.

4.) Następnie przypisz czcionkę do etykiety i dodaj do niej domyślny tekst.

 //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. Przejdź do układu formularza i wybierz etykietę.Kliknij go prawym przyciskiem myszy i wybierz "Właściwości". Wyszukaj właściwość "UseCompatibleTextRendering" i ustaw ją na "True".

6. Jeśli jest to konieczne, możesz zwolnić czcionkę po upewnieniu się, że nigdy nie będzie można jej użyć ponownie. Zadzwoń pod numer PrivateFontCollection.Dispose() method, możesz także bezpiecznie zadzwonić do Marshal.FreeCoTaskMem (dane). Często zdarza się, że nie przejmuj się i nie ładuj czcionki przez całe życie aplikacji.

7.) Uruchom aplikację. Zobaczysz teraz, że dla danej etykiety ustawiono niestandardową czcionkę.

Pozdrawiam!

+0

** UseCompatibleTextRendering ** nie jest konieczne, jeśli zarejestrować czcionkę z ** AddFontMemResourceEx() **. Jako bonus, czcionka staje się również użyteczna w TextBoxach i innych kontrolkach. Zobacz [tę odpowiedź] (http://stackoverflow.com/a/1956043/25312) i [dokumentacja MSDN] (https://msdn.microsoft.com/en-us/library/dd183325 (v = vs.85) .aspx). – SWB

+0

Czy można to dodać do właściwości kontrolki, aby wybrać jedną z osadzonych czcionek lub normalną czcionkę? Przykład: 'private Font m_FontFace = UserControl.DefaultFont; public Font FontFace {get {return m_FontFace; } ustaw {m_FontFace = wartość; }} ' –

+0

Niewielkie zalecenie do użytku w świecie rzeczywistym, upewnij się, że FreeCoTaskMem znajduje się w bloku finally, więc w przypadku wyjątków bufor pamięci zostanie zwolniony. – Rushyo

2

Dodaj czcionkę, której chcesz użyć.

enter image description here

`

PrivateFontCollection modernFont = new PrivateFontCollection(); 

    modernFont.AddFontFile("Font.otf"); 

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

Zrobiłem metody, jak również.

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

Daje "System.Runtime.InteropServices.ExternalException: ogólny błąd w GDI +" – Fusseldieb

Powiązane problemy