提问人:PiFace 提问时间:5/1/2021 更新时间:5/1/2021 访问量:674
GUI 在低级别检测正在单击哪个元素的常见方法是什么?
What are common ways that GUIs detect which element is being clicked, in a low level?
问:
我一直在尝试四处寻找这个问题,但我发现的都与一个高级问题有关,比如“如何知道正在点击哪个 HTML”。这不是我要找的那种东西。我正在寻找一个更低级的细节。
假设有人试图为给定系统编写 GUI 库。另外,假设该程序员已经设法在屏幕上显示图形、文本、按钮等。现在,他们希望实现用户与该界面交互的方式,更具体地说,使用鼠标点击(或触摸输入)。
运行其 GUI 引擎的系统能够告诉他们何时发生点击,以及点击发生在屏幕上的哪个 (x, y) 点。要查找屏幕上的哪些元素正在被点击,一个简单的方法是遍历每个元素并测试每个元素。但是,在现有 GUI 中通常是这样完成的吗?例如,这是浏览器在显示 HTML 页面时所做的吗?这是操作系统对其 GUI 和窗口的处理方式吗?他们是否使用更复杂的数据结构,如 R-Trees?他们如何处理移动元素?
这个问题并不特定于任何软件,我只是想知道在 GUI 开发的上下文中通常如何解决这个问题。
答:
有 2 种基本方法。一个你已经想通了:
测试“每个”对象与鼠标位置
这可以通过使用空间细分结构(类似于 2D 中的 BVH 和 octree)来加快速度。但是,这种方法总是较慢,并且受制于复杂性,例如 GUI 元素的数量或位置。这里有一个幼稚的例子:
O(log(n))
O(n)
n
O(n)
但是,一旦被测项目数量增加或形状过于复杂,这种方法就很麻烦。
使用索引缓冲区
这种方法在复杂性方面是像素完美的,并且在大多数实现中也几乎是免费的。
O(1)
这个想法是具有与被测元素的屏幕保持 ID(索引)相同的分辨率的索引缓冲区,而不是颜色。因此,在渲染 GUI 时,除了使用颜色设置元素的每个像素外,还可以在索引缓冲区中的相同位置设置渲染项索引或 ID。
在此之后,检测只是在鼠标位置获取索引缓冲区值。这里有几个例子:
此方法也可用于 2D 和投影 3D->2D 甚至更高尺寸。
评论
(x,y) | 700 <= x <= 900, 400 <= y <= 500
上一个:查找在树中定位数字的可能路径
下一个:识别不变量
评论