2012-02-16 32 views
5

में स्क्रॉलिंग खींचें मैं एक जीटीके + एप्लिकेशन पर काम कर रहा हूं जो स्क्रीन पर ग्राफ प्रदर्शित करने के लिए goocanvas का उपयोग करता है। मुझे ड्रैग स्क्रॉलिंग को लागू करने के लिए एक अच्छे तरीके से आने वाली समस्याएं आ रही हैं।एक जीटीके + एप

वर्तमान में ऐप उन निर्देशांक को सहेजता है जहां उपयोगकर्ता ने क्लिक किया था और फिर "गति-सूचना" सिग्नल कॉलबैक में, goo_canvas_scroll_to() को नई स्थिति में करता है। समस्या यह है कि ड्राइंग कुछ हद तक धीमी है, और प्रत्येक पिक्सेल माउस द्वारा स्थानांतरित होने के साथ, मुझे कॉलबैक एक बार बुलाया जाता है। ग्राफ़ को खींचते समय यह ड्राइंग पीछे पीछे आता है।

ड्रैग स्क्रॉलिंग करने का कोई अच्छा तरीका है, तो यह अधिक चिकनी दिखाई देगा और मैं कुछ रेड्रा को छोड़ सकता हूं?

उत्तर

4

उपयोगकर्ता 5 बटन टाइमर शुरू करके एक बार ऐसा करने में सक्षम था जब उपयोगकर्ता माउस बटन दबाता था। टाइमर में मैं जांचता हूं कि माउस कहां है और स्क्रॉल करने का तरीका तय करें, जिसमें किनारे के करीब तेज़ी से स्क्रॉलिंग शामिल है। नतीजा बहुत चिकनी स्क्रॉलिंग था, कम से कम यही मुझे याद है। यहाँ यह की हिम्मत, अपने gtkmm/C++, लेकिन आप इसे का सार प्राप्त करने के लिए सक्षम होना चाहिए:

static const int HOT_AREA = 24; 

// convert distance into scroll size. The larger the 
// value, the faster the scrolling. 
static int accel_fn(int dist) { 
    if (dist > HOT_AREA) 
     dist = HOT_AREA; 
    int dif = dist/(HOT_AREA/4); 
    if (dif <= 0) dif = 1; 
    return dif; 
} 


bool scrollerAddin::on_timeout() { 
    int ptr_x, ptr_y; 
    o_scroller->get_pointer(ptr_x, ptr_y); 

    int vp_width = o_scroller->get_width(); 
    int vp_height = o_scroller->get_height(); 

    if (o_scroller->get_hscrollbar_visible()) 
     vp_height -= o_scroller->get_hscrollbar()->get_height(); 
    if (o_scroller->get_vscrollbar_visible()) 
     vp_width -= o_scroller->get_vscrollbar()->get_width(); 

    if (ptr_x < HOT_AREA) 
     scroll_left(accel_fn(HOT_AREA-ptr_x)); 
    else if (ptr_x > vp_width - HOT_AREA) 
     scroll_right(accel_fn(ptr_x - (vp_width - HOT_AREA))); 
    if (ptr_y < HOT_AREA) 
     scroll_up(accel_fn(HOT_AREA - ptr_y)); 
    else if (ptr_y > vp_height - HOT_AREA) 
     scroll_down(accel_fn(ptr_y - (vp_height - HOT_AREA))); 

    return true; 
} 

स्क्रॉल कार्यों केवल तर्क से उचित समायोजन वस्तु समायोजित करें।

+0

टाइमर कॉलबैक में इसे करना एक अच्छा विचार है। यह वही है जो मुझे चाहिए, धन्यवाद! –