一、实验目的
1.掌握OpenGL的鼠标按钮响应函数。
2.掌握OpenGL的鼠标移动响应函数。
3.进一步巩固OpenGL的基本图元绘制基础。
二、实验内容
1.鼠标画草图——实现鼠标点到哪,线就画到哪。
思路:
1)在主程序注册鼠标响应和鼠标移动子函数:
glutMouseFunc(mymouse);
glutMotionFunc(mymotion);
放在display注册之后和mainloop之前。
- 在程序头部声明鼠标响应和鼠标移动子函数:
- void myMouse(int button,int state,int x,int y);
- void myMotion(int x,int y);
- 3)构造鼠标响应子函数:
- // 鼠标按钮响应事件
- void myMouse(int button,int state,int x,int y)
- {
//鼠标左键按下——确定起始点
//鼠标左键松开——画最后一个顶点,画线结束
}
4)构造鼠标移动子函数:
//鼠标移动时获得鼠标移动中的坐标
void myMotion(int x,int y)
{
//鼠标移动——线画到哪
}
5)修改显示函数Display():
//画直线程序框架
#include "stdafx.h"
#include <glut.h>
int ww,hh; //显示窗口宽和高
void Myinit(vold);
void Reshape (int w, int h);
void Display(void);
int APIENTRY tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED PARAMETER (hPrevInstance) ;
UNREFERENCED_PARAMETER(1pCmdLine) ;
char *argvl] = ("hello ".
int argc = 2; // argv 中的字符串数
glutInit(6argc, argv) ; // 初始化 GLUT 库
glutInitWindowSize(800, 600) ; // 设置显示窗口大小
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); // 设置显示模式 (注意双缓存)glutCreateWindow(”鼠标画线小程序演示"); // 创建显示窗口
Myinit();
glutDisplayFunc(Display); // 注册显示回调函数
glutReshapeFunc(Reshape); //注册窗口改变回调函数
glutMainLoop(); //进入事件处理循环
return 0;
}
void Myinit(void)
{
glClearColor(0.0,0.0,0.0,0.0);
glLineWidth(3.0);
}
// 渲染绘制子程序
void Display(void)
{
glClear(GL_COLOR_BUFFER_BIT); // 刷新颜色缓存区
g1Begin(GL_LINES);
glVertex2f(0,0);
glVertex2f(ww,hh);
glEnd();
glutSwapBuffers(); // 双缓存的刷新模式
}
void Reshape(int w, int h) // 窗口改变时自动获取显示窗口的宽w和高 h
{
glMatrixMode (GL_PROJECTION) ; // 投影矩阵模式
qlLoadIdentity(); // 矩阵堆栈清空
glViewport(0, 0, w, h); // 设置视区大小
g1uOrtho2D(0, w, 0, h); // 设置裁剪窗口大小
ww=W;
hh=h;
}
}
- 鼠标画线。阅读OpenGL鼠标画线程序,能够实现在绘制窗口用鼠标交互绘制若干条直线,鼠标左键首先按下确定直线的起始点,鼠标左键按下同时移动,看到画线过程,鼠标左键松开时确定直线的终点,可重复画多条直线。
- 思路:
- 1)写出画静止若干条直线程序框架,坐标用变量替代。
- 2)在主函数里注册鼠标按钮响应函数和鼠标移动响应函数。
- 3)在鼠标按钮响应子函数里给出鼠标按钮响应事件。
- 4)在鼠标移动响应子函数里给出鼠标移动响应事件。
- 5)读懂程序并分析程序,保留程序。