MiniGUI原理分析

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()

 

 

 

没有更多推荐了,返回首页