GUI是如何绘制的?

时间:2010-10-16 01:05:53

标签: user-interface

人们如何制作图形用户界面?我的意思是他们用来在屏幕上绘制视觉组件的基本构建块或原理,如KDE,Gnome等。是否有任何关于如何通过直接处理硬件在屏幕上绘制矩形的简单示例?

我正在为那些询问我的平台的人使用PC。

4 个答案:

答案 0 :(得分:6)

好吧,让我们从底部开始吧。您有一台显示图像的显示器。此图像是像素矩阵,例如,1600x1200像素,深度为24位。

显示器知道从视频适配器显示的内容。视频适配器知道通过“帧缓冲区”显示什么,这是一个很大的内存块 - 在本例中 - 包含1600 * 1200像素,通常在当代卡中每像素32位。

帧缓冲区通常可以被CPU作为可以直接进入的大块和内存访问,并且一些适配器具有GPU,允许将内容渲染到帧缓冲区中,例如阴影纹理三角形,因此CPU只需通过“命令缓冲区”发送命令,告诉它要绘制什么以及在哪里。

然后你有了操作系统,它加载了一个与视频适配器通信的硬件驱动程序。

操作系统通常提供使用函数写入帧缓冲区的功能。例如,Win32有很多功能,如BitBlt,Line,Text等。这些最终会与驱动程序通话。

然后你就像Java那样呈现自己的图形,通常使用操作系统提供的功能。

答案 1 :(得分:3)

简单的答案是bitmaps,实际上这也适用于早期终端上的字体。

原始GUI,Xerox Parc's Alto GUI等基于位图显示,图形使用简单的位图绘制工具和图形库绘制,使用简单的几何图形来确定圆形,正方形,矩形等形状,然后将它们映射到显示像素。

今天的GUI是相同的,除了附加的软件和硬件加快并改进了这些GUI的过程和性能。

比特的基本映射,例如10101010像素取决于显示硬件,但在简单的水平上,你可以在内存中提供一个显示缓冲区,只需用显示数据填充它的字节。

因此,对于基本的单色位图,您可以通过提供表示您想要绘制的形状的位来绘制它,您可以将这些位定位为一个简单的8x8pix按钮。

01111110
10000001
10000001
10111101
10111101
10000001
10000001
01111110

如果我用#和SPACE而不是1和0渲染它,你会看得更容易。

 ###### 
#      #
#      #
# #### #
# #### #
#      #
#      #
 ###### 

作为位图图像看起来像这样:http://i.stack.imgur.com/i7lVQ.png(我知道它有点小:)但是这是我们在最初开发GUI时开始的那种规模。)

如果你有一个更复杂的(例如24位彩色显示器,你可以使用24位数字提供每个像素。)

显然有些位图无法手动绘制(例如窗口的边框),就像我们上面所做的那样,这就是几何体派上用场的地方,我们可以使用简单的函数来确定绘制a所需的像素值矩形或任何其他简单形状,然后从那里构建。

一旦您能够在显示器上以这种方式绘制图形,然后将绘图循环挂钩到系统中断上以使显示保持最新(您可以经常重绘显示,具体取决于您的系统性能。)您可以使用它来处理来自用户设备的交互,例如一只老鼠。

回到早期,甚至在Xerox Parc / Alto之前就有许多早期计算机系统都有基于矢量的显示器,这些系统会通过在笛卡尔平面的CRT表示上绘制线条来构成图像。然而,这些显示器从未见过主流使用,除非在一些早期的视频游戏中,例如Asteroids和Tempest。

答案 2 :(得分:0)

您可能需要一个图形库,例如OpenGL

对于直接硬件交互,您可能需要执行类似程序集的操作,这完全取决于计算机。

答案 3 :(得分:-1)

如果您愿意查看大量源代码,可以查看Mesa 3D,这是OpenGL规范的开源实现。