GLFW 的事件机制基于回调函数(Callback Functions)事件轮询(Event Polling) 实现,其核心设计围绕“事件驱动”模型。

核心机制

回调函数 Callbacks

GLFW 允许用户注册自定义函数(回调函数),当特定事件发生时(如键盘输入、鼠标点击、窗口大小变化等),GLFW 会自动调用这些函数
示例:设置键盘回调

C
void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) {
	if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
		glfwSetWindowShouldClose(window, GLFW_TRUE); // 按 ESC 关闭窗口
}
// 注册回调
glfwSetKeyCallback(window, key_callback);
点击展开查看更多

事件队列与轮询

C
while (!glfwWindowShouldClose(window)) {
	glfwPollEvents();    // 处理事件(触发回调)
	renderGraphics();    // 渲染逻辑
	glfwSwapBuffers(window);
}
点击展开查看更多

状态查询 State Queries

除回调外,GLFW 提供即时状态查询函数(如 glfwGetKey()),可在主循环中直接检测输入状态:

C
if (glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS) {
	// 空格键被按下
}
点击展开查看更多

主要事件类型与回调

事件类型 回调函数 说明
键盘按键 glfwSetKeyCallback() 处理键按下/释放/重复
鼠标移动 glfwSetCursorPosCallback() 光标位置变化
鼠标按钮 glfwSetMouseButtonCallback() 鼠标按键按下/释放
鼠标滚轮 glfwSetScrollCallback() 滚轮滚动
窗口大小改变 glfwSetWindowSizeCallback() 窗口尺寸变化
窗口关闭请求 glfwSetWindowCloseCallback() 点击关闭按钮时触发
文件拖拽到窗口 glfwSetDropCallback() 获取拖拽文件路径
显示器连接/断开 glfwSetMonitorCallback() 外接显示器变化
游戏手柄连接 glfwSetJoystickCallback() 手柄接入/断开

特点

  1. 线程安全性
    回调函数在调用 glfwPollEvents() 的线程中执行(通常是主线程),需避免在回调中调用非线程安全的 GL 函数。

  2. 多窗口支持
    每个 GLFWwindow 对象可独立设置回调函数,互不影响。

  3. 事件屏蔽
    可通过 glfwSetInputMode() 禁用事件(如隐藏光标、锁定按键重复):

    C
    glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED); // 隐藏鼠标光标
    
    点击展开查看更多

版权声明

作者: Chaim

链接: https://chaim.eu.org/posts/%E4%BA%8B%E4%BB%B6%E6%9C%BA%E5%88%B6/

许可证: CC BY-NC-SA 4.0

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. Please attribute the source, use non-commercially, and maintain the same license.

开始搜索

输入关键词搜索文章内容

↑↓
ESC
⌘K 快捷键