2009-12-16 9 views
29

MSDN प्रदान नहीं करता है, IMHO, Control.PointToScreen (link) और Control.PointToClient (link) तरीकों के बीच एक स्पष्ट अंतर।नियंत्रण PointToClient() बनाम PointToScreen()

क्या कोई ऐसा व्यक्ति है जो कुछ सरल शब्दों में समझा सकता है कि इन तरीकों के बीच क्या अंतर है। विशेष रूप से मेरे लिए "ग्राहक" की धारणा अस्पष्ट है।

मैं पॉइंट टॉस्क्रीन को वास्तविक स्क्रीन समन्वय (स्क्रीन के बाएं ऊपरी कोने में [0, 0] के साथ) को इंगित करता हूं।

उदाहरण, कुछ कोड डिबगिंग मैं

?click.Location 
{X = 3 Y = 9} 

?shapeSender.PointToClient(click.Location) 
{X = -470 Y = -565} 

?shapeSender.PointToScreen(click.Location) 
{X = 476 Y = 583} 

धन्यवाद किया है।

उत्तर

40

इसके बारे में सोचने का सबसे अच्छा तरीका है: सापेक्ष बनाम अनुपस्थिति निर्देशांक। जहां रिश्तेदार समन्वय खिड़की के ग्राहक क्षेत्र के ऊपरी बाएं कोने से संबंधित होता है। खिड़की का ग्राहक क्षेत्र इसकी सीमा से कम खिड़की है। सापेक्ष निर्देशांक उपयोगी होते हैं क्योंकि जब उपयोगकर्ता खिड़की चलाता है और खिड़की की सीमा और कैप्शन आकार पर निर्भर नहीं होता है तो वे नहीं बदलते हैं।

विनफॉर्म में अधिकांश निर्देशांक सापेक्ष निर्देशांक हैं, उदाहरण के लिए MouseEventArgs.Location। कुछ पूर्ण हैं, कर्सर। उदाहरण के लिए। यदि आप प्वाइंटटॉइंट पर रिश्तेदार समन्वय पास करते हैं तो आपको कचरा मिल जाएगा, जैसा कि आपने अपने डीबग सत्र में देखा था। यह एक पूर्ण समन्वय होना चाहिए।

कुछ समन्वय गुण प्रतीत होते हैं, नियंत्रण। उदाहरण के लिए स्थान। एक बच्चे के नियंत्रण पर यह अपने कंटेनर से संबंधित नियंत्रण के स्थान का प्रतिनिधित्व करता है। एक फॉर्म का स्थान पूर्ण है। जब आप एक नियंत्रण के बारे में सोचते हैं तो यह विरोधाभास गायब हो जाता है। नियंत्रण एक नियंत्रण के माता-पिता से संबंधित है। एक रूप का अभिभावक डेस्कटॉप है।

एक सामान्य उपयोग एक नियंत्रण के सापेक्ष समन्वय को किसी अन्य नियंत्रण में मैप करना है। control1.PointToScreen() के साथ पूर्ण स्क्रीन निर्देशांक के लिए पहला मानचित्र, फिर परिणाम को control2.PointToClient() के साथ अन्य नियंत्रण में मैप करें। प्वाइंट वैल्यू नियंत्रण के बीच ऑफ़सेट द्वारा बदलता है, भले ही उनके माता-पिता कौन हैं। इसे किसी अन्य तरीके से करना बहुत दर्दनाक है।

पॉइंट टॉक्लिएंट के लिए एक पूर्ण समन्वय पारित करने और पॉइंटटोक्रीन के सापेक्ष समन्वय से परेशानी से बचें।

+0

एक (अस्वीकार) [सुझाया गया संपादन] था (http://stackoverflow.com/review/suggested-edits/2557841) जो उल्लेख करता है कि 'Mouse.Position' नाम की कोई संपत्ति नहीं है। यह मेरे लिए सही लगता है। मैं संपादन लागू करूंगा लेकिन मुझे Winforms नहीं पता है, इसलिए मुझे नहीं पता कि आपका मतलब है 'Control.MousePosition' या' कर्सर। स्थान ' – doubleDown

+0

मुझे लगता है कि वे इसे पॉइंटफ्रॉम क्लाइंट टॉस्क्रीन कह सकते थे लेकिन यह अधिक है। चूंकि PointFromScreenToScreen बस समझ में नहीं आता है। –

+0

मुझे अपनी पिछली टिप्पणी को हटाना पड़ा। यह * स्क्रीन समन्वय देता है। –

4

"क्लाइंट" निर्देशांक नियंत्रण के क्लाइंट क्षेत्र के ऊपरी बाईं ओर के सापेक्ष हैं। "स्क्रीन" निर्देशांक (प्राथमिक) मॉनिटर के ऊपरी बाईं ओर के सापेक्ष हैं।

"क्लाइंट एरिया" एक नियंत्रण का क्षेत्र है जिसमें बाल नियंत्रण रखा जा सकता है। एक फॉर्म का क्लाइंट आयताकार सीमाओं और शीर्षक पट्टी को छोड़कर, फॉर्म के अंदर का क्षेत्र है। अधिकांश अन्य नियंत्रणों के लिए, क्लाइंट क्षेत्र उस क्षेत्र के समान होता है जहां नियंत्रण स्क्रीन पर रहता है।

PointToScreen क्लाइंट निर्देशांक को स्क्रीन निर्देशांक में परिवर्तित करता है। PointToClient रिवर्स करता है: यह स्क्रीन निर्देशांक को क्लाइंट निर्देशांक में परिवर्तित करता है।

3

मान लीजिए कि एक स्क्रीन 800x600 है और एक विंडो 50,50 पर 200x200 पिक्सल के आकार के साथ है। यदि बिंदु पी खिड़की के ऊपरी बाएं से संबंधित 10,10 पर स्थित है तो प्वाइंटटोक्रीन (पी) 60,60 लौटाएगा। यदि यह पी विंडो हैंडल के साथ प्वाइंटटॉक्लिएंट (पी) को दिया जाता है तो हमें फिर से 10,10 मिलेंगे।

आशा है कि भ्रम की स्थिति को साफ करता है

+0

क्या होगा यदि खिड़की में मेरे पास 10, 10 पर एक पैनल है और मैं एक बटन (पैनल में 5, 5 पर) विधि प्वाइंटटॉक्लिएंट ([5, 5]) कहता हूं? – serhio

9

PointToClient विधि PointToScreen विधि के विपरीत है।

(यदि यह इतने लंबे समय और दोहराव नहीं था, वे ScreenPointToClientPoint और ClientPointToScreenPoint नामित किया जाएगा।)

आप अगर आपके पास उदाहरण के लिए, रूपांतरण का उपयोग आप निर्देशांक में से एक प्रकार है और अन्य की जरूरत है जब स्क्रीन के सापेक्ष एक माउस क्लिक के निर्देशांक, और यह जानने की आवश्यकता है कि उपयोगकर्ता ने किस नियंत्रण में क्लिक किया था।

यदि आप क्लाइंट क्षेत्र के बाहर एक स्क्रीन पॉइंट परिवर्तित करते हैं, तो आपको समन्वय घटक मिलेंगे जो या तो नियंत्रण क्लाइंट क्षेत्र के आकार से नकारात्मक या बड़े होते हैं।

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