2012-04-19 7 views
6

मैं एक ऐसी संपत्ति की तलाश कर रहा हूं जो मुझे फॉर्म के ClientRectangle's "0,0" पर नहीं, इसके फॉर्म के स्थान के सापेक्ष एक नियंत्रण का स्थान देता है।मैं अपने फॉर्म के स्थान से संबंधित नियंत्रण स्थान कैसे प्राप्त करूं?

बेशक मैं सब कुछ स्क्रीन निर्देशांक में परिवर्तित कर सकता हूं, लेकिन मुझे आश्चर्य है कि ऐसा करने का एक और सीधा तरीका है या नहीं।

+0

_control के location_ द्वारा आपको वास्तव में क्या मतलब है यह कर्सर का स्थान है जिसे आप चाहते हैं? – uday

+0

@uDaY मेरा मतलब है: स्क्रीन निर्देशांक में। यदि फॉर्म 100,100 पर है और नियंत्रण 150,350 पर है तो मैं 50,250 प्राप्त करना चाहता हूं। – ispiro

+0

देखें: http://stackoverflow.com/questions/8838621/how-to-determine-actual-windows-form-size-with-all-nonclient-elements-when-run –

उत्तर

2

ऐसा लगता है कि उत्तर यह है कि ऐसा करने का कोई सीधा तरीका नहीं है। तकनीकी रूप से प्रश्न की बारीकियों को देखते हुए सही

(जैसा कि मैंने सवाल मैं एक तरह से अन्य स्क्रीन निर्देशांक का उपयोग करने से तलाश कर रहा हूँ में कहा गया है।)

9

आपको स्क्रीन निर्देशांक में कनवर्ट करने की आवश्यकता है और फिर कुछ गणित करें।

Point controlLoc = form.PointToScreen(myControl.Location); 

फ़ॉर्म का स्थान पहले से ही स्क्रीन निर्देशांक में है।

अब

:

Point relativeLoc = new Point(controlLoc.X - form.Location.X, controlLoc.Y - form.Location.Y); 

है कि आप प्रपत्र के क्लाइंट क्षेत्र के लिए फार्म के ऊपरी-बाएं कोने को स्थान रिश्तेदार, बजाय रिश्तेदार दे देंगे।

+0

आपके उत्तर के लिए धन्यवाद, लेकिन जैसा कि मैंने सवाल में लिखा है, मैं स्क्रीन निर्देशांक की जांच करने से अधिक प्रत्यक्ष तरीके से ढूंढ रहा हूं। – ispiro

+1

@ispiro: इसमें कोई और सीधा तरीका नहीं बनाया गया है। आप आसानी से उस तर्क को उस छोटे से फ़ंक्शन में लपेट सकते हैं जिसे आप कॉल कर सकते हैं। या, जब फॉर्म पहली बार प्रदर्शित होता है, तो आप 'form.PointToScreen (नया पॉइंट (0, 0)) कॉल कर सकते हैं, परिणाम को सहेज सकते हैं, और उसके बाद एक्स और वाई मान को नियंत्रण के' स्थान' पर जोड़ दें जब आप चाहते हैं अपने खिड़की के सापेक्ष निर्देशांक प्राप्त करें। मेरी पिछली टिप्पणी के बारे में –

+0

। मेरा मतलब है कि आप फॉर्म के क्लाइंट एरिया स्थान प्राप्त करने के लिए 'प्वाइंटटोक्रीन' पर कॉल करते हैं, और ऑफसेट प्राप्त करने के लिए स्थान के एक्स और वाई मान घटाते हैं। उसके लिए माफ़ करना। इनपुट के लिए –

3

मुझे लगता है कि यह आपके प्रश्न का उत्तर देगा। ध्यान दें कि "यह" रूप है।

Rectangle screenCoordinates = control.Parent.ClientToScreen(control.ClientRectangle); 
Rectangle formCoordinates = this.ScreenToClient(screenCoordinates); 
+0

आपके उत्तर के लिए धन्यवाद, लेकिन जैसा कि मैंने सवाल में लिखा है, मैं स्क्रीन निर्देशांक की जांच करने के बजाय एक और सीधा तरीका ढूंढ रहा हूं। इनपुट के लिए – ispiro

+0

+1। – ispiro

1

चयनित जवाब है: इस तरह के एक संपत्ति करता है .NET ढांचे में मौजूद नहीं है।

लेकिन यदि आप ऐसी संपत्ति चाहते हैं, तो यहां एक नियंत्रण विस्तार है जो चाल करेगा। हां, यह स्क्रीन निर्देशांक का उपयोग करता है, लेकिन पोस्ट शीर्षक की सामान्य प्रकृति को देखते हुए, मुझे यकीन है कि इस पृष्ठ पर उतरने वाले कुछ उपयोगकर्ता इसे उपयोगी पा सकते हैं।

संयोग से, मैंने कुछ नियंत्रण घंटे माता-पिता के माध्यम से लूपिंग करके स्क्रीन निर्देशांक के बिना ऐसा करने का प्रयास करने में कुछ घंटे बिताए। मैं मेल खाने के लिए दो तरीकों को कभी नहीं मिला। ओरो को हंस पासेंट की टिप्पणी के कारण यह हो सकता है कि एरो खिड़की के आकार के बारे में कैसे झूठ बोलता है।

using System; 
using System.Drawing; 
using System.Windows.Forms; 

namespace Cambia 
{ 
    public static class ControlExtensions 
    { 
     public static Point FormRelativeLocation(this Control control, Form form = null) 
     { 
      if (form == null) 
      { 
       form = control.FindForm(); 
       if (form == null) 
       { 
        throw new Exception("Form not found."); 
       } 
      } 

      Point cScreen = control.PointToScreen(control.Location); 
      Point fScreen = form.Location; 
      Point cFormRel = new Point(cScreen.X - fScreen.X, cScreen.Y - fScreen.Y); 

      return cFormRel; 

     } 

    } 
} 
+1

यह एक अच्छा समाधान है। हालांकि, मुझे विश्वास है कि आप 'cFormRel' वापस करना चाहते हैं। – dshrout

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