当前位置: 首页 > news >正文

Imgui处理glfw的鼠标键盘的方法

在Imgui初始化时,会重新接手glfw的键盘鼠标事件。也就是遇到glfw的键盘鼠标事件时,imgui先会运行自己的处理过程,然后再去处理用户自己注册的glfw的键盘鼠标事件。

看imgui_impl_glfw.cpp源码的安装回调函数部分代码


void ImGui_ImplGlfw_InstallCallbacks(GLFWwindow* window)
{
    ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData();
    IM_ASSERT(bd->InstalledCallbacks == false && "Callbacks already installed!");
    IM_ASSERT(bd->Window == window);

    bd->PrevUserCallbackWindowFocus = glfwSetWindowFocusCallback(window, ImGui_ImplGlfw_WindowFocusCallback);
    bd->PrevUserCallbackCursorEnter = glfwSetCursorEnterCallback(window, ImGui_ImplGlfw_CursorEnterCallback);
    bd->PrevUserCallbackCursorPos = glfwSetCursorPosCallback(window, ImGui_ImplGlfw_CursorPosCallback);
    bd->PrevUserCallbackMousebutton = glfwSetMouseButtonCallback(window, ImGui_ImplGlfw_MouseButtonCallback);
    bd->PrevUserCallbackScroll = glfwSetScrollCallback(window, ImGui_ImplGlfw_ScrollCallback);
    bd->PrevUserCallbackKey = glfwSetKeyCallback(window, ImGui_ImplGlfw_KeyCallback);
    bd->PrevUserCallbackChar = glfwSetCharCallback(window, ImGui_ImplGlfw_CharCallback);
    bd->PrevUserCallbackMonitor = glfwSetMonitorCallback(ImGui_ImplGlfw_MonitorCallback);
    bd->InstalledCallbacks = true;
}

看到了吗,Imgui会用一个类似PrevUserCallbackMousebutton这样的函数记录glfwSetMouseButtonCallback之前绑定的函数
glfwSetMouseButtonCallback会返回之前已经绑定的函数。

(从这个意义上说,在Imgui初始化之前,就需要先绑定用户自己的鼠标键盘事件函数)

然后再看Imgui接手的函数

void ImGui_ImplGlfw_MouseButtonCallback(GLFWwindow* window, int button, int action, int mods)
{
    ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData();
    if (bd->PrevUserCallbackMousebutton != nullptr && ImGui_ImplGlfw_ShouldChainCallback(window))
        bd->PrevUserCallbackMousebutton(window, button, action, mods);

    ImGui_ImplGlfw_UpdateKeyModifiers(window);

    ImGuiIO& io = ImGui::GetIO();
    if (button >= 0 && button < ImGuiMouseButton_COUNT)
        io.AddMouseButtonEvent(button, action == GLFW_PRESS);
}

看到了吗,当发生鼠标键盘事件时,会先调用用户之前注册的事件处理方法,然后再是Imgui自己的处理方法。

因此在写自己的键盘鼠标事件函数时,不需要考虑去调用Imgui的事件处理函数, 只需要专心写自己的函数即可。
当用户在于Imgui交互时,因为也会触发自己的键盘鼠标事件,这个时候可以在自己的事件处理函数中忽略这个交互

    ImGuiIO& io = ImGui::GetIO();
    
    if (io.WantCaptureMouse) return; 

	/* 
	*  后面是自己的事件处理过程
	*/

相关文章:

  • stable diffusion webui 更改为python3.11版本运行Windows11
  • 【C++】右值引用与完美转发
  • 软件工程面试题(十)
  • 妙用《甄嬛传》中的选妃来记忆概率论中的乘法公式
  • 交换技术综合实验
  • 第四章.4.3.1ESP32传感器数据采集与滤波处理实战教程
  • 从0开始——在PlatformIO下开展STM32单片机的HAL库函数编程指南
  • ​​​​​​​​​​​​​​Spring Boot数据库连接池
  • Vue学习笔记集--computed
  • 蓝桥杯-特殊的多边形(dfs/前缀和)
  • 指针和引用
  • 业务流程先导及流程图回顾
  • YOLO基础知识
  • 【C语言文件精选题】
  • 《网络管理》实践环节01:OpenEuler22.03sp4安装zabbix6.2
  • 验证Linux多进程时间片切换的程序
  • PyTorch 张量的new_tensor方法介绍
  • 算法基础——树
  • RAG基建之PDF解析的“流水线”魔法之旅
  • 网络安全-网络安全基础
  • 南京106亿元成交19宗涉宅地块:建邺区地块楼面单价重回4.5万元
  • 媒体:酒店、民宿临时毁约涨价,怎么管?
  • 抗美援朝老战士宁昭逝世,享年93岁
  • 百年传承,再启新程,参天中国迎来2.0时代
  • 为治理商家“卷款跑路”“退卡难”,预付式消费司法解释5月起实施
  • 中国海油总裁:低油价短期影响利润,但也催生资产并购机会