前言
在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提供了大量能使我们快速便捷地处理数据的函数和方法。