仿windows的嵌入式GUI系统(一)

  最近做UI,从最开始的一个页面一页代码的写UI,到觉得需要一个完整 GUI系统进行维护。

用的MCU很差,但界面要好,功能要全。所以神啊,逼我写的....

  其中不断修改代码,更改几次构架,终于到现在觉得较为完美的构架基本出来了,不得不感慨微软界面的强大。

  经历这么多年的风风雨雨依然坚挺,无数人借鉴其框架模式。为了快速的开发出一套较为完善的GUI系统,我不得不借鉴windows构架。主要参考书籍:《windows 程序设计(第五版)》(《programming windows 》)。

  做一个系列吧。

   第一部分:内存管理。

   我觉得应该把这个放在第一位。

   有内存才有程序生存的环境,碰到很多问题几乎均与内存有关联,对于一个嵌入式系统,ram是不多的,单独显存你也不要想吧。GUI很耗内存的,一不小心就会挂的。

  windows的内存管理太复杂,还没跑起来你板子上的SRAM就没了

  写的GUI系统现阶段只要求对于只存在单个窗口的系统开发,所以不存在窗口,只有控件,当然可以把控件扩充为窗口。

  控件的管理:控件数量是固定的,预留动态分配扩充接口。控件所需空间在GUI初始化时分配,用结构体数组表示。这样便于内存管理。

消息分为两种类型:

一类是队列消息

一类是非队列消息

  消息队列类型只有三种:一类定时器,一类嵌入式设备传来的数据,最后键盘触摸的消息。

然后这三种消息再分化。

从消息的发送途径来看,消息可以分成2种:队列消息和非队列消息。消息队列由可以分成系统消息队列和线程消息队列。系统消息队列由Windows维护,线 程消息队列则由每个GUI线程自己进行维护,为避免给non-GUI现成创建消息队列,所有线程产生时并没有消息队列,仅当线程第一次调用GDI函数数系 统给线程创建一个消息队列。队列消息送到系统消息队列,然后到线程消息队列;非队列消息直接送给目的窗口过程。

  对于队列消息,最常见 的是鼠标和键盘触发的消息,例如WM_MOUSERMOVE,WM_CHAR等消息,还有一些其它的消息,例如:WM_PAINT、WM_TIMER和 WM_QUIT。当鼠标、键盘事件被触发后,相应的鼠标或键盘驱动程序就会把这些事件转换成相应的消息,然后输送到系统消息队列,由Windows系统去 进行处理。Windows系统则在适当的时机,从系统消息队列中取出一个消息,根据前面我们所说的MSG消息结构确定消息是要被送往那个窗口,然后把取出 的消息送往创建窗口的线程的相应队列,下面的事情就该由线程消息队列操心了,Windows开始忙自己的事情去了。线程看到自己的消息队列中有消息,就从 队列中取出来,通过操作系统发送到合适的窗口过程去处理。

  一般来讲,系统总是将消息Post在消息队列的末尾。这样保证窗口以先进先 出的顺序接受消息。然而,WM_PAINT是一个例外,同一个窗口的多个 WM_PAINT被合并成一个 WM_PAINT 消息, 合并所有的无效区域到一个无效区域。合并WM_PAIN的目的是为了减少刷新窗口的次数。

  非队列消息将会绕过系统队列和消息队列,直 接将消息发送到窗口过程,。系统发送非队列消息通知窗口,系统发送消息通知窗口。 例如,当用户激活一个窗口系统发送WM_ACTIVATE, WM_SETFOCUS, and WM_SETCURSOR。这些消息通知窗口它被激活了。非队列消息也可以由当应用程序调用系统函数产生。例如,当程序调用SetWindowPos系统 发送WM_WINDOWPOSCHANGED消息。一些函数也发送非队列消息,例如下面我们要谈到的函数。

  消息流转与windows完全一致。

  定时器设定,为指定函数或者指定控件设置定时器。void SetTimer(Crtl_Handle Ctrl,Tim_Fun  Fun,unsigned char TimID , unsigned int MSecs );

这里Tim_Fun返回值空,参数空,和 Ctrl只能二选一,其中一个参数必须为NULL

原文地址:https://www.cnblogs.com/bandynewer/p/2515112.html