Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1013552
  • 博文数量: 238
  • 博客积分: 2842
  • 博客等级: 少校
  • 技术积分: 2765
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-16 00:20
个人简介

stdlf

文章分类

全部博文(238)

文章存档

2013年(6)

2012年(13)

2011年(82)

2010年(89)

2009年(48)

我的朋友

分类:

2010-03-07 16:48:01

μC/GUI-v3.90a学习笔记5
在FRAMEWIN_CreateEx创建函数中首先将WinFlags |= WM_CF_LATE_CLIP;
表示"Paint绘制时,剪切计算始终在_FRAMEWIN_Callback中自己完成---内部控件很多时,能够显著提高效率",
不由WM_Exec1()->_DrawNext()->_Paint()->WM__PaintWinAndOverlays()->_Paint1()函数完成剪切域计算,
static void _Paint1(WM_HWIN hWin, WM_Obj* pWin) {
  int Status = pWin->Status;
  if ((pWin->cb != NULL) && (Status & WM_SF_ISVIS)) {
    WM_MESSAGE Msg;
    WM__PaintCallbackCnt++;
    if (Status & WM_SF_LATE_CLIP) {
 
//说明该窗体要自己完成整个剪切计算[gliethttp]
 
//比如FrameWin控件,FrameWin回调函数piant消息绘制时,如果调用函数GUI_Clear(),
 
//那么FrameWin内部控件部分不会被擦除,而是根据剪切域窄条擦除.
 
//这样不用反复发送WM_SendMessage()消息,在WM_PAINT处理中一次搞定
      Msg.hWin = hWin;
      Msg.MsgId = WM_PAINT;
      Msg.Data.= (GUI_RECT*)&pWin->InvalidRect;
      WM_SetDefault();
      WM_SendMessage(hWin, &Msg);
    } else {
      WM_ITERATE_START(&pWin->InvalidRect) {
 
//剪切域仅仅由_Paint1提供,hWin的回调函数WM_PAINT消息处理时,[gliethttp]
 
//如果还有剪切域计算的调用,那么因为++_ClipContext.EntranceCnt > 1所以将直接返回1,
 
//所以在hWin的回调函数,WM_PAINT消息处理中使用的剪切域窄条,将是_Paint1计算出来的值 
 
//比如MULTIPAGE控件,MULTIPAGE回调函数piant消息绘制时,如果调用函数GUI_Clear(),
 
//那么它不会再计算剪切域,而是直接使用_Paint1计算出来的剪切域,来避开内部控件所在区域
 
//如果有很多窄条剪切域,那么会反复发送消息WM_SendMessage(),效率不如WM_SF_LATE_CLIP属性
 
//所以我觉得,如果一个内部有很多控件的父窗体,为了提高效率,它的属性应该设置成WM_SF_LATE_CLIP
        Msg.hWin = hWin;
        Msg.MsgId = WM_PAINT;
        Msg.Data.= (GUI_RECT*)&pWin->InvalidRect;
        WM_SetDefault();
        WM_SendMessage(hWin, &Msg);
      } WM_ITERATE_END();
    }
    WM__PaintCallbackCnt--;
  }
}
阅读(1339) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~