SimpleWindow
载入中...
搜索中...
未找到
UIElement.h
1#pragma once
2
3#include "Alignment.h"
4#include "Binding.h"
5#include "Color.h"
6#include "Cursor.h"
7#include "EnumBit.h"
8#include "EventHandlerWrapper.h"
9#include "ILayout.h"
10#include "ITag.h"
11#include "RoutedEvent.h"
12#include "RoutedEventArgs.h"
13#include "Thickness.h"
14#include "WndBase.h"
15#include <cstdint>
16#include <unordered_map>
17#include <vector>
18
19namespace sw
20{
21 // 前向声明
22 class UIElement;
23 class ContextMenu;
24 class DataBinding;
25
31 SizeChanged = 1 << 0,
32
34 PositionChanged = 1 << 1,
35
37 ChildAdded = 1 << 2,
38
40 ChildRemoved = 1 << 3,
41
43 TextChanged = 1 << 4,
44
46 FontChanged = 1 << 5,
47
50 MeasureInvalidated = 1 << 29,
51
55 Supressed = 1 << 30,
56 };
57
61 _SW_ENUM_ENABLE_BIT_OPERATIONS(LayoutUpdateCondition);
62
66 class UIElement : public WndBase,
67 public ILayout,
68 public ITag<uint64_t>
69 {
70 private:
74 sw::LayoutUpdateCondition _layoutUpdateCondition =
78
82 bool _collapseWhenHide = true;
83
87 Size _desireSize{};
88
92 Size _origionalSize{};
93
97 Size _minSize{-1, -1};
98
102 Size _maxSize{-1, -1};
103
107 Thickness _margin{};
108
113
117 VerticalAlignment _verticalAlignment = VerticalAlignment::Center;
118
122 UIElement *_parent = nullptr;
123
127 std::vector<UIElement *> _children{};
128
132 std::vector<UIElement *> _layoutVisibleChildren{};
133
137 std::unordered_map<RoutedEventType, RoutedEventHandler> _eventMap{};
138
142 uint64_t _tag = 0;
143
147 uint64_t _layoutTag = 0;
148
152 sw::ContextMenu *_contextMenu = nullptr;
153
157 double _arrangeOffsetX = 0;
158
162 double _arrangeOffsetY = 0;
163
167 double _childRightmost = 0;
168
172 double _childBottommost = 0;
173
177 bool _float = false;
178
182 bool _tabStop = false;
183
187 Color _backColor{KnownColors::White};
188
192 Color _textColor{KnownColors::Black};
193
197 bool _transparent = false;
198
202 bool _inheritTextColor = false;
203
207 bool _useDefaultCursor = true;
208
212 HCURSOR _hCursor = NULL;
213
217 Size _lastMeasureAvailableSize{};
218
222 HDWP _hdwpChildren = NULL;
223
227 HBRUSH _hCtlColorBrush = NULL;
228
232 COLORREF _lastTextColor = 0;
233
237 COLORREF _lastBackColor = 0;
238
242 bool _isHitTestVisible = true;
243
247 bool _focusedViaTab = false;
248
252 std::unordered_map<FieldId, std::unique_ptr<BindingBase>> _bindings{};
253
254 public:
259
264
269
274
279
284
289
294
299
304
309
314
320
325
331
336
341
346
351
356
362
367
372
373 public:
378
382 virtual ~UIElement() = 0;
383
390 [[deprecated("Use AddHandler instead to avoid overwriting existing event handlers.")]]
392
399
407
413
419
426
433
440
447
453 bool RemoveChildAt(int index);
454
460
466
471
478
485
494 const Point &point,
497
501 void MoveToTop();
502
507
511 bool IsRootElement() const;
512
517
522
527
532
537
543
549
555
561
566
573
578 void Resize(const Size &size);
579
584
589
596
602
608
614
621
626
631
636
642
649
654
660
666
667 protected:
673
679
685
691
698
705
710
715
721
727
734
741
749
755
762
769
776
782
791
797
802
807
814
820
826
832
838 virtual bool OnMove(const Point &newClientPosition) override;
839
845 virtual bool OnSize(const Size &newClientSize) override;
846
851
857
862
869
876
883 virtual bool OnChar(wchar_t ch, const KeyFlags &flags) override;
884
892
900
907 virtual bool OnMouseMove(const Point &mousePosition, MouseKey keyState) override;
908
914
922 virtual bool OnMouseWheel(int wheelDelta, const Point &mousePosition, MouseKey keyState) override;
923
931
938 virtual bool OnMouseLeftButtonUp(const Point &mousePosition, MouseKey keyState) override;
939
947
954 virtual bool OnMouseRightButtonUp(const Point &mousePosition, MouseKey keyState) override;
955
963
971
978 virtual bool OnContextMenu(bool isKeyboardMsg, const Point &mousePosition) override;
979
985
993
1003
1010
1017
1018 private:
1024 bool _SetHorzAlignment(sw::HorizontalAlignment value);
1025
1031 bool _SetVertAlignment(sw::VerticalAlignment value);
1032
1036 void _SetMeasureInvalidated();
1037
1041 void _UpdateLayoutVisibleChildren();
1042
1047 bool _AddToLayoutVisibleChildren(UIElement *element);
1048
1052 void _RemoveFromLayoutVisibleChildren(UIElement *element);
1053
1057 static UIElement *_GetNextElement(UIElement *element);
1058
1062 static UIElement *_GetDeepestLastElement(UIElement *element);
1063
1067 static UIElement *_GetPreviousElement(UIElement *element);
1068
1069 private:
1073 template <typename T, typename = void>
1074 struct _CanAddChild : std::false_type {
1075 };
1076
1077 // 已移动到类外,防止clang报错不完整的类型
1078 // /**
1079 // * @brief _CanAddChild模板偏特化,当AddChild有对应类型的重载时该偏特化生效
1080 // */
1081 // template <typename T>
1082 // struct _CanAddChild<
1083 // T, decltype(void(std::declval<UIElement>().AddChild(std::declval<T>())))> : std::true_type {
1084 // };
1085
1089 template <typename First, typename... Rest>
1090 struct _CanAddChildren
1091 : std::integral_constant<bool, _CanAddChild<First>::value && _CanAddChildren<Rest...>::value> {
1092 };
1093
1097 template <typename T>
1098 struct _CanAddChildren<T> : _CanAddChild<T> {
1099 };
1100
1105 template <typename T>
1106 int _AddChildrenImpl(T &&child)
1107 {
1108 return this->AddChild(std::forward<T>(child)) ? 1 : 0;
1109 }
1110
1115 template <typename First, typename... Rest>
1116 int _AddChildrenImpl(First &&first, Rest &&...rest)
1117 {
1118 int count = 0;
1119 if (this->AddChild(std::forward<First>(first)))
1120 count = 1 + this->_AddChildrenImpl(std::forward<Rest>(rest)...);
1121 return count;
1122 }
1123
1124 public:
1131 template <typename First, typename... Rest>
1133 -> typename std::enable_if<_CanAddChildren<First, Rest...>::value, int>::type
1134 {
1135 this->_layoutUpdateCondition |= sw::LayoutUpdateCondition::Supressed;
1136 int count = this->_AddChildrenImpl(std::forward<First>(first), std::forward<Rest>(rest)...);
1137 this->_layoutUpdateCondition &= ~sw::LayoutUpdateCondition::Supressed;
1138
1140 this->InvalidateMeasure();
1141 return count;
1142 }
1143
1152 template <typename T>
1153 [[deprecated("Use AddHandler instead to avoid overwriting existing event handlers.")]]
1155 {
1156 if (handler == nullptr) {
1157 this->UnregisterRoutedEvent(eventType);
1158 } else {
1159 this->RegisterRoutedEvent(eventType, RoutedEventHandler(obj, handler));
1160 }
1161 }
1162
1169 template <typename TEventArgs>
1170 [[deprecated("Use AddHandler instead to avoid overwriting existing event handlers.")]]
1172 -> typename std::enable_if<std::is_base_of<RoutedEventArgs, TEventArgs>::value && sw::_IsTypedRoutedEventArgs<TEventArgs>::value>::type
1173 {
1174 if (!handler) {
1175 this->UnregisterRoutedEvent(TEventArgs::EventType);
1176 } else {
1178 }
1179 }
1180
1189 template <typename TEventArgs, typename THandleObj>
1190 [[deprecated("Use AddHandler instead to avoid overwriting existing event handlers.")]]
1193 {
1194 if (handler == nullptr) {
1195 this->UnregisterRoutedEvent(TEventArgs::EventType);
1196 } else {
1198 }
1199 }
1200
1208 template <typename T>
1209 void AddHandler(RoutedEventType eventType, T &obj, void (T::*handler)(UIElement &, RoutedEventArgs &))
1210 {
1211 if (handler) this->_eventMap[eventType].Add(obj, handler);
1212 }
1213
1219 template <typename TEventArgs>
1221 -> typename std::enable_if<std::is_base_of<RoutedEventArgs, TEventArgs>::value && sw::_IsTypedRoutedEventArgs<TEventArgs>::value>::type
1222 {
1223 if (handler) this->AddHandler(TEventArgs::EventType, RoutedEventHandlerWrapper<TEventArgs>(handler));
1224 }
1225
1233 template <typename TEventArgs, typename THandleObj>
1239
1246 template <typename TEventArgs>
1248 -> typename std::enable_if<
1249 std::is_base_of<RoutedEventArgs, TEventArgs>::value &&
1250 !std::is_same<TEventArgs, RoutedEventArgs>::value &&
1252 {
1254 }
1255
1264 template <typename TEventArgs, typename THandleObj>
1266 -> typename std::enable_if<
1267 std::is_base_of<RoutedEventArgs, TEventArgs>::value &&
1268 !std::is_same<TEventArgs, RoutedEventArgs>::value &&
1269 !sw::_IsTypedRoutedEventArgs<TEventArgs>::value>::type
1270 {
1272 }
1273
1282 template <typename T>
1283 bool RemoveHandler(RoutedEventType eventType, T &obj, void (T::*handler)(UIElement &, RoutedEventArgs &))
1284 {
1285 return handler == nullptr ? false : this->_eventMap[eventType].Remove(obj, handler);
1286 }
1287
1294 template <typename TEventArgs>
1296 -> typename std::enable_if<std::is_base_of<RoutedEventArgs, TEventArgs>::value && sw::_IsTypedRoutedEventArgs<TEventArgs>::value, bool>::type
1297 {
1298 if (handler == nullptr) {
1299 return false;
1300 } else {
1301 return this->RemoveHandler(TEventArgs::EventType, RoutedEventHandlerWrapper<TEventArgs>(handler));
1302 }
1303 }
1304
1313 template <typename TEventArgs, typename THandleObj>
1316 {
1317 if (handler == nullptr) {
1318 return false;
1319 } else {
1321 }
1322 }
1323
1331 template <typename TEventArgs>
1333 -> typename std::enable_if<
1334 std::is_base_of<RoutedEventArgs, TEventArgs>::value &&
1335 !std::is_same<TEventArgs, RoutedEventArgs>::value &&
1337 bool>::type
1338 {
1339 if (handler == nullptr) {
1340 return false;
1341 } else {
1343 }
1344 }
1345
1355 template <typename TEventArgs, typename THandleObj>
1357 -> typename std::enable_if<
1358 std::is_base_of<RoutedEventArgs, TEventArgs>::value &&
1359 !std::is_same<TEventArgs, RoutedEventArgs>::value &&
1361 bool>::type
1362 {
1363 if (handler == nullptr) {
1364 return false;
1365 } else {
1367 }
1368 }
1369 };
1370
1374 template <typename T>
1375 struct UIElement::_CanAddChild<
1376 T, decltype(void(std::declval<UIElement>().AddChild(std::declval<T>())))> : std::true_type {
1377 };
1378}
上下文菜单
Definition ContextMenu.h:11
布局接口
Definition ILayout.h:13
Tag接口
Definition ITag.h:12
值转换器接口
Definition IValueConverter.h:14
表示界面中的元素
Definition UIElement.h:69
Color GetRealTextColor() const
获取当前要显示的文本颜色
virtual UIElement * GetParent() const override final
获取父元素
virtual uint64_t GetTag() const override
获取Tag
const Property< HorizontalAlignment > HorizontalAlignment
水平对齐方式
Definition UIElement.h:263
void RaiseRoutedEvent(RoutedEventType eventType)
触发路由事件
UIElement * GetNextElement()
获取当前元素在界面树上的下一个节点,若已是最后一个节点则返回根节点
void RegisterRoutedEvent(RoutedEventType eventType, T &obj, void(T::*handler)(UIElement &, RoutedEventArgs &))
注册成员函数作为路由事件处理函数,当事件已注册时会覆盖已注册的函数
Definition UIElement.h:1154
virtual void SetTag(uint64_t tag) override
设置Tag
void UnregisterRoutedEvent(RoutedEventType eventType)
取消对应类型路由事件的注册,该函数会移除对应事件所有的处理函数
void SetCursor(HCURSOR hCursor)
设置鼠标样式
virtual UIElement * ToUIElement() override final
尝试将对象转换成UIElement
virtual void OnTabStop()
通过tab键将焦点移动到当前元素时调用该函数
bool AddChild(UIElement &element)
添加子元素
virtual bool OnMove(const Point &newClientPosition) override
接收到WM_MOVE时调用该函数
UIElement * GetPreviousElement()
获取当前元素在界面树上的上一个节点,若元素为第一个节点则返回最后一个节点
void UpdateSiblingsZOrder(bool invalidateMeasure=true)
更新兄弟元素的Z轴位置
virtual bool OnClose() override
接收到WM_CLOSE时调用该函数
double GetChildRightmost(bool update)
获取所有子元素在当前元素中最右边的位置(只考虑参与布局的子窗口且忽略悬浮的元素)
const ReadOnlyProperty< bool > IsFocusedViaTab
当前元素是否是通过按下Tab键获得的焦点
Definition UIElement.h:371
const Property< bool > TabStop
表示用户是否可以通过按下Tab键将焦点移动到当前元素
Definition UIElement.h:303
void RegisterRoutedEvent(RoutedEventType eventType, const RoutedEventHandler &handler)
注册路由事件处理函数,当事件已注册时会覆盖已注册的函数
double & GetInternalArrangeOffsetY()
获取布局时子元素的垂直偏移量
virtual void ArrangeOverride(const Size &finalSize)
安排子元素的位置,可重写该函数以实现自定义布局
bool AddChild(UIElement *element)
添加子元素
const Property< double > MinHeight
最小高度,当值为负数或0时表示不限制
Definition UIElement.h:345
bool AddChild(UIElement &element, uint64_t layoutTag)
添加子元素并设置布局标记
virtual UIElement & GetChildAt(int index) const override final
获取指定索引处的子元素
void ResetCursor()
将鼠标样式设置为默认样式
virtual bool OnKeyUp(VirtualKey key, const KeyFlags &flags) override
接收到WM_KEYUP时调用该函数
int IndexOf(UIElement *element)
获取指定元素的索引
virtual void OnRoutedEvent(RoutedEventArgs &eventArgs, const RoutedEventHandler &handler)
路由事件经过当前元素时调用该函数
virtual Size GetDesireSize() const override
获取当前元素所需尺寸
virtual bool OnMouseLeftButtonDown(const Point &mousePosition, MouseKey keyState) override
接收到WM_LBUTTONDOWN时调用该函数
auto RegisterRoutedEvent(THandleObj &obj, void(THandleObj::*handler)(UIElement &, TEventArgs &)) -> typename std::enable_if< std::is_base_of< RoutedEventArgs, TEventArgs >::value &&sw::_IsTypedRoutedEventArgs< TEventArgs >::value >::type
根据事件参数类型注册成员函数作为路由事件,当事件已注册时会覆盖已注册的函数
Definition UIElement.h:1191
UIElement * GetRootElement()
获取当前元素所在界面树的根节点
const ReadOnlyProperty< int > ChildCount
子元素数量
Definition UIElement.h:273
virtual bool OnColor(HDC hdc, HBRUSH &hRetBrush) override
父窗口接收到WM_CTLCOLORxxx时调用对应控件的该函数
void ClampDesireSize(sw::Size &size) const
限定指定尺寸在最小和最大尺寸之间
const ReadOnlyProperty< sw::Rect > LogicalRect
元素的逻辑位置和尺寸,即去除布局偏移以及拉伸影响的位置和尺寸
Definition UIElement.h:361
virtual bool OnSetCursor(HWND hwnd, HitTestResult hitTest, int message, bool &result) override
接收到WM_SETCURSOR消息时调用该函数
virtual bool OnKeyDown(VirtualKey key, const KeyFlags &flags) override
接收到WM_KEYDOWN时调用该函数
bool RemoveChildAt(int index)
移除指定索引处的子元素
virtual int GetChildLayoutCount() const override final
获取参与布局的子元素数量
UIElement * GetNextTabStopElement()
获取下一个TabStop属性为true的元素
virtual bool OnDropFiles(HDROP hDrop) override
接收到WM_DROPFILES时调用该函数
virtual bool OnKillFocus(HWND hNextFocus) override
接收到WM_KILLFOCUS时调用该函数
bool RemoveHandler(RoutedEventType eventType, T &obj, void(T::*handler)(UIElement &, RoutedEventArgs &))
移除已添加的类型为成员函数的路由事件处理函数
Definition UIElement.h:1283
auto AddChildren(First &&first, Rest &&...rest) -> typename std::enable_if< _CanAddChildren< First, Rest... >::value, int >::type
添加多个子元素
Definition UIElement.h:1132
bool ShowContextMenu(const Point &point, sw::HorizontalAlignment horz=sw::HorizontalAlignment::Left, sw::VerticalAlignment vert=sw::VerticalAlignment::Top)
弹出当前元素的上下文菜单
virtual bool OnSize(const Size &newClientSize) override
接收到WM_SIZE时调用该函数
virtual bool OnMouseMiddleButtonUp(const Point &mousePosition, MouseKey keyState) override
接收到WM_MBUTTONUP时调用该函数
const Property< uint64_t > LayoutTag
布局标记,对于不同的布局有不同含义
Definition UIElement.h:288
virtual void OnTabMove(bool forward)
通过tab键将焦点从当前元素移出时调用该函数
const ReadOnlyProperty< bool > IsMeasureValid
当前元素的布局状态是否有效
Definition UIElement.h:335
virtual bool OnMouseRightButtonDown(const Point &mousePosition, MouseKey keyState) override
接收到WM_RBUTTONDOWN时调用该函数
void MoveToBottom()
移动到界面底部
virtual bool OnMouseMiddleButtonDown(const Point &mousePosition, MouseKey keyState) override
接收到WM_MBUTTONDOWN时调用该函数
void SetAlignment(sw::HorizontalAlignment horz, sw::VerticalAlignment vert)
设置对齐方式
virtual void OnNcHitTest(const Point &testPoint, HitTestResult &result) override
接收到WM_NCHITTEST后调用该函数
double GetChildBottommost(bool update)
获取所有子元素在当前元素中最底边的位置(只考虑参与布局的子窗口且忽略悬浮的元素)
void AddHandler(RoutedEventType eventType, const RoutedEventHandler &handler)
添加路由事件处理函数
const Property< bool > InheritTextColor
是否继承父元素的文本颜色
Definition UIElement.h:324
virtual void OnTextChanged() override
Text属性更改时调用此函数
void SetCursor(StandardCursor cursor)
设置鼠标样式
virtual uint64_t GetLayoutTag() const override
获取布局标记
const Property< bool > IsHitTestVisible
当前元素是否响应鼠标事件
Definition UIElement.h:366
virtual void ParentChanged(WndBase *newParent) override
父窗口改变时调用此函数
bool QueryAllChildren(const Predicate< UIElement * > &queryFunc)
查询所有子元素,直到queryFunc返回false或所有子元素均被查询
Color GetRealBackColor() const
获取当前要显示的背景颜色
const Property< uint64_t > Tag
储存用户自定义信息的标记
Definition UIElement.h:283
bool IsRootElement() const
判断当前元素是否为根节点
virtual Size MeasureOverride(const Size &availableSize)
测量元素所需尺寸,无需考虑边框和边距
auto AddHandler(const Action< UIElement &, TEventArgs & > &handler) -> typename std::enable_if< std::is_base_of< RoutedEventArgs, TEventArgs >::value &&sw::_IsTypedRoutedEventArgs< TEventArgs >::value >::type
根据事件参数类型添加路由事件处理函数
Definition UIElement.h:1220
auto RemoveHandler(RoutedEventType eventType, THandleObj &obj, void(THandleObj::*handler)(UIElement &, TEventArgs &)) -> typename std::enable_if< std::is_base_of< RoutedEventArgs, TEventArgs >::value &&!std::is_same< TEventArgs, RoutedEventArgs >::value &&!sw::_IsTypedRoutedEventArgs< TEventArgs >::value, bool >::type
移除已添加的类型为成员函数的路由事件处理函数
Definition UIElement.h:1356
const Property< Thickness > Margin
边距
Definition UIElement.h:258
int IndexOf(UIElement &element)
获取指定元素的索引
bool RemoveHandler(RoutedEventType eventType, const RoutedEventHandler &handler)
移除已添加的路由事件处理函数
bool RemoveChild(UIElement *element)
移除子元素
virtual ILayout & GetChildLayoutAt(int index) const override final
获取对应索引处的子元素,只索引参与布局的子元素
virtual bool OnMouseWheel(int wheelDelta, const Point &mousePosition, MouseKey keyState) override
接收到WM_MOUSEWHEEL时调用该函数
virtual bool OnChar(wchar_t ch, const KeyFlags &flags) override
接收到WM_CHAR时调用该函数
auto RemoveHandler(const Action< UIElement &, TEventArgs & > &handler) -> typename std::enable_if< std::is_base_of< RoutedEventArgs, TEventArgs >::value &&sw::_IsTypedRoutedEventArgs< TEventArgs >::value, bool >::type
移除已添加的路由事件处理函数
Definition UIElement.h:1295
const Property< bool > CollapseWhenHide
是否在不可见时不参与布局
Definition UIElement.h:278
void ClearChildren()
移除所有子元素
virtual bool OnSetFocus(HWND hPrevFocus) override
接收到WM_SETFOCUS时调用该函数
auto AddHandler(THandleObj &obj, void(THandleObj::*handler)(UIElement &, TEventArgs &)) -> typename std::enable_if< std::is_base_of< RoutedEventArgs, TEventArgs >::value &&sw::_IsTypedRoutedEventArgs< TEventArgs >::value >::type
根据事件参数类型添加成员函数作为路由事件处理函数
Definition UIElement.h:1234
virtual void VisibleChanged(bool newVisible) override
Visible属性改变时调用此函数
const Property< double > MinWidth
最小宽度,当值为负数或0时表示不限制
Definition UIElement.h:340
bool IsLayoutUpdateConditionSet(sw::LayoutUpdateCondition condition)
判断指定的布局更新条件是否已设置
bool RemoveChild(UIElement &element)
移除子元素
virtual bool OnMouseLeftButtonUp(const Point &mousePosition, MouseKey keyState) override
接收到WM_LBUTTONUP时调用该函数
void UpdateChildrenZOrder(bool invalidateMeasure=true)
更新子元素的Z轴位置
auto AddHandler(RoutedEventType eventType, THandleObj &obj, void(THandleObj::*handler)(UIElement &, TEventArgs &)) -> typename std::enable_if< std::is_base_of< RoutedEventArgs, TEventArgs >::value &&!std::is_same< TEventArgs, RoutedEventArgs >::value &&!sw::_IsTypedRoutedEventArgs< TEventArgs >::value >::type
添加成员函数作为路由事件处理函数
Definition UIElement.h:1265
void Resize(const Size &size)
调整当前元素的尺寸
void AddHandler(RoutedEventType eventType, T &obj, void(T::*handler)(UIElement &, RoutedEventArgs &))
添加成员函数作为路由事件处理函数
Definition UIElement.h:1209
const Property< double > MaxHeight
最大高度,当值为负数或0时表示不限制
Definition UIElement.h:355
const Property< bool > Transparent
是否使用透明背景
Definition UIElement.h:319
virtual void OnRemovedChild(UIElement &element)
移除子元素后调用该函数
const Property< Color > BackColor
背景颜色,修改该属性会同时将Transparent属性设为false,对于部分控件该属性可能不生效
Definition UIElement.h:308
UIElement * GetPreviousTabStopElement()
获取上一个TabStop属性为true的元素
const Property< sw::LayoutUpdateCondition > LayoutUpdateCondition
触发布局更新的条件
Definition UIElement.h:330
virtual void SetTextColor(Color color, bool redraw)
设置文本颜色
auto AddHandler(RoutedEventType eventType, const Action< UIElement &, TEventArgs & > &handler) -> typename std::enable_if< std::is_base_of< RoutedEventArgs, TEventArgs >::value &&!std::is_same< TEventArgs, RoutedEventArgs >::value &&!sw::_IsTypedRoutedEventArgs< TEventArgs >::value >::type
添加路由事件处理函数
Definition UIElement.h:1247
void MoveToTop()
移动到界面顶部
bool QueryAllElements(const Predicate< UIElement * > &queryFunc)
查询自身和所有子元素,直到queryFunc返回false或所有子元素均被查询
auto RegisterRoutedEvent(const Action< UIElement &, TEventArgs & > &handler) -> typename std::enable_if< std::is_base_of< RoutedEventArgs, TEventArgs >::value &&sw::_IsTypedRoutedEventArgs< TEventArgs >::value >::type
根据事件参数类型注册路由事件,当事件已注册时会覆盖已注册的函数
Definition UIElement.h:1171
bool AddChild(UIElement *element, uint64_t layoutTag)
添加子元素并设置布局标记
double & GetInternalArrangeOffsetX()
获取布局时子元素的水平偏移量
const Property< bool > Float
元素是否悬浮,若元素悬浮则该元素不会随滚动条滚动而改变位置
Definition UIElement.h:298
virtual bool RequestBringIntoView(const sw::Rect &screenRect)
尝试将指定的矩形区域移动到可视区域内
virtual bool OnMouseLeave() override
接收到WM_MOUSELEAVE时调用该函数
virtual void Arrange(const sw::Rect &finalPosition) override
安排元素位置
virtual void OnMenuCommand(int id) override
当WM_COMMAND接收到菜单命令时调用该函数
virtual ~UIElement()=0
析构函数,这里用纯虚函数使该类成为抽象类
virtual int GetChildCount() const override final
获取子元素数量
auto RemoveHandler(THandleObj &obj, void(THandleObj::*handler)(UIElement &, TEventArgs &)) -> typename std::enable_if< std::is_base_of< RoutedEventArgs, TEventArgs >::value &&sw::_IsTypedRoutedEventArgs< TEventArgs >::value, bool >::type
移除已添加的类型为成员函数的路由事件处理函数
Definition UIElement.h:1314
const Property< double > MaxWidth
最大宽度,当值为负数或0时表示不限制
Definition UIElement.h:350
virtual bool SetParent(WndBase *parent) override
设置父窗口
const Property< VerticalAlignment > VerticalAlignment
垂直对齐方式
Definition UIElement.h:268
bool BringIntoView()
尝试将当前元素移动到可视区域内
bool IsRoutedEventRegistered(RoutedEventType eventType)
判断路由事件是否已存在事件处理函数
auto RemoveHandler(RoutedEventType eventType, const Action< UIElement &, TEventArgs & > &handler) -> typename std::enable_if< std::is_base_of< RoutedEventArgs, TEventArgs >::value &&!std::is_same< TEventArgs, RoutedEventArgs >::value &&!sw::_IsTypedRoutedEventArgs< TEventArgs >::value, bool >::type
移除已添加的路由事件处理函数
Definition UIElement.h:1332
virtual bool OnMouseMove(const Point &mousePosition, MouseKey keyState) override
接收到WM_MOUSEMOVE时调用该函数
virtual void OnAddedChild(UIElement &element)
添加子元素后调用该函数
const Property< sw::ContextMenu * > ContextMenu
右键按下时弹出的菜单
Definition UIElement.h:293
virtual void OnMinMaxSizeChanged()
当MinWidth、MinHeight、MaxWidth或MaxHeight属性更改时调用此函数
virtual bool OnMouseRightButtonUp(const Point &mousePosition, MouseKey keyState) override
接收到WM_RBUTTONUP时调用该函数
const Property< Color > TextColor
文本颜色,修改该属性会同时将InheritTextColor属性设为false,对于部分控件该属性可能不生效
Definition UIElement.h:313
UIElement()
初始化UIElement
virtual void Measure(const Size &availableSize) override
测量元素所需尺寸
virtual bool OnContextMenu(bool isKeyboardMsg, const Point &mousePosition) override
接收到WM_CONTEXTMENU后调用目标控件的该函数
virtual void SetBackColor(Color color, bool redraw)
设置背景颜色
void InvalidateMeasure()
使元素的布局状态失效,并立即触发布局更新
表示一个Windows窗口,是所有窗口和控件的基类
Definition WndBase.h:29
SimpleWindow框架的顶级命名空间,所有公共类型、控件、枚举和工具函数均定义于此。
Definition Alignment.h:4
LayoutUpdateCondition
通知布局更新的条件
Definition UIElement.h:29
@ ChildAdded
添加子元素时更新布局
@ TextChanged
文本改变时更新布局
@ PositionChanged
位置改变时更新布局
@ FontChanged
字体改变时更新布局
@ ChildRemoved
移除子元素时更新布局
@ SizeChanged
尺寸改变时更新布局
VerticalAlignment
垂直对齐方式
Definition Alignment.h:18
MouseKey
鼠标事件时用于判断按键状态
Definition Keys.h:291
VirtualKey
虚拟按键
Definition Keys.h:65
EventHandler< UIElement, RoutedEventArgs > RoutedEventHandler
路由事件类型
Definition RoutedEvent.h:195
HorizontalAlignment
水平对齐方式
Definition Alignment.h:8
StandardCursor
系统标准鼠标样式
Definition Cursor.h:12
RoutedEventType
路由事件类型枚举
Definition RoutedEvent.h:12
HitTestResult
NcHitTest(WM_NCHITTEST)的返回值
Definition HitTestResult.h:10
颜色
Definition Color.h:16
https://learn.microsoft.com/en-us/windows/win32/inputdev/about-keyboard-input#keystroke-message-flags
Definition Keys.h:12
表示相对于左上角的点坐标
Definition Point.h:15
表示一个矩形区域
Definition Rect.h:17
路由事件的参数
Definition RoutedEvent.h:154
尺寸
Definition Size.h:15
表示矩形区域周围边框的厚度
Definition Thickness.h:15
结构体模板,用于检测类型T是否包含事件类型信息
Definition RoutedEventArgs.h:58