2012-02-16 5 views
5

goocanvasを使って画面にグラフを表示するGTK +アプリケーションを開発しています。私はドラッグスクロールを実装するための良い方法を考え出す問題を抱えています。GTK +アプリでドラッグスクロール

現在、ユーザーがクリックした位置の座標を保存し、「モーション通知」信号コールバックでgoo_canvas_scroll_to()を新しい位置に保存します。問題は、描画がやや遅く、各ピクセルをマウスで動かすと、コールバックが1回呼び出されるということです。これにより、グラフをドラッグしたときに描画が遅れます。

ドラッグスクロールを行う良い方法があるので、より滑らかに見え、再描画の一部をスキップできますか?

答えて

4

ユーザーがマウスボタンを押したときに5msタイマーを開始することで、このようなことが一度起こることがありました。タイマーでは、マウスがどこにあるかを確認し、スクロールする方法を決定します。結果は非常にスムーズなスクロールで、少なくとも私が覚えていることです。ここでの根性、その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

タイマーコールバックで行うのは良い考えです。これはまさに私が必要なものです、ありがとう! –

関連する問題