一、More平台架构
二、MFW的组成
三、解析
1.MObeject重载了new、delete等运算符,使SDK拥有自己的内存分配方式
2.MScreen 包含有一个MVectorPtr类型的 control_list,这个control_list的用途在于将每一个append进来的窗口都放入到Vector--也就是窗口链当中,方便控制;还有2个MControlPtr类型的变量 active_control与point_active_control,这两个变量的意义在于?
MScreen 拥有 onKeyPressed()等操作函数,这些函数都是虚函数。之所以采用虚函数是因为后续的MControl中产生的"按键"消息,能够人为的发送至窗口,窗口再进行分发,达到沟通的目的。
MScreen 还拥有onSysEvent、onSocketEvent、onSmsSendResponse等函数。这些函数各在什么时候被触发:
onSysEvent:系统消息,有MM_START 应用启动、 MM_EXIT 应用主动退出、MM_KILL 应用被动退出、MM_SHOW 应用被显示、MM_HIDE 应用被隐藏。当一个窗体收到系统消息,它会轮询control_list里面。然后把消息分发给控件去执行。control_list默认构造函数是10个,在MScreen中为主动释放。但是addElement一次会重新分配一次内存,动态增加。 onSocketEvent、onHttpEvent、onTimer(多了一步判断控件是否可视)都是一样的。窗口(MScreen)不处理onUserEvent、onCntlEvent。
3.MControl 继承自MScreen,其覆盖的函数有onCntlEvent,这个函数其实仅仅在操作控件所属的窗体上实现功能,我们对窗体进行的点击、按键、列表的选择等操作都会触发这个函数。它通过控件id和msg_id来达到控制的目的。虽然MControl明确把处理提交给父类-MScreen处理,但事实上父类没有进行处理。
4.onSysEvent、onCntlEvent、onSocketEvent、onHttpEvent等一般作为回调函数,下面为各个函数在何时被触发:
上述为用定义到回调函数的文件名。
onSysEvent 与 MoreSys 没关系
5.SDK架构
MoreSdk.c中的函数 _MCRT(void** import_func,void* host_reg,void* app_reg)/*main control real time*/
调用MoreMain()进行程序的处理,MoreMain调用MoreProc(int msg,void* param)进行处理。MoreProc内部的消息分为:MM_START、MM_SHOW、MM_HIDE、MM_EXIT、MM_KILL、MM_SOC、MM_PAINT、MM_TIME、MM_HTTP、MM_KEY、MM_KEY_RED、MM_PEN、MM_GUI_RES、MM_SMS_SEND、MM_GSENSOR
一般应用中需要处理的系统事件有:
MM_START:应用程序启动事件,可以在此事件中做应用程序初始化工作。
MM_SHOW:应用程序窗口显示事件,这个事件可能在应用启动时和应用程序窗口被其他窗口(如通话窗口)覆盖后重新显示时被触发。
MM_HIDE: 应用程序窗口隐藏事件,这个事件在应用程序窗口被其他窗口(如通话窗口)覆盖时被触发。
MM_EXIT: 应用正常退出事件,应用程序调用MoreAppExit退出时触发的事件。可以在此事件中做应用程序所占用资源的释放,文件和网络的句柄的关闭等等处理。
MM_KILL: 应用被动退出事件,应用程序在某些情况下(如内存不足)被强行关闭时触发的事件。由于应用程序是被动退出,所以除了要处理MM_EXIT事件的处理外,可能对某些应用程序,需要保存当前状态,以便下次启动时恢复。
MM_PAINT: 该事件在应用程序界面需要重新绘制的时候被调用,可能触发该事件的情况有两种:1.应用程序窗口被显示;2.应用程序调用MoreFlush刷新窗口。
MM_PEN: 触笔事件,触笔被点下,抬起和点下后移动时触发。
MM_KEY: 按键事件,按键被按下,抬起时被触发
More应用程序的编写主要是完成对这些事件的处理。比如需要绘制一张图片到屏幕上,需要调用以下几个API函数
创建图片对象:在MM_START事件处理中调用CreateMoreImage函数创建图片对象;
绘制图像:在MM_PAINT事件处理中调用MoreDrawImage函数绘制图像;
刷新图像:在MM_KEY等事件处理时调用MoreFlushFullScreen刷新图像;
删除图片对象:在MM_EXIT和MM_KILL事件中调用DelMoreImage删除图片对象。
这个消息是怎么被分发和处理的?我们以简单的MM_START为例:我们通过SDK的工具生成的项目模板,其实是MApp.cpp(为什么是cpp?)的一个定制文件。其入口函数是MoreMain().入口函数中通过调用MoreSys.c中的MoreAppInit方法,使用的是回调的方式,去处理其执行函数。
我们需要认识一下回调的本质?
回调函数的本质是什么,是一个功能块,这个功能块的执行取决于一点:调用者环境的设定。回调函数通过传输地址信息给调用者,调用者设定最终调用的条件。