思维导图


.
不想听过程直接目录移动到代码实现
.

文章目录

  • 思维导图
  • 1.光标移动函数gotoxy()
  • 2.获取键盘键值:_kbhit()函数、_getch()函数
  • 2.1 _kbhit()函数
  • **2.2_getch()函数**
  • 3.菜单内容
  • 3.1通过循环来接收输入
  • 3.2光标移动
  • 3.3 注意事项
  • 代码实现

.

1.光标移动函数gotoxy()

void gotoxy(int xpos, int ypos)
{COORD scrn;HANDLE hOuput = GetStdHandle(STD_OUTPUT_HANDLE);scrn.X = xpos; scrn.Y = ypos;SetConsoleCursorPosition(hOuput, scrn);
}

作用就是移动光标到 (xpos,ypos),控制台的输出都是在光标后的

输出案例

cout << "hello " << endl;gotoxy(5, 5);cout << "world!" << endl;

2.获取键盘键值:_kbhit()函数、_getch()函数

2.1 _kbhit()函数


执行第17行代码时我并没有在键盘按下任何键


通过调试可以知道:_kbhit()函数用于检查键盘是否有输入,如果有则返回非0,否则返回0

.
.

2.2_getch()函数


通过调试发现,通过_getch()函数输入的内容 不会出现在控制台上

当键盘输入 ’ ↑ ’ 时,ch赋值为-32,
第二轮循环:缓冲区又为ch赋值72
这个-32应该是键盘有输入的一个标志,
而72是’ ↑’ 对应的ASCII码

这里不在一 一举例,’ ↓ '的ASCII码为80

3.菜单内容

这里用string数组来存菜单内容,用index来表示菜单的下标

string select[] = { "选项1","选项2","退出3" };
int index = 0;

输出菜单的内容

int main()
{int index = 0;char ch;string select[] = { "选项1","选项2","退出3" };string str = "-> ";gotoxy(5, 1);cout << "enter ↑ ↓ to control system" << endl;for (int i = 0; i < 3; i++) {gotoxy(9, 3 + i);cout << select[i];}gotoxy(5, 3);cout << str+"     "+select[0];
}

3.1通过循环来接收输入

.

 while (true) {if (_kbhit()) {ch = _getch();//not print at screenif (ch == 72 || ch == 80 || ch == '\r') {if (ch == 27) {//esc//...return -1;}else if (ch == 72) {//up//...执行的语句index--;}else if (ch == 80) {//down//...执行的语句index++;}if (index < 0) {index = 2;}else if (index > 2) {index = 0;}}}}

3.2光标移动

要实现上下移动最重要的是:新内容的显示与旧内容的擦除


擦除旧内容:
.
这里就能体现用index来选择菜单的内容的原因:
.
以按下键盘的 ’ ↓ ’ 键 来举例,用’ -> ‘来表示当前选择
.
我们希望’->'移到下一行,则这里的index是要自增的
.
同时清楚我们的当前行
.
所以这里我们需要的操作就是
.

 // 这里的 %*c 表示79个' ',可以起到清除当前行的效果,79是随便设置的printf("\r%*c\r", 79, ' ');gotoxy(9, 3 + index);cout << select[index];index--;

上移也是同理。


显示新内容
.
我这里为了与没有被选中的内容作区分,将被选中的内容的输出右移了一部分
.
被选中的就是这个效果:
.

因为无论是上移还是下移,index都已经自 增/减 过了
.
所以我们只需要将光标移动到当前行(其实是按下按键时的 上/下 一行)
.
输出我们选中的标志 ’ -> ’ 以及菜单内容
.
可以设置一个延时,过渡自然一点,但有没有全凭你自己选择,没有也无影响
.

 gotoxy(5, 3 + index);cout << "             ";Sleep(100);cout << str + select[index];

3.3 注意事项

.
我们的index并不能无限的自增和自减
.
不仅仅是菜单内容有限,如果不加限制的自增和自减会导致数组越界
.
这里添加符合直觉的限制
.
如果是第一个菜单,上移则选中最后一个菜单项,最后一个菜单项下移则选中第一个菜单项
.
我这里的菜单项只有3个,所以数组的最大下标就是:2

     if (index < 0) {index = 2;}else if (index > 2) {index = 0;}

代码实现

#include <Windows.h>
#include <iostream>
#include <stdio.h>
#include <conio.h>
using namespace std;
void gotoxy(int xpos, int ypos)
{COORD scrn;HANDLE hOuput = GetStdHandle(STD_OUTPUT_HANDLE);scrn.X = xpos; scrn.Y = ypos;SetConsoleCursorPosition(hOuput, scrn);
}
int main()
{int index = 0;char ch;string select[] = { "选项1","选项2","退出3" };string str = "-> ";gotoxy(5, 1);cout << "enter ↑ ↓ to control system" << endl;for (int i = 0; i < 3; i++) {gotoxy(9, 3 + i);cout << select[i];}gotoxy(5, 3);cout << str+"     "+select[0];while (true) {if (_kbhit()) {ch = _getch();//not print at screenif (ch == 72 || ch == 80 || ch == '\r') {if (ch == 27) {//esccout << "exit system" << endl;Sleep(2000);return -1;}else if (ch == 72) {//upprintf("\r%*c\r", 79, ' ');gotoxy(9, 3 + index);cout << select[index];index--;}else if (ch == 80) {//downprintf("\r%*c\r", 79, ' ');gotoxy(9, 3 + index);cout << select[index];index++;}if (index < 0) {index = 2;}else if (index > 2) {index = 0;}}gotoxy(5, 3 + index);cout << "             ";Sleep(100);cout << str + select[index];if (ch == '\r') {return index;}}}
}

C/C++ 光标:键盘上下键实现菜单移动相关推荐

  1. 计算机键盘光标上下键失灵,输入时使用键盘上下键实现光标上下移动功能

    image.png 如图所示,在当前测试要求那一列,使用键盘上下键,实现光标上下移动功能: maxlength="50" type="text" :disabl ...

  2. layui table 可编辑单元格 JS实现通过键盘上下左右键 光标焦点移动到旁边的编辑行/列

    layui table 可编辑单元格 JS实现通过键盘上下左右键 光标焦点移动到旁边的编辑行/列 类似效果 上下左右键实现的代码 layui.config({base: '/static/layuia ...

  3. 中英文标点符号切换的组合键_最全的键盘各键及组合键功能说明,好好学习

    键盘是最常用的输入设备,通过键盘可以将汉字.英文字母.数字.标点符号等输入到计算机中,从而向计算机发出命令.输入数据.那么键盘分为几个功能区?各键的功能是什么呢?组合键又有什么功能呢?下面就分别予以说 ...

  4. 列名无效怎么解决_电脑win键失效怎么办? 键盘win键无效的解决办法

    电脑win键失效怎么办?在使用windows系统的时候,发现一个问题,就是win键失效了,怎么按都没有反应,该怎么办呢?羡慕我们就来分享键盘win键无效的三种解决办法,需要的朋友可以参考下 对于编程人 ...

  5. ikbc键盘win键失效的解决方法

    一.引子 今天敲代码时发现键盘win键失灵了,因为最近刚从windows系统切换到mac系统编程,所以一直以为是mac系统下键盘配置问题或者兼容性问题,反复尝试了很久没有解决. 后来问了购买店铺的客服 ...

  6. 键盘哪个键是锁定计算机,笔记本键盘锁定键在哪_笔记本电脑的“键盘锁”是哪一个键-win7之家...

    大家都知道笔记本电脑中是自带有键盘的,但是有时候可能需要暂时将键盘锁定,那么就可以使用键盘锁来锁定,很多笔记本电脑用户并不知道键盘锁定键在哪,针对这个问题,小编就给大家讲述一下笔记本电脑的" ...

  7. 计算机键盘上范的怎么点击,键盘shift键怎么使用

    很多人都不知道键盘上shift 键的作用和操作方法.那么键盘shift键怎么使用呢?就让范文啊小编来告诉大家键盘shift键的使用方法吧,希望可以帮助到大家. 键盘shift键使用方法 shift,上 ...

  8. 罗技无法使用计算机上的配置文件,如何解决Logitech键盘多媒体键无法使用的问题?...

    如何解决Logitech键盘多媒体键无法使用的问题? Logitech键盘驱动程序无法识别音乐软件. 如果要使用它,则需要刷新并优化多媒体密钥. 让我们看一下详细的教程. 需要它的朋友可以参考它 因为 ...

  9. 全局搜索利用键盘上下键切换选中内容

    最近开发一个桌面端的全局搜索,利用键盘上下键切换选中内容,类似于钉钉一样的效果,如图: html: <div class="rong-search-main">< ...

最新文章

  1. debain安装lyx2.2.2,以及报错整理:
  2. java web 耗时请求_javaweb应用中出现了一个耗时异常长的数据查询,寻求帮助
  3. mysql并发写入性能分析
  4. 多线程编程2-NSOperation
  5. Django-你想知道的都在这里
  6. 快速JQuery——(第一章)第一个JQuery
  7. 存档位置_胶带输送机综合保护装置安装位置 技术标准(试行)
  8. R语言线性回归预测网页流量
  9. 支持带有书签的PDF生成的文本编辑工具Typora
  10. Mysql 中文中繁杂的字 插入报错的 解决方案
  11. ParNew垃圾回收器总结
  12. 2020年全国大学生数学建模B题题目概要
  13. Visio连接线的箭头如何变为直线、双箭头;直线转换为箭头
  14. 如何区分冲突域和广播域?
  15. Broker启动历史数据加载
  16. 什么是锁?有几种锁?怎么用锁?
  17. 钉钉考勤与企业系统对接
  18. 美国Zip code大全
  19. 私募基金电子合同快来了!《私募投资基金电子合同业务管理办法(试行)(征求意见稿)》发布
  20. 暴力字典密码破解之crypt

热门文章

  1. java返回图片base64_java将图片转为base64返回给前端
  2. a豆的使命:每一位年轻人都值得珍重
  3. 2022-2028年中国酯基季铵盐行业市场全面调研及投资前景预测报告
  4. Visio 画图去掉页边距的解决办法
  5. 记录一次阿里云服务器被攻击事件
  6. 喜欢计算机专业的理由英语作文,计算机专业英文自我评价范文
  7. Mac电脑鼠标滚轮方向相反的解决办法
  8. 第七周OJ—百位数的分解
  9. QQ空间迁移_【深度解锁数据恢复】
  10. eNSP第五篇扩展1:vrrp over nqa,nqa探测,双重vrrp监听方法1,vrrp与nqa结合