4 用鼠标关闭窗口(harib21d)

现在我们已经实现了窗口的移动,这次就来实现关闭窗口的功能吧。我们的窗口上面已经有了一个“×”按钮,看到它大家都想按一下吧(笑)?

判断是否点击了“×”按钮的方法,和之前窗口移动时判断是否点击到标题栏的方法是一样的,而且点击后的程序结束处理,也可以参考强制结束部分的代码。嗯,这样看上去还挺容易的。

■■■■■

我们添加了11行代码,这样应该可以搞定了。

本次的bootpack.c节选

  1. void HariMain(void)
  2. {
  3. (中略)
  4. for (;;) {
  5. (中略)
  6. if (fifo32_status(&fifo) == 0) {
  7. (中略)
  8. } else {
  9. (中略)
  10. if (256 <= i && i <= 511) { /*键盘数据*/
  11. (中略)
  12. } else if (512 <= i && i <= 767) { /*鼠标数据*/
  13. if (mouse_decode(&mdec, i - 512) != 0) {
  14. /*鼠标指针移动*/
  15. (中略)
  16. if ((mdec.btn & 0x01) != 0) {
  17. /*按下左键*/
  18. if (mmx < 0) {
  19. /*如果处于通常模式*/
  20. /*按照从上到下的顺序寻找鼠标所指向的图层*/
  21. for (j = shtctl->top - 1; j > 0; j--) {
  22. (中略)
  23. if (0 <= x && x < sht->bxsize && 0 <= y && y < sht->bysize) {
  24. if (sht->buf[y * sht->bxsize + x] != sht->col_inv) {
  25. sheet_updown(sht, shtctl->top - 1);
  26. if (3 <= x && x < sht->bxsize - 3 && 3 <= y && y < 21) {
  27. (中略)
  28. }
  29. /*从此开始*/ if (sht->bxsize - 21 <= x && x < sht->bxsize - 5 && 5 <= y && y < 19) {
  30. /*点击“×”按钮*/
  31. if (sht->task != 0) { /*该窗口是否为应用程序窗口?*/
  32. cons = (struct CONSOLE *) *((int *) 0x0fec);
  33. cons_putstr0(cons, "\nBreak(mouse) :\n");
  34. io_cli(); /*强制结束处理中禁止切换任务*/
  35. task_cons->tss.eax = (int)
  36. &(task_cons->tss.esp0);
  37. task_cons->tss.eip = (int) asm_end_app;
  38. io_sti();
  39. }
  40. /*到此结束*/ }
  41. break;
  42. }
  43. }
  44. }
  45. } else {
  46. /*如果处于窗口移动模式*/
  47. (中略)
  48. }
  49. } else {
  50. /*没有按下左键*/
  51. (中略)
  52. }
  53. }
  54. } else if (i <= 1) { /*光标用定时器*/
  55. (中略)
  56. }
  57. }
  58. }
  59. }

应该不难吧?那么程序的讲解就到此为止了哦。

将上面的程序“make run”一下,结果如下。看,成功了!

4 用鼠标关闭窗口(harib21d) - 图1 4 用鼠标关闭窗口(harib21d) - 图2
点击这里的话…… 窗口就关掉了