windows - एमएफसी संवाद नियंत्रण के लिए कौन सा फ़ॉन्ट डिफ़ॉल्ट है?



visual-studio visual-studio-2008 (1)

पहला उदाहरण सिस्टम फ़ॉन्ट ( SYSTEM_FONT ) का उपयोग कर रहा है, जैसा कि GetStockObject फ़ंक्शन के साथ पुनर्प्राप्त किया गया है , जो एक बिटमैप फ़ॉन्ट है जिसका उपयोग विंडोज 3 के दिनों से नहीं किया गया है। अधिक जानकारी रेमंड चेन के ब्लॉग और माइकल कपलन के ब्लॉग पर उपलब्ध है

दूसरा उदाहरण "एमएस शैल डीएलजी" फ़ॉन्ट का उपयोग कर रहा है, जैसा आपने उससे पूछा था। यह वास्तव में विंडोज 9 5 और 98 के दिनों में यूआई फ़ॉन्ट को "माइक्रोसॉफ्ट सांस सेरिफ़" या "एमएस सैन्स सेरिफ़" नामक एक फ़ॉन्ट पर मैप करता है। इसे DEFAULT_GUI_FONT रूप में भी जाना जाता है, जो वास्तव में इसके लिए एक सटीक नाम होता था, लेकिन हां, यह अब सटीक नहीं है।

विंडोज 2000 (और एक्सपी में जारी) के साथ शुरुआत, ताहोमा को डिफ़ॉल्ट यूआई फ़ॉन्ट के रूप में इस्तेमाल किया गया था। तीसरे उदाहरण में आप यही देख रहे हैं: ताहोमा 8 pt। दुर्भाग्यवश, उन ऑपरेटिंग सिस्टमों पर भी, "एमएस शैल डीएलजी" ताहोमा नहीं लौटाता है - यह अभी भी एमएस सैन्स सेरिफ़ लौटाता है, यही कारण है कि यह गलत दिखता है।

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

और जब तक विंडोज विस्टा बाहर नहीं आया तब तक सब ठीक और अच्छा था। और विंडोज विस्टा में, माइक्रोसॉफ्ट में होने वाली शक्तियों का फैसला किया गया था कि ताहोमा को थोड़ी देर तक दांत मिल रहा था और विंडोज एक और यूआई फ़ॉन्ट अपग्रेड के कारण था। उन्होंने अपने स्वयं के विशेष फ़ॉन्ट इन-हाउस को सेगो यूआई नामक विकसित किया, माना जाता है कि इष्टतम ऑन-स्क्रीन पठनीयता के लिए डिज़ाइन किया गया था। और एक विशेष छोटे मोड़ में, उन्होंने फैसला किया कि फ़ॉन्ट आकार के बावजूद ओएस के पिछले संस्करण द्वारा उपयोग किए जाने वाले डिफ़ॉल्ट आकार को 8 pt की बजाय 9 pt होना चाहिए। और आपको शायद लगता है कि या तो "एमएस शैल डीएलजी", "एमएस शैल डीएलजी 2", या DS_SHELLFONT (या तीनों) आपको यह नया-फंसे हुए सेगो यूआई फ़ॉन्ट मिलेगा, लेकिन आप गलत होंगे।

उह ओह। अब चीजें मुश्किल हो जाती हैं ... Vista केवल XP की तुलना में एक अलग फ़ॉन्ट का उपयोग नहीं करता है जो एक आकार-फिट-सभी पहचानकर्ता के साथ आसानी से सुलभ नहीं है, लेकिन यह एक अलग आकार का भी उपयोग करता है, जिस तरह से आपका संवाद उन पर दिखेगा सिस्टम, अगर आप इसे प्रदर्शित करने के लिए प्राप्त कर सकते हैं। कई जगहों पर, विंडोज़ शैल टीम ने चुनौती को चुनौती देने के लिए दिखाई दिया - ताहोमा 8 pt का उपयोग पूरे स्थान पर किया जाता है , यहां तक ​​कि एरो थीम सक्षम होने पर, जब यह सेगो यूआई 9 pt का उपयोग करना होता है। इस तरह की चीज वास्तव में यूआई को अप्रचलित बनाती है, और यह विस्टा के शुरुआती दिनों में बहुत सारी नाइटपिकिंग का विषय था। अब, ऐसा लगता है कि ज्यादातर लोग इसके बारे में भूल गए हैं, लेकिन यूआई ने कम बिखरे हुए और असंगत दिखने शुरू नहीं किए हैं।

और आप विंडोज शैल टीम नहीं हैं: आप अपने ऐप में इससे दूर नहीं जा सकते हैं। Windows Vista उपयोगकर्ता अनुभव के लिए शीर्ष नियम स्पष्ट रूप से यह भी बताते हैं कि आपको हमेशा यह करना चाहिए:

  • सेगो यूआई, नया विंडोज विस्टा सिस्टम फ़ॉन्ट का प्रयोग करें।
  • विंडोज थीम एपीआई का उपयोग कर सिस्टम फ़ॉन्ट, आकार और रंगों को हमेशा संदर्भित करके उपयोगकर्ता की सेटिंग्स का सम्मान करें। फोंट, आकार या रंगों के लिए निश्चित मानों का उपयोग न करें।

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

विंडोज या संवाद शुरू करने के लिए मेरा कोड आम तौर पर ऐसा कुछ दिखता है ( SystemInfo::IsVistaOrLater एक सहायक कार्य है जिसे मैंने लिखा है; कार्यान्वयन स्पष्ट है):

// Get the system message box font
NONCLIENTMETRICS ncm;
ncm.cbSize = sizeof(ncm);

// If we're compiling with the Vista SDK or later, the NONCLIENTMETRICS struct
// will be the wrong size for previous versions, so we need to adjust it.
#if(_MSC_VER >= 1500 && WINVER >= 0x0600)
if (!SystemInfo::IsVistaOrLater())
{
    // In versions of Windows prior to Vista, the iPaddedBorderWidth member
    // is not present, so we need to subtract its size from cbSize.
    ncm.cbSize -= sizeof(ncm.iPaddedBorderWidth);
}
#endif

SystemParametersInfo(SPI_GETNONCLIENTMETRICS, ncm.cbSize, &ncm, 0);
HFONT hDlgFont = CreateFontIndirect(&(ncm.lfMessageFont));

// Set the dialog to use the system message box font
SetFont(m_DlgFont, TRUE);
SendMessage(hWnd, WM_SETFONT, (WPARAM)hDlgFont, MAKELPARAM(FALSE, 0));

या आसान SendMessageToDescendants विधि के साथ भी आसान है
( m_DlgFont कक्षा के लिए परिभाषित एक CFont ऑब्जेक्ट है):

// Get the system message box font
NONCLIENTMETRICS ncm;
ncm.cbSize = sizeof(ncm);
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, ncm.cbSize, &ncm, 0);
LOGFONT lfDlgFont = ncm.lfMessageFont;
m_DlgFont.CreateFontIndirect(&lfDlgFont);

// Set the dialog and all its controls to use the system message box font
SetFont(m_DlgFont, TRUE);
SendMessageToDescendants(WM_SETFONT, (WPARAM)m_DlgFont.m_hFont, MAKELPARAM(FALSE, 0), TRUE);

यदि आप एमएफसी का उपयोग नहीं कर रहे हैं, तो मैं SendMessageToDescendants अपने स्वयं के रिकर्सिव संस्करण को लागू करने की अत्यधिक अनुशंसा करता हूं। यह प्रारंभिक कोड को बहुत आसान बनाता है।

नीचे दी गई तस्वीर (विस्तारित, इसलिए आप अंतर को बेहतर ढंग से देखते हैं) डायनामिक रूप से बनाए गए संपादन नियंत्रण (ऊपरी दो उदाहरण) और संवाद संपादक (निम्न उदाहरण) से बनाए गए नियंत्रण संपादित करें के बीच फ़ॉन्ट अंतर दिखाता है। मैं अपने गतिशील रूप से बनाए गए सीईडीआईटी नियंत्रणों का फ़ॉन्ट कैसे डिफ़ॉल्ट (निम्न उदाहरण) की तरह दिख सकता हूं?

मैंने सीईडीआईटी नियंत्रणों को निम्नलिखित की तरह बनाया है:

obj->CreateEx(WS_EX_CLIENTEDGE, _T("EDIT"), _T(""),
              WS_CHILD | WS_VISIBLE | WS_TABSTOP,
              rect.left, rect.top, rect.Width(), rect.Height(),
              GetSafeHwnd(), reinterpret_cast<HMENU>(mId));

obj->SetFont(&mFont); // mFont was created in the Dialog Constructor
                      // with mFont.CreatePointFont(80, _T("MS Shell Dlg"));

आपकी सहायताके लिए धन्यवाद!





mfc