MiniGUI原理分析
一. 概述
MiniGUI是广泛应用于嵌入式系统的GUI中间件,支持linux。有线程版本或者进程版本,线程版本为支持nucleus或者threadx,当然也支持linux;同时linux还支持进程版本。本文只是分析基于linux的线程版本。
二. 基本结构
如图所示,系统由不同的线程协作完成。系统在启动的过程中会通过函数SystemThreads(),启动两个线程DesktopMain(),EventLoop()。
EventLoop()中,通过linux系统调用select()监控底层驱动的输入,原始MiniGUI版本有键盘和鼠标,当有外设变化时,会生成消息的形式,然后发往线程DesktopMain,由函数DesktopWinProc()处理,DesktopMain线程相当于服务器线程,它一方面完成系统任务的处理,另一方面将部分消息转发到窗口线程,由窗口线程完成部分任务。
2.1 DesktopMain函数分析
DesktopMain的主循环函数是DesktopWinProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam),它具体的执行过程如下所示:
2.2 WindowMessageHandler()函数分析
2.3 线程窗口
以开源的例子为例来说明线程窗口的执行,参考dlgdemo.c
2.4 系统的启动过程
系统的启动过程参考如下的宏定义:
#define MiniGUIMain \
MiniGUIAppMain (int args, const char* argv[]); \
int main_entry (int args, const char* argv[]) \
{ \
int iRet = 0; \
if (InitGUI (args, argv) != 0) { \
return 1; \
} \
iRet = MiniGUIAppMain (args, argv); \
TerminateGUI (iRet); \
return iRet; \
} \
int MiniGUIAppMain
以下具体的分析一下InitGUI()的启动流程
InitGUI():
/*initialize default window process*/
__mg_def_proc[0] = PreDefMainWinProc;
__mg_def_proc[1] = PreDefDialogProc;
__mg_def_proc[2] = PreDefControlProc;
mg_InitFixStr()
mg_InitMisc ()
mg_InitGAL ()//here to get width an height
mg_InitSystemRes ()
mg_InitGDI()
mg_InitScreenDC (__gal_screen)
license_create();
splash_draw_framework();
mg_InitCursor()
mg_InitLWEvent()
mg_InitLFManager ()
mg_InitMenu ()
mg_InitControlClass()
img_InitAccel()
mg_InitDesktop ()
mg_InitFreeQMSGList ()
createThreadInfoKey ()
SystemThreads()// initial eventloop ,run select to get input data
SetKeyboardLayout ("default")
SetCursor (GetSystemCursor (IDC_ARROW))
mg_TerminateMgEtc ()
return 0;
三. 消息机制
消息队列数据结构所处的位置
typedef struct _MAINWIN
{
……
PMSGQUEUE pMessages;
……
}
3.1 取消息队列
PMSGQUEUE kernel_GetMsgQueue (HWND hWnd)
3.2 向消息队列存消息
BOOL kernel_QueueMessage (PMSGQUEUE msg_que, PMSG msg)
分为三种情况:1. 鼠标消息
2. 超时,空闲,光标闪烁
3. 其他消息
3.3 消息分类
1. 同步消息 SendSyncMessage()
SendMessage()
2. 异步消息 SendNotifyMessage()
PostMessage()