উচ্চ ডিপিআই সেটিং (উদাহরণস্বরূপ 150%) দিয়ে কোনও মেশিনে সঠিকভাবে চালানোর জন্য কোনও অ্যাপ্লিকেশন কীভাবে কনফিগার করবেন?


104

আমি সি # তে একটি সাধারণ উইনফর্ম অ্যাপ্লিকেশন তৈরি করেছি। আমি যখন হাই ডিপিআই সেটিংস (উদাহরণস্বরূপ 150%) দিয়ে একটি মেশিনে অ্যাপ্লিকেশনটি চালিত করি তখন অ্যাপ্লিকেশনটি ছোট হয়ে যায়। এ পর্যন্ত সব ঠিকই! তবে উচ্চতর ফন্টের আকারের সাথে ফন্টগুলি রেন্ডারিংয়ের পরিবর্তে সমস্ত পাঠ্যকেও খুব ছোট করে রাখা হয়েছে। এটি অবশ্যই খুব ঝাপসা পাঠ্যের দিকে নিয়ে যায় (বোতাম ইত্যাদির মতো সমস্ত নিয়ন্ত্রণে)।

পাঠ্যগুলি সঠিকভাবে উপস্থাপনের জন্য উইন্ডোজের যত্ন নেওয়া উচিত নয়? উদাহরণস্বরূপ, আমার অ্যাপ্লিকেশনটির শিরোনাম দণ্ডটি চকচকে ও পরিষ্কার করা হয়েছে।

উত্তর:


132

একবার আপনি যদি 100% (বা "125%" "এক্সপি-স্টাইলের ডিপিআই স্কেলিং" চেকবক্সটি টিক্স সহ) ছাড়িয়ে যান, তখন ডিফল্টরূপে উইন্ডোজ আপনার ইউআই এর স্কেলিংটি গ্রহণ করে। এটি আপনার অ্যাপ্লিকেশনটিকে তার আউটপুটটিকে বিটম্যাপে রেন্ডার করে এবং সেই বিটম্যাপটি স্ক্রিনে আঁকিয়ে তা করে। এই বিটম্যাপটি পুনরুদ্ধার করা পাঠ্যটিকে অনিবার্যভাবে अस्पष्ट দেখায়। "ডিপিআই ভার্চুয়ালাইজেশন" নামে একটি বৈশিষ্ট্য এটি পুরানো প্রোগ্রামগুলিকে উচ্চ রেজোলিউশন মনিটরে ব্যবহারযোগ্য রাখে।

আপনাকে স্পষ্টভাবে এটি জানাতে হবে যে আপনি <dpiAware>উপাদানটি আপনার ম্যানিফেস্টে যুক্ত করে উচ্চতর ডিপিআই সেটিংস পরিচালনা করতে পারেন । এমএসডিএন পৃষ্ঠাটি এখানে রয়েছে তবে এটি ইউএসি সেটিংস বাদ দিচ্ছে বলে এটি সম্পূর্ণ নয়। প্রকল্প + নতুন আইটেম যুক্ত করুন, "অ্যাপ্লিকেশন ম্যানিফেস্ট ফাইল" বাছুন। ম্যানিফেস্ট পাঠ্য সম্পাদনা করুন বা এটি অনুলিপি / পেস্ট করুন:

<?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>

আপনি আপনার মেইন () পদ্ধতিতে সেটপ্রসেসডিপিআইএআইআইওয়্যার () পিনকওক করতে পারেন, উদাহরণস্বরূপ যদি আপনি ক্লিকঅনস দিয়ে স্থাপন করেন তবে:

    [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


ধন্যবাদ, আপনার সমাধানটি ভাল কাজ করে। কেবলমাত্র সমস্যাটি হ'ল সমস্ত চিত্র এখন তাদের মূল আকারে। আমার ধারণা আমি আমার জিইউআই-তে অতিরিক্ত "রেটিনা"-আইকন যুক্ত করার উপায় খুঁজে পাব ...
বরিস

@ হ্যানসপ্যাস্যান্ট আমার অস্পষ্ট ফন্টগুলির সাথে একই সমস্যা রয়েছে এবং এই সমাধানটি প্রয়োগ করার পরে, আমার নিয়ন্ত্রণগুলি স্কেল হয় না এবং তারা ফিট করতে পারে না। কিভাবে উভয় কাজ পেতে?
gajo357

4
এই উইন 8 পাগলামি তদন্তকারী যে কোনও ব্যক্তির জন্য SetProcessDPIAware, হ্রাস করা হয়েছে, এবং এটি সঠিকভাবে কাজ করে না (কমপক্ষে উইন 8.1 তেও নয়), বিভিন্ন নিয়ন্ত্রণে অনিশ্চিত স্কেলিং সৃষ্টি করে। পরিবর্তে ম্যানিফেস্ট পদ্ধতির ব্যবহারের জন্য আমি দৃ strongly়ভাবে প্রস্তাব দিই।
জেসন উইলিয়ামস

4
Hmya, উইন্ডোজ 8.1 প্রতি মনিটর DPI অধিগ্রহণ করেছে। আমি জানতাম না যে আমার এটির দরকার ছিল।
হ্যান্স প্যাস্যান্ট

4
আপনি যদি মোতায়েনের জন্য ক্লিকঅনস ব্যবহার করতে চলেছেন তবে আপনি dpiAware বিকল্পটি ম্যানিফেস্টে ব্যবহার করতে পারবেন না, পরিবর্তে সেটপ্রসেসডিপিআইএআইওয়্যার () ব্যবহার করুন।
Matías

17

অ্যাপ্লিকেশন দুটি ভিন্ন মোডে বিকাশ করা যেতে পারে।

প্রথমটি হ'ল আমাদের অ্যাপ্লিকেশনটিকে নন-ডিপিআই-সচেতন হিসাবে ঘোষণা করা (কোনও কিছু ঘোষণা না করা এটিকে ডিফল্ট করবে)। এই ক্ষেত্রে অপারেটিং সিস্টেমটি আমাদের অ্যাপ্লিকেশনটি প্রত্যাশিত 96 ডিপিআইয়ের অধীনে রেন্ডার করবে এবং তারপরে আমরা আগে বিটম্যাপ স্কেলিংয়ের বিষয়ে আলোচনা করব যা আমরা আগে আলোচনা করেছি। ফলাফলটি অস্পষ্ট বর্ণনামূলক অ্যাপ্লিকেশন হবে তবে সঠিক লেআউট সহ।

দ্বিতীয় বিকল্পটি হ'ল আবেদনটি ডিপিআই-সচেতন হিসাবে ঘোষণা করা। এই ক্ষেত্রে ওএস কোনও স্কেলিং করবে না এবং আপনার অ্যাপ্লিকেশনটিকে স্ক্রিনের মূল ডিপিআই অনুযায়ী রেন্ডার করতে দেবে। প্রতি মনিটর-ডিপিআই পরিবেশের ক্ষেত্রে, আপনার অ্যাপ্লিকেশনটি সমস্ত স্ক্রিনের সর্বোচ্চ ডিপিআই দিয়ে রেন্ডার হবে, তারপরে এই বিটম্যাপটি প্রতিটি মনিটরের জন্য উপযুক্ত আকারে ছোট করে দেওয়া হবে। ডাউনস্কেলিং ফলাফলগুলি আপস্কেলিংয়ের চেয়ে আরও ভাল দেখার অভিজ্ঞতায় ফেলেছে তবে আপনি এখনও কিছুটা অস্পষ্টতা লক্ষ্য করতে পারেন।

আপনি যদি তা এড়াতে চান তবে আপনাকে অবশ্যই নিজের আবেদনটি মনিটর-ডিপিআই-সচেতন হিসাবে ঘোষণা করতে হবে। তারপরে আপনার অ্যাপ্লিকেশনটি যখন বিভিন্ন মনিটরের উপর দিয়ে টানা হয় তখন আপনাকে অবশ্যই সনাক্ত করতে হবে এবং বর্তমানের ডিপিআই অনুযায়ী রেন্ডার করতে হবে।

ডিপিআই সচেতনতা ঘোষণা একটি মেনিফেস্ট ফাইলে করা হয়।

নিম্নলিখিত লিঙ্ক স্ট্যাকওভারফ্লো উল্লেখ করুন


ব্যবহারকারীদের যদি পুনরুদ্ধার করা আকারে একটি উইন্ডো থাকে এবং এটির অংশগুলি বিভিন্ন মনিটরে থাকে তাই? আমাদের কী দুটিবার রেন্ডার করার এবং মনিটরের সীমানাকে বাউন্ডিং বক্স হিসাবে ব্যবহার করার দরকার আছে? উইনফর্ম লাইব্রেরি দ্বারা এর কতটুকু আচ্ছাদিত?
সিই ম্যাকশারফেস

5

.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ফাইলটিতে প্রতি মনিটর ডিপিআই সচেতনতা সক্ষম করুন।

উইন্ডোজ ফর্মগুলি একটি নতুন সিস্টেম. উইন্ডোস.ফর্মস.এপ্লিকেশন কনফিগারেশনসেকশন উপাদানকে নতুন বৈশিষ্ট্য এবং কাস্টমাইজেশন সমর্থন করার জন্য। নেট ফ্রেমওয়ার্ক 4.7 দিয়ে শুরু করে introdu উচ্চ ডিপিআই সমর্থন করে এমন নতুন বৈশিষ্ট্যগুলির সুবিধা নিতে, আপনার অ্যাপ্লিকেশন কনফিগারেশন ফাইলটিতে নিম্নলিখিতগুলি যুক্ত করুন।

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

গুরুত্বপূর্ণ

.NET ফ্রেমওয়ার্কের পূর্ববর্তী সংস্করণগুলিতে আপনি উচ্চ DPI সমর্থন যুক্ত করতে ম্যানিফেস্টটি ব্যবহার করেছিলেন। এই পদ্ধতির আর সুপারিশ করা হয় না, কারণ এটি app.config ফাইলে সংজ্ঞায়িত সেটিংসকে ওভাররাইড করে।

স্থিতিশীল সক্ষম করুন ভিজ্যুয়াল স্টাইল পদ্ধতিতে কল করুন।

আপনার অ্যাপ্লিকেশন এন্ট্রি পয়েন্টে এটি প্রথম পদ্ধতির কল হওয়া উচিত। উদাহরণ স্বরূপ:

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

এর সুবিধা হ'ল ডায়নামিক ডিপিআই পরিস্থিতিগুলির জন্য সমর্থন যেখানে উইন্ডোজ ফর্ম অ্যাপ্লিকেশন চালু হওয়ার পরে ব্যবহারকারী ডিপিআই বা স্কেল ফ্যাক্টর পরিবর্তন করে।

উত্স: উইন্ডোজ ফর্মগুলিতে হাই ডিপিআই সমর্থন


3

এই প্রস্তাবগুলির কোনওটিই আমার পক্ষে কাজ করেনি তবে, আমি Form.Font = new... থেকে সরানোর পরে কিছু ঘটেছিল Form.Design.cs, ফর্মটি সঠিকভাবে স্কেল করা শুরু করেছে, এটি ফন্টটি কনস্ট্রাক্টরে সংজ্ঞায়িত করা হয়েছে বা আদৌ নয় it কেন? অন্য যে কেউ ব্যাখ্যা করতে সক্ষম হতে পারে, আমি কেবল আমার পরিবর্তিত পরিবর্তন সম্পর্কে কথা বলতে পারি এবং আমি যে ফর্মটি নিয়ে কাজ করছি তার মূল কারণ এটি নির্ধারণ করতে আমাকে কয়েক মিনিট সময় নিয়েছিল। আশা করি এটা সাহায্য করবে.


3

কমপক্ষে ভিজ্যুয়াল স্টুডিও 2017 সাল থেকে আপনাকে কেবল একটি মেনিফেস্ট ফাইল যুক্ত করতে হবে এবং এই বিভাগটি আপত্তিহীন করতে হবে:

<application xmlns="urn:schemas-microsoft-com:asm.v3">
    <windowsSettings>
        <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
    </windowsSettings>
</application>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.