OpenGL 鼠標、鍵盤交互響應事件
先來一個樣例:
uses gl,glu,glut; procedure InitEnvironment;cdecl; begin glClearColor(0.6,0.6,0.6,0);//設置清屏顏色灰色 glClear(GL_COLOR_BUFFER_BIT); glPointSize(6);/設置點的大小 glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluOrtho2D(0,400,0,400); end; procedure mydisplay;cdecl; begin glClear(GL_COLOR_BUFFER_BIT); glFlush(); end; procedure OnMouse(button,state,x,y:longint);cdecl; begin if (button=GLUT_LEFT_BUTTON)and(state=GLUT_DOWN)then//如果鼠標左鍵按下 begin glColor3f(1,0,0);//紅色 glBegin(GL_POINTS); glVertex2f(x,400-y);//畫點 glEnd(); glFlush(); end; if (button=GLUT_MIDDLE_BUTTON)and(state=GLUT_DOWN)then//如果鼠標滾輪按下 begin glColor3f(0,1,0);//原諒色 glBegin(GL_POINTS); glVertex2f(x,400-y);//畫點 glEnd(); glFlush(); end; if (button=GLUT_RIGHT_BUTTON)and(state=GLUT_DOWN)then//如果鼠標右鍵按下 begin glColor3f(0,0,1);//藍色 glBegin(GL_POINTS); glVertex2f(x,400-y);//畫點 glEnd(); glFlush(); end; end; begin glutInit(@argc,argv); glutInitDisplayMode(GLUT_RGB or GLUT_SINGLE); glutInitWindowPosition(500,200); glutInitWindowSize(400,400);//設置窗口大小 glutCreateWindow('OpenGL');//建立窗口 InitEnvironment(); glutMouseFunc(@OnMouse);//鼠標鍵盤事件注冊 glutDisplayFunc(@myDisplay);//調用主過程 glutMainLoop(); end.
從上面可以看到到,處理鼠標OnMouse事件的函數,一定有4個參數。第一個參數表明哪個鼠標鍵被按下或松開,這個變量可以是下面的三個值中的一個:
GLUT_LEFT_BUTTON
GLUT_MIDDLE_BUTTON
GLUT_RIGHT_BUTTON
第二個參數表明,函數被調用發生時,鼠標的狀態,也就是是被按下,或松開,可能取值如下:
GLUT_DOWN
GLUT_UP
當函數被調用時,state的值是GLUT_DOWN,那么程序可能會假定將會有個GLUT_UP事件,甚至鼠標移動到窗口外面,也如此。然而,如果程序調用glutMouseFunc傳遞NULL作為參數,那么GLUT將不會改變鼠標的狀態。
剩下的兩個參數(x,y)提供了鼠標當前的窗口坐標(以左上角為原點)。
檢測動作(
motion
)
GLUT提供鼠標motion檢測能力。有兩種GLUT處理的motion:active motion和passive motion。Active motion是指鼠標移動並且有一個鼠標鍵被按下。Passive motion是指當鼠標移動時,並有沒鼠標鍵按下。如果一個程序正在追蹤鼠標,那么鼠標移動期間,沒一幀將產生一個結果。
和以前一樣,你必須注冊將處理鼠標事件的函數(定義函數)。GLUT讓我們可以指定兩個不同的函數,一個追蹤passive motion,另一個追蹤active motion
它們的函數原型,如下:
procedure glutMotionFunc(void(*func)(x,y:longint));
procedure glutPassiveMotionFunc(void (*func)(x,y:longint));
參數:
Func:處理各自類型motion的函數名。
處理motion的參數函數的參數(x,y)是鼠標在窗口的坐標。以左上角為原點。
檢測鼠標進入或離開窗口
GLUT還能檢測鼠標鼠標離開,進入窗口區域。一個回調函數可以被定義去處理這兩個事件。GLUT里,調用這個函數的是glutEntryFunc,函數原型如下:
procedure glutEntryFunc(void(*func)(int state));
參數:
Func:處理這些事件的函數名。
上面函數的參數中,state有兩個值:
GLUT_LEFT
GLUT_ENTERED
表明,是離開,還是進入窗口。
