社区
C++ 语言
帖子详情
如何用c++实现多级交互菜单?
redsprite
2007-03-05 04:12:35
自己做了下,发现问题很多,想不到办法解决。向做过的朋友请教下,谢谢!任务紧,时间得加快了。
具体要求是:控制台界面的,采用竖式列表菜单项,如:
1)Item1;
2)Item2;
... ...
5)Item5;
Please input your choice(1-5):
菜单是多级的,也就是每一项下面还有类似的菜单项。下级菜单里面包括返回上一级菜单的项目和退出的项目。输入选择的时候,支持单选和多选。
非常感谢!
...全文
1192
11
打赏
收藏
如何用c++实现多级交互菜单?
自己做了下,发现问题很多,想不到办法解决。向做过的朋友请教下,谢谢!任务紧,时间得加快了。 具体要求是:控制台界面的,采用竖式列表菜单项,如: 1)Item1; 2)Item2; ... ... 5)Item5; Please input your choice(1-5): 菜单是多级的,也就是每一项下面还有类似的菜单项。下级菜单里面包括返回上一级菜单的项目和退出的项目。输入选择的时候,支持单选和多选。 非常感谢!
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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
打赏
举报
回复
输出,等待输入,清屏,重新输出。
这没难度呀。
c++
多级
菜单
实现
插入、删除、修改
通过以上步骤,我们可以构建一个完整的
C++
多级
菜单
系统,
实现
对学生信息的插入、删除和修改功能,并确保在插入新数据时正确判断其是否存在。这个项目不仅锻炼了基础的
C++
编程技能,还涉及到了文件操作、数据结构和...
oled_oled
菜单
_oled_oled
多级
菜单
_
6. **代码
实现
**:使用
C++
或Python等编程语言,结合OLED库函数编写代码,
实现
菜单
的创建、更新和事件处理。 7. **功耗优化**:在OLED屏幕上显示信息会消耗电力,因此在设计时要考虑节能策略,例如在无操作时自动...
基于stm32f103zet6+TFTLCD/OLED的
多级
菜单
设计方法
在实际开发过程中,开发者可能需要使用诸如Keil uVision或IAR Embedded Workbench这样的IDE,配合STM32CubeMX进行初始化配置,然后编写C/
C++
代码来
实现
菜单
功能。同时,可能还需要了解并利用像STM32 HAL或LL库这样的...
C++
面向对象语言自制
多级
菜单
通过以上技术,我们可以构建一个功能完善的
C++
多级
菜单
系统。这个系统不仅展示了面向对象编程的核心概念,也体现了良好的代码组织和设计原则。在实际编程过程中,理解并熟练运用这些知识点将有助于创建高效、可扩展...
1602
多级
菜单
显示
软件上,一般使用C、
C++
或MicroPython等编程语言编写控制程序,
实现
按键扫描、
菜单
逻辑处理以及LCD1602的显示更新。 在设计
多级
菜单
时,应考虑
菜单
结构的逻辑性和易用性,确保用户能直观地理解和操作。同时,考虑到...
C++ 语言
65,182
社区成员
250,527
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章