文章目录

  • 一、实验主要内容
    • 1、 内容1:鼠标显示问题
    • 2、 内容2: 实现画面外的支持
    • 3、内容3: shtctl指定省略
    • 4、 内容4: 显示窗口
    • 5、 内容5:小实验
    • 6、 内容6:高速计数器
    • 7、 内容7:消除闪烁(1)
    • 8、 内容8:消除闪烁(2)
  • 二、遇到的问题及解决方法
    • 1、 描述问题1:制作一个图像窗口的步骤?
    • 2、 描述问题2:为什么图层移动时新位置只需要刷新图层本身就行了?
  • 三、程序设计创新点
    • 1、 描述创新点1,实现一个画图工具

一、实验主要内容

1、 内容1:鼠标显示问题

重点总结:修改鼠标移动功能,使鼠标可以向右或向下移动到画面之外隐藏起来。
(1)修改鼠标位置修正代码
原鼠标修正代码如下图所示:

先修改成如下内容,使鼠标绝大部分能够超出画面下侧和右侧:

(2)结果

很奇怪,只要鼠标图层到画面外侧时就会出现问题。

2、 内容2: 实现画面外的支持

重点总结:在修改鼠标位置矫正程序使得鼠标能够隐藏在右侧和下侧边框后,出现了画面显示问题。修改图层刷新函数sheet_refreshsub,实现不刷新超出画面范围部分图层。
(1)更改图层刷新函数,让它不刷新画面以外的部分

Vx0, vx1, vy0, vy1表示图层的边界坐标。当( Vx0 || vy0 < 0) 时,将对应部分修改为0。当( vx1 || vy1 > srn->x/y )时,将对应部分修改为边界值。
(2)结果

3、内容3: shtctl指定省略

重点总结:图层函数要求必须指定ctl,太麻烦了。于是在结构体SHEET中加入ctl,改善此问题
(1) 在结构体SHEET中加入ctl

(2)修改图层函数

4、 内容4: 显示窗口

重点总结:尝试制作窗口。和制作背景与鼠标类似,需要先准备一张图层,然后再缓冲区内描绘窗口图像。
(问题:制作一个图像窗口的步骤?)
(1)定义图层与缓冲区变量

(2)准备图层并初始化缓冲区

(3)设置图层透明色

(4)画图写字

其中画图就是通过将图形矩阵通过if判断将不同颜色写入缓冲区。然后通过boxfill函数再进行初始的边界设置。
(5)设置图层位置

(6)设置图层高度

(7)结果

5、 内容5:小实验

重点总结:在内容4的基础上,把窗口图层放在最上面,光标图层放在其次,会变成什么样?
(1)调换鼠标与窗口

(2)结果

6、 内容6:高速计数器

重点总结: 做一个能够计数,并将技术结果显示出来的窗口。通过新建一个窗口,并在窗口中显示计数结果就可以实现一个简单的计数器了。
(1)实现一个计数器
定义计数变量:

创建一个新的counter窗口

在窗口上显示计数结果:

(2)结果

成功实现了一个计数器,但是屏幕上显示的内容总是在闪烁。

7、 内容7:消除闪烁(1)

重点总结: 为什么会出现闪烁?如果图层的内容没有发生变化却也要刷新就会很浪费。因此可以仅对refresh对象及其以上的图层进行刷新就可以了。
(1)更新图层刷新函数sheet_refreshsub

从循环遍历所有图层变成只遍历从h0到top的图层,极好的减少了需要刷新图层的数量。因此需要增加一个函数参数h表示刷新图层的高度。
因为更新了sheet_refreshsub函数因此需要更新使用到它的函数。
(2)sheet_refresh函数

(3)sheet_slide函数

(4)sheet_updow函数

图层移动时可能会导致下面的图层露出,所以需要从下面的节点刷新。
当变换高度时,当old > height时:因为变换后低于当前的图层在变换前也低于当前图层,因此无需对当前图层进行刷新。只需要对height+1高度开始的图层进行刷新即可。

当 old < height时:因为原先部分高于当前的图层会相对降低,因此需要从当前高度height其开始刷新。
记住,优化后仅刷新refresh本身及其以上图层。
(5)结果

数字不再闪烁,但是当鼠标靠近数字时,鼠标又出现了闪烁现象。

8、 内容8:消除闪烁(2)

重点总结: 鼠标闪烁是因为一会儿描绘一会儿消除造成的。因此在刷新窗口时避开鼠标所在地方对VRAM进行写入处理,这样速度也能响应提高。
(1)定义地图map

Map用于表示画面上的点是那个图层的像素:

(2)地图刷新sheet_refreshmap函数

Map刷新函数与图层刷新函数类似,只是需要额外计算图层编号sid,并将所属位置像素标记位sid。Map刷新完毕后,屏幕中各像素就有了各自对应的图层了。

(3)图层刷新sheet_refreshsub函数

相对于之前的图层刷新函数,因为已经通过map指定了每个像素的归属,因此只需要刷新指定图层即可。

因为更新了图层刷新函数,因此也要更新使用到其的函数
(4)图层移动sheet_slide函数

图层在旧位置处消失,因此在移动前的地方较低的图层可能会露出,因此需要更新从0开始的map,然后刷新从0 -> height-1高度的图层
图层在新位置处出现,因为在低于新位置的图层也低于旧位置的图层,因此仍然会被覆盖。所以只需要刷新从height开始的map,然后刷新当前图层即可(较高图层的覆盖在map刷新时就实现了)。
(问题:为什么图层移动时新位置只需要刷新图层本身就行了?)
理解:较低图层的露出需要map刷新与sheet刷新并举。而较高图层的覆盖只需要map刷新后就能实现。这也是为什么移动到较低位置后,只需要刷新图层本身的原因

(5)图层换高度sheet_updown函数


(6)结果

鼠标和数字都不再闪烁,我们成功消除了闪烁!

二、遇到的问题及解决方法

填写说明:分条目列出本次的实验过程中遇到的问题和解决方法(可注明是哪位同学帮忙解决问题),描述问题时应配上相关的截图和标记,描述解决方法时应先分析出现该问题的原因再讲解决方法,尽量详细。

1、 描述问题1:制作一个图像窗口的步骤?

(1)定义图层与缓冲区变量

(2)准备图层并初始化缓冲区

(3)设置图层透明色

(4)画图写字

其中画图就是通过将图形矩阵通过if判断将不同颜色写入缓冲区。然后通过boxfill函数再进行初始的边界设置。
(5)设置图层位置

(6)设置图层高度

2、 描述问题2:为什么图层移动时新位置只需要刷新图层本身就行了?

较低图层的露出需要map刷新与sheet刷新并举。而较高图层的覆盖只需要map刷新后就能实现。这也是为什么移动到较低位置后,只需要刷新图层本身的原因

三、程序设计创新点

填写说明:分条目列出本次实验过程中对教材的哪些部分进行了创新或者修改,写清楚为什么要这样做,这么做会得到怎样的结果等,附上关键代码和截图。这部分是重点,占实验日志总分的20%。

1、 描述创新点1,实现一个画图工具

(1) 内容描述
Step1:设计颜色版图标

Step2:实现画笔功能
点击颜色板图表,能够在主界面通过左键画画
通过点击不同颜色位置,实现不同颜色画笔


Step3:实现橡皮擦功能
设计橡皮擦图案,并在点击橡皮擦图案后,将鼠标颜色设为背景色,从而实现擦拭功能。


Step4:实现画笔、橡皮擦粗细缩放功能
首先设计画笔粗细缩放标志+、-

再设计点击缩放设置

注意需要限制橡皮擦的最大最小值。范围是 r ∈ [ 1 , 8 ] 可选项1、2、4、8

Step5:放置矩形
首先设计矩形生成标记,点击标记后能够在指定位置生成默认大小的矩形

矩形可以通过新建一个矩形图层实现,矩形图层背景颜色为明灰色。点击后在draw图层中心生成初始大小为len*wid的矩形。

(1)实现矩形移动
设置两个标志位pressFirst, pressCon。当在矩形区域内按下鼠标左键时,记录鼠标状态。根据鼠标状态以及相对位置修改移动后的位置。


Step6:矩阵颜色的填充

当在矩形图窗中按下右键,将会按照当前画笔颜色对矩形填充。

30天自制操作系统——Day11实验报告相关推荐

  1. 30天自制操作系统——Day7实验报告

    一.实验主要内容 1. 内容1:获得按键编码 重点总结:改善程序,让程序在按下一个键后不结束,而是把按键的编码显示出来 (1)int.c 1. 函数功能 检测键盘IRQ1是否发生中断,发生中断后接受按 ...

  2. 索骥馆-DIY操作系统之《30天自制操作系统》扫描版[PDF]

    内容简介: <30天自制操作系统>是一本兼具趣味性.实用性与学习性的操作系统图书.作者从计算机的构造.汇编语言.C语言开始解说,让读者在实践中掌握算法.在这本书的指导下,从零编写所有代码, ...

  3. 30天自制操作系统第三天

    操作系统实验日志3 学号 201708010402 姓名 徐冰娜 专业年级班级 实验日期 2019.9.28 实验项目 第3天:进入32位模式并导入C语言 智能1701 30天自制操作系统第三天 操作 ...

  4. 30天自制操作系统 - 取代软盘,用U盘写入引导扇区

    背景 作者是在2006年发布此书的(翻译版是在2012年在中国发售),当时可能还能找到带有软驱的计算机.但是时过境迁,现在已经不存在这种老古董东西了. 简单总结一下学习到第三天的一些更变. 更变 书籍 ...

  5. 《30天自制操作系统》第9天

    第九天 内存管理 1.整理源文件 这一节只是进行了代码整理,把鼠标键盘相关的内容转移到了特定的文件里. 2.内存容量检查(1) 要做内存管理,首先得知道内存的容量,怎么知道内存的容量呢?BIOS可以告 ...

  6. 30天自制操作系统——第2天

    操作系统实验日志 实验日期 2018/9/29 实验项目 第2天:汇编语言学习与Makefile入门 一.实验主要内容 (一)汇编 1.关键代码 运行结果: 2.相关汇编指令的解释 指令 格式 含义 ...

  7. 30天自制操作系统第五天

    操作系统实验日志5 第5天:结构体.文字显示与GDT/IDT初始化 30天自制操作系统第五天 操作系统实验日志5 一.实验主要内容 1. 内容1:接收启动信息 2. 内容2:使用结构体 3. 内容3: ...

  8. 为什么《30天自制操作系统》封面中的猫是两只尾巴

    刚刚在一社区,发了一贴,被指出一问题,询一高人,得一答案.这便是我没有关注到的封面上的那只猫,我想这也是很多读者没有关注到的.因为在我微博的200转发贴中,并没有人提到封面中的猫为何有两只尾巴.于是咨 ...

  9. 发布在《30天自制操作系统》之前的帮助阅读贴

    说明:这是8月15日即将上市的一本新书,本文的摘选也可以命名为<30天自制操作系统>上市之前必读.本书幽默,有趣,可以说是技术书里的幽默书,让您读起来绝对不会感到乏味.在本书上市之前,您一 ...

最新文章

  1. 在C4C UI里嵌入CRM WebClient UI
  2. python创建提示用户输入查询条件_pythone-2:用户登录并根据条件查询
  3. ionic2开发的仿外卖点餐系统(Ionic2+Angular2
  4. Linux中自带正则表达式应用举例
  5. lms自适应滤波器实现噪声干扰的语音恢复_使用VoiceFliter-Lite改进设备上的语音识别...
  6. 我爱计算机视觉精华文章分类汇总(2018年12月13日)
  7. Android动画效果
  8. Mybatis foreach 使用与理解(支持Array,List,HashMap及相互嵌套)
  9. Steger算法(Line_Gauss)-光条中心线提取(基于Hessian矩阵)
  10. python如何对excel排序_Python操作Excel之分组排序
  11. linux锐捷校园网认证失败,Ubuntu中校园网锐捷认证用mentohust解决版本过低问题
  12. 一套很好的51单片机教程,云龙51单片机视频教程(王云)
  13. 80 多个免费编程字体,你喜欢哪种?
  14. 看漫画与动漫选他们吧,两款多源怪,再也不愁找不到了
  15. android 动态表情包,动态表情包下载免费
  16. 【OpenCV】图片几何特征提取
  17. windows双系统如何删除ubuntu系统并重装
  18. 项目启动图片验证码加载不出来
  19. 【Meetup预告】OpenMLDB+37手游:一键查收实时特征计算场景案例及进阶使用攻略
  20. android 监听系统广播

热门文章

  1. 如何卸载windows的系统服务
  2. 黎明前的黑暗~~~~~~
  3. (附源码)计算机毕业设计SSM智能仓储进出货管理系统
  4. [统计学教程] 第六章 抽样推断
  5. 图像滤波【一】:从高斯滤波到引导滤波
  6. 远程桌面如何保存密码--解决每次登录都提示输入密码的问题
  7. 平台 恒鑫 机器人_压铸取放件机器人系统-恒鑫智能
  8. 免费DSP开发板,你想要吗?
  9. 计算机和游戏建立不了连接,两台未联网的Win7电脑如何建立局域网游戏
  10. 基于51单片机的模拟洗衣机控制程序