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

📄 textbox.c

📁 linux环境下结合ncurse库
💻 C
字号:
/*
	TextBox struct 函数实现
*/
#include "BaseEnvInit.h"
#include "FunctionLib.h"
#include "TextBox.h"

void ShowTextBox(TextBox * pText)
{
	werase(pText->m_win);
	if(pText->m_isPasswd==TRUE)
	{
			int i=0;
		for(;i<strlen(pText->m_str);++i)
		{
			mvwaddch(pText->m_win,0,i,'*');
		}
	}
	else
	{
		mvwprintw(pText->m_win,0,0,"%s",pText->m_title);
		mvwprintw(pText->m_win,0,strlen(pText->m_title),"%s",pText->m_str);
	}
	touchwin(pText->m_win);
	wrefresh(pText->m_win);
}

int InputString(struct _TextBox * pText)
{
	int i=strlen(pText->m_str);
	int maxlen=pText->m_strmaxlen;
	int ch;
	keypad(pText->m_win,TRUE);
	cbreak();
	noecho();
	do
	{
		pText->ShowTextBox(pText);
		ch=wgetch(pText->m_win);
		if(pText->m_isInteger==TRUE) // 只有数字的的模式
		{
			if(pText->m_isFn2_9==TRUE)
			{
				if(!( (ch>='0' && ch<='9') 
				|| ch==KEY_UP || ch==KEY_DOWN
					|| ch==KEY_HOME || KEY_END==ch	
					|| ch==KEY_PPAGE || ch==KEY_NPAGE || ch==9
				|| ch==10 || ch==27 || 
					ch==KEY_BACKSPACE || (ch>=KEY_F(2) && ch<=KEY_F(9) ) ))
				{continue;}
			}
			else
			{
				if(!( (ch>='0' && ch<='9') 
				|| ch=='.'
				|| ch==KEY_UP || ch==KEY_DOWN || ch==9
				|| ch==10 || ch==27 || ch==KEY_BACKSPACE))
				{continue;}
			}
		}else // pText->m_isintger=FLASE. 字符模式。
		{
			if(!( (ch>='a' && ch<='z') || (ch>='A' && ch<='Z') ||(ch>='0' && ch<='9')
				|| ch==KEY_BACKSPACE || ch==KEY_UP || ch==9
				|| ch==KEY_DOWN || ch==10 || ch==27))
			{
				continue;
			}
		}

		// 这段键值判断代码需要优化 10/25
		if (ch==KEY_LEFT || ch==KEY_RIGHT || ch==KEY_F(1))
		{
			// 保留对 左右键键的控制
			continue;
		}else if(27==ch)
		{
			/*
			memset(pText->m_str,0,512);
			i=0;
			pText->ShowTextBox(pText);
			*/
			continue;
		}else if(ch==10 || ch==KEY_UP || ch==KEY_DOWN || ch==9 ||
			ch==KEY_HOME || ch==KEY_END|| ch==KEY_NPAGE || ch==KEY_PPAGE ||
			( ch>=KEY_F(2) && ch<=KEY_F(9) )) // Enter 
		{
			(pText->m_str)[i]='\0';
			 pText->ShowTextBox(pText);
		/*			
		if( (pText->m_strminlen ) > strlen(pText->m_str) )
		{
			char temp[20];
			sprintf(temp,"请输入:[%d - %d]个字符串.",pText->m_strminlen,pText->m_strmaxlen);
			MessageBox(temp,"按任意键返回.",NOBTN);
			continue;
		}
		*/
			break;
		}else if(ch==KEY_BACKSPACE) // Backspace
		{
			if(0==i)
			{
				continue;
			}
			else
			{
				(pText->m_str)[i--];
				pText->m_str[i]='\0';
				pText->ShowTextBox(pText);
			}
		}else // 其他字符
		{
			if(i<pText->m_strmaxlen)
			{
				(pText->m_str)[i++]=ch;
				(pText->m_str)[i]='\0';
				pText->ShowTextBox(pText);
			}
		}
	}while(1);


	return ch;
}

void FreeTextBox(TextBox * pText)
{
	if(delwin(pText->m_win)==ERR)
	{
		fprintf(stderr,"Error - in FreeTextBox function delwin(pText->m_win).\n Exit Program.");
		endwin();
		exit(1);
	}
	free(pText);
}

void ChangeTextBox(TextBox ** ppText)
{
	TextBox * ptempText=*ppText;
	*ppText=MakeTextBox(*ppText);
	ptempText->FreeTextBox(ptempText);
}

TextBox * MakeTextBox(TextBox * pText)
{
	TextBox * p=NULL;
	p=(TextBox *)malloc(sizeof(TextBox));
	if(!p)
	{
		//fprintf(stderr,"Error - malloc TextBox false .exit program.");
		//exit(1);
		return NULL;
	}
	memset(p,0,sizeof(TextBox));
	if(NULL==pText)
	{
		(p->m_spc).s_py=0;
		(p->m_spc).s_px=0;
		(p->m_spc).s_sizey=1;
		(p->m_spc).s_sizex=16;
		(p->m_spc).s_color=BLACK_RED;
		p->m_strmaxlen=10;
		p->m_strminlen=1;
		p->m_isInteger=TRUE;
		p->m_isPasswd=FALSE;
		p->m_isFn2_9=FALSE;
		memset(p->m_title,0,10);
		memset(p->m_str,0,512);

		//strcpy(p->m_title,"CN:");
		
		if(!newwin)
		{
			return NULL;
		}
	}
	else
	{	

		memcpy(p,pText,sizeof(TextBox));
		//FreeTextBox(pText);
	}
	p->m_win=newwin((p->m_spc).s_sizey,(p->m_spc).s_sizex,(p->m_spc).s_py,(p->m_spc).s_px);
	wbkgd(p->m_win,COLOR_PAIR( (p->m_spc).s_color));
	p->ShowTextBox=ShowTextBox;
	p->FreeTextBox=FreeTextBox;
	p->InputString=InputString;
	p->ChangeTextBox=ChangeTextBox;
	return p; 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -