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


    /*----------------------------------------------------------- 
        函数 getxyt : 正文编辑窗口 
    -----------------------------------------------------------*/ 
    #include  
    #include  
    #include  
    #include  
    #include  
    #include  
 
    /*-- 内部函数 dx : 汉字状态的光标移动距离 -----------------*/ 
    static int _Cdecl dx(unsigned char *string,int pos) 
    { 
        int i = 0; 
 
        while(i < pos) 
        { 
            if(ishan(string+i-1)) 
                i+=2; 
            else 
                i++; 
        } 
        return i-pos; 
    } 
 
    /*-- 函数 getxyt : 以文本窗口形式编辑字符串 ---------------*/ 
    unsigned _Cdecl getxyt(col,line,width,high,string) 
    int col;             /* 编辑窗口左上角列坐标(以字节为单位) */ 
    int line;            /* 编辑窗口左上角行坐标(以象素为单位) */ 
    int width;           /* 编辑窗口宽度                       */ 
    int high;            /* 编辑窗口高度                       */ 
    char *string;        /* 被编辑的字符串                     */ 
    { 
        unsigned h; 
        int skip; 
        int i        = 0; 
        int _EndEdit = NO; 
        char *buff; 
        int font_h   = CHAR_HIGH*_Ytimes; 
        int old_l    = _TextWinLeft; 
        int old_t    = _TextWinTop; 
        int old_r    = _TextWinRight; 
        int old_b    = _TextWinBottom; 
        int old_c    = _TextColor; 
        int old_bk   = _Background; 
        int modified = NO; 
        int len      = width*high; 
        int have_cursor = iscursorlight(); 
        int mouselight  = ismouselight();  /* 鼠标已打开  */ 
 
        /*-- 准备编辑缓冲区 -------------------*/ 
        buff = malloc(len+1); 
        memset(buff,' ',len); 
        buff[len] = 0; 
        memcpy(buff,string,min(strlen(string),len)); 
 
        /*-- 显示编辑区 -----------------------*/ 
        delightcursor(); 
        set_window(col,line,col+width*_Xtimes-1,line+high*font_h); 
        if(mouselight) 
            delight_mouse(); 
        _Block(col,line,width*_Xtimes,high*font_h,_EditBk); 
        set_text_color(_EditColor); 
        set_background(_EditBk); 
        movecursor(col,line); 
        putnstr(string,len); 
        movecursor(col,line); 
        if(mouselight) 
            light_mouse(); 
        lightcursor(); 
 
        /*-- 编辑缓冲区 -----------------------*/ 
        while(_EndEdit==NO) 
        { 
            skip = 1; 
            h    = gethan(); 
            if(mouselight) 
                delight_mouse(); 
            switch(h) 
            { 
                case KEY_Left: 
                    if(i == 0) 
                    { 
                        _EndEdit = YES; 
                        break; 
                    } 
                    i -= (i >=2 && ishan(buff+i-2)?2:1); 
                    break; 
                case KEY_Right: 
                    if(i == len-1 || ishan(buff+i) && i == len-2) 
                    { 
                        _EndEdit = YES; 
                        break; 
                    } 
                    i += (ishan(buff+i-1)?2:1); 
                    break; 
                case KEY_Up: 
                    if(i < width) 
                    { 
                        _EndEdit = YES; 
                        break; 
                    } 
                    i -= width; 
                    i -= dx(buff,i); 
                    break; 
                case KEY_Down: 
                    if(i > len-width-1) 
                    { 
                        _EndEdit = YES; 
                        break; 
                    } 
                    i += width; 
                    i -= dx(buff,i); 
                    break; 
                case KEY_Home: 
                    if(i == 0) 
                    { 
                        _EndEdit = YES; 
                        break; 
                    } 
                    i = 0; 
                    break; 
                case KEY_End: 
                    if(i == len-1) 
                    { 
                        _EndEdit = YES; 
                        break; 
                    } 
                    i = len-1; 
                    break; 
                case KEY_Del: 
                    if(ishan(buff+i-1)) 
                        skip = 2; 
                    memmove(buff+i,buff+i+skip,len-i-skip); 
                    memset (buff+len-skip,' ',skip); 
                    putnstr(buff+i,len-i); 
                    modified = YES; 
                    break; 
                case Backspace: 
                    if(i == 0) 
                        break; 
                    if(i >=2 && ishan(buff+i-2)) 
                        skip = 2; 
                    i -= skip; 
                    memmove(buff+i,buff+i+skip,len-i-skip); 
                    memset (buff+len-skip,' ',skip); 
                    movecursor(col+(i%width)*_Xtimes,line+i/width*font_h); 
                    putnstr(buff+i,len-i-1); 
                    modified = YES; 
                    break; 
                default: 
                    if(isedit(h) || h==KEY_ENTER || h==KEY_ESC || h==LEFT_BUTTON || h==RIGHT_BUTTON) 
                    { 
                        _EndEdit = YES; 
                        break; 
                    } 
                    if(h<0xa0a0 && !isprint(h) && h!=KEY_ENTER) 
                    { 
                        sound(900); 
                        delay(100); 
                        nosound(); 
                        h = KEY_Right; 
                        break; 
                    } 
 
                    /*---- Write h to buff. -----------------*/ 
                    if(h>0xa0a0) 
                    { 
                        skip = 2; 
                        if(i+skip>len) 
                            break; 
                    } 
                    if(isins()) 
                        movmem(buff+i,buff+i+skip,len-i-skip); 
                    modified = YES; 
                    if(h>0xa0a0) 
                    { 
                        *(buff+i)   = h; 
                        *(buff+i+1) = (h>>8); 
                    } 
                    else 
                        *(buff+i)   = (h==KEY_ENTER?'\n':h); 
                    if(isins()) 
                        putnstr(buff+i,len-i); 
                    else 
                        putnstr(buff+i,skip); 
                    if(i+skip<=len-1) 
                        i += skip; 
            } 
            if(_EndEdit == NO) 
                movecursor(col+(i%width)*_Xtimes,line+i/width*font_h); 
            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; 
            } 
        } 
 
        /*-- 以原正文和背景颜色显示被编辑的字符串 -------------*/ 
        if(!have_cursor) 
            delightcursor(); 
        if(mouselight) 
            delight_mouse(); 
        _TextCol  = col; 
        _TextLine = line; 
        set_text_color(old_c); 
        set_background(old_bk); 
        _Block(col,line,width*_Xtimes,high*font_h,old_bk); 
        putnstr(buff,len); 
        if(mouselight) 
            light_mouse(); 
        set_window(old_l,old_t,old_r,old_b); 
 
        /*-- 返回退出编辑状态的键盘码 -------------------------*/ 
        return h; 
    }