02-GUI开发简介
16.1 GUI开发简介
“在编程中,关键不在于解决问题,而是决定要解决哪些问题。”
——Paul Graham
GUI软件始于GUI操作系统。第1个GUI操作系统是Alto Executive,它运行在1973年开发的Xerox Alto计算机上。从那时起,许多操作系统纷纷效仿,并提供了具有自身风格的GUI界面。今天,著名的基于GUI的操作系统是macOS、Windows及Linux的发行版,例如Ubuntu的KDE。随着用户通过可视元素点击界面与操作系统交互,对基于GUI的应用程序的需求也在不断增长,许多软件也开始附带GUI发布,以便为用户提供与操作系统交互的类似的交互方式。但是GUI开发的早期阶段需要大量的手工操作,并且由于硬件限制,不同的应用程序在其GUI中具有专门的实现和性能特征。最终,GUI框架开始大量涌现,它为开发人员提供了底层操作系统的所有底层细节的共同基线和抽象层,同时其也是跨平台的。
在构建桌面应用之前,我们必须简要了解将GUI或前端集成到应用程序时需要遵循的通用设计准则。我们将从Linux操作系统的角度进行相关的讨论,但其他操作系统的讨论与其有相似之处。典型的GUI应用程序体系结构通常分为两个部分:前端和后端。前端是GUI线程或者用户与之交互的主线程。它由称为小部件(widget)的交互式可视单元组成,这些小部件包含在父容器窗口中。小部件可以用于执行任务的按钮,或者可以按顺序显示多个项目的列表视图。GUI线程主要用于向用户呈现视觉信息,还负责传播用户与小部件交互时产生的任何事件。
后端是一个单独的线程,包含用于传播状态变更的事件处理程序或事件发送器,主要用于执行计算量繁重的任务。来自GUI层的输入处理工作通常会被转移到后台线程,因为在主线程上执行计算繁重的任务会影响用户与应用程序前端的交互,这不是一种好的用户体验。此外,为了便于维护和分离关注点,我们通常希望将前端和后端分开。
在没有专用框架的情况下构建基于GUI的应用程序可能是一个非常麻烦的过程,因为如果没有它们,我们可能需要在应用程序代码中处理大量的细节。GUI框架为开发者抽象了所有上述细节,例如将小部件和窗口渲染到视频内存或GPU的帧缓冲区,从输入设备读取事件、重新渲染及刷新窗口等。因此,让我们来看一个名为Gimp的工具箱或GTK+的框架,这是一个非常成熟的跨平台解决方案,用于构建可伸缩的GUI应用程序。