使用GLFW捕捉鼠标拖动?[C++]
Using GLFW to capture mouse dragging? [C++]
所以我试图在OpenGL应用程序中捕捉鼠标拖动。到目前为止,我已经完成了以下工作:
glfwSetMouseButtonCallback(window, mouse_callback);
static void mouse_callback(GLFWwindow* window, int button, int action, int mods)
{
if (button == GLFW_MOUSE_BUTTON_LEFT) {
double x;
double y;
glfwGetCursorPos(window, &x, &y);
if (previous_y_position - y > 0)
{
camera_translation.y -= 1.0f;
previous_y_position = y;
}
else
{
camera_translation.y += 1.0f;
previous_y_position = y;
}
}
}
但问题是,如果我想放大,我需要向上移动鼠标,然后重复单击。出于某种原因,如果我按下鼠标左键并向上拖动,它不会起任何作用。
在cursor_pos_callback中,只需确认按钮是否按下,即可工作。
void mouse_cursor_callback( GLFWwindow * window, double xpos, double ypos)
{
if (glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_LEFT) == GLFW_RELEASE)
{
return;
}
// `write your drag code here`
}
mouse_callback
是无状态的。它接收事件,瞬间的"动作"。你需要让你的程序"记住"按下了鼠标按钮。这样,当在第1帧中按下按钮时,您可以在之后和释放鼠标按钮之前的所有帧中参考此信息。
简单的方法是在新闻发布时翻转布尔标志:
static void mouse_callback(GLFWwindow* window, int button, int action, int mods)
{
if (button == GLFW_MOUSE_BUTTON_LEFT) {
if(GLFW_PRESS == action)
lbutton_down = true;
else if(GLFW_RELEASE == action)
lbutton_down = false;
}
if(lbutton_down) {
// do your drag here
}
}
示意图:
state released pressed released
timeline -------------|------------------------------|---------------
^ ^
mouse_callback calls GLFW_PRESS GLFW_RELEASE
最困难的方法是使用状态机(尤其是当您需要更复杂的输入控制器状态组合时)。
相关文章:
- QGraphicsPolygonItem在拖动时未更新QPolygonF坐标
- 如何在鼠标挂钩过程中检测拖动
- 如何通过拖动鼠标QT检查按钮?鼠标移动事件
- 如何防止特定的QTreeView分支被拖动?
- 通过拖动边框调整大小时不显示SDL_WINDOWEVENT_SIZE_CHANGED?
- 在 qt 中的绘图中拖动误差线
- 非拖动功能模板参数包的合法使用
- QML在被Mousearea拖动时无法更改项目位置
- 在OpenGL中,如何将鼠标跟随更改为鼠标单击,拖动并移动释放?
- 如何在 Win32 应用中拖动纯色矩形,而不会产生白色闪烁,也不会干扰其他屏幕对象
- 图形项目的QgraphicsScene中的可拖动像素
- Qt - 防止在拖动标题栏时调整窗口大小
- 在内部使用ComboBox拖动ListWidget项目
- 使用C 绘制矩形拖动
- 在 QGraphicsScene 中拖动 QPixmap:如何避免 lambda 参数中不允许'auto'
- 如何在QT中拖动未装饰的窗口
- 有没有办法在Qt中以编程方式中断鼠标拖动
- Qt - 拖动移动 q图形项不能很好地工作
- 使用C 中的WXWIDGET使用可拖动矩形从图像中选择区域
- 如何跟踪拖动/下降操作的寿命