人们如何制作图形用户界面?我的意思是他们用来在屏幕上绘制视觉组件的基本构建块或原理,如KDE,Gnome等.是否有任何关于如何通过直接处理硬件在屏幕上绘制矩形的简单示例?
我正在为那些询问我的平台的人使用PC.
好吧,让我们从底部开始吧.您有一台显示图像的显示器.此图像是像素矩阵,例如,1600x1200像素,深度为24位.
显示器知道从视频适配器显示什么.视频适配器知道通过"帧缓冲器"显示什么,"帧缓冲器"是一个大块的内存 - 在本例中 - 包含1600*1200像素,通常在当代卡中每像素32位.
帧缓冲区通常可以被CPU作为可以直接进入的大块和内存访问,并且一些适配器具有GPU,允许将内容渲染到帧缓冲区中,如阴影纹理三角形,因此CPU只发送命令通过"命令缓冲区",告诉它绘制什么和在哪里.
然后你有了操作系统,它加载了一个与视频适配器通信的硬件驱动程序.
操作系统通常提供使用函数写入帧缓冲区的功能.例如,Win32有许多功能,如BitBlt,Line,Text等.这些将最终与驱动程序通信.
然后你就像Java那样呈现自己的图形,通常使用操作系统提供的功能.
简单的答案是位图,事实上这也适用于早期终端上的字体。
最初的 GUI,比如Xerox Parc 的 Alto GUI是基于位图显示的,图形是用简单的位图绘制工具和图形库绘制的,使用简单的几何图形来确定圆形、正方形、矩形等形状,然后将它们映射到显示像素。
今天的 GUI 是相同的,只是添加了额外的软件和硬件来加速和改进这些 GUI 的流程和性能。
位(例如 10101010)到像素的基本映射取决于显示硬件,但在简单的层面上,您可以在内存中提供一个显示缓冲区,并简单地用显示数据填充它的字节。
因此,对于基本的单色位图,您可以通过提供表示您想要绘制的形状的位来绘制它,您可以定位这些位,就像这样,一个简单的 8x8pix 按钮。
01111110
10000001
10000001
10111101
10111101
10000001
10000001
01111110
Run Code Online (Sandbox Code Playgroud)
如果我用 # 和 SPACE 而不是 1 和 0 来渲染它,你会更容易看到。
######
# #
# #
# #### #
# #### #
# #
# #
######
Run Code Online (Sandbox Code Playgroud)
作为位图图像,它看起来像这样: https: //i.stack.imgur.com/i7lVQ.png(我知道它有点小:)但这就是我们在 GUI 时开始的那种规模最早被开发出来。)
如果您有更复杂的显示器(例如 24 位彩色显示器,您将使用 24 位数字提供每个像素。)
显然有些位图无法手动绘制(例如窗口的边框),就像我们上面所做的那样,这就是几何学派上用场的地方,我们可以使用简单的函数来确定绘制矩形所需的像素值,或者任何其他简单的形状,然后从那里构建。
一旦您能够以这种方式在显示器上绘制图形,您就可以将绘制循环挂接到系统中断上,以使显示器保持最新(您可以经常重绘显示器,具体取决于您的系统性能。)这样您就可以让它处理来自用户设备(例如鼠标)的交互。
早在早期,甚至在 Xerox Parc / Alto 之前,就有许多早期计算机系统具有基于矢量的显示器,这些系统可以通过在笛卡尔平面的 CRT 表示上绘制线条来构成图像。然而,这些显示器从未出现在主流应用中,除了一些早期的视频游戏,例如《小行星》和《暴风雨》。
| 归档时间: |
|
| 查看次数: |
570 次 |
| 最近记录: |