您的位置:首页 > 编程语言 > C语言/C++

C语言实现控制台光标任意移动

2018-03-04 11:05 405 查看
这是在寒假期间学习的一个小程序,早就按照人家的代码写好。但是一直还不理解这个代码的含义,特别是关于Windows的编程,句柄啦,控制台屏幕缓冲区啦,很多知识都很陌生,特别是对句柄的理解,有点吃力。
关于句柄,这篇博客写的挺详细的:https://www.cnblogs.com/zpcdbky/p/4652151.html
通俗的说,句柄可以按照下面的方式理解:
数值上,是一个32位无符号整型值(32位系统下);
逻辑上,相当于指针的指针;
形象理解上,是Windows中各个对象的一个唯一的、固定不变的ID;
作用上,Windows使用句柄来标识诸如窗口、位图、画笔等对象,并通过句柄找到这些对象。
有了对句柄的简单理解,就可以自己实现这个程序了:/*
C语言编程实现控制台上光标的随意移动
上下左右方向键移动光标
回车键光标换行
普通键盘区输入字符
*/

#include <stdio.h>
#include <conio.h>
#include <windows.h>

/*
定义一个句柄对象,虽然还没有看懂句柄到底是什么情况,但是我觉得这个句柄就代表控制台的一些属性,
有了句柄对象,我们就可以对这些属性进行操作
*/
HANDLE hout;

char get_input(void); //获取用户输入

int main()
{
char ch;

hout = GetStdHandle(STD_OUTPUT_HANDLE); //获取标准输出设备的句柄

while (1)
{
ch = get_input();
printf("%c", ch);//输出键盘字符
}
}

//函数返回每个按键的键值
char get_input(void)
{
int ch; //输入字符串

COORD coord; //设置屏幕上的坐标
CONSOLE_SCREEN_BUFFER_INFO csbi; //控制台屏幕缓冲区信息

coord.X = 10; //设置光标坐标
coord.Y = 10;

ch = _getch(); //不带回显,不需要按回车,和getch一样,微软把函数统一为了下划线开头的

//0X0D表示回车的键码,0XE0表示上下左右键的键码
while (ch == 0XE0 || ch == 0X0D)
{
GetConsoleScreenBufferInfo(hout, &csbi); //获取屏幕缓冲的光标位置,然后把当前光标位置赋给COORD
coord.X = csbi.dwCursorPosition.X; //得到坐标x的值
coord.Y = csbi.dwCursorPosition.Y; //y值

if (ch == 0X0D)//回车
{
coord.X = 0;
coord.Y++;
SetConsoleCursorPosition(hout, coord); //在输出设备上定位光标
break;
}

ch = _getch(); //回车键换行之后可以继续输入,如果上面输入的就是方向键的话,这句就会被跳过

if (ch == 0x48)//上
{
if (coord.Y != 0)
coord.Y--;
}
else if (ch == 0x50)//下
{
coord.Y++;
}
else if (ch == 0x4b)//左
{
if (coord.X != 0)
coord.X--;
}
else if(ch == 0x4d)//右
{
if (coord.X != 79)//向右写79个字换行
coord.X++;
else
{
coord.X = 0;
coord.Y++;
}
}

SetConsoleCursorPosition(hout, coord);//定位光标
ch = _getch(); //继续输入,防止跳出while,输出方向键键值对应的字符
}
return ch; //普通按键就返回键值,输出对应的字符
}一开始不理解为什么 get_input 函数里面有三个 _getch() 函数,第一个_getch 是获取第一次输入的,这个可以理解,毕竟程序肯定是要输入的,第二个是防止用户第一次就输入回车键,回车键换行之后,使用第二个 _getch 函数可以继续输入;第三个 _getch 是防止执行完方向键对应的操作之后跳出while,返回键值,这样可以实现连续的输入,除了普通按键之外,方向键和回车键都是一直在这个while里面的。
SetConsoleCursorPosition(hout, coord);执行完上面这个函数之后,控制台的光标才会发生变化。实现效果:(随便输入的。。。)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: