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


按方向键选择移动方向,回车确定选择
完成原理
在说完成原理之前我们先来想想,我们要在控制台实现选择需要有哪些工作呢?
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");

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

被折叠的 条评论
为什么被折叠?



