2010-02-16 4 views
5

क्या GDI + में उपयोगकर्ता नियंत्रण में स्क्रॉलिंग की एक पसंदीदा, तेज़ विधि है?एक जीडीआई + के साथ वैध रूप से कैसे स्क्रॉल कर सकता है?

मैंने एक ऐसा नियंत्रण बनाया है जो ग्राफिक रूप से एक क्षैतिज स्क्रॉल करने योग्य डेटा प्लॉट प्रस्तुत करता है।

वर्तमान में, मेरा नियंत्रण डेटा में ऑफसेट में क्षैतिज स्क्रॉल बार की स्थिति को परिवर्तित करके संचालित होता है। नियंत्रण तब उस डेटा को प्रस्तुत करता है जो इस प्रारंभिक बिंदु और नियंत्रण की चौड़ाई के आधार पर गणना की गई अंतिम बिंदु के बीच मौजूद होता है।

यह विधि काम करती है, लेकिन बहुत धीमी है। मैं प्रत्येक स्क्रॉल घटना पर पूरी नियंत्रण सतह को मैन्युअल रूप से दोबारा नहीं लेना चाहता हूं। इसके बजाय, मैं ग्राफिकल डेटा की संपूर्णता (या कुछ भाग) को ऑफस्क्रीन सतह पर चित्रित करके नियंत्रण शुरू करना चाहता हूं, और उसके बाद ऑफसेट पर शुरू होने वाले पूर्व-प्रस्तुत ग्राफ़िक डेटा को पढ़ने के कारण नियंत्रण सतह को वर्चुअल रूप से स्क्रॉल करना चाहता हूं क्षैतिज स्क्रॉल बार की स्थिति से गणना की।

क्या बिटबल्ट ऐसा करने का एकमात्र तरीका है? क्या मुझे वास्तव में एक सतह से दूसरे सतह पर ग्राफिक्स डेटा मैन्युअल रूप से कॉपी करना है? क्या मैं सिर्फ पेंट इवेंट नहीं ले सकता हूं और इसे ऑफस्क्रीन सतह से डेटा को पढ़ने के कारण इसे पढ़ सकता हूं? इस तरह, कॉपी और प्रस्तुत करने की क्रिया एक ही है।

या, क्या मुझे सीधे पैनल नियंत्रण में पेंट की तरह कुछ होकी चाहिए और फिर सचमुच पैनल को बाएं से दाएं स्क्रॉल करें?

वर्गीकरण: अनिवार्य रूप से, मैं पूर्व-प्रस्तुत डेटा को स्क्रॉल करने का सही तरीका जानना चाहता हूं। एक नियंत्रण में ग्राफिकल डेटा स्क्रॉल कैसे करता है? को पूर्व-प्रस्तुत ग्राफिक को फिर से निकालना सही विकल्प नहीं है।

+0

कितना बड़ा पूरे स्क्रॉल साजिश की सतह मिल सकता है? क्या आप हमेशा सभी बिंदुओं को आकर्षित करते हैं या जिन्हें आप जानते हैं वे दिखाई दे रहे हैं? –

+0

मैं केवल उन बिंदुओं को आकर्षित करता हूं जो दृश्य क्षेत्र के भीतर हैं। साजिश का पूरा क्षेत्र नियंत्रण की चौड़ाई 200 गुना तक हो सकता है। मैं नियंत्रण सतह के आकार के बारे में एक ग्राफिक बफर बनाना चाहता हूं और सेट सेट खंड में आवश्यक डेटा को पढ़कर बफर को फिर से भरना चाहता हूं। – James

उत्तर

3

हां, मैं डबल-बफरिंग का प्रयास करूंगा। यदि आप ऑफ-स्क्रीन बिटमैप को प्रस्तुत करते हैं, तो आप बस बिटमैप को स्क्रॉल कर सकते हैं।

आप पूरे ग्राफ को एक बड़े बिटमैप में प्रस्तुत करने का प्रयास कर सकते हैं और स्क्रॉल बार को इसे चारों ओर ले जाने दें। हालांकि, यदि आपका ग्राफ बेहद बड़ा है, तो आपको बिटमैप के आकार को दृश्य क्षेत्र में सीमित करने की आवश्यकता होगी, बस उस पर चित्रित करें, और स्क्रॉलिंग को वस्तुतः संभालें।

32-बिट विंडोज एक्सपी पर परीक्षण, मुझे पता चला कि सीमा लगभग 237.9 मिलियन पिक्सेल है। यह ज्यादातर नियंत्रणों के लिए निश्चित रूप से बहुत है, लेकिन यह आपके आवेदन के लिए पर्याप्त नहीं हो सकता है।

उत्सुक के लिए, यहाँ अधिकतम विंडोज बिटमैप आकार हम बनाने में सक्षम थे और इस्तेमाल होता है:

 
Width Height Area (pixels) 
====== ====== =========== 
32,767 7,261 237,921,187 
25,000 9,517 237,925,000 
23,792 10,000 237,920,000 
20,000 11,896 237,920,000 
15,861 15,000 237,915,000 
15,000 15,861 237,915,000 
11,896 20,000 237,920,000 
10,000 23,792 237,920,000 
9,517 25,000 237,925,000 
7,261 32,767 237,921,187 
+1

कैसे "बस बिटमैप को स्क्रॉल करें?" ऑन-स्क्रीन बिटमैप पर ऑफ़-स्क्रीन बिटमैप के क्षेत्रों की नकल करके प्रतिलिपि बनाकर? एक संदर्भ में गुजरकर और एक निश्चित जीडीआई + समारोह में ऑफसेट स्क्रॉल करके? – James

+1

सी # में, कई ग्राफिक्स हैं। ड्राइमेज ओवरराइड करता है जो आपको किसी निर्दिष्ट स्थान पर किसी छवि का हिस्सा खींचने देता है। आप बिटमैप बना सकते हैं, फिर स्क्रॉल स्थान पर शुरू होने वाले आयत को खींचें और नियंत्रण के दृश्य क्षेत्र का आकार बनाएं। –

+0

@ जेम्स, हाँ, पौलुस का यही अर्थ था।आपका सवाल, "क्या मैं सिर्फ पेंट इवेंट नहीं ले सकता हूं और इसे ऑफस्क्रीन सतह से डेटा को पढ़ने के कारण इसे पढ़ सकता हूं?" आपकी गलतफहमी दिखाता है। पेंट इवेंट स्वयं कुछ भी नहीं करता है - यह प्रस्तुत नहीं करता है; यह सिर्फ आपके कोड को सूचित करता है कि आईटी को कुछ खींचने की जरूरत है। तो DrawImage() के साथ आपकी पूर्व-प्रस्तुत छवि का हिस्सा खींचना स्क्रॉल करने का एक सही तरीका है। – Qwertie

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