码迷,mamicode.com
首页 > 其他好文 > 详细

20天自制操作系统(八)

时间:2014-06-19 06:55:18      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:style   class   blog   code   http   color   

移动鼠标并显示鼠标坐标

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); 
                }
            }
        }
    }

看一看效果:

bubuko.com,布布扣

有一个严重的缺陷!

什么原因造成的?

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加一个函数判断坐标

20天自制操作系统(八),布布扣,bubuko.com

20天自制操作系统(八)

标签:style   class   blog   code   http   color   

原文地址:http://www.cnblogs.com/qiangua/p/3789539.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!