⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 button.c

📁 汉字系统的c源代码
💻 C
字号:
    /*-----------------------------------------------------------
        程序模块 button_menu.c : 多功能按钮式菜单
    -----------------------------------------------------------*/
    #include <hanenv.h>
    #include <fcntl.h>
    #include <alloc.h>

    /*---- 内部函数 _DrawButtonMenu : 在指定坐标处显示菜单 ----*/
    static void _Cdecl _DrawButtonMenu(b)
    BUTTON_MENU *b;                   /* 菜单参数              */
    {
        int i;

        /*-- 显示菜单 -----------------------------------------*/
        delight_mouse();
        if(b->saveimage)
            b->block = getblock(b->col,b->line,b->width,b->high);
        if(b->disp_fun)
            (*(b->disp_fun))(b);
        for(i=0;i<b->button_count;i++)
            _DrawButton(b->buttons[i],b->col,b->line,NO,0);
        if(b->arrow_ctrl)
            _DrawButton(b->buttons[b->current],b->col,b->line,YES,0);
        light_mouse();
    }
    /*-----------------------------------------------------------
        函数 button_menu : 多功能按键式菜单
    -----------------------------------------------------------*/
    unsigned _Cdecl button_menu(b,key)
    BUTTON_MENU *b;                /* 指向菜单参数表的指针     */
    unsigned key;                  /* 进入菜单处理过程时的键码 */
    {
        int i;
        char **block;              /* 菜单背景存放地址         */
        /*
        long memo_size = b->width*b->high*4+16;
        */

        /*-- 如果菜单已经弹出,处理键盘码 ----------------------*/
        if(b->pop_up)
        {
            /*-- 如果是鼠标左键且鼠标光标在菜单内 -------------*/
            if(key==LEFT_BUTTON && mouse_enter(b->col*8,b->line,(b->col+b->width)*8,b->line+b->high))
            {

                /*-- 检查鼠标光标是否指向菜单中的某个按键 -----*/
                for(i=0;i<b->button_count;i++)
                    if(mouse_enter(b->col*8+b->buttons[i].x,
                                   b-> line+b->buttons[i].y,
                                   b->col*8+b->buttons[i].x+b->buttons[i].w,
                                   b-> line+b->buttons[i].y+b->buttons[i].h)
                    && !(b->buttons[i].lock))
                    {
                        /*-- 如果菜单可用键盘控制,修改当前按键 */
                        if(b->arrow_ctrl)
                        {
                            delight_mouse();
                            _DrawButton(b->buttons[b->current],b->col,b->line,NO,0);
                            light_mouse();
                        }
                        b->current = i;
                        delight_mouse();
                        _DrawButton(b->buttons[i],b->col,b->line,YES,1);
                        light_mouse();
                        till_mouse_pop(LEFT_BUTTON);

                        /*-- 如果选择退出项,取消菜单显示,退出 -*/
                        if(b->buttons[i].key==b->quit_key1 || b->buttons[i].key==b->quit_key2)
                        {
                            b->pop_up = NO;
                            delight_mouse();
                            if(b->saveimage && b->block)
                                putblock(b->col,b->line,b->width,b->high,b->block);
                            light_mouse();
                            return b->quit_key1;
                        }

                        /*-- 如果选中项有可执行函数,执行之 ----*/
                        if(b->buttons[i].fun)
                            key = (*(b->buttons[i].fun))();

                        /*-- 否则取出该选择项对应的键盘码 -----*/
                        else
                            key = b->buttons[i].key;

                        /*-- 弹起该按键 -----------------------*/
                        delight_mouse();
                        _DrawButton(b->buttons[i],b->col,b->line,b->arrow_ctrl,0);
                        light_mouse();

                        /*-- 退出菜单处理 ---------------------*/
                        return key;
                    }

                /*-- 如果菜单可移动,且鼠标未指向任何按键 ------*/
                if(!b->fixed && coreleft()>(long)(b->width)*b->high*4+16)
                {
                    int x;         /* 菜单的列坐标(单位为象素) */
                    int y;         /* 菜单的行坐标(单位为象素) */
                    int dx;        /* 移动菜单的列增量         */
                    int dy;        /* 移动菜单的行增量         */
                    int oldml,oldmt,oldmr,oldmb; /* 原鼠标范围 */
                    unsigned mouse_button;

                    /*-- 计算菜单的位置 -----------------------*/
                    x = b->col*8;
                    y = b->line;

                    /*-- 保存菜单的屏幕图象 -------------------*/
                    delight_mouse();
                    block = getblock(b->col,b->line,b->width,b->high);
                    light_mouse();

                    /*-- 设置菜单的移动范围 -------------------*/
                    get_mouse_range(&oldml,&oldmt,&oldmr,&oldmb);
                    set_mouse_range(b->left,b->top,b->right-b->width*8+1,b->bottom-b->high+1);

                    /*-- 用鼠标控制一个虚线框选定菜单的新位置 -*/
                    do
                    {

                        /*-- 读取鼠标光标的位置 ---------------*/
                        mouse_button = get_mouse_status(&dx,&dy);

                        /*-- 计算矩形虚线框的移动位置 ---------*/
                        dy -= y;
                        dx -= x;

                        /*-- 如果需要移动虚线框 ---------------*/
                        if(dx || dy)
                        {
                            delight_mouse();

                            /*-- 消除旧框 ---------------------*/
                            _SetWriteMode(XOR_MODE);
                            draw_rectangle(x,y,b->width*8,b->high,LIGHTGRAY,0xf0);

                            /*-- 计算新框位置 -----------------*/
                            x += dx;
                            y += dy;

                            /*-- 重画新框 ---------------------*/
                            draw_rectangle(x,y,b->width*8,b->high,LIGHTGRAY,0xf0);
                            _SetWriteMode(PUT_MODE);
                            light_mouse();
                        }
                    }while(mouse_button == LEFT_BUTTON);

                    /*-- 恢复原来的鼠标移动范围 ---------------*/
                    set_mouse_range(oldml,oldmt,oldmr,oldmb);

                    /*-- 取消最后一次所画的框 -----------------*/
                    delight_mouse();
                    _SetWriteMode(XOR_MODE);
                    draw_rectangle(x,y,b->width*8,b->high,LIGHTGRAY,0xf0);
                    _SetWriteMode(PUT_MODE);

                    /*-- 恢复菜单下的背景(抹去原来的菜单) -----*/
                    putblock(b->col,b->line,b->width,b->high,b->block);

                    /*-- 修改菜单参数表中的菜单位置 -----------*/
                    b->col   = x/8;
                    b->line  = y;

                    /*-- 保存新菜单位置上的屏幕背景 -----------*/
                    b->block = getblock(b->col,b->line,b->width,b->high);

                    /*-- 在新位置上恢复菜单的图象 -------------*/
                    putblock(b->col,b->line,b->width,b->high,block);
                    light_mouse();
                }
                /*-- 菜单移动处理结束 -------------------------*/
            }

            /*-- 如果输入键盘码为菜单退出键,取消菜单显示,退出 -*/
            else if(key==b->quit_key1 || key==b->quit_key2 || key==KEY_ESC)
            {
                b->pop_up = NO;
                delight_mouse();
                if(b->saveimage && b->block)
                    putblock(b->col,b->line,b->width,b->high,b->block);
                light_mouse();
                return key;
            }

            /*-- 如果菜单可用键盘控制,处理键盘键 --------------*/
            else if(b->arrow_ctrl)
            {
                /*-- 如果输入键盘码是选择键,执行当前选项 ------*/
                if(key==b->press_key1 || key==b->press_key2)
                {
                    /*-- 绘出按下状态的按键 -------------------*/
                    delight_mouse();
                    _DrawButton(b->buttons[b->current],b->col,b->line,YES,1);
                    light_mouse();

                    /*-- 如果选中项有可执行函数,执行之 --------*/
                    if(b->buttons[b->current].fun)
                        key = (*(b->buttons[b->current].fun))();

                    /*-- 否则取出该选择项对应的键盘码 ---------*/
                    else
                    {
                        key = b->buttons[b->current].key;
                        delay(_MouseSpeed);
                    }

                    /*-- 绘出弹起状态的按键 -------------------*/
                    delight_mouse();
                    _DrawButton(b->buttons[b->current],b->col,b->line,YES,0);
                    light_mouse();

                    /*-- 退出菜单处理 -------------------------*/
                    return key;
                }

                /*-- 如果是移动选择项键,移动当前选择项 --------*/
                else if(key==b->forward1 || key==b->forward2 || key==b->backward1 || key==b->backward2)
                {
                    /*-- 用正常色绘制当前键 -------------------*/
                    delight_mouse();
                    _DrawButton(b->buttons[b->current],b->col,b->line,NO,0);
                    light_mouse();

                    /*-- 处理向前移动键 -----------------------*/
                    if(key==b->forward1 || key==b->forward2)
                    {
                        b->current = (b->current==b->button_count-1?0:b->current+1);
                        if(b->buttons[b->current].lock)
                            ungeth(b->forward1);
                    }

                    /*-- 处理向后移动键 -----------------------*/
                    else if(key==b->backward1 || key==b->backward2)
                    {
                        b->current=(b->current==0?b->button_count-1:b->current-1);
                        if(b->buttons[b->current].lock)
                            ungeth(b->backward1);
                    }

                    /*-- 以选中键色绘制当前键 -----------------*/
                    delight_mouse();
                    _DrawButton(b->buttons[b->current],b->col,b->line,YES,0);
                    light_mouse();

                    /*-- 退出菜单处理 -------------------------*/
                    return key;
                }

                /*-- 检查输入键盘码是否和某选择项对应码相同 ---*/
                for(i=0;i<b->button_count;i++)
                    if(key==b->buttons[i].pressed)
                    {
                        delight_mouse();

                        /*-- 将与输入码对应的键变为当前键 -----*/
                        _DrawButton(b->buttons[b->current],b->col,b->line,NO,0);
                        _DrawButton(b->buttons[i],b->col,b->line,YES,1);
                        light_mouse();
                        delay(_MouseSpeed);
                        delight_mouse();
                        _DrawButton(b->buttons[i],b->col,b->line,b->arrow_ctrl,0);
                        light_mouse();
                        b->current = i;

                        /*-- 退出菜单处理 ---------------------*/
                        return b->buttons[i].key;
                    }
            }
            /*-- 使用键盘控制菜单的处理结束 -------------------*/
        }

        /*-- 如果菜单尚未弹出,设置标记,在屏幕上画菜单 ---------*/
        else
        {
            b->pop_up = YES;
            _DrawButtonMenu(b);
        }

        /*-- 返回键盘码 ---------------------------------------*/
        return key;
    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -