उच्च DPI सेटिंग (जैसे 150%) के साथ मशीन पर सही ढंग से चलाने के लिए किसी ऐप को कैसे कॉन्फ़िगर करें?


103

मैंने C # में एक साधारण Winforms एप्लिकेशन बनाया है। जब मैं उच्च DPI सेटिंग्स (उदाहरण के लिए 150%) के साथ मशीन पर एप्लिकेशन चलाता हूं, तो एप्लिकेशन छोटा हो जाता है। अब तक सब ठीक है! लेकिन फोंट को एक उच्च फ़ॉन्ट आकार के साथ प्रदान करने के बजाय, सभी ग्रंथों को केवल छोटा किया जाता है। यह निश्चित रूप से बहुत धुंधले पाठ की ओर जाता है (बटन आदि जैसे सभी नियंत्रणों पर)।

क्या विंडोज़ को ग्रंथों को सही तरीके से प्रस्तुत करने का ध्यान नहीं रखना चाहिए? उदाहरण के लिए मेरे एप्लिकेशन का शीर्षक बार कुरकुरा और स्पष्ट है।

जवाबों:


132

एक बार जब आप 100% (या "XP- स्टाइल डीपीआई स्केलिंग" चेकबॉक्स के साथ 125% टिक जाते हैं), डिफ़ॉल्ट रूप से विंडोज आपके यूआई के स्केलिंग को संभाल लेता है। ऐसा करने से आपका ऐप एक बिटमैप को अपना आउटपुट प्रदान करता है और उस बिटमैप को स्क्रीन पर आरेखित करता है। उस बिटमैप का पुनर्पाठ पाठ को अनिवार्य रूप से अस्पष्ट लगता है। एक विशेषता जिसे "डीपीआई वर्चुअलाइजेशन" कहा जाता है, यह पुराने कार्यक्रमों को उच्च रिज़ॉल्यूशन मॉनिटर पर प्रयोग करने योग्य बनाता है।

आपको स्पष्ट रूप से यह बताना होगा कि आप <dpiAware>अपने प्रकट में तत्व को जोड़कर उच्च डीपीआई सेटिंग्स को संभाल सकते हैं। MSDN पृष्ठ यहाँ है, लेकिन यह पूरा नहीं है क्योंकि यह UAC सेटिंग्स को छोड़ रहा है। प्रोजेक्ट + नया आइटम जोड़ें, "एप्लिकेशन मैनिफ़ेस्ट फ़ाइल" चुनें। प्रकट पाठ संपादित करें या इसे कॉपी / पेस्ट करें:

<?xml version="1.0" encoding="utf-8"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
    <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
        <security>
            <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
                <requestedExecutionLevel level="asInvoker" uiAccess="false" />
            </requestedPrivileges>
        </security>
    </trustInfo>
    <asmv3:application>
        <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
            <dpiAware>true</dpiAware>
        </asmv3:windowsSettings>
    </asmv3:application>
</assembly>

आप अपने मुख्य () विधि में SetProcessDPIAware () विधि को पिनवॉक भी कर सकते हैं, उदाहरण के लिए यदि आप क्लिकऑनलाइन के साथ तैनात हैं, तो आवश्यक है:

    [STAThread]
    static void Main() {
        if (Environment.OSVersion.Version.Major >= 6) SetProcessDPIAware();
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());             // Edit as needed
    }

    [System.Runtime.InteropServices.DllImport("user32.dll")]
    private static extern bool SetProcessDPIAware();

अद्यतन, यदि आप VS2015 अद्यतन 1 या उच्चतर का उपयोग करते हैं, तो यह सामान्य आवश्यकता अंततः थोड़ी आसान है। जोड़े गए प्रकट में पहले से ही प्रासंगिक निर्देश है, बस टिप्पणियों को हटा दें।


खोज के लिए कीवर्ड इसलिए मैं इस पोस्ट को वापस पा सकता हूं: dpiAware


धन्यवाद, आपका समाधान ठीक काम करता है। एकमात्र समस्या यह है कि सभी चित्र अब अपने मूल आकार में हैं। मुझे लगता है कि मुझे अपने जीयूआई में अतिरिक्त "रेटिना" -कॉइन को जोड़ने का एक तरीका ढूंढना होगा ...
बोरिस

@ हंसपैंट मुझे धुंधली फोंट के साथ एक ही समस्या है, और इस समाधान को लागू करने के बाद, मेरे नियंत्रण पैमाने नहीं हैं और वे फिट नहीं हो सकते हैं। दोनों को काम कैसे मिलेगा?
गजो ३५

2
इस Win8 पागलपन की जाँच करने वाले किसी भी व्यक्ति के लिए, SetProcessDPIAwareपदावनत किया जाता है, और यह ठीक से काम नहीं करता है (कम से कम Win8.1 में नहीं), जिससे विभिन्न नियंत्रणों पर अप्रत्याशित स्केलिंग होती है। मैं इसके बजाय प्रकट दृष्टिकोण का उपयोग करने की दृढ़ता से सलाह देता हूं।
जेसन विलियम्स

5
एचएमए, विंडोज 8.1 ने प्रति-मॉनिटर डीपीआई का अधिग्रहण किया। मुझे पता नहीं था कि मुझे इसकी आवश्यकता है।
हंस पसंत

1
यदि आप परिनियोजन के लिए ClickOnce का उपयोग करने जा रहे हैं, तो आप प्रकट में dpiAware विकल्प का उपयोग नहीं कर सकते हैं, इसके बजाय SetProcessDPIAware () का उपयोग करें।
मटियास

17

एप्लिकेशन को दो अलग-अलग मोड में विकसित किया जा सकता है।

पहला यह है कि हमारे आवेदन को गैर-डीपीआई-जागरूक घोषित किया जाए (कुछ भी घोषित नहीं किया जाएगा)। इस मामले में ऑपरेटिंग सिस्टम अपेक्षित 96 DPI के तहत हमारे आवेदन को प्रस्तुत करेगा और फिर उस बिटमैप स्केलिंग के लिए करेगा जो हमने पहले चर्चा की थी। परिणाम एक धुंधला दिखने वाला अनुप्रयोग होगा, लेकिन एक सही लेआउट के साथ।

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

यदि आप उससे बचना चाहते हैं, तो आपको अपने आवेदन को मॉनिटर-डीपीआई-जागरूक के अनुसार घोषित करना चाहिए। तब आपको यह पता लगाना चाहिए कि आपके आवेदन को अलग-अलग मॉनिटरों में खींचा गया है और वर्तमान के डीपीआई के अनुसार प्रस्तुत किया गया है।

DPI जागरूकता की घोषणा एक घोषणापत्र फ़ाइल में की जाती है।

निम्नलिखित लिंक स्टैकओवरफ़्लो का संदर्भ लें


क्या होगा यदि उपयोगकर्ताओं के पास पुनर्स्थापित आकार में एक खिड़की है और इसे स्थानांतरित करें तो इसके कुछ हिस्से अलग-अलग मॉनिटर पर हैं? क्या हमें दो बार सब कुछ रेंडर करने और बाउंडिंग बॉक्स के रूप में मॉनिटर सीमाओं का उपयोग करने की आवश्यकता है? कितना है कि winforms पुस्तकालयों द्वारा कवर किया गया है?
Cee McSharpface

4

.NET फ्रेमवर्क 4.7 और विंडोज 10 क्रिएटर्स अपडेट (1703) या नए का उपयोग करते हुए आपको अपने विंडोज एप्लिकेशन एप्लिकेशन के लिए उच्च डीपीआई समर्थन को कॉन्फ़िगर करने के लिए निम्न चीजें करनी चाहिए:

विंडोज 10 के साथ संगतता घोषित करें।

ऐसा करने के लिए, अपनी manifestफ़ाइल में निम्न जोड़ें :

<compatibility xmlns="urn:schemas-microsoft.com:compatibility.v1">
  <application>
    <!-- Windows 10 compatibility -->
    <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
  </application>
</compatibility>

app.configफ़ाइल में प्रति मॉनिटर DPI जागरूकता सक्षम करें ।

Windows प्रपत्र एक नई System.Windows.Forms.ApplicationConfigurationSection तत्व का परिचय देता है। नई सुविधाओं और अनुकूलन को जोड़ने के लिए तत्व। .NET फ्रेमवर्क 4.7 से शुरू होता है। उच्च डीपीआई का समर्थन करने वाली नई सुविधाओं का लाभ उठाने के लिए, अपनी एप्लिकेशन कॉन्फ़िगरेशन फ़ाइल में निम्न जोड़ें।

<System.Windows.Forms.ApplicationConfigurationSection>
  <add key="DpiAwareness" value="PerMonitorV2" />
</System.Windows.Forms.ApplicationConfigurationSection>

जरूरी

.NET फ्रेमवर्क के पिछले संस्करणों में, आपने उच्च डीपीआई समर्थन जोड़ने के लिए मैनिफ़ेस्ट का उपयोग किया था। यह दृष्टिकोण अब अनुशंसित नहीं है, क्योंकि यह app.config फ़ाइल पर परिभाषित सेटिंग्स को ओवरराइड करता है।

स्थिर EnableVisualStyles विधि को कॉल करें।

आपके एप्लिकेशन प्रविष्टि बिंदु में यह पहली विधि कॉल होनी चाहिए। उदाहरण के लिए:

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());   
}

इसका लाभ डायनेमिक DPI परिदृश्यों के लिए समर्थन है जिसमें उपयोगकर्ता Windows प्रपत्र अनुप्रयोग लॉन्च होने के बाद DPI या स्केल फैक्टर को बदलता है।

स्रोत: विंडोज फॉर्म में उच्च डीपीआई समर्थन


3

इन सुझावों में से किसी ने भी मेरे लिए काम नहीं किया लेकिन, मेरे द्वारा हटाए जाने के बाद कुछ हुआ Form.Font = new... Form.Design.csफॉर्म को फिर से ठीक करना शुरू कर दिया, यह काम करता है कि क्या फॉन्ट को कंस्ट्रक्टर में परिभाषित किया गया है या नहीं। क्यों? किसी और को समझाने में सक्षम हो सकता है, मैं बस मेरे द्वारा किए गए परिवर्तन के बारे में बात कर सकता हूं और मुझे कुछ मिनटों तक लगा कि यह उस रूप के लिए मूल कारण था जिस पर मैं काम कर रहा था। आशा करता हूँ की ये काम करेगा।


2

कम से कम विज़ुअल स्टूडियो 2017 के बाद से आपको बस एक मैनिफ़ेस्ट फ़ाइल जोड़ना होगा और इस सेक्शन को अनकम्प्लिमेंट करना होगा:

<application xmlns="urn:schemas-microsoft-com:asm.v3">
    <windowsSettings>
        <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
    </windowsSettings>
</application>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.