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


    /*----------------------------------------------------------- 
        函数 getxys : 字符串型数据录入编辑 
    -----------------------------------------------------------*/ 
    #include  
    #include  
    #include  
    #include  
    #include  
    #include  
 
    unsigned _Cdecl getxys(col,line,width,string,slen) 
    int col;             /* 编辑窗口左上角列坐标(以字节为单位) */ 
    int line;            /* 编辑窗口左上角行坐标(以象素为单位) */ 
    int width;           /* 编辑窗口宽度                       */ 
    char *string;        /* 被编辑的字符串                     */ 
    int *slen;           /* 字符串长度                         */ 
    { 
        unsigned char *buff; 
        unsigned char *bptr; 
        unsigned char *dptr; 
        unsigned h; 
        int _EndEdit        = NO; 
        int old_c           = _TextColor; 
        int old_b           = _Background; 
        int len             = *slen; 
        int have_cursor     = iscursorlight(); 
        int mouselight      = ismouselight(); 
        int modified        = NO; 
        int cursor_pos,skip; 
 
        /*-- 设置工作缓冲区 -------------------*/ 
        len = len=2 && ishan(bptr-2)) 
                        skip = 2; 
                    bptr-=skip; 
                    if(bptr < dptr) 
                    { 
                        dptr -= skip; 
                        cursor_pos = _TextCol; 
                        _TextCol = col; 
                        putnstr(dptr,width); 
                        _TextCol = cursor_pos; 
                    } 
                    else 
                        _TextCol -= _Xtimes*skip; 
                    break; 
                case KEY_Right: 
                    if(bptr >= buff+len-1) 
                    { 
                        _EndEdit = YES; 
                        break; 
                    } 
                    if(ishan(bptr)) 
                        skip = 2; 
                    bptr += skip; 
                    if(bptr-dptr >= width) 
                    { 
                        dptr += skip; 
                        cursor_pos = _TextCol; 
                        _TextCol = col; 
                        putnstr(dptr,width); 
                        _TextCol = cursor_pos; 
                    } 
                    else 
                        _TextCol += _Xtimes*skip; 
                    break; 
                case KEY_Home: 
                    if(bptr == buff) 
                    { 
                        _EndEdit = YES; 
                        break; 
                    } 
                    bptr     = buff; 
                    _TextCol = col; 
                    if(dptr>buff) 
                    { 
                        dptr = buff; 
                        putnstr(dptr,width); 
                        _TextCol = col; 
                    } 
                    break; 
                case KEY_Del: 
                    if(ishan(bptr)) 
                        skip = 2; 
                    memmove(bptr,bptr+skip,len+buff-bptr-skip); 
                    memset(buff+len-skip,' ',skip); 
                    cursor_pos = _TextCol; 
                    putnstr(bptr,width-(bptr-dptr)); 
                    _TextCol = cursor_pos; 
                    modified = YES; 
                    break; 
                case Backspace: 
                    if(bptr == buff) 
                        break; 
                    if(bptr-buff>=2 && ishan(bptr-2)) 
                        skip = 2; 
                    bptr -= skip; 
                    memmove(bptr,bptr+skip,len+buff-bptr-skip); 
                    memset(buff+len-skip,' ',skip); 
                    if(bptr <= dptr) 
                    { 
                        dptr     = bptr; 
                        _TextCol = col; 
                    } 
                    else 
                        _TextCol -= _Xtimes*skip; 
                    cursor_pos    = _TextCol; 
                    putnstr(bptr,width-(bptr-dptr)); 
                    _TextCol      = cursor_pos; 
                    modified      = YES; 
                    break; 
                default: 
                    if(isedit(h) || h==KEY_ESC || h==KEY_ENTER || h==LEFT_BUTTON || h==RIGHT_BUTTON) 
                    { 
                        _EndEdit = YES; 
                        break; 
                    } 
                    if(len-(bptr-buff) 0xa0a0) 
                        skip = 2; 
                    if(isins()) 
                        movmem(bptr,bptr+skip,len-(bptr-buff)-skip); 
                    if(h>0xa0a0) 
                    { 
                        *bptr     = h&0xffff; 
                        *(bptr+1) = (h>>8)&0xffff; 
                    } 
                    else 
                        *bptr     = h; 
 
                    /*-- 如果编辑窗口满但缓冲区长 -----------*/ 
                    if(bptr-dptr>width-skip-1) 
                    { 
                        if(ishan(dptr)) 
                            dptr+=2,bptr+=2; 
                        else 
                        { 
                            if(ishan(bptr)) 
                            { 
                                if(ishan(dptr+1)) 
                                { 
                                    dptr+=3; 
                                    bptr+=2; 
                                    _TextCol-=_Xtimes; 
                                } 
                                else 
                                { 
                                    dptr+=2; 
                                    bptr+=2; 
                                } 
                            } 
                            else 
                                dptr++,bptr++; 
                        } 
                        cursor_pos = _TextCol; 
                        _TextCol   = col; 
                        putnstr(dptr,width); 
                    } 
                    else 
                    { 
                        cursor_pos  = _TextCol+skip*_Xtimes; 
                        putnstr(bptr,width-(bptr-dptr)); 
                        bptr       += skip; 
                    } 
                    _TextCol = cursor_pos; 
                    if(bptr-buff >= len-1) 
                    { 
                        _EndEdit = YES; 
                        h        = KEY_Right; 
                    } 
                    modified = YES; 
            } 
            if(mouselight) 
                light_mouse(); 
        } 
 
        /*-- 如果时ESC键,放弃被编辑的内容 ---------------------*/ 
        if(modified) 
        { 
            if(h==KEY_ESC) 
            { 
                memset(buff,' ',len); 
                memcpy(buff,string,min(strlen(string),len)); 
            } 
            else 
            { 
                strcpy(string,buff); 
                h += 1024; 
            } 
        } 
 
        /*---- 求被编辑字符串的实际长度 -----------------------*/ 
        *slen = bptr-buff; 
        bptr  = buff+len-1; 
        while(*bptr==' ' && bptr>buff) 
            bptr--; 
        if(*bptr!=' ') 
            bptr++; 
        if(bptr-buff>*slen) 
            *slen = bptr-buff; 
 
        /*-- 以原正文和背景颜色显示被编辑的字符串 -------------*/ 
        if(!have_cursor) 
            delightcursor(); 
        _TextCol = col; 
        set_text_color(old_c); 
        set_background(old_b); 
        if(mouselight) 
            delight_mouse(); 
        putnstr(buff,width); 
        if(mouselight) 
            light_mouse(); 
        free(buff); 
 
        /*-- 返回退出编辑状态的键盘码 -------------------------*/ 
        return h; 
    }