2012-02-16 13 views
5

Sto lavorando a un'applicazione GTK + che utilizza goocanvas per visualizzare un grafico sullo schermo. Sto avendo problemi con un buon metodo per implementare lo scorrimento del trascinamento.Trascinare lo scorrimento in un'app GTK +

Attualmente l'applicazione memorizza le coordinate in cui l'utente ha fatto clic e poi in un "motion-comunicare" callback segnale, fa goo_canvas_scroll_to() per la nuova posizione. Il problema è che il disegno è un po 'lento, e con ogni pixel spostato dal mouse, ottengo il callback richiamato una volta. Ciò rende il disegno in ritardo quando si trascina il grafico.

C'è un buon modo per fare lo scorrimento del trascinamento, quindi apparirebbe più scorrevole e potrei saltare alcuni dei ridisegni?

risposta

4

Sono riuscito a ottenere qualcosa di simile lavorando una volta avviando un timer da 5 ms quando l'utente preme il pulsante del mouse. Nel timer cerco dove si trova il mouse e decido in che modo scorrere, incluso lo scorrimento più veloce man mano che ci si avvicina al bordo. Il risultato è stato uno scrolling molto fluido, almeno questo è quello che ricordo. Qui il coraggio di esso, il suo gtkmm/C++, ma si dovrebbe essere in grado di ottenere l'essenza di esso:

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; 
} 

Le funzioni di scorrimento semplicemente regolare l'oggetto di regolazione appropriata dall'argomento.

+0

Effettuare il richiamo del timer è una buona idea. Questo è esattamente ciò di cui avevo bisogno, grazie! –

Problemi correlati