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