উইনফর্মস কোডটি কীভাবে লিখবেন যা সিস্টেম ফন্ট এবং ডিপিআই সেটিংসে স্বয়ংক্রিয়ভাবে স্কেল করে?


143

ভূমিকা : সেখানে প্রচুর মন্তব্য রয়েছে যে "উইনফর্মগুলি ডিপিআই / ফন্ট সেটিংসে ভালভাবে স্বয়ংক্রিয়ভাবে স্কেল করে না; ডাব্লুপিএফ-এ স্যুইচ করুন।" তবে, আমি এটি নেট। 1.1 উপর ভিত্তি করে মনে করি; দেখা যাচ্ছে তারা প্রকৃতপক্ষে .NET 2.0 এ অটো-স্কেলিং বাস্তবায়নের জন্য বেশ ভাল কাজ করেছেন। অন্তত এখনও পর্যন্ত আমাদের গবেষণা এবং পরীক্ষার উপর ভিত্তি করে। তবে, যদি আপনার মধ্যে কেউ কেউ আরও ভাল করে জানেন তবে আমরা আপনার কাছ থেকে শুনতে আগ্রহী। (দয়া করে আমাদের বিতর্কিত বিরক্ত করবেন না যে আমাদের ডাব্লুপিএফ এ স্যুইচ করা উচিত ... এটি এখন কোনও বিকল্প নয়।)

প্রশ্নাবলী:

  • উইনফোর্মে কোনটি স্বয়ংক্রিয়ভাবে স্কেল করে না এবং তাই এড়ানো উচিত?

  • উইনফোর্ডস কোডটি লেখার সময় প্রোগ্রামারদের কোন নকশার নির্দেশিকা অনুসরণ করতে হবে যাতে এটি স্বয়ংক্রিয়ভাবে ভাল হবে?

আমরা এখনও অবধি চিহ্নিত নকশার গাইডলাইন:

দেখুন সম্প্রদায় উইকি উত্তর নিচে।

যারা ভুল বা অপর্যাপ্ত কেউ? আমাদের অন্য কোন গাইডলাইন গ্রহণ করা উচিত? অন্য কোন নিদর্শন এড়ানো প্রয়োজন? এ সম্পর্কে অন্য কোনও গাইডেন্স খুব প্রশংসা হবে appreciated

উত্তর:


127

নিয়ন্ত্রণগুলি যা স্কেলিং সঠিকভাবে সমর্থন করে না:

  • Labelসঙ্গে AutoSize = Falseএবং Fontউত্তরাধিকারসূত্রে। স্পষ্টভাবে Fontনিয়ন্ত্রণে সেট করুন যাতে এটি বৈশিষ্ট্য উইন্ডোতে গা bold়ভাবে প্রদর্শিত হয়।
  • ListViewকলাম প্রস্থ স্কেল না। ScaleControlপরিবর্তে ফর্মটি এটি করতে ওভাররাইড করুন । এই উত্তর দেখুন
  • SplitContainerএর Panel1MinSize, Panel2MinSizeএবং SplitterDistanceবৈশিষ্ট্য
  • TextBoxসঙ্গে MultiLine = Trueএবং Fontউত্তরাধিকারসূত্রে। স্পষ্টভাবে Fontনিয়ন্ত্রণে সেট করুন যাতে এটি বৈশিষ্ট্য উইন্ডোতে গা bold়ভাবে প্রদর্শিত হয়।
  • ToolStripButtonএর চিত্র। ফর্মটির নির্মাতায়:

    • সেট ToolStrip.AutoSize = False
    • এবং ToolStrip.ImageScalingSizeঅনুযায়ী অনুযায়ী সেট করুনCreateGraphics.DpiX.DpiY
    • ToolStrip.AutoSize = Trueপ্রয়োজনে সেট করুন ।

    কখনও কখনও AutoSizeছেড়ে দেওয়া যেতে পারে Trueতবে কখনও কখনও এই পদক্ষেপগুলি ছাড়াই এটি আকার পরিবর্তন করতে ব্যর্থ হয়। .NET ফ্রেমওয়ার্ক 4.5.2 এবং এর সাথে পরিবর্তিত হয়ে কাজ করে EnableWindowsFormsHighDpiAutoResizing

  • TreeViewএর ছবি। এবং ImageList.ImageSizeঅনুযায়ী অনুযায়ী সেট করুন । এর জন্য .NET ফ্রেমওয়ার্ক 4.5.1 এবং এর সাথে পরিবর্তিত হয়ে কাজ করে ।CreateGraphics.DpiX.DpiYStateImageListEnableWindowsFormsHighDpiAutoResizing
  • Formএর আকার। Formতৈরির পরে স্থির আকারটি ম্যানুয়ালি Sc

নকশার নির্দেশিকা:

  • সমস্ত কন্টেইনারকন্ট্রোলগুলি অবশ্যই সেট করতে হবে AutoScaleMode = Font। (হরফ DPI পরিবর্তন এবং সিস্টেম ফন্টের আকারের সেটিং উভয়ই পরিচালনা করবে; DPI কেবলমাত্র DPI পরিবর্তনগুলি পরিচালনা করবে, সিস্টেম ফন্টের আকারের সেটিংয়ে পরিবর্তিত হবে না))

  • সমস্ত কন্টেইনারকন্ট্রোলগুলি অবশ্যই AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);96 ডিপিআই (পরবর্তী বুলেটটি দেখুন) এবং এমএস সানস সেরিফের ডিফল্ট ফন্ট (বুলেট দুটি নীচে দেখুন) ধরে রেখে একই সেট করতে হবে । এটি ডিপিআইয়ের উপর ভিত্তি করে ডিজাইনার দ্বারা স্বয়ংক্রিয়ভাবে যুক্ত হয়েছে আপনি ডিজাইনারটি খোলেন ... তবে আমাদের অনেক পুরানো ডিজাইনার ফাইল থেকে নিখোঁজ ছিল। সম্ভবত ভিজ্যুয়াল স্টুডিও। নেট (ভিএস 2005 এর আগের সংস্করণ) সঠিকভাবে এটিকে যুক্ত করছে না।

  • আপনার সমস্ত ডিজাইনার 96dpi তে কাজ করুন (আমরা সম্ভবত 120dpi এ চলে যেতে সক্ষম হতে পারি; তবে ইন্টারনেটের বুদ্ধি 96dpi এ আটকে থাকতে বলে; সেখানে পরীক্ষা-নিরীক্ষার ব্যবস্থা রয়েছে; ডিজাইন অনুসারে, এটি কেবল AutoScaleDimensionsলাইন পরিবর্তন করে না বলে কিছু উচিত নয়) ডিজাইনার সন্নিবেশ)। উচ্চ-রেজোলিউশন ডিসপ্লেতে ভার্চুয়াল 96dpi এ চালানোর জন্য ভিজ্যুয়াল স্টুডিও সেট করতে, তার .exe ফাইলটি সন্ধান করুন, বৈশিষ্ট্য সম্পাদনা করতে ডান ক্লিক করুন এবং সামঞ্জস্যতার অধীনে "উচ্চ ডিপিআই স্কেলিং আচরণকে ওভাররাইড করুন Sc সিস্টেম" দ্বারা সম্পাদিত স্কেলিং নির্বাচন করুন।

  • নিশ্চিত হয়ে নিন যে আপনি ধারক স্তরে ফন্টটি কখনও সেট করেন না ... কেবল পাত নিয়ন্ত্রণে বা আপনার বেশিরভাগ বেস ফর্মটির নির্মাতায় যদি আপনি এমএস সানস সেরিফ ব্যতীত কোনও অ্যাপ্লিকেশন-ডিফল্ট ফন্ট চান। (একটি কনটেইনারটিতে ফন্ট সেট করা থেকে মনে হয় container কনটেইনারটির স্বয়ংক্রিয়-স্কেলিং বন্ধ হয়ে যায় কারণ এটি বর্ণানুক্রমিকভাবে অটোস্কেলমোড এবং অটোস্কেলডিমাইশনস সেটিংস স্থাপনের পরে আসে)) লক্ষ করুন যে আপনি যদি আপনার বেশিরভাগ বেস ফর্মটির কনস্ট্রাক্টরে হরফ পরিবর্তন করেন তবে 6x13 এর চেয়ে পৃথকভাবে গণনা করার জন্য আপনার অটস্কেলডাইমেনশনগুলি; বিশেষত, আপনি যদি সেগোয়ে ইউআইতে (উইন 10 ডিফল্ট ফন্ট) পরিবর্তন করেন তবে এটি 7x15 হবে ... আপনাকে ডিজাইনারের প্রতিটি ফর্মটি স্পর্শ করতে হবে যাতে এটি d ডিজাইনার ফাইলে সমস্ত মাত্রা সংশোধন করতে পারে including AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);

  • অ্যাঙ্কর ব্যবহার করতে Rightবা Bottomকোনও ইউজারকন্ট্রোলকে অ্যাঙ্করড ব্যবহার করবেন না ... এর অবস্থানটি স্বয়ংক্রিয়ভাবে স্কেল করবে না; পরিবর্তে, আপনার ইউজারকন্ট্রোলটিতে একটি প্যানেল বা অন্যান্য ধারক ফেলে দিন এবং সেই প্যানেলে আপনার অন্যান্য নিয়ন্ত্রণগুলি অ্যাঙ্কর করুন; প্যানেল ব্যবহার ডক আছে Right, Bottomঅথবা Fillআপনার UserControl হবে।

  • নিয়ন্ত্রণগুলির তালিকাগুলির ResumeLayoutশেষে থাকা কন্ট্রোলগুলি কেবল InitializeComponentঅটো-স্কেলড হবে ... আপনি যদি গতিশীলভাবে নিয়ন্ত্রণগুলি যুক্ত করেন তবে আপনাকে SuspendLayout(); AutoScaleDimensions = new SizeF(6F, 13F); AutoScaleMode = AutoScaleMode.Font; ResumeLayout();এটি নিয়ন্ত্রণের আগে যুক্ত করার আগে আপনাকে সেই নিয়ন্ত্রণের দরকার হয় And এবং আপনার অবস্থানটিও সামঞ্জস্য করতে হবে আপনি যদি ডক মোড বা লেআউট ম্যানেজারের মতো FlowLayoutPanelবা ব্যবহার করেন না TableLayoutPanel

  • থেকে প্রাপ্ত বেস ক্লাসগুলি সেট সেট ContainerControlছেড়ে যেতে AutoScaleModeহবে Inherit(ক্লাসে ডিফল্ট মান সেট ContainerControl; তবে ডিজাইনার দ্বারা ডিফল্ট সেট নয়)। যদি আপনি এটিকে অন্য কোনও কিছুতে সেট করে থাকেন এবং তারপরে আপনার উত্পন্ন শ্রেণি এটি ফন্টে সেট করার চেষ্টা করে (যেমন এটি হওয়া উচিত), তবে সেটি নির্ধারণের কাজটি Fontডিজাইনারের সেটিংসকে পরিষ্কার করে দেবে AutoScaleDimensions, ফলস্বরূপ স্বয়ংক্রিয়-স্কেলিং বন্ধ করে দেবে! (পূর্বনির্ধারিত একের সাথে মিলিত এই গাইডলাইনটির অর্থ আপনি কখনই ডিজাইনারে বেস ক্লাস ইনস্ট্যান্ট করতে পারবেন না ... সমস্ত ক্লাস হয় হয় বেস ক্লাস হিসাবে বা পাতার শ্রেণি হিসাবে ডিজাইন করা প্রয়োজন!)

  • Form.MaxSizeস্থিতিশীলভাবে / ডিজাইনার ব্যবহার করা থেকে বিরত থাকুন। MinSizeএবং MaxSizeফর্মটিতে সমস্ত কিছুর মতো স্কেল করে না। সুতরাং, আপনি যদি 96dpi তে আপনার সমস্ত কাজ করেন তবে উচ্চতর ডিপিআইতে যখন আপনার MinSizeসমস্যার কারণ হবে না তবে আপনি যেমনটি প্রত্যাশা করেছিলেন তেমন সীমাবদ্ধ MaxSizeনাও হতে পারে তবে আপনার আকারের স্কেলিংটি সীমিত করতে পারে যা সমস্যা তৈরি করতে পারে। আপনি যদি চান MinSize == Size == MaxSize, ডিজাইনারে এটি করবেন না ... এটি আপনার কনস্ট্রাক্টরে বা OnLoadওভাররাইডে করুন ... উভয় সেট করুন MinSizeএবং MaxSizeআপনার যথাযথভাবে মাপানো মাপকে।

  • কোনও নির্দিষ্ট Panelবা সমস্ত নিয়ন্ত্রণগুলি Containerঅ্যাঙ্করিং বা ডকিং ব্যবহার করা উচিত। আপনি যদি তাদের মিশ্রণ করেন তবে এর মাধ্যমে করা অটো-স্কেলিং Panelপ্রায়শই সূক্ষ্ম উদ্ভট উপায়ে দুর্ব্যবহার করবে।

  • এটি যখন তার অটো-স্কেলিং করে, এটি সামগ্রিক ফর্মটি স্কেল করার চেষ্টা করবে ... তবে, যদি সেই প্রক্রিয়াতে এটি পর্দার আকারের উপরের সীমাতে চলে যায়, তবে এটি একটি কঠোর সীমা যা স্ক্রু আপ করতে পারে (ক্লিপ) স্কেলিং। সুতরাং, আপনার অবশ্যই এটি নিশ্চিত করা উচিত যে 100% / 96dpi তে ডিজাইনারের সমস্ত ফর্মগুলি 1024x720 এর চেয়ে বড় আকারের নয় (যা একটি 1080p স্ক্রিনে 150% বা 4K স্ক্রিনে উইন্ডোজ প্রস্তাবিত মান হিসাবে 300% এর সাথে মিলিত)। তবে আপনাকে জায়ান্ট উইন 10 শিরোনাম / ক্যাপশন বারের জন্য বিয়োগ করতে হবে ... তাই 1000x680 সর্বোচ্চ আকারের মতো ... যা ডিজাইনারের ক্ষেত্রে 994x642 ক্লায়েন্টসাইজের মতো হবে। (সুতরাং, লঙ্ঘনকারীদের খুঁজতে আপনি ক্লায়েন্টসাইজে একটি ফাইন্ডআল রেফারেন্স করতে পারেন))


NumericUpDownMarginএটিও সঠিকভাবে স্কেল করে না । মনে হচ্ছে মার্জিনটি দু'বার মাপা হয়েছে। যদি আমি এটি আবার স্কেল করি তবে এটি দুর্দান্ত দেখাচ্ছে।
ygoe

AutoScaleMode = Fontযে ব্যবহারকারীরা খুব বড় ফন্ট ব্যবহার করেন এবং উবুন্টু ব্যবহার করেন তাদের পক্ষে ভাল কাজ করে না। আমরা পছন্দ করিAutoScaleMode = DPI
KindDragon

> মাল্টলাইন সহ টেক্সটবক্স = সত্য এবং ফন্ট উত্তরাধিকার সূত্রে প্রাপ্ত। সারাদিন পাগল হয়ে যাচ্ছি - এটাই ঠিক হয়ে গেল! অনেক ধন্যবাদ! যাইহোক, একই ফিক্সটি তালিকাবক্স নিয়ন্ত্রণগুলির জন্যও ঠিক। : ডি
নিমিনেম

আমার জন্য, উত্তরাধিকারসূত্রে পাওয়া ফন্টের তালিকা বাক্সগুলি ভাল স্কেল করে না। তারা স্পষ্টভাবে সেট করার পরে না। (। নেট 4.7)
পালস জেট


27

আমার অভিজ্ঞতা বর্তমানের শীর্ষস্থানীয় ভোট দেওয়া উত্তরের চেয়ে মোটামুটি আলাদা। .NET ফ্রেমওয়ার্ক কোডের মাধ্যমে পদক্ষেপ এবং রেফারেন্স উত্স কোডটি অনুধাবন করে আমি এই সিদ্ধান্তে পৌঁছেছি যে অটো-স্কেলিংয়ের কাজ করার জন্য সমস্ত কিছু ঠিক আছে এবং কোথাও কোথাও এটিকে গোলমাল করার কোনও সূক্ষ্ম সমস্যা ছিল was এটি সত্য প্রমাণিত।

যদি আপনি একটি যথাযথভাবে রিফ্লেভেবল / অটো-আকারের বিন্যাস তৈরি করেন তবে প্রায় সবকিছু ঠিক যেমনটি ঠিক কাজ করে তা স্বয়ংক্রিয়ভাবে ভিজ্যুয়াল স্টুডিওর দ্বারা ব্যবহৃত ডিফল্ট সেটিংস (যথা, প্যারেন্ট ফর্মটিতে অটোসাইজমোড = ফন্ট এবং সমস্ত কিছুতে উত্তরাধিকারী) হওয়া উচিত।

একমাত্র গোটচা হ'ল যদি আপনি ডিজাইনে ফর্মে ফন্টের সম্পত্তি সেট করে থাকেন। উত্পন্ন কোডটি বর্ণগুলি বর্ণমালা অনুসারে বাছাই করবে, যার অর্থ আগেAutoScaleDimensions নির্ধারিত হবে । দুর্ভাগ্যক্রমে, এটি উইনফোর্ডস অটো স্কেলিংয়ের যুক্তিটিকে পুরোপুরি ভেঙে দেয়। Font

ফিক্স যদিও সহজ। হয় একেবারেই Fontডিজাইনারে সম্পত্তি সেট করবেন না (এটিকে আপনার ফর্ম কনস্ট্রাক্টারে সেট করুন), বা ম্যানুয়ালি এই অ্যাসাইনমেন্টগুলি পুনরায় অর্ডার করুন (তবে তারপরে আপনি যখন ডিজাইনারটিতে ফর্মটি সম্পাদনা করবেন তখনই আপনাকে এটি চালিয়ে যেতে হবে)। ভয়েলা, ন্যূনতম ঝামেলা সহ প্রায় নিখুঁত এবং সম্পূর্ণ স্বয়ংক্রিয় স্কেলিং। এমনকি ফর্মের আকারগুলিও সঠিকভাবে মাপা হয়েছে।


আমি তাদের মুখোমুখি হওয়ার সাথে সাথে পরিচিত সমস্যাগুলি এখানে তালিকাবদ্ধ করব:


1
Fontডিজাইনারে পুনরায় সেট না করা: একটি ধারণা মাথায় আসে: এগিয়ে যান এবং ডিজাইনারটিতে ফন্ট সেট করুন, যাতে আপনি পছন্দসই ফন্টটি ডিজাইন করতে পারেন। কনস্ট্রাক্টরের পরে, বিন্যাসের পরে, সেই ফন্টের সম্পত্তিটি পড়ুন এবং আবার একই মান সেট করবেন? অথবা সম্ভবত আবার কাজ করতে বলুন? [ক্যাভিয়েট: আমার কাছে এই পদ্ধতির পরীক্ষা করার কোনও কারণ নেই]] অথবা প্রতি নোলিকের উত্তর , ডিজাইনারে পিক্সেলগুলিতে নির্দিষ্ট করা হয়েছে (যাতে ভিজ্যুয়াল স্টুডিও ডিজাইনার উচ্চ ডিপিআই মনিটরে পুনরুদ্ধার করবেন না), এবং কোডটিতে সেই মানটি পড়বেন, পিক্সেল থেকে রূপান্তর করুন to point (সঠিক স্কেলিং পেতে)।
টুলমেকারস্টেভ

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

আমি উপরের উত্তরে প্রস্তাবিত হিসাবে AutoScaleDimensionsসেট করা হয়নি এমন দৃষ্টান্তগুলির জন্য আমার কোডটি অনুসন্ধান করেছিলাম new SizeF(6F, 13F)। দেখা গেল যে প্রতিটি ক্ষেত্রে ফর্মের ফন্টের সম্পত্তি সেট করা হয়েছিল (ডিফল্ট নয়)। এটি প্রদর্শিত হয় যখন AutoScaleMode = Fontতখন AutoScaleDimensionsফর্মের ফন্টের বৈশিষ্ট্যের ভিত্তিতে গণনা করা হয়। এছাড়াও, উইন্ডোজ কন্ট্রোল প্যানেলে স্কেলিং সেটিংটির কোনও প্রভাব আছে বলে মনে হয় । AutoScaleDimensions
ওয়াল্টার স্ট্যাবোজ

24

নেট ফ্রেমওয়ার্ক 4.7 এর জন্য আপনার অ্যাপ্লিকেশনটিকে লক্ষ্য করুন এবং এটি উইন্ডোজ 10 ভি 1703 এর অধীনে চালান (ক্রিয়েটার্স আপডেট বিল্ড 15063)। উইন্ডোজ 10 (v1703) এর অধীনে নেট 4.7 দিয়ে , এমএস অনেকগুলি ডিপিআই উন্নতি করেছে

.NET ফ্রেমওয়ার্ক 4.7 দিয়ে শুরু করে, উইন্ডোজ ফর্মগুলিতে সাধারণ উচ্চ ডিপিআই এবং গতিশীল ডিপিআই পরিস্থিতিগুলির উন্নতি অন্তর্ভুক্ত থাকে। এর মধ্যে রয়েছে:

  • বেশ কয়েকটি উইন্ডোজ ফর্ম নিয়ন্ত্রণগুলির স্কেলিং এবং লেআউটে উন্নতি, যেমন মাসিক্যালেকর্ডার নিয়ন্ত্রণ এবং চেকডলিস্টবক্স নিয়ন্ত্রণ।

  • একক পাস স্কেলিং। .NET ফ্রেমওয়ার্ক 4.6 এবং পূর্ববর্তী সংস্করণগুলিতে, একাধিক পাসের মাধ্যমে স্কেলিং করা হয়েছিল, যার ফলে কিছু নিয়ন্ত্রণ প্রয়োজনীয়তার চেয়ে বেশি পরিমাণে মাপা হয়েছিল।

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

এটি সমর্থন করতে, আপনার অ্যাপ্লিকেশনটিতে একটি অ্যাপ্লিকেশন ম্যানিফেস্ট যুক্ত করুন এবং সিগন্যাল করুন যে আপনার অ্যাপ্লিকেশনটি উইন্ডোজ 10 সমর্থন করে:

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

এর পরে, একটি যুক্ত করুন app.configএবং অ্যাপ্লিকেশন প্রতি মনিটর সচেতন হিসাবে ঘোষণা করুন। এটি এখন অ্যাপকনফাইগ-এ করা হয়েছে এবং ম্যানিফেস্টে আগের মতো নয়!

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

উইন্ডোজ 10 ক্রিয়েটর আপডেট হওয়ার পরে এই পার্মনিটিভিভি 2 নতুন:

DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2

পার মনিটর ভি 2 নামেও পরিচিত। মূল প্রতি-মনিটর ডিপিআই সচেতনতা মোডের চেয়ে একটি অগ্রগতি, যা অ্যাপ্লিকেশনগুলিকে প্রতি শীর্ষ স্তরের উইন্ডো ভিত্তিতে নতুন ডিপিআই-সম্পর্কিত স্কেলিং আচরণ অ্যাক্সেস করতে সক্ষম করে।

  • চাইল্ড উইন্ডো ডিপিআই পরিবর্তন বিজ্ঞপ্তিগুলি - প্রতি মনিটর ভি 2 প্রসঙ্গে, পুরো উইন্ডো ট্রিটি ঘটে যাওয়া কোনও ডিপিআই পরিবর্তন সম্পর্কে অবহিত হয়।

  • নন-ক্লায়েন্টের ক্ষেত্রের স্কেলিং - সমস্ত উইন্ডো স্বয়ংক্রিয়ভাবে ডিপিআই সংবেদনশীল ফ্যাশনে তাদের নন-ক্লায়েন্ট অঞ্চল আঁকা। সক্ষম করুননক্লায়েন্টডিপিপিস্কেলিংয়ের জন্য কলগুলি অপ্রয়োজনীয়।

  • উইন 32 মেনুগুলির এস কলিং - প্রতি মনিটরের ভি 2 প্রসঙ্গে তৈরি করা সমস্ত এনটিউসার মেনু প্রতি মনিটরের ফ্যাশনে স্কেলিং করবে।

  • ডায়ালগ স্কেলিং - প্রতি মনিটরের ভি 2 প্রসঙ্গে তৈরি করা উইন 32 ডায়ালগগুলি স্বয়ংক্রিয়ভাবে ডিপিআই পরিবর্তনের প্রতিক্রিয়া জানাবে।

  • Comctl32 নিয়ন্ত্রণগুলির উন্নত স্কেলিং - বিভিন্ন কমপ্লেট 32 নিয়ন্ত্রণগুলি মনিটরের ভি 2 প্রসঙ্গে ডিপিআই স্কেলিং আচরণকে উন্নত করেছে।

  • উন্নততর তাদের আচরণের আচরণ - প্রতি মনিটর ভি 2 উইন্ডোর প্রসঙ্গে খোলা UxTheme হ্যান্ডলগুলি সেই উইন্ডোটির সাথে সম্পর্কিত ডিপিআইয়ের শর্ত হিসাবে কাজ করবে।

ডিপিআই পরিবর্তন সম্পর্কে অবহিত করতে এখন আপনি তিনটি নতুন ইভেন্টের সদস্যতা নিতে পারেন:

  • Control.DpiChangedAfterParent , যা বহিস্কার করা হয় ঘটে যখন একটি নিয়ন্ত্রণের জন্য ডিপিআই সেটিং কোনো ডিপিআই ইভেন্টের পরিবর্তন এটা পিতা বা মাতা নিয়ন্ত্রণ বা ফর্মের জন্য ঘটেছে পর প্রোগ্রামেটিক্যালি পরিবর্তিত হয়।

  • Control.DpiChangedBeforeParent , যা একটি নিয়ন্ত্রণের জন্য ডিপিআই সেটিং তার পিতা বা মাতা নিয়ন্ত্রণ বা ফর্মের জন্য একটি ডিপিআই ইভেন্টের পরিবর্তন সামনে প্রোগ্রামেটিক্যালি পরিবর্তিত হয় বহিস্কার করা হয় ঘটেছে।

  • ফর্ম.ডিপিচেনজেড , যা ফর্মটি প্রদর্শিত হয় যেখানে ফর্মটি বর্তমানে প্রদর্শিত হয় সেখানে ডিভাইস সেটিংটি পরিবর্তিত হয়।

আপনার কাছে ডিপিআই হ্যান্ডলিং / স্কেলিং সম্পর্কিত 3 সহায়ক পদ্ধতি রয়েছে:

  • কন্ট্রোল.লজিকালটোডোভাইস ইউনাইটস , যা একটি মানকে লজিকাল থেকে ডিভাইস পিক্সেলে রূপান্তর করে।

  • কন্ট্রোল.স্কেলবিটম্যাপ লজিক্যাল টো ডিভাইস, যা কোনও ডিভাইসের জন্য লজিক্যাল ডিপিআইতে একটি বিটম্যাপ চিত্রকে স্কেল করে।

  • কন্ট্রোল.ডভাইসডিপিআই , যা বর্তমান ডিভাইসের জন্য ডিপিআই দেয়।

আপনি যদি এখনও সমস্যাগুলি দেখতে পান তবে আপনি অ্যাপকনফাইগ এন্ট্রিগুলির মাধ্যমে ডিপিআই উন্নতিগুলি বেছে নিতে পারেন

যদি আপনার সোর্স কোডে অ্যাক্সেস না থাকে তবে আপনি উইন্ডোজ এক্সপ্লোরারে অ্যাপ্লিকেশন বৈশিষ্ট্যে যেতে পারেন, সামঞ্জস্য করতে পারেন এবং নির্বাচন করতে পারেন System (Enhanced)

এখানে চিত্র বর্ণনা লিখুন

যা ডিপিআই হ্যান্ডলিংয়ের উন্নতি করতে জিডিআই স্কেলিং সক্রিয় করে:

অ্যাপ্লিকেশনগুলির জন্য যা জিডিআই-ভিত্তিক উইন্ডোজ এখন প্রতি মনিটরের ভিত্তিতে ডিপিআই স্কেল করতে পারে। এর অর্থ এই যে এই অ্যাপ্লিকেশনগুলি, যাদুতে, প্রতি মনিটর ডিপিআই সচেতন হয়ে উঠবে।

এই সমস্ত পদক্ষেপগুলি করুন এবং আপনার উইনফোর্স অ্যাপ্লিকেশনগুলির জন্য আরও ভাল ডিপিআই অভিজ্ঞতা পাওয়া উচিত। তবে মনে রাখবেন, আপনার নেট .7.7 এর জন্য আপনার অ্যাপ্লিকেশনটি টার্গেট করতে হবে এবং কমপক্ষে উইন্ডোজ 10 বিল্ড 15063 (ক্রিয়েটর আপডেট) প্রয়োজন। পরবর্তী উইন্ডোজ 10 আপডেট 1709 এ, আমরা আরও উন্নতি করতে পারি।


12

আমি কাজের সময় লিখেছি এমন একটি গাইড:

ডাব্লুপিএফ 'ডিভাইস ইন্ডিপেন্ডেন্ট ইউনিট'-এ কাজ করে যার অর্থ হ'ল ডিপিআই স্ক্রিনের সমস্ত নিয়ন্ত্রণ স্কেল perfectly উইনফোর্মে এটি আরও যত্ন নেয়।

উইনফোর্ডস পিক্সেলগুলিতে কাজ করে। সিস্টেম ডিপিআই অনুসারে পাঠ্যকে ছোট করা হবে তবে এটি প্রায়শই একটি আনসেল্ড নিয়ন্ত্রণ দ্বারা ক্রপ করা হবে। এই জাতীয় সমস্যা এড়াতে, আপনাকে অবশ্যই স্পষ্ট আকার এবং আকার নির্ধারণ করতে হবে। এই নিয়মগুলি অনুসরণ করুন:

  1. আপনি এটি যেখানেই পাবেন (লেবেল, বোতাম, প্যানেল) অটোসাইজ সম্পত্তিটিকে সত্যে সেট করে।
  2. বিন্যাসের জন্য, ভ্যানিলা প্যানেলের পরিবর্তে বিন্যাসের জন্য ফ্লোএলআউটপ্যানেল (একটি লা ডাব্লুপিএফ স্ট্যাকপ্যানেল) এবং টেবিললাউটপ্যানেল (একটি লা ডাব্লুপিএফ গ্রিড) ব্যবহার করুন।
  3. আপনি যদি উচ্চ ডিপিআই মেশিনে বিকাশ করে থাকেন তবে ভিজ্যুয়াল স্টুডিও ডিজাইনার হতাশ হতে পারেন। আপনি যখন অটোসাইজ = সত্য সেট করেন, এটি আপনার স্ক্রিনের নিয়ন্ত্রণকে আকার পরিবর্তন করবে। যদি কন্ট্রোলটিতে অটোসাইজমোড = গ্রোঅনলি থাকে তবে এটি সাধারণ ডিপিআই, অর্থাৎ লোকেদের জন্য এই আকারটি থেকে যাবে। প্রত্যাশার চেয়ে বড় হতে এটি ঠিক করতে, কম্পিউটারে ডিজাইনারকে সাধারণ ডিপিআই দিয়ে খুলুন এবং ডান-ক্লিক করুন, পুনরায় সেট করুন।

3
সংলাপগুলির জন্য যা অ্যাটসাইজকে সবকিছুতে পুনরায় আকার দিতে পারে এটি একটি দুঃস্বপ্ন হতে পারে, প্রোগ্রামটি চলাকালীন আমি নিজেই আমার ডায়ালগগুলির আকার বাড়ানোর সাথে সাথে আমার বোতামগুলি আরও বড় এবং ছোট হতে চাই না।
জোশ

10

আমি উইনফর্মগুলি উচ্চ ডিপিআই সহ সুন্দর খেলতে পেলাম বলে মনে হয়েছে। সুতরাং, আমি ফর্ম আচরণকে ওভাররাইড করার জন্য একটি ভিবি.এনইটি পদ্ধতি লিখেছি:

Public Shared Sub ScaleForm(WindowsForm As System.Windows.Forms.Form)
    Using g As System.Drawing.Graphics = WindowsForm.CreateGraphics
        Dim sngScaleFactor As Single = 1
        Dim sngFontFactor As Single = 1
        If g.DpiX > 96 Then
            sngScaleFactor = g.DpiX / 96
            'sngFontFactor = 96 / g.DpiY
        End If
        If WindowsForm.AutoScaleDimensions = WindowsForm.CurrentAutoScaleDimensions Then
            'ucWindowsFormHost.ScaleControl(WindowsForm, sngFontFactor)
            WindowsForm.Scale(sngScaleFactor)
        End If
    End Using
End Sub

6

আমি সম্প্রতি এই সমস্যাটি নিয়ে এসেছি, বিশেষত ভিজুয়াল স্টুডিও পুনরুদ্ধারের সাথে মিলিয়ে যখন সম্পাদকটি হাই-ডিপিআই সিস্টেমে খোলা হয়। আমি এটা ভাল পাওয়া রাখা AutoScaleMode = Font , কিন্তু ফরম সেট করতে ফন্ট ডিফল্ট হরফ, কিন্তু পিক্সেল আকার উল্লেখ না বিন্দু, অর্থাত্: Font = MS Sans; 11px। কোডে, আমি তখন ফন্টটি ডিফল্টে পুনরায় সেট করি : Font = SystemFonts.DefaultFontএবং সব ঠিক আছে।

শুধু আমার দুই সেন্ট। আমি ভেবেছিলাম আমি ভাগ করেছি, কারণ "অটোস্কেলমোড = ফন্ট" রাখা , এবং "ডিজাইনারের জন্য পিক্সেলের ফন্টের আকার সেট করা" এমন একটি জিনিস যা আমি ইন্টারনেটে পাইনি।

আমার ব্লগে আমার আরও কিছু বিবরণ রয়েছে: http://www.sgrottel.de/?p=1581&lang=en


4

অ্যাঙ্করগুলি খুব ভাল কাজ করছে না তা ছাড়াও: আমি আরও এক ধাপ এগিয়ে গিয়ে বলতে চাই যে হুবহু অবস্থান (উরফ, অবস্থানের সম্পত্তি ব্যবহার করে) ফন্ট স্কেলিংয়ের সাথে খুব ভাল কাজ করে না। আমি দুটি ভিন্ন প্রকল্পে এই সমস্যাটির সমাধান করতে হয়েছিল। উভয়ের মধ্যেই, আমাদের উইলফর্মস নিয়ন্ত্রণের সমস্ত অবস্থানকে টেবিললাউটপ্যানেল এবং ফ্লোলায়আউটপ্যানেল ব্যবহার করে রূপান্তর করতে হয়েছিল। টেবিললআউটপ্যানেলের অভ্যন্তরে ডক (সাধারণত পূরণের জন্য সেট) বৈশিষ্ট্যটি ব্যবহার করা খুব ভালভাবে কাজ করে এবং সিস্টেম ফন্ট ডিপিআইয়ের সাথে জরিমানা করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.