• 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
    表明,是离开,还是进入窗口。
  • 相关阅读:
    HDU5597/BestCoder Round #66 (div.2) GTW likes function 打表欧拉函数
    HDU5596/BestCoder Round #66 (div.2) 二分BIT/贪心
    HDU 5596/BestCoder Round #66 (div.2) GTW likes math 签到
    BZOJ 1877: [SDOI2009]晨跑 费用流
    BZOJ 1452: [JSOI2009]Count 二维树状数组
    BZOJ 1143 1143: [CTSC2008]祭祀river 最长反链
    Codeforces Round #335 (Div. 2) D. Lazy Student 贪心
    Codeforces Round #335 (Div. 2) C. Sorting Railway Cars 连续LIS
    Codeforces Round #335 (Div. 2) A. Magic Spheres 模拟
    UVALive 6187 Never Wait for Weights 带权并查集
  • 原文地址:https://www.cnblogs.com/zhuchengyang/p/7723721.html
Copyright © 2020-2023  润新知