⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 edit.cpp

📁 C++写的POS前台程序
💻 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 + -