2013-03-14 11 views
5

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

यदि मैं ड्राइंग क्षेत्र में स्क्रॉल-बार जोड़ने के लिए स्क्रॉलडविंडो + व्यूपोर्ट विधि का उपयोग करता हूं तो यह स्पष्ट रूप से काम नहीं करता है क्योंकि ड्राइंग क्षेत्र स्क्रॉल-बार की आवश्यकता के लिए पर्याप्त नहीं है।

क्या कोई तरीका है कि मैं व्यूपोर्ट को यह सोचने में चाल कर सकता हूं कि अंतर्निहित विजेट वास्तव में उससे बड़ा है? यदि इस समस्या को हल करने का सबसे अच्छा तरीका क्या नहीं है?

नोट: मैं जीटीके 2 का उपयोग कर रहा हूं और जीटीके 3 पर स्विचिंग की संभावना नहीं है।

उत्तर

2

आप GtkDrawingArea उपवर्ग और set_scroll_adjustments संकेत ओवरराइड करने के लिए की जरूरत ले जाता है GtkWidget docs

इस संकेत में। आपको स्क्रॉल विंडो के लिए समायोजन मिलेगा। मैंने कुछ साल पहले कुछ कोड लिखा था, जिसे आप इसे कार्यान्वित करने के तरीके को देख सकते हैं।

MarlinSampleView code

यह कोड नाटक करने में सक्षम था कि विजेट लाखों पिक्सल चौड़ा था जब वास्तव में यह खिड़की से बड़ा नहीं था।

0

यह पता चला काफी सरल हो:

GtkScrolledWindow एक और निर्माता जो GtkAdjustments कि स्क्रॉल खिड़की का उपयोग करना चाहिए निर्धारित करने के लिए इस्तेमाल किया जा सकता है।

//These adjustments will be attached to the scrollbars. 
prvt->hAdjustment = GTK_ADJUSTMENT(gtk_adjustment_new(0, 0, 0, 0, 0, 0)); 
prvt->vAdjustment = GTK_ADJUSTMENT(gtk_adjustment_new(0, 0, 0, 0, 0, 0)); 

GtkWidget* scrolledTree = gtk_scrolled_window_new(prvt->hAdjustment, prvt->vAdjustment); 
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolledTree), drawing_area); 

अब, जब भी ड्राइंग के आकार बदलता है तो आप सिर्फ GTKAdjustments संशोधित करने के लिए परिवर्तन अनुकरण करने के लिए की जरूरत है। वास्तव में ड्राइंग क्षेत्र का आकार बदलने की कोई आवश्यकता नहीं है।

gtk_adjustment_set_lower(prvt->hAdjustment, 0); 
gtk_adjustment_set_step_increment(prvt->hAdjustment, 1); 
gtk_adjustment_set_page_increment(prvt->hAdjustment, 10); 
gtk_adjustment_set_upper(prvt->hAdjustment, picture_width); 
gtk_adjustment_set_page_size(prvt->hAdjustment, scrollArea_width); 
gtk_adjustment_changed(prvt->hAdjustment); 

ध्यान दें कि मैं अंत में gtk_adjustment_changed पर कॉल करता हूं। यह महत्वपूर्ण है, अन्यथा ScrolledWindow स्क्रॉलबार अपडेट नहीं करेगा।

value_changed Finaly GtkAdjustmens का कॉलबैक स्क्रॉल ईवेंट को पकड़ने और ड्राइंग को समायोजित करने के लिए उपयोग किया जा सकता है।

संपादित करें: यह ठीक से काम नहीं करता है क्योंकि GtkScrolledWindow रूप में अच्छी तरह स्क्रॉल घटना प्राप्त करता है और छवि :(

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