30天自制操作系统日志第11天

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

操作系统实验日志学号20160810520姓名甘昆禄专业年级班级智能1601实验日期2018.12.05实验项目第11天:制作窗口一、实验主要内容1、为制作窗口做准备我们现在看到鼠标指针头有些地方指不到(最右边和最下面),但是我们应该要能实现鼠标可以点击屏幕的任何地方,所以我们要更改一下。为什么前面不修改而要留到现在才修改呢?一是我们的鼠标用了图层来表示了,就算之前修改了,现在也还要再修改一下。二就是为我们的窗口的制作做准备(我们的窗口也要看起来能移到外面去的效果)。所以我们修改一下鼠标到边界的限制条件。----而我们知道原来设置边界条件的作用就是防止鼠标移到外面(实际上显存是连续的,就像多条线组成面就是我们的屏幕),就会到下一行的位置。修改了边界限制也会出现这个“越界”的情况。如下图,所以我们还要对图层在边界外的进行不刷新处理。只有一个函数是能直接改变显存的,我们从根本下手,就修改sheet_refreshsub()函数在进行画面刷新之前,先判断是否已经超过了画面以外,超过画面外的部分不需要进行刷新操作(下面是关键部分的代码)//sheet.c中sheet_refreshsub()节选//判断,刷新像素的范围是否超出了画面if(vx00){vx0=0;}if(vy00){vy0=0;}if(vx1ctl-xsize){vx1=ctl-xsize;}if(vy1ctl-ysize){vy1=ctl-ysize;}很好,这样就可以了,以后移动窗口到画面外也可以正确实现了。诶,很多函数都有一个形参structSHTCTL*,每次调用函数都要传实参,有点麻烦,所以作者牺牲了一些内存,给每个图层都定义一个指向图层管理的指针,这样就可以减少函数的一个形参了。1、structSHEET中加入structSHTCTL*ctl//在图层的结构体定义structSHEET中,加入图层控制结构体指针structSHTCTL*ctlstructSHEET{unsignedchar*buf;intbxsize,bysize,vx0,vy0,col_inv,height,flags;structSHTCTL*ctl;//图层控制结构体指针structSHTCTL*ctl};2、对函数shtclt_init进行追加//追加内容:将ctl初始化为图层控制结构体for(i=0;iMAX_SHEETS;i++){ctl-sheets0[i].flags=0;/*FLAG=0表示该图层未被使用*/ctl-sheets0[i].ctl=ctl;/*指针ctl指向图层控制结构体*/}3、对函数sheet_undown进行修改//修改内容:将ctl初始化为图层控制结构体voidsheet_updown(structSHEET*sht,intheight){structSHTCTL*ctl=sht-ctl;/*指针ctl指向图层控制结构体*/inth,old=sht-height;/*记录设置前图层的高度*///........}这样我们再修改一下使用到structSHTCTL*作形参的函数,删掉这个形参就好了,就不用送实参进去了。这样我们的窗口准备就完善了。2、制作窗口为制作窗口做了很多准备,所以制作起来并实现功能也简单了很多,我们效仿设计鼠标的显示方法,也开辟了一块跟buf_mouse[256]一样的缓冲区*buf_win(动态内存),用来保存像素值,需要显示时,可以从里面读出并写到对应的显存里。voidmake_window8(unsignedchar*buf,intxsize,intysize,char*title){staticcharclosebtn[14][16]={//窗口关闭按钮X的的数组OOOOOOOOOOOOOOO@,OQQQQQQQQQQQQQ$@,OQQQQQQQQQQQQQ$@,OQQQ@@QQQQ@@QQ$@,OQQQQ@@QQ@@QQQ$@,OQQQQQ@@@@QQQQ$@,OQQQQQQ@@QQQQQ$@,OQQQQQ@@@@QQQQ$@,OQQQQ@@QQ@@QQQ$@,OQQQ@@QQQQ@@QQ$@,OQQQQQQQQQQQQQ$@,OQQQQQQQQQQQQQ$@,O$$$$$$$$$$$$$$@,@@@@@@@@@@@@@@@@};intx,y;charc;//窗口的颜色填充,(应该是前景)boxfill8(buf,xsize,COL8_C6C6C6,0,0,xsize-1,0);boxfill8(buf,xsize,COL8_FFFFFF,1,1,xsize-2,1);boxfill8(buf,xsize,COL8_C6C6C6,0,0,0,ysize-1);boxfill8(buf,xsize,COL8_FFFFFF,1,1,1,ysize-2);boxfill8(buf,xsize,COL8_848484,xsize-2,1,xsize-2,ysize-2);boxfill8(buf,xsize,COL8_000000,xsize-1,0,xsize-1,ysize-1);boxfill8(buf,xsize,COL8_C6C6C6,2,2,xsize-3,ysize-3);boxfill8(buf,xsize,COL8_000084,3,3,xsize-4,20);boxfill8(buf,xsize,COL8_848484,1,ysize-2,xsize-2,ysize-2);boxfill8(buf,xsize,COL8_000000,0,ysize-1,xsize-1,ysize-1);putfonts8_asc(buf,xsize,24,4,COL8_FFFFFF,title);//显示窗口的额标题for(y=0;y14;y++){for(x=0;x16;x++){//这里对关闭按钮的颜色进行设定c=closebtn[y][x];//关闭按钮数组中不同的字符用特定的显示颜色来显示出来if(c=='@'){c=COL8_000000;}elseif(c=='$'){c=COL8_848484;}elseif(c=='Q'){c=COL8_C6C6C6;}else{c=COL8_FFFFFF;}buf[(5+y)*xsize+(xsize-21+x)]=c;//把这个颜色的值,给VRAM缓冲区}}return;}这里就写好了制作窗口的函数,接下来我们只要在主函数上实现就好了://HariMain节选init_palette();//初始化调色板shtctl=shtctl_init(memman,binfo-vram,binfo-scrnx,binfo-scrny);sht_back=sheet_alloc(shtctl);sht_mouse=sheet_alloc(shtctl);sht_win=sheet_alloc(shtctl);//为窗口分配内存空间buf_back=(unsignedchar*)memman_alloc_4k(memman,binfo-scrnx*binfo-scrny);buf_win=(unsignedchar*)memman_alloc_4k(memman,160*68);sheet_setbuf(sht_back,buf_back,binfo-scrnx,binfo-scrny,-1);/*设置图层缓冲区,没有透明色*/sheet_setbuf(sht_mouse,buf_mouse,16,16,99);sheet_setbuf(sht_win,buf_win,160,68,-1);/*设置图层缓冲区,没有透明色*/init_screen8(buf_back,binfo-scrnx,binfo-scrny);//初始化屏幕界面init_mouse_cursor8(buf_mouse,99);//X按钮的功能键make_window8(buf_win,160,68,window);//制作窗口图层buf_winputfonts8_asc(buf_win,160,24,28,COL8_000000,Welcometo);//在图层buf_win中显示两串字符串putfonts8_asc(buf_win,160,24,44,COL8_000000,Haribote-OS!);sheet_slide(sht_back,0,0);//图层上下滑动的函数,因为要让鼠标图层在窗口图层上方移动mx=(binfo-scrnx-16)/2;/*这里把鼠标放在屏幕中间的位置*/my=(binfo-scrny-28-16)/2;sheet_slide(sht_mouse,mx,my);//设置鼠标图层的上下滑动sheet_slide(sht_win,80,72);//设置窗口图层sht_win的上下滑动sheet_updown(sht_back,0);//设定背景图层的高度为0(在最底层)sheet_updown(sht_win,1);//设置窗口图层的高度为1(在中间层)sheet_updown(sht_mouse,2);//设置鼠标图层的高度为2(在最上层)sprintf(s,(%3d,%3d),mx,my);//在背景层打印出坐标的位置putfonts8_asc(buf_back,binfo-scrnx,0,0,COL8_FFFFFF,s);sprintf(s,memory%dMBfree:%dKB,//打印出内存使用情况memtotal/(1024*1024),memman_total(memman)/1024);putfonts8_asc(buf_back,binfo-scrnx,0,32,COL8_FFFFFF,s);sheet_refresh(sht_back,0,0,binfo-scrnx,48);//刷新屏幕显示3、让窗口有个功能然后改进一下。这里作者给窗口一个计数的功能,程序自动计数。就是要让窗口里显示新定义的变量counter的值就好了。然后数字改变就刷新一下窗口里数值的范围就好了。//HariMain节选make_window8(buf_win,160,52,counter);//窗口标题:countersheet_slide(sht_back,0,0);//设置背景图层的上下滑动mx=(binfo-scrnx-16)/2;/*把鼠标放在屏幕中间*/my=(binfo-scrny-28-16)/2;sheet_slide(sht_mouse,mx,my);//鼠标图层的上下滑动sheet_slide(sht_win,80,72);//窗口图层的上下滑动sheet_updown(sht_back,0);//图层的高度sheet_updown(sht_win,1);sheet_updown(sht_mouse,2);sprintf(s,(%3d,%3d),mx,my);//输出坐标位置putfonts8_asc(buf_back,binfo-scrnx,0,0,COL8_FFFFFF,s);sprintf(s,memory%dMBfree:%dKB,memtotal/(1024*1024),memman_total(memman)/1024);putfonts8_asc(buf_back,binfo-scrnx,0,32,COL8_FFFFFF,s);sheet_refresh(sht_back,0,0,binfo-scrnx,48);//刷新显示界面诶,我们发现这里窗口其实改变的只有窗口里数值的内容,但是在这个范围内的图层全部都刷新了一遍,但其实我们只要刷新该图层以及它上边的图层(包括鼠标)就好了。那么又要改sheet_refreshsub()了,让它从当前图层开始刷新,所以要加一个形参表示当前图层高度h0。这样我们在循环处更改为:for(h=h0;h=ctl-top;h++)就好了,然后再一

1 / 19
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功