UCGUI分析视窗管理器初始化和重绘过程

1、WM_Init函数分析

void WM_Init(void) {
	if (!_IsInited) {
	  NextDrawWin = WM__FirstWin = WM_HWIN_NULL;
	  GUI_Context.WM__pUserClipRect = NULL;
	  WM__NumWindows = WM__NumInvalidWindows =0;
	  /* Make sure we have at least one window. This greatly simplifies the
		  drawing routines as they do not have to check if the window is valid.
	  */
    #if GUI_NUM_LAYERS == 1
      WM__ahDesktopWin[0] = WM_CreateWindow(0, 0, GUI_XMAX, GUI_YMAX, WM_CF_SHOW, cbBackWin, 0);//创建桌面窗体
      WM__aBkColor[0] = GUI_INVALID_COLOR;//桌面窗体背景色无效
      WM_InvalidateWindow(WM__ahDesktopWin[0]); //桌面窗体无效
    #else
    {
      int i;
      for (i = 0; i < GUI_NUM_LAYERS; i++) {
        WM__ahDesktopWin[i] = WM_CreateWindowAsChild(0, 0, GUI_XMAX, GUI_YMAX, WM_UNATTACHED, WM_CF_SHOW, cbBackWin, 0);
        WM__aBkColor[i] = GUI_INVALID_COLOR;
        WM_InvalidateWindow(WM__ahDesktopWin[i]); /* Required because a desktop window has no parent. */
      }
    }
    #endif
    //WM__CHWinModal和WM__CHWinLast添加到链表中
    WM__AddCriticalHandle(&WM__CHWinModal);
    WM__AddCriticalHandle(&WM__CHWinLast);
    #if GUI_SUPPORT_MOUSE
      WM__AddCriticalHandle(&WM__CHWinMouseOver);
    #endif

    WM_SelectWindow(WM__ahDesktopWin[0]);//选择桌面窗体
	  WM_Activate();//激活视窗管理器
    _IsInited =1;//初始标志设置为1
	}
}

2、 创建桌面窗体时是调用WM_CreateWindowAsChild。
①动态内存申请窗体句柄
②窗体总个数加1
③设置矩形区域和回到函数
④发送消息

2、 重绘调用过程

->GUI_Exec();
-->while (GUI_Exec1())
--->if (WM_Exec())
---->while (WM_Exec1())
----->_DrawNext();
------>if (WM__Paint(iWin, pWin))
------->WM__PaintWinAndOverlays(&Info);	
-------->_Paint1(hWin, pWin); 
//最后调用这部分代码,通过剪切算法重绘窗体。
WM_ITERATE_START(&pWin->InvalidRect) {
  Msg.hWin   = hWin;
  Msg.MsgId  = WM_PAINT;
  Msg.Data.p = (GUI_RECT*)&pWin->InvalidRect;
  WM_SetDefault();
  WM__SendMessage(hWin, &Msg);
} WM_ITERATE_END();			     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值