美高梅网址注册-澳门mgm4858集团登录网址
做最好的网站
来自 澳门mgm4858集团登录网址 2019-10-03 21:14 的文章
当前位置: 美高梅网址注册 > 澳门mgm4858集团登录网址 > 正文

并且使得鼠标点击窗口关闭按钮后,操作系统的

我们已经在操作系统层面实现了定时器的功能,但应用程序还不能调用,接下来我们写定时器的API,先设计API。

我们设计一个在窗口中画点的API

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

我们应该在应用程序关闭之后也把定时器给关掉。

在窗口还没有关闭的时候,命令行窗口的光标不需要闪烁。实现这个功能的思路是这样:我们用定时器控制光标的闪烁,定时器超时产生中断如果消息队列接收的消息是0,则将光标置为白色,再设置定时器,接收到的消息为1.当接收到消息1时,则将光标置为黑色,再设置定时器,接收到的消息为0。当暂时不需要光标闪烁时,可以将定时器接收到的数据全部置为1。

这里写图片描述

我们用这样的方法判断鼠标点击时到底是处于窗口的哪个位置,突然想起其实我们在显示窗口的时时候也画了个关闭窗口的按钮,只是一直没有用起来。我们可以用相同的方法判断鼠标点击是否在关闭窗口按钮的位置,如果在这个位置那么就关闭窗口。

  • edx = 15
  • eax = 0 没有键盘输入时返回-1, 不休眠;1休眠直到发生键盘输入
  • eax = 输入的字符编码

更多技术信息,包括操作系统,编译器,面试算法,机器学习,人工智能,请关照我的公众号:

上面两个keywin_off和keywin_on是控制窗口标题栏颜色和task_a的光标和task_a窗口的光标。

else if (edx == 11) { sht = (struct SHEET *) ebx; sht->buf[sht->bxsize * edi + esi] = eax; sheet_refresh(sht, esi, edi, esi + 1, edi + 1);}

完成这项代码后,系统就可以支持鼠标与窗口的互动了,我们系统的灵活性和丰富性又增强了不少。

要实现点击鼠标切换窗口基本的逻辑是这样。当鼠标点击画面的某个地方时,我们要按照从上到下的顺序,判断鼠标的位置落在哪个图层的范围内,并且还需要考虑该位置不是不透明的。

澳门mgm4858集团登录网址 1

  • edx = 17
  • ebx = 定时器的句柄
  • eax = 发送的数据

新增代码的逻辑在注释中已经详细说明了,把上面的代码编译如内核后,运行起来效果如下:

先写一个关闭定时器的函数

这个API接收一个参数,如果参数为0,表示马上查询现在是否有键盘输入,如果没有则返回-1,不休眠。如果参数为1,则表示如果没有键盘输入那么任务将体眠,直到有键盘输入后返回键盘输入值。

澳门mgm4858集团登录网址 2

实际一个应用程序可以设置任意多个定时器,所以当应用程序结束的时候应该关闭应用程序设置的所有定时器。为了方便我们给TIMER结构体中新设一个标志位,用来标志这个定时器是否在应用程序结束时也一起销毁。

澳门mgm4858集团登录网址 3

我们之前已经实现了task_a窗口和console窗口的互相切换,使用了key_to变理,现在使用命令行也可以打开一个窗口,那么我们切换窗口的逻辑就要变化了。先实现tab切换窗口的功能:如果按下tab将键盘输入窗口切换到当前输入窗口的下一层,如果当前输入窗口是最下层那么换切到了上层。如果当前输入窗口关闭,那么当前输入窗口变为下一层。

  • edx = 12
  • ebx = 窗口句柄
  • eax = x0
  • ecx = y0
  • esi = x1
  • edi = y1

以前控制台窗口始终位于桌面的左上角,上面代码完成我,我们可以通过鼠标把控制台窗体拖拽到任何位置。

美高梅网址注册,再定一个函数用于取消所有函数

  • edx = 13
  • ebx = 窗口句柄
  • eax = x0
  • ecx = y0
  • esi = x1
  • edi = y1
  • ebp = 色号

这里写图片描述

如果想要让鼠标点击窗口就把所点击的窗口切换为当前窗口也很简单。

操作系统的可执行文件中0x0000存放数据段的大小,0x0020位置存放malloc空间的起始地址这两个我们这一节中要用起来。为了能让应用程序自己分配空间而不是一开始就定义一个很大的数组。我们在目标文件进行链接的时候指定操作系统应该为应用程序分配多少空间,这个空间会与应用程序栈的大小相加写入可执行文件的0x0000位置。

有关鼠标的处理,都在函数show_mouse_info里面实现,所以我们要修改该函数的代码:

这段程序先的开一个窗口,然后设置定时器,超时时间为1秒,超时之后向消息队列发送数据为128,如果应用程序接收到的中断不是128说明用户按下了其他键,那就退出循环,程序结束。

if (i == 256 + 0x3b && key_shift != 0 && task_cons->tss.ss0 != 0) { /* Shift+F1 */ cons = (struct CONSOLE *) * 0x0fec); cons_putstr0(cons, "nBreak :n"); io_cli(); task_cons->tss.eax =  &(task_cons->tss.esp0); task_cons->tss.eip =  asm_end_app; io_sti(); }
static int mx = 0, my = 0, mmx = -1, mmy = -1;
....
static struct SHEET *mouse_clicked_sht;
#include <stdio.h>int api_openwin(char *buf, int xsiz, int ysiz, int col_inv, char *title);void api_putstrwin(int win, int x, int y, int col, int len, char *str);void api_boxfilwin(int win, int x0, int y0, int x1, int y1, int col);void api_initmalloc;char *api_malloc;int api_getkey;int api_alloctimer;void api_inittimer(int timer, int data);void api_settimer(int timer, int time);void api_end;void HariMain{ char *buf, s[12]; int win, timer, sec = 0, min = 0, hou = 0; api_initmalloc(); buf = api_malloc; win = api_openwin(buf, 150, 50, -1, "noodle"); timer = api_alloctimer(); api_inittimer(timer, 128); for  { sprintf(s, "%5d:%02d:%02d", hou, min, sec); api_boxfilwin(win, 28, 27, 115, 41, 7 ); api_putstrwin(win, 28, 27, 0 /* �• */, 11, s); api_settimer(timer, 100); /* 1秒*/ if (api_getkey != 128) { break; } sec++; if (sec == 60) { sec = 0; min++; if (min == 60) { min = 0; hou++; } } } api_end();

也就是说强制强束应用程序的时候只是把task_console任务重新回到应用程序结束之前的寄存器状态。内存空间已经被收回,但是窗口却还在屏幕上。

void CMain(void) {
....
for(;;) {
    if (fifo8_status(&keyinfo) + fifo8_status(&mouseinfo) +
           fifo8_status(&timerinfo) == 0) {
        ....
        if (data == 0x10) {
           sheet_updown(shtctl, shtctl->sheets[1], shtctl->top - 1);
        }
        ....
   }
}
....
}

这段程序跟之前比想差不多,首先从最上的图层开始一直往下找,直到点到鼠标点击的点所对应的图层,如果找到则把现在的图层key_off。再把找到的图层key_on就行了。

在窗口上画线API

澳门mgm4858集团登录网址 4

本文由美高梅网址注册发布于澳门mgm4858集团登录网址,转载请注明出处:并且使得鼠标点击窗口关闭按钮后,操作系统的

关键词: