2011-04-16 36 views
5

और आप सभी को शुभ दिन। यह मेरी पहली पोस्ट है। - मैं पढ़ रहा था "MFC के साथ प्रोग्रामिंग विंडोज जम्मू प्रोसीस (एमएस प्रेस)"
दूसरे अध्याय में मैं 2 GDI काम करता है, मैं पाठ के हवाले कर रहा हूँ कि वास्तव में मुझे उलझन में आए:दो एमएफसी जीडीआई समारोह में भ्रम

यह प्राप्त करने के लिए आसान है SetViewportOrg और SetWindowOrg उलझन में है, लेकिन उनके बीच भेद वास्तव में काफी स्पष्ट है। SetViewportOrg के साथ व्यूपोर्ट मूल को (x, y) में बदलना विंडोज़ को लॉजिकल पॉइंट (0,0) को डिवाइस पॉइंट (x, y) पर मैप करने के लिए कहता है। SetWindowOrg के साथ विंडो मूल को (x, y) में बदलना अनिवार्य रूप से विपरीत है, जो विंडोज़ को लॉजिकल पॉइंट (x, y) को डिवाइस बिंदु (0,0) पर मैप करने के लिए बताता है - प्रदर्शन सतह के ऊपरी बाएं कोने। MM_TEXT मानचित्रण मोड में, दो कार्यों के बीच एकमात्र असली अंतर x और y के संकेत हैं। अन्य मानचित्रण मोड में, वहाँ तार्किक निर्देशांक में डिवाइस निर्देशांक में है कि तुलना में यह करने के लिए अधिक है क्योंकि SetViewportOrg सौदों और SetWindowOrg सौदों

मैं, वास्तव में इस के साथ उलझन में हूँ अगर हम दृष्टिकोण मूल परिवर्तित कहने के लिए की तरह (50,50) है और फिर dc.ellipse (0,0,50,50) का उपयोग करें, यह डिवाइस बिंदु (50,50) से मूल के रूप में शुरू होगा, लेकिन अगर हमने विंडो मूल को बदल दिया है (50,50) तो इसका मतलब है कि अब तार्किक बिंदु (50 , 50) को मैप किया जाएगा (0,0) यदि ऐसा है, तो ऊपरी क्षेत्र में क्लाइंट के क्षेत्र से अंडाकार नहीं होगा? और मैपिंग मोड MM_LOWENGLISH या कुछ और क्या था? तब स्थिति कैसे बदल जाएगी? कृपया अगर कोई इस मामले पर कुछ प्रकाश डाल सकता है तो मैं वास्तव में आभारी हूं

उत्तर

6

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

संक्षिप्त उत्तर सिर्फ SetWindowOrg का उपयोग नहीं करता है। मुझे पूरा यकीन है कि मेरे पास वास्तविक कोड में इसके लिए कभी भी अच्छा उपयोग नहीं हुआ है।

SetViewportOrg उपयोगी है, और विवरण से यह वास्तव में आसान है यह ध्वनि बनाता है - आप बस यह चुन रहे हैं कि आप अपनी उत्पत्ति कहां चाहते हैं। उदाहरण के लिए, हो सकता है कि आप अपनी ड्राइंग विंडो के निचले बाएं कोने से नीचे से शुरू करना चाहें। विंडो के बाईं ओर पर होना एक्स = 0

CRect rect; 
GetClientRect(&rect); 

pDC->SetViewportOrg(0, rect.Height()); 

OTOH, अगर तुम दोनों नकारात्मक और सकारात्मक संख्या आकर्षित करने के लिए सक्षम होना चाहते हैं, तो आप चाहते हो सकता है, लेकिन y: आप उस के साथ कुछ पसंद करते हैं चाहते हैं = 0 खिड़की के ऊपर और नीचे के बीच केंद्रित आधा रास्ते होना चाहिए।

// get rect as above. 
pDC->SetViewportOrg(0, rect.Height()/2); 

आप होने के लिए अपने (0,0) आप उपयोग करेंगे खिड़की के केंद्र चाहता है तो: आपको लगता है कि कुछ पसंद है था

// again, get rect like above 
pDC->SetViewportOrg(rect.Width()/2, rect.Height()/2); 

ध्यान दें कि प्राथमिक इनमें से किसी का उपयोग मैपिंग मोड के साथ MM_ISOTROPIC या MM_ANISOTROPIC पर सेट किया गया है - ये वे जगह हैं जहां आप निर्देशांक को पूरी तरह से सेट अप करते हैं। अन्य तरीकों के साथ [MM_TEXT या MM_ (LO | HI) (इंग्लिश | मेट्रिक)], यह आपके लिए स्वचालित रूप से एक मूल सेट करता है।

+0

सहायता के लिए धन्यवाद। सबसे पहले मैंने भी केआईएसएस सिद्धांत के साथ चिपकने का विचार किया लेकिन इसे समझने के लिए इसे और अधिक पढ़कर पूरी तरह से मुझे भ्रमित कर दिया। – Razort4x