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; /* *  后面是自己的事件处理过程*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/73823.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LVS】负载均衡群集部署(DR模式)

部署前IP分配 DR服务器&#xff1a;192.168.166.101 vip&#xff1a;192.168.166.100 Web服务器1&#xff1a;192.168.166.104 vip&#xff1a;192.168.166.100 Web服务器2&#xff1a;192.168.166.107 vip&#xff1a;192.168.166.100 NFS服务器&#xff1a;192.168.166.108 …

C++Primer学习(14.1 基本概念)

当运算符作用于类类型的运算对象时&#xff0c;可以通过运算符重载重新定义该运算符的含义。明智地使用运算符重载能令我们的程序更易于编写和阅读。举个例子&#xff0c;因为在Sales_item类中定义了输入、输出和加法运算符&#xff0c;所以可以通过下述形式输出两个Sales_item…

计算机视觉准备八股中

一边记录一边看&#xff0c;这段实习跑路之前运行完3DGAN&#xff0c;弄完润了&#xff0c;现在开始记忆八股 1.CLIP模型的主要创新点&#xff1a; 图像和文本两种不同模态数据之间的深度融合、对比学习、自监督学习 2.等效步长是每一步操作步长的乘积 3.卷积层计算输入输出…

基于大语言模型的智能音乐创作系统——从推荐到生成

一、引言&#xff1a;当AI成为音乐创作伙伴 2023年&#xff0c;一款由大语言模型&#xff08;LLM&#xff09;生成的钢琴曲《量子交响曲》在Spotify冲上热搜&#xff0c;引发音乐界震动。传统音乐创作需要数年专业训练&#xff0c;而现代AI技术正在打破这一壁垒。本文提出一种…

Mysql---锁篇

1&#xff1a;MySQL 有哪些锁&#xff1f; 全局锁 flush tables with read lock 整个数据库就处于只读状态了 unlock tables 释放全局锁 全局锁主要应用于做全库逻辑备份&#xff0c;这样在备份数据库期间&#xff0c;不会因为数据或表结构的更新&#xff0c;而出现备份文件的数…

VLAN综合实验二

一.实验拓扑&#xff1a; 二.实验需求&#xff1a; 1.内网Ip地址使用172.16.0.0/分配 2.sw1和SW2之间互为备份 3.VRRP/STP/VLAN/Eth-trunk均使用 4.所有Pc均通过DHCP获取IP地址 5.ISP只能配置IP地址 6.所有…

GEO(生成引擎优化)实施策略全解析:从用户意图到效果追踪

——基于行业实证的AI信源占位方法论 ​一、理解用户查询&#xff1a;构建AI语料的核心起点 生成式AI的内容推荐逻辑以用户意图为核心&#xff0c;​精准捕捉高频问题是GEO优化的第一步。企业需通过以下方法挖掘用户真实需求&#xff1a; ​AI对话日志分析&#xff1a; 分析用…

HTML基础及进阶

目录 一、HTML基础 1.什么是HTML 2.常用标签 &#xff08;1&#xff09;标题标签&#xff1a;h1-h6数字越小文字会越大&#xff0c;这个标签会占一整行 &#xff08;2&#xff09;加粗标签&#xff1a; &#xff08;3&#xff09;换行标签&#xff1a; &#xff08;4&am…

MSTP与链路聚合技术

MSTP&#xff08;多生成树协议&#xff09; 简介 MSTP&#xff08;多生成树协议&#xff09;是Spanning Tree Protocol&#xff08;STP&#xff09;的改进版&#xff0c;支持网络中使用多条生成树&#xff0c;并根据用户需求限制生成树间的路径。MSTP将多个VLAN映射到一棵生成…

ModuleNotFoundError: No module named ‘ml_logger.logbook‘

问题 (legion) zhouy24RL-DSlab:~/zhouy24Files/legion/LEGION$ python main.py ML_LOGGER_USER is not set. This is required for online usage. Traceback (most recent call last): File “main.py”, line 7, in from mtrl.app.run import run File “/data/zhouy24File…

c# ftp上传下载 帮助类

工作中FTP的上传和下载还是很常用的。如下载打标数据,上传打标结果等。 这个类常用方法都有了:上传,下载,判断文件夹是否存在,创建文件夹,获取当前目录下文件列表(不包括文件夹) ,获取当前目录下文件列表(不包括文件夹) ,获取FTP文件列表(包括文件夹), 获取当前目…

PyTorch 分布式训练(Distributed Data Parallel, DDP)简介

PyTorch 分布式训练&#xff08;Distributed Data Parallel, DDP&#xff09; 一、DDP 核心概念 torch.nn.parallel.DistributedDataParallel 1. DDP 是什么&#xff1f; Distributed Data Parallel (DDP) 是 PyTorch 提供的分布式训练接口&#xff0c;DistributedDataPara…

策略模式_行为型_GOF23

策略模式 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;核心思想是将一组算法封装成独立对象&#xff0c;使它们可以相互替换&#xff0c;从而让算法的变化独立于使用它的客户端。这类似于游戏中的技能切换——玩家根据战况选择不同技能…

【Python】天气数据可视化

1. Python进行数据可视化 在数据分析和科学计算领域&#xff0c;Python凭借其强大的库和简洁的语法&#xff0c;成为了众多开发者和科研人员的首选工具。数据可视化作为数据分析的重要环节&#xff0c;能够帮助我们更直观地理解数据背后的规律和趋势。本文将详细介绍如何使用P…

深度学习4.4笔记

《动手学深度学习》-4.4-笔记 验证数据集&#xff1a;通常是从训练集中划分出来的一部分数据&#xff0c;不要和训练数据混在一起&#xff0c;评估模型好坏的数据集 测试数据集&#xff1a;只用一次的数据集 k-折交叉验证&#xff08;k-Fold Cross-Validation&#xff09;是…

vue 两种路由模式

一、两种模式比较 在vue.js中&#xff0c;路由模式分为两种&#xff1a;hash 模式和 history 模式。这两种模式决定了URL的结构和浏览器历史记录的管理方式。 1. hash 模式带 #&#xff0c;#后面的地址变化不会引起页面的刷新。换句话说&#xff0c;hash模式不会将#后面的地址…

Android生态大变革,谷歌调整开源政策,核心开发不再公开

“开源”这个词曾经是Android的护城河&#xff0c;如今却成了谷歌的烫手山芋。最近谷歌宣布调整Android的开源政策&#xff0c;核心开发将全面转向私有分支。翻译成人话就是&#xff1a;以后Android的核心更新&#xff0c;不再公开共享了。 这操作不就是开源变节吗&#xff0c;…

JavaScript中集合常用操作方法详解

JavaScript中集合常用操作方法详解 JavaScript中的集合主要包括数组(Array)、集合(Set)和映射(Map)。下面我将详细介绍这些集合类型的常用操作方法。 数组(Array) 数组是JavaScript中最常用的集合类型&#xff0c;提供了丰富的操作方法。 创建数组 // 字面量创建 const ar…

【HC-05】蓝牙串口通信模块调试与应用(1)

一、HC-05 基础学习视频 HC-05蓝牙串口通信模块调试与应用1 二、HC-05学习视频课件

【学Rust写CAD】18 定点数2D仿射变换矩阵结构体(MatrixFixedPoint结构别名)

源码 // matrix/fixed.rs use crate::fixed::Fixed; use super::generic::Matrix;/// 定点数矩阵类型别名 pub type MatrixFixedPoint Matrix<Fixed, Fixed, Fixed, Fixed, Fixed, Fixed>;代码解析 这段代码定义了一个定点数矩阵的类型别名 MatrixFixedPoint&#xff…