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;
}