SimpleWindow
载入中...
搜索中...
未找到
MenuBase.h
1#pragma once
2
3#include "MenuItem.h"
4#include <Windows.h>
5#include <initializer_list>
6#include <map>
7#include <memory>
8#include <tuple>
9#include <unordered_map>
10#include <vector>
11
12namespace sw
13{
18 {
19 private:
23 struct _PopupMenuInfo {
24 std::shared_ptr<MenuItem> pItem; // 菜单项
25 HMENU hSelf; // 菜单句柄
26 };
27
31 struct _MenuItemDependencyInfo {
32 HMENU hParent; // 所在菜单的句柄
33 HMENU hSelf; // 若本身含有子项,则此项为本身的菜单句柄,否则为NULL
34 int index; // 所在菜单中的索引
35 };
36
37 private:
41 HMENU _hMenu = NULL;
42
46 std::vector<std::shared_ptr<MenuItem>> _items;
47
51 std::vector<_PopupMenuInfo> _popupMenus;
52
56 std::vector<std::shared_ptr<MenuItem>> _ids;
57
61 std::unordered_map<MenuItem *, _MenuItemDependencyInfo> _dependencyInfoMap;
62
63 protected:
67 MenuBase(HMENU hMenu);
68
69 MenuBase(const MenuBase &) = delete; // 删除拷贝构造函数
70 MenuBase(MenuBase &&) = delete; // 删除移动构造函数
71 MenuBase &operator=(const MenuBase &) = delete; // 删除拷贝赋值运算符
72 MenuBase &operator=(MenuBase &&) = delete; // 删除移动赋值运算符
73
74 public:
78 virtual ~MenuBase();
79
83 HMENU GetHandle();
84
88 void Update();
89
93 void SetItems(std::initializer_list<MenuItem> items);
94
101 bool SetSubItems(MenuItem &item, std::initializer_list<MenuItem> subItems);
102
107 void AddItem(const MenuItem &item);
108
115 bool AddSubItem(MenuItem &item, const MenuItem &subItem);
116
122 bool RemoveItem(MenuItem &item);
123
130
136 MenuItem *GetMenuItem(HMENU hMenu);
137
143 MenuItem *GetMenuItem(std::initializer_list<int> path);
144
150 MenuItem *GetMenuItem(std::initializer_list<std::wstring> path);
151
158
165
172 bool GetEnabled(MenuItem &item, bool &out);
173
180 bool SetEnabled(MenuItem &item, bool value);
181
188 bool GetChecked(MenuItem &item, bool &out);
189
196 bool SetChecked(MenuItem &item, bool value);
197
204 bool SetText(MenuItem &item, const std::wstring &value);
205
212 bool SetBitmap(MenuItem &item, HBITMAP hBitmap);
213
221 bool SetCheckBitmap(MenuItem &item, HBITMAP hBmpUnchecked, HBITMAP hBmpChecked);
222
223 private:
227 void _ClearAddedItems();
228
235 void _AppendMenuItem(HMENU hMenu, std::shared_ptr<MenuItem> pItem, int index);
236
242 _MenuItemDependencyInfo *_GetMenuItemDependencyInfo(MenuItem &item);
243
250 MenuItem *_GetMenuItemByTag(std::vector<std::shared_ptr<MenuItem>> &items, uint64_t tag);
251
252 protected:
258 virtual int IndexToID(int index) = 0;
259
265 virtual int IDToIndex(int id) = 0;
266 };
267}
菜单类型的基类
Definition MenuBase.h:18
MenuItem * GetMenuItem(std::initializer_list< std::wstring > path)
通过菜单项的text来获取菜单项
bool SetChecked(MenuItem &item, bool value)
设置菜单项是否选中
void SetItems(std::initializer_list< MenuItem > items)
初始化菜单并添加菜单项
MenuItem * GetParent(MenuItem &item)
获取当前菜单中指定菜单项的直接父菜单项
MenuItem * GetMenuItemByTag(uint64_t tag)
通过tag值获取菜单项
MenuItem * GetMenuItem(std::initializer_list< int > path)
通过索引来获取菜单项
bool GetChecked(MenuItem &item, bool &out)
获取一个值,表示菜单项是否选中
bool SetSubItems(MenuItem &item, std::initializer_list< MenuItem > subItems)
重新设置当前菜单中某个菜单项的子项
void AddItem(const MenuItem &item)
添加新的菜单项到菜单
MenuItem * GetMenuItem(int id)
通过id获取菜单项
bool SetEnabled(MenuItem &item, bool value)
设置菜单项是否可用
virtual ~MenuBase()
释放资源
bool RemoveItem(MenuItem &item)
移除当前菜单中的某个子项
bool SetCheckBitmap(MenuItem &item, HBITMAP hBmpUnchecked, HBITMAP hBmpChecked)
设置菜单不同选中状态下显示的位图
HMENU GetHandle()
获取菜单句柄
virtual int IDToIndex(int id)=0
根据ID获取索引
virtual int IndexToID(int index)=0
根据索引获取ID
bool SetText(MenuItem &item, const std::wstring &value)
设置菜单项文本
bool AddSubItem(MenuItem &item, const MenuItem &subItem)
向当前菜单中的某个菜单项添加新的子项
void Update()
更新菜单,该操作会导致菜单项的Enabled、Checked等恢复到初始状态
bool GetEnabled(MenuItem &item, bool &out)
获取一个值,表示菜单项是否可用
MenuItem * GetMenuItem(HMENU hMenu)
通过句柄获取菜单项
MenuBase(HMENU hMenu)
初始化菜单
bool SetBitmap(MenuItem &item, HBITMAP hBitmap)
设置菜单项要显示的位图
菜单项
Definition MenuItem.h:24