鼠标离开GLFWwindow后触发GLFW鼠标回调?

Posted

技术标签:

【中文标题】鼠标离开GLFWwindow后触发GLFW鼠标回调?【英文标题】:GLFW mouse callback fired after mouse leave GLFWwindow? 【发布时间】:2017-07-23 13:20:49 【问题描述】:

由于某种原因,即使在鼠标离开窗口后,我的Window::callback 也会被调用。我找不到解决方案,甚至找不到可以提供帮助的东西。 GLFW 是否有可能更新了鼠标光标回调的操作方式?不知道是不是调用顺序问题?

窗口

Window::Window(std::string title, int32_t width, int32_t height) 
    // TODO: add support for monitor and share for GLFW
    m_window = std::unique_ptr<GLFWwindow, GLFWdeleter>(glfwCreateWindow(width, height, title.c_str(), nullptr, nullptr));
    glfwMakeContextCurrent(m_window.get());
    glfwSetWindowUserPointer(m_window.get(), this);
    glfwSetCursorPosCallback(m_window.get(), Window::callback);


void Window::mouse_callback(double xpos, double ypos) 
    std::cout << "x: " << xpos << " y: " << ypos << std::endl;


void Window::callback(GLFWwindow* window, double xpos, double ypos)

    auto win = static_cast<Window*>(glfwGetWindowUserPointer(window));
    win->mouse_callback(xpos, ypos);

引擎

void startup() const

    if (glfwInit() == 0)
    
        LOG(kError, "GLFW init failed!");
        exit(-1);
    


void Engine::run() 
    if (m_main_window_registered)
    
        glewExperimental = static_cast<GLboolean>(true);
        if (glewInit() != GLEW_OK)
        
            std::cout << "Failed to initialize glew" << std::endl;
            return;
        
    

    while(glfwWindowShouldClose(m_main_window->window()) == 0) 
       glClear(GL_COLOR_BUFFER_BIT);
       glfwSwapBuffers(m_main_window->window());
       glfwPollEvents();
    

main.cpp

int main()

    g_engine.startup();

    glfwWindowHint(GLFW_SAMPLES, 4);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

    auto window = std::make_unique<Window>("Hello World!", 640, 480);
    //window->make_current();
    g_engine.registerWindow(std::move(window));
    g_engine.run();

    glfwTerminate();
    return 0;

【问题讨论】:

@Rabbid76 我添加了所需的材料来推断可能是什么问题。 【参考方案1】:

我已经弄清楚了问题(或更好的说法)问题是什么。在 Windows 上,回调按预期执行,一旦鼠标离开窗口区域,回调就会停止触发。对于 OSX,窗口永远不会失去焦点,因此始终会调用光标回调。要解决此问题,您只需测试坐标以确保鼠标实际上位于窗口内。

【讨论】:

以上是关于鼠标离开GLFWwindow后触发GLFW鼠标回调?的主要内容,如果未能解决你的问题,请参考以下文章

鼠标点击触发鼠标离开

glfw 输入回调以使用成员函数修改对象

鼠标事件

jquery

jquery事件

jQuery事件