2012-02-16 14 views
5

Ekranda bir grafik görüntülemek için goocanvas kullanan bir GTK + uygulamasında çalışıyorum. Sürükle kaydırmayı uygulamak için iyi bir yol bulmakta zorlanıyorum.Bir GTK + uygulamasında kaydırma sürükleme

Şu anda uygulama, kullanıcının tıkladığı koordinatları kaydeder ve daha sonra bir "hareket bildirimi" sinyal geri çağırmasında, yeni konuma goo_canvas_scroll_to() yapar. Sorun, çizimin biraz yavaş olması ve fareyle hareket ettirilen her bir pikselde, geri çağrının bir kez çağrılmasını sağlamasıdır. Bu, grafiği sürüklerken çizimin geri kalmasını sağlar.

Sürükle kaydırmayı yapmanın iyi bir yolu var mı, bu yüzden daha düzgün görünebilir ve bazı yeniden çizimleri atlayabilirim?

cevap

4

Kullanıcı, fare düğmesine bastığında 5ms'lik bir zamanlayıcı başlatarak, bu şekilde çalışan bir şey elde edebildim. Zamanlayıcıda, farenin nerede olduğunu kontrol edip kenarda ne kadar yakın olursanız olun, kaydırmanın hangi yolu olduğuna karar verdim. Sonuç çok düzgün kaydırma, en azından hatırladığım şey. İşte bunun bağırsaklar, onun gtkmm/C++, ama bunu özünü anlamak gerekir:

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

kaydırma fonksiyonları sadece argüman tarafından uygun Ayarlama nesnesi ayarlayın.

+0

Zamanlayıcıda geri çağırma yapmak iyi bir fikirdir. Bu tam olarak ihtiyacım olan şey, teşekkürler! –