SimpleWindow
载入中...
搜索中...
未找到
MenuItem.h
1#pragma once
2
3#include "FrameworkElement.h"
4#include "List.h"
5#include <cstdint>
6#include <initializer_list>
7#include <memory>
8#include <string>
9#include <windows.h>
10
11namespace sw
12{
16 struct MenuItemDesc //
17 {
20
22 std::wstring text{};
23
25 bool enabled = true;
26
28 bool checked = false;
29
32
35
37 MenuItemDesc() = default;
38
41 MenuItemDesc(const wchar_t *text);
42
45 MenuItemDesc(const std::wstring &text);
46
50 MenuItemDesc(const std::wstring &text,
51 std::initializer_list<MenuItemDesc> subItems);
52
56 MenuItemDesc(uint64_t tag, const std::wstring &text);
57
62 MenuItemDesc(uint64_t tag, const std::wstring &text,
63 std::initializer_list<MenuItemDesc> subItems);
64 };
65
70 {
71 private:
75 using TBase = FrameworkElement;
76
80 MenuItemDesc _desc{};
81
85 HMENU _hMenu = NULL;
86
90 int _id = -1;
91
95 bool _isRoot = false;
96
100 MenuItem *_parent = nullptr;
101
105 std::vector<std::unique_ptr<MenuItem>> _subItems{};
106
107 public:
112
119
125
130
135
140
145
150
151 private:
156 MenuItem(const MenuItemDesc &desc);
157
158 public:
162 virtual ~MenuItem();
163
169
175
176 protected:
180 virtual void OnTagChanged() override;
181
182 public:
188
194
201
208
217
223 bool RemoveChildAt(int index);
224
231
236
243
249
256
263
264 private:
268 void _ResetMenuItem();
269
273 void _UpdateState();
274
281 static void _SetParent(MenuItem *parent, MenuItem *child, int index = -1);
282
287 static int _GenerateMenuItemID();
288
294 static void _ApplyMenuDesc(const MenuItemDesc &desc, MENUITEMINFOW *pMii);
295
302 static void _UpdateMenuItem(HMENU hParentMenu, int index, const MenuItemDesc &desc);
303 };
304}
框架元素类,提供数据上下文和绑定功能
Definition FrameworkElement.h:37
FrameworkElement()
初始化FrameworkElement
值转换器接口
Definition IValueConverter.h:14
菜单项类
Definition MenuItem.h:70
const Property< bool > IsChecked
菜单项是否选中
Definition MenuItem.h:134
MenuItem * FindChildById(int id)
查找对应ID的子菜单项
virtual void OnTagChanged() override
当Tag更改时调用此函数
virtual MenuItem * GetParent() const override final
获取逻辑树中的父元素
const ReadOnlyProperty< HMENU > Handle
菜单项句柄
Definition MenuItem.h:118
virtual MenuItem & GetChildAt(int index) const override final
获取逻辑树中指定索引处的子元素
MenuItem * AddChild(const MenuItemDesc &desc)
向当前菜单项添加一个子菜单项
const Property< bool > Enabled
菜单项是否可用
Definition MenuItem.h:129
const Property< uint64_t > Tag
菜单项Tag
Definition MenuItem.h:149
bool RemoveChildAt(int index)
移除指定索引处的子菜单项
const ReadOnlyProperty< int > Id
菜单项Id
Definition MenuItem.h:111
bool RemoveChild(MenuItem *child)
移除指定子菜单项
void ClearChildren()
移除所有子菜单项
const ReadOnlyProperty< bool > IsSeparator
菜单项是否为分隔符
Definition MenuItem.h:144
const Property< HBITMAP > Bitmap
菜单项位图
Definition MenuItem.h:139
static MenuItem * Create(const MenuItemDesc &desc)
创建一个新的菜单项实例
void ResetChildren(std::initializer_list< MenuItemDesc > descs)
重置子菜单项列表
MenuItem * FindChildByTag(uint64_t tag)
查找对应tag的子菜单项
MenuItem * InsertChild(int index, const MenuItemDesc &desc)
向当前菜单项的指定索引处插入一个子菜单项
const Property< std::wstring > Text
菜单项文本
Definition MenuItem.h:124
virtual ~MenuItem()
析构函数
static MenuItem * CreateRoot(bool isPopup)
创建一个新的根菜单项实例
virtual int GetChildCount() const override final
获取逻辑树中的子元素数量
int IndexOf(MenuItem *child) const
获取指定子菜单项在当前菜单项中的索引
SimpleWindow框架的顶级命名空间,所有公共类型、控件、枚举和工具函数均定义于此。
Definition Alignment.h:4
菜单项描述结构体
Definition MenuItem.h:17
MenuItemDesc(uint64_t tag, const std::wstring &text)
构造指定标记和文本的菜单项描述
std::wstring text
菜单项文本,若为"-"且没有子项则被视为分隔符
Definition MenuItem.h:22
List< MenuItemDesc > subItems
子菜单项列表
Definition MenuItem.h:34
MenuItemDesc(uint64_t tag, const std::wstring &text, std::initializer_list< MenuItemDesc > subItems)
构造指定标记、文本和子项的菜单项描述
bool checked
菜单项是否选中,默认为false
Definition MenuItem.h:28
MenuItemDesc(const std::wstring &text)
构造指定文本的菜单项描述
MenuItemDesc(const wchar_t *text)
构造指定文本的菜单项描述
MenuItemDesc()=default
默认构造函数
HBITMAP hBitmap
菜单项位图句柄,默认为NULL
Definition MenuItem.h:31
MenuItemDesc(const std::wstring &text, std::initializer_list< MenuItemDesc > subItems)
构造指定文本和子项的菜单项描述
bool enabled
菜单项是否可用,默认为true
Definition MenuItem.h:25
uint64_t tag
菜单项标记,可用于区分不同菜单项
Definition MenuItem.h:19