GUI框架如何工作?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GUI框架如何工作?相关的知识,希望对你有一定的参考价值。
我一直在网上寻找答案,我的问题是:GUI框架如何工作?例如,Qt是如何工作的,是否有关于从头开始编写GUI框架主题的书籍或wibsites?并且框架还必须从操作系统GUI框架调用方法吗?
- 感谢任何一个花时间尝试回答这个问题的人,如果我拼错了任何东西,请原谅我。
像Qt这样的GUI框架通常可以通过获取现有操作系统的原始对象(窗口,字体,位图等),将它们包含在更加平台中立且不那么笨重的类/结构/句柄中,并为您提供所需的功能。操纵它们。是的,这几乎总是涉及使用操作系统自己的功能,但它没有 - 如果你正在设计一个API来绘制OpenGL UI,例如,大多数底层操作系统的GUI内容都无法工作,你将自己做几乎所有的事情。
无论哪种方式,它都不适合胆小的人。如果你不得不问一下GUI框架是如何工作的,你甚至还没准备好设计它。你最好坚持使用现有的框架并扩展它来做它已经没有做过的漂亮的东西。
在过去,我们从头开始做了很多GUI编程。它并不像看起来那么难,但它需要几周时间才能得到结果。
首先,你需要一个好的绘图库。此库的最小功能是绘制剪切的矩形(使用模式),线条,位图和字体。您可以通过将字体创建为位图来作弊,而剪切的矩形只是一堆水平线。
现在您至少需要鼠标,键盘和计时器的驱动程序(如果操作系统尚未提供)。通常,您需要检测按键,符号键(例如移位等),鼠标移动和鼠标点击。基本计时器功能可让您检测双击。
然后,您需要创建一个窗口数据结构。该数据结构需要具有坐标,即矩形,到父窗口的链接(如果不是顶窗),以及窗口函数,即当该窗口应该处理某些事件时将被调用的函数。
一旦你可以在屏幕上绘图,你需要一些矩形代数函数。您至少需要良好的函数来计算矩形的交点,以及相对于绝对坐标的快速分辨率。例如 - 如果您的子窗口有父窗口,那么它的'x和y应递归地添加到父x和y,直到到达顶窗。
此时你有: - 原始图形功能, - 窗口结构, - 鼠标驱动程序,键盘驱动程序和计时器, - 矩形算术。
现在您可以编写主要事件收集功能。此功能将一直运行。它的目的是检测事件并将消息发送到正确的窗口。什么是活动?好吧,当你启动程序时,存储鼠标x和y坐标。然后在循环中检查它们是否已更改。如果它们已更改,请在该位置找到窗口...并向其发送WM_MOUSEMOVE事件。您的收获功能应该处理: - 鼠标移动 - 鼠标点击 - 鼠标双击(记住最后点击和位置,测量时间并决定是否是双击) - 计时器事件 - 键盘缓冲区更改...
现在您应该能够将事件发送到Windows。但你真的需要一种机制。它是消息队列和窗口过程的组合。它通常是这样的:每个窗口都有一个窗口过程,通常接受四个参数:消息id(即鼠标移动,是绘制消息),窗口句柄,参数1和参数2.您可以直接使用此窗口过程类似于send_message函数。或者您可以通过post_message函数向此窗口发送消息。这将把消息放入队列,窗口将逐个处理消息,最终接收到这个消息。那么为什么要直接调用一条消息并将其他消息放入队列?因为优先。你看,键盘点击可以等待一段时间才能被处理。但必须立即完成窗口重绘,以防止屏幕上出现闪烁和错误的数据。
所以你的harvest_events函数使用post_message和send_message向windows发送消息。你的窗口消息泵使用这样的典型消息泵获取它们:
while(pmsg = get_message()!= NULL)send_message(pmsg-> id,pmsg-> hwnd,pmsg-> p1,pmsg-> p2);
get_message只是从队列中获取消息,并调用send消息。简单,对吧?嗯,不是那么的。这样你只会接收到Windows的驱动程序消息,但是你还需要一些函数来重绘窗口,移动它们等。当你创建move_window函数,resize_window,show_window和hide_window函数时,你的窗口坐标会改变。其他窗口的部分将被揭开(如果顶部窗口被移动或关闭)。您需要计算哪些窗口受坐标更改的影响,并向这些窗口发送绘制消息(仅重新绘制未被覆盖的部分 - 记住,您有裁剪绘图功能,这将工作)。
这些函数引入了消息msg_paint,msg_move,msg_resize,msg_hide ......
最后,您需要维护窗口的层次结构。您的顶部窗口应该是桌面。它应该有子窗口(应用程序顶部窗口)。这些窗口可能还有其他子窗口(按钮,编辑框等)。用于保存这些窗口的明显结构是窗口树。当您检测到鼠标单击时,您必须遍历窗口树并以智能方式(找出谁有焦点,谁是模态等)将消息发送到右侧窗口。当你画画时,你也必须遍历所有的孩子,看看谁被发现,谁不被发现。最后但并非最不重要的是,您需要将鼠标矩形作为顶部窗口处理,以防止在重新绘制窗口时使用鼠标闪烁或(使用定时器和msg_paint事件)动画。
这大致就是这样。
构建GUI框架不是1,2,3过程。
我只能说,看看其中一些开源IDE,例如Netbeans source code。
查看代码内部,然后构建整个IDE。
以上是关于GUI框架如何工作?的主要内容,如果未能解决你的问题,请参考以下文章