移动鼠标并显示鼠标坐标
struct MOUSE_DEC { unsigned char buf[3], phase; int x, y, btn; }; enable_mouse(&mdec); for (;;) { io_cli(); //无数据则等待 if (fifo8_status(&keyfifo) + fifo8_status(&mousefifo) == 0) { io_stihlt(); } else { if (fifo8_status(&keyfifo) != 0) { i = fifo8_get(&keyfifo); io_sti(); sprintf(s, "%02X", i); boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 0, 16, 15, 31); putfonts8_asc(binfo->vram, binfo->scrnx, 0, 16, COL8_FFFFFF, s); } //处理鼠标消息 else if (fifo8_status(&mousefifo) != 0) { i = fifo8_get(&mousefifo); io_sti(); if (mouse_decode(&mdec, i) != 0) { sprintf(s, "[lcr %4d %4d]", mdec.x, mdec.y); if ((mdec.btn & 0x01) != 0) //bit0=1 { s[1] = ‘L‘; } if ((mdec.btn & 0x02) != 0) //bit1=1 { s[3] = ‘R‘; } if ((mdec.btn & 0x04) != 0) //bit2=1 { s[2] = ‘C‘; } boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 32, 16, 32 + 15 * 8 - 1, 31); putfonts8_asc(binfo->vram, binfo->scrnx, 32, 16, COL8_FFFFFF, s); //背景色填充原来的鼠标位置 boxfill8(binfo->vram, binfo->scrnx, COL8_008484, mx, my, mx + 15, my + 15); //更新坐标 mx += mdec.x; my += mdec.y; //越界处理 if (mx < 0) { mx = 0; } if (my < 0) { my = 0; } if (mx > binfo->scrnx - 16) { mx = binfo->scrnx - 16; } if (my > binfo->scrny - 16) { my = binfo->scrny - 16; } //输出鼠标坐标 sprintf(s, "(%3d, %3d)", mx, my); //抹掉原坐标 boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 0, 0, 79, 15); putfonts8_asc(binfo->vram, binfo->scrnx, 0, 0, COL8_FFFFFF, s); //画出新坐标下的鼠标 putblock8_8(binfo->vram, binfo->scrnx, 16, 16, mx, my, mcursor, 16); } } } }
看一看效果:
有一个严重的缺陷!
什么原因造成的?
void HariMain(void) { ... //COL8_008484为屏幕背景色 init_mouse_cursor8(mcursor, COL8_008484); ... } void init_mouse_cursor8(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; //屏幕背景色 } } } return; } void putblock8_8(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]; } } return; }
看上面代码就知道原因了,如何修改呢?
putblock8_8加一个函数判断坐标
时间: 2024-08-03 16:04:45