SmlOS九-窗口控制功能
大致简介
在现代的操作系统中,窗口管理是一个非常复杂的功能。
但是,作为一个合格的toy os,实现的能显示,能拖动就好了。
大致原理就是:
每个窗口就是大小不一的矩形图层,在背景的这个大矩形上,可以进行移动和相互覆盖或者部分覆盖的操作。
最终展示的画面其实都是计算出来的一幅画。
拖动显示原理
以鼠标的拖动为例,我们怎么实现鼠标的拖动显示的呢?
鼠标也是一个16*16的矩形图层,假设我们现在只有两个图层,一个是鼠标图层,一个是背景图层。
在我们之前已经收到了鼠标移动的中断解析,假如鼠标向右移动16个位置,那么我们该如何显示呢。
其实就两步:
* 1.在原位置矩形中,从背景图层中把相应位置的像素填充进去
* 2.把鼠标矩形,在绘制到新位置的矩形上去。
这样在快速刷新的情况下,看起来就是鼠标的拖动效果了。
当然,窗口管理仅有拖动是不够的,还需要以下基本功能.
- 透明色支持
- (比如鼠标是需要透明色的)
- 是否是顶层图层
- (鼠标就是顶层图层,不然移到其他窗口下面去了)
- 窗口高度设定
- (比如说你点击了一个窗口,这个窗口的高度就应该是变高的,然后根据高度绘制界面)
- 避免全界面刷新
- (在鼠标的例子中,我们也只是刷新了两个小矩形窗口而已,这里主要是为了效率考虑)
- 窗口隐藏
- (窗口关闭和最小化也是需要处理的)
窗口图层相关结构
图层管理表:
struct SHTCTL
{
unsigned char *vram, *map;
int xsize, ysize, top;
struct SHEET *p_sheets[MAX_SHEETS];
struct SHEET sheets[MAX_SHEETS];
};
- vram: 图像缓冲区首地址
- xsize, ysize: 分辨率的x和y
- sheets: 图层指针数组, 指向sheets0中各个图层
- sheets0: 图层数组, 存放各个图层结构
单个图层结构体如下:
struct SHEET
{
unsigned char *buf;
int bxsize, bysize, vx0, vy0, col_inv, height, flags;
struct SHTCTL *ctl;
};
- buf:是记录图层上所描画内容的地址
-
bxsize, bysize: 图层的行数和列数
-
vx0, vy0: 图层左上角的坐标
-
col_inv: 图层的透明色色号
-
height: 图层的高度
-
flags: 记录图层各种状态信息
窗口图层管理结构的初始化
建立在内存分配功能实现的基础上,首先从内存中分配足够大的内存空间,也为图层地图分配了内存空间。
遍历所有图层,初始化所有的图层的使用标志为未使用,且把sheet管理的结构体指向自身。
窗口分配
图层的分配比较简单,主要是遍历图层管理表 ,查找第一个未使用的图层,即Flag=0的图层。
找到之后,该图层的使用状态时使用,并且高度设置为-1,即不显示,最后返回该图层地址,如果失败返回0.
窗口刷新
图层的刷新考虑到很多的算法设计,系统设计中,对于图层的设置都不会刷新全部的显示内容,这样的算法效率太低,所以只会刷新相关需要显示的相关区域。
还有很多具体细节比如怎么移动,覆盖了部分窗口,覆盖了全部窗口,窗口超出了界面等就不一一展示了。
发表评论
要发表评论,您必须先登录。