C语言图形方式下的文本输入实现
1、现状介绍目前C语言的开发工具很多,包括Turbo C,WinTC,VC等等,但是TurboC是最经典的编译器。虽然操作不是很方便,但是目前很多高校学习C语言还是基于TurboC开发环境的。这里对TurboC在图形方式下输入文本受限问题进行讨论,并给出解决办法,欢迎大家进行讨论,若有更好的方法,希望不吝赐教。
图形方式下,尽管输出文本可以使用outtext和outtextxy这两个语句,但是只能使用getch函数来进行文本及数字的输入,这使C语言大大的受限。对于一些具体应用来说是很不方便的。因为getch函数只能一次输入一个字符,功能极其有限。在应用软件中,经常要求在图形方式下输入文本及数字。现有的解决办法总是要求强行退出图形方式,回到文本方式去输入:要么用closegraph函数完全退出,要么用restorecrtmode暂时退出图形方式,然后再用setgraphmode回到图形方式。至于图形现场,则用getimage将图像存入内存,用putimage将存在内存中的图像送回屏幕。但是这两种方式有很大的问题。第一种方式无法恢复图形现场,第二种方式为保存大幅图像所耗内存太大也无法保存整个图形现场。因此必须探求图形方式下实现文本输入功能的其他途径,并且要求:1、不能破坏图形现场;2、输入文本时应能进行一定程度的编辑,如对已输入的数字能用Backspace键删除等。
2、显然为了满足以上的要求,最好的实现方式不是退出图形方式,而是在图形中开辟一小块区域专门用于输入文本。然而Turbo C只提供了一个不回显的字符输入函数getch,它一次只能输一个字符,而且不能输数值。故我们必须自己编写实现该功能的函数。
首先,我们必须设定一块图形作为文本区以起到文本窗口的作用。前已述及,我们不能破坏图形现场,因此最好开辟一块图形区域输入/输出文本。为使该文本区域与其他图形区域分开,我们可以利用setfilestyle与bar函数单独设定一块与其他区域背景色不同的文本区域。
接着,我们必须利用仅能输字符的getch函数来实现字符串的输入以方便后续处理。这是由于前面所提到的,Turbo C中仅有词函数可以达到既输字符又不破坏图形界面的目的。考察C语言中字符和字符串的表示方式,字符串仅是由前面数个字符后跟'\0'构成。因此为输入一个字符串,必须反复强调getch并将所输入字符依次存入一个字符数组中直到敲回车键为止。这样每调用一次getch就必须判断一次是否输入了'\r',即是否敲了回车键。若是,则要在所有已输的字符后加上'\0';若否,则继续调用getch。当然,该字符数组的长度必须大到足以输入该程序中可能用到的各种长度的字符串。那么,我们该如何输入数值呢?这里可以利用atoi与atof函数将作为字符串输入的数字转化为数值。
至此,基本思路已有,但以上的思路还不能实用化,这是因为实际键盘输入时,应该每输入一个字符,屏幕上就应显示一个字符;并且应有一些诸如删除之类的文本编辑功能还要能将删除的过程在屏幕上直观的显示出来。为大到此目的,对以上思路必须加以改进。
具体的想法是这样的:每调用一次getch,判断一下情况。若是字符,则写入当前数组位置,同时将该字符在屏幕上显示出来,并且下表增1,同时;若是'\r'即回车键,则将'\0'即字符串结尾标志写入当前数组位置,结束本次的文本输入;若是'\10'即Backspace删除键,则将当前位置的前一个元素置为NULL,同时将屏幕上显示的前一个字符从屏幕上消去,并且下标减1。至于输入字符的显示办法,可以采用另设一个二元素数组,将当前所输的字符写入其第一个元素,将其第二个元素设为'\0'即字符串结尾标志,这样对该字符数组也即该字符串应用outtext或outtextxy即可将当前所输字符适时在屏幕上显示出来。那么如何消隐字符呢?这只须将屏幕坐标退回到该字符的输出位置,然后再用背景色重写一遍该字符即可。以下是实现该功能的函数:
int text_input()
/*本函数实现最长3位整数的输入*/
{
char ch[4],ch1[2];
/*ch[4]存整个输入字符串,ch1[2]存已变为字符串的当前字符以作显示*/
int i,m,j,x;
/*设定文本区域,其中背景为蓝色,文字为黄色*/
setfillstyle(1,BLUE);
bar(400,640,480);
setcolor(YELLOW);
outtext(400,10,"Input x");
i = 0;
j = getch();
m = 10;
while(1 == 1)
if((j <= '9') && (j >= '0'))
{
ch[i] = j;
ch1[0] = ch[i];
ch1[1] = '\0';
outtextxy(m + 400,20,ch1);
m = m + 10;
j = getch();
i = i + 1;
}
else
{
if(j == '\r')
break;/*若是回车键,则退出循环,结束输入*/
else
{
if(j == '\10')/*若是Backspace键,则删除前一个字符*/
{
i = i - 1;
ch1[0] = ch[i];
ch1[1] = '\0';
m = m - 10;
setcolor(BLUE);
outtextxy(400 + m,20,ch1);
ch[i] = NULL;
setcolor(YELLOW);
j = getch();
}
else
j = getch();
}
}
ch[i] = '\0';/*给作为单个字符依次输入的数加字符串结束标志*/
x = atoi(ch);/*将该字符串变为所需要的整数*/
return x;
}
参考资料:www.