在GTK +应用程序中拖动滚动

Mar*_*nen 5 gtk scroll drag

我正在开发一个GTK +应用程序,它使用goocanvas在屏幕上显示图形.我遇到了一些实现拖动滚动的好方法.

目前,应用程序保存用户点击的坐标,然后在"动作通知"信号回调中,将goo_canvas_scroll_to()保存到新位置.问题是绘图有点慢,并且鼠标移动每个像素,我会调用一次回调.这使得在拖动图形时绘图滞后.

是否有一种很好的方法来拖动滚动,所以它看起来更流畅,我可以跳过一些重绘?

erg*_*sys 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; 
}
Run Code Online (Sandbox Code Playgroud)

滚动函数仅通过参数调整适当的调整对象。