2013-11-26 7 views
6

हमारे पास मौजूदा विंडोज़ .NET एप्लिकेशन है जिसमें यह सभी कस्टम नियंत्रणों का उपयोग करता है।डीपीआई-जागरूक होने के लिए मौजूदा .NET विंडोज एप्लिकेशन बनाना

चीजें इन दिनों ठीक थीं क्योंकि हम केवल डिफ़ॉल्ट 96 डीपीआई रिज़ॉल्यूशन का समर्थन कर रहे थे।

अब हमें डीपीआई-जागरूक होने के लिए हमारे आवेदन की आवश्यकता है। हालात बिगड़ जा रहे हैं जब हम अगले

उच्च संकल्प 120 या 144 आदि के लिए जाने

सबसे आम मुद्दों

  1. बिटमैप स्केलिंग मुद्दों और

  2. पाठ कट ऑफ

these एमएसडीएन दस्तावेज़ों के माध्यम से जाने के बाद घ existing अतः सवाल मैं

करने की कोशिश की

अपने आवेदन के अंदर व्यर्थ में इस तरह के एक ठीक शामिल (के बाद से सभी का इस्तेमाल किया नियंत्रण

अनुकूलित कर रहे हैं और DPI-बारे में पता नहीं कर रहे हैं)।

चीजें मैं इनहेरिट

  1. के रूप में मेरे application.manifest AutoScaleMode संशोधित डीपीआई जागरूकता झंडा सक्षम करने के लिए और मुख्य रूप और अन्य रूपों पर AutoScaleMode.Dpi को AutoScaleMode सेटिंग का उपयोग बदल दिया नियंत्रण फ़ॉन्ट के बाद की कोशिश की ऑनलोड ईवेंट के अंदर

ग्राफिक्स जी = यह। क्रेतेग्राफिक्स(); int dpi = int.Parse (g.DpiX.ToString());

switch (dpi) 
    { 
     case 125: 
      this.Font = new Font(this.Font.FontFamily, this.Font.Size * 125.0f/(float)(g.DpiX)); 
      Debug.WriteLine("<<---- Selected DPI Resolution :" + " 125 DPI ---->"); 
      break; 
    ... so on 
  1. की कोशिश की ScaleControl विधि अधिभावी डीपीआई

के आधार पर अलग अलग स्केलिंग कारक का उपयोग करना लेकिन इन सब मेरे मामले में काम करने के लिए लग रहे हैं कभी नहीं।

क्या कोई इस मुद्दे से निपटने के लिए मुझे बेहतर दृष्टिकोण बताता/सुझाव देता है।

धन्यवाद

VATSAG

+1

यह 'int dpi = int.Parse (g.DpiX.ToString()); 'मेरे अंदर कुछ हिलाता है। मुद्दे के बारे में, मुझे लगता है, आपको स्विच के माध्यम से डीपीआई की जांच नहीं करनी चाहिए। फॉर्मूला ** हमेशा ** का प्रयोग करें, सूत्रों को किसी भी डीपीआई के लिए काम करना चाहिए। आपको लेआउट को फिर से काम करने की आवश्यकता हो सकती है, केवल ऑटो आकार के 'लेबल' का उपयोग करें और उन्हें 'टेबललेआउट पैनेल' के अंदर रखें (यह सुनिश्चित करने के लिए कि कौन से नियंत्रण ओवरलैप नहीं होते हैं), आदि। 'पिक्चरबॉक्स' के अंदर बिटमैप्स ठीक होना चाहिए। यदि आपका मतलब आपके कस्टम नियंत्रण है, तो फिर - सूत्र + लेआउटिंग। – Sinatr

+0

क्षमा करें अगर मैं यहाँ बेवकूफ लग रहा हूं..तुम्हारा सूत्रों का क्या मतलब है? –

+0

उदाहरण के लिए, छवियों के लिए: 'new_width = width * scale * old_dpi/new_dpi;'। – Sinatr

उत्तर

6

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

  1. सभी अपने रूपों AutoScaleMode = AutoScaleMode.Font का उपयोग कर पैमाने पर करने के लिए सेट किया जाना चाहिए। जब मैंने कुछ खुदाई की तो मुझे पता चला कि AutoScaleMode.Dpi काफी काम नहीं करता है क्योंकि कोई इसकी उम्मीद करेगा। आपको यह भी चुनना चाहिए कि आपका मानक डीपीआई इकाई क्या होगी।मान लें कि यह 96 है, क्योंकि आपका आवेदन मूल रूप से किसी भी रूप में डिज़ाइन किया गया था, तो आपको AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F) का उपयोग करने के लिए अपने सभी फॉर्म सेट करना होगा। आप इन कॉन्फ़िगरेशन को डिज़ाइनर व्यू से सेट कर सकते हैं। साथ ही, यदि आपने कोई कस्टम नियंत्रण बनाया है, तो उन्हें सभी को AutoScaleMode = AsutoScaleMode.Inherit का उपयोग करने के लिए सेट किया जाना चाहिए। इन दो चीजों के साथ, आप आश्वस्त रह सकते हैं कि .NET आपके सभी स्थिर घटकों पर सभी स्केलिंग करेगा।

  2. अब जब यह मुश्किल हो जाता है। बात यह है कि ढांचा आपके सभी नियंत्रणों को सही आकार के बारे में तब तक बनाए रखेगा जब तक कि वे गतिशील रूप से बनाए और फॉर्म के अंदर नहीं रखे जाते।

तो अगर आप की तरह कुछ कार्य करें:

var myTextBox = new TextBox(); 
myTextBox.Location = new System.Drawing.Point(20, 20); 
myForm.Controls.Add(myTextBox); 

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

var graphics = Graphics.FromHwnd(IntPtr.Zero); // This gets the graphics configuration of the current screen 
var scaleX = graphics.DpiX/96; // 96 was our standard design DPI, remember? 
var scaleY = graphics.DpiY/96; 
var myTextBox = new TextBox(); 

myTextBox.Location = new System.Drawing.Point((int)Math.Round(20 * scaleX), (int)Math.Round(20 * scaleY)); 

myForm.Controls.Add(myTextBox); 

इस तरह स्थान जिस पर आप स्क्रीन पर नियंत्रण आकर्षित करेंगे वास्तविक डीपीआई पर निर्भर करेगा: तो, बजाय आप की तरह कुछ लिखने के लिए कर सकते हैं। और, यदि मैं सुझाव दे सकता हूं, तो मैं वास्तव में स्केलिंग कार्यक्षमता को किसी प्रकार की सहायक वर्ग में निकाल दूंगा, जहां आप x और y पर मान को स्केल करने के तरीकों को परिभाषित करते हैं, इसलिए आपके पास मानक स्केलिंग तंत्र होगा। ध्यान दें कि यह भी महत्वपूर्ण है कि आप एक्स और वाई पर स्वतंत्र रूप से स्केल करें, क्योंकि कुछ स्क्रीनों में प्रत्येक धुरी पर अलग-अलग पिक्सेल घनत्व होते हैं।

वैसे भी, यदि आप इन दो स्थितियों का पालन करते हैं, तो आपके आवेदन को स्क्रीन पर ठीक से स्वतंत्र दिखना चाहिए।

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