-
Notifications
You must be signed in to change notification settings - Fork 71
Expand file tree
/
Copy pathControl.h
More file actions
1885 lines (1544 loc) · 74 KB
/
Control.h
File metadata and controls
1885 lines (1544 loc) · 74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
#ifndef UI_CORE_CONTROL_H_
#define UI_CORE_CONTROL_H_
#include "duilib/Core/PlaceHolder.h"
#include "duilib/Core/BoxShadow.h"
#include "duilib/Core/Keyboard.h"
#include "duilib/Core/EventArgs.h"
#include "duilib/Animation/EasingFunctions.h"
namespace ui
{
class Control;
class ControlLoading;
class Image;
class IMatrix;
class StateColorMap;
class StateColorMap2;
class StateImageMap;
class AnimationManager;
class AnimationPlayer;
class IRender;
class IPath;
class IFont;
class AutoClip;
class ControlDropTarget_Windows;
class ControlDropTarget_SDL;
class ControlDropTargetImpl_Windows;
class ControlDropTargetImpl_SDL;
typedef Control* (* FINDCONTROLPROC)(Control*, void*);
/** 控件基类(相当于Widget)
*/
class UILIB_API Control: public PlaceHolder
{
typedef PlaceHolder BaseClass;
public:
explicit Control(Window* pWindow);
Control(const Control& r) = delete;
Control& operator=(const Control& r) = delete;
virtual ~Control() override;
/** 获取控件类型
*/
virtual DString GetType() const override;
/// 图形相关
/** 获取背景颜色
* @return 返回背景颜色的字符串,该值在 global.xml 中定义
*/
DString GetBkColor() const;
/** 设置背景颜色
* @param [in] strColor 要设置的背景颜色值,该值必须在 global.xml 中存在
*/
void SetBkColor(const DString& strColor);
/** 设置背景颜色
* @param [in] color 要设置的背景颜色值
*/
void SetBkColor(const UiColor& color);
/** 设置第二背景色(实现渐变背景色)
* @param [in] strColor 要设置的背景颜色值,该值必须在 global.xml 中存在
*/
void SetBkColor2(const DString& strColor);
/** 设置第二背景色(实现渐变背景色)
* @param [in] color 要设置的背景颜色值
*/
void SetBkColor2(const UiColor& color);
/** 获取第二背景色(实现渐变背景色)
*/
DString GetBkColor2() const;
/** 设置第二背景色的方向
* @param [in] direction 第二背景色的方向:"1": 左->右,"2": 上->下,"3": 左上->右下,"4": 右上->左下
*/
void SetBkColor2Direction(const DString& direction);
/** 获取第二背景色的方向
* @return 返回第二背景色的方向:"1": 左->右,"2": 上->下,"3": 左上->右下,"4": 右上->左下
*/
DString GetBkColor2Direction() const;
/** 获取前景颜色(前景色一般设置半透明的颜色)
* @return 返回前景颜色的字符串,该值在 global.xml 中定义
*/
DString GetForeColor() const;
/** 设置前景颜色(前景色一般设置半透明的颜色)
* @param [in] strColor 要设置的前景颜色值,该值必须在 global.xml 中存在
*/
void SetForeColor(const DString& strColor);
/** 设置前景颜色(前景色一般设置半透明的颜色)
* @param [in] color 要设置的前景颜色值
*/
void SetForeColor(const UiColor& color);
/** 获取某个状态下的控件颜色
* @param [in] stateType 要获取何种状态下的颜色值,参考 ControlStateType 枚举
* @return 指定状态下设定的颜色字符串,对应 global.xml 中指定色值
*/
DString GetStateColor(ControlStateType stateType) const;
/** 获取某个状态下的控件颜色矩形外边距
* @param [in] stateType 要获取何种状态下的颜色值,参考 ControlStateType 枚举
* @return 指定状态下设定的颜色矩形外边距(已经做过DPI缩放)
*/
UiMargin GetStateColorMargin(ControlStateType stateType) const;
/** 获取某个状态下的控件颜色矩形圆角大小
* @param [in] stateType 要获取何种状态下的颜色值,参考 ControlStateType 枚举
* @return 指定状态下设定的颜色矩形圆角大小(已经做过DPI缩放)
*/
UiSize GetStateColorRound(ControlStateType stateType) const;
/** 设置某个状态下的控件颜色、颜色外边距、颜色矩形的圆角大小
* @param [in] stateType 要设置何种状态下的颜色值,参考 ControlStateType 枚举
* @param [in] strColor 要设置的颜色值,该值必须在 global.xml 中存在
* @param [in] colorMargin 要设置的颜色矩形外边距,如果不设置,则颜色矩形与控件矩形重合
* @param [in] colorRound 要设置的颜色矩形圆角大小,如果不设置,则颜色矩形跟随控件矩形的形状
* @param [in] bNeedDpiScale 是否需要做DPI自适应
*/
void SetStateColor(ControlStateType stateType, const DString& strColor);
void SetStateColorMargin(ControlStateType stateType, UiMargin colorMargin, bool bNeedDpiScale);
void SetStateColorRound(ControlStateType stateType, UiSize colorRound, bool bNeedDpiScale);
/**
* @brief 获取背景图片位置
* @return 背景图片位置
*/
DString GetBkImage() const;
/**
* @brief 获取 UTF8 格式的背景图片位置
* @return 背景图片位置
*/
std::string GetUTF8BkImage() const;
/**
* @brief 设置背景图片
* @param[in] strImage 要设置的图片路径
* @return 无
*/
void SetBkImage(const DString& strImage);
/**
* @brief 设置背景图片(UTF8 格式字符串)
* @param[in] strImage 要设置的图片路径
* @return 无
*/
void SetUTF8BkImage(const std::string& strImage);
public:
/**
* @brief 获取指定状态下的图片位置
* @param[in] 要获取何种状态下的图片,参考 ControlStateType 枚举
* @return 指定状态下的图片位置
*/
DString GetStateImage(ControlStateType stateType) const;
/**
* @brief 设置某个状态下的图片
* @param[in] stateType 要设置何种状态下的图片,参考 ControlStateType 枚举
* @param[in] strImage 要设置的图片路径
* @return 无
*/
void SetStateImage(ControlStateType stateType, const DString& strImage);
/**
* @brief 获取指定状态下的前景图片
* @param[in] 要获取何种状态下的图片,参考 `ControlStateType` 枚举
* @return 指定状态下前景图片位置
*/
DString GetForeStateImage(ControlStateType stateType) const;
/**
* @brief 设置某个状态下前景图片
* @param[in] stateType 要设置何种状态下的图片,参考 `ControlStateType` 枚举
* @param[in] strImage 要设置的前景图片路径
* @return 无
*/
void SetForeStateImage(ControlStateType stateType, const DString& strImage);
/**@brief 获取控件状态
* @return 控件的状态,请参考 `ControlStateType` 枚举
*/
ControlStateType GetState() const;
/**@brief 设置控件状态
* @param[in] controlState 要设置的控件状态,请参考 `ControlStateType` 枚举
*/
void SetState(ControlStateType controlState);
/** 当前是否为Hot状态(这个状态下,业务逻辑较多)
*/
bool IsHotState() const;
/** 获取用于估算控件大小(宽和高)图片接口
*/
virtual Image* GetEstimateImage();
/// 边框相关
/** 获取指定状态下的边框颜色
* @param [in] stateType 控件状态
* @return 边框的颜色字符串,对应 global.xml 中的具体颜色值
*/
virtual DString GetBorderColor(ControlStateType stateType) const;
/** 设置边框颜色,应用于所有状态
* @param [in] strBorderColor 设置边框的颜色字符串值,该值必须在 global.xml 中存在
*/
void SetBorderColor(const DString& strBorderColor);
/** 设置指定状态下的边框颜色
* @param [in] stateType 控件状态
* @param [in] strBorderColor 设置边框的颜色字符串值,该值必须在 global.xml 中存在
*/
void SetBorderColor(ControlStateType stateType, const DString& strBorderColor);
/** 设置焦点状态下的边框颜色
*/
void SetFocusBorderColor(const DString& strBorderColor);
/** 获取焦点状态下的边框颜色
*/
DString GetFocusBorderColor() const;
/** 设置边框的大小(left、top、right、bottom分别对应左边框大小,上边框大小,右边框大小、下边框大小)
* @param [in] rc 一个 `UiRectF` 结构的边框大小集合
* @param [in] bNeedDpiScale 是否需要做DPI自适应
*/
void SetBorderSize(UiRectF rc, bool bNeedDpiScale);
/** 获取边框大小
*/
UiRectF GetBorderSize() const;
/** 获取左侧边框大小
* @return 左侧边框的大小
*/
float GetLeftBorderSize() const;
/** 设置左侧边框大小
* @param [in] fSize 要设置的左侧边框大小
* @param [in] bNeedDpiScale 是否需要做DPI自适应
*/
void SetLeftBorderSize(float fSize, bool bNeedDpiScale);
/** 获取顶部边框大小
*/
float GetTopBorderSize() const;
/** 设置顶部边框大小
* @param [in] fSize 要设置的上方边框大小
* @param [in] bNeedDpiScale 是否需要做DPI自适应
*/
void SetTopBorderSize(float fSize, bool bNeedDpiScale);
/** 获取右侧边框大小
* @return 右侧的边框大小
*/
float GetRightBorderSize() const;
/** 设置右侧边框大小
* @param [in] fSize 要设置的右侧边框大小
* @param [in] bNeedDpiScale 是否需要做DPI自适应
*/
void SetRightBorderSize(float fSize, bool bNeedDpiScale);
/** 获取下方边框大小
* @return 下方边框大小
*/
float GetBottomBorderSize() const;
/** 设置下方边框大小
* @param [in] fSize 要设置的下方边框大小
* @param [in] bNeedDpiScale 是否需要做DPI自适应
*/
void SetBottomBorderSize(float fSize, bool bNeedDpiScale);
/** 设置控件四周边框的线条类型(四个边的边线的线形只能一致,不支持分开设置)
* @param [in] borderDashStyle 线条类型, 取值范围参见 IPen::DashStyle枚举定义
*/
void SetBorderDashStyle(int8_t borderDashStyle);
/** 控件四周边框的线条类型, 取值范围参见 IPen::DashStyle枚举定义
*/
int8_t GetBorderDashStyle() const;
/** 设置边框是否在顶层
* @param [in] bBordersOnTop true 表示边框在顶层,即先绘制子控件,后绘制边框,可以避免边框被子控件覆盖
*/
void SetBordersOnTop(bool bBordersOnTop);
/** 获取边框是否在顶层, 默认值为true
*/
bool IsBordersOnTop() const;
/** 获取圆角大小
* @param [out] fRoundWidth 圆角宽度,DPI缩放之后的结果
* @param [out] fRoundHeight 圆角高度,DPI缩放之后的结果
* @return 如果未设置圆角,返回false,如果设置了圆角,返回true
*/
bool GetBorderRound(float& fRoundWidth, float& fRoundHeight) const;
/** 是否设置了圆角大小
*/
bool HasBorderRound() const;
/** 设置边框大小(未经DPI缩放的原始值)
* @param [in] borderRound 一个 UiSize 结构表示圆角大小
*/
void SetBorderRound(UiSize borderRound);
/** 设置边框阴影
* @param[in] 要设置的阴影属性
*/
void SetBoxShadow(const DString& strShadow);
/// 鼠标相关
/**
* @brief 获取鼠标指针类型
*/
virtual CursorType GetCursorType() const;
/**@brief 设置当前鼠标指针类型
* @param[in] cursorType 要设置的鼠标类型,参考 CursorType 枚举
*/
void SetCursorType(CursorType cursorType);
/**
* @brief 获取控件在鼠标悬浮状态下的提示文本
* @return 返回当前鼠标悬浮状态提示的文本
*/
virtual DString GetToolTipText() const;
/**
* @brief 获取控件在鼠标悬浮状态下的提示文本(UTF8 格式)
* @return 返回当前鼠标悬浮状态提示的文本
*/
virtual std::string GetUTF8ToolTipText() const;
/**
* @brief 设置鼠标悬浮到控件显示的提示文本
* @param[in] strText 要设置的文本
* @return 无
*/
virtual void SetToolTipText(const DString& strText);
/**
* @brief 设置鼠标悬浮到控件显示的提示文本(UTF8 格式)
* @param[in] strText 要设置的文本
* @return 无
*/
virtual void SetUTF8ToolTipText(const std::string& strText);
/**
* @brief 设置鼠标悬浮到控件显示的提示文本在语言文件中对应的文字
* @param[in] strTextId 在语言文件中对应的提示文字 ID
* @return 无
*/
virtual void SetToolTipTextId(const DString& strTextId);
/**
* @brief 设置鼠标悬浮到控件显示的提示文本在语言文件中对应的文字(UTF8 格式)
* @param[in] strTextId 在语言文件中对应的提示文字 ID
* @return 无
*/
virtual void SetUTF8ToolTipTextId(const std::string& strTextId);
/** 设置鼠标悬浮到控件上提示的文本单行最大宽度
* @param [in] nWidth 要设置的宽度值
* @param [in] bNeedDpiScale 是否支持DPI缩放
*/
virtual void SetToolTipWidth(int32_t nWidth, bool bNeedDpiScale);
/**
* @brief 获取鼠标悬浮到控件上提示的文本单行最大宽度
* @return 当前提示文本最大宽度
*/
virtual int32_t GetToolTipWidth(void) const;
/// 菜单
/**
* @brief 控件是否响应上下文菜单消息
* @return 返回结果表示了是否响应上下文菜单消息,true 响应上下文菜单消息,false 不响应上下文菜单消息
*/
virtual bool IsContextMenuUsed() const { return m_bContextMenuUsed; };
/**
* @brief 设置控件响应上下文菜单消息
* @param[in] bMenuUsed 是否响应上下文菜单消息,true 为是,false 为否
* @return 无
*/
virtual void SetContextMenuUsed(bool bMenuUsed);
/// 用户数据,辅助函数,供用户使用
/** 获取用户绑定到控件的数据字符串
* @return 返回具体数据字符串
*/
DString GetDataID() const;
/** 获取用户绑定到控件的数据字符串(UTF8 格式)
* @return 返回具体数据字符串
*/
std::string GetUTF8DataID() const;
/** 绑定一个字符串数据到控件
* @param[in] strText 要绑定的字符串数据
*/
void SetDataID(const DString& strText);
/** 绑定一个字符串数据到控件(UTF8 格式)
* @param[in] strText 要绑定的字符串数据
*/
void SetUTF8DataID(const std::string& strText);
/** 绑定一个整型值数据到控件
* @param[in] dataID 要绑定的整型数据
*/
void SetUserDataID(size_t dataID);
/** 获取控件绑定的整型值数据
*/
size_t GetUserDataID() const;
/// 一些重要的属性
/** 以淡入淡出等动画形式设置控件是否可见, 调用的结果与SetVisible相同,只是过程包含了动画效果。
调用SetFadeVisible以后,不需要再调用SetVisible函数修改可见属性。
该函数内部会调用SetVisible这个函数。
* @param[in] bVisible 为 true 时控件可见,为 false 时控件被隐藏
*/
virtual void SetFadeVisible(bool bVisible);
/** 检查控件是否具有焦点
* @return 返回控件是否具有检点,为 true 时是当前具有焦点,为 false 时控件没有焦点
*/
virtual bool IsFocused() const;
/** 让控件获取焦点
*/
virtual void SetFocus();
/** 返回控件的标识,用于判断是否可以响应 TAB 切换事件
* @return 返回控件的标识类型
*/
virtual uint32_t GetControlFlags() const;
/** 让控件设置永远获取不到焦点
*/
void SetNoFocus(); // 控件永远不要焦点,与KillFocus不一样
/** 该控件是否不获取焦点
*/
bool IsNoFocus() const { return m_bNoFocus; }
/** 设置是否显示焦点状态(一个虚线构成的矩形)
*/
void SetShowFocusRect(bool bShowFocusRect);
/** 设置是否显示焦点状态(一个虚线构成的矩形)
*/
bool IsShowFocusRect() const;
/** 设置焦点状态虚线矩形的颜色(线条的颜色)
*/
void SetFocusRectColor(const DString& focusRectColor);
/** 获取焦点状态虚线矩形的颜色(线条的颜色)
*/
DString GetFocusRectColor() const;
/** 判断当前鼠标焦点是否在控件上
* @return 返回鼠标焦点是否在控件上,true 鼠标焦点在控件上,false 鼠标焦点不在控件上
*/
virtual bool IsMouseFocused() const { return m_bMouseFocused;}
/**
* @brief 设置是否将鼠标焦点到控件上
* @param[in] bMouseFocused 为 true 时设置鼠标焦点到控件上,为 false 时让控件失去鼠标焦点
* @return 无
*/
virtual void SetMouseFocused(bool bMouseFocused) { m_bMouseFocused = bMouseFocused; }
/**
* @brief 判断控件当前是否是可激活状态
* @return 返回控件状态,true 控件当前是可激活状态,可见并可用,false 控件当前非可激活状态,可能不可见或被禁用
*/
virtual bool IsActivatable() const;
/** 激活控件,如点击、选中、展开等操作
* @param [in] pMsg 激活时对应的消息,可能为nullptr
*/
virtual void Activate(const EventArgs* pMsg);
/** 根据坐标查找指定控件
* @param [in] Proc 查找的匹配函数
* @param [in] pProcData 查找函数的自定义数据
* @param [in] ptMouse 鼠标所在的坐标, 仅当含有UIFIND_HITTEST时有效
* @param [in] uFlags 查找标志,比如:UIFIND_ENABLED 等
* @param [in] scrollPos 滚动条的滚动位置
* @return 返回控件的指针
*/
virtual Control* FindControl(FINDCONTROLPROC Proc, void* pProcData, uint32_t uFlags,
const UiPoint& ptMouse = UiPoint(),
const UiPoint& scrollPos = UiPoint());
/** 根据名字查找控件, 查找范围:当前控件/容器,如果本身是容器,则在容器自身和子控件内查找
* @param [in] name 控件的名称(区分大小写)
*/
Control* FindControl(const DString& name);
/// 位置相关
/** 获取控件位置(子类可改变行为)
* @return 返回控件的矩形区域,包含内边距,不包含外边距
*/
virtual UiRect GetPos() const override;
/** 设置控件位置(子类可改变行为)
* @param [in] rc 要设置的矩形区域信息,包含内边距,不包含外边距
*/
virtual void SetPos(UiRect rc) override;
/** 获取本控件包含box-shadow的绘制扩展区域
* @return 返回rc + box-shadow 扩展后的总区域,如果无box-shadow则返回rc
*/
virtual UiRect GetBoxShadowExpandedRect(const UiRect& rc) const override;
/** 计算控件大小(宽和高)
如果设置了图片并设置 width 或 height 任意一项为 auto,将根据图片大小和文本大小来计算最终大小
* @param [in] szAvailable 可用大小,不包含内边距,不包含外边距
* @return 控件的估算大小,包含内边距(Box),不包含外边距
*/
virtual UiEstSize EstimateSize(UiSize szAvailable);
/** 计算文本区域大小(宽和高)
* @param [in] szAvailable 可用大小,不包含内边距,不包含外边距
* @return 控件的文本估算大小,包含内边距(Box),不包含外边距
*/
virtual UiSize EstimateText(UiSize szAvailable);
/** 计算图片区域大小(宽和高)
* @param [in] szAvailable 可用大小,不包含内边距,不包含外边距
* @param [in] estImageType 估算图片的类型
* @return 控件的图片估算大小,包含内边距(Box),不包含外边距
*/
virtual UiSize EstimateImage(UiSize szAvailable, EstimateImageType estImageType);
/**
* @brief 检查指定坐标是否在滚动条当前滚动位置的范围内
* @param[in] point 具体坐标
* @return 返回是否在范围内,true 在滚动条当前滚动位置范围内,false 不在滚动条当前滚动位置范围内
*/
virtual bool IsPointInWithScrollOffset(const UiPoint& point) const;
/** 控件的消息处理入口,将消息转换为自定义格式的消息
* @param [in] eventType 消息类型
* @param [in] wParam 产生事件时的参数1
* @param [in] lParam 产生事件时的参数2
*/
void SendEvent(EventType eventType, WPARAM wParam = 0, LPARAM lParam = 0);
/** 控件的消息处理入口,将消息转换为自定义格式的消息
* @param [in] eventType 消息类型
* @param [in] wParam 产生事件时的参数1
* @param [in] lParam 产生事件时的参数2
* @param [in] pEventData 产生事件时的指针参数
*/
void SendEvent(EventType eventType, WPARAM wParam, LPARAM lParam, void* pEventData);
/** 控件的消息处理入口,将消息转换为自定义格式的消息
* @param [in] eventType 消息类型
* @param [in] msg 消息内容,可不必设置eventType
*/
void SendEvent(EventType eventType, EventArgs msg);
/** 将消息派发到消息处理函数
* @param [in] msg 消息内容
*/
virtual void SendEventMsg(const EventArgs& msg);
/**
* @brief 判断控件是否有 HOT 状态
* @return 返回 true 有 HOT 状态, 否则为 false
*/
virtual bool HasHotState();
// 属性设置
/**
* @brief 设置控件指定属性
* @param[in] strName 要设置的属性名称(如 width)
* @param[in] strValue 要设置的属性值(如 100)
* @return 无
*/
virtual void SetAttribute(const DString& strName, const DString& strValue);
/**
* @brief 设置控件的 class 全局属性
* @param[in] strClass 要设置的 class 名称,该名称必须在 global.xml 中存在
* @return 无
*/
void SetClass(const DString& strClass);
/**
* @brief 应用一套属性列表
* @param[in] strList 属性列表的字符串表示,如 `width="100" height="30"`
* @return 无
*/
void ApplyAttributeList(const DString& strList);
/**
* @brief 待补充
* @param[in] 待补充
* @return 待补充
*/
bool OnApplyAttributeList(const DString& strReceiver, const DString& strList, const EventArgs& eventArgs);
/// 绘制操作
/** 绘制图片
* @param [in] pRender 绘制上下文
* @param [in] pImage 图片对象的接口
* @param [in] strModify 图片的附加属性
* @param [in] nFade 控件的透明度,如果启用动画效果该值在绘制时是不断变化的
* @param [in] pMatrix 绘制图片时使用的变换矩阵
* @param [in] pDestRect 外部传入的图片绘制的目标区域,如果为nullptr,则内部使用GetRect()返回的区域
* @param [out] pPaintedRect 返回图片绘制的最终目标矩形区域
* @return 成功返回 true,失败返回 false
*/
bool PaintImage(IRender* pRender,
Image* pImage,
const DString& strModify = _T(""),
int32_t nFade = DUI_NOSET_VALUE,
IMatrix* pMatrix = nullptr,
const UiRect* pDestRect = nullptr,
UiRect* pPaintedRect = nullptr) const;
/** 绘制控件自身及子控件
* @param[in] pRender 渲染接口
* @param[in] rcPaint 指定绘制区域
*/
virtual void AlphaPaint(IRender* pRender, const UiRect& rcPaint);
/** 绘制控件自身
* @param[in] pRender 渲染接口
* @param[in] rcPaint 指定绘制区域
*/
virtual void Paint(IRender* pRender, const UiRect& rcPaint);
/** 绘制控件的子控件
* @param[in] pRender 渲染接口
* @param[in] rcPaint 指定绘制区域
*/
virtual void PaintChild(IRender* pRender, const UiRect& rcPaint) { (void)pRender; (void)rcPaint; };
/** 设置控件透明度
* @param [in] nAlpha 0 ~ 255 的透明度值,255 为不透明
*/
void SetAlpha(uint8_t nAlpha);
/** 获取控件透明度
* @return 返回控件的透明度
*/
uint8_t GetAlpha() const { return m_nAlpha; }
/** 检查控件是否有透明属性
* @return 返回控件是否透明,true 控件当前有透明属性,false 控件没有透明属性
*/
bool IsAlpha() const { return m_nAlpha != 255; }
/** 设置焦点状态透明度
* @param [in] alpha 0 ~ 255 的透明度值,255 为不透明
*/
void SetHotAlpha(uint8_t nHotAlpha);
/** 获取焦点状态透明度
* @return 返回控件焦点状态的透明度
*/
uint8_t GetHotAlpha() const { return m_nHotAlpha; }
/**
* @brief 设置是否接受TAB键切换焦点
* @param[in] enable
* @return 无
*/
void SetTabStop(bool enable);
/**
* @brief 检查是否接受TAB键切换焦点
* @return 返回控件是否接受TAB键切换焦点
*/
bool IsAllowTabStop() const { return m_bAllowTabstop; }
/** 获取控件绘制偏移量(其值已完成DPI缩放)
* @return 返回当前控件的绘制偏移量
*/
UiPoint GetRenderOffset() const;
/** 设置控件绘制偏移量
* @param [in] renderOffset 控件偏移数据
* @param [in] bNeedDpiScale 是否支持DPI缩放
*/
void SetRenderOffset(UiPoint renderOffset, bool bNeedDpiScale);
/** 设置控件偏移的 X 坐标
* @param [in] renderOffsetX X 坐标值(其值已完成DPI缩放)
*/
void SetRenderOffsetX(int32_t renderOffsetX);
/** 设置控件偏移的 Y 坐标
* @param [in] renderOffsetY Y 坐标值(其值已完成DPI缩放)
*/
void SetRenderOffsetY(int32_t renderOffsetY);
public:
/// Loading状态管理
/** 设置loading的属性,根据属性中指定的XML文件创建显示界面,并设置界面属性
* @param [in] loadingAttribute loading的属性字符串
*/
bool SetLoadingAttribute(const DString& loadingAttribute);
/** 开启loading状态
* @param [in] nIntervalMs 回调的时间间隔(毫秒),最小值为10毫秒
* @param [in] nMaxCount 设置最大回调次数,超过此值则自动停止,loading总时间为 nMaxCount * nIntervalMs 毫秒;如果为-1表示一值加载,等待手动停止
*/
bool StartLoading(int32_t nIntervalMs, int32_t nMaxCount);
/** 关闭loading状态
*/
void StopLoading();
/** 当前是否正在加载中
*/
bool IsLoading() const;
/** 获取loading界面的根容器接口(在StartLoading成功以后才能够获取到, 在StopLoading结束以后也获取不到)
*/
Box* GetLoadingUiRootBox() const;
/** 监听loading开始的通知
* @param [in] callback 监听事件的回调函数
* @param [in] callbackID 该回调函数对应的ID(用于删除回调函数)
*/
void AttachLoadingStart(const EventCallback& callback, EventCallbackID callbackID = 0) { AttachEvent(kEventLoadingStart, callback, callbackID); }
/** 监听loading回调的通知
* @param[in] callback 监听事件的回调函数
* @param [in] callbackID 该回调函数对应的ID(用于删除回调函数)
*/
void AttachLoading(const EventCallback& callback, EventCallbackID callbackID = 0) { AttachEvent(kEventLoading, callback, callbackID); }
/** 监听loading结束的通知
* @param [in] callback 监听事件的回调函数
* @param [in] callbackID 该回调函数对应的ID(用于删除回调函数)
*/
void AttachLoadingStop(const EventCallback& callback, EventCallbackID callbackID = 0) { AttachEvent(kEventLoadingStop, callback, callbackID); }
public:
/// 动画图片
/** 播放动画
* @param [in] imageName 图片资源名称,即XML中配置图片资源中的name字段名称,如果为空串则表示是背景图片
* @param [in] nStartFrame 从哪一帧开始播放,可设置第一帧、当前帧和最后一帧。请参考 AnimationImagePos 枚举
* @param [in] nPlayCount 指定播放次数
-1: 表示一直播放
0: 表示无有效的播放次数,使用图片的默认值(或者预设值)
>0: 具体的播放次数,达到播放次数后,停止播放
*/
bool StartImageAnimation(const DString& imageName = _T(""),
AnimationImagePos nStartFrame = AnimationImagePos::kFrameCurrent,
int32_t nPlayCount = 0);
/** 停止播放动画
* @param [in] imageName 图片资源名称,即XML中配置图片资源中的name字段名称,如果为空串则表示是背景图片
* @param [in] nStopFrame 播放结束停止在哪一帧,可设置第一帧、当前帧和最后一帧。请参考 AnimationImagePos 枚举
* @param [in] bTriggerEvent 是否将停止事件通知给订阅者,参考 AttachImageAnimationStop 方法
*/
bool StopImageAnimation(const DString& imageName = _T(""),
AnimationImagePos nStopFrame = AnimationImagePos::kFrameCurrent,
bool bTriggerEvent = true);
/** 播放动画的当前帧
* @param [in] imageName 图片资源名称,即XML中配置图片资源中的name字段名称,如果为空串则表示是背景图片
* @param [in] nFrameIndex 从0开始的图片帧索引号
*/
bool SetImageAnimationFrame(int32_t nFrameIndex);//背景图片
bool SetImageAnimationFrame(const DString& imageName, int32_t nFrameIndex);
/** 获取动画的当前帧的索引号
* @param [in] imageName 图片资源名称,即XML中配置图片资源中的name字段名称,如果为空串则表示是背景图片
*/
uint32_t GetImageAnimationFrameIndex() const;//背景图片
uint32_t GetImageAnimationFrameIndex(const DString& imageName) const;
/** 获取动画的总帧数
* @param [in] imageName 图片资源名称,即XML中配置图片资源中的name字段名称,如果为空串则表示是背景图片
*/
uint32_t GetImageAnimationFrameCount();//背景图片
uint32_t GetImageAnimationFrameCount(const DString& imageName);
/** 动画图片是否已经完成加载
*/
bool IsImageAnimationLoaded() const;//背景图片
bool IsImageAnimationLoaded(const DString& imageName) const;
/** 监听动画播放开始通知(所有图片动画)
* @param [in] callback 要监听动画停止播放的回调函数
* @param [in] callbackID 该回调函数对应的ID(用于删除回调函数)
*/
void AttachImageAnimationStart(const EventCallback& callback, EventCallbackID callbackID = 0) { AttachEvent(kEventImageAnimationStart, callback, callbackID); }
/** 监听动画播放图片帧的通知(所有图片动画)
* @param [in] callback 要监听动画停止播放的回调函数
* @param [in] callbackID 该回调函数对应的ID(用于删除回调函数)
*/
void AttachImageAnimationPlayFrame(const EventCallback& callback, EventCallbackID callbackID = 0) { AttachEvent(kEventImageAnimationPlayFrame, callback, callbackID); }
/** 监听动画播放停止通知(所有图片动画)
* @param [in] callback 要监听动画停止播放的回调函数
* @param [in] callbackID 该回调函数对应的ID(用于删除回调函数)
*/
void AttachImageAnimationStop(const EventCallback& callback, EventCallbackID callbackID = 0) { AttachEvent(kEventImageAnimationStop, callback, callbackID); }
public:
/// 控件动画相关接口
/** 设置或清除Hot状态的播放动画(对应动画类型为:kAnimationHot)
* @param [in] bFadeHot true表示设置动画,false表示清除动画
*/
void SetFadeHot(bool bFadeHot);
/** 设置播放Hot状态动画的定时器时间间隔(毫秒)(对应动画类型为:kAnimationHot)
* @param [in] frameIntervalMillSeconds 播放动画的定时器时间间隔(毫秒)
*/
void SetFadeHotFrameIntervalMillSeconds(int32_t frameIntervalMillSeconds);
/** 获取Hot状态动画播放的定时器时间间隔(毫秒)(对应动画类型为:kAnimationHot)
*/
int32_t GetFadeHotFrameIntervalMillSeconds() const;
/** 设置Hot状态动画总的播放时间(毫秒)(对应动画类型为:kAnimationHot)
* @param [in] totalMillSeconds 动画总的播放时间(毫秒)
*/
void SetFadeHotTotalMillSeconds(int32_t totalMillSeconds);
/** 获取Hot状态动画总的播放时间(毫秒)(对应动画类型为:kAnimationHot)
*/
int32_t GetFadeHotTotalMillSeconds() const;
/** 设置Hot状态动画缓动函数类型(对应动画类型为:kAnimationHot)
*/
void SetFadeHotEasingFunctionType(EasingFunctionType easingFunctionType);
/** 获取Hot状态动画缓动函数类型(对应动画类型为:kAnimationHot)
*/
EasingFunctionType GetFadeHotEasingFunctionType() const;
/** 判断是否包含指定类型的动画播放接口
*/
bool HasAnimationPlayer(AnimationType animationType) const;
/** 判断指定类型的控件动画是否正在播放中
*/
bool IsAnimationPlayerPlaying(AnimationType animationType) const;
/** 获取控件动画管理器接口(控件动画)
*/
AnimationManager& GetAnimationManager();
public:
/// 图片资源
/** 根据图片属性设置, 加载图片信息到缓存中
* @param [in,out] duiImage 传入时标注图片的路径信息,如果成功则会缓存图片并记录到该参数的成员中
* @param [out] bPaintImage true表示在绘制时加载图片,false表示其他情况下加载图片
*/
bool LoadImageInfo(Image& duiImage, bool bPaintImage = false) const;
/** 获取指定名称的图片资源接口
*/
Image* FindImageByName(const DString& imageName) const;
/** 清理图片缓存, 清理后,如果使用则会重新加载
*/
virtual void ClearImageCache();
public:
/** 计算鼠标在某个控件上的相对位置(相对于控件左上角)
* @param [in] ptMouse 当前鼠标的位置,客户区坐标
* @param [out] ptLayoutPos 返回鼠标在客户区内的相对坐标,相对于当前控件的左上角坐标值
* @return true表示鼠标在控件范围内,false表示鼠标不在控件范围内
*/
bool MousePosToLayoutPos(const UiPoint& ptMouse, UiPoint& ptLayoutPos);
/** 屏幕坐标转换为客户区坐标
*/
virtual bool ScreenToClient(UiPoint& pt);
/** 客户区坐标转换为屏幕坐标
*/
virtual bool ClientToScreen(UiPoint& pt);
/** DPI发生变化,更新控件大小和布局
* @param [in] nOldDpiScale 旧的DPI缩放百分比
* @param [in] nNewDpiScale 新的DPI缩放百分比,与Dpi().GetScale()的值一致
*/
virtual void ChangeDpiScale(uint32_t nOldDpiScale, uint32_t nNewDpiScale);
/** 语言发生变化,刷新界面文字显示相关的内容
*/
virtual void OnLanguageChanged();
public:
/** 监听控件所有事件
* @param [in] callback 事件处理的回调函数,请参考 EventCallback 声明
* @param [in] callbackID 该回调函数对应的ID(用于删除回调函数)
*/
void AttachAllEvents(const EventCallback& callback, EventCallbackID callbackID = 0) { AttachEvent(kEventAll, callback, callbackID); }
/** 监听鼠标进入事件
* @param [in] callback 事件处理的回调函数,请参考 EventCallback 声明
* @param [in] callbackID 该回调函数对应的ID(用于删除回调函数)
*/
void AttachMouseEnter(const EventCallback& callback, EventCallbackID callbackID = 0) { AttachEvent(kEventMouseEnter, callback, callbackID); }
/** 监听鼠标离开事件
* @param [in] callback 事件处理的回调函数,请参考 EventCallback 声明
* @param [in] callbackID 该回调函数对应的ID(用于删除回调函数)
*/
void AttachMouseLeave(const EventCallback& callback, EventCallbackID callbackID = 0) { AttachEvent(kEventMouseLeave, callback, callbackID); }
/** 监听鼠标悬浮事件
* @param [in] callback 事件处理的回调函数,请参考 EventCallback 声明
* @param [in] callbackID 该回调函数对应的ID(用于删除回调函数)
*/
void AttachMouseHover(const EventCallback& callback, EventCallbackID callbackID = 0) { AttachEvent(kEventMouseHover, callback, callbackID); }
/** 监听鼠标移动事件
* @param [in] callback 事件处理的回调函数,请参考 EventCallback 声明
* @param [in] callbackID 该回调函数对应的ID(用于删除回调函数)
*/
void AttachMouseMove(const EventCallback& callback, EventCallbackID callbackID = 0) { AttachEvent(kEventMouseMove, callback, callbackID); }
/** 监听鼠标按下事件(左键)
* @param [in] callback 事件处理的回调函数,请参考 EventCallback 声明
* @param [in] callbackID 该回调函数对应的ID(用于删除回调函数)
*/
void AttachButtonDown(const EventCallback& callback, EventCallbackID callbackID = 0) { AttachEvent(kEventMouseButtonDown, callback, callbackID); }
/** 监听鼠标弹起事件(左键)
* @param [in] callback 事件处理的回调函数,请参考 EventCallback 声明
* @param [in] callbackID 该回调函数对应的ID(用于删除回调函数)
*/
void AttachButtonUp(const EventCallback& callback, EventCallbackID callbackID = 0) { AttachEvent(kEventMouseButtonUp, callback, callbackID); }
/** 监听鼠标按下事件(右键)
* @param [in] callback 事件处理的回调函数,请参考 EventCallback 声明
* @param [in] callbackID 该回调函数对应的ID(用于删除回调函数)
*/
void AttachRButtonDown(const EventCallback& callback, EventCallbackID callbackID = 0) { AttachEvent(kEventMouseRButtonDown, callback, callbackID); }
/** 监听鼠标弹起事件(右键)
* @param [in] callback 事件处理的回调函数,请参考 EventCallback 声明
* @param [in] callbackID 该回调函数对应的ID(用于删除回调函数)
*/
void AttachRButtonUp(const EventCallback& callback, EventCallbackID callbackID = 0) { AttachEvent(kEventMouseRButtonUp, callback, callbackID); }
/** 监听获得焦点事件
* @param [in] callback 事件处理的回调函数,请参考 EventCallback 声明
* @param [in] callbackID 该回调函数对应的ID(用于删除回调函数)
*/
void AttachSetFocus(const EventCallback& callback, EventCallbackID callbackID = 0) { AttachEvent(kEventSetFocus, callback, callbackID); }
/** 监听失去焦点事件
* @param [in] callback 事件处理的回调函数,请参考 EventCallback 声明
* @param [in] callbackID 该回调函数对应的ID(用于删除回调函数)
*/
void AttachKillFocus(const EventCallback& callback, EventCallbackID callbackID = 0) { AttachEvent(kEventKillFocus, callback, callbackID); }
/** 监听窗口失去焦点事件
* @param [in] callback 事件处理的回调函数,请参考 EventCallback 声明
* @param [in] callbackID 该回调函数对应的ID(用于删除回调函数)
*/
void AttachWindowKillFocus(const EventCallback& callback, EventCallbackID callbackID = 0) { AttachEvent(kEventWindowKillFocus, callback, callbackID); }
/** 监听右键菜单事件
* @param [in] callback 事件处理的回调函数,请参考 EventCallback 声明
* @param [in] callbackID 该回调函数对应的ID(用于删除回调函数)
*/
void AttachContextMenu(const EventCallback& callback, EventCallbackID callbackID = 0) { AttachEvent(kEventContextMenu, callback, callbackID); }
/** 监听控件位置改变事件
* @param [in] callback 事件处理的回调函数,请参考 EventCallback 声明
* @param [in] callbackID 该回调函数对应的ID(用于删除回调函数)
*/
void AttachPosChanged(const EventCallback& callback, EventCallbackID callbackID = 0) { AttachEvent(kEventPosChanged, callback, callbackID); }
/** 监听控件大小改变事件