我制作了一个带有内核的桌面操作系统,用于打印“hello world”。我正在尝试为我的操作系统制作一个GUI(自定义窗口管理器,按钮),但我遇到了麻烦。我查看了一个教程:
http://www.osdever.net/tutorials/view/gui-development
C 中是否有适用于桌面操作系统的GUI教程?
P.S。没有Linux,没有DOS。只有 C 标准。
答案 0 :(得分:5)
我认为你不需要这里的特殊教程。最基本的GUI的核心包括管理代表窗口,按钮,图片,文本框等的矩形对象列表。
每个像这样的矩形物体都有x和y坐标和尺寸(宽度和高度)。它还有一个z(深度)坐标,告诉它下面有什么物体(它们的z更小)以及它上面有什么物体(它们的z更大)。
每个矩形对象也有一个指向其父级及其子级的指针。这使得组成更小和更简单的rect的任意复杂窗口变得容易。对象。例如,当您抓住窗口并移动它时,使用这些父/子指针可以移动所有对象。或者,如果外部对象收到一个事件,它可以将它转发给它的内部子项进行处理,反之亦然。
当谈到渲染所有这些矩形物体时,其中一些可被其他物体部分或完全遮挡,最重要的是弄清楚所有物体中哪一个是可见的,不可见的和部分可见的,因为你没有想做很多不必要的工作。要有效地绘制想要最多一次绘制每个像素的对象(总是或大部分时间)。除了需要的矩形交叉/细分代码之外,这还表明每个对象都知道如何有效地绘制自身的任意矩形部分。这对于纯色物体来说是微不足道的。对于图片来说,它或多或少是直截了当的(除非您想要进行图像缩放和颜色缩减/原位转换)。对于文本和矢量对象来说,这是最难的。
您甚至可以用小矩形对象组合鼠标指针对象,并使用与所有其他对象相同的代码绘制和重绘它。只需确保指针的z(深度)坐标使得指针始终位于所有其他对象之上。
这是一般的想法。
答案 1 :(得分:5)
我的建议是努力研究已经存在并且过去存在的GUI系统。查看他们的API,并尝试弄清楚它们是如何工作的。 Alex's answer提供了一个很好的通用起点,但并非所有环境都以完全相同的方式工作。一定要看看他们的架构。它们是客户端/服务器还是单片机?应用程序如何与它们通信?一旦理解了所有这些,就可以开始设计系统了。找出窗口管理器/ app server / x服务器等效的位置,构建通信通道并开始编码。弄清楚所有这些组件是如何与内核通信的 - 这非常重要。
与内核开发不同,除非你真的很激进,否则你几乎肯定会构建一些看似有点像unix或有点像VMS的东西,但是为了方便起见,混合了minix和mach的元素,构建一个GUI框架就更多了复杂的许多不同的变化,这可能是为什么没有那么多好的教程。
我个人的灵感来自BeOS。我喜欢他们这样做的方式,所以我复制了它,尽管你需要查看他们所犯的一些错误,并尽量不要复制它们。 BeOS有很多错误。