4 用鼠标关闭窗口(harib21d)
现在我们已经实现了窗口的移动,这次就来实现关闭窗口的功能吧。我们的窗口上面已经有了一个“×”按钮,看到它大家都想按一下吧(笑)?
判断是否点击了“×”按钮的方法,和之前窗口移动时判断是否点击到标题栏的方法是一样的,而且点击后的程序结束处理,也可以参考强制结束部分的代码。嗯,这样看上去还挺容易的。
■■■■■
我们添加了11行代码,这样应该可以搞定了。
本次的bootpack.c节选
void HariMain(void)
{
(中略)
for (;;) {
(中略)
if (fifo32_status(&fifo) == 0) {
(中略)
} else {
(中略)
if (256 <= i && i <= 511) { /*键盘数据*/
(中略)
} else if (512 <= i && i <= 767) { /*鼠标数据*/
if (mouse_decode(&mdec, i - 512) != 0) {
/*鼠标指针移动*/
(中略)
if ((mdec.btn & 0x01) != 0) {
/*按下左键*/
if (mmx < 0) {
/*如果处于通常模式*/
/*按照从上到下的顺序寻找鼠标所指向的图层*/
for (j = shtctl->top - 1; j > 0; j--) {
(中略)
if (0 <= x && x < sht->bxsize && 0 <= y && y < sht->bysize) {
if (sht->buf[y * sht->bxsize + x] != sht->col_inv) {
sheet_updown(sht, shtctl->top - 1);
if (3 <= x && x < sht->bxsize - 3 && 3 <= y && y < 21) {
(中略)
}
/*从此开始*/ if (sht->bxsize - 21 <= x && x < sht->bxsize - 5 && 5 <= y && y < 19) {
/*点击“×”按钮*/
if (sht->task != 0) { /*该窗口是否为应用程序窗口?*/
cons = (struct CONSOLE *) *((int *) 0x0fec);
cons_putstr0(cons, "\nBreak(mouse) :\n");
io_cli(); /*强制结束处理中禁止切换任务*/
task_cons->tss.eax = (int)
&(task_cons->tss.esp0);
task_cons->tss.eip = (int) asm_end_app;
io_sti();
}
/*到此结束*/ }
break;
}
}
}
} else {
/*如果处于窗口移动模式*/
(中略)
}
} else {
/*没有按下左键*/
(中略)
}
}
} else if (i <= 1) { /*光标用定时器*/
(中略)
}
}
}
}
应该不难吧?那么程序的讲解就到此为止了哦。
将上面的程序“make run”一下,结果如下。看,成功了!
![]() | ![]() | |
点击这里的话…… | 窗口就关掉了 | |