📄 edit.cpp
字号:
/*******************************************************************************
模 块: 文本编辑框.
功 能: 能够设置文本,编辑文本,返回文本.
程序员: 雷中南.
版 本: v1.1
时 间: 1999-05-09
*******************************************************************************/
#include <string.h>
#include <graphics.h>
#include "edit.h"
//编辑框最多编辑31个字符,这可以根据需要调整.
//密码文本字符串.
char Edit::password[31];
//构造函数.
Edit::Edit(struct RECT R) : Object(R)
{
//起始位置.
X = 2;
Y = R.Height / 2 - 8;
//计算能够容纳的可见字符数.
CharWidth = (R.Width - 4) / 8;
//给文本框分配内存.
Buffer = new char[32];
OldBuffer = new char[32];
//将字符串设置为空.
strcpy(Buffer, "");
strcpy(OldBuffer, "");
strcpy(password, "");
//现在的光标指针.
ptr = 0;
//上一次光标指针.
preptr=0;
//文本框左边界的字符串指针.
zeroptr = 0;
//光标的位置.
crusorptr = 0;
//文本框的背景颜色.
SetBkColor(15);
//设置文本框前景色.
SetColor(0);
//设置边框颜色.
SetFrameColor(0);
//文本框是否显示密码.
IsPassword = L_NO;
//是否移动过光标.如果未移动,直接输入新内容,文本框将被重置为空.
Changed = L_NO;
ReturnFlag = L_NO;
}
//析构函数.
Edit::~Edit()
{
//隐藏光标.
Cr.Hide();
//隐藏文本框.
Object::Hide();
//删除字符串.
delete Buffer;
delete OldBuffer;
}
//取得文本.
char *
Edit::Text()
{
return Buffer;
}
//设置文本.
void
Edit::SetText(char * buffer)
{
//显示空行.
strcpy(Buffer, "");
//显示设置字符.
strcpy(Buffer, buffer);
strcpy(OldBuffer, buffer);
Show();
DrawText(Buffer);
//设修改状态为未修改.
Changed = L_NO;
Return();
}
//运行文本框.
void
Edit::DoIt()
{
//初始化变量.
Show();
ptr = 0;
zeroptr = 0;
crusorptr = 0;
preptr = 0;
//显示光标.
Cr.Show();
int Key;
for(;;)
{
//读取键盘.
Key = GetKey();
if(Key < 256)//如果键值小于256表示它不是控制符.
{
switch(Key)
{
case KEY_TAB:
//TAB键
Return();
PutEvent(EV_NEXT);
return;
case KEY_RETURN:
//回车键
Return();
if(ReturnFlag != L_NO)
{
PutEvent(KEY_RETURN);
return;
}
if(strcmp(OldBuffer, Buffer) != 0)
{
PutEvent(KEY_RETURN);
}
else
{
PutEvent(EV_NEXT);
}
return;
case KEY_ESC:
//ESC键
Return();
PutEvent(EV_QUIT);
return;
case KEY_BACKSPACE:
//退格键
DeleteChar();
break;
default:
//如果是可显示字符:
if(Key >= 32 && Key < 127)
{
//插入字符.
InsertChar((char)(Key & 0xff));
}
break;
}
}
else//如果键值大于256表示它是控制符.
{
switch(Key)
{
case KEY_HOME:
//Home键;
ptr=0;
zeroptr=0;
crusorptr=0;
preptr = ptr;
DrawText(Buffer);
break;
case KEY_UP:
//上箭头;
Return();
PutEvent(EV_PREV);
return;
case KEY_LEFT:
//左箭头;
if(ptr>0)
{
ptr--;
DrawText(Buffer);
}
break;
case KEY_RIGHT:
//右箭头.
if(ptr<strlen(Buffer))
{
ptr++;
DrawText(Buffer);
Changed = L_YES;
}
break;
case KEY_END:
//End键.
ptr=strlen(Buffer);
zeroptr=strlen(Buffer)-CharWidth;
if(zeroptr<0) zeroptr = 0;
crusorptr=strlen(Buffer)-zeroptr;
preptr = ptr;
DrawText(Buffer);
break;
case KEY_DOWN:
//下箭头;
Return();
PutEvent(EV_NEXT);
return;
case KEY_DELETE:
//删除键;
if(ptr<strlen(Buffer))
{
ptr++;
DeleteChar();
DrawText(Buffer);
}
break;
default:
//如果是其他控制键,文本框返回.将键值作为事件.
Return();
PutEvent(Key);
return;
}
}
}
}
//画文本
void
Edit::DrawText(char *text)
{
//隐藏光标
Cr.Hide();
//如果光标在最左边.
if(crusorptr <= 0)
{
if(preptr > ptr)//如果光标左移.
{
zeroptr--;
}
else if(preptr < ptr)//如果光标右移.
{
crusorptr++;
}
}
//如果光标在最右边.
else if(crusorptr >= CharWidth)
{
if(preptr > ptr)//如果光标左移.
{
crusorptr--;
}
else if(preptr < ptr)//如果光标右移.
{
zeroptr++;
}
}
//如果光标在中间.
else
{
if(preptr > ptr)//如果光标左移.
{
crusorptr--;
}
else if(preptr < ptr)//如果光标右移.
{
crusorptr++;
}
}
//汉字前景色.
han.Color = Object::Color;
//汉字的背景色.
han.BkColor = Object::BackColor;
//按不同方式显示文本.
if(IsPassword == L_YES)//如果显示密码.
{
han.IsTransport = L_NO;//显示不透明文本.
strcpy(password, text);
memset(password, '*', strlen(text));
han.Out(X, Y, password + zeroptr);
//追加显示空格.为了重画最末字符.
han.Out(X + strlen(password + zeroptr)*8, Y, " ");
han.IsTransport = L_YES;//恢复显示透明文本.
}
else//显示文本.
{
han.IsTransport = L_NO;//显示不透明文本.
han.Out(X, Y, text + zeroptr);
//追加显示空格.为了重画最末字符.
han.Out(X + strlen(text + zeroptr)*8, Y, " ");
han.IsTransport = L_YES;//恢复显示透明文本.
}
//重画外边框.
setcolor(FrameColor);
rectangle(0,0,Rect.Width,Rect.Height);
//将光标移到下一个位置.
Cr.MoveCrusor(X+(crusorptr)*8, Y+14);
preptr = ptr;
//打开光标.
Cr.Show();
}
//结束编辑.
void
Edit::Return()
{
ptr = 0;
zeroptr = 0;
crusorptr=0;
preptr=0;
//重画文本.
DrawText(Buffer);
//隐藏光标.
Cr.Hide();
}
//显示文本框.
void
Edit::Show()
{
//显示对象.
Object::Show();
//显示文本.
DrawText(Buffer);
//为了避免光标到处乱画.
Return();
}
//插入字符.
void
Edit::InsertChar(char ch)
{
//如果在编辑之前存在文本任意编辑键将会删除文本,重新输入.
if(Changed == L_NO)
{
//修改标志.
Changed = L_YES;
//清除文本.
strcpy(Buffer, "");
//重置指针和光标.
Return();
//重画对象.
Show();
}
//使用插入模式.*****************************************
int p;
//获取整个文本的长度.
p = strlen(Buffer);
/* do
{
Buffer[p+1] = Buffer[p];
p--;
}while(p>=ptr);
*/
//使用覆盖模式.*****************************************
if(p==ptr)
{
if(strlen(Buffer)>30)return;
Buffer[p+1] = NULL;
}
//****************************************************
Buffer[ptr] = ch;
ptr++;
//重写文本.
DrawText(Buffer);
}
//删除一个字符.
void
Edit::DeleteChar()
{
//删除光标所在位置的字符,将后续字符前移.
if(ptr>0)
{
int Length, p;
ptr--;
Length = strlen(Buffer) - 1;
p = ptr;
do
{
Buffer[p] = Buffer[p+1];
p++;
}while(p<=Length);
DrawText(Buffer);
}
}
//画文本框.
void
Edit::Draw()
{
//重画对象.
Object::Draw();
//重画边框.
setcolor(FrameColor);
rectangle(0,0,Rect.Width,Rect.Height);
// setcolor(8);
// line(0, 0, Rect.Width, 0);
// line(0, 0, 0, Rect.Height);
// setcolor(7);
// line(0, Rect.Height, Rect.Width, Rect.Height);
// line(Rect.Width, 0, Rect.Width, Rect.Height);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -