www.pudn.com > cwin.rar > BUTTON.C


    /*----------------------------------------------------------- 
        程序模块 button_menu.c : 多功能按钮式菜单 
    -----------------------------------------------------------*/ 
    #include  
    #include  
    #include  
 
    /*---- 内部函数 _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;ibutton_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;ibutton_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;ibutton_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; 
    }