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


    /*----------------------------------------------------------- 
        函数 _GetCode : 代码表 
    -----------------------------------------------------------*/ 
    #include  
    #include  
 
    /*-------- 内部函数 _PutRecord : 显示代码条目 -------------*/ 
    static void _Cdecl _PutRecord(col,line,width,getrec,i,selected,key) 
    int col;               /* 代码条目显示列坐标(以字节为单位) */ 
    int line;              /* 代码条目显示行坐标(以象素为单位) */ 
    int width;             /* 代码条目显示宽度  (以字节为单位) */ 
    void (*getrec)();      /* 构造代码条目的函数(由用户提供)   */ 
    int i;                 /* 代码条目的序号                   */ 
    int selected;          /* 代码条目是否被选中               */ 
    unsigned key;          /* 为构造代码条目的函数提供的键值   */ 
    { 
        /*-- 根据代码条目是否被选中,确定代码条目的显示颜色 ----*/ 
        int color = selected?_EditColor:_TextColor; 
        int bk    = selected?_EditBk:_Background; 
        char code[81]; 
 
        /*-- 清代码条目背景,构造并显示代码条目 ----------------*/ 
        _Block(col+1,line,width,_Ytimes*CHAR_HIGH,bk); 
        (*getrec)(i,code,key); 
        outxystr(col+1,line,color,code); 
    } 
 
    /*------------ 函数 getcode : 窗口式代码表函数 ------------*/ 
    unsigned _Cdecl _GetCode(col,line,width,high,title,n,getrec,no) 
    int col;               /* 代码表左上角列坐标(以字节为单位) */ 
    int line;              /* 代码表左上角行坐标(以象素为单位) */ 
    int width;             /* 代码表宽度(以字节为单位)         */ 
    int high;              /* 代码表高度(以象素为单位)         */ 
    char *title;           /* 代码表标题                       */ 
    int n;                 /* 代码表长度(代码条数)             */ 
    void (*getrec)();      /* 构造代码条目的函数(由用户提供)   */ 
    int *no;               /* 选中的代码序号                   */ 
    { 
        char     **block;        /* 存储代码表背景的缓冲区指针 */ 
        unsigned   key; 
        int        i; 
        int        page_top;             /* 当前页首代码编号   */ 
        int        curr_rec    = *no;    /* 光条(当前)代码编号 */ 
        int        have_cursor = iscursorlight(); 
        int        mouse_light = ismouselight(); 
        int        char_high   = _Ytimes*CHAR_HIGH; 
        int        dispwidth   = _Xtimes*width-2; 
        int        oldpos      = -1;     /* 滚动条用临时变量   */ 
        int        sblen       = high*_Ytimes*CHAR_HIGH-6; 
 
        /*-- 如果取光条颜色与正文颜色相同,可构造帮助提示框 ----*/ 
        int onlyshow = (_EditColor == _TextColor && _EditBk==_Background); 
 
        /*--------------- 如果代码表为空则退出 ----------------*/ 
        if(n<=0 || getrec==NULL) 
            return KEY_ESC; 
 
        /*------------------ 关闭光标和鼠标 -------------------*/ 
        if(have_cursor) 
            delightcursor(); 
        if(mouse_light) 
            delight_mouse(); 
 
        /*------------------- 显示代码表表框 ------------------*/ 
        block = getblock(col,line,dispwidth+4,high*char_high); 
        _Box(col*8,line,(dispwidth+4)*8,high*char_high); 
        scroll_v_box((col+dispwidth+2)*8-3,line+3,sblen,high,0,n,&curr_rec,&oldpos); 
        delight_mouse(); 
 
        /*---------- 如果有标题,则显示标题,然后调整参数 -------*/ 
        if(title) 
        { 
            _Bar(col*8+4,line+4,(dispwidth+1)*8+1,char_high,_TitleBk,0xffff0000); 
            outxystr(col+(dispwidth-strlen(title)*_Xtimes)/2+1,line+4*_Ytimes,_TitleColor,title); 
            _H_Line(col*8+4,line+char_high+4,(dispwidth+1)*8+1,_BoxLineColor,0xff); 
            high -= 2; 
            line += (char_high*2-6*_Ytimes); 
        } 
        else 
        { 
            high --; 
            line += char_high-6*_Ytimes; 
        } 
        /*--------------------- 修正n的数值 -------------------*/ 
        if(*no<0) 
            *no = 0; 
        else if(*no>=n) 
            *no = n-1; 
 
        /*---------------- 显示代码表第一页的内容 -------------*/ 
        page_top = (*no/high)*high; 
        for(i=0;ihigh?high:n-page_top; 
 
                        if(mouse_enter(col*8,line,(col+dispwidth)*8,line+tmphigh*char_high)) 
                        { 
                            i = (mouserow()-line)/char_high; 
                            if(double_press(key)) 
                                ungeth(KEY_ENTER); 
                            else 
                                key = ' '; 
                        } 
                    } 
                    break; 
                case KEY_Down:         /* 向下键:光标移向下一代码     */ 
                    if(onlyshow) 
                        i = high-1; 
                    if(ihigh?page_top-high:0; 
                        _Block(col+1,line,dispwidth,high*char_high, 
                            _Background); 
                        for(i=0;i= high || curr_rec-page_top<0) 
                { 
                    page_top = curr_rec/high*high; 
                    _Block(col+1,line,dispwidth,high*char_high,_Background); 
                    for(i=0;i