2 窗口切换(2)(harib21b)

这次我们来实现Windows那样的用鼠标点击来切换窗口的功能。这个功能会让task_a中窗口移动的功能失效,不过没关系,我们在下一节会重新编写窗口移动功能的,大家不必担心。

当鼠标点击画面的某个地方时,怎样才能知道鼠标所点击到的是哪个图层呢?我们需要按照从上到下的顺序,判断鼠标的位置落在哪个图层的范围内,并且还需要确保该位置不是透明色区域。

将上述思路用程序写出来就是下面这样。

本次的bootpack.c节选

  1. void HariMain(void)
  2. {
  3. (中略)
  4. int j, x, y; /*这里!*/
  5. struct SHEET *sht; /*这里!*/
  6. (中略)
  7. for (;;) {
  8. (中略)
  9. if (fifo32_status(&fifo) == 0) {
  10. (中略)
  11. } else {
  12. (中略)
  13. if (256 <= i && i <= 511) { /*键盘数据*/
  14. (中略)
  15. } else if (512 <= i && i <= 767) { /*鼠标数据*/
  16. if (mouse_decode(&mdec, i - 512) != 0) {
  17. /*鼠标指针移动*/
  18. (中略)
  19. if ((mdec.btn & 0x01) != 0) {
  20. /*按下左键*/
  21. /*从此开始*/ /*按照从上到下的顺序寻找鼠标所指向的图层*/
  22. for (j = shtctl->top - 1; j > 0; j--) {
  23. sht = shtctl->sheets[j];
  24. x = mx - sht->vx0;
  25. y = my - sht->vy0;
  26. if (0 <= x && x < sht->bxsize && 0 <= y && y < sht->bysize) {
  27. if (sht->buf[y * sht->bxsize + x] != sht->col_inv) {
  28. sheet_updown(sht, shtctl->top - 1);
  29. break;
  30. }
  31. }
  32. /*到此结束*/ }
  33. }
  34. }
  35. } else if (i <= 1) { /*光标用定时器*/
  36. (中略)
  37. }
  38. }
  39. }
  40. }

我们来“make run”,然后运行lines.hrb,点击一个窗口试试看。哦哦!成功了!

2 窗口切换(2)(harib21b) - 图1

通过点击将task_a切换到最上面

如果点击命令行窗口将其切换到最上面的话,别的窗口就全都被遮住了,这样无法用鼠标点击切换了,还好我们可以按F11将被遮住的窗口切换出来,F11这个功能还真是挺方便的呢。