2012-02-16 28 views
5

Tôi đang làm việc trên ứng dụng GTK + sử dụng goocanvas để hiển thị biểu đồ trên màn hình. Tôi đang gặp vấn đề với một cách tốt để triển khai kéo cuộn.Kéo cuộn trong ứng dụng GTK +

Hiện tại ứng dụng lưu tọa độ mà người dùng đã nhấp vào và sau đó trong cuộc gọi lại "chuyển động thông báo" chuyển động, hãy goo_canvas_scroll_to() đến vị trí mới. Vấn đề là bản vẽ hơi chậm, và với mỗi điểm ảnh được di chuyển bằng chuột, tôi nhận được cuộc gọi lại được gọi một lần. Điều này làm cho bản vẽ tụt lại phía sau khi kéo biểu đồ xung quanh.

Có cách nào tốt để thực hiện thao tác kéo cuộn, vì vậy nó sẽ xuất hiện mượt mà hơn và tôi có thể bỏ qua một số lần vẽ lại?

Trả lời

4

Tôi đã có thể nhận được một cái gì đó như thế này làm việc một lần bằng cách bắt đầu một bộ đếm thời gian 5ms khi người dùng nhấn nút chuột. Trong bộ đếm thời gian, tôi kiểm tra vị trí của con chuột và quyết định cách di chuyển, bao gồm cả việc di chuyển nhanh hơn đến gần bạn hơn. Kết quả là cuộn rất mượt mà, ít nhất đó là những gì tôi nhớ. Đây ruột của nó, gtkmm của nó/C++, nhưng bạn sẽ có thể để có được những ý chính của nó:

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

Các chức năng cuộn chỉ điều chỉnh đối tượng điều chỉnh thích hợp bởi các cuộc tranh cãi.

+0

Thực hiện việc gọi lại trong bộ hẹn giờ là một ý tưởng hay. Đây chính xác là những gì tôi cần, cảm ơn! –

Các vấn đề liên quan