美文网首页
minigui 4.0 源代码分析(七)

minigui 4.0 源代码分析(七)

作者: RonZheng2010 | 来源:发表于2020-11-25 09:25 被阅读0次

    1. 线程

    1.1 SystemThreads()

    SystemThreads()创建三个线程,它们的过程分别是DesktopMain()、TimerEntry()和EventLoop()。

    1.2 DesktopMain()

    DesktopMain()创建HWND_DESKTOP窗口,并处理它的消息。

    • 调用mg_InitMsgQueueThisThread()创建属于该线程的消息队列MSGQUEUE。

    • 调用init_desktop_win()。其中,

      • 创建MAINWIN实例。这个实例是一个本地静态变量sg_desktop_win。
      static MAINWIN sg_desktop_win;
      
      • 指定其消息队列刚创建的消息队列。
      • 指定DesktopWinProc()为窗口过程。
      • 指定__mg_def_renderer为渲染器。
      WINDOW_ELEMENT_RENDERER * __mg_def_renderer = &__mg_wnd_rdr_classic;
      
      • 将窗口保存在全局变量__mg_dsk_win和__mg_hwd_desktop中。
      PMAINWIN __mg_dsk_win;
      HWND __mg_hwnd_desktop;
      
      • 直接调用窗口过程DesktopWinProc(),处理MSG_STARTSESSION消息。其中初始化窗口进一步的处理函数集。
      • 向窗口投递MSG_ERASEDESKTOP消息。DesktopWinProc()处理消息时,绘制背景。
      • 最后在循环中,调用GetMessage()得到消息,调用DesktopWinProc()处理它们。

    处理MSG_STARTSESSION消息的步骤如下。

    • 调用GetSysCharset()得到字符集。
    • 调用DESKTOPOS::init()设置进一步的处理函数。包括创建DEF_CONTEXT实例,加载背景图、位置等。
    • 创建菜单。

    处理MSG_ERASEDESKTOP消息的步骤如下。

    • 调用DESKTOPOPS::paint_desktop()绘制背景。其中调用SetBrushColor()设置背景色,调用FillBox()用背景色填充。

    1.3 EventLoop()

    EventLoop()从输入设备中读取事件并解析,相应向HWND_DESKTOP窗口的队列中投递消息。

    • 调用IAL_WaitEvent()读取事件,也就是XVFBEVENT结构。
    • 根据XVFBEVENT()的内容,构造消息。并调用QueueDeskMessage()投递消息。

    1.4 TimerEntry()

    TimerEntry()与窗口的定时器消息有关。在循环中执行以下步骤。

    • 调用select()等待一段时间。
    • 调用__mg_timer_action(),向HWND_DESKTOP窗口中投递消息,并调用sem_post()通知其消息队列的读者“有消息到达”。

    相关文章

      网友评论

          本文标题:minigui 4.0 源代码分析(七)

          本文链接:https://www.haomeiwen.com/subject/sycpiktx.html