做一个网络程序,一般要分成底层引擎 和 UI这两部分。对于引擎,其需要和网络进行互动,而受到相应消息时需要通知ui进行变化。但是该如何通知呢?
有人说:函数调用。引擎调用UI的更新函数。也有人说:qt中用信号槽。 这个也可以,但是效率太低,不推荐使用。
这个时候最好是使用函数指针, 具体如下做:
①:我们在初始化时在后台开一个定时器一类的东西,让它开始运行。后台这个timer相当于一个后台事件调度器。它一到事件之后就会驱动某个事件的发生。
②:在先创建UI模块后:我们预留一个函数,专门用来处理后台定时器到时间之后的UI更新。 而后:我们把这个函数的指针传递到底层引擎里边去。
这样:底层定时器一旦到达时间之后就会通过这个函数指针调用上层UI模块的更新函数。
总体来书顺序就是:先初始化UI ,后初始化网络引擎(将ui模块的更新函数指针传递进去), 而后开启底层timer开始进行调度。这样底层有什么网络消息更新就可以及时通知到上层ui变换.
用一下这种架构,你就会感慨:函数指针真是个好东西啊~~~
-----------------------------------------------------------------------------------------------------------------------------------
再说一下自绘控件。网上很多人都在讨论这个东西,任何东西都不用系统控件 而用自定义的。比如:qt下不再使用QWidget之类的,所有的button啊之类的全是自定义的。这样可以实现完全定义 也减少资源损耗!
问题是:自绘控件原理是什么?ok,这里给出一种模型:
①:所有的自绘控件其实都是图片!当对其采取不同动作时:其会发生不同的重绘事件,从而变成不同的图片。
②:那么:我们可以先建一个系统window,这也是我们架构中唯一的一个系统控件!这个系统控件完全可以接受到所有的事件 并进入对应的处理函数中。
③:显示在我们面前的自绘控件组成的界面:其本质就是一张完整的图片。而我们要做的就是:在其指定的位置:用指定控件的图片覆盖重绘上去而已。那么:当把这张指定的图片都在指定的位置绘制上我们需要的代表自绘控件的图片之后:呈现在用户面前的就是最终效果了。
④:照上边这样说的话:当点击某处时:我们需要计算出其在这个唯一的系统控件中的位置,从而依据这个位置获知当前点中的是那个自定义控件,从而我们写函数进行处理来对图片重新绘制 绘制成别的图片。比如:一个button,当press之后颜色变暗,release之后颜色变亮。 那在自绘控件中就是:一旦依据位置计算出当前是press在这个button区域,那就将代表这个button的这块区域用暗颜色的新图片覆盖重绘。而release后则再用亮图片对这块区域重绘.
那么:我们需要设计整个刷新机制 和 事件处理机制。而他们操作的对象其实就是一张图片而已。 我们仅仅是把这张图片刷在系统window上而已! 同时:我们还要把系统事件转为我们自定义事件,完成系统事件到我们自定义事件的转换。
大致原理就是这样的,但是你需要注意效率的优化等等,尤其是在嵌入式设备上,比如:移动终端 手机~~~