题
我想用老鼠滚轮在我的照片过剩的程序要放大和缩小的一个场景吗?我要怎么做?
解决方案 2
注意到尊敬的 内特*罗宾的过剩 图书馆不支持的滚轮.但是,后来实现的过剩喜欢 FreeGLUT 做。
使用的涡轮在FreeGLUT是死简单。这里是如何:
声明回呼功能应被称为当的滚轮滚动。这是原型:
void mouseWheel(int, int, int, int);
寄回调与(免费)过剩的功能 glutMouseWheelFunc().
glutMouseWheelFunc(mouseWheel);
定义回调功能。第二个参数提供方向的滚动。值+1是向前,-1是落后的。
void mouseWheel(int button, int dir, int x, int y)
{
if (dir > 0)
{
// Zoom in
}
else
{
// Zoom out
}
return;
}
这就是它!
其他提示
Freeglut的glutMouseWheelFunc回调版本的依赖和不可靠的X.使用鼠标准的功能和测试按钮3和4。
该OpenGlut注意到在glutMouseWheelFunc状态:
由于缺乏信息有关的鼠标,这是不可能的 实现这一正确地在X在这个时候。使用的这个功能 限制了便携性的应用程序。(这个功能的工作上 X,只是不可靠。) 你是鼓励使用标准, 可靠的鼠标按钮报告,而不是轮事件。
使用标准的过剩鼠报告:
#include <GL/glut.h>
<snip...>
void mouse(int button, int state, int x, int y)
{
// Wheel reports as button 3(scroll up) and button 4(scroll down)
if ((button == 3) || (button == 4)) // It's a wheel event
{
// Each wheel event reports like a button click, GLUT_DOWN then GLUT_UP
if (state == GLUT_UP) return; // Disregard redundant GLUT_UP events
printf("Scroll %s At %d %d\n", (button == 3) ? "Up" : "Down", x, y);
}else{ // normal button event
printf("Button %s At %d %d\n", (state == GLUT_DOWN) ? "Down" : "Up", x, y);
}
}
<snip...>
glutMouseFunc(mouse);
作为运指出,它"死简单"。他只是错误的。
观察到的情况下3和4中的关声明如下可回调
glutMouseFunc(mouseClick);
...
void mouseClick(int btn, int state, int x, int y) {
if (state == GLUT_DOWN) {
switch(btn) {
case GLUT_LEFT_BUTTON:
std::cout << "left click at: (" << x << ", " << y << ")\n";
break;
case GLUT_RIGHT_BUTTON:
std::cout << "right click at: (" << x << ", " << y << ")\n";
break;
case GLUT_MIDDLE_BUTTON:
std::cout << "middle click at: (" << x << ", " << y << ")\n";
break;
case 3: //mouse wheel scrolls
std::cout << "mouse wheel scroll up\n";
break;
case 4:
std::cout << "mouse wheel scroll down\n";
break;
default:
break;
}
}
glutPostRedisplay();
}
不隶属于 StackOverflow