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;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值