——感谢我的老师与组员们,是他们帮助我把一个想象拉到现实
一,前置准备
先贴效果图:
——光标可以闪烁、任意上下移动;
为了到达这样的效果,我们必须考虑如何对光标进行操作,这时候就需要用到一系列windows事先定义好的函数,也就是所谓的“WindowsAPI”。它在C中主要在头文件:
include <windows.h>
想要让光点能够闪烁,我的思路是程序先打印一个光点,再等待确定的一段时间,然后删除光点,再等待确定的一段时间,如此反复。按照这个思路来,就必须有一个函数能够使系统等待:
Sleep(500); //codeblock测试为等待500毫秒
考虑到界面美化,有没有什么办法可以让原来的光标消失呢?这里需要改变光标状态的API,函数接口为:
GetConsoleCursorInfo(···) //得到光标状态
SetConsoleCursorInfo(···) //设置程序光标状态
这些零碎的问题解决后,一个重要问题就是如何判读键盘输入,这里我用的是一个无阻塞输入函数:getch() ;程序使用它时直接读入一个缓冲区中的字符,不会等待用户输入
二,具体实现
我们按照【一】的准备与思路,一步一步的来写函数,完成功能:
- 光标消失与出现:
void infogone(void) //光标消失
{
HANDLE hout; //代表窗口编码的“句柄”
hout=GetStdHandle(STD_OUTPUT_HANDLE); //得到当前窗口的编码句柄
CONSOLE_CURSOR_INFO info; //代表光标信息的结构体
GetConsoleCursorInfo(hout,&info); //把句柄对应窗口的光标信存储在信息结构体中
info.bVisible=0; //把结构体中的“光标是否可显示”即“bVisible”成员设置为“不显示”,即0
SetConsoleCursorInfo(hout,&info); //把句柄对应窗口的光标按信息结构体中的内容重新设置
}
关于光标显示函数,只要把“.bVisible”成员设置为1再重新设置界面光标就可以了;
- 打印闪烁光点
char printflash(void)
{
infogone();
fflush(stdin); //解决各种光点延迟的灵丹妙药
printf("·");
while(!kbhit())
{
printf("·");
Sleep(300); //可自由调控光标闪烁频率,数值越小频率越快
printf("\b\b \b\b");
Sleep(300);
}
return getch();
}
这里用到了一个新函数:kbhit(),这个函数的功能是检验键盘有没有被敲击,有的话返回1,没有返回0;这同样也是一个无阻塞函数,具体可以参考:百度百科-kbhit();
简单来说,