4 显示窗口(harib08d)

我们现在做出来的图层构架,已经完全可以完成窗口的叠加处理了,所以下面我们就来尝试一下制作窗口吧。

其实方法很简单,就像前面制作背景和鼠标那样,只要先准备一张图层,然后在图层缓冲区内描绘一个貌似窗口的图就可以了。那么我们就来制作一个具有这种功能的函数make_window8吧。

本次的bootpack.c节选

  1. void make_window8(unsigned char *buf, int xsize, int ysize, char *title)
  2. {
  3. static char closebtn[14][16] = {
  4. "OOOOOOOOOOOOOOO@",
  5. "OQQQQQQQQQQQQQ$@",
  6. "OQQQQQQQQQQQQQ$@",
  7. "OQQQ@@QQQQ@@QQ$@",
  8. "OQQQQ@@QQ@@QQQ$@",
  9. "OQQQQQ@@@@QQQQ$@",
  10. "OQQQQQQ@@QQQQQ$@",
  11. "OQQQQQ@@@@QQQQ$@",
  12. "OQQQQ@@QQ@@QQQ$@",
  13. "OQQQ@@QQQQ@@QQ$@",
  14. "OQQQQQQQQQQQQQ$@",
  15. "OQQQQQQQQQQQQQ$@",
  16. "O$$$$$$$$$$$$$$@",
  17. "@@@@@@@@@@@@@@@@"
  18. };
  19. int x, y;
  20. char c;
  21. boxfill8(buf, xsize, COL8_C6C6C6, 0, 0, xsize - 1, 0 );
  22. boxfill8(buf, xsize, COL8_FFFFFF, 1, 1, xsize - 2, 1 );
  23. boxfill8(buf, xsize, COL8_C6C6C6, 0, 0, 0, ysize - 1);
  24. boxfill8(buf, xsize, COL8_FFFFFF, 1, 1, 1, ysize - 2);
  25. boxfill8(buf, xsize, COL8_848484, xsize - 2, 1, xsize - 2, ysize - 2);
  26. boxfill8(buf, xsize, COL8_000000, xsize - 1, 0, xsize - 1, ysize - 1);
  27. boxfill8(buf, xsize, COL8_C6C6C6, 2, 2, xsize - 3, ysize - 3);
  28. boxfill8(buf, xsize, COL8_000084, 3, 3, xsize - 4, 20 );
  29. boxfill8(buf, xsize, COL8_848484, 1, ysize - 2, xsize - 2, ysize - 2);
  30. boxfill8(buf, xsize, COL8_000000, 0, ysize - 1, xsize - 1, ysize - 1);
  31. putfonts8_asc(buf, xsize, 24, 4, COL8_FFFFFF, title);
  32. for (y = 0; y < 14; y++) {
  33. for (x = 0; x < 16; x++) {
  34. c = closebtn[y][x];
  35. if (c == '@') {
  36. c = COL8_000000;
  37. } else if (c == '$') {
  38. c = COL8_848484;
  39. } else if (c == 'Q') {
  40. c = COL8_C6C6C6;
  41. } else {
  42. c = COL8_FFFFFF;
  43. }
  44. buf[(5 + y) * xsize + (xsize - 21 + x)] = c;
  45. }
  46. }
  47. return;
  48. }

正如大家所看到的那样,其实我们只是对graph.c的init_screen8函数稍微进行了改造,而×按钮的功能则是通过修改 init_mouse_cursor8而得到的。

我们在HariMain里也添加了一些内容。因为功能很简单,所以添加的内容不多。

本次的bootpack.c节选

  1. void HariMain(void)
  2. {
  3. (中略)
  4. struct SHEET *sht_back, *sht_mouse, *sht_win; /* 这里! */
  5. unsigned char *buf_back, buf_mouse[256], *buf_win; /* 这里! */
  6. (中略)
  7. init_palette();
  8. shtctl = shtctl_init(memman, binfo->vram, binfo->scrnx, binfo->scrny);
  9. sht_back = sheet_alloc(shtctl);
  10. sht_mouse = sheet_alloc(shtctl);
  11. sht_win = sheet_alloc(shtctl); /* 这里! */
  12. buf_back = (unsigned char *) memman_alloc_4k(memman, binfo->scrnx * binfo->scrny);
  13. buf_win = (unsigned char *) memman_alloc_4k(memman, 160 * 68); /* 这里! */
  14. sheet_setbuf(sht_back, buf_back, binfo->scrnx, binfo->scrny, -1); /* 没有透明色 */
  15. sheet_setbuf(sht_mouse, buf_mouse, 16, 16, 99);
  16. sheet_setbuf(sht_win, buf_win, 160, 68, -1); /* 没有透明色 */ /* 这里!*/
  17. init_screen8(buf_back, binfo->scrnx, binfo->scrny);
  18. init_mouse_cursor8(buf_mouse, 99);
  19. make_window8(buf_win, 160, 68, "window"); /* 这里! */
  20. putfonts8_asc(buf_win, 160, 24, 28, COL8_000000, "Welcome to"); /* 这里! */
  21. putfonts8_asc(buf_win, 160, 24, 44, COL8_000000, " Haribote-OS!"); /* 这里! */
  22. sheet_slide(sht_back, 0, 0);
  23. mx = (binfo->scrnx - 16) / 2; /* 为使其处于画面的中央位置,计算坐标 */
  24. my = (binfo->scrny - 28 - 16) / 2;
  25. sheet_slide(sht_mouse, mx, my);
  26. sheet_slide(sht_win, 80, 72); /* 这里! */
  27. sheet_updown(sht_back, 0);
  28. sheet_updown(sht_win, 1); /* 这里! */
  29. sheet_updown(sht_mouse, 2);
  30. sprintf(s, "(%3d, %3d)", mx, my);
  31. putfonts8_asc(buf_back, binfo->scrnx, 0, 0, COL8_FFFFFF, s);
  32. sprintf(s, "memory %dMB free : %dKB",
  33. memtotal / (1024 * 1024), memman_total(memman) / 1024);
  34. putfonts8_asc(buf_back, binfo->scrnx, 0, 32, COL8_FFFFFF, s);
  35. sheet_refresh(sht_back, 0, 0, binfo->scrnx, 48);
  36. (中略)
  37. }

窗口里还写了点东西,大家一起来读一下程序,看看写了些什么吧。

■■■■■

下面我们来“make run”,到底能不能成功呢?

4 显示窗口(harib08d) - 图1

哦!太帅了!

感觉真有点操作系统的样子了,非常满意!