2011-01-13 18 views
9

विंडोज एक्सपी और ऊपर में, एक विंडो हैंडल (एचडब्ल्यूएनडी) दिया गया है, मैं कैसे बता सकता हूं कि खिड़की की स्थिति और आकार खिड़की को स्क्रीन से अनजाने में छोड़ देता है? उदाहरण के लिए, यदि शीर्षक बार कर्सर पर उपलब्ध है, तो विंडो को स्क्रीन पर वापस खींच लिया जा सकता है। मुझे यह पता लगाने की ज़रूरत है कि खिड़की वास्तव में दिखाई दे रही है या कम से कम उपयोगकर्ता के लिए उपलब्ध है या नहीं। मुझे लगता है कि मुझे यह जानने की भी आवश्यकता है कि संकल्प परिवर्तनों का पता लगाने और जवाब देने और एकाधिक मॉनीटर से निपटने के तरीके का जवाब कैसे दिया जाए। यह काफी बड़ा सौदा लगता है। मैं सी ++ और नियमित एसडीके का उपयोग कर रहा हूं, इसलिए कृपया सी # या इसी तरह के आविष्कार के बजाय उस प्लेटफॉर्म पर अपने उत्तरों को सीमित करें।मैं कैसे निर्धारित करूं कि खिड़की ऑफ-स्क्रीन है या नहीं?

उत्तर

15

विंडोज प्राथमिक मॉनीटर पर उपयोगकर्ता के कार्यक्षेत्र के आकार को निर्धारित करने के लिए अपेक्षाकृत सरल बनाता है (यानी, स्क्रीन का क्षेत्र टास्कबार द्वारा अस्पष्ट नहीं है)। SystemParametersInfo function पर कॉल करें और पहले पैरामीटर (uiAction) के लिए SPI_GETWORKAREA ध्वज निर्दिष्ट करें। pvParam पैरामीटर को RECT structure पर इंगित करना चाहिए जो वर्चुअल स्क्रीन निर्देशांक में कार्यक्षेत्र के निर्देशांक प्राप्त करेगा।

एक बार जब आप कामकाजी क्षेत्र का वर्णन करने वाले निर्देशांक प्राप्त कर लेते हैं, तो यह निर्धारित करने के लिए कि यह उन सीमाओं के भीतर है या नहीं, यह निर्धारित करने के लिए आपके एप्लिकेशन की विंडो की वर्तमान स्थिति की तुलना करना एक साधारण बात है।


एकाधिक मॉनीटर का समर्थन करने की इच्छा चीजों को थोड़ा और जटिल बनाती है। SystemParametersInfo के लिए प्रलेखन से पता चलता है कि प्राथमिक के अलावा मॉनीटर के कार्यक्षेत्र को पाने के लिए आपको GetMonitorInfo function पर कॉल करने की आवश्यकता है। यह MONITORINFOEX नामक संरचना में भरता है जिसमें सदस्य rcWork होता है जो उस मॉनीटर के कार्यक्षेत्र को परिभाषित करता है, फिर वर्चुअल स्क्रीन निर्देशांक में RECT संरचना के रूप में व्यक्त किया जाता है।

यह करने के लिए, आपको सिस्टम से कनेक्ट होने वाले सभी मॉनीटरों की गणना करने और GetMonitorInfo का उपयोग करके प्रत्येक के कार्यक्षेत्र को पुनर्प्राप्त करने की आवश्यकता होगी।

पास इसके कुछ नमूने इंटरनेट के आसपास पाया जा सकता हैं:

  • MSDN Positioning Objects on a Multiple Display Setup के लिए कुछ नमूना कोड है।
  • यदि आप एमएफसी का उपयोग कर रहे हैं, तो यहां कई मॉनीटर समर्थन के an excellent example होने की संभावना है।
  • भले ही आप एमएफसी का उपयोग नहीं कर रहे हैं, यह आलेख the following link को संदर्भित करता है जो कि वास्तविक मणि दिखता है, यह बताते हुए कि विंडोज़ में एकाधिक मॉनीटर कैसे काम करता है, भले ही यह थोड़ा पुराना स्कूल हो। इसकी तरह या नहीं, विंडोज के बाद के संस्करणों में इसका बहुत कम बदल गया है।


अंत में, आपने संकल्प परिवर्तनों का पता लगाने का उल्लेख किया है। यह शायद कल्पना की तुलना में यह बहुत आसान है। जैसा कि आप जानते हैं कि आपने कोई विंडोज प्रोग्रामिंग किया है, ऑपरेटिंग सिस्टम आपके आवेदन के साथ संचार करने का प्राथमिक तरीका है WindowProc function पर संदेश भेजना।
इस मामले में, आप WM_DISPLAYCHANGE message के लिए देखना चाहते हैं, जो डिस्प्ले रेज़ोल्यूशन बदलते समय सभी विंडो पर भेजा जाता है। wParam बिट्स प्रति पिक्सेल में नई छवि गहराई है; lParam का निम्न-आदेश शब्द क्षैतिज संकल्प निर्दिष्ट करता है और lParam का उच्च-आदेश शब्द स्क्रीन के लंबवत संकल्प को निर्दिष्ट करता है।

+0

धन्यवाद, यह एक उत्कृष्ट शुरुआत है - मुझे विश्वास नहीं है कि मैं पहले SystemParametersInfo में नहीं आया हूं। मैं अभी भी समस्या के साथ फंस गया हूं कि शीर्षक बार दिखाई दे रहा है या नहीं, और यदि संकल्प में परिवर्तन होता है तो क्या होता है। – hatcat

+0

@hatcat: खुद को हरा करने का कोई कारण नहीं; विंडोज एपीआई बड़ा है और कोई भी सब कुछ नहीं जानता है। मुझे यकीन नहीं है कि आप अभी भी टाइटल बार की दृश्यता पर कैसे फंस सकते हैं। यह देखने के लिए जांचें कि शीर्षक विंडो वाले आपकी विंडो का क्षेत्र स्क्रीन के कार्यक्षेत्र में स्थित है या नहीं, जिसे आपने ऊपर वर्णित कार्यों में से किसी एक का उपयोग किया है। और मैं सीधे संकल्प परिवर्तन का पता लगाने के बारे में भूल गया; मैं अपना जवाब अपडेट करूंगा। –

+0

धन्यवाद! मैं 1 99 2 से विंडोज प्रोग्रामिंग कर रहा हूं, मान लीजिए या नहीं। मुझे लगता है कि सबसे कठिन बात यह जानती है कि कार्यक्षमता को किस प्रकार से हटा दिया गया है, और कब, और क्या आपको पता है कि आपको क्या पता होना चाहिए या नहीं। टाइटल बार भाग उस क्षेत्र को पुनः प्राप्त करने के साथ और अधिक था इसलिए मैं इसका परीक्षण कर सकता था। मैं बस शीर्ष दस पिक्सेल और पक्ष दस पिक्सेल की जांच करने जा रहा हूं, जो पर्याप्त होना चाहिए। – hatcat

1

दृश्यता जांच वास्तव में आसान है।

RECT rtDesktop, rtView; 

GetWindowRect(GetDesktopWindow(), &rtDesktop); 
GetWindowRect(m_hWnd, &rtView); 

HRGN rgn = CreateRectRgn(rtDesktop.left, rtDesktop.top, rtDesktop.right, rtDesktop.bottom); 

BOOL viewIsVisible = RectInRegion(rgn, &rtView); 

DeleteObject(rgn); 

आपको RectInRegion का उपयोग करने की आवश्यकता नहीं है, मैं कोड को छोटा करने के लिए उपयोग करता हूं।

प्रदर्शन, संकल्प परिवर्तन निगरानी भी आसान है यदि आप WM_SETTINGCHANGE संदेश को संभालते हैं।

http://msdn.microsoft.com/en-us/library/ms725497(v=vs.85).aspx

अद्यतन

रूप @Cody ग्रे बताया गया है, मुझे लगता है कि WM_DISPLAYCHANGE WM_SETTINGCHANGE से अधिक उपयुक्त है। लेकिन एमएफसी 9.0 लाइब्रेरी WM_SETTINGCHANGE का उपयोग करती है।

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

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