oled多级菜单链表
时间: 2025-01-07 18:10:57 浏览: 78
### 实现 OLED 显示屏上多级菜单结构
为了在 OLED 显示屏上实现一个多级菜单结构,可以采用链表作为底层数据结构来管理菜单项及其子菜单。具体来说,双向链表 (Doubly Linked List) 是一种合适的选择,因为其允许前后遍历以及方便地插入和删除节点。
#### 节点定义
每个菜单项可以用一个节点表示,该节点不仅存储当前菜单的信息,还保存指向父菜单、前驱和后继菜单项的指针:
```cpp
struct MenuItem {
std::string name;
bool (*action)();
MenuItem* parent = nullptr;
MenuItem* prev = nullptr;
MenuItem* next = nullptr;
// 子菜单列表
DoublyLinkedList<MenuItem> subMenuItems;
};
```
这里 `subMenuItems` 表示当前菜单下的所有子菜单项组成的双向链表[^1]。
#### 插入新菜单项
当需要在一个特定位置插入新的菜单项时,可以通过调整相邻节点之间的连接关系完成操作。例如,在给定的位置插入一个新的菜单项 `newNode`:
```cpp
void insertAfter(MenuItem*& current, const std::string& itemName){
auto newNode = new MenuItem{itemName};
if (!current->next){ // 如果是最后一个元素,则直接追加到末尾
current->next = newNode;
newNode->parent = current->parent;
newNode->prev = current;
} else{
newNode->next = current->next;
newNode->prev = current;
current->next->prev = newNode; // 更新后续结点之前的链接
current->next = newNode; // 将当前结点之后设置为新创建的结点
newNode->parent = current->parent; // 继承相同的父级引用
}
}
```
此函数会将名为 `itemName` 的新菜单项插入到现有菜单项 `current` 后面,并保持正确的父子关系。
#### 遍历显示菜单
对于 OLED 屏幕上的展示逻辑,可以根据用户的输入导航于不同级别的菜单之间并更新屏幕内容。每当进入下一层或返回上级时,都需要重新绘制整个可见区域内的选项列表。
```cpp
void traverseAndDisplay(const MenuItem* startItem){
while(startItem != nullptr){
oled.clear();
oled.setCursor(0, 0);
oled.print("Current Menu:");
printSubMenu(&startItem->subMenuItems);
int choice = getUserChoice(); // 获取用户选择
switch(choice){
case UP_ARROW :
moveSelectionUp(&startItem->subMenuItems); break;
case DOWN_ARROW :
moveSelectionDown(&startItem->subMenuItems); break;
case SELECT_KEY :
handleSelectKey(*startItem); break;
default:
returnToParent(startItem);
}
delay(200); // 延迟防止按键抖动影响体验
}
}
// 辅助方法用于打印单层菜单项目
void printSubMenu(DoublyLinkedList<MenuItem>* items){
for(auto item : *items){
oled.println(item.name.c_str());
}
}
```
上述代码片段展示了如何递归地访问各级别的菜单并将它们呈现在屏幕上。注意这里的 `getUserChoice()` 和其他交互处理部分需根据实际硬件接口编写相应驱动程序[^2]。
阅读全文
相关推荐


















