【问题标题】:GUI System ImplementationGUI系统实现
【发布时间】:2017-08-27 02:08:42
【问题描述】:

我将制作一个非常简单的 GUI 工具包。此工具包中的两个元素将是一个矩形和一个圆形按钮。我有两个问题:


#1

R-Tree 在圆圈上带有位掩码、绘图索引系统或完​​全其他的东西会更有效吗?

“绘制索引系统”是指在画布上“绘制”GUI 元素,其作用类似于输入掩码(每个“像素”是空指针或指向按钮的指针),并在窗口大小时更新它变化。每当发生输入事件(比如说悬停事件)时,您会:

  • 获取光标位置
  • 计算输入画布上该点的索引(就像处理图像一样)
  • 从该索引中检索指向相应 GUI 元素的指针。

#2

元素应该如何实现?本质上,一旦确定了元素,应该如何处理输入?我应该:

  • 在实际的帧缓冲区上绘制一些东西,然后运行回调(如果存在指针)以获得功能?

或者,

  • 启动“悬停”回调,它可能决定或不决定在帧缓冲区上绘制。

如果可能的话,我想避免 OOP。


对于任何认为这个问题含糊不清的人,它要求展示或找到一个简单的 GUI 工具包的最佳(如果有的话)实现,其中唯一的元素是矩形和圆形按钮,如上所述。

基本上,我是在问这个:

给定一组任意元素的位置/大小和光标位置,确定光标当前与哪个元素相交的最快方法是什么?

【问题讨论】:

  • GUI 工具包是人类活动的一个分支,其中 OOP 似乎不可避免。
  • 是的,但是我只是想知道使用可能具有不同形状或不透明度的元素实现 GUI 的最有效方法。
  • R-tree 和索引系统看起来都不是实现 GUI 的好方法。
  • 认真的吗?没有任何解释的否决票?不管是谁做的,你至少可以说明原因。
  • 我猜想downwote来自这样一个事实,即您的问题非常模糊并且不承认权威的规范答案,但我当然无法读懂他们的想法。

标签: c algorithm user-interface drawing x11


【解决方案1】:

为了创建您自己的 GUI 工具包,您有多种选择。

1.使用第三方库:

  • 我推荐GTK

  • 在你问之前,它是一个 C 库。

  • 使用此库,您可以轻松创建任何按钮。要回答您的问题,您可以使用此库引发事件并创建处理程序。

2。您不能通过在 C 中使用“dos.h”和“graphics.h”内置库直接使用硬件:

3.设计自己的工具包:

- 检测光标是否在圆圈内:

   (a , b) => location on circle's center

   (x, y) => location of cursor

   r => radius of circle
  • 我们知道,如果 (x, y) 在圆内,则 (x, y) 和 (a,b) 之间的距离应该小于半径 (r)。

  • 如果它大于半径,则很明显点 (x,y) 位于圆外。

  • (x, y) and (a, b) <= r 之间的距离很短,然后它们相交

要查找两点之间的距离,请使用距离公式。即sqrt((x-a)^2 + (y-b)^2)

- 检测光标是否在矩形内:

(这很难,不得不参考高中教科书:-p)

(a, b) => 矩形的中心

(p, q) => 矩形的任意一个顶点

L => (a, b) 和 (p, q) 的长度

m1 => L 的斜率

r => 包围矩形的圆的半径

上述所有值只需在创建矩形时计算一次。

现在随光标变化的值:

(x, y) => 光标位置

dist => (x, y) 和 (a, b) 之间的距离

m2 => 距离的斜率

要找到 (1, 2) 和 (3, 4) 的斜率,请使用公式 slope(m) = (4-2)/(3-1)

在此之后找到线L和线dist之间的角度

o => dist 和 L 之间的角度

要找到斜率为 m1 和 m2 的两条线之间的角度,请使用公式:

在此之后使用基本三角函数,我们知道 z = L * cos(o) 其中 z 是图中所示的距离。

If z => dist 然后光标相交,否则它不相交。

注意: 你可能想知道这是很多数学,但这是最简单的方法,大部分值只需计算一次,不需要循环,所以它可以在 O(1) 时间内完成。

【讨论】:

  • 感谢您的建议,但我已经了解 GTK、Qt、wxWidgets、FLTK 等。我这样做是为了了解 GUI 系统的工作原理,以及如何正确使用最有效的方法。我的 GUI 中只存在这两个元素的原因是因为几乎所有其他 GUI 元素都可以使用它作为基础。
  • 在我看来,'graphics.h' 是 DOS 的库:/。它不处理输入。我不想使用库,而是想创建自己的简单库。
  • graphics.h 不是 GUI 工具包,而是编译器中可用的标准头文件。
  • 我不是想直接操作硬件(那是驱动程序的工作),而是简单地正确处理输入。我编辑了我的问题。请参阅底部的黄色部分。
猜你喜欢
  • 1970-01-01
  • 2012-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-25
  • 1970-01-01
  • 2016-06-19
  • 2011-06-14
相关资源
最近更新 更多