2 窗口切换(2)(harib21b)
这次我们来实现Windows那样的用鼠标点击来切换窗口的功能。这个功能会让task_a中窗口移动的功能失效,不过没关系,我们在下一节会重新编写窗口移动功能的,大家不必担心。
当鼠标点击画面的某个地方时,怎样才能知道鼠标所点击到的是哪个图层呢?我们需要按照从上到下的顺序,判断鼠标的位置落在哪个图层的范围内,并且还需要确保该位置不是透明色区域。
将上述思路用程序写出来就是下面这样。
本次的bootpack.c节选
void HariMain(void)
{
(中略)
int j, x, y; /*这里!*/
struct SHEET *sht; /*这里!*/
(中略)
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) {
/*按下左键*/
/*从此开始*/ /*按照从上到下的顺序寻找鼠标所指向的图层*/
for (j = shtctl->top - 1; j > 0; j--) {
sht = shtctl->sheets[j];
x = mx - sht->vx0;
y = my - sht->vy0;
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);
break;
}
}
/*到此结束*/ }
}
}
} else if (i <= 1) { /*光标用定时器*/
(中略)
}
}
}
}
我们来“make run”,然后运行lines.hrb,点击一个窗口试试看。哦哦!成功了!
通过点击将task_a切换到最上面
如果点击命令行窗口将其切换到最上面的话,别的窗口就全都被遮住了,这样无法用鼠标点击切换了,还好我们可以按F11将被遮住的窗口切换出来,F11这个功能还真是挺方便的呢。