2008-11-18 29 views
34

Uygulamamda her zaman yeni bir form oluşturduğumda, varsayılan olarak "Microsoft Sans Serif, 8.25pt" fontunu kullanır. Bunu değiştirmiyorum çünkü bu durumda formumun formunun, sistem için varsayılan yazı tipi ne olursa olsun alması gerektiğini biliyorum. Ancak, uygulamamı çalıştırdığımda kullanılan yazı tipi hala bir şeydir ancak Segoe UI (Windows Vista işletim sistemimde varsayılan sistem yazı tipim).Windows Forms uygulaması için varsayılan yazı tipi

Bu neden oluyor? Uygulamamın normal bir Windows uygulaması gibi göründüğünden nasıl emin olabilirim?

cevap

14

Kontrol dışarı Karşılaştığınız soruna yol açar Formlar varsayılan yazı bahsediyor bu blog entry ve Microsoft'un yanıtı ile bu Connect Bug. Kısacası, Formlar'ın (doğru) varsayılan windows yazı tipini (değiştirmiş olduğunuz) almıyor gibi görünüyor. Sen Formu yapıcısı (ler) in InitializeComponent() önce ekleyebilir

11

Evet, GetStockObject(DEFAULT_GUI_FONT) tarafından döndürülen yazı tipini kullanır. MS Sans Serif hangisi? Çoğu makineden çoktan geçmiş eski bir yazı tipi. Yazı tipi eşleyicisi onu şaşırtmıyor, Microsoft Sans Serif.

Bu varsayılan yazı tipini değiştirmek için bildiğim belgelenmiş bir prosedür yok, SDK belgeleri açıkça MS Sans Serif'den bahsediyor. Segoe'yi istiyorsan, bunu sormalısın. Bu güvenli bir şey değil, hala Office 2007 olmadan orada bir sürü XP makinesi var. Yazı tipi eşleyicisi onu Segoe'ye sahip olmayan bir makineye çevirecektir. Ne çıkacağından emin değilim, artık böyle bir makinem yok.

+0

Bu gerçekten çok üzücü. :( – wasker

30

:

this.Font = SystemFonts.MessageBoxFont; 

Bu, Windows XP ve Windows Vista ile çalışmak görünmektedir.

+0

Evet, işte bu genellikle kullanıyorum. – Lucas

1

Form'un Font özelliğini SystemFonts.DialogFont olarak ayarlamak, ilişkili denetimlere sahip grup kutularınız varsa çalışmaz. Grup kutusunun içindeki denetimler formun Font özelliğinden etkilenmez. Bunu, her bir grup kutusu için Font özelliğini SystemFonts.DialogFont olarak ayarlayarak "çözdüm".

41

Kabul edilen cevap, soruya gerçekten cevap vermiyor; Sadece bu davranışın neden oluştuğunu açıklıyor.

Diğer yanıtlardan bazıları sağlam çözümler önerir, ancak en iyi çözümün, uygulamanızdaki tüm formların bu temel formun Font özelliğini SystemFonts.MessageBoxFont olarak alması ve bu formdaki formların tümünü temel formunu oluşturmak olduğunu buldum. yapıcı. Bu, uygulamanızın kullanıcı ortamına bağlı olarak çalışma zamanında doğru yazı tipini almasını sağlamakla kalmaz (Hans Passant'ın oluşturduğu potansiyel problemin üstesinden gelmek üzere), Office 2007 olmayan bir XP, Segoe UI yokken Microsoft Sans Serif'e başvurur.), ancak geçerli Windows yazı tipiniz için tasarım zamanı desteğini de verir. Tasarım zamanında doğru yazı tipini kullanmak, Josuegomes'in işaret ettiği problemi çözer, çünkü formda oluşturulan herhangi bir kapsayıcı denetimi, tasarım zamanında form tarafından kullanılan yazı tipini alır.

Yukarıdaki avantajların yanı sıra, oluşturduğunuz her form için yapıcıyı değiştirmeyi hatırlamanız ve uygulamanızdaki tüm formlar arasında tutarlılık sağlamanızın yanı sıra, diğer genel işlevleri yerine getirmeniz için bir yer sağlamanız gerekir. . WinForms uygulamasında hataları düzeltmek için p/invoking, vb. Gibi birkaç farklı şekilde kullanıyorum.

Bu yaklaşımda kalan tek sorun, kalın gibi belirli bir denetim için bir yazı tipi stili ayarlamak istiyorsanız.Gerçekten formun Yazı özelliği etkilenmez

myControl.Font = New Font(Me.Font, FontStyle.Bold) 
1

denetimleri grup kutusunun içinde: Bunu yapmak için en iyi yer bir üs olarak formun yazı ile başlayan ve ondan tarzını değiştirerek, o formun yapıcı hala . Bunun nedeni, konteynır kontrollerindeki kontrollerin, grup kutusu gibi konteyner kontrollerinin çocukları gibi ele alınması, ancak ana formun çocukları değil. Aşağıda benzer kodu kullanabilirsiniz, düzgün ölçekli groupboxes de dahil tüm denetimler için Amacıyla: Bu deneyin

 foreach (Control ctr in this.Controls) 
     { 
      ctr.Font = SystemFonts.IconTitleFont; 

      // controls in groupboxes are not child of main form 
      if (ctr.HasChildren) 
      { 
       foreach (Control childControl in ctr.Controls) 
       { 
        childControl.Font = SystemFonts.IconTitleFont; 
       } 
      }   
     } 
1

Form tıklayın örneğin yazı tipi boyutunu değiştirmek Ben 12pt için Formunun bir yazı tipi boyutunu değiştirdi ve sonra sürükleyin metin kutusuyla formda sınayın. Göreceksiniz, metin kutusu boyutu da 12pt olarak değiştirildi. Bu çözümü kazara aldım.

+0

2008 yılında bir soruyu sorduğunu fark ettin mi? Bu oldukça geç cevap veriyor –

+2

Evet, ama 2015'te hala bu sorunun cevabına ihtiyacım var ve Bu problemi kazara çözdüğüm gibi çözebilirim, sanırım bu çözümü belki de benim gibi aynı soruna sahip olan insanlar için söylemeliyim. –

1

Control.DefaultFont ReadOnly; bir hacky, yansıma kullanmak için üzerine yazmak oldu.

Type settingsType = typeof(Control); 
var defaultFontField = settingsType.GetField("defaultFont", BindingFlags.Static | BindingFlags.NonPublic); 
defaultFontField.SetValue(null, new Font("Segoe UI", 8.25F)); 

bir UT bu kodu da göz önünde olduğundan emin olun, Çerçeve uygulama değişirse sizi korumak için hiçbir API sözleşme yoktur.

Ayrıca, çoğu zaman .designer sınıflarında font yazımı eklenecek form tasarımcısının da farkında olun.

İlgili konular