GUI系统实现

GUI System Implementation

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


#1

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

'drawing index system',我的意思是 'drawing' canvas 上的 GUI 元素充当输入掩码(每个 'pixel' 要么是空指针,要么是指向一个按钮),每当 window 尺寸改变时更新它。每当发生输入事件(比方说悬停事件)时,您将:


#2

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

或者,


我想尽可能避免 OOP。


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

本质上,我是在问这个:

Given a set of positions/sizes of arbitrary elements and the cursor position, what is the quickest way to determine which element the cursor is currently intersecting?

为了创建您自己的 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 之间的短距离内相交

To find distance between two points use distance formula. ie sqrt((x-a)^2 + (y-b)^2).

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

(这​​个太难了,要参考高中课本:-p)

(a, b) => center of rectangle

(p, q) => any one vertex of rectangle

L => length of (a, b) and (p, q)

m1 => slope of L

r => radius of circle enclosing the rectangle

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

现在随光标变化的值:

(x, y) => position of cursor

dist => distance between (x, y) and (a, b)

m2 => slope of dist

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

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

o => angle between dist and L

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

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

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

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