C GUI系统实现

C GUI系统实现,c,algorithm,user-interface,drawing,x11,C,Algorithm,User Interface,Drawing,X11,我将制作一个非常简单的GUI工具包。该工具包中的两个元素是矩形和圆形按钮。我有两个问题: #1 如果在圆上有一个位掩码,一个绘图索引系统,或者完全其他的东西,会更有效吗 所谓“绘制索引系统”,我指的是在画布上“绘制”GUI元素,就像一个输入掩码(每个“像素”要么是一个空指针,要么是一个指向按钮的指针),每当窗口大小改变时都会更新它。无论何时发生输入事件(比如悬停事件),您都会: 获取光标位置 计算输入画布上该点的索引(就像处理图像一样) 从该索引检索指向相应GUI元素的指针 #2 应如何

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


#1

如果在圆上有一个位掩码,一个绘图索引系统,或者完全其他的东西,会更有效吗

所谓“绘制索引系统”,我指的是在画布上“绘制”GUI元素,就像一个输入掩码(每个“像素”要么是一个空指针,要么是一个指向按钮的指针),每当窗口大小改变时都会更新它。无论何时发生输入事件(比如悬停事件),您都会:

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

#2

应如何实施这些要素?基本上,一旦确定了元素,应该如何处理输入?我应该:

  • 在实际帧缓冲区上绘制一些内容,然后运行回调(如果存在指针)以获取功能
或者

  • 启动“悬停”回调,该回调可能决定是否在帧缓冲区上绘制

我希望尽可能避免OOP


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

本质上,我是在问:

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


为了创建自己的GUI工具包,您有几个可用选项

1。使用第三方库:

  • 我推荐

  • 在你问之前,这是一个C语言库

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

    • 有关此库的详细信息,请访问:
2。使用C中的“dos.h”和“graphics.h”内置库无法直接使用硬件:

  • 有关详细信息,请访问此网站:
3。设计自己的工具包:

-检测光标是否在圆内:

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

  • 如果大于半径,则点(x,y)显然位于圆外

  • 在矩形的
    (x,y)和(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和线距离之间的角度

    o=>距离和L之间的角度

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

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

    如果z=>dist
    则光标相交,否则不相交


    注意:你可能想知道这是一个非常复杂的数学问题,但这是最简单的方法,大多数值只需计算一次,而且不需要循环,因此可以在O(1)时间内完成。

    GUI工具包是人类活动的一个分支,OOP似乎是不可避免的。是的,然而,我只想知道用不同形状或不透明度的元素实现GUI的最有效方法。R树和索引系统看起来都不是实现GUI的好方法。真的吗?没有任何解释的否决票?不管是谁做的,你至少可以举出原因。我想,问题的症结在于你的问题非常模糊,不承认权威的规范答案,但我当然无法理解他们的想法。谢谢你的建议,但我已经知道GTK、Qt、wxWidgets、FLTK和其他。我这样做是为了学习GUI系统的工作原理,以及如何使用最有效的方法正确地完成它。我的GUI中只存在这两个元素的原因是,几乎所有其他GUI元素都可以使用它作为基础。在我看来,“graphics.h”是DOS的库:/。它不处理输入。我不想使用库,而是想创建自己的尽管很简单的库。graphics.h不是GUI工具包,而是编译器中可用的标准头文件。另外,请检查一下,我不想直接操作硬件(这是驱动程序的工作),而只是正确地处理输入。我编辑了我的问题。请参见底部的黄色部分。
       (a , b) => location on circle's center
    
       (x, y) => location of cursor
    
       r => radius of circle