5

我制作了一个带有 c 内核的桌面操作系统,可以打印“hello world”。我正在尝试在 c 中为我的操作系统制作一个 GUI(自定义窗口管理器、按钮),但我遇到了麻烦。我看了一个教程:

http://www.osdever.net/tutorials/view/gui-development

是否有任何类型的 GUI 教程适用于C中的桌面操作系统?

ps 没有 Linux,也没有 DOS。只有C标准。

4

2 回答 2

6

我不认为你需要一个特殊的教程在这里。最基本的 GUI 的核心包括管理代表窗口、按钮、图片、文本框等的矩形对象列表。

每个像这样的矩形对象都有它的 x 和 y 坐标和尺寸(宽度和高度)。它还具有 z(深度)坐标,它告诉它下方的对象(它们的 z 值更小)和上方的对象(它们的 z 值更大)。

每个矩形对象也有一个指向其父对象和子对象的指针。这使得组合更小和更简单的矩形的任意复杂窗口变得容易。对象。例如,当您抓取一个窗口并移动它时,使用这些父/子指针可以移动所有对象。或者,如果外部对象接收到一个事件,它可以将其转发给它的内部子对象进行处理,反之亦然。

在渲染所有这些矩形对象时,其中一些可能会部分或完全被其他对象遮挡,最重要的是弄清楚所有对象中哪些是可见的,哪些是不可见的,哪些是部分可见的,因为你不想这样做很多不必要的工作。为了有效地绘制对象,您希望最多绘制每个像素一次(总是或大部分时间)。除了需要的矩形相交/细分代码之外,这还表明每个对象都知道如何有效地绘制其自身的任意矩形部分。这对于纯色对象来说是最简单的。对于图片,它或多或少是直截了当的(除非您想就地进行图像缩放和颜色减少/转换)。对于文本和矢量对象,这是最难的。

您甚至可以用小矩形对象组成鼠标指针对象,并使用与所有其他对象相同的代码对其进行绘制和重绘。只需确保指针的 z(深度)坐标使得指针始终位于所有其他对象的顶部。

这是一般的想法。

于 2012-01-22T23:50:10.157 回答
5

我的建议是仔细研究已经存在和过去存在的 GUI 系统。查看它们的 API,并尝试弄清楚它们是如何工作的。亚历克斯的回答给出了一个很好的一般起点,但并非所有环境都以完全相同的方式工作。一定要看看他们的架构。它们是客户端/服务器,还是单片机?应用程序如何与他们通信?一旦你理解了所有这些,你就可以开始设计你的系统了。找出您的窗口管理器/应用程序服务器/x 服务器等效项的位置,建立通信渠道并开始编码。弄清楚所有这些组件如何也需要与您的内核对话——这非常重要。

与内核开发不同,除非你真的很激进,否则你几乎肯定会构建一些看起来有点像 unix 或有点像 VMS 但为了权宜之计混合了 minix 和 mach 元素的东西,构建一个 GUI 框架要复杂得多。不同的变化,这可能就是为什么没有那么多好的教程的原因。

我个人的灵感来自 BeOS。我喜欢他们这样做的方式,所以我复制了它,尽管与任何事情一样,您也需要查看他们所犯的一些错误,并尽量不要复制它们。BeOS 也有不少错误。

于 2012-01-23T12:12:37.727 回答