自学内容网 自学内容网

C语言课程设计题目五:西文下拉菜单的设计

题目五:西文下拉菜单的设计

主要功能:

  1. 完成一个类似 DevC++集成系统下拉菜单的设计。
  2. 不要求实现各子菜单的功能。

要求: 可以通过光标键的移动来选择不同的菜单项,被选择的菜单项反相显示,当选定某个菜单项后,按回车键可以实现一个简单的动作。

先学习一下键盘事件
百度搜菜鸟教程->C/C++ 获取键盘事件
https://www.runoob.com/w3cnote/c-get-keycode.html#:~:text=C/C++%20%E8%8E%B7%E5%8F%96%E9%94%AE%E7%9B%98

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<conio.h>  //用于获取键盘输入
#include<Windows.h>

#define MAX_MENU_ITEMS 10

typedef struct {
char name[50];
}MenuItem;

void drawMenu(MenuItem* items, int itemCount, int selectedItem){
system("cls");
printf("\n");
printf("+-----------------------------+\n");
printf("|         西文下拉菜单        |\n");
printf("+-----------------------------+\n");

for (int i = 0; i < itemCount; i++) {
if (i == selectedItem) {
//当前选中项反相显示
printf("| [>] %-23s |\n", items[i].name);  
}
else {
printf("|    %-24s |\n", items[i].name);
}
}
printf("+-----------------------------+\n");
}

int main() {
MenuItem menu[MAX_MENU_ITEMS] = {
{"新建文件"},
{"打开文件"},
{"保存文件"},
{"另存为"},
{"关闭文件"},
{"测试文本"},
{"测试文本"},
{"测试文本"},
{"测试文本"},
{"退出"}
};
//计算menu长度
int itemCount = sizeof(menu) / sizeof(menu[0]);
int selectedItem = 0;

while (1) {
drawMenu(menu, itemCount, selectedItem);
// 获取键盘输入
int key = _getch();
switch (key) {
// 上箭头
case 72:
if (selectedItem > 0) {
selectedItem--;
}
break;
// 下箭头
case 80:
if (selectedItem < itemCount - 1) {
selectedItem++;
}
break;
//回车键
case 13:
printf("\n选择了: %s \n", menu[selectedItem].name);
Sleep(1000);
break;
}
}
return 0;
}

在这里插入图片描述
在这里插入图片描述

设计子菜单

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<conio.h>  //用于获取键盘输入
#include<Windows.h>

// 主菜单最多显示多少行
#define MAX_MENU_ITEMS 10
// 子菜单最多显示多少行
#define MAX_SUBMENU_ITEMS 5

typedef struct {
char name[50];
//子菜单数量
int submenuCount;
//子菜单以数组存储
char submenu[MAX_SUBMENU_ITEMS][50];
}MenuItem;

// 西文下拉菜单
void drawMenu(MenuItem* items, int itemCount, int selectedItem,int subMenuIndex){
system("cls");
printf("\n");
printf("+-----------------------------+\n");
printf("|         西文下拉菜单        |\n");
printf("+-----------------------------+\n");

for (int i = 0; i < itemCount; i++) {
if (i == selectedItem) {
//当前选中项反相显示
printf("| [>] %-23s |\n", items[i].name);  
}
else {
printf("|    %-24s |\n", items[i].name);
}
}
printf("+-----------------------------+\n");

if (subMenuIndex != -1 && items[selectedItem].submenuCount > 0) {
printf("\n+-----------------------------+\n");
printf("|     子菜单: %s     |\n", items[selectedItem].name);
printf("+-----------------------------+\n");

for (int j = 0; j < items[selectedItem].submenuCount; j++) {
if (j == subMenuIndex) {
// 当前选中项反相显示
printf("| [>] %-23s |\n", items[selectedItem].submenu[j]);
}
else {
printf("|    %-24s |\n", items[selectedItem].submenu[j]);
}
}
printf("+-----------------------------+\n");
}
}

int main() {
MenuItem menu[MAX_MENU_ITEMS] = {
{"新建文件",0},
{"打开文件",0},
{"保存文件",0},
{"另存为",0},
{"关闭文件",0},
{"测试子菜单",3,{"子菜单1", "子菜单2", "子菜单3"}},
{"测试文本",2,{"子菜单A", "子菜单B"}},
{"测试文本",0},
{"退出",0}
};
//计算menu长度
int itemCount = sizeof(menu) / sizeof(menu[0]);
int selectedItem = 0;
// 
int subMenuIndex = -1;

while (1) {
drawMenu(menu, itemCount, selectedItem,subMenuIndex);
// 获取键盘输入
int key = _getch();
switch (key) {
// 上箭头
case 72:
if (subMenuIndex != -1 && selectedItem < itemCount && menu[selectedItem].submenuCount > 0) {
if (selectedItem > 0) {
selectedItem--;
}
}
else {
if (selectedItem > 0) {
selectedItem--;
subMenuIndex = -1;
}
}
break;
// 下箭头
case 80:
if (subMenuIndex != -1 && selectedItem < itemCount && menu[selectedItem].submenuCount > 0) {
if (subMenuIndex < menu[selectedItem].submenuCount - 1) {
subMenuIndex++;
}
}
else {
if (selectedItem < itemCount - 1) {
selectedItem++;
subMenuIndex = -1;
}
}
break;

// 左箭头
case 75:  
if (subMenuIndex != -1 && selectedItem < itemCount && menu[selectedItem].submenuCount > 0) {
subMenuIndex = -1;
}
break;
// 右箭头
case 77: 
if (selectedItem < itemCount && menu[selectedItem].submenuCount > 0) {
subMenuIndex = 0;
}
break;
//回车键
case 13: 
if (subMenuIndex == -1) {
printf("\n选择了: %s\n", menu[selectedItem].name);
}
else {
printf("\n选择了: %s -> %s\n", menu[selectedItem].name, menu[selectedItem].submenu[subMenuIndex]);
}
Sleep(1000);
break;
}
}
return 0;
}

在这里插入图片描述


原文地址:https://blog.csdn.net/m0_73678713/article/details/142557794

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!