30天自制操作系统------窗口操作

来源:互联网 发布:淘宝主图背景图创意图 编辑:程序博客网 时间:2024/06/11 22:21

一个多任务的操作系统会有很多窗口,进行任务切换的同时窗口操作肯定也是必不可少的。

 

一、窗口切换

我们可以使用键盘或者鼠标进行窗口的切换。

自制的操作系统的窗口都是一个个图层,每个图层都是有各自的高度的,高度最低的是操作系统的背景图层(也就是桌面),高度最高的是鼠标图层。

我们使用按键F11来作为窗口切换的按键,按下F11,我们就将从下面数第2个图层的高度提升为shtctl->top-1shtctl->top这个高度存放的是最上面一个图层的高度,这个图层永远是绘制鼠标用的。

使用键盘进行窗口切换还是不够方便,最好是可以使用鼠标进行窗口的切换。使用鼠标进行窗口切换的思路主要就是判断鼠标的坐标位于哪个窗口的图层内了,由于多个图层很有可能重叠在一起,所以鼠标很有可能位于多个图层内,在这种情况下,我们按照图层从上到下的顺序寻找鼠标所指向的图层,最先找到的图层就是鼠标指向的图层,找到之后,将该图层的高度提升为shtctl->top-1

 

二、窗口移动

窗口移动是基于鼠标移动进行的,当鼠标按下鼠标左键时,鼠标位于所选中图层的标题栏,那么此时该图层跟随鼠标一起移动。操作系统系统的桌面就是个二维的平面,只要记录下鼠标移动的横坐标以及纵坐标,就可以计算出其移动的距离,图层也移动同样的距离即可。

 

三、用鼠标关闭窗口

我们的操作系统已经实现了使用SHIFT+F1强制关闭应用程序的功能,但是我们更倾向于使用鼠标点击窗口上的“X”按钮关闭窗口的方法。

其实这个功能实现起来也很简单,因为我们的窗口标题栏上的X”都是一样大的,而且都位于标题栏的右侧,只要判断鼠标按下时其坐标是否是在“X”按钮上,就可以实现使用鼠标关闭窗口的功能。

 

四、将输入切换到应用程序窗口

原本我们的Tab键的功能是切换task_a的窗口以及console的窗口,但是现在窗口多了起来,我们对Tab键的功能稍加修改,使其切换所有的窗口,其功能是将键盘输入切换到当前输入窗口(key_win)的下面一层窗口中,若当前窗口为最下层,则切换到最上层窗口。

task_a以及console的窗口都是操作系统产生的,它们是需要进行光标闪烁控制的,而且不能强制关闭结束,但是目前的应用程序不需要进行光标闪烁,可以强制关闭结束,所以我们需要想办法进行区分。因为这些任务都有各自的图层,所以我们可以通过SHEET结构中的flags成员的0x10比特位来分辨窗口是不是由应用程序生成的,当该比特位为1时,表示该窗口是应用程序窗口;使用SHEET结构中的flags成员的0x20比特位来分辨该窗口是否需要光标控制。

将输入切换到输入窗口时,也要改变输入窗口标题栏的颜色。

 

五、用鼠标切换输入窗口

我们已经实现了使用鼠标来切换窗口的功能和将输入切换到应用程序窗口的功能,只要将将输入切换到应用程序的功能添加到使用鼠标来切换窗口的功能中即可。

 

六、定时器API

   关于定时器的部分,操作系统已经实现了定时器的功能,但是应用程序没有办法使用,我们可以使用API的方式使得应用程序也可以使用定时器。

首先我们需要确定关于定时器操作的API的功能号以及参数,然后按照以前编写API的方式编写API

要注意应用程序结束之后一定要取消应用程序中的定时器,要不然该定时器就会给命令行本身发送数据,而命令行本身肯定是一头雾水。

原创粉丝点击