OpenGL 鼠標交互響應事件


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
表明,是離開,還是進入窗口。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM