30天开发操作系统 第 11 天 --制作窗口

前言

在harib07d中鼠标移动到右侧后就不能再往右移了,大家有没有觉得别扭?没错,在Windows

中,鼠标应该可以向右或向下移动到画面之外隐藏起来的,可是我们的操作系统却还不能实现这样的功能,这多少有些遗憾。

这是为什么呢?我们还是先来看一看HariMain吧。

c 复制代码
if (mx > binfo->scrnx - 16) {
	mx = binfo->scrnx - 16;
}
if (my > binfo->scrny - 16) {
	my = binfo->scrny - 16;
}

之所以出现这种情况,就是因为有上面这段代码。那么我们来修改一下。

c 复制代码
if (mx > binfo->scrnx - 1) {
	mx = binfo->scrnx - 1;
}
if (my > binfo->scrny - 1) {
	my = binfo->scrny - 1;
}

我们遇到了一个麻烦--只要图层一跑到画面的外面去就会出问题。那么我们赶紧进入到下

一节,看看怎么解决这个问题吧。

一、画面之外的支持

怎么才能让图层位于画面以外时也不出问题呢?因为只有sheet refesbsub函数在做把图层

内容写人VRAM的工作,所以我们决定把这个函数做得完美一些,让它不刷新画面以外的部分。

c 复制代码
void sheet_refreshsub(struct SHTCTL *ctl, int vx0, int vy0, int vx1, int vy1)
{
	int h, bx, by, vx, vy, bx0, by0, bx1, by1;
	unsigned char *buf, c, *vram = ctl->vram;
	struct SHEET *sht;
	/* refresh刷新范围超出画面,就修正 */
	if (vx0 < 0) { vx0 = 0; }
	if (vy0 < 0) { vy0 = 0; }
	if (vx1 > ctl->xsize) { vx1 = ctl->xsize; }
	if (vy1 > ctl->ysize) { vy1 = ctl->ysize; }
	for (h = 0; h <= ctl->top; h++) {
		...
	}
	return;
}

运行成功啦!只稍作修改就解决了问题,我们太厉害了。

二、优化程序

我们先来看一看bootpack.h:

c 复制代码
struct SHTCTL *shtctl_init(struct MEMMAN *memman, unsigned char *vram, int xsize, int ysize);
struct SHEET *sheet_alloc(struct SHTCTL *ctl);
void sheet_setbuf(struct SHEET *sht, unsigned char *buf, int xsize, int ysize, int col_inv);
void sheet_updown(struct SHTCTL *ctl, struct SHEET *sht, int height);
void sheet_refresh(struct SHTCTL *ctl, struct SHEET *sht, int bx0, int by0, int bx1, int by1);
void sheet_slide(struct SHTCTL *ctl, struct SHEET *sht, int vx0, int vy0);
void sheet_free(struct SHTCTL *ctl, struct SHEET *sht);

这些个sheet_updown函数不太都用到了SHTCTL ,因为仅是上下移动图层,就必须指定ctl,太麻烦。

我们打算要改善这个问题,首先我们需要在struct SHEET中加人struct SHTCTL*ctl 。

大家还记得这个定义吗?

c 复制代码
struct SHTCTL {
	unsigned char *vram;
	int xsize, ysize, top;
	struct SHEET *sheets[MAX_SHEETS];
	struct SHEET sheets0[MAX_SHEETS];
};

变量vram、xsize、ysize代表VRAM的地址和画面的大小,top代表最上面图层的高度。sheets0这个结构体用于存放我们准备的256个图层的信息。而sheets是记忆地址变量的领域,所以相应地也要先准备256份。由于sheets0中的图层顺序混乱,所以我们把它们按照高度进行升序排列,然后将其地址写入sheets中。

c 复制代码
struct SHEET {
	unsigned char *buf;
	int bxsize, bysize, vx0, vy0, col_inv, height, flags;
	struct SHTCTL *ctl;
};

然后对函数shtctl_init也进行追加,仅追加1行即可

c 复制代码
struct SHTCTL *shtctl_init(struct MEMMAN *memman, unsigned char *vram, int xsize, int ysize)
{
	struct SHTCTL *ctl;
	int i;
	ctl = (struct SHTCTL *) memman_alloc_4k(memman, sizeof (struct SHTCTL));
	if (ctl == 0) {
		goto err;
	}
	ctl->vram = vram;
	ctl->xsize = xsize;
	ctl->ysize = ysize;
	ctl->top = -1; /* 没有图层 */
	for (i = 0; i < MAX_SHEETS; i++) {
		ctl->sheets0[i].flags = 0; /* 未使用标志 */
		ctl->sheets0[i].ctl = ctl; /* 记录所属 */  -- 就在这里
	}
err:
	return ctl;
}

函数sheet updown也要修改

c 复制代码
void sheet_updown(struct SHEET *sht, int height)
{
	struct SHTCTL *ctl = sht->ctl;
	int h, old = sht->height; /* 设置前的高度记录下来 */
	...
}

好了,完成了。这样一来在sheet_updown函数里就可以不指定ctl了。函数变得比之前好用了。

最后,我们将sheet_refresh、sheet_slide、sheet_free这几个函数全部修改一下,让它们都不用指定ctl(就是把ctl换成了sht->ctl😁)。

由于我们进行了以上这些变更,所以要在bootpack.c的HariMain中,把相应的shtctl(这个现在是在shtctl_init中初始化)也删掉。

一共要修改9个地方。

c 复制代码
sheet_slide(shtctl,sht_back,0,0); -> sheet_slide(sht_back,0,0);
sheet_slide(shtcl,sht_mouse,mx,my); -> sheet_slide(sht_mouse,mx,my);
sheet_updow(shtctl,sht_back,0); -> sheet_updown(sht_back,0);
sheet_updown(shtctl,sht_mouse,1); ->sheet_updown(sht_mouse,1);
sheet_refresh(shtctl,sht_back,0,0,binfo->scrnx,48); -> sheet_refresh(sht_back,0,0,binfo->scrnx,48);
sheet_refresh(shtctl,sht_back,0,16,16,32); -> sheet_refresh(sht_back,0,16,16,32);
sheet_refresh(shtctl,sht_back,32,16,32+15*8,32); -> sheet_refresh(sht_back,32,16,32+15*8,32);
sheet_refresh(shtct1,sht_back,0,0,80,16); -> sheet_refresh(sht_back,0,0,80,16);
sheet_slide(shtctl,sht_mouse,mx,my); -> sheet_slide(sht_mouse,mx,my);

这样HariMain也稍稍变短了,太好了。

我们来"make run"一下看看,不错不错,运行正常。

2.读入数据

代码如下(示例):

c 复制代码
data = pd.read_csv(
    'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())

该处使用的url网络请求的数据。


三、显示窗口

我们现在做出来的图层构架,已经完全可以完成窗口的叠加处理了,所以下面我们就来尝试

一下制作窗口吧。

其实方法很简单,就像前面制作背景和鼠标那样,只要先准备一张图层,然后在图层缓冲

区内描绘一个貌似窗口的图就可以了。那么我们就来制作一个具有这种功能的函数

make_window8。

明天继续》。。。

总结

提示:这里对文章进行总结:

例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

相关推荐
一只小萌新.12 分钟前
【Python学习(六)——While、for、循环控制、指数爆炸】
开发语言·python·学习
SuperSwaggySUP14 分钟前
挑战春招找到java后端实习第三天(1.4)
java·开发语言
莹雨潇潇21 分钟前
约瑟夫问题
数据结构·c++·算法
兔爷眼红了28 分钟前
前端开发语言涉及到 的注解(Annotations)
开发语言·后端·golang
꧁坚持很酷꧂41 分钟前
Qt天气预报系统设计界面布局第四部分右边
开发语言·qt
花仙子16643 分钟前
C#运动控制系统:雷赛控制卡实用完整例子 C#雷赛开发快速入门 C#雷赛运动控制系统实战例子 C#快速开发雷赛控制卡
开发语言·算法·c#
AmosCloud20131 小时前
3.5 字典树(Trie)与后缀树
开发语言·数据结构·链表·c#
Tiger Z1 小时前
R 语言科研绘图第 13 期 --- 柱状图-堆叠
开发语言·程序人生·r语言·贴图
我命由我123451 小时前
26.Java Lock 接口(synchronized 关键字回顾、可重入锁快速入门、Lock 对比 synchronized)
java·开发语言·后端·java-ee·intellij-idea·intellij idea·后端开发
nixiaoge1 小时前
组网实训实现
开发语言·php