MacOS环境-手写操作系统-10-绘制系统鼠标

简介: MacOS环境-手写操作系统-10-绘制系统鼠标

绘制鼠标

1.简介

有了桌面背景,能够显示字符串,现在在图形界面上还少了点东西,那就是鼠标指针,如果有个鼠标能在桌面里动来动去,那系统就有点意思了。

2.实现

通过一个二维数组:

static char cursor[16][16] = {
        "**************..",
        "*OOOOOOOOOOO*...",
        "*OOOOOOOOOO*....",
        "*OOOOOOOOO*.....",
        "*OOOOOOOO*......",
        "*OOOOOOO*.......",
        "*OOOOOOO*.......",
        "*OOOOOOOO*......",
        "*OOOO**OOO*.....",
        "*OOO*..*OOO*....",
        "*OO*....*OOO*...",
        "*O*......*OOO*..",
        "**........*OOO*.",
        "*..........*OOO*",
        "............*OO*",
        ".............***"
    };

*对应的像素点画成黑色

0代表的像素点画成白色

.代表的像素点设置成背景色

那么一个鼠标的图像就出来了

那么对应的代码就成了:

void init_mouse_cursor(char* mouse, char bc) {
    static char cursor[16][16] = {
        "**************..",
        "*OOOOOOOOOOO*...",
        "*OOOOOOOOOO*....",
        "*OOOOOOOOO*.....",
        "*OOOOOOOO*......",
        "*OOOOOOO*.......",
        "*OOOOOOO*.......",
        "*OOOOOOOO*......",
        "*OOOO**OOO*.....",
        "*OOO*..*OOO*....",
        "*OO*....*OOO*...",
        "*O*......*OOO*..",
        "**........*OOO*.",
        "*..........*OOO*",
        "............*OO*",
        ".............***"
    };

      int x, y;
      for (y = 0; y < 16; y++) {
          for (x = 0; x < 16; x++) {
             if (cursor[y][x] == '*') {
                 mouse[y*16 + x] = COL8_000000;
             }
             if (cursor[y][x] == 'O') {
                mouse[y*16 + x] = COL8_FFFFFF;
             }
             if (cursor[y][x] == '.') {
                 mouse[y*16 + x] = bc;
             }
          }
      }
}

代码中把

*设置成黑色

O设置成白色

. 设置成背景色

有了上面的颜色二维数组后,我们需要把该数组的数值写入显存,但显存是一维数组,所以需要将上面的16*16的二维数组转换为一个256字节的数组然后写入显存

代码如下:

void putblock(char* vram, int vxsize, int pxsize,
int pysize, int px0, int py0, char* buf, int bxsize) {
    int x, y;
    for (y = 0; y < pysize; y++)
      for (x = 0; x < pxsize; x++) {
          vram[(py0+y) * vxsize + (px0+x)] = buf[y * bxsize + x];
      }
}

vxsize是整个屏幕的宽度 也就是320

pxsize,pysize, bxsize 等于16,也就是二维数值的行和列值

px0,py0是鼠标所在的左上角坐标

在主函数中通过以下调用就能画出鼠标:

void CMain() {
  ....
  init_mouse_cursor(mcursor, COL8_008484);
  putblock(vram, xsize, 16, 16, 80, 80, mcursor, 16);
  for(;;){
  io_hlt();
}

3.编译走起来

编译C文件


i386-elf-gcc -m32 -fno-asynchronous-unwind-tables -s -c -o write_vga_cursor.o write_vga_cursor.c


反汇编o文件


./objconv -fnasm write_vga_cursor.o write_vga_cursor.asm


删除无用部分


修改kernel


%include "write_vga_cursor.asm"


修改boot(直接放大一点)直接读了20个扇区 肯定够用了

mov          AL,  20        ; AL 表示要练习读取几个扇区


编译boot

nasm -o boot.bat boot.asm


编译kernel

nasm -o kernel.bat kernel.asm


运行java 生成system.img

相关文章
|
13小时前
|
存储 Java C语言
MacOS环境-手写操作系统-08-C语言调色板(绘制系统界面)
本文介绍了如何使用C语言在系统界面中应用调色板,通过向硬件发送指令改变颜色显示模式。首先,定义了16种基本颜色并存储在数组中,然后通过关闭中断、写入调色板号和RGB颜色值来更新调色板。接着,展示了如何编译和反汇编C代码,最后通过汇编语言将调色板数据发送给硬件,并实现在屏幕上绘制方块。整个过程涉及到中断处理、端口操作和图形绘制技术。 摘要由CSDN通过智能技术生成
11 3
|
12小时前
|
缓存 Java iOS开发
MacOS环境-手写操作系统-13-鼠标中断
MacOS环境-手写操作系统-13-鼠标中断
8 1
|
13小时前
|
Ubuntu Java C语言
MacOS环境-手写操作系统-07-C语言绘制系统界面
MacOS环境-手写操作系统-07-C语言绘制系统界面
6 1
|
12小时前
|
存储 Java C语言
MacOS环境-手写操作系统-14-控制鼠标移动
MacOS环境-手写操作系统-14-控制鼠标移动
6 0
|
12小时前
|
Java iOS开发 MacOS
MacOS环境-手写操作系统-09-绘制系统字体
MacOS环境-手写操作系统-09-绘制系统字体
6 0
|
11小时前
|
存储 iOS开发 MacOS
MacOS环境-手写操作系统-24-消除鼠标闪烁
文章介绍了如何通过记录图层像素点对应的窗体编号来消除鼠标在窗口间移动时的闪烁现象。主要方法是在图层数据结构中添加变量map,存储每个像素点的窗体标识,并在窗口移动或尺寸改变时更新这个映射,从而避免不必要的窗口刷新,提高显示性能。
6 0
|
11小时前
|
iOS开发 MacOS
MacOS环境-手写操作系统-37-切换窗口 键盘输入
MacOS环境-手写操作系统-37-切换窗口 键盘输入
7 0
|
12小时前
|
Java iOS开发 MacOS
MacOS环境-手写操作系统-20-图层叠加优化
文章介绍了通过优化图层叠加技术,解决鼠标移动导致大量窗口重绘、消耗CPU资源的问题。通过只重绘鼠标移动影响的区域,以及改进文字显示机制,显著提升了系统性能。修改后的代码包括sheet_refreshsub和sheet_slide函数,以及showString函数,实现了更高效的窗口更新和文字绘制。 摘要由CSDN通过智能技术生成
8 0
|
11小时前
|
编解码 C语言 iOS开发
MacOS环境-手写操作系统-27-修改分辨率
MacOS环境-手写操作系统-27-修改分辨率
6 0
|
11小时前
|
算法 iOS开发 MacOS
MacOS环境-手写操作系统-23-消除刷新的闪烁
文章介绍了如何通过修改代码来解决因频繁刷新整个窗体导致的闪烁问题,重点在于只刷新需要更新的图层,从而提高效率并减少不必要的CPU资源消耗。通过在sheet_refreshsub函数中添加图层高度参数,实现了按需刷新,成功消除了图层闪烁。然而,当鼠标位于较高图层时,仍会出现闪烁,暗示需要进一步优化刷新算法。
6 0