在控制台真正实现选择菜单(可用方向键选择)|小知识

本文介绍了在控制台实现选择菜单的方法。起因是传统数字输入选择不直观,想改成方向键选择。完成原理包括光标移动、按钮高亮和回车跳转。通过编写光标定位函数控制光标位置,利用控制台转义序列实现彩色输出达到高亮效果,添加变量完成正确选择并设置限制。

在控制台实现选择菜单

制作起因

做这个的原因是以前每次制作主菜单时都是输入数字选择,感觉虽然不麻烦,但是很不直观,不像正常主菜单方向键可以上下移动选择按钮,这一次写代码的时候就觉得干脆改了好了,所以想要改成正常样子

效果图片

没法放视频我就放图片好了
在这里插入图片描述

在这里插入图片描述
按方向键选择移动方向,回车确定选择

完成原理

在说完成原理之前我们先来想想,我们要在控制台实现选择需要有哪些工作呢?

1、往上移动的时候光标也要跟着往上,往下的时候光标也要往下
(平时的菜单也是,选到什么按键,什么就会高亮)
2、要实现选择的按钮高亮
3、按回车键能够跳转
(要注意!我们给用户看到的逻辑并不是我们内部的逻辑,不是说按下去按钮就真的有个按钮,而是视觉上是这样的,而代码实现又是不一样的)

1、光标移动

首先要在控制台要控制光标位置,所以我们写一个光标定位函数

//定位函数
void gotoxy(int x, int y)
{
   
   
	COORD pos = {
   
    x,y };
	HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorPosition(hOut, pos);
}

COORD pos = { x,y };是表示pos坐标位置为参数对应的(x,y)

COORD是Windows API中定义的一种结构,表示一个字符在控制台屏幕上的坐标。其定义为:
typedef struct _COORD {
SHORT X; // horizontal coordinate
SHORT Y; // vertical coordinate
} COORD;

HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);创建一个hOut句柄来接收标准输出句柄

SetConsoleCursorPosition(hOut, pos);该函数设置控制台(cmd)光标位置
使用这个函数需要两个参数:第一个参数类型为HANDLE,第二个参数类型为COORD(获得设备句柄hOut后,设置光标位置为pos)

有了这个函数,我们就可以任意控制光标的位置了

然后我们要让光标“听我们的话”,跟着方向键走
首先我做了个测试发现
(注意:读取方向键并不是一次读取单个,而是会有两个字符读入)

while (1) {
   
   
		if (c1 = getch()) {
   
   
			c2 = getch();
		}
	}

分别按方向键上下左右

上(UPKEY)
在这里插入图片描述

下(DOWNKEY)
在这里插入图片描述
左(LEFTKEY)
在这里插入图片描述
右(RIGHTKEY)
在这里插入图片描述
整理一下我们发现不管按什么键
首个c1字符都是同一个值 -32”?“,我估计应该是用来判断是否为方向键的标识字符
其次c2字符排序后分别为72 75 77 80,是有一定规律的,知道这些我们就可以完成移动光标啦

//定义方向键(这里我做了下修改均减37)
#define UpKey 35
#define DownKey 43
#define LeftKey 38
#define RightKey 40
char c1 = 'a', c2 = 'a', ch = 'a';//初始化为‘a’
int line= 3;//行数,初始设为3(可以设置为你想要初始光标的位置)
//主菜单(建议自己写一个,这里只是简易说明主菜单样子)
void Menu()
{
   
   
	printf("*****\n");
	
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值