几个特殊的窗口

1.1第一个窗口-桌面窗口WM__FirstWin

第一个窗口在GUI_Init() 调用WM_CreateWindowAsChild-> _AddToLinList(hWin),在整个ucgui中扮演着桌面。

WM__FirstWin ucgui 窗口管理中扮演着重要角色-分别作为窗口链的链首和窗口树根。

1.2当前活动窗口

现场结构体

typedef struct {

/* Variables in LCD module */

LCD_COLORINDEX_UNION LCD;

LCD_RECT       ClipRect;

U8             DrawMode;

U8             SelLayer;

U8             TextStyle;

/* Variables in GL module */

GUI_RECT* pClipRect_HL;                /* High level clip rectangle ... Speed optimization so drawing routines can optimize */

U8        PenSize;

U8        PenShape;

U8        LineStyle;

U8        FillStyle;

/* Variables in GUICHAR module */

const GUI_FONT           GUI_UNI_PTR * pAFont;

const GUI_UC_ENC_APILIST * pUC_API;    /* Unicode encoding API */

I16P LBorder;

I16P DispPosX, DispPosY;

I16P DrawPosX, DrawPosY;

I16P TextMode, TextAlign;

GUI_COLOR Color, BkColor;           /* Required only when changing devices and for speed opt (caching) */

/* Variables in WM module */

#if GUI_WINSUPPORT

const GUI_RECT* WM__pUserClipRect;

GUI_HWIN hAWin;

int xOff, yOff;

#endif

/* Variables in MEMDEV module (with memory devices only) */

#if GUI_SUPPORT_DEVICES

const tLCDDEV_APIList* pDeviceAPI;  /* function pointers only */

GUI_HMEM    hDevData;

GUI_RECT    ClipRectPrev;

#endif

/* Variables in Anitaliasing module */

#if GUI_SUPPORT_AA

const tLCD_HL_APIList* pLCD_HL;     /* Required to reroute drawing (HLine & Pixel) to the AA module */

U8 AA_Factor;

U8 AA_HiResEnable;

#endif

} GUI_CONTEXT;

GUI_Context保存上下文切换环境。

GUI_Context.hAWin  当前活动窗口

当前活动窗口的改变通过 WM_SelectWindow();函数实现,当改变了当前活动窗口,
即改变了上下文环境,所以μ c/GUI 在 GUI_Exec();函数或 WM_Exec();函数中逐个窗口进
行重绘时需要先保存上下文环境, 然后在改变当前活动窗口为待重绘窗口从而修改上下文
环境,最后再恢复为原来的上下文环境,如下:
……
GUI_CONTEXT ContextOld;
GUI_SaveContext(&ContextOld); //保存上下文环境
WM_SelectWindow(hWin); //修改上下文环境
……//执行重绘操作
GUI_RestoreContext(&ContextOld);//恢复原来的上下文环境
……

1.3当前活动窗口之二—— WM__hATransWindow
当前活动窗口一般情况下即为 GUI_Context.hAWin 句柄代表的窗口,而且此时
WM__hATransWindow 为 0 ; 但 在 μ c/GUI 中 还 有 另 外 一 种 当 前 活 动 窗 口 — —
WM__hATransWindow, 它仅仅在 WM_SUPPORT_TRANSPARENCY 宏定义为 1 即用户支
持透明窗口而且重绘时又已经建立的透明窗口(透明窗口数 WM__TransWindowCnt 不为
0)时, WM__hATransWindow 将取代 Context.hAWin 成为当前活动窗口。所以,在μ c/GUI
的代码中经常可看到获得当前活动窗口的如下代码:
#if WM_SUPPORT_TRANSPARENCY
hWin = WM__hATransWindow ? WM__hATransWindow : GUI_Context.hAWin;
#else
hWin = GUI_Context.hAWin;
#endif
透明窗口(窗口属性集 Status 的透明位 WM_SF_HASTRANS 位为 1 的窗口)在μ c/GUI
中的功能类似于一个透明的玻璃,它总是显示那些在它后面被它遮挡的窗口的内容,但是透明窗口上也有一些内容需要显示——如透明窗口作为控件的控件窗口时需要显示控件的轮廓。 当前活动窗口之 WM__hATransWindow 便是为了实现透明窗口这种看不见而又实际存在的功能。透明窗口会影响修剪重绘。

1.4捕获窗口 WM__hCapture

用户对液晶屏操作中重要的一步便是由触点的坐标停留在哪个窗口的窗口区域 Rect
上便认为触点操作的是哪个窗口, 捕获窗口的作用在于: 当一个窗口被设置为捕获窗口时,
用户对液晶屏屏上面任何点的操作,无论该点是否在该窗口的窗口区域 Rect 内,都认为
是针对该窗口的操作——见 WM_HandlePID();函数中确定用户操作窗口的_Screen2Win();
函数。
static WM_HWIN _Screen2Win(GUI_PID_STATE* pState) {
if (WM__hCapture == 0) {
return WM_Screen2hWin(pState->x, pState->y);
}
return WM__hCapture;
}
譬如,我们再按着鼠标左键不送拖动 WPS 上面的拖动条 SCROLLBAR 时,当鼠标已
经偏离了拖动条所在的区域时,拖动条上的滑块仍然能够随着鼠标的拖动而滑动,这便是
借助了捕获窗口而实现的功能。
设置捕获窗口通过调用 WM_SetCapture(hObj,AutoRelease);函数实现,当完成功能时
便要释放捕获窗口,捕获窗口的释放通过调用 WM_ReleaseCapture();函数实现。捕获窗口
的释放分为两种情况——允许自动释放、不允许自动释放,是否允许自动释放由设置捕获
窗口时的传入参数 AutoRelease 决定。若当前捕获窗口允许自动释放时,当触点从液晶屏
上上任何位置(当μ c/GUI 设置了捕获窗口时, 对屏幕任何位置的操作都认为是对捕获窗口
的操作)释放/弹起时,将自动调用 WM_ReleaseCapture();函数释放捕获窗口;否则,只能
等到其他情况下调用 WM_ReleaseCapture();函数释放捕获窗口。
在μ c/GUI 中使用捕获窗口的控件包含如下几种: CHECKBOX、 FRAME、 HEADER、MENU、 SCROLLBAR、 SLIDER 等。

if ((WM_PID__StateLast.Pressed != StateNew.Pressed) && CHWin.hWin) {

WM_PID_STATE_CHANGED_INFO Info;

WM_Obj* pWin;

pWin = WM_H2P(CHWin.hWin);

Info.State     = StateNew.Pressed;

Info.StatePrev = WM_PID__StateLast.Pressed;

Info.x         = StateNew.x - pWin->Rect.x0;

Info.y         = StateNew.y - pWin->Rect.y0;

Msg.Data.p = &Info;

Msg.MsgId  = WM_PID_STATE_CHANGED;

WM__SendMessageIfEnabled(CHWin.hWin, &Msg);

}

1.5 焦点窗口 WM__hWinFocus

焦点窗口是μ c/GUI 中为了接收按键类型消息时专门设立的一项功能,它使得从键盘
上接收到的消息总是发往焦点窗口 WM__hWinFocus 上——见发送按键消息的函数
WM_OnKey();的定义。
int WM_OnKey(int Key, int Pressed) {
int r = 0;
WM_MESSAGE Msg;
WM_LOCK();
if (WM__hWinFocus != 0) {
WM_KEY_INFO Info;
Info.Key = Key;
Info.PressedCnt = Pressed;
Msg.MsgId = WM_KEY;
Msg.Data.p = &Info;
WM__SendMessage(WM__hWinFocus, &Msg);
r = 1;
}
WM_UNLOCK();
return r;
}
μ c/GUI 中任何时候最多只有一个焦点窗口, 用户可调用 WM_SetFocus(hWin);函数将
一个窗口设置为焦点窗口,该窗口句柄保存在 WM__hWinFocus 中。μ c/GUI 中并没有释放焦点窗口的函数,可以通过 WM_SetFocus();函数更改当前的焦点窗口,从而释放前一个

焦点窗口。但有的操作也可能会释放当前的焦点窗口,譬如调用 WM_DeleteWindow();函
数删除一个窗口且该窗口正好是焦点窗口时,会将 WM__hWinFocus 置为 0,从而此时μ
c/GUI 没有焦点窗口。
在μ c/GUI 中设置一个窗口为当前焦点窗口的方法有如下三种:
( 1)按压了 DIALOG 上的控件时且此时作为“ DIALOG 基础”的 FRAME 处于非活
动状态( FRAME 的控件属性集 Flags 的 FRAMEWIN_SF_ACTIVE 为 0),设置该控件为
焦点窗口,见 FRAME 的系统级回调函数_FRAMEWIN_Callback();对 WM_TOUCH_CHILD
消息的处理
( 2)设置了作为“ DIALOG 基础”的 FRAME 或 FRAME 的 Client 窗口或 WINDOW作为焦点窗口,它们均不能作为焦点窗口,所以将遍历以 FRAME 的 Client 窗口为树根的窗口子树,将焦点窗口转移给能够接受转移焦点的窗口(控件的 WIDGET 属性集 State 的可获焦点位 WIDGET_STATE_FOCUSSABLE 为 1),见三者的系统级回调函数中对消息WM_SET_FOCUS 的处理
( 3)用户在自己工程中调用 WM_SetFocus();设置某控件或窗口为焦点窗口

ucGUI 重绘分析(一)相关推荐

  1. Android视图状态及重绘流程分析,带你一步步深入了解View(三)

    在前面一篇文章中,我带着大家一起从源码的层面上分析了视图的绘制流程,了解了视图绘制流程中onMeasure.onLayout.onDraw这三个最重要步骤的工作原理,那么今天我们将继续对View进行深 ...

  2. void QWidget::update ()分析重绘事件激活

    void QWidget::update ()分析重绘事件激活 1看看手册中这段话 void QWidget::update () [slot] Updates the widget unless u ...

  3. Android View详解(三) 视图状态及重绘流程分析

    转载:http://blog.csdn.net/guolin_blog/article/details/17045157 [本文出自郭霖的博客] 在前面一篇文章中,我带着大家一起从源码的层面上分析了视 ...

  4. android之view重绘,跟着郭大侠一步步深入了解View第三篇之Android视图状态及重绘流程分析...

    作为对View进行学习的第三篇文章,本文将讲解一下视图状态以及重绘方面的知识. 相信大家在平时使用View的时候都会发现它是有状态的,比如说有一个按钮,普通状态下是一种效果,但是当手指按下的时候就会变 ...

  5. UCGUI编程三:背景窗口重绘

    官方例程如下: #include "GUI.h" #include "WM.H" #include "FRAMEWIN.H"static v ...

  6. Android视图重绘,使用invalidate还是requestLayout

    概述 在我们在进行自定义View的相关开发中,当我们更改了当前View的状态,比如大小,位置等,我们需要重新刷新整个界面,保证显示最新的状态.在Android中,让当前的视图重绘有两种方式,inval ...

  7. android 重绘如何能不闪一下屏幕_浏览器渲染机制——重绘重排

    性能优化中,减少重绘重排应该是一种很好的优化方式,我们具体看一下什么情况下会造成重绘重排,为什么减少重绘重排可以做到优化,怎么样减少重绘重排. 浏览器渲染过程 我们先看看当浏览器拿到服务端返回的资源时 ...

  8. winform 异步弹窗窗体_玩转控件:重写/重绘Dev中MessageBox弹窗控件

    很久没有更新博客了,本想着直接发一篇<手撕ERP>系列,从控件重写.重绘,到框架搭建,再到部分模块实现+业务的.但是每次动手的时候,都觉得难以下手.直接从数据库设计开始吧,模块设计还没定下 ...

  9. 玩转控件:重写/重绘Dev中MessageBox弹窗控件

    很久没有更新博客了,本想着直接发一篇<手撕ERP>系列,从控件重写.重绘,到框架搭建,再到部分模块实现+业务的.但是每次动手的时候,都觉得难以下手.直接从数据库设计开始吧,模块设计还没定下 ...

最新文章

  1. 瓜分百万奖金 | 科大讯飞A.I.开发者大赛医疗赛道
  2. mysql和oracle表的互导_oracle到mysql的导数据方式(适用于任意数据源之间的互导)...
  3. SQLServer异常捕获
  4. 2018陕西省赛K题[watermelon_planting]
  5. 长春分享网站服务器迁移,网站迁移公告
  6. springcloud不使用数据库微服务启动异常解决
  7. GTK之任意拖动窗口中的按钮
  8. JAVA设计模式 - 单例模式
  9. Magedu2_3 linux文件目录
  10. 20 ide配置快捷键补全提示 win
  11. OpenGL基础41:几何着色器
  12. 遗传算法导论(转载)
  13. 如何利用systrace分析Android App的死锁问题
  14. 阿里云服务器安装宝塔面板和配置安全组
  15. 中国信通院发布《区块链赋能新型智慧城市白皮书(2019年)》解读(附全文下载)
  16. 甘超波:NLP理解层次
  17. Android之bugly使用
  18. 有一种英语口音,不仅一般人儿听不懂,连各种语音识别都全军覆没…(新版)...
  19. 请简要说明西门子PLC1500的主要功能
  20. 恒生电子面试过程纪录

热门文章

  1. Jlink下载u-boot
  2. c 语言 清华大学郑莉,c 语言程序设计郑莉清华大学答案
  3. 影响计算机安全的诸多因素中,影响计算机设备安全的诸多因素中,影响较大的是()。...
  4. 小波变换图像融合_【第11期 图像处理与仿真】 基于改进谱残差显著性图的红外与可见光图像融合...
  5. 新政策后Jira还好用吗?国内类似Jira的工具价格对比!
  6. Android之手机也可以编程
  7. 独家!量子通信上市企业2020营收、净利润、研发费用排行榜
  8. linux怎么敲出特殊字符,如何在Linux中快速输入特殊字符
  9. 任务01-05-登录界面
  10. CSAPP笔记 第一章第二章