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
11
namespace
sw
12
{
16
struct
MenuItemDesc
//
17
{
19
uint64_t
tag
= 0;
20
22
std::wstring
text
{};
23
25
bool
enabled
=
true
;
26
28
bool
checked
=
false
;
29
31
HBITMAP
hBitmap
=
NULL
;
32
34
List<MenuItemDesc>
subItems
{};
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
69
class
MenuItem
:
public
FrameworkElement
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
:
111
const
ReadOnlyProperty<int>
Id
;
112
118
const
ReadOnlyProperty<HMENU>
Handle
;
119
124
const
Property<std::wstring>
Text
;
125
129
const
Property<bool>
Enabled
;
130
134
const
Property<bool>
IsChecked
;
135
139
const
Property<HBITMAP>
Bitmap
;
140
144
const
ReadOnlyProperty<bool>
IsSeparator
;
145
149
const
Property<uint64_t>
Tag
;
150
151
private
:
156
MenuItem
(
const
MenuItemDesc
&
desc
);
157
158
public
:
162
virtual
~MenuItem
();
163
168
static
MenuItem
*
Create
(
const
MenuItemDesc
&
desc
);
169
174
static
MenuItem
*
CreateRoot
(
bool
isPopup
);
175
176
protected
:
180
virtual
void
OnTagChanged
()
override
;
181
182
public
:
187
virtual
MenuItem
*
GetParent
()
const
override
final
;
188
193
virtual
int
GetChildCount
()
const
override
final
;
194
200
virtual
MenuItem
&
GetChildAt
(
int
index)
const
override
final
;
201
207
MenuItem
*
AddChild
(
const
MenuItemDesc
&
desc
);
208
216
MenuItem
*
InsertChild
(
int
index,
const
MenuItemDesc
&
desc
);
217
223
bool
RemoveChildAt
(
int
index);
224
230
bool
RemoveChild
(
MenuItem
*
child
);
231
235
void
ClearChildren
();
236
242
int
IndexOf
(
MenuItem
*
child
)
const
;
243
248
void
ResetChildren
(std::
initializer_list
<
MenuItemDesc
>
descs
);
249
255
MenuItem
*
FindChildById
(
int
id
);
256
262
MenuItem
*
FindChildByTag
(
uint64_t
tag);
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
}
sw::FrameworkElement
框架元素类,提供数据上下文和绑定功能
Definition
FrameworkElement.h:37
sw::FrameworkElement::FrameworkElement
FrameworkElement()
初始化FrameworkElement
sw::IValueConverter
值转换器接口
Definition
IValueConverter.h:14
sw::MenuItem
菜单项类
Definition
MenuItem.h:70
sw::MenuItem::IsChecked
const Property< bool > IsChecked
菜单项是否选中
Definition
MenuItem.h:134
sw::MenuItem::FindChildById
MenuItem * FindChildById(int id)
查找对应ID的子菜单项
sw::MenuItem::OnTagChanged
virtual void OnTagChanged() override
当Tag更改时调用此函数
sw::MenuItem::GetParent
virtual MenuItem * GetParent() const override final
获取逻辑树中的父元素
sw::MenuItem::Handle
const ReadOnlyProperty< HMENU > Handle
菜单项句柄
Definition
MenuItem.h:118
sw::MenuItem::GetChildAt
virtual MenuItem & GetChildAt(int index) const override final
获取逻辑树中指定索引处的子元素
sw::MenuItem::AddChild
MenuItem * AddChild(const MenuItemDesc &desc)
向当前菜单项添加一个子菜单项
sw::MenuItem::Enabled
const Property< bool > Enabled
菜单项是否可用
Definition
MenuItem.h:129
sw::MenuItem::Tag
const Property< uint64_t > Tag
菜单项Tag
Definition
MenuItem.h:149
sw::MenuItem::RemoveChildAt
bool RemoveChildAt(int index)
移除指定索引处的子菜单项
sw::MenuItem::Id
const ReadOnlyProperty< int > Id
菜单项Id
Definition
MenuItem.h:111
sw::MenuItem::RemoveChild
bool RemoveChild(MenuItem *child)
移除指定子菜单项
sw::MenuItem::ClearChildren
void ClearChildren()
移除所有子菜单项
sw::MenuItem::IsSeparator
const ReadOnlyProperty< bool > IsSeparator
菜单项是否为分隔符
Definition
MenuItem.h:144
sw::MenuItem::Bitmap
const Property< HBITMAP > Bitmap
菜单项位图
Definition
MenuItem.h:139
sw::MenuItem::Create
static MenuItem * Create(const MenuItemDesc &desc)
创建一个新的菜单项实例
sw::MenuItem::ResetChildren
void ResetChildren(std::initializer_list< MenuItemDesc > descs)
重置子菜单项列表
sw::MenuItem::FindChildByTag
MenuItem * FindChildByTag(uint64_t tag)
查找对应tag的子菜单项
sw::MenuItem::InsertChild
MenuItem * InsertChild(int index, const MenuItemDesc &desc)
向当前菜单项的指定索引处插入一个子菜单项
sw::MenuItem::Text
const Property< std::wstring > Text
菜单项文本
Definition
MenuItem.h:124
sw::MenuItem::~MenuItem
virtual ~MenuItem()
析构函数
sw::MenuItem::CreateRoot
static MenuItem * CreateRoot(bool isPopup)
创建一个新的根菜单项实例
sw::MenuItem::GetChildCount
virtual int GetChildCount() const override final
获取逻辑树中的子元素数量
sw::MenuItem::IndexOf
int IndexOf(MenuItem *child) const
获取指定子菜单项在当前菜单项中的索引
sw
SimpleWindow框架的顶级命名空间,所有公共类型、控件、枚举和工具函数均定义于此。
Definition
Alignment.h:4
sw::MenuItemDesc
菜单项描述结构体
Definition
MenuItem.h:17
sw::MenuItemDesc::MenuItemDesc
MenuItemDesc(uint64_t tag, const std::wstring &text)
构造指定标记和文本的菜单项描述
sw::MenuItemDesc::text
std::wstring text
菜单项文本,若为"-"且没有子项则被视为分隔符
Definition
MenuItem.h:22
sw::MenuItemDesc::subItems
List< MenuItemDesc > subItems
子菜单项列表
Definition
MenuItem.h:34
sw::MenuItemDesc::MenuItemDesc
MenuItemDesc(uint64_t tag, const std::wstring &text, std::initializer_list< MenuItemDesc > subItems)
构造指定标记、文本和子项的菜单项描述
sw::MenuItemDesc::checked
bool checked
菜单项是否选中,默认为false
Definition
MenuItem.h:28
sw::MenuItemDesc::MenuItemDesc
MenuItemDesc(const std::wstring &text)
构造指定文本的菜单项描述
sw::MenuItemDesc::MenuItemDesc
MenuItemDesc(const wchar_t *text)
构造指定文本的菜单项描述
sw::MenuItemDesc::MenuItemDesc
MenuItemDesc()=default
默认构造函数
sw::MenuItemDesc::hBitmap
HBITMAP hBitmap
菜单项位图句柄,默认为NULL
Definition
MenuItem.h:31
sw::MenuItemDesc::MenuItemDesc
MenuItemDesc(const std::wstring &text, std::initializer_list< MenuItemDesc > subItems)
构造指定文本和子项的菜单项描述
sw::MenuItemDesc::enabled
bool enabled
菜单项是否可用,默认为true
Definition
MenuItem.h:25
sw::MenuItemDesc::tag
uint64_t tag
菜单项标记,可用于区分不同菜单项
Definition
MenuItem.h:19
sw
inc
MenuItem.h
制作者
1.9.8