【课程设计】Windows控制台上的交互界面(通过c/c++,在windows控制台实现选择菜单(可通过方向键选择))

这篇具有很好参考价值的文章主要介绍了【课程设计】Windows控制台上的交互界面(通过c/c++,在windows控制台实现选择菜单(可通过方向键选择))。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【课程设计】通过c/c++,在控制台实现选择菜单(可通过方向键选择)

前言

以前做课设的时候,费了很大功夫,在windows控制台实现方向键选择菜单。希望可以在这里总结一下,也欢迎大家一起交流学习。

正文

SetConsoleTextAttribute函数

  • 以下摘自百度百科 传送门
    • SetConsoleTextAttribute是Windows系统中一个可以设置控制台窗口字体颜色和背景色的计算机函数,该函数被广泛应用于软件开发中。
      使用此函数前,必须包含Windows.h头文件,即#include <Windows.h>。
    • 原型
      • BOOL SetConsoleTextAttribute(HANDLE hConsoleOutput, WORD wAttributes);
  • 宏定义以下代码:
#define IN_RED SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), \
                                       BACKGROUND_RED |                 \
                                           BACKGROUND_INTENSITY)
#define IN_DEFAULT SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), \
                                           FOREGROUND_RED |                 \
                                               FOREGROUND_GREEN |           \
                                               FOREGROUND_BLUE)
  • In_Red,意味着将字体的背景变为红色;而In_DEFAULT,意味着将字体的背景变为默认状态(混合红、绿、蓝)
  • 定义函数:
void ShowInRed()
{
    IN_RED;
    printf("Red\n");
    return;
}
  • 效果展示:
    c++控制台菜单,交互,c语言,c++
  • 我们注意到后面的语句的背景也变红了。怎么解决这个问题呢?我们只需要在printf执行完之后,调用IN_DEFAULT,将字体背景重置为默认色即可。
  • 代码:
void ShowInRed()
{
    IN_RED;
    printf("Red\n");
    IN_DEFAULT;
    return;
}
  • 结果:
    c++控制台菜单,交互,c语言,c++

Gotoxy

void Gotoxy(int x, int y)
{
    COORD pos = {x, y};
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(hOut, pos);
    return;
}
  • 该函数的用处为将光标移动到(x, y)处

CursorOpr ⋆ ⋆ ⋆ \star\star\star

下面我们重点来讲以下实现原理

  • 原理:通过读取方向键来移动光标,然后用带背景色的字体重新覆盖原本的字体,这样就像是高亮选中了;当离开当前行,选择别的行的时候,就先用默认色覆盖当前行,然后移动光标,高亮覆盖光标后的行,实现退选和再选(如何实现可以看代码注释)
  • 代码:
#define UPKEY 72
#define DOWNKY 80 //宏定义上下方向键的ascii值
void Menu() //主菜单
{
    printf("欢迎来到学生奖学金管理系统\n");
    printf("**************************************************\n");
    printf("0) 退出程序\n");
    printf("1) 录入学生信息\n");
    printf("2) 显示全部学生信息\n");
    printf("3) 查找学生信息\n");
    printf("4) 删除学生信息\n");
    printf("5) 追加学生信息\n");
    printf("6) 修改学生信息\n");
    printf("7) 统计学生信息\n");
    printf("8) 奖学金名单\n");
    printf("9) 保存文件\n");
    printf("10)备份文件\n");
    printf("**************************************************\n");
    printf("请使用↑、↓和enter来实现选择和执行命令\n");
    printf("或者输入每个命令前面的数字来执行命令<0 - 9>\n");
    return;
}

void CursorPos1(int x) //光标覆盖菜单
{
    switch (x)
    {
    case 0:
        printf("0) 退出程序                                       ");
        break;
    case 1:
        printf("1) 录入学生信息                                   ");
        break;
    case 2:
        printf("2) 显示全部学生信息                               ");
        break;
    case 3:
        printf("3) 查找学生信息                                   ");
        break;
    case 4:
        printf("4) 删除学生信息                                   ");
        break;
    case 5:
        printf("5) 追加学生信息                                   ");
        break;
    case 6:
        printf("6) 修改学生信息                                   ");
        break;
    case 7:
        printf("7) 统计学生信息                                   ");
        break;
    case 8:
        printf("8) 奖学金名单                                     ");
        break;
    case 9:
        printf("9) 保存文件                                       ");
        break;
    case 10:
        printf("10)备份文件                                       ");
    }
    return;
}

int CursorOpr(int line, int deta, int lower, int upper, void (*p)(int))
{
/*
line:当前光标所在行数
deta:行数与菜单选项的差值。比如在main菜单中选项(0)在第2行(行数从0开始计算),所以deta等于2,即2 - 0
upper, lower:选项的上下界
(*P)(int):函数指针,选择哪个覆盖菜单
*/
    char c1, c2;
    Gotoxy(0, line);
    do
    {
        c2 = getch();
        if (c2 == DOWNKEY)
        {
            Gotoxy(0, line);
            IN_DEFAULT; //选择默认色
            (*p)(line - deta); //覆盖,实现退选
            if (line == upper) //如果已经到了上界,则返回下界,实现滚动高亮
                line = lower;
            else
                ++line; //行数+1
            Gotoxy(0, line);
            IN_CYAN;
            (*p)(line - deta);
        }
        if (c2 == UPKEY)
        {
            Gotoxy(0, line);
            IN_DEFAULT;
            (*p)(line - deta);
            if (line == lower)
                line = upper;
            else
                --line;
            Gotoxy(0, line);
            IN_CYAN;
            (*p)(line - deta);
        }
    } while ((c1 = getch()) != '\r');
    IN_RED;
    Gotoxy(0, line);
    (*p)(line - deta);
    IN_DEFAULT;
    return line - deta;
}

c++控制台菜单,交互,c语言,c++

TheConsoleSize

void TheConsoleSize(int width, int height)
{
    char chCmd[32];
    sprintf(chCmd, "mode con cols=%d lines=%d", width, height);
    system(chCmd);
    return;
}
  • 该函数的用处为调整控制台的大小

The Whole Code

#include <bits/stdc++.h>
#include <conio.h>
#include <windows.h>
using namespace std;
#define IN_RED SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), \
                                       BACKGROUND_RED |                 \
                                           BACKGROUND_INTENSITY)
#define IN_GREEN SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), \
                                         BACKGROUND_GREEN |               \
                                             BACKGROUND_INTENSITY)
#define IN_BULE SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), \
                                        BACKGROUND_BLUE |                \
                                            BACKGROUND_INTENSITY)
#define IN_YELLOW SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), \
                                          BACKGROUND_RED |                 \
                                              BACKGROUND_GREEN |           \
                                              BACKGROUND_INTENSITY)
#define IN_CYAN SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), \
                                        BACKGROUND_GREEN |               \
                                            BACKGROUND_BLUE |            \
                                            BACKGROUND_INTENSITY)
#define IN_MAGENTA SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), \
                                           BACKGROUND_BLUE |                \
                                               BACKGROUND_RED |             \
                                               BACKGROUND_INTENSITY)
#define IN_WHITE SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), \
                                         BACKGROUND_RED |                 \
                                             BACKGROUND_GREEN |           \
                                             BACKGROUND_BLUE |            \
                                             BACKGROUND_INTENSITY)
#define IN_DEFAULT SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), \
                                           FOREGROUND_RED |                 \
                                               FOREGROUND_GREEN |           \
                                               FOREGROUND_BLUE)
#define UPKEY 72
#define DOWNKEY 80

void Menu()
{
    printf("欢迎来到学生奖学金管理系统\n");
    printf("**************************************************\n");
    printf("0) 退出程序\n");
    printf("1) 录入学生信息\n");
    printf("2) 显示全部学生信息\n");
    printf("3) 查找学生信息\n");
    printf("4) 删除学生信息\n");
    printf("5) 追加学生信息\n");
    printf("6) 修改学生信息\n");
    printf("7) 统计学生信息\n");
    printf("8) 奖学金名单\n");
    printf("9) 保存文件\n");
    printf("10)备份文件\n");
    printf("**************************************************\n");
    printf("请使用↑、↓和enter来实现选择和执行命令\n");
    printf("或者输入每个命令前面的数字来执行命令<0 - 9>\n");
    return;
}

void CursorPos1(int x)
{
    switch (x)
    {
    case 0:
        printf("0) 退出程序                                       ");
        break;
    case 1:
        printf("1) 录入学生信息                                   ");
        break;
    case 2:
        printf("2) 显示全部学生信息                               ");
        break;
    case 3:
        printf("3) 查找学生信息                                   ");
        break;
    case 4:
        printf("4) 删除学生信息                                   ");
        break;
    case 5:
        printf("5) 追加学生信息                                   ");
        break;
    case 6:
        printf("6) 修改学生信息                                   ");
        break;
    case 7:
        printf("7) 统计学生信息                                   ");
        break;
    case 8:
        printf("8) 奖学金名单                                     ");
        break;
    case 9:
        printf("9) 保存文件                                       ");
        break;
    case 10:
        printf("10)备份文件                                       ");
    }
    return;
}

void TheConsoleSize(int width, int height)
{
    char chCmd[32];
    sprintf(chCmd, "mode con cols=%d lines=%d", width, height);
    system(chCmd);
    return;
}

void Gotoxy(int x, int y)
{
    COORD pos = {x, y};
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(hOut, pos);
    return;
}

int CursorOpr(int line, int deta, int lower, int upper, void (*p)(int))
{
/*
line:当前光标所在行数
deta:行数与菜单选项的差值。比如在main菜单中选项(0)在第2行(行数从0开始计算),所以deta等于2,即2 - 0
upper, lower:选项的上下界
(*P)(int):函数指针,选择哪个覆盖菜单
*/
    char c1, c2;
    Gotoxy(0, line);
    do
    {
        c2 = getch();
        if (c2 == DOWNKEY)
        {
            Gotoxy(0, line);
            IN_DEFAULT; //选择默认色
            (*p)(line - deta); //覆盖,实现退选
            if (line == upper) //如果已经到了上界,则返回下界,实现滚动高亮
                line = lower;
            else
                ++line; //
            Gotoxy(0, line);
            IN_CYAN;
            (*p)(line - deta);
        }
        if (c2 == UPKEY)
        {
            Gotoxy(0, line);
            IN_DEFAULT;
            (*p)(line - deta);
            if (line == lower)
                line = upper;
            else
                --line;
            Gotoxy(0, line);
            IN_CYAN;
            (*p)(line - deta);
        }
    } while ((c1 = getch()) != '\r');
    IN_RED;
    Gotoxy(0, line);
    (*p)(line - deta);
    IN_DEFAULT;
    return line - deta;
}

int main()
{
    int n, line = 2; // 对应menu()的1)
    char c1, c2;
    bool b;
    while (1)
    {
        system("cls");
        TheConsoleSize(80, 50);
        Menu();
        if ((c1 = getch()) == -32)
        {
            n = CursorOpr(line, 2, 2, 12, CursorPos1);
        }
        else
        {
            char tmp;
            scanf("%c", &tmp);
            if (tmp >= '0' && tmp <= '9')
                n = tmp - '0';
            else
                n = tmp;
        }
    }
    system("pause");
    return 0;
}

结语

参考资料

  • https://blog.csdn.net/LLLLQZ/article/details/110405100
  • https://zxfdog.blog.csdn.net/article/details/103764196

每日一句

我有迷魂招不得,雄鸡一声天下白。
少年心事当拏云,谁念幽寒坐呜呃。
——李贺《致酒行》文章来源地址https://www.toymoban.com/news/detail-728377.html

到了这里,关于【课程设计】Windows控制台上的交互界面(通过c/c++,在windows控制台实现选择菜单(可通过方向键选择))的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python 使用tkinter设计Windows网页或应用的用户注册登录界面

    上一篇:Python 自定义模块和包设计英语生词本(文件版)-CSDN博客 紧接上一篇博文,当我们熟练掌握自定义模块和包、掌握文件的的读取与写入、掌握正则表达式内置模块\\\"re\\\"、掌握GUI(图形界面)的部分组件后,接着我们将要以上的知识点结合起来,设计一个GUI(图形界面

    2024年02月03日
    浏览(49)
  • spring 用户通过交互界面登录成功事件源码分析

    spring-security-web:5.6.7 用户通过前端交互界面登录成功触发此事件 org.springframework.security.authentication.event.InteractiveAuthenticationSuccessEvent 事件触发过程 用户名密码认证过滤器 org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter 认证处理过滤器 org.springframework.security.we

    2024年02月16日
    浏览(39)
  • 【MySQL】MySQL的安装与配置环境变量(使其在控制台上使用)

    作者主页: paper jie_博客 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文录入于《MySQL》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造,将MySQL基础知识一网打尽,希望可以帮到读者们哦。 其他专栏:《算法详

    2024年02月06日
    浏览(42)
  • windows10,向日葵,todesk远程控制电脑,通过插座实现远程开机,设置bios通电自动启动电脑后不生效,不成功

    目的是想实现,通过app控制智能插座的通电和断电,来实现远程开电脑, 但是按照网上教程设置bios电源管理,通电后为开机后,不管怎么测试就是不成功, 通过尝试发现是windows10的快速启动功能的问题, 当关机的时候,它实际上是在利用高级休眠功能,这就是此功能还可能

    2024年02月10日
    浏览(173)
  • 人工智能交互系统界面设计(Tkinter界面设计)

    在现代信息化时代,图形化用户界面(Graphical User Interface, GUI)已经成为各种软件应用和设备交互的主流方式,与传统的命令行界面(CLI)相比,GUI 具有直观性、易用性、交互性、可视化和多任务处理等优势。设计良好的用户交互界面可以让用户以更加直观、友好的方式与计

    2024年01月16日
    浏览(46)
  • 数据库课程设计 python+mysql+图形化界面

    进行操作的表   增加界面   删除界面   修改界面    查找界面  

    2024年02月09日
    浏览(40)
  • 高校人员信息管理系统(Java课程设计,带图形界面版)

    题目 1 、问题描述 某高校有四类员工:教师、实验员、行政人员,教师兼行政人员;共有的信息包括:编号、姓名、性别、年龄等。其中,教师还包含的信息有:所在系部、专业、职称;实验员还包含的信息由:所在实验室、职务;行政人员还包含的信息有:政治面貌、职称

    2024年02月09日
    浏览(43)
  • 实习记录(5)——PyQT5界面设计及交互

    首先按照甲方PPT上给的界面做了,在写内部逻辑的时候发现有不少问题,没考虑到使用者的感受,甚至我觉得根本用不了。于是我和小哥讨论了一下之后,我按照我的想法做了一个新的页面出来,能实现需求的同时,让使用的人体验更好也更直观。 昨天安装成功了PyQT5,今天

    2023年04月24日
    浏览(39)
  • 前端用户体验设计:创造卓越的用户界面和交互

    💂 个人网站:【工具大全】【游戏大全】【神级源码资源网】 🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】 💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 用户体验(User Experience,UX)是前端开发中至关重要的一环。一个优秀的用户体验

    2024年02月04日
    浏览(47)
  • 微软宣布 Windows Copilot:基于 AI,全新的 Windows 人机交互方式

    原文链接:https://www.winisle.com/post/introducing-windows-copilot/  今天,微软正式在 Build 2023 期间宣布了 Windows Copilot 功能。这项基于 AI 的功能即将重新定义 Windows 的人机交互方式。Windows Copilot 的三大功能: Windows Copilot 整合了 Bing 和 ChatGPT 功能,可以直接向 Windows 提问(比如:如何

    2024年02月13日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包