2008-08-18 27 views

Trả lời

19

Lưu ý rằng thư viện đáng kính Nate Robin's GLUT không hỗ trợ bánh cuộn. Nhưng, sau đó triển khai của GLUT như FreeGLUT làm.

Sử dụng bánh xe cuộn trong FreeGLUT thật đơn giản. Dưới đây là cách thực hiện:

Khai báo chức năng gọi lại sẽ được gọi bất cứ khi nào cuộn cuộn được cuộn. Đây là nguyên mẫu:

void mouseWheel(int, int, int, int); 

Đăng ký callback với (miễn phí) chức năng thị trường bất động glutMouseWheelFunc().

glutMouseWheelFunc(mouseWheel); 

Xác định chức năng gọi lại. Tham số thứ hai cho biết hướng cuộn. Giá trị của +1 là tiến, -1 là lạc hậu.

void mouseWheel(int button, int dir, int x, int y) 
{ 
    if (dir > 0) 
    { 
     // Zoom in 
    } 
    else 
    { 
     // Zoom out 
    } 

    return; 
} 

Vậy đó!

+4

Nhiều phiền toái của tôi, freeGLUT dường như không thực hiện lệnh gọi glutMouseWheelFunc(). Thay vào đó mỉa mai rằng áp phích đã phàn nàn về phong cách đăng bài này, nhưng câu trả lời bạn đăng cho chính mình là không chính xác. – Rich

+15

Thêm vào đó - ngay cả khi người ta sử dụng '#include ' để mã biên dịch, glutMouseWheelFunc dường như không được gọi (như được thử nghiệm trên Ubuntu 10.04 x86_64, mà tàu freeglut 2.6.0). Giải pháp là sử dụng lệnh gọi lại 'glutMouseFunc' thông thường và kiểm tra nút' = = 3 3' để bật bánh xe, và 'nút == 4' để tắt bánh xe. –

+0

glutMouseWheelFunc callback là cửa sổ cụ thể có thể không có trong hệ thống Linux và MAC – AMCoded

32

glutMouseWheelFunc callback Freeglut là phụ thuộc phiên bản và không đáng tin cậy trong X. Sử dụng chức năng chuột tiêu chuẩn và thử nghiệm cho các nút 3 và 4.

Các thuyết minh OpenGlut vào trạng thái glutMouseWheelFunc:

Do thiếu thông tin về chuột, không thể triển khai đúng cách này trên X vào lúc này. Sử dụng chức năng này giới hạn tính di động của ứng dụng của bạn. (Tính năng này hoạt động trên X, chỉ không đáng tin cậy.) Bạn được khuyến khích sử dụng tiêu chuẩn, báo cáo nút chuột đáng tin cậy, chứ không phải là sự kiện bánh xe.

Sử dụng báo cáo thị trường bất động chuột tiêu chuẩn:

#include <GL/glut.h> 

<snip...> 

void mouse(int button, int state, int x, int y) 
{ 
    // Wheel reports as button 3(scroll up) and button 4(scroll down) 
    if ((button == 3) || (button == 4)) // It's a wheel event 
    { 
     // Each wheel event reports like a button click, GLUT_DOWN then GLUT_UP 
     if (state == GLUT_UP) return; // Disregard redundant GLUT_UP events 
     printf("Scroll %s At %d %d\n", (button == 3) ? "Up" : "Down", x, y); 
    }else{ // normal button event 
     printf("Button %s At %d %d\n", (state == GLUT_DOWN) ? "Down" : "Up", x, y); 
    } 
} 

<snip...> 

glutMouseFunc(mouse); 

Như OP đã nói, đó là "chết đơn giản". Anh ta đã sai.

+2

Thật không may bằng cách sử dụng các nút cố định là khá không đáng tin cậy vì các nút chuột tương ứng với bánh xe chuột phụ thuộc vào thiết bị bạn đã cắm vào./5 cho lên/xuống, không phải 3/4. Đối với bất kỳ chương trình có thể sử dụng nào, bạn muốn giúp người dùng dễ dàng sửa đổi điều này. –

+2

Trên máy Mac của tôi với rãnh tự do, 3/4 tương ứng với cuộn lên và xuống dọc và 5/6 tương ứng với cuộn ngang (trên bàn di chuột của tôi). –

+0

Cảm ơn bạn đời, giải pháp này hoạt động hoàn hảo trong kịch bản thử nghiệm của tôi. –

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