μ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.p = (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.p = (GUI_RECT*)&pWin->InvalidRect;
WM_SetDefault();
WM_SendMessage(hWin, &Msg);
} WM_ITERATE_END();
}
WM__PaintCallbackCnt--;
}
}
阅读(1339) | 评论(0) | 转发(0) |