下面介绍如何运用实现在鼠标点击处,实现画点。(C++实现)
要将鼠标有关的数据发送给应用程序,则需要将鼠标事件注册到glutMouseFunc(myMouse)。其中myMouse(int button, int state, int x,int y);函数名可以自己制定,在回调函数glutMouseFunc()中替换成相应的函数头就好。但是其中的四个参数是不可缺少的:button:GLUT_LEFT_BUTTON,GLUT_MIDDLE_BUTTON,GLUT_RIGHT_BUTTON,分别指代鼠标左键,中间键(鼠标滚轮),右键;state:鼠标的状态GLUT_UP,GLUT_DOWN;x和y指明鼠标在窗口中的位置(x为鼠标距离窗口左边的像素数,y为鼠标距离窗口顶端的像素数,在计算是为(x,screenLength-y)。)
#include<iostream.h>
#include<math.h>
#include<windows.h>
#include<gl/glut.h>
/////////////myInit////////////////////
void myInit()
{
glClearColor(1.0,1.0,1.0,0.0);
glColor3f(0.5f,0.4f,0.9f);
glPointSize(5.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluOrtho2D(0.0,640,0.0,480);
}
///////////////////myDisplay//////////////
void myDisplay()
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POINTS);
glVertex2i(1,1);
glEnd();
glFlush();
}
/////////////myMouse///////////////////////
void myMouse(int button,int state,int x,int y)
{
if(state==GLUT_DOWN)
{
glBegin(GL_POINTS);
glVertex2i(x,480-y);
glEnd();
glFlush();
}
else if(button==GLUT_RIGHT_BUTTON)
{
glClearColor(0.8,0.6,0.7,0.0);
glClear(GL_COLOR_BUFFER_BIT);
glFlush();
}
}
/////////////////main///////////////
void main(int argc,char **argv)
{
glutInit(& argc , argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(640,480);
glutInitWindowPosition(100,150);
glutCreateWindow("sfere");
myInit();
glutDisplayFunc(myDisplay);
glutMouseFunc(myMouse);
glutMainLoop();
}
在程序中myDisplay()在测试中如果丢失则会出现,调试通过,而运行过程中出现错误的情况。因此在这里用myDisplay()画了一个点出来。本想用myDispy(int x,int y)画点,但是提示glutDisplayFunc()不接受有参数的myDisplay。因此作罢。在该函数中还可以实现,右键时将窗口的背景色指定为自己规定的颜色。