2008-08-18 232 views

回答

19

請注意,古老的Nate Robin's GLUT庫不支持滾輪。但是,稍後GLUT的實現像FreeGLUT那樣。

在FreeGLUT中使用滾輪非常簡單。方法如下:

聲明一個回調函數,當滾動滾輪時應該調用該函數。這是原型:

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

與(免費)轉運蛋白功能glutMouseWheelFunc()註冊回調。

glutMouseWheelFunc(mouseWheel); 

定義回調函數。第二個參數給出了滾動的方向。 +1的值是前向的,-1是向後的。

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

    return; 
} 

就是這樣!

+4

對我來說很煩,freeGLUT似乎沒有實現glutMouseWheelFunc()回調。相當具有諷刺意味的是,海報抱怨這種發帖方式,但你爲自己發佈的答案是不正確的。 – Rich 2009-01-12 20:57:05

+15

除此之外 - 即使使用`#include `來編譯代碼,glutMouseWheelFunc似乎也不會被調用(就像在Ubuntu 10.04 x86_64上發佈的,它發佈了freeglut 2.6.0)。 解決方法是使用常規的`glutMouseFunc`回調並檢查`按鈕== 3`是否在輪子上,`按鈕== 4'是否輪子不亮。 – 2010-07-14 21:13:09

32

Freeglut的glutMouseWheelFunc回調取決於版本,並在十用標準鼠標功能不可靠,測試按鈕3和4

上glutMouseWheelFunc狀態OpenGlut註釋:

由於缺乏信息關於鼠標,此時不可能在X上正確地實現此操作。使用此功能 限制了您的應用程序的可移植性。 (此功能在 X上工作,只是不可靠。)鼓勵您使用標準的可靠鼠標按鈕報告,而不是輪式事件。

使用標準GLUT鼠標報告:

#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); 

如前所述的OP,它是 「死簡單」。他錯了。