1.概述
GK所指的窗口是一块矩形显示区域,它没有装饰、控件、输入焦点、菜单等窗口常见组件和属性,它是复杂窗口的原始雏形。因此,GK中所述的窗口与GDD中的窗口应该区别对待,GDD中的窗口是在原始窗口为基础上,增加了各种装饰、控件、输入焦点的窗口,由GDD管理。说明:本文档中所述的窗口,如无特殊说明,一概是指GK管理的原始窗口。
2.Z序
在GK中,窗口在桌面上的排列顺序是按Z序方式排列。窗口的Z序,指明了窗口在重叠窗口堆中的位置,窗口堆沿着“Z”轴方向,从屏幕上垂直向屏幕外延伸。Z序顶部的窗口覆盖Z序底部的窗口。在DJYGUI中,窗口是按资源的形式组织。在系统资源树中,有一个名为“gkwindow”的根节点,该节点是所有窗口的共同祖先,由ModuleInstall_GK函数创建。每台显示器的桌面,是“gkwindow”资源的子节点。每个桌面窗口有一套Z序系统。
窗口在资源树中的组织和它在Z序中的位置关系如图 2-1所示。
图 2-1窗口组织和Z序
对窗口有关的资源结点的规则作如下说明:
1、同级窗口只使用前后结点,结点前一个为previous,后一个为next。
2、窗口存在父子关系,除桌面外其他窗口都有父窗口。
3、同级窗口中位于最前端的为父窗口指向的第一个窗口,其next指向同级的最后端窗口。
如图 2-1所示,从窗口的资源视图中可得出,桌面包含多个子结点,这些子结点是桌面的子窗口,而子窗口也可包含子窗口,即桌面的孙窗口。窗口的Z序视图中,Win6是窗口堆中Z序的最前端窗口,它会覆盖Z序中靠后的窗口。注意,子窗口有可能覆盖父窗口,也有可能被父窗口覆盖。例如,Win6是桌面的子窗口,覆盖桌面,而窗口win7~9是桌面的子窗口,但却被桌面遮盖。DJYGUI的这种特性,可用于特殊的显示效果,如利用子窗口来做背景或利用子窗口来实现异形窗口等。
2.1.优先级与坐标归属
HMI设计中,touch和mouse相关应用,必须查找点击/触摸笔位置属于哪个窗口,用户还可能会有些特别用途的窗口,不要求相应touch和mouse的操作。Djygui设定,优先级范围是-64(含)~-127之间的窗口,作为控制窗口,调用GK_ApiGetWinFromPt函数时,忽略这些窗口。
#define CN_ZPRIO_CTRL (-64)
#define CN_ZPRIO_CTRL_LIMIT (-127)
3.优先级
窗口的优先级决定窗口在Z序中的排列位置。
窗口的优先级可通过GKLIB提供的API设置,窗口优先级的设定规则如下:
1、同辈分的窗口中,优先级数值越小,优先级越高,在Z序中越靠前。
2、桌面的优先级为0,不可改变。优先级≤0的窗口,优先级高于父窗口,在Z序中排列在父窗口前面;优先级<0的窗口,优先级低于父窗口,在Z序中排列在父窗口后面。例如,11H图 21中win1优先级为0,覆盖桌面,win9优先级为1,被桌面覆盖。
3、任何一个窗口,连同其子孙窗口在Z轴中占据连续的区间,比如win22的优先级数小于win3,但其在Z轴中却被win3覆盖,因为其父窗口win2是被win3覆盖的。同样的道理,也可以解释win23能够优先于win1。
4.ROP属性
DJYGUI支持的光栅操作,包括二元光栅操作、alpha、透明色。二元光栅操作是指在使用GK在窗口画点、线和填充区域时,GK使用二元光栅操作码ROP2组合画笔或画刷像素和目标像素混合以得到新的目标像素。目前,GK支持16种二元光栅操作,与Windows二元光栅操作兼容。二元光栅详细介绍见3.3。
窗口的透明度用Alpha表示,在DJYGUI中,其值范围定义在0 - 255之间。Alpha的取值表示窗口的不透明属性,窗口alpha取值为0,表示窗口完全透明,alpha取值为255,表示窗口完全不透明,alpha值越大,越不透明。GK支持双Alpha混合运算,如表 21所示,S和D分别表示混合的两种颜色,As和Ad表示混合的两个alpha值,dst是最终计算的alpha值。
表 2-1 alpha混合运算
窗口透明色是指当窗口内需要填充的颜色与透明色相同时,窗口显示背景色。透明色是GK对Windows定义的Rop2Code的一个扩展。绘制光栅位图也可以执行设置透明色的操作,待绘制的位图中是透明色的像素在绘制过程中不显示,只显示背景色。
光栅属性RopMode是一个32位无符号数,各比特的含义如图 22所示。
作为窗口的属性时,忽略Rop2使能位,也不支持需要背景alpha参与的alpha码(CN_ALPHA_MODE_AsAdN和CN_ALPHA_MODE_AsAd)。
图 2-2 光栅属性设置
5.边界模式
窗口的边界模式是窗口显示边界受限制的属性,它影响窗口的受限边界和显示效果。窗口的边界模式分为受限和不受限两种。如果窗口边界模式为受限,则其边界受限于父窗口的边界限制;如果窗口模式为不受限,窗口将受限于祖先窗口中第一个边界模式为受限窗口的父窗口。
6.API说明
6.1.GK_ApiCreateDesktop:创建桌面
bool_t GK_ApiCreateDesktop(struct tagDisplayRsc *Display,
struct gkwin_rsc *Desktop,
s32 Width,s32 Height,u32 Color,
u32 BufMode)
头文件:
gkernel.h
参数:
Display:桌面的宿主显示器。
Desktop:新创建的桌面,保存数据结构所需,内存由调用者提供。
Width:桌面的宽度,小于显示器宽度则调整为显示器宽度。
Height:桌面的高度,小于显示器高度则调整为显示器高度。
Color:创建桌面时填充的颜色,要求颜色格式是真彩色。
BufMode:缓冲模式,见表 32。
返回值:
true:创建成功;false:创建失败
说明:
桌面是所有显示器的第一个窗口。每个显示器有且只有一个桌面,display的成员desktop指针指向其桌面。所有的显示器,必须先初始化,成功创建桌面后才能创建窗口,桌面的尺寸不能小于显示器的尺寸,但可以大于显示器尺寸。桌面在刷新screen的过程中和普通窗口是等同的。桌面的优先级只能是0。
6.2.GK_ApiGetDesktop:获取桌面
struct tagGkWinRsc *GK_ApiGetDesktop(char *DisplayName)
头文件:
gkernel.h
参数:
DisplayName:桌面所在显示器的名字。
返回值:
桌面指针,为NULL时表示未找到该名称桌面。
说明:
在djygui中,桌面也是普通窗口,它是第一个建立的窗口,只有建立desktop窗口后,才能创建其他窗口。同一个显示器上的所有其他窗口都是桌面的子孙窗口。
6.3.GK_ApiCreateGkwin:创建窗口
bool_t Gk_ApiCreateGkwin(struct tagGkWinRsc *Parent,
struct tagGkWinRsc *NewWin,
s32 Left,s32 Top,s32 Right,s32 Bottom,
u32 Color,u32 BufMode,
char *Name,u16 PixelFormat,u32 KeyColor
u32 BaseColor, u32 RopMode)
头文件:
gkernel.h
参数:
Parent:父窗口指针。
NewWin:新创建的窗口,保存数据结构所需内存,由调用者提供。
Left:新创建的窗口左边界,相对于父窗口。
Top:新创建的窗口上边界,相对于父窗口。
Right:新创建的窗口右边界,相对于父窗口。
Bottom:新创建的窗口下边界,相对于父窗口。
Color:创建窗口时填充的颜色,要求颜色格式是真彩色。
BufMode:缓冲模式,见表 32。
Name:新建窗口名称。
PixelFormat:像素格式,CN_SYS_PF_DISPLAY表示与显示器相同。
KeyColor:设定窗口透明色,要求颜色格式为真彩色。
BaseColor:灰度基色,(仅在PixelFormat == CN_SYS_PF_GRAY1 ~8时有用)。
RopMode:光栅操作码,即二元光栅操作、alpha和透明色属性。
返回值:
true:窗口创建成功;false:窗口创建失败。
说明:
新创建的窗口只是一个矩形区域,没有填充,也没有边框等一切装饰。新建窗口创建时默认优先级为0,其优先级可以调整。窗口的尺寸不受限制。新建窗口遗传父窗口的一些属性,如宿主显示器、直接写屏。窗口的像素格式可调,设置为CN_SYS_PF_DISPLAY表示与显示器相同。窗口的RopMode属性可设置为0,表示无光栅操作属性,同时可根据alpha、透明色设置相应属性,但窗口不支持二元光栅。
示例:
static struct tagGkWinRsc *desktop,gkwin1;
desktop = GK_ApiGetDesktop(“ili9325”);
GK_ApiCreateGkwin(desktop,&gkwin1,0,0,200,200,CN_COLOR_RED,
CN_WINBUF_NONE,“window1”,
CN_SYS_PF_DISPLAY, CN_COLOR_BLACK,
CN_COLOR_BLACK , 0 );
代码中,ili9325是显示器的名字。
上面的一段程序,在桌面上创建了一个名为window1的窗口,填充颜色为红色CN_COLOR_RED(0xff0000),缓冲模式是没有缓冲区(CN_WINBUF_NONE),只能进行直接写屏操作,窗口左上角、右下角坐标分别是(0,0)、(200,200),给定坐标是相对于父窗口的,窗口像素格式与显示器一致,窗口透明色和灰度基色为黑色(CN_COLOR_BLACK),窗口RopMode属性为0(无特殊效果)。
6.4.GK_ApiDestroyWin:销毁窗口
void GK_ApiDestroyWin(struct tagGkWinRsc *Gkwin)
头文件:
gkernel.h
参数:
Gkwin:目标窗口。
返回值:
无。
说明:
销毁窗口,同时销毁窗口的子孙窗口。
6.5.GK_ApiMoveWin:移动窗口
void gk_api_move_win(struct tagGkWinRsc *Gkwin,s32 Left,s32 Top,u32 SyncTime)
头文件:
gkernel.h
参数:
Gkwin:显示的目标窗口。
Left:窗口移动后的左上角坐标的横坐标,相对于父窗口。
Top:窗口移动后的左上角坐标的纵坐标,相对于父窗口。
SyncTime:见3.2章节。
返回值:
无。
说明:
改变窗口在父窗口内的相对位置,由于子窗口的坐标是相对于父窗口的,故移动窗口时,连子窗口一起移动。
6.6.GK_ApiSetBoundMode:设置边界模式
void GK_ApiSetBoundMode (struct tagGkWinRsc *Gkwin, bool_t Mode)
头文件:
gkernel.h
参数:
Gkwin:目标窗口。
Mode:窗口的边界模式,true为受限,false为不受限。
返回值:
无。
说明:
设定窗口的显示边界是否受父窗口限制,限制后,子窗口超出父窗口的部分将不予显示,桌面的直接子窗口默认受限,不能更改。
6.7.GK_ApiSetPrio:设置窗口显示优先级
void GK_ApiSetPrio(struct tagGkWinRsc *Gkwin, sfast_t Prio,u32 SyncTime)
头文件:
gkernel.h
参数:
Gkwin:目标窗口。
Prio:新优先级。
SyncTime:见3.2章节。
返回值:
无。
说明:
设置一个窗口的优先级,优先级决定当前窗口在同级窗口中z轴相对位置,数字越小,在z轴中越靠前,优先级<=0将覆盖父窗口,反之被父窗口覆盖。窗口改变优先级后,它在Z轴中的顺序可能会改变,屏幕内容也可能会改变。由于被改变优先级的窗口可能还有子窗口,所以,在z轴中被移动的,不是一个窗口,而是连续的一组窗口。桌面的优先级为0,不可改变。窗口设置的新优先级可以和原优先级相同,即便如此,显示效果也可能会改变。新设置的优先级需在合法范围里(-128 - 127)。
6.8.GK_ApiSetRopMode:设置光栅属性
bool_t GK_ApiSetRopMode(struct tagGkWinRsc *Gkwin,
u32 RopCode,u32 SyncTime)
头文件:
gkernel.h
参数:
Gkwin:目标窗口。
RopCode:光栅操作码,可以是扩展的光栅操作码,参见图 22。
SyncTime:见3.2章节。
返回值:
true:设置成功;false:设置失败。
说明:
非缓冲窗口和桌面不可修改光栅操作码。
6.9.GK_ApiSetTransparentColor:设置窗口透明色
bool_t GK_ApiSetTransparentColor(struct tagGkWinRsc *Gkwin, u32 KeyColor)
头文件:
gkernel.h
参数:
Gkwin:目标窗口。
KeyColor:要设置的透明色。
返回值:
true:设置成功;false:设置失败。
说明:
桌面不需要设置透明色。