2008-11-18 16 views
34

हर बार जब मैं अपने एप्लिकेशन में एक नया फॉर्म बनाता हूं, तो यह डिफ़ॉल्ट रूप से "माइक्रोसॉफ्ट सैन्स सेरिफ़, 8.25pt" फ़ॉन्ट का उपयोग करता है। मैं इसे बदल नहीं रहा क्योंकि मुझे पता है कि इस मामले में मेरा फॉर्म सिस्टम के लिए जो भी डिफ़ॉल्ट फ़ॉन्ट है उसे उठाएं। हालांकि, जब मैं अपना आवेदन चलाता हूं, तो इस्तेमाल किया जाने वाला फ़ॉन्ट अभी भी कुछ भी है लेकिन सेगो यूआई (मेरे विंडोज़ विस्टा ओएस में मेरा डिफ़ॉल्ट सिस्टम फ़ॉन्ट)।विंडोज़ फॉर्म के लिए डिफ़ॉल्ट फ़ॉन्ट

ऐसा क्यों होता है? मैं कैसे सुनिश्चित कर सकता हूं कि मेरा एप्लिकेशन एक सामान्य विंडोज अनुप्रयोग की तरह दिखता है?

उत्तर

14

इस blog entry को फॉर्म में डिफ़ॉल्ट फ़ॉन्ट के बारे में बात करते हुए देखें जो आप अनुभव कर रहे हैं और यह Connect Bug माइक्रोसॉफ्ट की प्रतिक्रिया के साथ है। संक्षेप में ऐसा लगता है कि फ़ॉर्म को (सही) डिफ़ॉल्ट विंडोज फ़ॉन्ट नहीं मिला है (जिसे आपने बदल दिया है)।

11

हां, यह GetStockObject(DEFAULT_GUI_FONT) द्वारा लौटा गया फ़ॉन्ट का उपयोग करता है। एमएस सैन्स सेरिफ कौन सा है। एक पुराना फ़ॉन्ट, ज्यादातर मशीनों से लंबे समय तक चला गया। फ़ॉन्ट मैपर इसका अनुवाद करता है, कोई आश्चर्य नहीं, माइक्रोसॉफ्ट सैन्स सेरिफ़।

कोई डिफ़ॉल्ट दस्तावेज नहीं है जिसे मैं डिफ़ॉल्ट फ़ॉन्ट को बदलने के बारे में जानता हूं, एसडीके दस्तावेज़ों में स्पष्ट रूप से एमएस सैन्स सेरिफ़ का उल्लेख है। यदि आप सेगो चाहते हैं, तो आपको इसके लिए पूछना होगा। जो सुरक्षित नहीं है, वहां अभी भी Office 2007 के बिना बहुत सी एक्सपी मशीनें हैं। फ़ॉन्ट मैपर इसे उस मशीन पर अनुवादित करेगा जिसमें सेगो उपलब्ध नहीं है। यकीन नहीं है कि क्या पॉप आउट है, मेरे पास ऐसी मशीन नहीं है।

+0

यह वाकई दुखी है। :( – wasker

30

आप पर्चा निर्माता (रों) में InitializeComponent() से पहले जोड़ सकते हैं:

this.Font = SystemFonts.MessageBoxFont; 

यह Windows XP और Windows Vista के साथ काम करने के लिए दिखाई देते हैं।

+0

हां, यह आमतौर पर काम करता है। – Lucas

1

फॉर्म की फ़ॉन्ट प्रॉपर्टी को SystemFonts पर सेट करना। यदि आपके पास संबंधित नियंत्रण वाले समूह बॉक्स हैं तो DialogFont काम नहीं करता है। समूह बॉक्स के अंदर नियंत्रण फ़ॉर्म की फ़ॉन्ट प्रॉपर्टी से प्रभावित नहीं होते हैं। मैंने फ़ॉन्ट प्रॉपर्टी को SystemFonts.DialogFont में प्रत्येक समूह बॉक्स के लिए सेट करके "हल किया"।

41

स्वीकार्य उत्तर वास्तव में प्रश्न का उत्तर नहीं देता है; यह सिर्फ बताता है कि यह व्यवहार क्यों हो रहा है।

कुछ अन्य उत्तरों ठोस कामकाज का प्रस्ताव देते हैं, लेकिन मुझे पता चला है कि सबसे अच्छा समाधान वास्तव में आधार फार्म बनाना है कि आपके आवेदन के सभी रूपों का उत्तराधिकारी इस बेस फॉर्म की फ़ॉन्ट प्रॉपर्टी से SystemFonts.MessageBoxFont पर है निर्माता। यह न केवल यह सुनिश्चित करता है कि आपका एप्लिकेशन उपयोगकर्ता के पर्यावरण के आधार पर रन-टाइम पर सही फ़ॉन्ट उठाता है (हंस पासेंट द्वारा उत्पन्न संभावित समस्या को दूर करना- Office 2007 के बिना एक एक्सपी सेगो यूआई की अनुपस्थिति में माइक्रोसॉफ्ट सैन्स सेरिफ़ का सहारा लेगा), लेकिन आपको अपने वर्तमान विंडोज फ़ॉन्ट के लिए डिज़ाइन-टाइम समर्थन भी प्रदान करता है। डिज़ाइन समय पर सही फ़ॉन्ट का उपयोग करने से समस्या जोसेगोगोम्स बताती है, क्योंकि फॉर्म पर बनाए गए किसी भी कंटेनर नियंत्रण को डिज़ाइन-टाइम पर फ़ॉर्म द्वारा उपयोग किए जाने वाले फ़ॉन्ट को उठाया जाएगा।

उपर्युक्त फायदों के अलावा, यह आपको आपके द्वारा बनाए गए प्रत्येक फॉर्म के लिए कन्स्ट्रक्टर को संशोधित करने और आपके आवेदन के सभी रूपों में स्थिरता सुनिश्चित करने के साथ-साथ आपको अन्य सामान्य कार्यक्षमता रखने के लिए एक स्थान देने के लिए याद रखने से मुक्त करता है । मैं WinForms कार्यान्वयन में बग को ठीक करने के लिए पी/invoking, आदि जैसे कुछ अलग तरीकों से इसका उपयोग करता हूं।

इस दृष्टिकोण के साथ एकमात्र समस्या यह है कि यदि आप किसी विशेष नियंत्रण के लिए फ़ॉन्ट शैली सेट करना चाहते हैं, जैसे बोल्ड।यह करने के लिए सबसे अच्छी जगह है कि फार्म के निर्माता में अब भी है, एक आधार के रूप प्रपत्र के फ़ॉन्ट के साथ शुरू और इसे से शैली को बदलकर: समूह बॉक्स के अंदर

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

नियंत्रण वास्तव में प्रपत्र के फ़ॉन्ट संपत्ति से प्रभावित नहीं हैं । इसका कारण यह है कि कंटेनर नियंत्रण में नियंत्रण को समूह बॉक्स जैसे कंटेनर नियंत्रण के बच्चे के रूप में माना जाता है, लेकिन मुख्य रूप के बच्चे नहीं। ठीक से पैमाने पर करने के लिए, आप नीचे के समान कोड का उपयोग कर सकते groupboxes में उन सहित सभी नियंत्रण के लिए आदेश में:

 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

इस प्रयास करें, एक प्रपत्र पर क्लिक करें और उदाहरण के लिए फ़ॉन्ट आकार बदलें मैं 12pt लिए फार्म का एक फ़ॉन्ट आकार बदल गया है और फिर फॉर्म में ड्रैग टेक्स्ट बॉक्स द्वारा परीक्षण करें। आप देखेंगे, टेक्स्टबॉक्स आकार भी 12pt में बदल दिया गया है। मुझे अभी यह समाधान दुर्घटना से मिला है।

+0

क्या आपने देखा कि 2008 में एक प्रश्न पूछा गया था? यह बहुत देर हो चुकी है –

+2

हां, मैं देखता हूं, लेकिन 2015 में मुझे अभी भी इस प्रश्न का उत्तर चाहिए और जैसा कि मैंने बताया था, मैं दुर्घटना से इस समस्या को हल कर सकता हूं। इसलिए, मुझे लगता है कि मुझे दूसरों के लिए इस समाधान को बताया जाना चाहिए जो शायद मेरे जैसा ही समस्या होगी –

1

Control.DefaultFont केवल पढ़ने के लिए है; एक हैकी ओवरराइट करना था प्रतिबिंब का उपयोग करना है।

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

एक केन्द्र शासित प्रदेशों के लिए इस कोड पर नजर रखने के लिए सुनिश्चित करें, वहाँ आप अगर फ्रेमवर्क कार्यान्वयन परिवर्तन की रक्षा के लिए कोई एपीआई अनुबंध है।

फॉर्म डिज़ाइनर के बारे में भी जागरूक रहें जो अधिकांश समय .designer कक्षाओं में फ़ॉन्ट वर्बैटिम डालेंगे।

संबंधित मुद्दे