社区
C++ 语言
帖子详情
如何用c++实现多级交互菜单?
redsprite
2007-03-05 04:12:35
自己做了下,发现问题很多,想不到办法解决。向做过的朋友请教下,谢谢!任务紧,时间得加快了。
具体要求是:控制台界面的,采用竖式列表菜单项,如:
1)Item1;
2)Item2;
... ...
5)Item5;
Please input your choice(1-5):
菜单是多级的,也就是每一项下面还有类似的菜单项。下级菜单里面包括返回上一级菜单的项目和退出的项目。输入选择的时候,支持单选和多选。
非常感谢!
...全文
1071
11
打赏
收藏
如何用c++实现多级交互菜单?
自己做了下,发现问题很多,想不到办法解决。向做过的朋友请教下,谢谢!任务紧,时间得加快了。 具体要求是:控制台界面的,采用竖式列表菜单项,如: 1)Item1; 2)Item2; ... ... 5)Item5; Please input your choice(1-5): 菜单是多级的,也就是每一项下面还有类似的菜单项。下级菜单里面包括返回上一级菜单的项目和退出的项目。输入选择的时候,支持单选和多选。 非常感谢!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
11 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
redsprite
2007-03-20
打赏
举报
回复
输入的错误处理没能很好的包括,例如输入1)就会死循环。不过已经基本完成了,谢谢!给分咯!
boxban
2007-03-15
打赏
举报
回复
//Menu.cpp
#include <assert.h>
#include <iostream>
#include "Menu.h"
#include "MenuWidget.h"
Menu* Menu::m_sActiveMenu = NULL;
Menu::Menu() : m_pParentMenu(NULL)
{
}
Menu::Menu(const std::string& strName, Menu* pParentMenu /* = NULL */)
: MenuWidget(strName), m_pParentMenu(pParentMenu)
{
}
Menu::~Menu()
{
for(size_t i = 0; i < m_vWidgets.size(); ++i)
delete m_vWidgets[i];
}
//return item index (zero-based)
size_t Menu::appendMenuWidget(MenuWidget* pMenuWidget)
{
m_vWidgets.push_back(pMenuWidget);
return (m_vWidgets.size() - 1);
}
MenuWidget* Menu::getMenuWidget(size_t idx)
{
return ((idx < m_vWidgets.size()) ? m_vWidgets[idx] : NULL);
}
void Menu::onClick(size_t idx, void* arg /* = NULL */)
{
if (getActiveMenu() != this){
//this is a sub-menu
setActiveMenu(this);
return;
}
if (idx < m_vWidgets.size()){
MenuWidget* pWidget = m_vWidgets[idx];
if (pWidget)
pWidget->onClick(idx, arg);
}
}
void Menu::draw()
{
using namespace std;
cout << getName() << endl;
cout << "=============================================" << endl;
MenuWidget* pWidget = NULL;
for(size_t i = 0; i < m_vWidgets.size(); ++i){
pWidget = m_vWidgets[i];
if (pWidget != NULL){
cout << i << ")\t" << pWidget->getName() << endl;
}else{ // treat it as a seperator
cout << i <<")\t-----------------------------------" << endl;
}
}
cout << "=============================================" << endl << endl;
}
//####################################################################
//====================================================================
//main.cpp
#include <iostream>
#include <assert.h>
#include "Menu.h"
#include "MenuItem.h"
using namespace std;
void handlerReturnToParentMenu(void* arg, MenuItem* pItem)
{
Menu* pMenu = Menu::getActiveMenu();
assert(pMenu->getParentMenu() != NULL);
Menu::setActiveMenu(pMenu->getParentMenu());
}
void handlerNormalItem(void* arg, MenuItem* pItem)
{
cout << "MenuItem " << pItem->getName() << " clicked:" << pItem->getItemData() << endl;
}
void handlerExit(void* arg, MenuItem* pItem)
{
cout << "MenuItem " << pItem->getName() << " clicked:" << pItem->getItemData() << endl;
Menu::setActiveMenu(NULL);
}
Menu* createMenu()
{
Menu* mainMenu = new Menu("Main menu");
MenuItem* item = new MenuItem("item-1", &handlerNormalItem, 1);
mainMenu->appendMenuWidget(item);
item = new MenuItem("item-2", &handlerNormalItem, 2);
mainMenu->appendMenuWidget(item);
item = new MenuItem("item-3", &handlerNormalItem, 3);
mainMenu->appendMenuWidget(item);
Menu* submenu = new Menu("sub-menu", mainMenu);
submenu->appendMenuWidget(new MenuItem("sub-item-11", &handlerNormalItem, 11));
submenu->appendMenuWidget(new MenuItem("sub-item-12", &handlerNormalItem, 12));
submenu->appendMenuWidget(new MenuItem("sub-item-13", &handlerNormalItem, 13));
submenu->appendMenuWidget(new MenuItem("return to up-level", &handlerReturnToParentMenu, 0));
mainMenu->appendMenuWidget(submenu);
mainMenu->appendMenuWidget(NULL); //add a seperator
item = new MenuItem("Exit", &handlerExit, 0);
mainMenu->appendMenuWidget(item);
return mainMenu;
}
void main()
{
Menu::setActiveMenu(createMenu());
int i;
while(Menu::getActiveMenu()){
Menu::getActiveMenu()->draw();
cout << "input item" << endl;
cin >> i;
Menu::getActiveMenu()->onClick(i);
}
}
boxban
2007-03-15
打赏
举报
回复
//MenuWidget.h
#pragma once
#include <stdlib.h>
#include <string>
class MenuWidget
{
public:
MenuWidget() {}
MenuWidget(const std::string& strName) : m_strName(strName) {}
virtual ~MenuWidget() {}
public:
const std::string& getName() const { return m_strName; }
void setName(const std::string& strName) { m_strName = strName;}
public: //interface
virtual void onClick(size_t idx, void* arg = NULL) = 0;
private:
std::string m_strName;
};
#endif
//####################################################################
//====================================================================
//MenuItem.h
#pragma once
#include <string>
#include "MenuWidget.h"
class MenuItem;
typedef unsigned int ITEMDATA;
typedef void (*ITEM_HANDLER)(void* arg, MenuItem* pItem);
class MenuItem : public MenuWidget
{
public:
MenuItem() : m_pfHandler(NULL), m_itemData(0) {}
MenuItem(const std::string& strName, ITEM_HANDLER pfHandler = NULL, ITEMDATA itemData = 0)
: MenuWidget(strName), m_pfHandler(pfHandler), m_itemData(itemData)
{}
public:
const ITEM_HANDLER getHandler() const { return m_pfHandler;}
void setHandler(ITEM_HANDLER pfHandler) { m_pfHandler = pfHandler;}
ITEMDATA getItemData() const { return m_itemData; }
void setItemData(ITEMDATA data) { m_itemData = data; }
virtual void onClick(size_t idx, void* arg = NULL)
{
if(m_pfHandler != NULL)
(*m_pfHandler)(arg, this);
}
private:
ITEM_HANDLER m_pfHandler;
ITEMDATA m_itemData;
};
//####################################################################
//====================================================================
//Menu.h
#pragma once
#include <string>
#include <vector>
#include "MenuWidget.h"
class Menu : public MenuWidget
{
public:
Menu();
Menu(const std::string& strName, Menu* pParentMenu = NULL);
~Menu();
public:
//return item index (zero-based)
size_t appendMenuWidget(MenuWidget* pMenuWidget);
//insert item at postion idx
bool insertMenuWidget(MenuWidget* pMenuWidget, int idx);
MenuWidget* getMenuWidget(size_t idx);
// interface from MenuWidget
virtual void onClick(size_t idx, void* arg = NULL);
public:
void draw();
void setParentMenu(Menu* pMenu) { m_pParentMenu = pMenu; }
Menu* getParentMenu() { return m_pParentMenu; }
static void setActiveMenu(Menu* pMenu) { m_sActiveMenu = pMenu;}
static Menu* getActiveMenu() { return m_sActiveMenu; }
private:
std::vector<MenuWidget*> m_vWidgets;
Menu* m_pParentMenu;
static Menu* m_sActiveMenu;
};
todototry
2007-03-14
打赏
举报
回复
mark
redsprite
2007-03-14
打赏
举报
回复
还是没有有价值的结果啊。再等等,没有就结贴咯!
jixingzhong
2007-03-06
打赏
举报
回复
打印菜单,
等待用户输入,
然后执行相应的功能就是了 ~
taodm
2007-03-06
打赏
举报
回复
C/C++没有提供标准清屏接口。所以,在windows下和unix下必须要2调不同接口函数的,无法使用完全相同的代码的。
当然,如果你不介意输出无数的退格键(\b)来实现清屏的话,代码可以统一。
redsprite
2007-03-06
打赏
举报
回复
程序需要在windows和unix下都能清屏,该怎么实现呢?
redsprite
2007-03-06
打赏
举报
回复
我已经实现了,不过代码感觉比较累赘,还没有想到什么简单方便的方法来做。
清屏的问题,使用宏定义来区分不同平台,windows下调用system('cls');unix下面则调用system("clear");
虽然做完了,但是感觉还是有点不满意,继续征求更好的实现方法,比如可以作为类来方便增加,减少菜单项和层级。最好是层级和数量不限的。最为一个可以经常调用的工具类。这样会方便大家啊!谢谢楼上的回帖。
redsprite
2007-03-05
打赏
举报
回复
界面是字符的,需要完整的代码。谢谢!
taodm
2007-03-05
打赏
举报
回复
输出,等待输入,清屏,重新输出。
这没难度呀。
Ajax 四级导航
菜单
ASP+Access动态版
Ajax 四级导航
菜单
ASP+Access动态版 网站首页网页特效源码分类最新更新下载排行用户留言 繁體中文 加入收藏 广告服务 源码爱好者下载资源导航: ASP PHP .NET C# JSP Java VC/
C++
VB Delphi Ajax 脚本资源 jQuery Flash 电子书 方案文档 软件 热点检索: wordpress留言企业BlogAjaxShopCMS源代码下载编辑器 亿恩双线托管,仅3999元天下合租,25G空间仅158元/年全站通栏广告火爆招租中双核租用+高防护,仅499元/月中国数据,全国十大域名提供商 您的当前位置: 源码爱好者 » A
基于
C++
的红外警报系统(毕设)
# 红外警报系统(毕设) > * 描述:以STM32为主控平台,DIY智能防盗警报系统;集合声光警报、人机
交互
、警报时间记录与查询、管理员身份认证等功能。 * 程序介绍:基于前后台中断响应框架,自定义多个定时器中断配合完成如下功能: 1.
交互
界面:OLED
交互
界面(
多级
菜单
显示万年历、警报记录、时间设置、用户认证等) 2.
交互
控制:4*4矩阵按键输入 3.信号检测:一对人体红外监测模块 4.光报警:三色灯(中断控制闪烁&使能) 5.声报警:语音合成模块(串口报文收发) 6.万年历:带UI可单独设置时分秒(以定时器作时钟源自主开发) 7.RFID:射频识别模块,做门禁&管理员身份认证
Cocos2d-x 3.x视频教程:ObjC、Swift、
C++
、Java
交互
本课程主要讲解了在Cocos2d-x 3.x中如何让Swift、Objective-C、
C++
和Java进行
交互
,以便利用历史遗留的代码。
不错哦|
多级
菜单
实现
起来就是这么简单!
摘要 产品是面向用户的,用户需要的仅仅是功能以及有好的
交互
界面,
多级
菜单
在其中扮演着重要的角色,有限的按键
实现
复杂的界面,层层相扣,标志法对于
菜单
的管理相当费劲,多了自己都会被自己绕晕...下面介绍一种还算不错的
多级
菜单
是
实现
方式 这个框架本身不复杂,小伙伴们可以直接看源码,有什么问题,可以一起交流 硬件连接 STM32F407ZGT6 ST7789 LCD屏(SPI1,复用开发板NRF24L01接口) 3个按键 PC7、PC8、PC9 代码
实现
实现
起来比较简单,直接进入代码部分,我使用的
一、
c++
学习(功能
菜单
)
从今天开始我们就进来
c++
后端的培训课了,大概每周一节,如果没时间会提前通知,啥时候讲完我也不知道,因为备课都没备完。
C++ 语言
64,662
社区成员
250,487
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章