微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

GUI 在低级别检测正在单击哪个元素的常用方法是什么?

如何解决GUI 在低级别检测正在单击哪个元素的常用方法是什么?

我一直在尝试四处寻找这个问题,但我发现的一切都与高级事物有关,例如“如何知道正在单击哪个 HTML”。那不是我要找的那种东西。我正在寻找更底层的细节。

假设有人试图为给定系统编写 GUI 库。另外,假设这个程序员已经设法在屏幕上显示图形、文本、按钮等。现在,他们想要实现用户与该界面交互的方式,更具体地说,使用鼠标点击(或触摸输入)。

运行他们的 GUI 引擎的系统能够告诉他们点击何时发生,以及点击发生在屏幕上的哪个 (x,y) 点。要查找屏幕上的哪些元素被点击,一个简单的方法是循环遍历每个元素并测试每个元素。但这是在现有 GUI 中通常是如何完成的吗?例如,这是浏览器在显示 HTML 页面时所做的事情吗?这是操作系统对其 GUI 和窗口的处理方式吗?他们是否使用更复杂的数据结构,如 R-Trees?他们如何处理移动元素?

这个问题不是针对任何软件的,我只是想知道在 GUI 开发的这种背景下通常如何解决这个问题。

解决方法

有两种基本方法。一个你已经想出来的:

  1. 测试“每个”对象与鼠标位置

    这可以通过使用空间细分结构来加速(类似于二维中的 BVH 和八叉树)。然而,这种方法总是较慢,并且会受到诸如 O(log(n))O(n) 之类的复杂性的限制,其中 n 是 GUI 元素的数量。这里是简单的 O(n) 示例:

    然而,一旦被测项目数量增加或它们的形状太复杂,这种方法就很麻烦。

  2. 使用索引缓冲区

    这种方法是像素完美的,复杂度为 O(1),并且在大多数实现中几乎是免费的。

    这个想法是拥有与屏幕保持测试元素的 ID(索引)而不是颜色相同分辨率的索引缓冲区。因此,在渲染 GUI 时,除了使用颜色设置元素的每个像素之外,您还要在索引缓冲区中的相同位置设置渲染项索引或 ID。

    在此之后,检测只是获取鼠标位置的索引缓冲区值。这里有几个例子:

    此方法可用于 2D 和投影 3D->2D 甚至更高维度。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。