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

前言

在这里插入图片描述
在harib07d中鼠标移动到右侧后就不能再往右移了,大家有没有觉得别扭?没错,在Windows
中,鼠标应该可以向右或向下移动到画面之外隐藏起来的,可是我们的操作系统却还不能实现这样的功能,这多少有些遗憾。
这是为什么呢?我们还是先来看一看HariMain吧。

if (mx > binfo->scrnx - 16) {mx = binfo->scrnx - 16;
}
if (my > binfo->scrny - 16) {my = binfo->scrny - 16;
}

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

if (mx > binfo->scrnx - 1) {mx = binfo->scrnx - 1;
}
if (my > binfo->scrny - 1) {my = binfo->scrny - 1;
}

在这里插入图片描述
我们遇到了一个麻烦–只要图层一跑到画面的外面去就会出问题。那么我们赶紧进入到下
一节,看看怎么解决这个问题吧。

一、画面之外的支持

怎么才能让图层位于画面以外时也不出问题呢?因为只有sheet refesbsub函数在做把图层
内容写人VRAM的工作,所以我们决定把这个函数做得完美一些,让它不刷新画面以外的部分。

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:

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 。
大家还记得这个定义吗?

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中。

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

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

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也要修改

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个地方。

sheet_slide(shtctl,sht_back,00); -> 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,00,binfo->scrnx,48); -> sheet_refresh(sht_back,00,binfo->scrnx,48);
sheet_refresh(shtctl,sht_back,0161632); -> sheet_refresh(sht_back,0161632);
sheet_refresh(shtctl,sht_back,321632+15*832); -> sheet_refresh(sht_back,321632+15*832);
sheet_refresh(shtct1,sht_back,008016); -> sheet_refresh(sht_back,008016);
sheet_slide(shtctl,sht_mouse,mx,my); -> sheet_slide(sht_mouse,mx,my);

这样HariMain也稍稍变短了,太好了。
我们来“make run”一下看看,不错不错,运行正常。

2.读入数据

代码如下(示例):

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

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


三、显示窗口

我们现在做出来的图层构架,已经完全可以完成窗口的叠加处理了,所以下面我们就来尝试
一下制作窗口吧。
其实方法很简单,就像前面制作背景和鼠标那样,只要先准备一张图层,然后在图层缓冲
区内描绘一个貌似窗口的图就可以了。那么我们就来制作一个具有这种功能的函数
make_window8。

明天继续》。。。

总结

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/65938.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

物理知识1——电流

说起电流&#xff0c;应该从电荷说起&#xff0c;而说起电荷&#xff0c;应该从原子说起。 1 原子及其结构 常见的物质是由分子构成的&#xff0c;而分子又是由原子构成的&#xff0c;有的分子是由多个原子构成&#xff0c;有的分子只由一个原子构成。而原子的构成如图1所示。…

Android性能分析工具的比较

背景介绍 Systrace、Perfetto和Android Benchmarking Framework都是用于性能分析和优化的工具&#xff0c;但它们各自的用途、功能范围和适用场景有所不同。以下对它们进行详细的比较。 通常一次较完整的性能分析过程需要多工具的配合使用&#xff0c;往复迭代&#xff1a; …

Jupyter在运行上出现错误:ModuleNotFoundError: No module named ‘wordcloud‘

问题分析&#xff1a;显示Jupyter未安装这个模板 解决办法&#xff1a;在单元格内输入&#xff1a;!pip install wordcloud

大模型WebUI:Gradio全解系列8——Additional Features:补充特性(下)

大模型WebUI&#xff1a;Gradio全解系列8——Additional Features&#xff1a;补充特性&#xff08;下&#xff09; 前言本篇摘要8. Additional Features&#xff1a;补充特性8.5 嵌入托管 Spaces8.5.1 使用 Web Components 嵌入1. 嵌入步骤2. 定义嵌入的外观和行为 8.5.2 使用…

持续学习入门

参考视频&#xff08;一&#xff09; 【学无止境&#xff1a;深度连续学习】 背景 更新新的数据时&#xff0c;数据异步输入&#xff0c;会有灾难性遗忘 现有解决策略 &#xff08;1&#xff09;引入正则约束&#xff08;2&#xff09;设计合适的动态模型架构 &#xff…

【Cocos TypeScript 零基础 2.1】

目录 cocos常识新建动画添加组件 cocos 下载就不讲了,多的很 cocos 界面设置中文 新建一个2D项目 SIKI_学院_点击跳转 常识 竖屏 宽720 高1280 如果背景图确定是竖屏也可以根据背景图片大小来确定项目宽高 鼠标功能 左键 选中 滚轮 放大缩小 右键 移动视角位置 场景 双击…

局域网中单台交换机VLAN应用

网络拓扑 其中交换机接口类型都为access接口。 Ethernet 0/0/1 VLAN ID为10 Ethernet 0/0/2 VLAN ID为10 Ethernet 0/0/5 VLAN ID为20 Ethernet 0/0/6 VLAN ID为20 Host-1 ip为192.168.64.11/24 Host-2 ip为192.168.64.12/24 Host-3 ip为192.168.64.21/24 Host-4 ip为192.168…

Harbor仓库部署安装、向仓库推送,拉取镜像、容器的基础使用(超级详细,非常透彻)

Harbor 环境搭建笔记 作为新手&#xff0c;在搭建 Harbor 环境的过程中&#xff0c;我参考了大量资料&#xff0c;学到了很多宝贵的知识&#xff0c;但也遇到了不少挑战。虽然目前这套环境仅在测试环境中成功运行&#xff0c;但仍有许多细节需要完善。记录这些经验不仅有助于个…

活动预告 |【Part2】 Azure 在线技术公开课:迁移和保护 Windows Server 和 SQL Server 工作负载

课程介绍 通过 Microsoft Learn 免费参加 Microsoft Azure 在线技术公开课&#xff0c;掌握创造新机遇所需的技能&#xff0c;加快对 Microsoft 云技术的了解。参加我们举办的“迁移和保护 Windows Server 和 SQL Server 工作负载”活动&#xff0c;了解 Azure 如何为将工作负载…

PP模块部分BAPI函数

工艺路线 BAPI_ROUTING_CREATE 创建工艺路线 BAPI_ROUTING_EXISTENCE_CHECK 检查工艺路线是否存在 参考操作集 BAPI_REFSETOFOPERATIONS_CREATE 创建参考操作集 BAPI_REFSETOFOPR_EXISTENCE_CHK 检查参考操作集是否存在 计划订单 BAPI_PLANNEDORDER_CREATE 创建计划订单 BAPI…

nature reviews genetics | 需要更多的针对不同种族的癌症基因组图谱研究,促进精准治疗和维护治疗公平权益

–https://doi.org/10.1038/s41576-024-00796-w Genomic landscape of cancer in racially and ethnically diverse populations 研究团队和单位 Ulrike Peters–Public Health Sciences Division, Fred Hutchinson Cancer Center Claire E. Thomas–Public Health Scienc…

两个等号和三个等号(待查资料)

1太癫了&#xff0c;居然时要才行&#xff0c;都不行 2. 三等号的结果 .。。。。毁灭吧

SpringCloud源码分析-Gateway

Gateway核心原理&#xff0c;请求经过一系列的责任链最后到达服务端。

大模型—Ollama将Python函数作为参数传递,增强函数调用功能

Ollama将Python函数作为参数传递,增强函数调用功能 在最新版本的Ollama Python库中,现在可以将函数作为工具提供。该库现在也全面支持类型提示,并添加了新的例子。 开始使用 首先安装或升级Ollama Python库: pip install -U ollama将Python函数作为工具传递 定义一个Py…

智能商业分析 Quick BI

Quick BI 是阿里云提供的一款智能商业分析&#xff08;BI&#xff09;工具&#xff0c;旨在帮助企业快速获取业务洞察、优化决策过程、提升数据分析效率。通过强大的数据可视化和分析功能&#xff0c;Quick BI 能够帮助用户轻松连接多种数据源、创建多维度的报表和仪表盘&#…

折旧后将成本中心折旧费调整到订单中

背景&#xff1a;设备原作为通用设备&#xff0c;按成本中心折旧&#xff0c;在12月月结正常折旧后才明确为专用设备&#xff0c;需要按内部订单折旧。 问&#xff1a;折旧能不能冲销。 回复&#xff1a; 在SAP中&#xff0c;折旧凭证是无法直接冲销的。如果折旧计提有误&#…

开源的Vue低代码表单设计器 form-create-designer v3.2.9 版本发布,新增10多种功能

form-create-designer 是一款开源的低代码表单设计器&#xff0c;通过数据驱动表单渲染。可以通过拖拽的方式快速创建表单&#xff0c;提高开发者对表单的开发效率&#xff0c;节省开发者的时间。并广泛应用于在政务系统、OA系统、ERP系统、电商系统、流程管理等领域。 项目采…

Qt之简易音视频播放器设计(十五)

Qt开发 系列文章 - MediaPlayer&#xff08;十五&#xff09; 目录 前言 一、QMediaPlayer 二、实现方式 1.添加multimedia 2.创建类vedioplayer 3.UI设计 4.用户使用 5.效果演示 总结 前言 利用Qt进行音视频播放器设计&#xff0c;首先比较方便使用的是Qt自带的音视…

OpenCV-Python实战(13)——图像轮廓

一、找轮廓 cv2.findContours() contours,hierarchy cv2.findContours(image*,mode*,method*) contours&#xff1a;找到的所有轮廓数组&#xff0c;数组内的元素为轮廓像素点坐标。 hierarchy&#xff1a;轮廓间的层次关系。 image&#xff1a;二值图像&#xff08;cv2.t…

UVM:testbench architecture

uvm介绍 验证计划 验证平台 uvm phase uvm 仿真实例 uvm消息机制 父类和子类 uvm elements uvm component uvm message Uvm_info中小于verbosity数值的信息打印出来。