30天自制操作系统第11天

②绘制map区域
【30天自制操作系统第11天】疑问:为什么sid不直接使用不是更方便吗
③改写函数,使其可以使用map
对照map来刷新vram的话 , 就只刷新被修改的图层就可以了,所以通过参数h0和h1来指定被刷新的图层 。
④修改调用函数的函数:
因为该函数不改变上下层关系、不对图层做移动和变换,所以无需重写map
⑤修改调用函数的函数:
因为图层要移动,所以涉及了对map的重写 。在该函数中,首先重写map,分别对应移动前后的图层,然后调用函数 。在移动前的地方,只针对上层图层移走之后而露出的下层图层进行重绘就可以了 。在移动目的地处重绘了一张移动走过去的图层 。
⑥修改调用函数的函数:
当所有的函数都修改成功后,再运行就没什么问题了.
二、问题(在上面的内容也有详细的解释)
1、 添加一个窗口图层有哪些步骤?(格式:文字说明+对应代码)
(1)?制作绘制窗口的函数,即对窗口大小、像素值等的初始化;
(2)?定义图层包(结构体),建立图层(SHEET),建立缓冲区buf(地址)
(3)?初始化图层
(4)?为窗口图层分配内存,窗口大小为160*52
(5)?设置窗口图层的缓冲区大小和透明色
(6)?调用窗口函数和显示函数,给窗口定义初始首坐标
(7)设置可上下左右移动窗口图层函数 , 即设置图层显示位置的起始坐标
(8)设置窗口图层高度
2、 教材202页,为什么鼠标移动到最右边后左边会出现鼠标图案?
鼠标移动有两步:对原位置进行刷新、对新位置刷新 。
在刚开始的时候作者为了让操作系统更加符合实际,能够让鼠标从边界出去 , 所以改动了鼠标移动的边界,使鼠标可以在右边隐藏起来 。通过这个代码实现的
但是之前为了显示鼠标图层,函数会把图层内容写入到VRAM中,因此,即使鼠标图层的一部分处在了画面之外,函数依然会刷新图层,包括画面以外的部分,但在右边已经没法写入到VRAM中,函数会自动将画面外的图层部分写入到左边所对应的VRAM中 。所以鼠标移动最右边后,左边会出现鼠标图案,但在画面中的部分在每次移动之后都会刷新 。按照上面这个代码的修改,会导致刷新的像素点往后偏移16位(相当于往右),所以在屏幕左边会出现鼠标 。对刷新图层来说,传入的参数vx0=mx和vx1>xsize,对新图层来说,也是vx0=mx和vx1>xize,而且老图层和新图层的vx1值是相同的 , 因为当我们把鼠标放到最右边的时候,传入的mx都是同一个值,所以计算出的vx1也是同一个值(mx+16),这个时候两次调用的bx1相同,会先刷新一次老的 , 再刷新一次新的,那还是在原来的位置,所以鼠标只能在左边的固定范围内出现 。
3、 教材216页,每个图层的sid是如何设置的?具体数值等于多少?举例说明 , 建议编程打印sid进行验证 。

30天自制操作系统第11天

文章插图
用图层结构体数组对应标号元素的首地址减去图层结构体数组的首地址(跟图层高度根本没有关系) 。实际上sid是一个地址,是sheet ID的缩写 。
每个放一个图层信息进来占据一个结构体数组(假设每个元素的大小为3字节,再假设结构体体数组首地址为0X00 。) 。放了一个 , 那么第0个元素首地址就是结构体数组的首地址 , 这时sid=0;?第二个图层进来 , 就是第一个元素,首地址0X03 , sid=0X03-0X00=3;依次类推,根据图层进来的顺序,依次是0、3、6、9…… 。所以sid的大小只和图层的顺序和元素的大小有关,和图层高度没有关系 。
4、 教材216-217页,结合代码,解释刷新函数()的参数和实现逻辑 。
5、 教材217页,结合代码,解释滑动函数()的参数和实现逻辑 , 注意内部调用和时的传参,特别是高度参数,为什么这样传 。
这样传的原因是,只绘制了中间变化的图层 , 而不需要重新绘制鼠标图层,消除了鼠标因为自身不停的被覆盖再绘制所产生的闪烁 。
三、程序设计创新点
除了窗口的扩大、缩小、关闭、拖动,还实现的创新为:
1、描述创新点1:实现鼠标双击功能
2、描述创新点2:和一样,当鼠标移动到右上角的3个图标,图标颜色加深 。
效果图:
3、创新3:可以自由拖动窗口大小
四、实验心得体会
这次实验做的事情不多,就是先对以前的代码完善了一下之后,又新建了一个窗口图层,然后又实现了在这个窗口图层上显示文字、计数 , 然后又解决了因为刷新带来的闪烁问题 。解决闪烁问题的时候最开始就是对需要刷新的图层的数目做了适当的减少 , 然后又引入了一个map,这样刷新的时候就可以只刷新属于该图层的露出来的部分,这样还顺便使代码的执行效率增强了 。一点一点跟着作者的思路感觉并不难,但是当我想要回过头一点一点想清楚整套代码的架构时 , 感觉好多内容都被忘记了,所以做好笔记还是蛮重要的 。