Compare commits

...

251 Commits

Author SHA1 Message Date
Sunny
42a042beb3 * UIDataGridView: 修复数据更新时是否自动滚动到最后一行 2025-04-21 22:54:29 +08:00
Sunny
123427892e * UITabControl: 更新部分注释 2025-04-21 22:15:14 +08:00
Sunny
0b7f218b3c * UITabControl: 修复不可关闭的主页被关闭了 #IC1XIU 2025-04-17 22:20:30 +08:00
Sunny
c5e5a11188 * UINavMenu: 增加节点文字居中的属性 2025-04-17 13:48:50 +08:00
Sunny
8bf338e488 3.8.3 2025-04-06 20:20:28 +08:00
Sunny
0d989a75ea * EnumEx: DisplayText特性改为原生的Description特性 2025-04-06 16:42:44 +08:00
Sunny
00897c5cc5 * UIBreadcrumb: 增加SetItemColor,设置单个节点颜色,可以用RemoveItemColor移除 2025-04-03 23:24:27 +08:00
Sunny
cd04f9cf19 * UIDigitalLabel: 增加ShowText属性,可以显示文字 #IBY64V 2025-04-03 22:43:44 +08:00
Sunny
7fd73a8808 * UILedLabel: 重构显示位置,并增加Padding属性关联显示 2025-03-31 21:03:58 +08:00
Sunny
b9c87e15e8 * UIComboBox: 修复过滤下拉框跟随主题配色 2025-03-18 22:36:33 +08:00
Sunny
4f75336ed5 * 增加控件在工具箱说明文字 2025-03-18 22:12:54 +08:00
Sunny
8fce03fff2 * 增加控件在工具箱说明文字 2025-03-17 23:50:55 +08:00
Sunny
42c453820c * 更新一些控件的字体图标 2025-03-16 13:27:59 +08:00
Sunny
dc503f0eea * UIDoubleUpDown: 增加按钮字体图标的大小属性
* UIIntegerUpDown: 增加按钮字体图标的大小属性
2025-03-16 13:20:12 +08:00
Sunny
76426019e3 更新Demo 2025-03-09 21:17:23 +08:00
Sunny
f40426c113 V3.8.2 2025-03-09 20:55:59 +08:00
Sunny
28a1f1a451 * UIBarChart: 增加Y轴零度线偏移量,Option.ZeroLineOffset 2025-03-05 21:12:11 +08:00
Sunny
ec00734884 * UIBattery: 增加图标旋转角度,增加图标偏移位置,调整图标最大值 2025-03-04 21:18:52 +08:00
Sunny
282c1ae17c * UITabControl: 增加标签页分割线属性ShowTabDivider,#IBLERL 2025-02-13 10:45:17 +08:00
Sunny
76910ac4ff * UITabControlMenu: 修复切换主题色时,TabPage未设置背景色,#IBKDR7 2025-02-07 21:12:24 +08:00
Sunny
a07043ae07 * UITabControl: 修复切换主题色时,TabPage未设置背景色,#IBKDR7 2025-02-07 21:09:34 +08:00
Sunny
8decdf00cf * UIColorPicker: 增加手动输入ARGB值调色 #IBHL0H 2025-02-04 22:13:55 +08:00
Sunny
c451a61a66 更新Demo 2025-02-04 21:36:42 +08:00
Sunny
2c3022a322 + UIStatusBox: 增加根据状态显示图片控件 2025-01-18 17:33:21 +08:00
Sunny
b0093af77a * UIMenuButton: 更改属性描述 2025-01-15 17:49:06 +08:00
Sunny
8727038717 * UIForm: 修复窗体边框显示不全 #IBGJBS 2025-01-09 20:44:27 +08:00
Sunny
b9daa7e005 更新版本日期 2025-01-07 22:19:21 +08:00
Sunny
031be368e4 * UFontAwesomeV6: 更新为Font Awesome version: 6.7.2 2025-01-06 21:54:57 +08:00
Sunny
6a5d7bea2f 更新描述 2025-01-02 21:51:25 +08:00
Sunny
8a5f6ea7b0 更改描述 2025-01-02 21:47:14 +08:00
Sunny
36b7d41336 V3.8.1 2024-12-27 23:34:17 +08:00
Sunny
66fec152d4 V3.8.1 2024-12-27 22:28:21 +08:00
Sunny
1d60a09987 重构 2024-12-27 21:37:59 +08:00
Sunny
6b5d644bd9 重构 2024-12-27 21:28:27 +08:00
Sunny
b01e4e14e1 + UIMenuButton: 增加下拉菜单按钮 2024-12-26 21:35:08 +08:00
Sunny
5d9e0a6f53 + UIMenuButton: 增加下拉菜单按钮 2024-12-26 21:32:53 +08:00
Sunny
65a35f5bad 增加了两处翻译 2024-12-23 22:49:45 +08:00
Sunny
c0c3298fd1 * UITitlePanel: 增加Padding设置 #IBB1UF 2024-12-14 20:11:13 +08:00
Sunny
2c70e734c4 * UITabControl: 增加未选页签颜色 #IB7U69 2024-12-12 23:11:35 +08:00
Sunny
d0c731fe97 * UITabControl: 修复标签文字越界显示 #IB8571 2024-12-12 22:31:28 +08:00
Sunny
09ba37daa3 * UIVerificationCode: 可以自定义颜色 #IBABW1 2024-12-12 20:49:26 +08:00
Sunny
000c567255 * UIComboDataGridView: 修复一个报错 #IB8YK9 2024-12-04 21:40:44 +08:00
Sunny
beb21ebb91 * UICalendar: 切换语言实时刷新 2024-12-02 21:34:22 +08:00
Sunny
452e9e6e15 * UIScrollingText: 停止滚动时,可以设置默认显示位置 2024-12-02 21:25:39 +08:00
Sunny
120dbf2151 * UICheckBoxGroup: 修复TitleTop为0时,条目显示错位的问题 #IB7STO
* UIRadioButtonGroup: 修复TitleTop为0时,条目显示错位的问题 #IB7STO
2024-11-29 10:59:06 +08:00
Sunny
98d280d9f0 * UITabControl: 修复了SelectedIndex=-1时的报错 2024-11-29 09:35:54 +08:00
Sunny
f831a92cf7 * UIComboDataGridView: 解决下拉框显示过滤编辑框不能一直显示 #IB7AFB 2024-11-28 21:05:48 +08:00
Sunny
661b44090c 更新Demo 2024-11-27 22:50:09 +08:00
Sunny
741d10939a * UFontAwesomeV6: 更新为Font Awesome version: 6.7.1 2024-11-27 22:33:15 +08:00
Sunny
22677c9974 更新Demo 2024-11-19 23:08:47 +08:00
Sunny
9dbc2e80bd 3.8.0.1 2024-11-19 22:31:12 +08:00
Sunny
28cc5b3823 V3.8.0 2024-11-19 22:10:21 +08:00
Sunny
c6650b3c0e * UINotifier: 点击提示关闭,增加输出提示 2024-11-19 12:33:30 +08:00
Sunny
1708d57ef1 重构 2024-11-19 09:46:37 +08:00
Sunny
7e6ee8e98b * UIPanel: 增加透明度 2024-11-19 09:40:43 +08:00
Sunny
3c2ba689eb 更新 2024-11-15 10:30:17 +08:00
Sunny
4760de7dd1 * UILineChart: 增加了鼠标移上绘制十字线颜色 2024-11-14 10:17:21 +08:00
Sunny
c676e92fda * UILineChart: 增加了鼠标移上绘制十字线样式 2024-11-13 11:05:53 +08:00
Sunny
92607169d5 * UIComboDataGridView: 增加下拉框滚动条宽度调整属性 2024-11-12 15:03:45 +08:00
Sunny
e4c483dfeb * UINavBar: 增加StyleDropDown属性,手动修改Style时设置此属性以修改下拉框主题 2024-11-11 11:24:12 +08:00
Sunny
af41257d35 * UIComboBox: 增加StyleDropDown属性,手动修改Style时设置此属性以修改下拉框主题
* UIComboBox: 删除ScrollBarColor、ScrollBarBackColor、ScrollBarStyleInherited属性
* UIColorPicker:  增加StyleDropDown属性,手动修改Style时设置此属性以修改下拉框主题
* UIComboDataGridView: 增加StyleDropDown属性,手动修改Style时设置此属性以修改下拉框主题
* UIComboTreeView: 增加StyleDropDown属性,手动修改Style时设置此属性以修改下拉框主题
* UIDatePicker: 增加StyleDropDown属性,手动修改Style时设置此属性以修改下拉框主题
* UIDatetimePicker: 增加StyleDropDown属性,手动修改Style时设置此属性以修改下拉框主题
* UIDatePicker: 增加StyleDropDown属性,手动修改Style时设置此属性以修改下拉框主题
* UINumPadTextBox: 增加StyleDropDown属性,手动修改Style时设置此属性以修改下拉框主题
2024-11-10 22:43:32 +08:00
Sunny
76b13321e6 * UControl: UITreeView增加了一个刷新节点状态的扩展函数 2024-11-06 14:33:31 +08:00
Sunny
63952daa11 * UIScrollBar: 修复了一些重载事件 2024-11-04 14:00:21 +08:00
Sunny
b68740f828 重构 2024-11-03 23:24:23 +08:00
Sunny
45d2eed8b9 * UIPage: 增加标题栏图片属性IconImage,优先于Symbol 2024-10-30 21:46:30 +08:00
Sunny
ecc5d49b90 * UIBaseForm: IconImage增加IconImageSize属性,可调整大小 2024-10-29 22:55:52 +08:00
Sunny
88bce81140 * UIComboBox: 增加了SelectionChangeCommitted事件,下拉框显示鼠标点击条目时响应 2024-10-28 22:46:47 +08:00
Sunny
2d98153089 * UIBarChart: 增加了一个快捷的显示数据函数ShowData 2024-10-25 10:44:56 +08:00
Sunny
49c9419590 * UIDigitalLabel: 增加DPI支持 2024-10-22 21:05:30 +08:00
Sunny
e9ffd02edc V3.7.2 2024-10-06 21:31:18 +08:00
Sunny
a411027eb1 * UIBaseForm: 增加属性IconImage,以改善Icon转Image显示不佳,状态栏显示仍然用Icon属性 2024-10-05 22:11:46 +08:00
Sunny
e67f03d9da * 重构多语翻译类 2024-10-05 21:09:26 +08:00
Sunny
7af419a5c0 * 重构多语翻译类 2024-09-29 22:27:03 +08:00
Sunny
5f09fe5626 * 重构多语翻译类 2024-09-27 23:34:14 +08:00
Sunny
2daddaef65 * 重构多语翻译类 2024-09-26 23:33:08 +08:00
Sunny
7bdde150c2 增加示例说明 2024-09-24 22:22:18 +08:00
Sunny
ecc1433b37 更新文档 2024-09-24 22:08:38 +08:00
Sunny
2ae270d571 更新文档 2024-09-23 22:21:59 +08:00
Sunny
9a3320c10f 更新文档 2024-09-22 22:21:11 +08:00
Sunny
aec616b1cf 增加文档 2024-09-22 21:18:27 +08:00
Sunny
b3ef1e1288 更新忽略项 2024-09-22 21:18:14 +08:00
Sunny
f12bef2dd8 * 重构多语翻译类 2024-09-17 22:49:54 +08:00
Sunny
2c24db60d9 * 重构多语翻译类 2024-09-16 21:54:35 +08:00
Sunny
1ccaaad57c * 重构多语翻译类 2024-09-16 21:47:57 +08:00
Sunny
3a506824d1 * 多页面框架重构 2024-09-16 17:33:34 +08:00
Sunny
c0fbc85a76 * 重构多语翻译类 2024-09-14 22:05:03 +08:00
Sunny
98c7a8f81e * 重构多语翻译类 2024-09-13 23:43:27 +08:00
Sunny
fd053e6553 * 重构多语翻译类 2024-09-10 23:31:49 +08:00
Sunny
6543a103a4 * UICheckBoxGroup: 2024-09-09: V3.7.0 更改计算节点位置的方法,解决问题:#IAPY94
* UIRadioButtonGroup: 2024-09-09: V3.7.0 更改计算节点位置的方法,解决问题:#IAPY94
2024-09-09 15:47:06 +08:00
Sunny
7fb69265ee * UIDataGridView: 解决有隐藏行时,滚动条滚动时出错的问题 #IAOW3A 2024-09-04 21:33:52 +08:00
Sunny
d1957cb75c * UINumPadTextBox: 增加ShowDropDown()弹窗方法 2024-09-03 16:34:42 +08:00
Sunny
6794b58d65 * UIRadioButton: 修改AutoSize属性可以保存在Design.cs文件里面,#IAKYX4
* UICheckBox: 修改AutoSize属性可以保存在Design.cs文件里面,#IAKYX4
2024-08-30 21:18:08 +08:00
Sunny
4dd0a284ac * UIDatePicker: 修复格式化字符串包含/时显示错误
* UIDateTimePicker: 修复格式化字符串包含/时显示错误
2024-08-28 21:55:55 +08:00
Sunny
51c6da4833 * UIDataGridView: 增加属性AutoScrollToBottom,数据更新时是否自动滚动到最后一行 2024-08-27 14:14:36 +08:00
Sunny
c2b4db9fc7 * UIDoubleUpDown: 增加加按钮字体图标的偏移位置
* UIIntegerUpDown: 增加加按钮字体图标的偏移位置
2024-08-27 14:07:21 +08:00
Sunny
83446dfcce V3.7.0 2024-08-27 10:40:48 +08:00
Sunny
073c2dbf0b * UIIntegerUpDown: 修改编辑框字体与显示字体一致
* UIDoubleUpDown: 修改编辑框字体与显示字体一致
* UITextBox: AutoSize时根据字体自动调整控件高度
2024-08-27 10:12:05 +08:00
Sunny
fcb55cbae4 * UICheckBox: 修复AutoSize在文字改变时未自动显示的问题,#IAKYX4
* UIRadioButton: 修复AutoSize在文字改变时未自动显示的问题,#IAKYX4
2024-08-26 22:49:49 +08:00
Sunny
7cf009af36 * UITextBox: 修复微软雅黑字体显示不完整的问题 2024-08-26 22:30:41 +08:00
Sunny
d1613f40d2 * UIMessageBox: UIMessageBox增加了快捷调用UIMessageForm2的方法 2024-08-26 11:32:35 +08:00
Sunny
e8ac774e0d * UIMessageBox: 修复一个Bug 2024-08-26 10:57:48 +08:00
Sunny
f6a6d75d5f 3.6.9 2024-08-17 23:07:45 +08:00
Sunny
cc4e37d1c1
update README.md.
Signed-off-by: Sunny <yhuse@163.com>
2024-08-12 08:59:33 +00:00
Sunny
0fd93be25c * UIComboDataGridView: 修改下拉界面滚动条跟随主题
* UIComboTreeView: 修改下拉界面滚动条跟随主题
2024-08-12 16:42:43 +08:00
Sunny
f1543d9226 * UITextBox: 解决原生控件字体在微软雅黑时,显示不完整的问题 2024-08-12 16:31:42 +08:00
Sunny
c3f232baa0 + 增加应用公共类库 2024-08-12 15:06:58 +08:00
Sunny
f8b903b6ed * UIMessageForm2: 重构文字显示位置,重绘 2024-08-10 22:07:53 +08:00
Sunny
c328bb7f02 * 弹窗增加线程安全调用 2024-08-10 20:47:20 +08:00
Sunny
753d5b13d9 * UIFormHelper: 重构弹窗,窗体扩展打开默认以窗体居中,取消TopMost参数,默认为true 2024-08-09 23:58:38 +08:00
Sunny
089a624620 * UINavMenuHelper: 窗体移除时调用Close() 2024-08-07 15:11:29 +08:00
Sunny
c64bdddaf8 * 解决弹窗报错 2024-08-07 11:31:00 +08:00
Sunny
1317d552b5 * UITreeView: 不显示连线时,重绘节点前展开与收缩的图标 2024-08-06 20:13:39 +08:00
Sunny
f865be8731 * UIColorPicker: 增加ShowDropDown()函数 2024-08-05 14:48:00 +08:00
Sunny
47d1057945 * 重构公共类 2024-08-03 10:57:02 +08:00
Sunny
cfa40a5381 * UIEditForm: 代码生成增加文件选择和文件夹选择功能 2024-08-02 22:57:26 +08:00
Sunny
12359d1bb4 * UIFormHelper: 弹窗默认修改为以当前窗体居中,showMask=true或者centerParent=false时以屏幕居中 2024-07-30 17:50:33 +08:00
Sunny
073f4cb22c * UIForm: 最大化后,鼠标单击标题栏最上方,不恢复正常大小 2024-07-28 23:39:19 +08:00
Sunny
fcd8b00784 * UIForm: 修复鼠标点击事件
* UIForm2: 修复鼠标点击事件
2024-07-26 10:56:40 +08:00
Sunny
d06628903b * UIDateTimeItem: 修改单击选择日期后立即刷新,双击可选择并关闭下拉框 2024-07-25 21:37:10 +08:00
Sunny
f786f071f0 * UIComboDataGridView: 过滤字符串可以包含'*','[',']','%'字符 2024-07-23 16:47:28 +08:00
Sunny
855719997c * 修改国际化的Demo 2024-07-23 14:33:14 +08:00
Sunny
d4a6cc80cc * FMain: Demo增加注释 2024-07-21 21:31:41 +08:00
Sunny
bc393b226e * FMain: Demo增加注释 2024-07-21 21:30:25 +08:00
Sunny
bdaf058240 * UIForm2: 修改属性与UIForm兼容 2024-07-21 21:20:58 +08:00
Sunny
35ad7bc7a5 * UFontAwesomeV6: 更新为Font Awesome version: 6.6.0 2024-07-21 21:09:12 +08:00
Sunny
57534ad9c3 * UIForm: 修改为初始化最大化后恢复时界面尺寸大小正常 2024-07-21 20:56:10 +08:00
Sunny
abab088e0b * UIRichTextBox: 修改滚动条颜色跟随主题 2024-07-20 21:48:24 +08:00
Sunny
bac0f32fd2 * UIForm2: 修改最大化时按钮位置 2024-07-20 16:26:18 +08:00
Sunny
0f062f387d * UIForm: 最大化时,鼠标拖拽标题超过一定范围后再恢复Normal显示 2024-07-20 15:10:51 +08:00
Sunny
25f5fe5284 * UIForm2: 修改最大化时按钮位置 2024-07-20 14:55:24 +08:00
Sunny
c5bc2c04e0 3.6.8.1 2024-07-19 18:10:41 +08:00
Sunny
a0acf12632
update README.md.
Signed-off-by: Sunny <yhuse@163.com>
2024-07-19 02:53:36 +00:00
Sunny
7fc1010705
update README.md.
Signed-off-by: Sunny <yhuse@163.com>
2024-07-19 02:53:01 +00:00
Sunny
899f07a273
update README.md.
Signed-off-by: Sunny <yhuse@163.com>
2024-07-19 02:44:16 +00:00
Sunny
2120e496a6
update SunnyUI.Demo.exe.md.
Signed-off-by: Sunny <yhuse@163.com>
2024-07-19 02:41:53 +00:00
Sunny
e5d88c2b1f
add SunnyUI.Demo.exe.md.
Signed-off-by: Sunny <yhuse@163.com>
2024-07-19 02:40:51 +00:00
Sunny
30834dce34 3.6.8 2024-07-19 09:36:30 +08:00
Sunny
ff578a46cf 3.6.8 2024-07-19 09:36:22 +08:00
Sunny
de35afe1a7 更新 2024-07-18 22:36:19 +08:00
Sunny
3f2d4d542b * UIStyles: 增加了一个设置控件容器内子控件自定义主题色的方法 2024-07-17 16:21:19 +08:00
Sunny
41f23482cd * UIDateTimeItem: 修改时间界面水平分割线颜色和位置
* UITimeItem: 修改时间界面水平分割线颜色和位置
2024-07-14 20:17:42 +08:00
Sunny
17adb334bf * UIDatePicker: 修改选择日期在下拉框中显示方式
* UIDatetimePicker: 修改选择日期在下拉框中显示方式
2024-07-13 23:08:57 +08:00
Sunny
759f6f0901 * UIComboTreeView: 修改下拉框全选按钮跟随主题,修改一处内置国际化翻译 2024-07-13 22:26:04 +08:00
Sunny
1e03aed0a7 * UILabel: 文字位置默认TopLeft 2024-07-10 11:07:00 +08:00
Sunny
3333fe2aba * UILineChart: 增加了Y轴自定义坐标显示 2024-07-01 22:57:32 +08:00
Sunny
688ff477d1 * UFontAwesomeV6: 减小文件大小 2024-06-27 09:57:15 +08:00
Sunny
3f2bdd86e5 * UFontAwesomeV6: 更新为Font Awesome version: 6.5.2 2024-06-26 14:20:40 +08:00
Sunny
48afcf2305 * UIDataGridView: 增加AddDateTimeColumn,解决默认时间列不显示秒数的问题 2024-06-19 21:38:34 +08:00
Sunny
91d6601d52 - FastLZ: 删除FastLZ类,源码见:https://gitee.com/yhuse/SunnyUI/blob/V3.6.7/SunnyUI/Common/UFastLZ.cs
可参考项目: https://www.nuget.org/packages/DotFastLZ.Compression
2024-06-19 21:17:57 +08:00
Sunny
23ae9da234 * IniUTF8Config: 增加一种默认编码为UTF8的Ini配置文件读写类 2024-06-19 21:14:04 +08:00
Sunny
1c6c9fe34f * 更新Demo 2024-06-12 22:51:07 +08:00
Sunny
58db4d3d28 V3.6.7 2024-06-11 23:07:17 +08:00
Sunny
7ce895f385 * UINavMenu: 更新 2024-06-11 22:02:49 +08:00
Sunny
5b28b736de * UITextBox: 调整为可继承 2024-06-11 21:31:41 +08:00
Sunny
29053a10eb * UINumPadTextBox: 下拉框可选放大倍数为2 2024-06-11 21:29:52 +08:00
Sunny
997594d3b3 * UIDatetimePicker: 下拉框可选放大倍数为2 2024-06-09 17:49:32 +08:00
Sunny
e6ed627a2a * UIDatePicker: 下拉框可选放大倍数为2 2024-06-09 17:30:22 +08:00
Sunny
eb7b0ca1b0 * UIDatePicker: 下拉框可选放大倍数为2 2024-06-09 17:24:08 +08:00
Sunny
308b3d54f3 * UIDatePicker: 下拉框可选放大倍数为2 2024-06-09 15:34:43 +08:00
Sunny
01750e69c7 * UIForm: 防止图标转换错误
* UIForm2: 防止图标转换错误
2024-06-08 23:20:46 +08:00
Sunny
6eb724e4b6 * UIBarChart: 修复X轴文字带角度显示时居中 2024-06-08 23:02:03 +08:00
Sunny
2b356290e6 * UIMessageForm2: 统一配色 2024-06-08 22:36:04 +08:00
Sunny
945f6911ad * UINotifier: 调整窗体及字体大小 2024-06-03 22:09:11 +08:00
Sunny
0aafb6e897 * UINotifier: 调整窗体及字体大小 2024-06-03 22:04:06 +08:00
Sunny
660cf54146 * UIDataGridViewFooter: 增加绑定列的ColumnName或者DataPropertyName都可以显示 2024-06-01 22:28:25 +08:00
Sunny
7c578496fc * UISplitContainer: 增加了SplitPanelState只读属性以获取状态。 2024-05-31 22:44:41 +08:00
Sunny
137258ce46 * UIInputForm: 修复调用时自定义主题参数不起作用的问题 2024-05-30 17:01:09 +08:00
Sunny
c4ce201513 * UIFormHelper: 修复弹窗标题显示错误 2024-05-30 16:36:48 +08:00
Sunny
0b74e6c548 * UIMiniPagination: 优化按钮自定义配色逻辑 2024-05-29 22:08:58 +08:00
Sunny
d19339cf1f * UIPagination: 优化按钮自定义配色逻辑 2024-05-29 21:57:32 +08:00
Sunny
0b32415224 * UIComboDataGridViewItem: 增加可过滤未显示列
* UIComboDataGridViewItem: FilterColumnName增加“;”分隔,支持多列过滤
2024-05-28 22:26:18 +08:00
Sunny
4a11746138 * UITreeView: 防止控件闪烁 2024-05-27 21:07:35 +08:00
Sunny
99ab567b2e * UINavMenu: 防止控件闪烁 2024-05-17 23:50:56 +08:00
Sunny
35ef10547f 调整图标位置 2024-05-16 22:43:52 +08:00
Sunny
46c6bec21d * UIForm: Resizable替代ShowDragStretch,显示边框可拖拽调整窗体大小
* UIForm2: Resizable替代ShowDragStretch,显示边框可拖拽调整窗体大小
2024-05-16 22:32:48 +08:00
Sunny
784e2904ec + UIMessageForm2: 新增了一种风格的消息提示框 2024-05-16 16:03:00 +08:00
Sunny
1c0d65d816 * UIProcessBar: 调整最小宽度,以适应垂直方向显示 2024-05-09 14:21:38 +08:00
Sunny
6b047520f4 * UIFormHelper: 默认弹窗的ShowMask都设置为false 2024-05-08 14:33:43 +08:00
Sunny
1277bad3f5 * UIDoughnutChart: 修复数据全为0时报错 2024-05-07 14:16:55 +08:00
Sunny
06309a546f 2024 2024-05-02 23:37:18 +08:00
Sunny
b0c391f7ce
update Updates.md.
Signed-off-by: Sunny <yhuse@163.com>
2024-05-02 15:19:56 +00:00
Sunny
734285bb73 V3.6.6 2024-05-02 23:04:38 +08:00
Sunny
4c0ebe10fb 重构部分代码 2024-05-02 21:26:00 +08:00
Sunny
e33f97b192 * 重构文件扩展类 2024-04-30 16:40:19 +08:00
Sunny
5715d13fac * 重构目录扩展类 2024-04-30 16:14:55 +08:00
Sunny
216beb4c59 * 修改内置部分窗体不显示Icon 2024-04-29 17:30:33 +08:00
Sunny
87e2f61218 * UIHorScrollBar: 修改Bug 2024-04-29 17:06:36 +08:00
Sunny
1b62abbff1 * UIBaseForm:增加UIBaseForm
* UIForm: 重构
* UIForm2: 重构
* UIBaseForm: 删除ShowTitleIcon,默认使用ShowIcon
2024-04-29 17:00:25 +08:00
Sunny
603bc69f32 * UIFlowLayoutPanel: 增加Render方法,尝试解决点击状态栏恢复窗体后右侧滚动条未消失的问题 2024-04-28 14:31:28 +08:00
Sunny
960d3665de * UIForm: 增加WindowStateChanged事件
* UIForm2: 增加WindowStateChanged事件
* UIPage: 增加WindowStateChanged事件
2024-04-28 14:29:46 +08:00
Sunny
ca1ab0cfd3 * UIFormHelper: 信息提示窗体跟随程序所在的屏幕 2024-04-28 10:12:33 +08:00
Sunny
8bdaac1ea8 * UIFormHelper: 提示框增加延时关闭 2024-04-27 17:27:09 +08:00
Sunny
aac4fb6382 * UIFormHelper: 重构,所有弹窗调整为窗体的扩展方法,使用时加上this.
* UIFormHelper: 输入弹窗前增加Show前缀
2024-04-22 23:04:28 +08:00
Sunny
9cef9a6608 删除一个函数 2024-04-16 23:11:02 +08:00
Sunny
877aec6ee2 * ShowProcessForm: 增加是否显示窗体边框 2024-04-16 22:39:36 +08:00
Sunny
eb3823582d * UITextBox: 加了一个判断 2024-04-16 22:24:18 +08:00
Sunny
b7fc97c918 * UIForm2: 设置默认Padding.Top为TitleHeight 2024-04-16 14:46:28 +08:00
Sunny
0f9c6c0c62 * UINavMenu: 修复通过代码设置背景色无效的问题 2024-04-13 17:54:00 +08:00
Sunny
d21e26da0c * UIMessageTip: 显示位置修复 2024-03-26 23:31:26 +08:00
Sunny
a5df9a778c * UIGroupBox: 修复Enabled为false时标题行框线绘制颜色 2024-03-22 11:15:51 +08:00
Sunny
44300efb06 Merge branch 'master' of https://gitee.com/yhuse/SunnyUI 2024-03-22 09:47:45 +08:00
Sunny
71bee928b5 * UIComboDataGridView: 增加ShowDropDown()
* UIComboTreeView: 增加ShowDropDown()
2024-03-22 09:47:34 +08:00
Sunny
7460eb6029
update README.md.
Signed-off-by: Sunny <yhuse@163.com>
2024-03-21 06:49:01 +00:00
Sunny
c48ceacc27
update Updates.md.
Signed-off-by: Sunny <yhuse@163.com>
2024-02-28 12:44:18 +00:00
Sunny
f9a9436309
update Updates.md.
Signed-off-by: Sunny <yhuse@163.com>
2024-02-28 12:43:55 +00:00
Sunny
dbb94e7044 更新Demo 2024-02-28 20:35:57 +08:00
Sunny
687d698621 V3.6.5 2024-02-28 20:25:17 +08:00
Sunny
ff40c3b39d * UIniConfig: 增加按属性名称进行读写 2024-02-27 22:45:01 +08:00
Sunny
00c7147491 * UIButton: 增加Text的属性编辑器 2024-02-23 23:18:34 +08:00
Sunny
547ec9de80 * UIWaitingBar: 修改可自定义配色 2024-02-23 22:32:43 +08:00
Sunny
7ff8e13363 * UIButton: 增加按钮的&字符的Alt快捷键功能 2024-02-22 23:09:26 +08:00
Sunny
d118038ecf * UIForm: 最大化时,鼠标拖拽标题超过一定范围后再恢复Normal显示 2024-02-22 21:56:39 +08:00
Sunny
035c2e6ebd * UIContextMenuStrip: 节点AutoSize时不重绘,重绘时考虑Enabled为False时颜色显示 2024-02-22 21:41:52 +08:00
Sunny
01a83fe4ff * UIContextMenuStrip: 修复显示快捷键文本位置 2024-02-21 21:50:08 +08:00
Sunny
3eb957279f * UISymbolPanel: 设置默认尺寸 2024-02-20 21:42:57 +08:00
Sunny
df86542c41 * UIForm: 调整显示位置 2024-02-19 22:18:06 +08:00
Sunny
2c3d77f12a * UIForm2: 限制双击 2024-02-19 22:01:28 +08:00
Sunny
5b16bae03f * UIForm2: 增加主题风格设置 2024-02-19 21:31:14 +08:00
Sunny
79cb09618b * UIForm: 修改标题栏文字与控制按钮绘制重叠的问题 2024-02-19 17:42:10 +08:00
Sunny
b78aed01f7 * UINavMenu: 尝试减少刷新闪烁 2024-02-19 17:18:39 +08:00
Sunny
9eaf41849f * UIPagination: 优化按钮配色逻辑 2024-02-19 15:46:40 +08:00
Sunny
63c5788254 * UIComboBox: 修复在窗体构造函数设置SelectedIndex报错
* UIDropControl: 修改按钮大小调整时,清除按钮的位置
2024-01-27 20:42:35 +08:00
Sunny
882dbb3f40 * UIForm2: 更新 2024-01-25 22:43:00 +08:00
Sunny
feb8182a25 + UIForm2: 新增一种窗体基类,更接近于原生Form使用习惯 2024-01-24 22:55:47 +08:00
Sunny
1dd949dcc5 * UIDigitalLabel: 更新绘制 2024-01-23 14:17:59 +08:00
Sunny
ed559a1a21 * UIHeaderButton: 增加分组编号 2024-01-21 11:24:25 +08:00
Sunny
9620fb3e82 更新 2024-01-20 15:04:59 +08:00
Sunny
326f0fb8f6 * UITreeView: 自定义行颜色,可通过代码给颜色值,SetNodePainter,增加选中颜色 2024-01-20 11:59:18 +08:00
Sunny
8286051404 * UIDropControl: 下拉按钮可修改大小及位置 2024-01-19 22:19:42 +08:00
Sunny
983f032d3f * UIFlowLayoutPanel: 重写ScrollControlIntoView函数 2024-01-17 17:31:42 +08:00
Sunny
61ea69f2ff * UITextBox: 调整Radius时,自动调整文本框的位置 2024-01-13 11:35:46 +08:00
Sunny
989645ec97 * UICombobox: 修复一个设置Text,SelectedValue不变的问题 2024-01-05 21:59:03 +08:00
Sunny
2f5b07c87b * IniConfig: 增加文件编码 2024-01-05 21:05:04 +08:00
Sunny
00c6424e58 * UIniConfig: 修改保存文件的方式 2024-01-03 15:02:30 +08:00
Sunny
86a7358c7f
update Updates.md.
Signed-off-by: Sunny <yhuse@163.com>
2024-01-01 13:42:14 +00:00
Sunny
25fdc3c0e3 V3.6.3 2024-01-01 21:41:40 +08:00
Sunny
55115811bf * UITreeView: 增加可修改滚动条颜色 2024-01-01 21:08:02 +08:00
Sunny
9a3c8de7a9 * UIIntegerUpDown: 修复设置Style时按钮颜色不一致
* UIDoubleUpDown: 修复设置Style时按钮颜色不一致
2023-12-28 21:47:21 +08:00
Sunny
90fcb70cb0 * UIComboBox: 增加下拉界面的滚动条设置 2023-12-26 21:27:04 +08:00
Sunny
b5bbc3e5d9 * UIRichTextBox: 增加Text的属性编辑器
* UITextBox: 增加Text的属性编辑器
2023-12-25 20:40:29 +08:00
Sunny
7180c87291 * UIPage: 调整AfterShow事件位置及逻辑 2023-12-20 11:25:47 +08:00
Sunny
13ea135f89 * UITextBox: 修改显示按钮时Tips小红点的位置 2023-12-18 23:24:22 +08:00
Sunny
0019e7784d * UITextBox: 修复高度不随字体改变
* UIDropControl: 修复高度不随字体改变
2023-12-18 23:15:15 +08:00
Sunny
4cfdc8c795 * UIForm: RemovePage时调用Final() 2023-12-14 23:17:51 +08:00
Sunny
9dd5b99cf0 * UIForm: 优化UIPage的Init和Final加载逻辑
* UITabControl: 优化UIPage的Init和Final加载逻辑
2023-12-13 23:08:47 +08:00
Sunny
8fdf05c475 * 修改分页Demo 2023-12-12 21:30:55 +08:00
Sunny
9df4a65380 * ShowStatusForm: 增加可设置进度值 2023-12-11 21:32:05 +08:00
Sunny
0a05dd4312 + Demo增加字体图标界面 2023-12-08 20:45:53 +08:00
Sunny
441d9dac8b * 删除不要的注释 2023-12-06 21:00:01 +08:00
Sunny
52e3a3cb04 * UIButton: 修复LightStyle的背景颜色 2023-12-06 20:56:40 +08:00
Sunny
26a98fa4a6
update Updates.md.
Signed-off-by: Sunny <yhuse@163.com>
2023-12-04 14:42:44 +00:00
490 changed files with 25694 additions and 13356 deletions

11
.gitignore vendored
View File

@ -25,6 +25,7 @@ x86/
bld/
[Oo]bj/
[Ll]og/
[Bb]in/
# Visual Studio 2015/2017 cache/options directory
.vs/
@ -346,3 +347,13 @@ healthchecksdb
/Bin/net40
/Bin/net7.0-windows
/Bin/net8.0-windows
/SunnyUI.Demo/Bin/SunnyUI.Common.dll
/SunnyUI.Demo/Bin/SunnyUI.Demo.exe
/SunnyUI.Demo/Bin/SunnyUI.Demo.exe.config
/SunnyUI.Demo/Bin/SunnyUI.dll
/docs/.vitepress/cache/deps
/run.bat
/package.json
/package-lock.json
/docs/markdown-examples.md
/docs/api-examples.md

View File

@ -2,13 +2,15 @@
[![star](https://gitee.com/yhuse/SunnyUI/badge/star.svg?theme=gvp)](https://gitee.com/yhuse/SunnyUI/stargazers)
[![fork](https://gitee.com/yhuse/SunnyUI/badge/fork.svg?theme=gvp)](https://gitee.com/yhuse/SunnyUI/members)
- 帮助文档: https://gitee.com/yhuse/SunnyUI/wikis/pages
- Gitee: https://gitee.com/yhuse/SunnyUI
- GitHub: https://github.com/yhuse/SunnyUI
- Nuget: https://www.nuget.org/packages/SunnyUI/
- Blog: https://www.cnblogs.com/yhuse
- 帮助文档: [https://gitee.com/yhuse/SunnyUI/wikis/pages](https://gitee.com/yhuse/SunnyUI/wikis/pages)
- 更新日志: [https://gitee.com/yhuse/SunnyUI/wikis/更新日志](https://gitee.com/yhuse/SunnyUI/wikis/%E6%9B%B4%E6%96%B0%E6%97%A5%E5%BF%97)
- Gitee: [https://gitee.com/yhuse/SunnyUI](https://gitee.com/yhuse/SunnyUI)
- GitHub: [https://github.com/yhuse/SunnyUI](https://github.com/yhuse/SunnyUI)
- Nuget: [https://www.nuget.org/packages/SunnyUI/](https://www.nuget.org/packages/SunnyUI/)
- Blog: [https://www.cnblogs.com/yhuse](https://www.cnblogs.com/yhuse)
- 因为评论没有查找不利于解决问题故关闭项目评论功能。如果是问题或者建议请按照Issues模版添加Issue。
- 添加Issue: [https://gitee.com/yhuse/SunnyUI/issues/new](https://gitee.com/yhuse/SunnyUI/issues/new)
- V3.6.8+Demo编译可执行文件: [https://gitee.com/yhuse/SunnyUI.Demo](https://gitee.com/yhuse/SunnyUI.Demo)
欢迎交流QQ群 56829229 (SunnyUI技术交流群)请给源码项目点个Star吧
**个人学习交流免费,商业应用需要授权**联系QQ**17612584** 咨询授权事宜。
@ -21,10 +23,11 @@ SunnyUI.Net项目已加入[dotNET China](https://gitee.com/dotnetchina) 组织
![dotnetchina](https://images.gitee.com/uploads/images/2021/0324/120117_2da9922c_416720.png "132645_21007ea0_974299.png")
#### 软件介绍
- SunnyUI.Net 是基于.Net Framework 4.0+、.Net6、.Net7 框架的 C# WinForm 开源控件库、工具类库、扩展类库、多页面开发框架。
- SunnyUI.NET 是基于.Net Framework4.0+、.Net8、.Net9 框架的 C# WinForm 开源控件库、工具类库、扩展类库、多页面开发框架。
- 源码编译环境:
1. **VS2022 17.4**,安装.NetFramework4.0目标包的方法见https://www.cnblogs.com/yhuse/p/15536393.html
- 动态库应用环境: **VS2010**及以上均可,支持.Net Framework 4.0+、.Net 6、.Net7
1. **VS2022**,安装.NetFramework4.0目标包的方法见https://www.cnblogs.com/yhuse/p/15536393.html
2. 编译源码,.Net8需要VS2022 17.12+版本或者修改SunnyUI.csproj文件的TargetFrameworks属性以适应VS环境
- 动态库应用环境: **VS2010**及以上均可,支持.Net Framework4.0+、.Net8、.Net9
1. 推荐通过Nuget安装Install-Package SunnyUI或者通过Nuget搜索SunnyUI安装。
2. 不支持(.Net Framework 4 **Client Profile**)。

4
SunnyUI.Demo.exe.md Normal file
View File

@ -0,0 +1,4 @@
V3.6.8
此版本开始SunnyUI.Demo的生成的可执行文件不包含在SunnyUI项目中
如需要查看,请移步:[SunnyUI.Demo.exe](https://gitee.com/yhuse/SunnyUI.Demo)
或者用[VS2022 v17.8](https://learn.microsoft.com/en-us/visualstudio/releases/2022/release-notes-v17.8)版本编译源码,此版本开始支持.net8

Binary file not shown.

Binary file not shown.

View File

@ -1,3 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2"/></startup></configuration>

Binary file not shown.

View File

@ -18,6 +18,13 @@ namespace Sunny.UI.Demo
DateTime dt = new DateTime(2020, 10, 4);
UILineOption option = new UILineOption();
//设置图表边框空白部分尺寸
option.Grid.Left = 60;
option.Grid.Right = 60;
option.Grid.Top = 60;
option.Grid.Bottom = 60;
option.ToolTip.Visible = true;
option.Title = new UITitle();
option.Title.Text = "SunnyUI";
@ -40,6 +47,7 @@ namespace Sunny.UI.Demo
//数据点显示小数位数
series.YAxisDecimalPlaces = 2;
//增加曲线时可以设置曲线颜色例如Color.Lime
series = option.AddSeries(new UILineSeries("Line2", Color.Lime));
series.Add(dt.AddHours(3), 3.3);
series.Add(dt.AddHours(4), 2.3);
@ -116,6 +124,9 @@ namespace Sunny.UI.Demo
//设置曲线显示最大点数,超过后自动清理
series.SetMaxCount(50);
//设置曲线平滑
series.Smooth = true;
//坐标轴显示小数位数
option.XAxis.AxisLabel.DecimalPlaces = 1;
option.YAxis.AxisLabel.DecimalPlaces = 1;

View File

@ -196,7 +196,7 @@ namespace Sunny.UI.Demo
this.uiAvatar2.AvatarSize = 55;
this.uiAvatar2.Font = new System.Drawing.Font("宋体", 12F);
this.uiAvatar2.Icon = Sunny.UI.UIAvatar.UIIcon.Image;
this.uiAvatar2.Image = global::Sunny.UI.Demo.Properties.Resources.SunnyUISmall;
this.uiAvatar2.Image = global::Sunny.UI.Demo.Properties.Resources.SunnyUI72;
this.uiAvatar2.Location = new System.Drawing.Point(30, 85);
this.uiAvatar2.MinimumSize = new System.Drawing.Size(1, 1);
this.uiAvatar2.Name = "uiAvatar2";

View File

@ -84,10 +84,17 @@ namespace Sunny.UI.Demo
this.uiToolTip1 = new Sunny.UI.UIToolTip(this.components);
this.uiSwitch5 = new Sunny.UI.UISwitch();
this.uiSwitch6 = new Sunny.UI.UISwitch();
this.uiMenuButton1 = new Sunny.UI.UIMenuButton();
this.uiLine6 = new Sunny.UI.UILine();
this.uiContextMenuStrip1 = new Sunny.UI.UIContextMenuStrip();
this.ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
((System.ComponentModel.ISupportInitialize)(this.uiImageButton4)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.uiImageButton3)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.uiImageButton2)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.uiImageButton1)).BeginInit();
this.uiContextMenuStrip1.SuspendLayout();
this.SuspendLayout();
//
// uiSwitch3
@ -277,7 +284,7 @@ namespace Sunny.UI.Demo
this.uiSymbolButton24.RectSides = ((System.Windows.Forms.ToolStripStatusLabelBorderSides)(((System.Windows.Forms.ToolStripStatusLabelBorderSides.Top | System.Windows.Forms.ToolStripStatusLabelBorderSides.Right)
| System.Windows.Forms.ToolStripStatusLabelBorderSides.Bottom)));
this.uiSymbolButton24.Size = new System.Drawing.Size(46, 35);
this.uiSymbolButton24.Symbol = 61473;
this.uiSymbolButton24.Symbol = 361473;
this.uiSymbolButton24.TabIndex = 103;
this.uiSymbolButton24.TipsFont = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
//
@ -290,7 +297,7 @@ namespace Sunny.UI.Demo
this.uiSymbolButton23.Name = "uiSymbolButton23";
this.uiSymbolButton23.RadiusSides = Sunny.UI.UICornerRadiusSides.None;
this.uiSymbolButton23.Size = new System.Drawing.Size(46, 35);
this.uiSymbolButton23.Symbol = 61544;
this.uiSymbolButton23.Symbol = 361544;
this.uiSymbolButton23.TabIndex = 102;
this.uiSymbolButton23.TipsFont = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
//
@ -303,7 +310,7 @@ namespace Sunny.UI.Demo
this.uiSymbolButton22.Name = "uiSymbolButton22";
this.uiSymbolButton22.RadiusSides = Sunny.UI.UICornerRadiusSides.None;
this.uiSymbolButton22.Size = new System.Drawing.Size(46, 35);
this.uiSymbolButton22.Symbol = 61508;
this.uiSymbolButton22.Symbol = 361508;
this.uiSymbolButton22.TabIndex = 101;
this.uiSymbolButton22.TipsFont = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
//
@ -316,7 +323,7 @@ namespace Sunny.UI.Demo
this.uiSymbolButton19.Name = "uiSymbolButton19";
this.uiSymbolButton19.RadiusSides = ((Sunny.UI.UICornerRadiusSides)((Sunny.UI.UICornerRadiusSides.LeftTop | Sunny.UI.UICornerRadiusSides.LeftBottom)));
this.uiSymbolButton19.Size = new System.Drawing.Size(46, 35);
this.uiSymbolButton19.Symbol = 61543;
this.uiSymbolButton19.Symbol = 361543;
this.uiSymbolButton19.TabIndex = 100;
this.uiSymbolButton19.TipsFont = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
//
@ -329,7 +336,7 @@ namespace Sunny.UI.Demo
this.uiSymbolButton20.Name = "uiSymbolButton20";
this.uiSymbolButton20.RadiusSides = ((Sunny.UI.UICornerRadiusSides)((Sunny.UI.UICornerRadiusSides.RightTop | Sunny.UI.UICornerRadiusSides.RightBottom)));
this.uiSymbolButton20.Size = new System.Drawing.Size(46, 35);
this.uiSymbolButton20.Symbol = 61522;
this.uiSymbolButton20.Symbol = 361522;
this.uiSymbolButton20.TabIndex = 99;
this.uiSymbolButton20.TipsFont = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
//
@ -342,7 +349,7 @@ namespace Sunny.UI.Demo
this.uiSymbolButton21.Name = "uiSymbolButton21";
this.uiSymbolButton21.RadiusSides = Sunny.UI.UICornerRadiusSides.None;
this.uiSymbolButton21.Size = new System.Drawing.Size(46, 35);
this.uiSymbolButton21.Symbol = 61520;
this.uiSymbolButton21.Symbol = 361520;
this.uiSymbolButton21.TabIndex = 98;
this.uiSymbolButton21.TipsFont = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
//
@ -355,7 +362,7 @@ namespace Sunny.UI.Demo
this.uiSymbolButton13.Name = "uiSymbolButton13";
this.uiSymbolButton13.RadiusSides = Sunny.UI.UICornerRadiusSides.None;
this.uiSymbolButton13.Size = new System.Drawing.Size(46, 35);
this.uiSymbolButton13.Symbol = 61518;
this.uiSymbolButton13.Symbol = 361518;
this.uiSymbolButton13.TabIndex = 97;
this.uiSymbolButton13.TipsFont = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
//
@ -368,7 +375,7 @@ namespace Sunny.UI.Demo
this.uiSymbolButton14.Name = "uiSymbolButton14";
this.uiSymbolButton14.RadiusSides = Sunny.UI.UICornerRadiusSides.None;
this.uiSymbolButton14.Size = new System.Drawing.Size(46, 35);
this.uiSymbolButton14.Symbol = 61514;
this.uiSymbolButton14.Symbol = 361514;
this.uiSymbolButton14.TabIndex = 96;
this.uiSymbolButton14.TipsFont = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
//
@ -381,7 +388,7 @@ namespace Sunny.UI.Demo
this.uiSymbolButton15.Name = "uiSymbolButton15";
this.uiSymbolButton15.RadiusSides = Sunny.UI.UICornerRadiusSides.None;
this.uiSymbolButton15.Size = new System.Drawing.Size(46, 35);
this.uiSymbolButton15.Symbol = 61513;
this.uiSymbolButton15.Symbol = 361513;
this.uiSymbolButton15.TabIndex = 95;
this.uiSymbolButton15.TipsFont = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
//
@ -394,7 +401,7 @@ namespace Sunny.UI.Demo
this.uiSymbolButton16.Name = "uiSymbolButton16";
this.uiSymbolButton16.RadiusSides = Sunny.UI.UICornerRadiusSides.None;
this.uiSymbolButton16.Size = new System.Drawing.Size(46, 35);
this.uiSymbolButton16.Symbol = 61517;
this.uiSymbolButton16.Symbol = 361517;
this.uiSymbolButton16.TabIndex = 94;
this.uiSymbolButton16.TipsFont = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
//
@ -407,7 +414,7 @@ namespace Sunny.UI.Demo
this.uiSymbolButton17.Name = "uiSymbolButton17";
this.uiSymbolButton17.RadiusSides = Sunny.UI.UICornerRadiusSides.None;
this.uiSymbolButton17.Size = new System.Drawing.Size(46, 35);
this.uiSymbolButton17.Symbol = 61516;
this.uiSymbolButton17.Symbol = 361516;
this.uiSymbolButton17.TabIndex = 93;
this.uiSymbolButton17.TipsFont = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
//
@ -420,7 +427,7 @@ namespace Sunny.UI.Demo
this.uiSymbolButton18.Name = "uiSymbolButton18";
this.uiSymbolButton18.RadiusSides = ((Sunny.UI.UICornerRadiusSides)((Sunny.UI.UICornerRadiusSides.LeftTop | Sunny.UI.UICornerRadiusSides.LeftBottom)));
this.uiSymbolButton18.Size = new System.Drawing.Size(46, 35);
this.uiSymbolButton18.Symbol = 61515;
this.uiSymbolButton18.Symbol = 361515;
this.uiSymbolButton18.TabIndex = 92;
this.uiSymbolButton18.TipsFont = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
//
@ -586,7 +593,7 @@ namespace Sunny.UI.Demo
this.uiSymbolButton6.Size = new System.Drawing.Size(100, 35);
this.uiSymbolButton6.Style = Sunny.UI.UIStyle.Custom;
this.uiSymbolButton6.StyleCustomMode = true;
this.uiSymbolButton6.Symbol = 61532;
this.uiSymbolButton6.Symbol = 361532;
this.uiSymbolButton6.TabIndex = 84;
this.uiSymbolButton6.Text = "Error";
this.uiSymbolButton6.TipsFont = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
@ -610,7 +617,7 @@ namespace Sunny.UI.Demo
this.uiSymbolButton5.Size = new System.Drawing.Size(100, 35);
this.uiSymbolButton5.Style = Sunny.UI.UIStyle.Custom;
this.uiSymbolButton5.StyleCustomMode = true;
this.uiSymbolButton5.Symbol = 61553;
this.uiSymbolButton5.Symbol = 361553;
this.uiSymbolButton5.TabIndex = 83;
this.uiSymbolButton5.Text = "Warn";
this.uiSymbolButton5.TipsFont = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
@ -634,7 +641,7 @@ namespace Sunny.UI.Demo
this.uiSymbolButton3.Size = new System.Drawing.Size(100, 35);
this.uiSymbolButton3.Style = Sunny.UI.UIStyle.Custom;
this.uiSymbolButton3.StyleCustomMode = true;
this.uiSymbolButton3.Symbol = 61530;
this.uiSymbolButton3.Symbol = 361530;
this.uiSymbolButton3.TabIndex = 82;
this.uiSymbolButton3.Text = "Success";
this.uiSymbolButton3.TipsFont = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
@ -649,7 +656,7 @@ namespace Sunny.UI.Demo
this.uiSymbolButton4.Size = new System.Drawing.Size(100, 35);
this.uiSymbolButton4.Style = Sunny.UI.UIStyle.Custom;
this.uiSymbolButton4.StyleCustomMode = true;
this.uiSymbolButton4.Symbol = 61529;
this.uiSymbolButton4.Symbol = 361529;
this.uiSymbolButton4.TabIndex = 81;
this.uiSymbolButton4.Text = "Query";
this.uiSymbolButton4.TipsFont = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
@ -673,7 +680,7 @@ namespace Sunny.UI.Demo
this.uiSymbolButton2.Size = new System.Drawing.Size(100, 35);
this.uiSymbolButton2.Style = Sunny.UI.UIStyle.Custom;
this.uiSymbolButton2.StyleCustomMode = true;
this.uiSymbolButton2.Symbol = 61453;
this.uiSymbolButton2.Symbol = 361453;
this.uiSymbolButton2.TabIndex = 80;
this.uiSymbolButton2.Text = "Cancel";
this.uiSymbolButton2.TipsFont = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
@ -1004,11 +1011,69 @@ namespace Sunny.UI.Demo
this.uiSwitch6.TabIndex = 117;
this.uiSwitch6.Text = "uiSwitch6";
//
// uiMenuButton1
//
this.uiMenuButton1.Cursor = System.Windows.Forms.Cursors.Hand;
this.uiMenuButton1.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.uiMenuButton1.Location = new System.Drawing.Point(30, 554);
this.uiMenuButton1.Menu = this.uiContextMenuStrip1;
this.uiMenuButton1.MinimumSize = new System.Drawing.Size(1, 1);
this.uiMenuButton1.Name = "uiMenuButton1";
this.uiMenuButton1.Size = new System.Drawing.Size(180, 35);
this.uiMenuButton1.Symbol = 361642;
this.uiMenuButton1.TabIndex = 118;
this.uiMenuButton1.Text = "下拉菜单按钮";
this.uiMenuButton1.TipsFont = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
//
// uiLine6
//
this.uiLine6.BackColor = System.Drawing.Color.Transparent;
this.uiLine6.Font = new System.Drawing.Font("宋体", 12F);
this.uiLine6.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(48)))));
this.uiLine6.Location = new System.Drawing.Point(30, 516);
this.uiLine6.MinimumSize = new System.Drawing.Size(16, 16);
this.uiLine6.Name = "uiLine6";
this.uiLine6.Size = new System.Drawing.Size(312, 20);
this.uiLine6.TabIndex = 119;
this.uiLine6.Text = "UIMenuButton";
this.uiLine6.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// uiContextMenuStrip1
//
this.uiContextMenuStrip1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(243)))), ((int)(((byte)(249)))), ((int)(((byte)(255)))));
this.uiContextMenuStrip1.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.uiContextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.ToolStripMenuItem,
this.ToolStripMenuItem,
this.ToolStripMenuItem});
this.uiContextMenuStrip1.Name = "uiContextMenuStrip1";
this.uiContextMenuStrip1.Size = new System.Drawing.Size(123, 70);
//
// 菜单一ToolStripMenuItem
//
this.ToolStripMenuItem.Name = "菜单一ToolStripMenuItem";
this.ToolStripMenuItem.Size = new System.Drawing.Size(122, 22);
this.ToolStripMenuItem.Text = "菜单一";
//
// 菜单二ToolStripMenuItem
//
this.ToolStripMenuItem.Name = "菜单二ToolStripMenuItem";
this.ToolStripMenuItem.Size = new System.Drawing.Size(122, 22);
this.ToolStripMenuItem.Text = "菜单二";
//
// 菜单三ToolStripMenuItem
//
this.ToolStripMenuItem.Name = "菜单三ToolStripMenuItem";
this.ToolStripMenuItem.Size = new System.Drawing.Size(122, 22);
this.ToolStripMenuItem.Text = "菜单三";
//
// FButton
//
this.AllowShowTitle = true;
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
this.ClientSize = new System.Drawing.Size(800, 614);
this.Controls.Add(this.uiLine6);
this.Controls.Add(this.uiMenuButton1);
this.Controls.Add(this.uiSymbolButton24);
this.Controls.Add(this.uiSwitch6);
this.Controls.Add(this.uiSwitch5);
@ -1072,6 +1137,7 @@ namespace Sunny.UI.Demo
((System.ComponentModel.ISupportInitialize)(this.uiImageButton3)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.uiImageButton2)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.uiImageButton1)).EndInit();
this.uiContextMenuStrip1.ResumeLayout(false);
this.ResumeLayout(false);
}
@ -1132,5 +1198,11 @@ namespace Sunny.UI.Demo
private UIToolTip uiToolTip1;
private UISwitch uiSwitch5;
private UISwitch uiSwitch6;
private UIMenuButton uiMenuButton1;
private UILine uiLine6;
private UIContextMenuStrip uiContextMenuStrip1;
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem;
}
}

View File

@ -74,7 +74,7 @@ namespace Sunny.UI.Demo
private void uiSwitch1_ActiveChanging(object sender, System.ComponentModel.CancelEventArgs e)
{
e.Cancel = !ShowAskDialog("您确认要改变当前开关的状态吗?");
e.Cancel = !this.ShowAskDialog("您确认要改变当前开关的状态吗?");
}
}
}

View File

@ -120,4 +120,7 @@
<metadata name="uiToolTip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="uiContextMenuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>133, 17</value>
</metadata>
</root>

View File

@ -30,54 +30,54 @@ namespace Sunny.UI.Demo
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.Windows.Forms.TreeNode treeNode1 = new System.Windows.Forms.TreeNode("节点0");
System.Windows.Forms.TreeNode treeNode2 = new System.Windows.Forms.TreeNode("节点1");
System.Windows.Forms.TreeNode treeNode3 = new System.Windows.Forms.TreeNode("节点2");
System.Windows.Forms.TreeNode treeNode4 = new System.Windows.Forms.TreeNode("节点3");
System.Windows.Forms.TreeNode treeNode5 = new System.Windows.Forms.TreeNode("节点0", new System.Windows.Forms.TreeNode[] {
treeNode1,
treeNode2,
treeNode3,
treeNode4});
System.Windows.Forms.TreeNode treeNode6 = new System.Windows.Forms.TreeNode("节点4");
System.Windows.Forms.TreeNode treeNode7 = new System.Windows.Forms.TreeNode("节点5");
System.Windows.Forms.TreeNode treeNode8 = new System.Windows.Forms.TreeNode("节点6");
System.Windows.Forms.TreeNode treeNode9 = new System.Windows.Forms.TreeNode("节点7");
System.Windows.Forms.TreeNode treeNode10 = new System.Windows.Forms.TreeNode("节点1", new System.Windows.Forms.TreeNode[] {
treeNode6,
treeNode7,
treeNode8,
treeNode9});
System.Windows.Forms.TreeNode treeNode11 = new System.Windows.Forms.TreeNode("节点2");
System.Windows.Forms.TreeNode treeNode12 = new System.Windows.Forms.TreeNode("节点3");
System.Windows.Forms.TreeNode treeNode13 = new System.Windows.Forms.TreeNode("节点00");
System.Windows.Forms.TreeNode treeNode14 = new System.Windows.Forms.TreeNode("节点01");
System.Windows.Forms.TreeNode treeNode15 = new System.Windows.Forms.TreeNode("节点02");
System.Windows.Forms.TreeNode treeNode16 = new System.Windows.Forms.TreeNode("节点03");
System.Windows.Forms.TreeNode treeNode17 = new System.Windows.Forms.TreeNode("节点0", new System.Windows.Forms.TreeNode[] {
treeNode13,
treeNode14,
treeNode15,
treeNode16});
System.Windows.Forms.TreeNode treeNode18 = new System.Windows.Forms.TreeNode("节点11");
System.Windows.Forms.TreeNode treeNode19 = new System.Windows.Forms.TreeNode("节点12");
System.Windows.Forms.TreeNode treeNode20 = new System.Windows.Forms.TreeNode("节点13");
System.Windows.Forms.TreeNode treeNode21 = new System.Windows.Forms.TreeNode("节点14");
System.Windows.Forms.TreeNode treeNode22 = new System.Windows.Forms.TreeNode("节点1", new System.Windows.Forms.TreeNode[] {
treeNode18,
treeNode19,
treeNode20,
treeNode21});
System.Windows.Forms.TreeNode treeNode23 = new System.Windows.Forms.TreeNode("节点2");
System.Windows.Forms.TreeNode treeNode24 = new System.Windows.Forms.TreeNode("节点3");
System.Windows.Forms.TreeNode treeNode25 = new System.Windows.Forms.TreeNode("节点0");
System.Windows.Forms.TreeNode treeNode26 = new System.Windows.Forms.TreeNode("节点1");
System.Windows.Forms.TreeNode treeNode27 = new System.Windows.Forms.TreeNode("节点2");
System.Windows.Forms.TreeNode treeNode28 = new System.Windows.Forms.TreeNode("节点3");
System.Windows.Forms.TreeNode treeNode29 = new System.Windows.Forms.TreeNode("节点0");
System.Windows.Forms.TreeNode treeNode30 = new System.Windows.Forms.TreeNode("节点1");
System.Windows.Forms.TreeNode treeNode31 = new System.Windows.Forms.TreeNode("节点2");
System.Windows.Forms.TreeNode treeNode32 = new System.Windows.Forms.TreeNode("节点3");
System.Windows.Forms.TreeNode treeNode33 = new System.Windows.Forms.TreeNode("节点0");
System.Windows.Forms.TreeNode treeNode34 = new System.Windows.Forms.TreeNode("节点1");
System.Windows.Forms.TreeNode treeNode35 = new System.Windows.Forms.TreeNode("节点2");
System.Windows.Forms.TreeNode treeNode36 = new System.Windows.Forms.TreeNode("节点3");
System.Windows.Forms.TreeNode treeNode37 = new System.Windows.Forms.TreeNode("节点0", new System.Windows.Forms.TreeNode[] {
treeNode33,
treeNode34,
treeNode35,
treeNode36});
System.Windows.Forms.TreeNode treeNode38 = new System.Windows.Forms.TreeNode("节点4");
System.Windows.Forms.TreeNode treeNode39 = new System.Windows.Forms.TreeNode("节点5");
System.Windows.Forms.TreeNode treeNode40 = new System.Windows.Forms.TreeNode("节点6");
System.Windows.Forms.TreeNode treeNode41 = new System.Windows.Forms.TreeNode("节点7");
System.Windows.Forms.TreeNode treeNode42 = new System.Windows.Forms.TreeNode("节点1", new System.Windows.Forms.TreeNode[] {
treeNode38,
treeNode39,
treeNode40,
treeNode41});
System.Windows.Forms.TreeNode treeNode43 = new System.Windows.Forms.TreeNode("节点2");
System.Windows.Forms.TreeNode treeNode44 = new System.Windows.Forms.TreeNode("节点3");
System.Windows.Forms.TreeNode treeNode45 = new System.Windows.Forms.TreeNode("节点00");
System.Windows.Forms.TreeNode treeNode46 = new System.Windows.Forms.TreeNode("节点01");
System.Windows.Forms.TreeNode treeNode47 = new System.Windows.Forms.TreeNode("节点02");
System.Windows.Forms.TreeNode treeNode48 = new System.Windows.Forms.TreeNode("节点03");
System.Windows.Forms.TreeNode treeNode49 = new System.Windows.Forms.TreeNode("节点0", new System.Windows.Forms.TreeNode[] {
treeNode45,
treeNode46,
treeNode47,
treeNode48});
System.Windows.Forms.TreeNode treeNode50 = new System.Windows.Forms.TreeNode("节点11");
System.Windows.Forms.TreeNode treeNode51 = new System.Windows.Forms.TreeNode("节点12");
System.Windows.Forms.TreeNode treeNode52 = new System.Windows.Forms.TreeNode("节点13");
System.Windows.Forms.TreeNode treeNode53 = new System.Windows.Forms.TreeNode("节点14");
System.Windows.Forms.TreeNode treeNode54 = new System.Windows.Forms.TreeNode("节点1", new System.Windows.Forms.TreeNode[] {
treeNode50,
treeNode51,
treeNode52,
treeNode53});
System.Windows.Forms.TreeNode treeNode55 = new System.Windows.Forms.TreeNode("节点2");
System.Windows.Forms.TreeNode treeNode56 = new System.Windows.Forms.TreeNode("节点3");
System.Windows.Forms.TreeNode treeNode57 = new System.Windows.Forms.TreeNode("节点0");
System.Windows.Forms.TreeNode treeNode58 = new System.Windows.Forms.TreeNode("节点1");
System.Windows.Forms.TreeNode treeNode59 = new System.Windows.Forms.TreeNode("节点2");
System.Windows.Forms.TreeNode treeNode60 = new System.Windows.Forms.TreeNode("节点3");
System.Windows.Forms.TreeNode treeNode61 = new System.Windows.Forms.TreeNode("节点0");
System.Windows.Forms.TreeNode treeNode62 = new System.Windows.Forms.TreeNode("节点1");
System.Windows.Forms.TreeNode treeNode63 = new System.Windows.Forms.TreeNode("节点2");
System.Windows.Forms.TreeNode treeNode64 = new System.Windows.Forms.TreeNode("节点3");
this.uiComboTreeView3 = new Sunny.UI.UIComboTreeView();
this.uiComboTreeView4 = new Sunny.UI.UIComboTreeView();
this.uiComboTreeView2 = new Sunny.UI.UIComboTreeView();
@ -109,6 +109,12 @@ namespace Sunny.UI.Demo
this.uiNumPadTextBox2 = new Sunny.UI.UINumPadTextBox();
this.uiNumPadTextBox3 = new Sunny.UI.UINumPadTextBox();
this.uiNumPadTextBox4 = new Sunny.UI.UINumPadTextBox();
this.uiLine11 = new Sunny.UI.UILine();
this.uiDatePicker4 = new Sunny.UI.UIDatePicker();
this.uiDatetimePicker2 = new Sunny.UI.UIDatetimePicker();
this.uiTimePicker2 = new Sunny.UI.UITimePicker();
this.uiNumPadTextBox5 = new Sunny.UI.UINumPadTextBox();
this.uiDatePicker5 = new Sunny.UI.UIDatePicker();
this.SuspendLayout();
//
// uiComboTreeView3
@ -121,38 +127,39 @@ namespace Sunny.UI.Demo
this.uiComboTreeView3.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.uiComboTreeView3.MinimumSize = new System.Drawing.Size(63, 0);
this.uiComboTreeView3.Name = "uiComboTreeView3";
treeNode1.Name = "节点0";
treeNode1.Text = "节点0";
treeNode2.Name = "节点1";
treeNode2.Text = "节点1";
treeNode3.Name = "节点2";
treeNode3.Text = "节点2";
treeNode4.Name = "节点3";
treeNode4.Text = "节点3";
treeNode5.Name = "节点0";
treeNode5.Text = "节点0";
treeNode6.Name = "节点4";
treeNode6.Text = "节点4";
treeNode7.Name = "节点5";
treeNode7.Text = "节点5";
treeNode8.Name = "节点6";
treeNode8.Text = "节点6";
treeNode9.Name = "节点7";
treeNode9.Text = "节点7";
treeNode10.Name = "节点1";
treeNode10.Text = "节点1";
treeNode11.Name = "节点2";
treeNode11.Text = "节点2";
treeNode12.Name = "节点3";
treeNode12.Text = "节点3";
treeNode33.Name = "节点0";
treeNode33.Text = "节点0";
treeNode34.Name = "节点1";
treeNode34.Text = "节点1";
treeNode35.Name = "节点2";
treeNode35.Text = "节点2";
treeNode36.Name = "节点3";
treeNode36.Text = "节点3";
treeNode37.Name = "节点0";
treeNode37.Text = "节点0";
treeNode38.Name = "节点4";
treeNode38.Text = "节点4";
treeNode39.Name = "节点5";
treeNode39.Text = "节点5";
treeNode40.Name = "节点6";
treeNode40.Text = "节点6";
treeNode41.Name = "节点7";
treeNode41.Text = "节点7";
treeNode42.Name = "节点1";
treeNode42.Text = "节点1";
treeNode43.Name = "节点2";
treeNode43.Text = "节点2";
treeNode44.Name = "节点3";
treeNode44.Text = "节点3";
this.uiComboTreeView3.Nodes.AddRange(new System.Windows.Forms.TreeNode[] {
treeNode5,
treeNode10,
treeNode11,
treeNode12});
treeNode37,
treeNode42,
treeNode43,
treeNode44});
this.uiComboTreeView3.Padding = new System.Windows.Forms.Padding(0, 0, 30, 2);
this.uiComboTreeView3.ShowLines = true;
this.uiComboTreeView3.Size = new System.Drawing.Size(150, 29);
this.uiComboTreeView3.SymbolSize = 24;
this.uiComboTreeView3.TabIndex = 67;
this.uiComboTreeView3.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft;
this.uiComboTreeView3.Watermark = "";
@ -166,38 +173,39 @@ namespace Sunny.UI.Demo
this.uiComboTreeView4.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.uiComboTreeView4.MinimumSize = new System.Drawing.Size(63, 0);
this.uiComboTreeView4.Name = "uiComboTreeView4";
treeNode13.Name = "节点0";
treeNode13.Text = "节点00";
treeNode14.Name = "节点1";
treeNode14.Text = "节点01";
treeNode15.Name = "节点2";
treeNode15.Text = "节点02";
treeNode16.Name = "节点3";
treeNode16.Text = "节点03";
treeNode17.Name = "节点0";
treeNode17.Text = "节点0";
treeNode18.Name = "节点4";
treeNode18.Text = "节点11";
treeNode19.Name = "节点5";
treeNode19.Text = "节点12";
treeNode20.Name = "节点6";
treeNode20.Text = "节点13";
treeNode21.Name = "节点7";
treeNode21.Text = "节点14";
treeNode22.Name = "节点1";
treeNode22.Text = "节点1";
treeNode23.Name = "节点2";
treeNode23.Text = "节点2";
treeNode24.Name = "节点3";
treeNode24.Text = "节点3";
treeNode45.Name = "节点0";
treeNode45.Text = "节点00";
treeNode46.Name = "节点1";
treeNode46.Text = "节点01";
treeNode47.Name = "节点2";
treeNode47.Text = "节点02";
treeNode48.Name = "节点3";
treeNode48.Text = "节点03";
treeNode49.Name = "节点0";
treeNode49.Text = "节点0";
treeNode50.Name = "节点4";
treeNode50.Text = "节点11";
treeNode51.Name = "节点5";
treeNode51.Text = "节点12";
treeNode52.Name = "节点6";
treeNode52.Text = "节点13";
treeNode53.Name = "节点7";
treeNode53.Text = "节点14";
treeNode54.Name = "节点1";
treeNode54.Text = "节点1";
treeNode55.Name = "节点2";
treeNode55.Text = "节点2";
treeNode56.Name = "节点3";
treeNode56.Text = "节点3";
this.uiComboTreeView4.Nodes.AddRange(new System.Windows.Forms.TreeNode[] {
treeNode17,
treeNode22,
treeNode23,
treeNode24});
treeNode49,
treeNode54,
treeNode55,
treeNode56});
this.uiComboTreeView4.Padding = new System.Windows.Forms.Padding(0, 0, 30, 2);
this.uiComboTreeView4.ShowLines = true;
this.uiComboTreeView4.Size = new System.Drawing.Size(150, 29);
this.uiComboTreeView4.SymbolSize = 24;
this.uiComboTreeView4.TabIndex = 66;
this.uiComboTreeView4.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft;
this.uiComboTreeView4.Watermark = "";
@ -212,21 +220,22 @@ namespace Sunny.UI.Demo
this.uiComboTreeView2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.uiComboTreeView2.MinimumSize = new System.Drawing.Size(63, 0);
this.uiComboTreeView2.Name = "uiComboTreeView2";
treeNode25.Name = "节点0";
treeNode25.Text = "节点0";
treeNode26.Name = "节点1";
treeNode26.Text = "节点1";
treeNode27.Name = "节点2";
treeNode27.Text = "节点2";
treeNode28.Name = "节点3";
treeNode28.Text = "节点3";
treeNode57.Name = "节点0";
treeNode57.Text = "节点0";
treeNode58.Name = "节点1";
treeNode58.Text = "节点1";
treeNode59.Name = "节点2";
treeNode59.Text = "节点2";
treeNode60.Name = "节点3";
treeNode60.Text = "节点3";
this.uiComboTreeView2.Nodes.AddRange(new System.Windows.Forms.TreeNode[] {
treeNode25,
treeNode26,
treeNode27,
treeNode28});
treeNode57,
treeNode58,
treeNode59,
treeNode60});
this.uiComboTreeView2.Padding = new System.Windows.Forms.Padding(0, 0, 30, 2);
this.uiComboTreeView2.Size = new System.Drawing.Size(150, 29);
this.uiComboTreeView2.SymbolSize = 24;
this.uiComboTreeView2.TabIndex = 65;
this.uiComboTreeView2.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft;
this.uiComboTreeView2.Watermark = "水印文字";
@ -234,7 +243,9 @@ namespace Sunny.UI.Demo
//
// uiLine1
//
this.uiLine1.BackColor = System.Drawing.Color.Transparent;
this.uiLine1.Font = new System.Drawing.Font("宋体", 12F);
this.uiLine1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(48)))));
this.uiLine1.Location = new System.Drawing.Point(386, 294);
this.uiLine1.MinimumSize = new System.Drawing.Size(16, 16);
this.uiLine1.Name = "uiLine1";
@ -252,28 +263,31 @@ namespace Sunny.UI.Demo
this.uiComboTreeView1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.uiComboTreeView1.MinimumSize = new System.Drawing.Size(63, 0);
this.uiComboTreeView1.Name = "uiComboTreeView1";
treeNode29.Name = "节点0";
treeNode29.Text = "节点0";
treeNode30.Name = "节点1";
treeNode30.Text = "节点1";
treeNode31.Name = "节点2";
treeNode31.Text = "节点2";
treeNode32.Name = "节点3";
treeNode32.Text = "节点3";
treeNode61.Name = "节点0";
treeNode61.Text = "节点0";
treeNode62.Name = "节点1";
treeNode62.Text = "节点1";
treeNode63.Name = "节点2";
treeNode63.Text = "节点2";
treeNode64.Name = "节点3";
treeNode64.Text = "节点3";
this.uiComboTreeView1.Nodes.AddRange(new System.Windows.Forms.TreeNode[] {
treeNode29,
treeNode30,
treeNode31,
treeNode32});
treeNode61,
treeNode62,
treeNode63,
treeNode64});
this.uiComboTreeView1.Padding = new System.Windows.Forms.Padding(0, 0, 30, 2);
this.uiComboTreeView1.Size = new System.Drawing.Size(150, 29);
this.uiComboTreeView1.SymbolSize = 24;
this.uiComboTreeView1.TabIndex = 63;
this.uiComboTreeView1.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft;
this.uiComboTreeView1.Watermark = "";
//
// uiLine8
//
this.uiLine8.BackColor = System.Drawing.Color.Transparent;
this.uiLine8.Font = new System.Drawing.Font("宋体", 12F);
this.uiLine8.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(48)))));
this.uiLine8.Location = new System.Drawing.Point(30, 337);
this.uiLine8.MinimumSize = new System.Drawing.Size(16, 16);
this.uiLine8.Name = "uiLine8";
@ -296,6 +310,7 @@ namespace Sunny.UI.Demo
this.uiDatetimePicker1.Size = new System.Drawing.Size(308, 29);
this.uiDatetimePicker1.SymbolDropDown = 61555;
this.uiDatetimePicker1.SymbolNormal = 61555;
this.uiDatetimePicker1.SymbolSize = 24;
this.uiDatetimePicker1.TabIndex = 61;
this.uiDatetimePicker1.Text = "2020-06-02 17:57:28";
this.uiDatetimePicker1.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft;
@ -314,6 +329,7 @@ namespace Sunny.UI.Demo
this.uiColorPicker1.Name = "uiColorPicker1";
this.uiColorPicker1.Padding = new System.Windows.Forms.Padding(0, 0, 30, 2);
this.uiColorPicker1.Size = new System.Drawing.Size(150, 29);
this.uiColorPicker1.SymbolSize = 24;
this.uiColorPicker1.TabIndex = 60;
this.uiColorPicker1.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft;
this.uiColorPicker1.Watermark = "";
@ -322,7 +338,9 @@ namespace Sunny.UI.Demo
//
// uiLine7
//
this.uiLine7.BackColor = System.Drawing.Color.Transparent;
this.uiLine7.Font = new System.Drawing.Font("宋体", 12F);
this.uiLine7.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(48)))));
this.uiLine7.Location = new System.Drawing.Point(388, 55);
this.uiLine7.MinimumSize = new System.Drawing.Size(16, 16);
this.uiLine7.Name = "uiLine7";
@ -333,7 +351,9 @@ namespace Sunny.UI.Demo
//
// uiLine6
//
this.uiLine6.BackColor = System.Drawing.Color.Transparent;
this.uiLine6.Font = new System.Drawing.Font("宋体", 12F);
this.uiLine6.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(48)))));
this.uiLine6.Location = new System.Drawing.Point(30, 416);
this.uiLine6.MinimumSize = new System.Drawing.Size(16, 16);
this.uiLine6.Name = "uiLine6";
@ -356,6 +376,7 @@ namespace Sunny.UI.Demo
this.uiTimePicker1.Size = new System.Drawing.Size(150, 29);
this.uiTimePicker1.SymbolDropDown = 61555;
this.uiTimePicker1.SymbolNormal = 61555;
this.uiTimePicker1.SymbolSize = 24;
this.uiTimePicker1.TabIndex = 57;
this.uiTimePicker1.Text = "23:41:39";
this.uiTimePicker1.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft;
@ -365,7 +386,9 @@ namespace Sunny.UI.Demo
//
// uiLine3
//
this.uiLine3.BackColor = System.Drawing.Color.Transparent;
this.uiLine3.Font = new System.Drawing.Font("宋体", 12F);
this.uiLine3.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(48)))));
this.uiLine3.Location = new System.Drawing.Point(30, 214);
this.uiLine3.MinimumSize = new System.Drawing.Size(16, 16);
this.uiLine3.Name = "uiLine3";
@ -376,7 +399,9 @@ namespace Sunny.UI.Demo
//
// uiLine2
//
this.uiLine2.BackColor = System.Drawing.Color.Transparent;
this.uiLine2.Font = new System.Drawing.Font("宋体", 12F);
this.uiLine2.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(48)))));
this.uiLine2.Location = new System.Drawing.Point(30, 55);
this.uiLine2.MinimumSize = new System.Drawing.Size(16, 16);
this.uiLine2.Name = "uiLine2";
@ -402,6 +427,7 @@ namespace Sunny.UI.Demo
this.uiDatePicker1.Size = new System.Drawing.Size(150, 29);
this.uiDatePicker1.SymbolDropDown = 61555;
this.uiDatePicker1.SymbolNormal = 61555;
this.uiDatePicker1.SymbolSize = 24;
this.uiDatePicker1.TabIndex = 54;
this.uiDatePicker1.Text = "2020";
this.uiDatePicker1.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft;
@ -417,6 +443,8 @@ namespace Sunny.UI.Demo
this.uiComboBox2.FillColor = System.Drawing.Color.White;
this.uiComboBox2.FilterMaxCount = 50;
this.uiComboBox2.Font = new System.Drawing.Font("宋体", 12F);
this.uiComboBox2.ItemHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(155)))), ((int)(((byte)(200)))), ((int)(((byte)(255)))));
this.uiComboBox2.ItemSelectForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255)))));
this.uiComboBox2.Location = new System.Drawing.Point(188, 89);
this.uiComboBox2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.uiComboBox2.MinimumSize = new System.Drawing.Size(63, 0);
@ -424,6 +452,7 @@ namespace Sunny.UI.Demo
this.uiComboBox2.Padding = new System.Windows.Forms.Padding(0, 0, 30, 2);
this.uiComboBox2.ShowClearButton = true;
this.uiComboBox2.Size = new System.Drawing.Size(150, 29);
this.uiComboBox2.SymbolSize = 24;
this.uiComboBox2.TabIndex = 53;
this.uiComboBox2.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft;
this.uiComboBox2.Watermark = "水印文字";
@ -434,6 +463,7 @@ namespace Sunny.UI.Demo
this.uiComboBox1.FillColor = System.Drawing.Color.White;
this.uiComboBox1.FilterMaxCount = 50;
this.uiComboBox1.Font = new System.Drawing.Font("宋体", 12F);
this.uiComboBox1.ItemHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(155)))), ((int)(((byte)(200)))), ((int)(((byte)(255)))));
this.uiComboBox1.Items.AddRange(new object[] {
"1",
"2",
@ -447,6 +477,7 @@ namespace Sunny.UI.Demo
"14",
"15",
"16"});
this.uiComboBox1.ItemSelectForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255)))));
this.uiComboBox1.Location = new System.Drawing.Point(30, 90);
this.uiComboBox1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.uiComboBox1.MinimumSize = new System.Drawing.Size(63, 0);
@ -455,6 +486,7 @@ namespace Sunny.UI.Demo
this.uiComboBox1.RadiusSides = Sunny.UI.UICornerRadiusSides.None;
this.uiComboBox1.RectSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.Bottom;
this.uiComboBox1.Size = new System.Drawing.Size(150, 29);
this.uiComboBox1.SymbolSize = 24;
this.uiComboBox1.TabIndex = 52;
this.uiComboBox1.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft;
this.uiComboBox1.Watermark = "水印文字";
@ -477,6 +509,7 @@ namespace Sunny.UI.Demo
this.uiDatePicker2.Size = new System.Drawing.Size(150, 29);
this.uiDatePicker2.SymbolDropDown = 61555;
this.uiDatePicker2.SymbolNormal = 61555;
this.uiDatePicker2.SymbolSize = 24;
this.uiDatePicker2.TabIndex = 71;
this.uiDatePicker2.Text = "2020-04";
this.uiDatePicker2.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft;
@ -498,6 +531,7 @@ namespace Sunny.UI.Demo
this.uiDatePicker3.Size = new System.Drawing.Size(150, 29);
this.uiDatePicker3.SymbolDropDown = 61555;
this.uiDatePicker3.SymbolNormal = 61555;
this.uiDatePicker3.SymbolSize = 24;
this.uiDatePicker3.TabIndex = 72;
this.uiDatePicker3.Text = "2020-04-16";
this.uiDatePicker3.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft;
@ -507,7 +541,9 @@ namespace Sunny.UI.Demo
//
// uiLine4
//
this.uiLine4.BackColor = System.Drawing.Color.Transparent;
this.uiLine4.Font = new System.Drawing.Font("宋体", 12F);
this.uiLine4.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(48)))));
this.uiLine4.Location = new System.Drawing.Point(386, 134);
this.uiLine4.MinimumSize = new System.Drawing.Size(16, 16);
this.uiLine4.Name = "uiLine4";
@ -527,15 +563,17 @@ namespace Sunny.UI.Demo
this.uiComboDataGridView1.Name = "uiComboDataGridView1";
this.uiComboDataGridView1.Padding = new System.Windows.Forms.Padding(0, 0, 30, 2);
this.uiComboDataGridView1.Size = new System.Drawing.Size(308, 29);
this.uiComboDataGridView1.SymbolSize = 24;
this.uiComboDataGridView1.TabIndex = 74;
this.uiComboDataGridView1.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft;
this.uiComboDataGridView1.Watermark = "";
this.uiComboDataGridView1.SelectIndexChange += new Sunny.UI.UIDataGridView.OnSelectIndexChange(this.uiComboDataGridView1_SelectIndexChange_1);
this.uiComboDataGridView1.ValueChanged += new Sunny.UI.UIComboDataGridView.OnValueChanged(this.uiComboDataGridView1_ValueChanged);
//
// uiLine5
//
this.uiLine5.BackColor = System.Drawing.Color.Transparent;
this.uiLine5.Font = new System.Drawing.Font("宋体", 12F);
this.uiLine5.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(48)))));
this.uiLine5.Location = new System.Drawing.Point(30, 134);
this.uiLine5.MinimumSize = new System.Drawing.Size(16, 16);
this.uiLine5.Name = "uiLine5";
@ -551,6 +589,8 @@ namespace Sunny.UI.Demo
this.uiComboBox3.FillColor = System.Drawing.Color.White;
this.uiComboBox3.FilterMaxCount = 50;
this.uiComboBox3.Font = new System.Drawing.Font("宋体", 12F);
this.uiComboBox3.ItemHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(155)))), ((int)(((byte)(200)))), ((int)(((byte)(255)))));
this.uiComboBox3.ItemSelectForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255)))));
this.uiComboBox3.Location = new System.Drawing.Point(188, 168);
this.uiComboBox3.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.uiComboBox3.MinimumSize = new System.Drawing.Size(63, 0);
@ -558,6 +598,7 @@ namespace Sunny.UI.Demo
this.uiComboBox3.Padding = new System.Windows.Forms.Padding(0, 0, 30, 2);
this.uiComboBox3.ShowFilter = true;
this.uiComboBox3.Size = new System.Drawing.Size(150, 29);
this.uiComboBox3.SymbolSize = 24;
this.uiComboBox3.TabIndex = 76;
this.uiComboBox3.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft;
this.uiComboBox3.Watermark = "";
@ -569,6 +610,7 @@ namespace Sunny.UI.Demo
this.uiComboBox4.FillColor = System.Drawing.Color.White;
this.uiComboBox4.FilterMaxCount = 50;
this.uiComboBox4.Font = new System.Drawing.Font("宋体", 12F);
this.uiComboBox4.ItemHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(155)))), ((int)(((byte)(200)))), ((int)(((byte)(255)))));
this.uiComboBox4.Items.AddRange(new object[] {
"1",
"2",
@ -588,6 +630,7 @@ namespace Sunny.UI.Demo
"114",
"115",
"116"});
this.uiComboBox4.ItemSelectForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255)))));
this.uiComboBox4.Location = new System.Drawing.Point(30, 169);
this.uiComboBox4.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.uiComboBox4.MinimumSize = new System.Drawing.Size(63, 0);
@ -597,6 +640,7 @@ namespace Sunny.UI.Demo
this.uiComboBox4.RectSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.Bottom;
this.uiComboBox4.ShowFilter = true;
this.uiComboBox4.Size = new System.Drawing.Size(150, 29);
this.uiComboBox4.SymbolSize = 24;
this.uiComboBox4.TabIndex = 75;
this.uiComboBox4.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft;
this.uiComboBox4.Watermark = "水印文字";
@ -613,6 +657,7 @@ namespace Sunny.UI.Demo
this.uiComboDataGridView2.Name = "uiComboDataGridView2";
this.uiComboDataGridView2.Padding = new System.Windows.Forms.Padding(0, 0, 30, 2);
this.uiComboDataGridView2.Size = new System.Drawing.Size(308, 29);
this.uiComboDataGridView2.SymbolSize = 24;
this.uiComboDataGridView2.TabIndex = 79;
this.uiComboDataGridView2.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft;
this.uiComboDataGridView2.Watermark = "";
@ -620,7 +665,9 @@ namespace Sunny.UI.Demo
//
// uiLine9
//
this.uiLine9.BackColor = System.Drawing.Color.Transparent;
this.uiLine9.Font = new System.Drawing.Font("宋体", 12F);
this.uiLine9.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(48)))));
this.uiLine9.Location = new System.Drawing.Point(386, 214);
this.uiLine9.MinimumSize = new System.Drawing.Size(16, 16);
this.uiLine9.Name = "uiLine9";
@ -637,7 +684,9 @@ namespace Sunny.UI.Demo
//
// uiLine10
//
this.uiLine10.BackColor = System.Drawing.Color.Transparent;
this.uiLine10.Font = new System.Drawing.Font("宋体", 12F);
this.uiLine10.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(48)))));
this.uiLine10.Location = new System.Drawing.Point(386, 416);
this.uiLine10.MinimumSize = new System.Drawing.Size(16, 16);
this.uiLine10.Name = "uiLine10";
@ -656,6 +705,7 @@ namespace Sunny.UI.Demo
this.uiNumPadTextBox1.Name = "uiNumPadTextBox1";
this.uiNumPadTextBox1.Padding = new System.Windows.Forms.Padding(0, 0, 30, 2);
this.uiNumPadTextBox1.Size = new System.Drawing.Size(150, 29);
this.uiNumPadTextBox1.SymbolSize = 24;
this.uiNumPadTextBox1.TabIndex = 81;
this.uiNumPadTextBox1.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft;
this.uiNumPadTextBox1.Watermark = "";
@ -671,6 +721,7 @@ namespace Sunny.UI.Demo
this.uiNumPadTextBox2.NumPadType = Sunny.UI.NumPadType.Integer;
this.uiNumPadTextBox2.Padding = new System.Windows.Forms.Padding(0, 0, 30, 2);
this.uiNumPadTextBox2.Size = new System.Drawing.Size(150, 29);
this.uiNumPadTextBox2.SymbolSize = 24;
this.uiNumPadTextBox2.TabIndex = 82;
this.uiNumPadTextBox2.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft;
this.uiNumPadTextBox2.Watermark = "";
@ -687,6 +738,7 @@ namespace Sunny.UI.Demo
this.uiNumPadTextBox3.NumPadType = Sunny.UI.NumPadType.IDNumber;
this.uiNumPadTextBox3.Padding = new System.Windows.Forms.Padding(0, 0, 30, 2);
this.uiNumPadTextBox3.Size = new System.Drawing.Size(150, 29);
this.uiNumPadTextBox3.SymbolSize = 24;
this.uiNumPadTextBox3.TabIndex = 84;
this.uiNumPadTextBox3.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft;
this.uiNumPadTextBox3.Watermark = "";
@ -702,15 +754,141 @@ namespace Sunny.UI.Demo
this.uiNumPadTextBox4.NumPadType = Sunny.UI.NumPadType.Double;
this.uiNumPadTextBox4.Padding = new System.Windows.Forms.Padding(0, 0, 30, 2);
this.uiNumPadTextBox4.Size = new System.Drawing.Size(150, 29);
this.uiNumPadTextBox4.SymbolSize = 24;
this.uiNumPadTextBox4.TabIndex = 83;
this.uiNumPadTextBox4.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft;
this.uiNumPadTextBox4.Watermark = "";
//
// uiLine11
//
this.uiLine11.BackColor = System.Drawing.Color.Transparent;
this.uiLine11.Font = new System.Drawing.Font("宋体", 12F);
this.uiLine11.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(48)))));
this.uiLine11.Location = new System.Drawing.Point(30, 543);
this.uiLine11.MinimumSize = new System.Drawing.Size(16, 16);
this.uiLine11.Name = "uiLine11";
this.uiLine11.Size = new System.Drawing.Size(664, 20);
this.uiLine11.TabIndex = 85;
this.uiLine11.Text = "2X";
this.uiLine11.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// uiDatePicker4
//
this.uiDatePicker4.CanEmpty = true;
this.uiDatePicker4.FillColor = System.Drawing.Color.White;
this.uiDatePicker4.Font = new System.Drawing.Font("宋体", 12F);
this.uiDatePicker4.Location = new System.Drawing.Point(30, 580);
this.uiDatePicker4.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.uiDatePicker4.MaxLength = 10;
this.uiDatePicker4.MinimumSize = new System.Drawing.Size(63, 0);
this.uiDatePicker4.Name = "uiDatePicker4";
this.uiDatePicker4.Padding = new System.Windows.Forms.Padding(0, 0, 30, 2);
this.uiDatePicker4.ShowToday = true;
this.uiDatePicker4.Size = new System.Drawing.Size(150, 29);
this.uiDatePicker4.SizeMultiple = 2;
this.uiDatePicker4.SymbolDropDown = 61555;
this.uiDatePicker4.SymbolNormal = 61555;
this.uiDatePicker4.SymbolSize = 24;
this.uiDatePicker4.TabIndex = 86;
this.uiDatePicker4.Text = "2020-04-16";
this.uiDatePicker4.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft;
this.uiDatePicker4.Value = new System.DateTime(2020, 4, 16, 0, 0, 0, 0);
this.uiDatePicker4.Watermark = "";
//
// uiDatetimePicker2
//
this.uiDatetimePicker2.CanEmpty = true;
this.uiDatetimePicker2.FillColor = System.Drawing.Color.White;
this.uiDatetimePicker2.Font = new System.Drawing.Font("宋体", 12F);
this.uiDatetimePicker2.Location = new System.Drawing.Point(30, 619);
this.uiDatetimePicker2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.uiDatetimePicker2.MaxLength = 19;
this.uiDatetimePicker2.MinimumSize = new System.Drawing.Size(63, 0);
this.uiDatetimePicker2.Name = "uiDatetimePicker2";
this.uiDatetimePicker2.Padding = new System.Windows.Forms.Padding(0, 0, 30, 2);
this.uiDatetimePicker2.Size = new System.Drawing.Size(308, 29);
this.uiDatetimePicker2.SizeMultiple = 2;
this.uiDatetimePicker2.SymbolDropDown = 61555;
this.uiDatetimePicker2.SymbolNormal = 61555;
this.uiDatetimePicker2.SymbolSize = 24;
this.uiDatetimePicker2.TabIndex = 87;
this.uiDatetimePicker2.Text = "2020-06-02 17:57:28";
this.uiDatetimePicker2.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft;
this.uiDatetimePicker2.Value = new System.DateTime(2020, 6, 2, 17, 57, 28, 203);
this.uiDatetimePicker2.Watermark = "";
//
// uiTimePicker2
//
this.uiTimePicker2.CanEmpty = true;
this.uiTimePicker2.FillColor = System.Drawing.Color.White;
this.uiTimePicker2.Font = new System.Drawing.Font("宋体", 12F);
this.uiTimePicker2.Location = new System.Drawing.Point(188, 580);
this.uiTimePicker2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.uiTimePicker2.MaxLength = 8;
this.uiTimePicker2.MinimumSize = new System.Drawing.Size(63, 0);
this.uiTimePicker2.Name = "uiTimePicker2";
this.uiTimePicker2.Padding = new System.Windows.Forms.Padding(0, 0, 30, 2);
this.uiTimePicker2.Size = new System.Drawing.Size(150, 29);
this.uiTimePicker2.SizeMultiple = 2;
this.uiTimePicker2.SymbolDropDown = 61555;
this.uiTimePicker2.SymbolNormal = 61555;
this.uiTimePicker2.SymbolSize = 24;
this.uiTimePicker2.TabIndex = 88;
this.uiTimePicker2.Text = "23:41:39";
this.uiTimePicker2.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft;
this.uiTimePicker2.Value = new System.DateTime(2020, 5, 29, 23, 41, 39, 684);
this.uiTimePicker2.Watermark = "";
//
// uiNumPadTextBox5
//
this.uiNumPadTextBox5.FillColor = System.Drawing.Color.White;
this.uiNumPadTextBox5.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.uiNumPadTextBox5.Location = new System.Drawing.Point(386, 580);
this.uiNumPadTextBox5.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.uiNumPadTextBox5.MinimumSize = new System.Drawing.Size(63, 0);
this.uiNumPadTextBox5.Name = "uiNumPadTextBox5";
this.uiNumPadTextBox5.NumPadType = Sunny.UI.NumPadType.Double;
this.uiNumPadTextBox5.Padding = new System.Windows.Forms.Padding(0, 0, 30, 2);
this.uiNumPadTextBox5.Size = new System.Drawing.Size(150, 29);
this.uiNumPadTextBox5.SizeMultiple = 2;
this.uiNumPadTextBox5.SymbolSize = 24;
this.uiNumPadTextBox5.TabIndex = 89;
this.uiNumPadTextBox5.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft;
this.uiNumPadTextBox5.Watermark = "";
//
// uiDatePicker5
//
this.uiDatePicker5.CanEmpty = true;
this.uiDatePicker5.FillColor = System.Drawing.Color.White;
this.uiDatePicker5.Font = new System.Drawing.Font("宋体", 12F);
this.uiDatePicker5.Location = new System.Drawing.Point(188, 293);
this.uiDatePicker5.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.uiDatePicker5.MaxLength = 10;
this.uiDatePicker5.MinimumSize = new System.Drawing.Size(63, 0);
this.uiDatePicker5.Name = "uiDatePicker5";
this.uiDatePicker5.Padding = new System.Windows.Forms.Padding(0, 0, 30, 2);
this.uiDatePicker5.ShowToday = true;
this.uiDatePicker5.Size = new System.Drawing.Size(150, 29);
this.uiDatePicker5.SymbolDropDown = 61555;
this.uiDatePicker5.SymbolNormal = 61555;
this.uiDatePicker5.SymbolSize = 24;
this.uiDatePicker5.TabIndex = 90;
this.uiDatePicker5.Text = "2020-04-16";
this.uiDatePicker5.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft;
this.uiDatePicker5.Value = new System.DateTime(2020, 4, 16, 0, 0, 0, 0);
this.uiDatePicker5.Watermark = "";
//
// FCombobox
//
this.AllowShowTitle = true;
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
this.ClientSize = new System.Drawing.Size(765, 593);
this.ClientSize = new System.Drawing.Size(765, 665);
this.Controls.Add(this.uiDatePicker5);
this.Controls.Add(this.uiNumPadTextBox5);
this.Controls.Add(this.uiTimePicker2);
this.Controls.Add(this.uiDatetimePicker2);
this.Controls.Add(this.uiDatePicker4);
this.Controls.Add(this.uiLine11);
this.Controls.Add(this.uiNumPadTextBox3);
this.Controls.Add(this.uiNumPadTextBox4);
this.Controls.Add(this.uiNumPadTextBox2);
@ -746,6 +924,7 @@ namespace Sunny.UI.Demo
this.ShowTitle = true;
this.Symbol = 61776;
this.Text = "Combobox";
this.Shown += new System.EventHandler(this.FCombobox_Shown);
this.ResumeLayout(false);
}
@ -782,5 +961,11 @@ namespace Sunny.UI.Demo
private UINumPadTextBox uiNumPadTextBox2;
private UINumPadTextBox uiNumPadTextBox3;
private UINumPadTextBox uiNumPadTextBox4;
private UILine uiLine11;
private UIDatePicker uiDatePicker4;
private UIDatetimePicker uiDatetimePicker2;
private UITimePicker uiTimePicker2;
private UINumPadTextBox uiNumPadTextBox5;
private UIDatePicker uiDatePicker5;
}
}

View File

@ -36,31 +36,28 @@ namespace Sunny.UI.Demo
uiComboDataGridView1.DataGridView.Init();
uiComboDataGridView1.ItemSize = new System.Drawing.Size(360, 240);
uiComboDataGridView1.DataGridView.AddColumn("Column1", "Column1");
uiComboDataGridView1.DataGridView.AddColumn("Column2", "Column2");
uiComboDataGridView1.DataGridView.AddColumn("Column3", "Column3");
uiComboDataGridView1.DataGridView.AddColumn("数据列1", "Column1");
uiComboDataGridView1.DataGridView.AddColumn("数据列2", "Column2");
uiComboDataGridView1.DataGridView.AddColumn("数据列3", "Column3");
uiComboDataGridView1.DataGridView.ReadOnly = true;
uiComboDataGridView1.SelectIndexChange += UiComboDataGridView1_SelectIndexChange;
uiComboDataGridView1.ShowFilter = true;
uiComboDataGridView1.DataGridView.DataSource = dt;
uiComboDataGridView1.FilterColumnName = "Column1"; //不设置则全部列过滤
uiComboDataGridView1.DataGridView.DataSource = dt;//用DataTable做数据源过滤用List不行
uiComboDataGridView1.FilterColumnName = "Column1;Column3"; //不设置则全部列过滤,可加分号过滤多列
uiComboDataGridView2.DataGridView.Init();
uiComboDataGridView2.DataGridView.MultiSelect = true;//设置可多选
uiComboDataGridView2.ItemSize = new System.Drawing.Size(360, 240);
uiComboDataGridView2.DataGridView.AddColumn("Column1", "Column1");
uiComboDataGridView2.DataGridView.AddColumn("Column2", "Column2");
uiComboDataGridView2.DataGridView.AddColumn("Column3", "Column3");
uiComboDataGridView2.DataGridView.AddColumn("数据列1", "Column1");
uiComboDataGridView2.DataGridView.AddColumn("数据列2", "Column2");
uiComboDataGridView2.DataGridView.AddColumn("数据列3", "Column3");
uiComboDataGridView2.DataGridView.ReadOnly = true;
uiComboDataGridView2.ShowFilter = true;
uiComboDataGridView2.DataGridView.DataSource = dt;
uiComboDataGridView2.FilterColumnName = "Column1"; //不设置则全部列过滤
uiComboBox1.SetTipsText(uiToolTip1, "Hello World.");
//日期选择框文本设置为空
uiDatePicker3.CanEmpty = true;
uiDatePicker3.Text = "";
uiDatePicker4.Value = uiDatePicker1.Value = uiDatePicker2.Value = uiDatePicker3.Value = DateTime.Now.Date;
uiDatetimePicker2.Value = uiDatetimePicker1.Value = DateTime.Now;
uiTimePicker1.Value = uiTimePicker2.Value = DateTime.Now;
}
private void UiComboDataGridView1_SelectIndexChange(object sender, int index)
@ -117,24 +114,8 @@ namespace Sunny.UI.Demo
}
}
private void uiComboDataGridView1_ValueChanged(object sender, object value)
{
uiComboDataGridView1.Text = "";
if (value != null && value is DataGridViewRow)
{
DataGridViewRow row = (DataGridViewRow)value;
uiComboDataGridView1.Text = row.Cells["Column1"].Value.ToString();
}
}
private void uiComboDataGridView1_SelectIndexChange_1(object sender, int index)
{
uiComboDataGridView1.Text = dt.Rows[index]["Column1"].ToString();
}
private void uiDatePicker3_ValueChanged(object sender, DateTime value)
{
ShowInfoTip(uiDatePicker3.Value.DateString());
Console.WriteLine(uiDatePicker3.Value);
}
@ -152,16 +133,26 @@ namespace Sunny.UI.Demo
uiComboBox4.Text.WriteConsole();
}
private void uiComboDataGridView1_ValueChanged(object sender, object value)
{
uiComboDataGridView1.Text = "";
if (value != null && value is DataGridViewRow)
{
DataGridViewRow row = (DataGridViewRow)value;
uiComboDataGridView1.Text = row.Cells["数据列1"].Value.ToString();//通过ColumnName显示值
}
}
private void uiComboDataGridView2_ValueChanged(object sender, object value)
{
uiComboDataGridView2.Text = "";
if (value != null && value is DataGridViewSelectedRowCollection)
{
DataGridViewSelectedRowCollection collection = (DataGridViewSelectedRowCollection)value;
foreach (var item in collection)
foreach (object item in collection)
{
DataGridViewRow row = (DataGridViewRow)item;
uiComboDataGridView2.Text += row.Cells["Column1"].Value.ToString();
uiComboDataGridView2.Text += row.Cells[0].Value.ToString();//通过索引显示值
uiComboDataGridView2.Text += "; ";
}
}
@ -169,7 +160,14 @@ namespace Sunny.UI.Demo
private void uiComboBox1_TipsClick(object sender, EventArgs e)
{
ShowInfoTip("Hello world.");
this.ShowInfoTip("Hello world.");
}
private void FCombobox_Shown(object sender, EventArgs e)
{
//日期选择框文本设置为空
uiDatePicker5.CanEmpty = true;
uiDatePicker5.Text = "";
}
}
}

View File

@ -12,7 +12,7 @@ namespace Sunny.UI.Demo
var styles = UIStyles.PopularStyles();
foreach (UIStyle style in styles)
{
ToolStripMenuItem item = new ToolStripMenuItem(style.DisplayText()) { Tag = style };
ToolStripMenuItem item = new ToolStripMenuItem(style.Description()) { Tag = style };
item.Click += Item_Click;
uiContextMenuStrip1.Items.Add(item);
}

View File

@ -36,12 +36,12 @@ namespace Sunny.UI.Demo
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle5 = new System.Windows.Forms.DataGridViewCellStyle();
this.uiDataGridViewFooter1 = new Sunny.UI.UIDataGridViewFooter();
this.uiDataGridView1 = new Sunny.UI.UIDataGridView();
this.uiPagination1 = new Sunny.UI.UIPagination();
this.backgroundWorker1 = new System.ComponentModel.BackgroundWorker();
this.Column1 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column2 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column3 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column4 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.uiPagination1 = new Sunny.UI.UIPagination();
this.backgroundWorker1 = new System.ComponentModel.BackgroundWorker();
((System.ComponentModel.ISupportInitialize)(this.uiDataGridView1)).BeginInit();
this.SuspendLayout();
//
@ -117,37 +117,10 @@ namespace Sunny.UI.Demo
this.uiDataGridView1.Size = new System.Drawing.Size(800, 351);
this.uiDataGridView1.TabIndex = 6;
//
// Column1
//
this.Column1.DataPropertyName = "Column1";
this.Column1.HeaderText = "Column1";
this.Column1.Name = "Column1";
this.Column1.Width = 300;
//
// Column2
//
this.Column2.DataPropertyName = "Column2";
this.Column2.HeaderText = "Column2";
this.Column2.Name = "Column2";
this.Column2.Width = 200;
//
// Column3
//
this.Column3.DataPropertyName = "Column3";
this.Column3.HeaderText = "Column3";
this.Column3.Name = "Column3";
this.Column3.Width = 200;
//
// Column4
//
this.Column4.DataPropertyName = "Column4";
this.Column4.HeaderText = "Column4";
this.Column4.Name = "Column4";
this.Column4.Width = 200;
//
// uiPagination1
//
this.uiPagination1.ActivePage = 20;
this.uiPagination1.ButtonFillSelectedColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(128)))), ((int)(((byte)(204)))));
this.uiPagination1.CausesValidation = false;
this.uiPagination1.Dock = System.Windows.Forms.DockStyle.Bottom;
this.uiPagination1.Font = new System.Drawing.Font("宋体", 12F);
@ -167,6 +140,34 @@ namespace Sunny.UI.Demo
this.uiPagination1.TotalCount = 40000;
this.uiPagination1.PageChanged += new Sunny.UI.UIPagination.OnPageChangeEventHandler(this.uiPagination1_PageChanged);
//
// Column1
//
this.Column1.DataPropertyName = "Column1";
this.Column1.HeaderText = "数据列1";
this.Column1.Name = "Column1";
this.Column1.Width = 300;
//
// Column2
//
this.Column2.DataPropertyName = "Column2";
this.Column2.HeaderText = "数据列2";
this.Column2.Name = "Column2";
this.Column2.Width = 200;
//
// Column3
//
this.Column3.DataPropertyName = "Column3";
this.Column3.HeaderText = "数据列3";
this.Column3.Name = "Column3";
this.Column3.Width = 200;
//
// Column4
//
this.Column4.DataPropertyName = "Column4";
this.Column4.HeaderText = "数据列4";
this.Column4.Name = "Column4";
this.Column4.Width = 200;
//
// FDataGridView
//
this.AllowShowTitle = true;

View File

@ -22,10 +22,10 @@ namespace Sunny.UI.Demo
dataList.Add(data);
}
dataTable.Columns.Add("Column1");
dataTable.Columns.Add("Column2");
dataTable.Columns.Add("Column3");
dataTable.Columns.Add("Column4");
dataTable.Columns.Add("Column1", typeof(string));
dataTable.Columns.Add("Column2", typeof(string));
dataTable.Columns.Add("Column3", typeof(string));
dataTable.Columns.Add("Column4", typeof(int));
uiDataGridView1.DataSource = dataTable;
//不自动生成列
@ -35,7 +35,7 @@ namespace Sunny.UI.Demo
uiPagination1.TotalCount = dataList.Count;
//设置分页控件每页数量
uiPagination1.PageSize = 50;
uiPagination1.PageSize = 20;
uiDataGridView1.SelectIndexChange += uiDataGridView1_SelectIndexChange;
//设置统计绑定的表格
@ -74,12 +74,12 @@ namespace Sunny.UI.Demo
private void uiPagination1_PageChanged(object sender, object pagingSource, int pageIndex, int count)
{
//未连接数据库,通过模拟数据来实现
//一般通过ORM的分页去取数据来填充
//一般通过ORM的分页、或者SQL语句分页去取数据来填充dataTable
//pageIndex第几页和界面对应从1开始取数据可能要用pageIndex - 1
//count单页数据量也就是PageSize值
dataTable.Rows.Clear();
for (int i = (pageIndex - 1) * count; i < pageIndex * count + count; i++)
for (int i = (pageIndex - 1) * count; i < pageIndex * count; i++)
{
if (i >= dataList.Count) break;
dataTable.Rows.Add(dataList[i].Column1, dataList[i].Column2, dataList[i].Column3, dataList[i].Column4);

View File

@ -48,7 +48,7 @@ namespace Sunny.UI.Demo
private void Btn_Click(object sender, System.EventArgs e)
{
var button = (UIFlowItem)sender;
ShowInfoTip(button.Text);
this.ShowInfoTip(button.Text);
}
private void uiButton2_Click(object sender, System.EventArgs e)

View File

@ -12,7 +12,7 @@
private void uiCalendar1_OnDateTimeChanged(object sender, UIDateTimeArgs e)
{
ShowInfoTip(uiCalendar1.Date.DateString());
this.ShowInfoTip(uiCalendar1.Date.DateString());
}
}
}

View File

@ -19,7 +19,7 @@
{
value++;
uiTrackBar8.Value = uiTrackBar2.Value = uiTrackBar1.Value = value;
uiProcessBar2.Value = uiProcessBar1.Value = value;
uiProcessBar4.Value = uiProcessBar2.Value = uiProcessBar1.Value = value;
uiRoundProcess4.Value = uiRoundProcess3.Value = uiProcessBar3.Value = uiRoundProcess2.Value = uiRoundProcess1.Value = value;
}

View File

@ -61,6 +61,7 @@ namespace Sunny.UI.Demo
this.uiTrackBar3 = new Sunny.UI.UITrackBar();
this.uiTrackBar2 = new Sunny.UI.UITrackBar();
this.uiTrackBar1 = new Sunny.UI.UITrackBar();
this.uiProcessBar4 = new Sunny.UI.UIProcessBar();
this.SuspendLayout();
//
// uiLine2
@ -165,7 +166,9 @@ namespace Sunny.UI.Demo
//
// uiWaitingBar1
//
this.uiWaitingBar1.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(243)))), ((int)(((byte)(249)))), ((int)(((byte)(255)))));
this.uiWaitingBar1.Font = new System.Drawing.Font("宋体", 12F);
this.uiWaitingBar1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255)))));
this.uiWaitingBar1.Location = new System.Drawing.Point(411, 88);
this.uiWaitingBar1.MinimumSize = new System.Drawing.Size(70, 23);
this.uiWaitingBar1.Name = "uiWaitingBar1";
@ -457,11 +460,25 @@ namespace Sunny.UI.Demo
this.uiTrackBar1.TabIndex = 113;
this.uiTrackBar1.Text = "uiTrackBar1";
//
// uiProcessBar4
//
this.uiProcessBar4.Direction = Sunny.UI.UILine.LineDirection.Vertical;
this.uiProcessBar4.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255)))));
this.uiProcessBar4.Font = new System.Drawing.Font("宋体", 12F);
this.uiProcessBar4.Location = new System.Drawing.Point(706, 325);
this.uiProcessBar4.MinimumSize = new System.Drawing.Size(3, 1);
this.uiProcessBar4.Name = "uiProcessBar4";
this.uiProcessBar4.Radius = 3;
this.uiProcessBar4.Size = new System.Drawing.Size(3, 219);
this.uiProcessBar4.TabIndex = 126;
this.uiProcessBar4.Value = 50;
//
// FProcess
//
this.AllowShowTitle = true;
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
this.ClientSize = new System.Drawing.Size(800, 635);
this.Controls.Add(this.uiProcessBar4);
this.Controls.Add(this.uiRuler5);
this.Controls.Add(this.uiRuler6);
this.Controls.Add(this.uiRuler4);
@ -533,5 +550,6 @@ namespace Sunny.UI.Demo
private UITrackBar uiTrackBar3;
private UITrackBar uiTrackBar2;
private UITrackBar uiTrackBar1;
private UIProcessBar uiProcessBar4;
}
}

View File

@ -17,7 +17,7 @@
private void uiTextBox1_ButtonClick(object sender, System.EventArgs e)
{
ShowInfoTip("您点击了编辑框的按钮。");
this.ShowInfoTip("您点击了编辑框的按钮。");
}
}
}

View File

@ -67,7 +67,9 @@ namespace Sunny.UI.Demo
//
// uiLine1
//
this.uiLine1.BackColor = System.Drawing.Color.Transparent;
this.uiLine1.Font = new System.Drawing.Font("宋体", 12F);
this.uiLine1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(48)))));
this.uiLine1.Location = new System.Drawing.Point(30, 55);
this.uiLine1.MinimumSize = new System.Drawing.Size(16, 16);
this.uiLine1.Name = "uiLine1";
@ -75,7 +77,6 @@ namespace Sunny.UI.Demo
this.uiLine1.TabIndex = 21;
this.uiLine1.Text = "UITreeView";
this.uiLine1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.uiLine1.ZoomScaleRect = new System.Drawing.Rectangle(0, 0, 0, 0);
//
// uiTreeView1
//
@ -138,13 +139,12 @@ namespace Sunny.UI.Demo
treeNode15,
treeNode16,
treeNode20});
this.uiTreeView1.ShowLines = true;
this.uiTreeView1.ScrollBarStyleInherited = false;
this.uiTreeView1.ShowText = false;
this.uiTreeView1.Size = new System.Drawing.Size(266, 313);
this.uiTreeView1.TabIndex = 20;
this.uiTreeView1.Text = null;
this.uiTreeView1.TextAlignment = System.Drawing.ContentAlignment.MiddleCenter;
this.uiTreeView1.ZoomScaleRect = new System.Drawing.Rectangle(0, 0, 0, 0);
//
// FTreeView
//

View File

@ -29,9 +29,14 @@
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FMain));
this.uiContextMenuStrip1 = new Sunny.UI.UIContextMenuStrip();
this.ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.ToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
this.NHome = new System.Windows.Forms.ToolStripMenuItem();
this.NAbout = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripSeparator();
this.NZhCN = new System.Windows.Forms.ToolStripMenuItem();
this.NZhTW = new System.Windows.Forms.ToolStripMenuItem();
this.NEnUS = new System.Windows.Forms.ToolStripMenuItem();
this.StyleManager = new Sunny.UI.UIStyleManager(this.components);
this.uiNavBar1 = new Sunny.UI.UINavBar();
this.uiAvatar1 = new Sunny.UI.UIAvatar();
@ -51,32 +56,63 @@
// uiContextMenuStrip1
//
this.uiContextMenuStrip1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(243)))), ((int)(((byte)(249)))), ((int)(((byte)(255)))));
this.uiContextMenuStrip1.Font = new System.Drawing.Font("宋体", 12F);
this.uiContextMenuStrip1.Font = new System.Drawing.Font("Tahoma", 12F);
this.uiContextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.ToolStripMenuItem,
this.ToolStripMenuItem1});
this.NHome,
this.NAbout,
this.toolStripMenuItem1,
this.NZhCN,
this.NZhTW,
this.NEnUS});
this.uiContextMenuStrip1.Name = "uiContextMenuStrip1";
this.uiContextMenuStrip1.Size = new System.Drawing.Size(107, 48);
this.uiContextMenuStrip1.Size = new System.Drawing.Size(143, 130);
//
// 关于ToolStripMenuItem
// NHome
//
this.ToolStripMenuItem.Name = "关于ToolStripMenuItem";
this.ToolStripMenuItem.Size = new System.Drawing.Size(106, 22);
this.ToolStripMenuItem.Text = "主页";
this.ToolStripMenuItem.Click += new System.EventHandler(this.ToolStripMenuItem_Click);
this.NHome.Name = "NHome";
this.NHome.Size = new System.Drawing.Size(142, 24);
this.NHome.Text = "主页";
this.NHome.Click += new System.EventHandler(this.ToolStripMenuItem_Click);
//
// 关于ToolStripMenuItem1
// NAbout
//
this.ToolStripMenuItem1.Name = "关于ToolStripMenuItem1";
this.ToolStripMenuItem1.Size = new System.Drawing.Size(106, 22);
this.ToolStripMenuItem1.Text = "关于";
this.ToolStripMenuItem1.Click += new System.EventHandler(this.ToolStripMenuItem1_Click);
this.NAbout.Name = "NAbout";
this.NAbout.Size = new System.Drawing.Size(142, 24);
this.NAbout.Text = "关于";
this.NAbout.Click += new System.EventHandler(this.ToolStripMenuItem1_Click);
//
// toolStripMenuItem1
//
this.toolStripMenuItem1.Name = "toolStripMenuItem1";
this.toolStripMenuItem1.Size = new System.Drawing.Size(139, 6);
//
// NZhCN
//
this.NZhCN.Name = "NZhCN";
this.NZhCN.Size = new System.Drawing.Size(142, 24);
this.NZhCN.Text = "简体中文";
this.NZhCN.Click += new System.EventHandler(this.NZhCN_Click);
//
// NZhTW
//
this.NZhTW.Name = "NZhTW";
this.NZhTW.Size = new System.Drawing.Size(142, 24);
this.NZhTW.Text = "繁体中文";
this.NZhTW.Click += new System.EventHandler(this.NZhTW_Click);
//
// NEnUS
//
this.NEnUS.Name = "NEnUS";
this.NEnUS.Size = new System.Drawing.Size(142, 24);
this.NEnUS.Text = "English";
this.NEnUS.Click += new System.EventHandler(this.NEnUS_Click);
//
// StyleManager
//
this.StyleManager.DPIScale = true;
this.StyleManager.GlobalFont = true;
this.StyleManager.GlobalFontName = "Tahoma";
this.StyleManager.MultiLanguageSupport = true;
//
// uiNavBar1
//
@ -92,7 +128,7 @@
this.uiNavBar1.MenuSelectedColor = System.Drawing.Color.FromArgb(((int)(((byte)(250)))), ((int)(((byte)(250)))), ((int)(((byte)(250)))));
this.uiNavBar1.MenuStyle = Sunny.UI.UIMenuStyle.White;
this.uiNavBar1.Name = "uiNavBar1";
this.uiNavBar1.Size = new System.Drawing.Size(1096, 126);
this.uiNavBar1.Size = new System.Drawing.Size(1128, 126);
this.uiNavBar1.TabIndex = 1;
this.uiNavBar1.Text = "uiNavBar1";
this.uiNavBar1.MenuItemClick += new Sunny.UI.UINavBar.OnMenuItemClick(this.uiNavBar1_MenuItemClick);
@ -101,7 +137,7 @@
//
this.uiAvatar1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.uiAvatar1.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.uiAvatar1.Location = new System.Drawing.Point(1016, 33);
this.uiAvatar1.Location = new System.Drawing.Point(1048, 33);
this.uiAvatar1.MinimumSize = new System.Drawing.Size(1, 1);
this.uiAvatar1.Name = "uiAvatar1";
this.uiAvatar1.Size = new System.Drawing.Size(60, 60);
@ -126,13 +162,13 @@
this.uiPanel1.Controls.Add(this.uiPanel2);
this.uiPanel1.Dock = System.Windows.Forms.DockStyle.Bottom;
this.uiPanel1.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.uiPanel1.Location = new System.Drawing.Point(2, 734);
this.uiPanel1.Location = new System.Drawing.Point(2, 812);
this.uiPanel1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.uiPanel1.MinimumSize = new System.Drawing.Size(1, 1);
this.uiPanel1.Name = "uiPanel1";
this.uiPanel1.RadiusSides = Sunny.UI.UICornerRadiusSides.None;
this.uiPanel1.RectSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.Top;
this.uiPanel1.Size = new System.Drawing.Size(1096, 32);
this.uiPanel1.Size = new System.Drawing.Size(1128, 32);
this.uiPanel1.TabIndex = 3;
this.uiPanel1.Text = null;
this.uiPanel1.TextAlignment = System.Drawing.ContentAlignment.MiddleCenter;
@ -147,7 +183,7 @@
this.uiPanel4.Name = "uiPanel4";
this.uiPanel4.RadiusSides = Sunny.UI.UICornerRadiusSides.None;
this.uiPanel4.RectSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.Top;
this.uiPanel4.Size = new System.Drawing.Size(524, 32);
this.uiPanel4.Size = new System.Drawing.Size(556, 32);
this.uiPanel4.TabIndex = 2;
this.uiPanel4.Text = null;
this.uiPanel4.TextAlignment = System.Drawing.ContentAlignment.MiddleCenter;
@ -156,9 +192,10 @@
//
this.uiPanel3.Dock = System.Windows.Forms.DockStyle.Right;
this.uiPanel3.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.uiPanel3.Location = new System.Drawing.Point(810, 0);
this.uiPanel3.Location = new System.Drawing.Point(842, 0);
this.uiPanel3.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.uiPanel3.MinimumSize = new System.Drawing.Size(1, 1);
this.uiPanel3.MultiLanguageSupport = false;
this.uiPanel3.Name = "uiPanel3";
this.uiPanel3.RadiusSides = Sunny.UI.UICornerRadiusSides.None;
this.uiPanel3.RectSides = ((System.Windows.Forms.ToolStripStatusLabelBorderSides)((System.Windows.Forms.ToolStripStatusLabelBorderSides.Left | System.Windows.Forms.ToolStripStatusLabelBorderSides.Top)));
@ -174,6 +211,7 @@
this.uiPanel2.Location = new System.Drawing.Point(0, 0);
this.uiPanel2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.uiPanel2.MinimumSize = new System.Drawing.Size(1, 1);
this.uiPanel2.MultiLanguageSupport = false;
this.uiPanel2.Name = "uiPanel2";
this.uiPanel2.RadiusSides = Sunny.UI.UICornerRadiusSides.None;
this.uiPanel2.RectSides = ((System.Windows.Forms.ToolStripStatusLabelBorderSides)((System.Windows.Forms.ToolStripStatusLabelBorderSides.Top | System.Windows.Forms.ToolStripStatusLabelBorderSides.Right)));
@ -189,12 +227,15 @@
this.uiNavMenu1.DrawMode = System.Windows.Forms.TreeViewDrawMode.OwnerDrawAll;
this.uiNavMenu1.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.uiNavMenu1.FullRowSelect = true;
this.uiNavMenu1.HotTracking = true;
this.uiNavMenu1.ItemHeight = 35;
this.uiNavMenu1.Location = new System.Drawing.Point(2, 162);
this.uiNavMenu1.Name = "uiNavMenu1";
this.uiNavMenu1.ShowLines = false;
this.uiNavMenu1.ShowOneNode = true;
this.uiNavMenu1.Size = new System.Drawing.Size(286, 572);
this.uiNavMenu1.ShowPlusMinus = false;
this.uiNavMenu1.ShowRootLines = false;
this.uiNavMenu1.Size = new System.Drawing.Size(286, 650);
this.uiNavMenu1.TabIndex = 4;
this.uiNavMenu1.TipsFont = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
//
@ -209,7 +250,7 @@
this.uiTabControl1.MainPage = "";
this.uiTabControl1.Name = "uiTabControl1";
this.uiTabControl1.SelectedIndex = 0;
this.uiTabControl1.Size = new System.Drawing.Size(810, 572);
this.uiTabControl1.Size = new System.Drawing.Size(842, 650);
this.uiTabControl1.SizeMode = System.Windows.Forms.TabSizeMode.Fixed;
this.uiTabControl1.TabIndex = 5;
this.uiTabControl1.TabVisible = false;
@ -222,20 +263,23 @@
// FMain
//
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
this.ClientSize = new System.Drawing.Size(1100, 768);
this.ClientSize = new System.Drawing.Size(1132, 846);
this.CloseAskString = "您确认要退出程序吗?";
this.Controls.Add(this.uiTabControl1);
this.Controls.Add(this.uiNavMenu1);
this.Controls.Add(this.uiPanel1);
this.Controls.Add(this.uiNavBar1);
this.ExtendBox = true;
this.ExtendMenu = this.uiContextMenuStrip1;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.IconImage = global::Sunny.UI.Demo.Properties.Resources.Sunny24;
this.MainTabControl = this.uiTabControl1;
this.Name = "FMain";
this.Padding = new System.Windows.Forms.Padding(2, 36, 2, 2);
this.Resizable = true;
this.ShowDragStretch = true;
this.ShowRadius = false;
this.Text = "Form1";
this.ZoomScaleRect = new System.Drawing.Rectangle(15, 15, 800, 450);
this.ZoomScaleRect = new System.Drawing.Rectangle(15, 15, 1132, 846);
this.HotKeyEventHandler += new Sunny.UI.HotKeyEventHandler(this.Form1_HotKeyEventHandler);
this.PageSelected += new Sunny.UI.OnUIPageChanged(this.Form1_PageSelected);
this.ReceiveParams += new Sunny.UI.OnReceiveParams(this.Form1_ReceiveParams);
@ -249,8 +293,8 @@
#endregion
private UIContextMenuStrip uiContextMenuStrip1;
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem1;
private System.Windows.Forms.ToolStripMenuItem NHome;
private System.Windows.Forms.ToolStripMenuItem NAbout;
private UIStyleManager StyleManager;
private UINavBar uiNavBar1;
private UIPanel uiPanel1;
@ -262,5 +306,9 @@
private UIPanel uiPanel3;
private System.Windows.Forms.Timer timer1;
private UIPanel uiPanel4;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem1;
private System.Windows.Forms.ToolStripMenuItem NZhCN;
private System.Windows.Forms.ToolStripMenuItem NZhTW;
private System.Windows.Forms.ToolStripMenuItem NEnUS;
}
}

View File

@ -5,12 +5,23 @@ using System.Windows.Forms;
namespace Sunny.UI.Demo
{
/// <summary>
/// WindowsXP、Windows7、Windows10、Windows11 建议使用 UIForm
/// Windows10、Windows11 可尝试使用 UIForm2更接近原生窗体使用体验用 UIForm 也可以
/// </summary>
public partial class FMain : UIForm
{
public FMain()
{
InitializeComponent();
//关联窗体承载多页面框架的容器UITabControl
//窗体上如果只有一个UITabControl也会自动关联超过一个需要手动关联
this.MainTabControl = uiTabControl1;
uiNavBar1.TabControl = uiTabControl1;
uiNavMenu1.TabControl = uiTabControl1;
//设置初始页面索引(关联页面,唯一不重复即可)
int pageIndex = 1000;
//uiNavBar1设置节点也可以在Nodes属性里配置
@ -86,22 +97,25 @@ namespace Sunny.UI.Demo
var styles = UIStyles.PopularStyles();
foreach (UIStyle style in styles)
{
uiNavBar1.CreateChildNode(uiNavBar1.Nodes[4], style.DisplayText(), style.Value());
uiNavBar1.CreateChildNode(uiNavBar1.Nodes[4], style.Description(), style.Value());
}
var node = uiNavBar1.CreateChildNode(uiNavBar1.Nodes[4], "多彩主题", UIStyle.Colorful.Value());
var node = uiNavBar1.CreateChildNode(uiNavBar1.Nodes[4], "字体图标", 99999);
uiNavBar1.SetNodeSymbol(node, 558426);
node = uiNavBar1.CreateChildNode(uiNavBar1.Nodes[4], "多彩主题", UIStyle.Colorful.Value());
uiNavBar1.SetNodeSymbol(node, 558295);
//左侧导航主节点关联页面
uiNavMenu1.CreateNode(AddPage(new FColorful()));
uiNavMenu1.CreateNode(AddPage(new FSymbols(), 99999));
uiNavMenu1.CreateNode(AddPage(new FColorful(), UIStyle.Colorful.Value()));
//直接增加一个页面,不在左侧列表显示
//AddPage(new FColorful());
AddPage(new FCommon());
//选中第一个节点
uiNavMenu1.SelectPage(1002);
uiPanel2.Text = Text = Version;
//设置全局热键
RegisterHotKey(UI.ModifierKeys.Shift, Keys.F8);
//根据页面类型获取页面
@ -136,7 +150,7 @@ namespace Sunny.UI.Demo
{
case 4:
UIStyle style = (UIStyle)pageIndex;
if (style != UIStyle.Colorful)
if (pageIndex < UIStyle.Colorful.Value())
StyleManager.Style = style;
else
uiNavMenu1.SelectPage(pageIndex);
@ -163,11 +177,16 @@ namespace Sunny.UI.Demo
Process.Start("https://gitee.com/yhuse/SunnyUI");
}
/// <summary>
/// 全局热键事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_HotKeyEventHandler(object sender, HotKeyEventArgs e)
{
if (e.hotKey.ModifierKey == UI.ModifierKeys.Shift && e.hotKey.Key == Keys.F8)
{
ShowInfoTip("您按下了全局系统热键 Shift+F8");
this.ShowInfoTip("您按下了全局系统热键 Shift+F8");
}
}
@ -181,5 +200,56 @@ namespace Sunny.UI.Demo
{
uiPanel3.Text = DateTime.Now.DateTimeString();
}
private void NZhCN_Click(object sender, EventArgs e)
{
UIStyles.CultureInfo = CultureInfos.zh_CN;
}
private void NZhTW_Click(object sender, EventArgs e)
{
UIStyles.CultureInfo = CultureInfos.zh_TW;
}
private void NEnUS_Click(object sender, EventArgs e)
{
UIStyles.CultureInfo = CultureInfos.en_US;
}
/// <summary>
/// 重载多语翻译
/// </summary>
public override void Translate()
{
//必须保留
base.Translate();
//读取翻译代码中的多语资源
CodeTranslator.Load(this);
//设置多语资源
this.CloseAskString = CodeTranslator.Current.CloseAskString;
this.uiNavMenu1.Nodes[0].Text = this.uiNavBar1.Nodes[0].Text = CodeTranslator.Current.Controls;
this.uiNavMenu1.Nodes[1].Text = this.uiNavBar1.Nodes[1].Text = CodeTranslator.Current.Forms;
this.uiNavMenu1.Nodes[2].Text = this.uiNavBar1.Nodes[2].Text = CodeTranslator.Current.Charts;
this.uiNavMenu1.Nodes[3].Text = this.uiNavBar1.Nodes[3].Text = CodeTranslator.Current.Industrial;
this.uiNavBar1.Nodes[4].Text = CodeTranslator.Current.Theme;
this.uiNavMenu1.Nodes[4].Text = CodeTranslator.Current.Symbols;
this.uiNavMenu1.Nodes[5].Text = CodeTranslator.Current.Colorful;
this.uiNavBar1.Invalidate();
this.uiNavMenu1.Invalidate();
}
private class CodeTranslator : IniCodeTranslator<CodeTranslator>
{
public string CloseAskString { get; set; } = "您确认要退出程序吗?";
public string Controls { get; set; } = "控件";
public string Forms { get; set; } = "窗体";
public string Charts { get; set; } = "图表";
public string Industrial { get; set; } = "工控";
public string Theme { get; set; } = "主题";
public string Symbols { get; set; } = "字体图标";
public string Colorful { get; set; } = "多彩主题";
}
}
}

View File

@ -123,6 +123,747 @@
<metadata name="StyleManager.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>506, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAcAMDAAAAEACACoDgAAdgAAACAgAAABAAgAqAgAAB4PAAAQEAAAAQAIAGgFAADGFwAASEgAAAEA
IACIVAAALh0AADAwAAABACAAqCUAALZxAAAgIAAAAQAgAKgQAABelwAAEBAAAAEAIABoBAAABqgAACgA
AAAwAAAAYAAAAAEACAAAAAAAAAkAAAAAAAAAAAAAAAEAAAABAAAAAAAANcJlADnDZgA9w2kAQcNpAEbF
cABKxnIATch1AFPFcwBcxHMAUsp6AFnLfgD/njwA/6A/AP+eQAD/oEUA/6NLAP+nVwD/qVcA/6laAP+s
YgD+sWsA/rNyAP64dgD+unoANWf3ADZp9wA6a/cANmn4ADlq+AA7bPgAPGz4AEFv9wBAbvgARnL3AENw
+ABFcfgASXX4AEx3+ABOefgAUnv4AGPNhAB7yIIAbtGOAHPQjwB005MAf9SZADag5wA5oucAO6PoAF+E
9wBZgPgAXoT4AGuO+ABsjfgAcZH4AHWT+ABylPgAd5n4AHia+ABEpecARKXoAEim6ABNqekAV63pAF2s
6wBdsOoAYrDqAGu16wBvuOwAdLrsAHm77AAAxf8AC8X/ABvH/wARyP8AHMj/ACPJ/wAryv8AMsz/AD7N
/wBG0f8AStH+AFPW/wBd1v4AYtb+AGbY/gBs2P4Ae9r+AJeRjQCYko8AmZOQAJqUkQCclZMAnZeUAJ+Z
lgCinZoApJ6cAKahngCoop8Ap6OgAKqlogCtqaYAtLCuALazsQC7t7YAvLm2AL26uAD+vYQA/r+KAIbG
gwCay5EAgdecAKXMlACL16IAi9iiAJXYpQCX26sAmNusALfSpACl37YAuN+8ALDjvwD+wIwA/8OSAP7G
mAD+yJwAwNOpAMzTrADCwL4Ay9m1AP7LowD+z6kA/tCuAP7TsgD+1rgA/ti+AIKd+QCGvu8Ag6D4AI+m
+QCSqvkAlav5AJOs+QCWrPoAmK74AKK1+gCsvPkAtuPCALrlxQC85cgAg8LuAIzD7gCQw+8AjsLwAJ7M
8ACC3/4Ai93+AKTM8QCtz/MAs8L6ALnF+QC/zPsAptDxAK7T8gCz1PIAleH+AJ3i/gCk4v4Arub+ALbp
/QC56f4AxcPBAMnGxQDLyMYAzMrIANLQzgDT0dAA1tXVANnY1gDa2dkA3dzbAOXexAD928MA/t/JAM3r
1QDY798A2vDfAObhygDq488A/uHMAOHg3gD76dwAwMz6AMnc9gDG0foAytP8ANTa+gDd9OUAx+D2AMzh
9QDP4PgAxOr9AMzu/QDS4/YA2On3AN3j+gDY5fgA0u/+AM7w/QDc8v0A5uXlAOjn5wDp6ekA7OvpAO7s
6wDu7ewA9O7jAP3t4wDw7u4A/e7oAOD15gDl9eoA6/btAPbx7AD78e0A4eX6AOTu+QDq7PsA7O77AO7v
/ADu9/AA5vP7AOvz+wDu+P0A8vHxAPP38QD09PMA9fX1APv18wDz+fQA+Pj3APDy+wD19voA8fL8APD3
/QD19vwA9/n4APb4/AD5+voA/Pr6APz8+wD5+vwA/fv8APr8/QD///8AAAAAAAAAAAAAAAAAAAAAAAAA
AAD9/f39/f39/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP39/f39+OX0/e3x/f39
/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/fTOopE5NTSP62dmZ6yx1e39/QAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA/f30w400JSAcHRk61WJbWlxfZGu07f39AAAAAAAAAAAAAAAAAAAAAAAA
AAAAAP396aE1IxwdHR0dHR071WJcXFxcXFtcZrHb/QAAAAAAAAAAAAAAAAAAAAAAAAAA/f3OiSYdHR0d
IR0jHR0762JcXFxcXFxcXF9n1P39AAAAAAAAAAAAAAAAAAAAAAD9+JM0Gh0dIR0dIR0dHR071WVcXFxc
XFxcXFxbYa3x/QAAAAAAAAAAAAAAAAAAAP34oCYdHR0dISEdHSMdIxw722JcXFxcXFxcXFxcXFyv7f0A
AAAAAAAAAAAAAAAA/fiPIx0dHSMdHSEhHR0hHR071WVcXF1dXVxcXFxcXFxcae39AAAAAAAAAAAAAAD9
+KAlHR0hHR0jHR0hIR0dHR0722JcXVxcXF1dXVxcXFxcXK/4/QAAAAAAAAAAAP39oCgdHSEdIR0dIR0d
ISEdIxw71WVcXF1dXVxcXF1dXFxcXF+t/QAAAAAAAAAAAP30OR0dIR0dIR0hHSEdHSEdHR0722JcXFxc
XF1dXVxcX1xcXFxh0/0AAAAAAAAA/f3pxY8oHR0hHSEdIR0hHSEhHR071WVcXF1dXVxcXF1cXF9cXFxm
0/39AAAAAAAA/ciZzOWiOSEdHR0jHSEdIR0hHR0722JcXFxcXF1dXVxdXFxcYa7VwMD9AAAAAAD9+EYw
P4rO6aA5Ix0dIR0hHR0dHSWL22VcW1xcXVxcXFxcXGGs1NqDEhbv/QAAAAD9zD8wMDFDnuXikDQdHR0h
HR00i6HF/bNpZVxcXF1dXVtcaLTrtxYPDA+3/QAAAP34mzAxMTEwPUOf6eKPKB0dM5Ll/f39/f397a9l
W1xcXGez4bgWDwwNDAx77wAAAP3oRTAxMTExMDE+isLlxDk0ovj9/f39/f39/f20YltirdvAfBINDQ0N
DQwUwP0AAP3HPzExMTExMT0xMD6ayeXO/f39AAAAAAAA/f39v6/V2n0TDA0NDQ0NDQwQh/0AAP2fPzEx
MTE9MTExMTA8Qcz9/f0AAAAAAAAAAP39/e+HFg8MDA0NDQ0NDQ4Pff0A/f2XMDExMTExMTExMTEwP+j9
/QAAAAAAAAAAAAD9/e8UDAwPDQ0NDQ0NDQ0MF/0A/f1GMDExMTExMTExMTEwl/39AAAAAAAAAAAAAAAA
/f1sDQ0NDQ0NDQ0NDQ0MFu/9/f1FMDExMT0xMTE9MTE8m/39AAAAAAAAAAAAAAAA/f2HEAwPDQ0NDQ0N
DQ0MFOH9/fhEMDExMTExMTExMTE/n/39AAAAAAAAAAAAAAAA/f2HEQwNDQ0NDQ0NDQ0MFNr9/fhFMDEx
MTExMTExMTE/n/39AAAAAAAAAAAAAAAA/f2HEQwNDQ0NDQ0NDQ0MFNz9/f1FMDExMTE9MTExMTE9m/39
AAAAAAAAAAAAAAAA/f2HDwwNDQ0NDQ0NDQ0MFO/9/f1GMDExMTExMTExMTEwRv39/QAAAAAAAAAAAAAA
/f1+EAwMDw0NDQ0NDQ0MFu8A/f2YMTExPTExMTE9MTA/mPj9/QAAAAAAAAAAAAD9/f3ahhMODA0NDQ0N
DQ0MGP0AAP2lPzExMTExMTExP0bM6Mrq/f0AAAAAAAAAAP398XmC2dqEEw4MDA8NDQwPg/0AAP3MPzEx
MTExMTBCpenRV06m/f39AAAAAAAA/f39lAoIb7zhuHsQDAwNDwwQt/0AAP3qRjAxMTE8QqTp0VhMSEhL
pur9/f39/f39/ed6BQEBAQlxveG4bBAMDAwW2v0AAP34mzAxMD+YzOinT0lISEhITFfQ/f39/f39u3MH
AQICAwIEKn/a2oYUDAx88QAAAAD90j88l8jqqVBJSEhISEhISEhNUp2r8XgrBwECAgICAgIDAQNugNrh
gxa4/QAAAAD9/Zuk6dFUTEhISEhISEhISEhISElUxgoBAQICAgICAgICAgIDCHG23Nrx/QAAAAAA/f3S
VkxISEhISEhISEhISEhISEhTxgsBAgICAgICAgICAgICAgEJd+v9AAAAAAAA/fioSEhISEhISEhISEhI
SEhISEhTxgsBAgICAgICAgICAgICAgIBdOz9AAAAAAAAAP3qUkhISEhISEhISEhISEhISEhTxgsBAgIC
AgICBAICAgICAgIp3f0AAAAAAAAAAP39q09ISEhISEhISEhISEhISEhTxgsBAgICBAICAgICBAICAgd6
/QAAAAAAAAAAAAD9/cpNSEhISEhISEhISEhISEhTxgsBAgICAgICAgQCAgICB5X98QAAAAAAAAAAAAAA
/finTUhISEhISEhISEhISEhTxgsBAgICAgQCAgICAgIGdfH9AAAAAAAAAAAAAAAAAP39yk9ISEhISEhI
SEhISEhTxgsBAgICAgICAgICAgqV8f0AAAAAAAAAAAAAAAAAAAD9/atSSEhISEhISEhISEhTxgsBAgIC
BAICBAICK5Xx/QAAAAAAAAAAAAAAAAAAAAAA/f34pk5ISEhISEhISEhTxgsBAgICAgICAgt13/39AAAA
AAAAAAAAAAAAAAAAAAAAAP39+NFXTUhISEhISEhTxgsBAgICAgEHLrnx/QAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAA/f390qdUTUxJSEhTxgoBAgcHLHi78f39AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/f3o
yqlYU1Gc3nAtc5S53v39/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/f39/f39/fj9/f39
/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/f39/f39AAAAAAAAAAAAAAAAAAAA
AAAAAAAA///wD///AAD//wAB//8AAP/8AAA//wAA//AAAA//AAD/wAAAB/8AAP+AAAAB/wAA/wAAAAD/
AAD+AAAAAH8AAPwAAAAAPwAA+AAAAAAfAADwAAAAAB8AAPAAAAAADwAA4AAAAAAHAADgAAAAAAcAAMAA
AAAAAwAAwAAAAAADAACAAAAAAAMAAIAAAAAAAQAAgAAH4AABAACAAA/wAAEAAAAAH/gAAQAAAAA//AAA
AAAAAD/8AAAAAAAAP/wAAAAAAAA//AAAAAAAAD/8AAAAAAAAH/wAAQAAAAAf+AABAACAAA/wAAEAAIAA
B+AAAQAAgAAAAAABAACAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADgAAAAAAcAAOAAAAAABwAA8AAAAAAP
AADwAAAAAB8AAPgAAAAAHwAA/AAAAAA/AAD+AAAAAH8AAP8AAAAA/wAA/4AAAAH/AAD/wAAAB/8AAP/w
AAAP/wAA//wAAD//AAD//4AB//8AAP//+B///wAAKAAAACAAAABAAAAAAQAIAAAAAAAABAAAAAAAAAAA
AAAAAQAAAAEAAAAAAAA2wmUAOcJlADzDZwA7w2gAPcJoAD3EaQA/xGwAQcVtAEXGbwBGxnAAVcVzAFzF
dQByx34A/549AP+gPwD/n0AA/6BBAP+gRAD+okoA/qRMAP6nVAD+qFQA/qteAP6sXgD+r2cA/rRvAP62
dQA3afcAOGn3ADlq+AA8a/gAPGz4AEFw9wBGc/gAS3f4AFZ++ABgzIIAac6IAHjNiwBt0Y4AcNGPADmi
5wA8o+cAO6PoAD2j6AA/pOgAWoH4AFyD+ABehPgAYYj3AGKJ+ABlifgAZ4z4AGuP+ABukPgAcJL4AHyb
+ABBpOcARaboAEqo6ABTq+kAXq/qAGSx6wBntesAabXrAHy/7QAAxf8ABsX/AAvF/wAMxv8AEsf+ABXH
/wAZyf4AKcv+ADjP/gA30P8APtD+AEDP/gBK0v4ATtL+AFrW/gCZk5AAmpSRAJyWkwCdl5QAnpiVAKKc
mQCloJ0Ap6OgAKijoQCppaIAr6uoALm2swC6trQAvru5AP2+hgDAvLoAls+WAKTRnACc3rAApN+2AKPg
tgCj4LgAqeK7AK7hvQC74L4A/cCKAP7CjgD+xJIA/ceYAP7KnwDJ27kA/c2mAP3RqgD70q4A/dOuAP3X
twCKpPkAjaf5AJOs+QCVrvkApbn5AKi8+QCv5sEAsebCALrmxwCBwO4AiMLvAJfH8ACXyfAAmMrwAJvM
8ACczfEAgt39AInf/gCc0PMAoM7xALHC+gCwxPkAt8b5AKvT8gCx1/MAtdfzALXU9AC81/UAutnzAL3d
9QCK4P0AleH9AJni/QCd5f0Ao+H8ALDn/ADEwcAAx8TCANXOyQDQzcwA0N7AANLR0ADV09IA1tTTANfV
1ADa1NEA2NbVANrY2ADd29sA597FAPPYxAD93MIA/N3GAPDbywDp39cAyerSAM3r1QDX7t0A2e/fANbw
3gD94s4A6eDZAOzn2ADq6toA9uTTAPfl1QD85tUA/OnYAMTW9wDE3fUAydz2AMPQ+gDG0voAx9T5AMrV
+gDP2fkA3vPlAMvn+QDF7P0Ay+j5AMru/QDM7f0A0+X3ANnn9wDW6PcA2+D6ANHu/ADW8vwA3/T8AOLh
4ADl4+IA5uXkAO3r6wDv7OoA7OvsAO/t7QD17+AA8uvnAPns4QD47+QA8+7rAPDu7QDn8uUA5vPpAOb0
6gDo9OkA7fTuAO7u8wDl6voA5+z7AOnt+QDs7vsA8u/xAObx+QDh9PsA5fT6AODz/ADh9PwA7vD7APTx
8QD09/MA9fP0APX09AD59fMA/Pb1APb49gDx8/sA8vb7APH3/AD39/wA+Pf7APf4+wD1+fwA+fj5APz5
+QD6+fwA/Pr8AP///wAAAAAAAAAAAAAAAAAA5Pj4+PjmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADi5MB7
eXvRm52m1NQAAAAAAAAAAAAAAAAAAAAAAAD0wXcwIR4eMp9WUlJaX8/vAAAAAAAAAAAAAAAAAADi7Hkk
Hh4eHh40n1ZSUlJSWGHU1AAAAAAAAAAAAAAA4r00HB4eHiAeHjSfVlJSUlJSUlqk1AAAAAAAAAAAAOLA
MB4eHiAgHiAeNJ9XUlJSUlJSUlim2wAAAAAAAADkvTIeHh4gHiAgIB40pFZSUlZSUlJSUlim2wAAAAAA
APg4Hh4eICAgICAgHjSfVlJSUlZSVlZSUlrbAAAAAAD5yr13Ih4gICAgICAeNKRWUlZSUlJSUlJXXdf4
AAAAAMpBgLqLOCAgICAgICA3pFZSUlZSUlJWXKSoa7gAAADngisrPIG8ezUgICI5jMvvpF1XUlZWWqOr
YBQOa9gAAPRAKyorKz6QwXcvi/T4+Pj48Z9XVpuzbxgQDg4Y2AAAyDsqKio7KitAkeL45AAAAADv+NGs
cRgODw8PDhKqAOeQKyoqOyoqKyp/9OQAAAAAAADx8XEUEA4PDw8OEHIA+IkrKioqKjsqK5D4AAAAAAAA
AAD4dRIODw8PDxIObvj4iSsqOyoqKio7u/gAAAAAAAAAAPiyFA4PDw8PDw5r8fiJKyoqOyoqKju7+AAA
AAAAAAAA+LIUDg8PDw8PDm7x+IkrKioqKjsqK434AAAAAAAAAAD4qRIOEg8PDw8ObrnskioqOyoqOztB
u/nnAAAAAAAA7e61choSDg4SDg5yAADJPCoqKis7icOGlfjpAAAAAO34fCdwt24VDg4QErIAAPlAKys9
g8WGSkNElOv4+Pj432YGAQYNnrdrFg4Z2AAA54kuQruYUEZDQ0NHUJXG32goCQIEBAQLYqeqGm/WAAAA
55OZUUZDQ0NDQ0REREx8CQECAgQBBAQEDGO18QAAAAD4xUlDQ0NDQ0NDRERETHwGBAICAgQBBAEEBGr4
AAAAAAD5UENDQ0NDQ0NERERMfAkEBAICAgQEAQQm3wAAAAAAAOvGT0NDQ0NDQ0REREx8BgQBAgICAgIE
Ja3cAAAAAAAAAOfGT0NDQ0NDRERETHwIBAQCAgICAiWt3wAAAAAAAAAAAOvGUENDQ0NERERMfAkBBAIC
AgIprd8AAAAAAAAAAAAAAM74lkxDQ0REREx8BgQBBAYlZ9/CAAAAAAAAAAAAAAAAAAD5zpRQR0RETHwG
BggmZLDuAAAAAAAAAAAAAAAAAAAAAAAAzefGmZSXsWd+sN/CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+Pj4+AAAAAAAAAAAAAAAAAAA//gf///AA///AAD//AAAP/gAAB/wAAAP4AAAB+AAAAfAAAADwAAAA4AA
AAGAAAABgAPAAQAH4AEAD/AAAA/wAAAP8AAAD/AAAAfgAYADwAGAAAABgAAAAcAAAAPAAAAD4AAAB+AA
AAfwAAAP+AAAH/wAAD//AAD//8AD///8P/8oAAAAEAAAACAAAAABAAgAAAAAAAABAAAAAAAAAAAAAAAB
AAAAAQAAAAAAADnDZgA6xGcAPcRpAErFbgBex3gA/58+AP+gPwD/oEEA/qhUAP6rWgD+r2MA/rNtADtr
9wA9bfcAO2v4ADxs+ABNevgAUXz4AFd/+ABezYIActKRAHXTkwB41pcAOqPnADuj6AA8o+gAPaToAFiA
+ABpjfgAcJL5AHSV+QBApegARqfoAF2x6wBhs+sAcrrtAADF/wAHxv8AG8r/ABzL/wAvzv4AOM/+AEvT
/gBX1f4AWdb+AHHb/gCalJEAnJaUAKCalwCmoZ8AsKyqALq2swC7trQAvbe0AI/bpwCt1qcA+MqcAMrA
uQDxyaUA79KrAIC+7wCZsfoApLz4ALnnxwCGxO8Aldr5AKfE9gCuwPoAq+n9ALPm+wDKx8UA0c/OAMHk
xQD8480A/OTOAPLj1gD65NIA/OvdAPzs3wDH3vYA0dr7AMXg9QDR5/cA3+b7ANvr+ADc7fkAz/H9ANby
/QDp7+IA6+rpAO3s7AD97eIA4vTnAOb26wDl6/wA7fjwAOfy+gDi9v0A6fP6AO3x/ADr+P0A8vLxAPD3
+wDy9fwA8fr9APb6/AD5+fgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAA////AAAAAAAAZFRRWloAAAAAAAAAAABoRBwOETUwMkgAAAAAAABkHg4PDxE1MDAwM2YAAABq
Hg8PDw8RNTAvMC8zAAAAUkMdDw8OEjUvLy8xOk0AaCIgPT8SPl9mRzA1OwkKAGEbGxshUGgAAGtMCwYH
CE5TGBsbG1YAAAAAXAgHBwZKUxgbGxtWAAAAAFwICAcGSmQYGxtBRmoAAGtJPAoGCE5qIyRCKSUuWF03
AgQ4OQwAAFYrJSUlJSgXAgICAgVZAABqLCUlJSUoFwICAgIVAAAAAGUtJSUlKBcCAgIVYAAAAAAAAEUq
JSgXAxRAAAAAAAAAAAAAAGFXXV4AAAAAAAD4PwAA4A8AAMADAACAAwAAgAEAAAABAAABgAAAA8AAAAPA
AAABgAAAAAEAAIABAACAAwAAwAMAAPAPAAD8PwAAKAAAAEgAAACQAAAAAQAgAAAAAABgVAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPn5
/QL9/f0h/f39Pv39/VX9/f1p/v39ef79/X/+/f2A/f39gP39/YD9/f2A/f39fv39/XT9/f1j/f39Tf39
/TP7+/sWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP39/RP9/f1B/f39av7+/Y/+/v2w/v79zf//
/eX//v34///9/////f////3///79//39/f///v7////////////+/v/y/v7+3P7+/sL+/v6l/v7+g/39
/V39/f0y+/v7CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAPv7/Qf9/f04/f39cP39/aP+/v3R///99////f////7////9/////f/5+fv/7O77/+Hk
+//h4/r/7/H9///////18/P/6efn//Hx7//4+Pj//v39//////////////////7+/uz+/v7C/v7+k/39
/V39/f0kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD7+/0M/f39SP39
/Yz+/v3I///9+P///f////3/+vn9/+Xn+//R1/r/sMH5/5Su+f+Oqfr/g5/5/3eV+f9ykfn/u8r7////
///Z19X/sKup/7m2s//Bvrv/xsLB/9HPzv/d3Nz/6unp//n4+f////////////7+/uv+/v60/v7+dvv7
+zAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+/39Bv39/UP9/f2S/v792f///f////3/+vr7/+Pm
+/+8yPr/k6v5/3uY+f9oiPj/R3L2/zBl+P80Zvj/NGf4/zRn+P8rYfb/mbL6///////Lx8X/kouI/5aQ
jP+XkI3/lY+L/5qVkv+oo6H/tK+t/8G9vP/U0tH/6Ojo//n4+f//////////+f7+/sH+/f53/fv7KQAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD9/f0o/f39f/79/dP///3////9//j4+//N1fr/m7D6/3iV+f9Tefj/NWf2/zRn
+P83afj/Omv4/zpr+P86a/j/Omz4/zpr+P8xZfb/nLX6///////Nycb/lY+L/5qUkf+alJH/mpSR/5mT
kP+Yko//l5GO/5WPjP+empf/sq6s/8PAv//c2tn/9vX2///////////4/f7+uf3+/WH9+/sTAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/f39Cf39
/VP9/f23//79+f///f/4+Pv/ztX6/5it+f9ihfj/PGv4/zRn+P83avj/Omv4/zps+P88bPj/PGz4/zxs
+P88bPj/PGz4/zpr+P8yZvj/nLX6///////Nycb/lo+M/5qUkf+blZL/m5WS/5uVkv+alJH/mpSR/5qU
kf+Zko//l5GN/5eRjv+moZ7/wL27/9za2f/29fX///////7//+n9/f2V/f39MwAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/f0b/f39e/39/d7///3////9/9zg
+/+dsPr/YoX4/zxr+P81afj/Omv4/zps+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs+P88bPj/PGz4/zpr
+P8yZfj/nLX6///////Nycb/lo+M/5qUkf+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+blZL/mpWS/5qU
kf+Yko//l5KO/6ahnv/Cvbv/4+Hg//v9/f///////v7+wv39/VX7+/sIAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP39/Sz9/f2d/v798////f/19fv/uMb5/2+P+f9Bbvj/NGj4/zpr
+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs+P88bPj/PGz4/zpr+P8yZfj/nLX6////
///Nycb/lo+M/5qUkf+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+blZL/mpSR/5iS
jv+Yko//rKel/9HPzv/z8fH///////7+/t39/f1y+/v7EwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAA/f39N/39/bL///3+///9/+Pm+/+brvn/Unv4/zJm9v84a/j/PGz4/zxs+P88bPj/PGz4/zxs
+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs+P88bPj/PGz4/zpr+P8yZfj/nLX6///////Nycb/lo+M/5qU
kf+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+Zk5D/lpCN/6Ca
mP+/u7n/5uXl///+///////s/f39h/v7+xoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/f07/f39vP//
/f////3/3OL7/4ad+f9Db/j/NWn4/zps+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs
+P88bPj/PGz4/zxs+P88bPj/PGz4/zpr+P8yZfj/nLX6///////Nycb/lo+M/5qUkf+blZL/m5WS/5uV
kv+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+blZL/mpSR/5iSj/+Zk5D/sa2r/+Df
3v/+/v3/////9P39/ZH7+/scAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP39/Tj9/f29///9/////f/S2fv/eJT5/z9t
+P83avj/PGz4/zxs+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs
+P88bPj/PGz4/zpr+P8yZfj/nLX6///////Nycb/lo+M/5qUkf+blZL/m5WS/5uVkv+blZL/m5WS/5uV
kv+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+Zk5D/l5GO/6yopf/b2dj/+vr6////
//b9/f2Q+/v7GQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA/f39Lf39/bT///3////9/8/Y+/9vjvn/Omn4/zhr+P88bPj/PGz4/zxs
+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs+P88bPj/PGz4/zpr
+P8yZfj/nLX6///////Nycb/lo+M/5qUkf+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+blZL/m5WS/5uV
kv+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+blZL/mpOQ/5aRjf+noqH/2NbW//v7+//////y/f39g/v7
+xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAD9/f0d/f39oP/+/f////3/2N37/3WS+f86avj/OGv4/zxs+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs
+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs+P88bPj/PGz4/zpr+P8yZfj/nLX6////
///Nycb/lo+M/5qUkf+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+blZL/m5WS/5uV
kv+blZL/m5WS/5uVkv+blZL/m5WS/5qUkf+WkIz/qKOh/9za2//+/v7/////6v39/Wz6+voEAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP39/Qv9/f1//v799v//
/f/e4/v/gZr5/z9u+P84a/j/PGz4/zxs+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs
+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs+P88bPj/PGz4/zpr+P8yZfj/nLX6///////Nycb/lo+M/5qU
kf+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+blZL/m5WS/5uV
kv+blZL/m5WS/5uVkv+alJH/lpCN/62opv/h4OD//v////7+/tj9/f1NAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP39/Vj+/v3h///9/+jq+/+Novn/QW74/zdq
+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs
+P88bPj/PGz4/zxs+P88bPj/PGz4/zpr+P8yZfj/nLX6///////Nycb/lo+M/5qUkf+blZL/m5WS/5uV
kv+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+blZL/m5WS/5uV
kv+blZL/mpOQ/5eRjv+xraz/5+fm///////9/f25/f39LAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA/f39Lf39/bz///3/9vb7/6Gz+v9EcPj/N2n4/zxs+P88bPj/PGz4/zxs
+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs
+P88bPj/PGz4/zpr+P8yZfj/nLX6///////Nycb/lo+M/5qUkf+blZL/m5WS/5uVkv+blZL/m5WS/5uV
kv+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+blZL/m5WS/5mT
kP+Zk5D/wL28//Pz9f/////9/v39ivv7+wwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAD9/f0J/f39hv39/fz///3/7Oz7/4ui+f83aPj/NGj4/zpr+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs
+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs+P88bPj/PGz4/zpr
+P8yZfj/nLX6///////Nycb/lo+M/5qUkf+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+blZL/m5WS/5uV
kv+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+YkY7/n5mX/9DO
zf/7/fv//v7/4P39/VMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/f1K/f392f/+
/f////7/+fn9/9Xa+v+Zrvn/X4L5/zpq+P83avj/Omz4/zxs+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs
+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs+P88bPj/PGz4/zpr+P8yZfj/nLX6////
///Nycb/lo+M/5qUkf+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+blZL/m5WS/5uV
kv+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+blZL/mpSR/5mTkP+XkI3/oJqY/8/NzP/6+/r//v////v7
+6r7+/odAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP39/RL9/f2a/v79//j5+//U5Pb/1OL4//76
/f/6+fv/y9P7/4+m+v9Re/j/MWb4/zhq+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs
+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs+P88bPj/PGz4/zpr+P8yZvj/nLX6///////Nycb/lo+M/5qU
kf+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+blZL/m5WS/5uV
kv+blZL/m5WS/5uVkv+Zk5D/lpCM/56Zlv+5tbP/19fX//H19v/+/////fv6//v9/fD9+/1oAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP39/VH+/f3g///9/9nn9v9+uuz/aLDs/6nN8//n6/n////9//b1
/f+6yfr/epj5/0p0+P80Z/j/Omv4/zxs+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs
+P88bPj/PGz4/zxs+P88bPj/PGz4/zpr+P8xZfb/nLX6///////Nycb/lY+L/5qUkf+blZL/m5WS/5uV
kv+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+blZL/mZOQ/5eR
jv+blZP/sayq/9DOzv/v8fP////////s4f//0rL//uTS//3////9/v6y/f37IgAAAAAAAAAAAAAAAAAA
AAAAAAAA/f39DP39/ZT//v3//vv7/6XP8f9Bo+j/MKDn/0un6f98uO7/udX1//Hx+v///v7/6+v9/629
+v9ujvn/QW/4/zVo+P86a/j/PGz4/zxs+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs
+P86a/j/Omv4/zVn+P8rYPb/mbL6///////Lx8X/k4yI/5mSj/+alJH/mpSR/5uVkv+blZL/m5WS/5uV
kv+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+blZL/m5WS/5qUkf+Yko//mJKP/6mkof/JxsX/6Onq//3/
////8+7//9Ox//+1dP//oE3//8WW//35+P/9///u/f39YwAAAAAAAAAAAAAAAAAAAAAAAAAA/f39Q/39
/dL///3/2+j4/3C26/80oOf/OqPo/zej6P83oOf/VKrq/4u+7//F2Pb/+Pb9/////v/e4fr/n7L6/2CD
+f86afj/N2r4/zps+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs+P88bPj/Omv4/zdp+P8xZvb/SXT4/2+N
+f90k/n/u8r7///////Z2Nb/q6ek/52Ylf+Vj4v/mJGO/5mTkP+alZL/m5WS/5uVkv+blZL/m5WS/5uV
kv+blZL/m5WS/5uVkv+alJH/mZOP/5eQjf+kn5z/wL27/9/f3//5/f////n4///cwv//vIT//6NO//+b
N///mzf//61l//7gzv/7/////f7+ofn4+hMAAAAAAAAAAAAAAAAAAAAA/f39e/7+/f7///3/qtLz/0Sk
6P84ouj/PKTo/zyk6P86o+j/N6Ho/zyi5/9eq+v/m8Xz/9fi+f/++v3//vv7/8zU+/+Qp/r/V374/zdo
+P83avj/Omz4/zxs+P88bPj/PGz4/zps+P83afj/PGv4/2aI+f+Oqfn/scL6/9nd+//j5fr/8fH9////
///19fP/5OPi/9PRz//Cv73/rqmn/5uUkv+YkY7/mpSR/5uVkv+blZL/m5WS/5uVkv+blZL/m5SR/5mT
kP+Wj43/n5mX/7q3tf/a2dn/9fj6///9/v//4tD//8OU//+oWv//nDr//548//+fPv//nz7//50////H
m//9+vr/+/7/2Pr6+kkAAAAAAAAAAAAAAAD9/f0e/f39rv/+/v/x9fv/hsLu/zKf5/86o+j/PKTo/zyk
6P88pOj/PKTo/zqj6P81ouf/RaXo/2ux7P+nyvP/5On6///+/f/49v3/wsz6/4Kd+f9Ldfj/Mmf4/zhr
+P88bPj/Omz4/zJn+P9Wfvn/l6z5/9DY+v/6+f3////9/////f////3///79//39/f/+/v7/////////
///5+fn/5ePj/8jFw/+oo6D/l5GO/5mTkP+blZL/m5WS/5uVkv+Zk5D/l5CO/5yWk/+xrqv/0dDQ//Hz
9v///////+zh///Mo///rWX//51B//+dOv//nz7//6A///+gP///nz///5w4//+1dv/+6d//+/////r7
+30AAAAAAAAAAAAAAAD9/f1M/v393P///v/R4/X/Z7Hq/zeh5/88pOj/PKTo/zyk6P88pOj/PKTo/zyk
6P88pOj/OKPn/zSh5/9Kpun/erbu/7fS9v/u7/v///7+/+3u+/+wwPr/cpH5/0Rw+P8yZ/j/Omv4/2aI
+f+7yPr/+fj9/////f////3//v79//79/f/9/f34/f395v39/eX9/f32/f39//7+/v/+/v7///////r5
+v/b2tj/sa2q/5qUkf+Zk5D/mpSR/5iSj/+Yko//q6ak/8zJyf/q6+z//f/////x7P//07H//7Rz//+g
R///nDj//54+//+gP///oD///6A///+gP///oD///548//+jUv//1rj/+/////r9/qv6+vobAAAAAAAA
AAD9/f12//79///+/f+m0fP/QaPn/zqj6P88pOj/PKTo/zyk6P88pOj/PKTo/zyk6P88pOj/PKTo/zqj
6P83ouj/N6Hn/1Sp6v+Mve//xdf2//Pz+/////7/4uT9/6K0+v9ghPj/cZD5/8/W+v///v3////9//7+
/f/9/f32/f39v/39/Yv9/f1q/f39WP39/Vf9/f1o/f39iP39/bz9/f3z/f39///////+//7/5eTk/7Wx
sP+Yko//lo+L/6Wfnf/BwL3/4uLi//r+////+Pb//9i7//+6f///o0///5w3//+ePP//oD///6A///+g
P///oD///6A///+gP///oD///58+//+bOv//xZT//fn5//r+/9T6+/tFAAAAAPv9/Q79/f2b///+//H1
+/+Gwu//MqDn/zqj6P88pOj/PKTo/zyk6P88pOj/PKTo/zyk6P88pOj/PKTo/zyk6P88pOj/OqPo/zei
6P8/o+f/X6vr/5nE8f/W4Pn/+vj9//v6/f/N1fr/09v6///++/////3//f39//39/df9/f17/f39L/39
/QIAAAAAAAAAAAAAAAAAAAAAAAAAAP39/Sv9/f10/f390f39/f/+/////////+Tj4v+7uLX/ure1/9ra
2f/2+v3///39///hzf//wZH//6ZU//+bN///njz//58///+gP///oD///6A///+gP///oD///6A///+g
P///oD///58+//+cOP//t3v//uri//r+//j6+/tqAAAAAP39/S/+/f2+///+/+Dq+P93uez/NKDn/zqj
6P88pOj/PKTo/zyk6P88pOj/PKTo/zyk6P88pOj/PKTo/zyk6P88pOj/PKTo/zyk6P86o+j/NaLn/0em
6P9rsOz/pMjz/+Lo+f/9+/v////9//7+/f/9/f3//f39yP39/U79/f0DAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA/f39Rv39/cH9/f3//v7+//v7+//u7u7/8fPz////////6d3//8mg//+s
Y///nT7//508//+fPv//oD///6A///+gP///oD///6A///+gP///oD///6A///+gP///oD///58///+d
Ov//rGb//t/O//r////6+/uKAAAAAP39/Uv+/f3b///+/87h9v9ksOr/N6Hn/zyj6P88pOj/PKTo/zyk
6P88pOj/PKTo/zyk6P88pOj/PKTo/zyk6P88pOj/PKTo/zyk6P88pOj/PKTo/zij5/8xoOf/TaXp/7DO
8//5+Pv///79//39/f/9/f3S/f39SgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAP39/UH9/f3L/f39//7+/v////////Ps///TsP//sm///59E//+dOv//nz7//6A///+g
P///oD///6A///+gP///oD///6A///+gP///oD///6A///+gP///oD///6A///+ePP//oU3//tOz//r/
///6+/6o+vn6Gf39/WT+/v30///9/67V8/9Epef/OqPo/zyk6P88pOj/PKTo/zyk6P88pOj/PKTo/zyk
6P88pOj/PKTo/zyk6P88pOj/PKTo/zyk6P88pOj/PKTo/zqk6P81oef/W63p/8Pd9f////3//v39//39
/fD9/f1xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAD9/f1n/f396/39/f/9/////ujg//+0df//mjL//588//+fP///oD///6A///+gP///oD///6A///+g
P///oD///6A///+gP///oD///6A///+gP///oD///6A///+fPv//mzr//sma//v7///7/f/A+vr7Mf39
/Xf//v3///79/5bM8f8xn+f/OqPo/zyk6P88pOj/PKTo/zyk6P88pOj/PKTo/zyk6P88pOj/PKTo/zyk
6P88pOj/PKTo/zyk6P88pOj/PKTo/zqj6P8yoOf/hcHu//Hz+/////7//f39//39/bL7+/shAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/f0Z/f39qP39
/f/9/v///vj4///Djf//mjT//58+//+gP///oD///6A///+gP///oD///6A///+gP///oD///6A///+g
P///oD///6A///+gP///oD///6A///+fPv//nDf//8GL//318//7/v/V+vv7Rv39/X///v7/+/n7/5LI
8f8yn+f/OqPo/zyk6P88pOj/PKTo/zyk6P88pOj/PKTo/zyk6P88pOj/PKTo/zyk6P88pOj/PKTo/zyk
6P88pOj/PKTo/zqj6P8/o+j/pNDx///+/f///v3//f39/P39/XYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/f39bP39/fb9/v7//f/////U
sv//ok3//54+//+gP///oD///6A///+gP///oD///6A///+gP///oD///6A///+gP///oD///6A///+g
P///oD///6A///+fPv//nDj//7yE//3u6//6/v/l+vv7Vv39/X///v7/+Pj7/47G7/80n+f/OqPo/zyk
6P88pOj/PKTo/zyk6P88pOj/PKTo/zyk6P88pOj/PKTo/zyk6P88pOj/PKTo/zyk6P88pOj/PKTo/zii
5/9Xquj/wtv1/////v/+/v3//f392/39/U0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/f39Q/39/dL9/f7//f////7i0///rmz//506//+f
P///oD///6A///+gP///oD///6A///+gP///oD///6A///+gP///oD///6A///+gP///oD///6A///+f
Pv//nDr//7h///3r5v/6/v/w+vv7Yf39/X///v3/8/X6/4rE7v80oOf/OqPo/zyk6P88pOj/PKTo/zyk
6P88pOj/PKTo/zyk6P88pOj/PKTo/zyk6P88pOj/PKTo/zyk6P88pOj/PKPo/zeh6P9osur/0uL1////
/v/+/f3//f39w/39/TUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA/f39Kv39/bn9/f7//f////7o3v//tHj//5w6//+fPv//oD///6A///+g
P///oD///6A///+gP///oD///6A///+gP///oD///6A///+gP///oD///6A///+fPv//nDr//7V5//3o
4P/6///5+vv7av39/X///v3/7vP5/4XB7v80oOf/OqPo/zyk6P88pOj/PKTo/zyk6P88pOj/PKTo/zyk
6P88pOj/PKTo/zyk6P88pOj/PKTo/zyk6P88pOj/OqPo/zWh6P9xtev/2uf2/////v/+/f3//f39uP39
/SkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAA/f39IP39/a/9/f7//f////7r5P//uH3//5w6//+fPv//oD///6A///+gP///oD///6A///+g
P///oD///6A///+gP///oD///6A///+gP///oD///6A///+fPv//nTr//7Jy//3k2v/6/v/++vv7b/39
/X///v3/8fP6/4bC7v80oOf/OqPo/zyk6P88pOj/PKTo/zyk6P88pOj/PKTo/zyk6P88pOj/PKTo/zyk
6P88pOj/PKTo/zyk6P88pOj/OqPo/zeh6P9vtOv/2eb2/////v/+/f3//f39vv39/S8AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/f39Jf39
/bP9/f7//f////7q4v//t3v//5w6//+fPv//oD///6A///+gP///oD///6A///+gP///oD///6A///+g
P///oD///6A///+gP///oD///6A///+fPv//nTr//7N0//3l2//6/v/9+vv7bv39/X///v3/9fX6/4vE
7/80oOf/OqPo/zyk6P88pOj/PKTo/zyk6P88pOj/PKTo/zyk6P88pOj/PKTo/zyk6P88pOj/PKTo/zyk
6P88pOj/PKPo/zeh6P9nser/0eL1/////v/+/f3//f390f39/UIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+/v7OP39/cb9/f7//f////7o
3f//tXX//506//+fPv//oD///6A///+gP///oD///6A///+gP///oD///6A///+gP///oD///6A///+g
P///oD///6A///+fPv//nDr//7Z6//3p4f/6/v/4+vv7af39/X///v7/+fn7/4/G7/80n+f/OqPo/zyk
6P88pOj/PKTo/zyk6P88pOj/PKTo/zyk6P88pOj/PKTo/zyk6P88pOj/PKTo/zyk6P88pOj/PKTo/zii
5/9SqOn/u9n1/////f/+/v3//f398fv7+2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+/v7Wv39/en9/f7//f////7ey///q2L//506//+g
Pv//oD///6A///+gP///oD///6A///+gP///oD///6A///+gP///oD///6A///+gP///oD///6A///+f
Pv//nDj//7qA//3u6P/6/v/v+vv7YP39/X///v3//fr7/5LJ8f8yn+f/OqPo/zyk6P88pOj/PKTo/zyk
6P88pOj/PKTo/zyk6P88pOj/PKTo/zyk6P88pOj/PKTo/zyk6P88pOj/PKTo/zqj6P86oef/msvx//36
+//+/v3/+/v7//v7+5r+/v4NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD9/f0H/f39jv39/f/9/v7//f/////Rr///nkj//5w4//+fPv//oD///6A///+g
P///oD///6A///+gP///oD///6A///+gP///oD///6A///+gP///oD///6A///+fPv//nDf//76H//3x
7//6/v/j+vv7VP39/XX//v3////9/6DP8/86oOj/OqPo/zyk6P88pOj/PKTo/zyk6P88pOj/PKTo/zyk
6P88pOj/PKTo/zyk6P88pOj/PKTo/zyk6P88pOj/PKTo/zei6P8sneb/gL/u/+/z+v///vv//fv9//v7
+937+/tQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAD9/f1G/f391P39/f/7/f3//f////7m1P//wpD//6la//+cOv//njz//58+//+gP///oD///6A///+g
P///oD///6A///+gP///oD///6A///+gP///oD///6A///+fPv//nDf//8OO//329v/7/f/T+vv7Rf39
/WH+/v3x///+/7nY9f9Qp+j/OKLn/zyk6P88pOj/PKTo/zyk6P88pOj/PKTo/zyk6P88pOj/PKTo/zyk
6P88pOj/PKTo/zyk6P86o+j/NKHn/0Wl6P9zuOz/u9r1//j5+/////3//v39//39/f/9/f2x/f39JQAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP39/R/9/f2o/f39//39
/f/++/3///b1///5+v/++Pb//9zC//+8hf//o07//5w3//+ePP//oD///6A///+gP///oD///6A///+g
P///oD///6A///+gP///oD///6A///+fPv//nD7//syg//v9///7+/6++vr6MP39/Uj+/f3X///+/9Lj
9v9psur/N6Hn/zyj6P88pOj/PKTo/zyk6P88pOj/PKTo/zyk6P88pOj/PKTo/zyk6P88pOj/OqPo/zeh
6P88oef/ZbLq/6fQ8f/l7Pn///39//P2/f/x+P3////9//39/f/9/f35/f39nv39/SMAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/f39HP39/ZT9/f31/f39///////s9e7/zeDD/+Pc
wf//7ub///7////z7v//07L//7V0//+gSP//nDj//54+//+gP///oD///6A///+gP///oD///6A///+g
P///oD///6A///+ePP//pFX//te9//r////6+/uk+vn6Fv39/Sv9/f26///9/+Xs+f98vO3/NKDn/zqj
6P88pOj/PKTo/zyk6P88pOj/PKTo/zyk6P88pOj/PKTo/zqj6P83ouj/N6Do/1et6v+Vx+7/1OT1///9
+//7+v7/q+f+/1zW//+Y3///9vj9/////f/9/f3//f399/39/av9/f1E/f39BQAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAP39/QL9/f0+/f39pP39/fT9/f3///7///37+/+v4r3/YMl9/3TEef+4z5//89/K///x
6////v///uvi///MpP//rWX//50///+dOv//nz7//6A///+gP///oD///6A///+gP///oD///58///+d
Ov//sG3//uLU//r////6+/uHAAAAAP39/Qr9/f2Y//79//j4+v+Mxe//MZ/n/zqj6P88pOj/PKTo/zyk
6P88pOj/PKTo/zyk6P88o+j/OKLn/zGf5/9Rqen/icLu/8Xe9f/9+fv///7+/83u//982f//IMn//wDC
//8dyf//pOP////7/f////3//f39//39/f/9/f3S/f39iv39/Vf9/f01/f39Iv39/SL9/f0z/f39U/39
/Yb9/f3O/f39//39/v////////3+/8Tozf9dy3//L8Fh/y/DY/9NxW//jcWC/8vRqP/65dX///X1//76
/f/+4dD//8SW//+pXP//nDr//548//+fPv//oD///6A///+gP///oD///58+//+cN///u4L//u/q//v+
//X6+/tmAAAAAAAAAAD9/f1y/v79/f///f+w1fP/SaXo/zii6P88pOj/PKTo/zyk6P88pOj/PKTo/zqi
6P80oOf/Sabo/3i67P+42PP/9vX5/////f/g8f7/j9///zzN//8Dw///AMT//wDF//8AxP//J83//6Lj
///2+P3////7///9/f/9/f3//f39//39/eX9/f3D/f39sf39/bH9/f3C/f394/39/f/9/f3//v3+////
///6+vn/vObH/1/Mgv81wWT/N8Nm/zjEZ/80xGb/N8Ro/17FdP+fyY3/3NW0///n2///+fr//vn6///d
xv//vof//6RQ//+bN///njz//6A///+gP///oD///58+//+eP///y6D//fv///v9/tD6+vtAAAAAAAAA
AAD9/f1I/v392P///v/c6Pb/crbr/zWh5/88o+j/PKTo/zyk6P86o+j/NaHn/z6i5/9qtOv/q9Lz/+nu
+P////3/7vX//5/j//9L0f//DMX//wDE//8Axf//AMb//wDG//8Axv//AMT//x3J//+P3f//5/P+///9
/f////3///79//79/f/+/f3//f39//39/f/9/f3//v3+///+//////////7//+jz6f+m3rb/VMl6/zDB
Yf84w2b/OsRn/zrEZ/86xGf/N8Rn/zTDZf8/xWz/bcR3/63Klf/p2sD//+zk///+///+8/H//9S1//+2
d///oUr//5w4//+fPv//oD///548//+qX//+3sj/+/////r7+6b6+foWAAAAAAAAAAD9/f0a/f39qf/+
/f/49vr/i8Xv/zCf5/86o+j/OqPo/zeh6P86oef/Xq/q/5rJ7//Z5vb///37//r6/v+s5///WdT//xfH
//8AxP//AMX//wDG//8Axv//AMb//wDG//8Axv//AMb//wDE//8Xx///VtP//6Xk///p8/7//vv9////
+/////3///79//39/f////////////77/f/p8+n/t+XE/3jSlP9IxXD/MsJj/zjEZ/86xGf/OsRn/zrE
Z/86xGf/OsRn/zrEZ/82xGb/McNk/0jGb/96w3r/us2e//PeyP//7uj///7///7u5f//zqn//69o//+d
P///nTr//5s0//+7gP/+7+r/+////fr7+3gAAAAAAAAAAAAAAAAAAAAA/f39df7+/fv///3/tNbz/0un
6f80oOf/MJ/n/1Gq6f+Ow+7/yuD2//75+v///f3/y+z+/3vY//8gyf//AMP//wDF//8Axv//AMb//wDG
//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axf//AMP//x/I//9c0///f9z//7Hm/v/H6f//4vP+////
///l8+j/tuTC/5Xcq/9905f/Tsh1/y/BYf83w2X/OsRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/OsRn/zrE
Z/86xGf/OMRn/zbEZv8vw2T/T8Vw/5HEgv/Qz6b/++HQ///18////v///uXU///Fl///qV7//55J///N
p//9/f//+/7/0/r6+kQAAAAAAAAAAAAAAAAAAAAA/f39PP39/c3///7/6O75/3i77v9Bo+f/ebvs/7rZ
8//49fn////9/9vx/v+J3f//Os3//wPD//8AxP//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDG
//8Axv//AMb//wDG//8Axv//AMb//wDF//8AxP//AMP//ybH//81yf//neT///////+x47//RcNs/zLB
Yv8xwmL/NcNl/zjEZ/86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/OsRn/zrE
Z/84xGf/NMRm/zrEav9ixHT/osaK/+DUsv//5tj///r7///5+v/+3Mb//82r//7o2//9/////f3+mvn4
9g4AAAAAAAAAAAAAAAAAAAAA/f39CP39/Y7//f3///v9/8De9v+o0fH/6u/5/////f/s9f//neP//0jQ
//8JxP//AMT//wDG//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDG
//8Axv//AMb//wDG//8Axv//AMX//wDE//8Awv//e+D///////+b4LH/LMBe/zfDZf84xGf/OsRn/zrE
Z/86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/OsRn/zjE
Z/8yw2X/QcVu/3HEdv+wypP/7Ni9///q4P//+v3//fr7//36+v/9/f7p/f39XAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAP39/Un9/f3a//79//v6+///+/3/8/n+/6jm//9X1P//F8f//wDE//8Axf//AMb//wDG
//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDG
//8Axv//AMb//wDF//8Aw///fuH///////+d4LL/L8Fg/zjDZv86xGf/OsRn/zrEZ/86xGf/OsRn/zrE
Z/86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/N8Nm/zDD
ZP9JxnD/gcJ7/77KmP/v5tf//vr6//3+///9/f2p/f39GwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPv7
+wz9/v6S/f39///++//s9f3/jNz//xfI//8Aw///AMX//wDG//8Axv//AMb//wDG//8Axv//AMb//wDG
//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDF
//8Aw///fuH///////+d4LL/L8Fg/zjDZv86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/OsRn/zrE
Z/86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/OsRn/zjEZ/81w2b/McNk/2bH
ev/Q4MP///r7//7+/ur9/f1fAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/f1B+/v70v/9
+//u9f3/etj//wbE//8Axf//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDG
//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDF//8Aw///fuH/////
//+d4LL/L8Fg/zjDZv86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/OsRn/zrE
Z/86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/84w2b/NMFi/3jTlP/i8+b///////39
/qL9/f0YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4F+/v7fP79/fj///3/2O/+/0nQ
//8Aw///AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDG
//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDF//8Aw///fuH///////+d4LL/L8Fg/zjD
Zv86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/OsRn/zrE
Z/86xGf/OsRn/zrEZ/86xGf/OsRn/zjEZ/8ywmL/W8p9/8Xoz////v////3+2fv9/UoAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/f39Jv39/bP//v3///39/6jl/v8fyf//AMT//wDG
//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDG
//8Axv//AMb//wDG//8Axv//AMb//wDF//8Aw///fuH///////+d4LL/L8Fg/zjDZv86xGf/OsRn/zrE
Z/86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/OsRn/zrE
Z/86xGf/OsRn/zTCZP9HxG7/qN+3//v6+v///v/4/f39gPv9+wcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP39/U79/f3a///9//X5/f+U3v//Gcf//wDE//8Axv//AMb//wDG
//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDG
//8Axv//AMb//wDF//8Aw///fuH///////+d4LL/L8Fg/zjDZv86xGf/OsRn/zrEZ/86xGf/OsRn/zrE
Z/86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/N8Nl/0HD
a/+Q1qP/6vPr///////+/f6v+/37JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAP39/Qf9/f10/f397////f/v9f3/h9r//xXG//8AxP//AMb//wDG//8Axv//AMb//wDG
//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDF
//8Aw///fuH///////+d4LL/L8Fg/zjDZv86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/OsRn/zrE
Z/86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/83w2b/PsNo/4PUmv/i8eX///7///79
/tD7/ftDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAD9/f0W/f39kv79/fv///3/6fP9/33X//8Pxf//AMT//wDG//8Axv//AMb//wDG//8Axv//AMb//wDG
//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDF//8Aw///fuH/////
//+d4LL/L8Fg/zjDZv86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/OsRn/zrE
Z/86xGf/OsRn/zrEZ/86xGf/OsRn/zfDZv83wmT/ddCQ/9rv3/////////7/4v39+1/4/f4BAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/f39JP39
/aj+/f3///79/+Pz/f991///E8b//wDE//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDG
//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDF//8Aw///fuH///////+d4LL/L8Fg/zjD
Zv86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/OsRn/zrE
Z/86xGf/NcNl/z7CaP920JD/0e7Z///+/////v/s/f39dfv9+wsAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP39/S39/f2w/v39///+
/f/o8/3/i9v//xzI//8AxP//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDG
//8Axv//AMb//wDG//8Axv//AMb//wDF//8Aw///fuH///////+d4LL/L8Fg/zjDZv86xGf/OsRn/zrE
Z/86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/OsRn/zjEZ/80wmT/RMRt/4fV
nP/b8d////7////9//D9/f2C+/37EwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/f0w/f39sP79/f////3/8/b9/5vg
//8hyv//AMP//wDF//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDG
//8Axv//AMb//wDF//8Aw///fuH///////+d4LL/L8Fg/zjDZv86xGf/OsRn/zrEZ/86xGf/OsRn/zrE
Z/86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/OMNm/zHBYf9KxnP/mdmr/+bz6P////////7/7f39
/YL7/fsWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/f39Lf39/aX+/f35///9//n5/v+r5v//TND//w/F
//8AxP//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDF
//8Aw///fuH///////+d4LL/L8Fg/zjDZv86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/OsRn/zrE
Z/86xGf/OsRn/zjEZ/80wmX/PMJm/2bNhf+x4r//8fbx///+///+/f7k/f39d/v9+xIAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP39/SH9/f2M/f397P/+/f///f3/3u/+/4nb//8hyv//AMP//wDF
//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDF//8Aw///fuH/////
//+d4LL/L8Fg/zjDZv86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/84xGf/NcNl/y/C
Yf9LxnP/jtei/9Tu2f///f3///////79/dL7/f1i+/37CwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD9/f0S/f39a/39/dP//v3////9//j4/f+t5///Ydb//x3J//8Aw///AMX//wDF
//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDF//8Aw///fuH///////+d4LL/L8Fg/zjD
Zv86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/OMNm/zXDZf8wwWH/SsVx/3vTlf+05ML/7/Xx////
/////v/6/f39tPv9/Ub+/f0CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAA/f39A/39/UT9/f2o/f398//+/f///v3/8fX+/6jm/v9g1v//LMn//wDD//8AxP//AMX//wDF
//8Axv//AMb//wDG//8Axv//AMb//wDF//8Aw///fuH///////+d4LL/L8Fg/zjDZv86xGf/OsRn/zrE
Z/84xGf/OMNn/zfDZv80wmP/L8Ff/0rFcf970pX/seK//+jz6f///v////7///79/t79/f2G+/39KAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAD9/f0d/f39cP39/cX+/f39//79///+/f/v9f7/uOf+/33c//9W0v//Gsj//wDD//8AxP//AMT//wDF
//8Axf//AMX//wDF//8Aw///fuH///////+d4LL/L8Bf/zfDZf83w2b/N8Nl/zTCY/8ywmL/L8Fg/0PD
a/9szYn/itmk/7Pjwv/o8+n///3//////////v7w/f39qf39/VD7/fsLAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP39
/TP9/f2D/f39y/79/f3//v3////7//v6/f/j8f7/pOX//2zb//9f1P//S87//yvI//8DxP//AMP//wDD
//8Awf//eeD///////+Z36//J79a/y/AX/80wWH/S8Vx/2rNhv980pX/itij/6rhuv/X7tz/+Pn4///+
//////////7+8P39/bL9/f1o/f39HgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/f0F/f39Ov39
/Xz9/f25/v397//+/f///v3///79//v5/f/q8/7/1u7+/7fm/v+Q4v//dN7//2za//9m2f//tuv+////
///F69D/htef/5Lcq/+f4LT/t+XD/9Xs2P/m8ef/9vn2///+//////////7////+/t/9/f2l/f39Zf39
/SIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/f0p/f39Yf39
/ZP9/f3B//396//9/f///v3////9/////f////3///39//n5/f/4+f3/+vv9///+/v/5+vn/9fj1///9
/v/////////////+/////v////7//v/+/t3+/f2z/f39hP39/U/9/f0XAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP39/Qj9/f0x/f39W/39
/X/9/f2g/v39vf79/dX//f3p//79+P/+/f///v3//v39//39/f/+/f7///7////+//T//f7j/v3+zv79
/rT+/f6V/f39cv39/U79/f0jAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/f0S/f39Lv39
/Ub9/f1Z/f39aP39/XP9/f17/f39f/39/X79/f15/f39cP39/WT9/f1T/f39Pv39/SX7/fsIAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///+AAD////wAAAP//
/wAAAP///wAAAP//+AAAAD///wAAAP//4AAAAA///wAAAP//gAAAAAP//wAAAP//AAAAAAD//wAAAP/8
AAAAAAB//wAAAP/4AAAAAAAf/wAAAP/wAAAAAAAP/wAAAP/gAAAAAAAH/wAAAP/AAAAAAAAD/wAAAP+A
AAAAAAAB/wAAAP8AAAAAAAAA/wAAAP4AAAAAAAAAfwAAAPwAAAAAAAAAfwAAAPwAAAAAAAAAPwAAAPgA
AAAAAAAAHwAAAPAAAAAAAAAAHwAAAPAAAAAAAAAADwAAAOAAAAAAAAAADwAAAOAAAAAAAAAABwAAAMAA
AAAAAAAABwAAAMAAAAAAAAAAAwAAAMAAAAAAAAAAAwAAAIAAAAAAAAAAAwAAAIAAAAAAAAAAAQAAAIAA
AAAAAAAAAQAAAAAAAAA+AAAAAQAAAAAAAAD/gAAAAQAAAAAAAAP/wAAAAAAAAAAAAAf/4AAAAAAAAAAA
AAf/4AAAAAAAAAAAAA//8AAAAAAAAAAAAA//8AAAAAAAAAAAAA//8AAAAAAAAAAAAA//8AAAAAAAAAAA
AA//8AAAAAAAAAAAAA//8AAAAAAAAAAAAA//8AAAAAAAAAAAAAf/4AAAAAAAAAAAAAf/4AAAAAAAAAAA
AAP/wAAAAAAAAAAAAAH/gAAAAAAAAAAAAAB+AAAAAQAAAAAAAAAAAAAAAQAAAIAAAAAAAAAAAQAAAIAA
AAAAAAAAAQAAAIAAAAAAAAAAAwAAAMAAAAAAAAAAAwAAAMAAAAAAAAAAAwAAAMAAAAAAAAAABwAAAOAA
AAAAAAAABwAAAOAAAAAAAAAADwAAAPAAAAAAAAAADwAAAPAAAAAAAAAAHwAAAPgAAAAAAAAAHwAAAPwA
AAAAAAAAPwAAAPwAAAAAAAAAfwAAAP4AAAAAAAAAfwAAAP8AAAAAAAAA/wAAAP+AAAAAAAAB/wAAAP/A
AAAAAAAD/wAAAP/gAAAAAAAH/wAAAP/wAAAAAAAP/wAAAP/4AAAAAAAf/wAAAP/8AAAAAAB//wAAAP//
AAAAAAD//wAAAP//wAAAAAP//wAAAP//4AAAAA///wAAAP///AAAAD///wAAAP///wAAAf///wAAAP//
//AAD////wAAACgAAAAwAAAAYAAAAAEAIAAAAAAAgCUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAx9T7C8PR
+x7T3fs7/f39ZP39/Yv+/f2h/v39qf39/ar9/f2q/f39qf39/Z39/f2E/Pz8Wejn5jTd29oa3dzbBwAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALzM
+g/h5/w+/f39gv7+/bv+/v3d/v796/39/Pj19vv+6+z7//Hy/P/8+/v/8/Hx//f39v38/Pz1/v7+5/7+
/tn9/f2u/f39c+3s6zHX1dQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK7B
+gHY4fsh/Pz9Y/39/b/9/fzv8fP8/93j+/+7x/r/mK74/3GU+P9rjvj/XoT4/5Os+f/w7+//tbCu/6+r
p/+0sK3/wsC+/9PR0P/p6Oj/9fT0//38/eX+/v6w8fDwTd3a2hYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAvcz6COHn/EL9/f21/v796vDy+//G0fr/j6b5/1+E9/9Kdvj/QW/3/zdp+P84avj/NWf3/3eZ
+P/u7Ov/pqGd/5iSj/+Yko//mpWS/5+Zl/+no6D/vbq4/9vZ2P/z8vL9/v7+4P39/Z/s7Osv2NbUBAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAALfI+gPr7/wi/f39m/7+/ezq7fv/ucb5/2yN+P9DcPj/Nmn4/zpr+P87bPj/PGz4/zxs
+P88bPj/N2n4/3ia+f/u7ez/qKKf/5qUkf+blZL/mpSR/5qUkf+ak5D/mJKP/5uVkv+sqKX/0tDO//Du
7v/9/v7d/f39f9vZ2RMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAOvv/Dn9/f2t/Pz8993j+v+Cnfn/THf4/zpr+P86a/j/O2z4/zxs
+P88bPj/PGz4/zxs+P88bPj/N2n4/3ia+f/u7ez/qKKf/5qUkf+blZL/m5WS/5uVkv+blZL/mpWS/5qU
kf+Zk5D/n5qW/7axr//n5uX//Pv78f39/Y/x8PAiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2x/oG6u/8SP7+/dz3+Pz+rLz5/1qB+P82aff/O2v4/zxs
+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs+P88bPj/N2n4/3ia+f/u7ez/qKKf/5qUkf+blZL/m5WS/5uV
kv+blZL/m5WS/5uVkv+blZL/mpSR/5iSj/+knpz/ycbE//j39/r+/v3D8fDvLtHPzgMAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADr7/xJ/f39y/X2/P+xwPr/TXf4/zpr
+P87bPj/PGz4/zxs+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs+P88bPj/N2n4/3ia+f/u7ez/qKKf/5qU
kf+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+blZL/m5WS/5qUkf+Zk5D/nZeV/8vIxv/09PP8/f39sPDw
7y4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyNX6A+7x/Dr+/f3d9vf8/5Wr
+f9Fcfj/Omv4/zxs+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs+P88bPj/N2n4/3ia
+f/u7ez/qKKf/5qUkf+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+blZL/mpSR/5qV
kv+7t7b/9fT1/P7+/sDs6+sfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8PP8JP39
/bD3+Pz/t8T6/0h0+P86a/j/PGz4/zxs+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs
+P88bPj/N2n4/3ia+f/u7ez/qKKf/5qUkf+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+blZL/m5WS/5uV
kv+blZL/m5WS/5qUkP+alZL/zMnI//f4+Pr4+PeJ3trYEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AADS4fkK/f39n/z8/PixwPr/UHj4/zlr+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs
+P88bPj/PGz4/zxs+P88bPj/N2n4/3ia+f/u7ez/qKKf/5qUkf+blZL/m5WS/5uVkv+blZL/m5WS/5uV
kv+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+alJH/nZeV/8nHxv/7+/zv/f39d+ff2AIAAAAAAAAAAAAA
AAAAAAAAAAAAANHl+AL2+fxH/f397vT0+/91k/j/N2n4/ztr+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs
+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs+P88bPj/N2n4/3ia+f/u7ez/qKKf/5qUkf+blZL/m5WS/5uV
kv+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+blZL/mZOQ/6SenP/m5uX+/f391/Xv
6ScAAAAAAAAAAAAAAAAAAAAAAAAAAOHt+SX9/f26+Pr8/+7y+//U2vr/lav5/055+P85a/j/O2v4/zxs
+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs+P88bPj/N2n4/3ia+f/u7ez/qKKf/5qU
kf+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+blZL/m5WS/5qUkf+Zk5D/nZeU/62o
pv/l5eX//P38//v7+5Lz4dASAAAAAAAAAAAAAAAAAAAAAP39/Wr+/v3sy+D0/5DD7//S4vf/7fD7/7/M
+/9zlPj/P274/zlq+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs+P88bPj/PGz4/zxs+P88bPj/N2n3/3ia
+P/u7ez/p6Ke/5qUkf+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+blZL/m5WS/5uVkv+blZL/mpSR/5mT
kP+jnZv/ycfG/+rq6//76t7//ujY//z9/tn68+xCAAAAAAAAAAAAAAAA5vL6FP39/cX29/v/drrs/zah
5/9Pqen/hr/v/9jl+P/u7/z/tsX6/3GR+P9Abvj/Omv4/zts+P88bPj/PGz4/zxs+P88bPj/O2v4/zlq
9/88bPf/RnL3/4Sh+f/v7u3/rKek/5mTkP+Zko//mpSR/5qVkv+blZL/m5WS/5uVkv+blZL/mpSR/5qU
kf+ak5D/op2a/8XCwf/o5+f//u3g///Mo///p1f//7Jw//318fv8/f2h99m+BAAAAAAAAAAA5PH6Rf7+
/fTR5ff/Safo/zmi5/85o+f/PqPo/2Sw6/+mzPP/6e37/+Xn+/+WrPr/WYD4/zhp+P86a/j/PGz4/zxs
+P86a/j/Omr4/16E+P+DoPj/uMT6/9Tb+//4+Pf/2djW/7y5tv+qpaP/mZOQ/5mTkP+blZL/m5WS/5uV
kv+blJH/mJKP/5uUkv+2s7H/2tra//fw7f/+3MP//7Nu//+iR///nTv//6BG//3exv/7/f3Y+eveJAAA
AADM5fcP/f39jfb5/P+fzfD/NqDn/zuj6P88pOj/PKTo/zmj5/89o+f/aLHs/63P8//r8Pv/4OT7/5Kq
+f9Tffj/Omv4/zlr+P9Ufvj/orX6/+ns+//9/f3//v79/v79/fj9/f34/v7+/v39/f/y8fH/zsvJ/6ij
oP+Zk5D/mpSR/5mTkP+clZP/tLCu/9bV1f/48e7//+HJ//+2dP//oEf//548//+fPv//nz///507//7A
jP/89fD/+vDmYPvSqwPH4/Yi/v39xObx+v9vt+v/OqLn/zyk6P88pOj/PKTo/zyk6P87o+f/OaLn/0im
6f+Hvu//ydz2/+zu+//K0/z/cpH4/1qA+P/AzPr/9vf8//7+/f39/f3g/f39qf39/Y39/f2M/f39p/39
/d79/f38+fn5/93c2/+loJ7/l5GN/6ain//GxML/7+7u//zp3P//w5L//6lX//+ePv//nz7//6A///+g
P///oD///589//+sYf/96tz/+vz9lvvauhL8/f1I/v794cfg9v9Mqun/OqPo/zyk6P88pOj/PKTo/zyk
6P88pOj/PKTo/zuj6P86ouf/Sqbo/4/B8P/P4Pj/6+37/+Dl+v/+/vz//f398vT2/Izk6vowAAAAAAAA
AAAAAAAAAAAAAO3t8Sz3+PiG/f398f7+/v/h4N7/zMrJ/+zr6f/97uT//8aY//+pWf//nTr//58+//+g
P///oD///6A///+gP///oD///58+//+kTP/+1bj/+v39zfzXsyb9/f1x/v7977DT8v9Hpuj/O6Po/zyk
6P88pOj/PKTo/zyk6P88pOj/PKTo/zyk6P87o+j/OqPn/z+k5/9drOv/0+L3//38/P/9/f31/f39mMPT
+REAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADf3eAP/f39kf39/fP7+/v/+vXy///XuP//tHP//6BE//+e
Pv//nz7//6A///+gP///oD///6A///+gP///oD///58///+gRP/+xpn/+v3+3vrt4j/9/f2Z/v79/IPC
7v87o+f/PKTo/zyk6P88pOj/PKTo/zyk6P88pOj/PKTo/zyk6P88pOj/PKTo/zii5/9Xren/4e35//79
/f/8/PyvzNz5HAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6+XhGf39/af9/f3//fPv//+u
ZP//nTn//58///+gP///oD///6A///+gP///oD///6A///+gP///oD///6A///+dPP/+uHb/+/r87Pr7
/Gf9/f2n/fv8/3K77f83oef/PKTo/zyk6P88pOj/PKTo/zyk6P88pOj/PKTo/zyk6P88pOj/PKTo/zqi
5/96ve3/+/v8//39/f3t8/tfxNv3AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7uPaAvn1
8lj9/f37/f39//++hf//nkD//6A///+gP///oD///6A///+gP///oD///6A///+gP///oD///6A///+e
O///smz//PTz9Pr8/ID9/f2p+fn7/2+47P84oef/PKTo/zyk6P88pOj/PKTo/zyk6P88pOj/PKTo/zyk
6P88pOj/PKPo/0Sl5/+jzfD//v79//39/eHm8fouAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAPrz7if9/f3b/f7+//7StP//o0z//58+//+gP///oD///6A///+gP///oD///6A///+g
P///oD///6A///+ePP//rmb//PDt+/r8/JP9/f2p9Pf6/2u26/84ouf/PKTo/zyk6P88pOj/PKTo/zyk
6P88pOj/PKTo/zyk6P88pOj/O6Po/0in6P+01PL//v79//39/dLm8foeAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz17hf9/f3L/f7+//7Yv///pE///58+//+gP///oD///6A///+g
P///oD///6A///+gP///oD///6A///+ePP//q2D//O3n/vr8/J39/f2p9vf7/2u36/84ouf/PKTo/zyk
6P88pOj/PKTo/zyk6P88pOj/PKTo/zyk6P88pOj/O6Po/0in6P+z1PL//v79//39/dfm8vojAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPr07Rz9/f3Q/f7+//7Yvf//pU///58+//+g
P///oD///6A///+gP///oD///6A///+gP///oD///6A///+ePP//rGL//O7o/fr8/Jz9/f2p+vn7/2+4
7P84oef/PKTo/zyk6P88pOj/PKTo/zyk6P88pOj/PKTo/zyk6P88pOj/PKPo/0Kk6P+fy/H//v79//39
/e7l8vo7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPbz6zT9/f3o/f7+//7Q
rv//okn//58+//+gP///oD///6A///+gP///oD///6A///+gP///oD///6A///+ePP//r2b//PLu+vr8
/JL9/f2n/vz8/3a87v84oef/PKTo/zyk6P88pOj/PKTo/zyk6P88pOj/PKTo/zyk6P88pOj/PKTo/zeh
5/9yuez/+vn7//z8+//7+/uB0O36CwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4uzYCfb3
8Xf8/f3//P7+//7InP//o0z//549//+fPv//oD///6A///+gP///oD///6A///+gP///oD///6A///+e
O///s23//Pb18/r7/H79/f2X/v79+47E8P8+o+f/PKTo/zyk6P88pOj/PKTo/zyk6P88pOj/PKTo/zyk
6P87o+j/OKLn/0mn6P+Oxe//+Pn7//79/P/8/PzS7Pf8QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAA9fnzOv39/c39/P3//fn5//7u5P/+1LD//6xg//+ePv//nz3//6A///+gP///oD///6A///+g
P///oD///6A///+ePf/+unr/+/v86/r6+2b9/f1u/v797rXV8/9Jp+j/O6Po/zyk6P88pOj/PKTo/zyk
6P88pOj/O6Po/zmi6P9Jp+j/ebvs/9Hk9v/m9Pz/xuz9/+74/f/9/f39/f390Oz4/D277PkIAAAAAAAA
AAAAAAAAAAAAAMnt3Qfw+fQ3/f39yv39/fzx+PP/uN+8/8vZtf/07uP//+zh//7Pqf//qlz//59B//+f
Pf//nz7//6A///+gP///oD///58///+hRv/+yaL/+v393frt4j39/f1E/v394M7j9f9Oqun/OqPo/zyk
6P88pOj/PKTo/zyj6P86ouf/OqLn/2Gx6v+z1vP/6fH5/8vu/v9r2P7/K8v//5bh/v/+/f3//f39/f39
/c3q+Pt04/b5MuT29xrl9vQa5vbyMO349HD9/f3K/f39/P79/v+35cT/Ush4/1TFcf+ay5H/5uHK//3w
6v/+4c7//r+K//+iSf//njz//58+//+gP///oD///58+//+lTv/+2cD/+v39y/zXtSXH4/Yh/f39wenz
+v95uuz/OKLn/zyj6P87o+j/OqPn/z6j5/9dsOr/rtPy/+fv+f/O8P3/fNv+/xvH//8AxP//AMX//xHI
//+V4f7/6/f8//79/f/9/f3//f395v39/c/9/f3O/f395f39/f/+/f7/7vfw/7Djv/9GxnD/N8Jl/zfE
Zv82xGf/X8V1/6TMlf/q48///PLu//7fyf/+vYT//6JI//+ePv//nz7//589//6xav/97uP/+vv8kvra
uhDL5fcN/f39iPn6+/+m0PH/NKDn/zqj6P85oef/SKfo/47E7v/T5vb/5fP8/5/k/v81zf//C8b//wDF
//8Axf//AMb//wDF//8byP//btj+/9Lv/v/5+v3//v78//79/f/9/f3//v7+//n6+f/a8N//i9ei/0vH
dP82w2X/OcNm/zrEZ/85xGf/OMNm/0HDaf97yIL/wNOp//nr3//+7+f//tGu//+waP//nT3//5w4//7G
mP/89/T++PDmXPjTqwIAAAAA5PH6Qf7+/fLY6ff/Tqnp/0Ol6P+Iwu7/zeL2/+n1/P+v5/7/Ps3//wfF
//8Axf//AMb//wDG//8Axv//AMb//wDG//8Axf//AMT//yLJ//9M0f//idz+/7no/v/w+fL/pt+3/27R
jv9PyHb/NMJj/znDZv86xGf/OsRn/zrEZ/86xGf/OsRn/znEZ/81w2X/P8Rq/4bGg//M06z/+O7k//7v
5v/+zKX//rFx//7jz//8/f7V9+zdIQAAAAAAAAAA5vL6EP39/cH5+fz/nMzx/6/U8v/q8/r/zu/9/2HW
/v8eyP//AMX//wDF//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDF//8AxP//DsT//1/X
///g9eb/Wct+/zXCZP83w2b/OcRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/85xGf/OMRm/zvD
aP9WxHL/p8yU/+XexP/+7+n//uzj//339Pr9/f2b79y9AwAAAAAAAAAAAAAAAPz8/GP9/f3q+/r7/97y
/f9j1///Hcn//wDE//8Axf//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDG
//8Axv//AMT//1TX///e9OX/U8t7/zjDZv86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/OsRn/zrE
Z/86xGf/OsRn/zrEZ/84w2b/N8Nn/1rDcf+30qT/9fLs//39/tX29ew8AAAAAAAAAAAAAAAAAAAAAN3w
+iH8/Py0+fr7/6Ti/v8Hxf//AMX//wDG//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDG
//8Axv//AMb//wDG//8Axv//AMT//1TX///e9OX/U8t7/zjDZv86xGf/OsRn/zrEZ/86xGf/OsRn/zrE
Z/86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/OMNm/zTCY/+V2KX/8/fx//39/Yvn5s8PAAAAAAAA
AAAAAAAAAAAAALzk+AHk8/pA/v396+33/f9J0f7/A8X//wDG//8Axv//AMb//wDG//8Axv//AMb//wDG
//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axv//AMT//1TX///e9OX/U8t7/zjDZv86xGf/OsRn/zrE
Z/86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/N8Nm/2DMgv/k8+j+/v3+0d/t
2iIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADI7PsI/f39l/7+/fa26f3/L8v//wDF//8Axv//AMb//wDG
//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axv//AMT//1TX///e9OX/U8t7/zjD
Zv86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/84w2b/UMd2/7Xi
wf/9/f3s/P38bsLjwQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxu78H/39/ab7/P3+wen9/ybJ
//8Bxf//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axv//AMT//1TX
///e9OX/U8t7/zjDZv86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/OsRn/zjD
Zv9HxXD/ueXF//j7+fjy+fSAu+fHDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAren9Auf3
/TL9/f3X+fv9/57h/v8lyf//AMX//wDG//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDG
//8Axv//AMT//1TX///e9OX/U8t7/zjDZv86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/OsRn/zrE
Z/86xGf/N8Nm/0jFcP+X26v/9vr3+v79/rfd8+MaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADk9/1A/f39xPn7/f/D6v3/Msz//wPF//8Axf//AMb//wDG//8Axv//AMb//wDG
//8Axv//AMb//wDG//8Axv//AMT//1TX///e9OX/U8t7/zjDZv86xGf/OsRn/zrEZ/86xGf/OsRn/zrE
Z/86xGf/OsRn/znDZv83w2b/VMh5/7zmxv/3+/f7/f39pub26ycAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACe5v0F5Pf9QP39/dX8/P39uur+/0vR//8GxP//AMX//wDG
//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axv//AMT//1TX///e9OX/U8t7/zjDZv86xGf/OsRn/zrE
Z/86xGf/OsRn/zrEZ/86xGf/N8Nm/znCZf9nzof/vOXI//n7+fn9/f245vbrJ6jjuwIAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOT3/S/9/f2h/v399fD3
/f+O3/7/MMz//wbF//8Axf//AMX//wDG//8Axv//AMb//wDG//8Axv//AMT//1TX///e9OX/U8t7/zjD
Zv86xGf/OsRn/zrEZ/86xGf/OcNm/zfDZf85w2f/VMp7/5jbrP/r9u3+/v7+7fH59ILb8+MaAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKDn
/QKy6/0b/f39jv39/eb0+v3/zO7+/2bY/v8oyv//AMT//wDF//8Axf//AMb//wDG//8Axv//AMT//1TX
///e9OX/U8t7/zjDZv86xGf/OcRn/zjDZ/83w2X/M8Ji/03HdP9/1Jn/z+zW//P59f/+/f7U/P39c7Hm
wg8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAqen9Btf0/Tj9/f2p/v395fv7/f7b8v3/m+L+/1zV/v8iyv//G8j//wnF
//8AxP//AMP//1LW///d9OX/Ucp5/zTCY/87w2f/R8Zw/0zIdf9z0I//pN+2/9jv3//5+/n7/v7+2f39
/ZLc8+MmtOfEAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACy6/0b4/f9Vv39/bT+/fzo+/v9/+f3
/f/G7P3/ruX+/3va/v9T1v//RtH//4Lf/v/m9+v/gdec/3TTk/+L2KL/t+PB/8zr1f/n9uv/+fv5//79
/tz9/f2j5vbrQrzpyxIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKTo
/QnV8/00/f39c/39/a3+/f3Y/v795f7+/fP//f37+vr9//v7/f/9/Pz/+fr5///9/vn+/v7x/v3+4v79
/tP+/f2f5PXqZtvy4iiw5cEFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAsOv9B6np/RnA7/0y/f39VP39/Xz9/f2T/f39o/39/aj9/f2n/f39of39
/Y79/f11/P38StDv2iu358cVoeG2AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA//8AAP/8AAA//wAA/+AAAA//AAD/wAAAA/8AAP8A
AAAB/wAA/wAAAAD/AAD8AAAAAD8AAPwAAAAAPwAA8AAAAAAfAADwAAAAAA8AAOAAAAAABwAAwAAAAAAH
AADAAAAAAAMAAMAAAAAAAwAAgAAAAAABAACAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAAAAAA
B+AAAAAAAAAP8AAAAAAAAA/wAAAAAAAAH/gAAAAAAAAf+AAAAAAAAB/4AAAAAAAAH/gAAAAAAAAP8AAA
AAAAAA/wAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAABAACAAAAAAAEAAMAA
AAAAAwAAwAAAAAADAADAAAAAAAcAAOAAAAAABwAA8AAAAAAPAADwAAAAAB8AAPwAAAAAPwAA/AAAAAA/
AAD/AAAAAP8AAP8AAAAB/wAA/8AAAAP/AAD/8AAAD/8AAP/8AAA//wAA//8AAP//AAAoAAAAIAAAAEAA
AAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAmrL5A7nJ+h7X4PtH6u/8e/39/KX5+fzB+Pj8xvv7+8b6+vq//Pz8nvPz8nTh4OBA09DQGcbD
wQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAMfU+iTh6Ptu9PX8v+zv++LJ0/r1qLz5+5Wt+f6lufn/5ePj/8fEwv7Pzcv63dzb8/Lx
8d339ve26+rpYdfV1BoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAALnJ+hri6Ptk8fP82c/Z+vqMpvn/XIP3/0Nx9/86a/f/OGn3/2GI+P/W09H/nZeU/5mT
kP+clpP/p6Kf/767uf/i4N/39fT0zefm5VXLyMcTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAC4yPoa+Pn8nO7x++2Tqvn/V3/4/zts+P86a/j/O2z4/zxs+P86a/j/Yon4/9bU
0v+emJX/mpSR/5qUkf+alJH/mpSR/6SgnP/AvLr/8/Ly5vX09IfV0tEPAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAx9T6Off4/MHDz/r+Y4j4/zhq9/87a/j/PGz4/zxs+P88bPj/PGz4/zpr
+P9iifj/1tTS/56Ylf+blZL/m5WS/5uVkv+blZL/mpSR/5mTkP+po6H/2dfV/Pj496zc2tkpAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAMPT+hr3+PzBy9X6+VuB+P89bPj/O2z4/zxs+P88bPj/PGz4/zxs
+P88bPj/Omv4/2KJ+P/W1NL/npiV/5uVkv+blZL/m5WS/5uVkv+blZL/mpSR/5qUkf+loJ3/29nZ9Pj4
+KvY09ANAAAAAAAAAAAAAAAAAAAAAAAAAADJ2/gb+fr8n8bR+v9ehPj/O2v4/zxs+P88bPj/PGz4/zxs
+P88bPj/PGz4/zxs+P86a/j/Yon4/9bU0v+emJX/m5WS/5uVkv+blZL/m5WS/5uVkv+blZL/m5WS/5qU
kf+loJ7/2dfX/PPy8YPd0MURAAAAAAAAAAAAAAAAAAAAAPD1+2j4+PvvcJD4/zxs+P88bPj/PGz4/zxs
+P88bPj/PGz4/zxs+P88bPj/PGz4/zpr+P9iifj/1tTS/56Ylf+blZL/m5WS/5uVkv+blZL/m5WS/5uV
kv+blZL/m5WS/5qUkf+po6H/8vLy4/Hq404AAAAAAAAAAAAAAADR5fgo9vn73Nfn9//I0/n/iKP5/0d0
+P87a/j/PGz4/zxs+P88bPj/PGz4/zxs+P88bPj/Omv3/2KJ+P/W1NL/npiV/5uVkv+blZL/m5WS/5uV
kv+blZL/m5WS/5qUkf+alJH/oZuZ/7q2tP/x6+f/+/n4xvHbxhYAAAAArtX0BO30+3PW6Pf6aLXr/4nC
7//C2Pf/ssP6/26Q+P89bPj/O2v4/zxs+P88bPj/O2v4/zpq9/89bff/a474/9fV0/+fmZb/mZOQ/5qU
kf+blZL/m5WS/5qUkf+alJH/nJWS/66qqP/a1ND/9NnE//6/iP/95tT09ebXVwAAAADA3vYi9vn8xJbK
8P88o+f/O6Pn/02o6f+Wx/H/y933/6O3+f9mivj/QG/4/ztr+P9Ld/j/fJr4/7fH+v7b4fv98vLx/djW
1P66trT/opyZ/5qUkf+alJH/nZaU/6qlo//Uzsr/89zJ//6+hf//pEz//54+//3Cjf/69fCr886rE9rs
+E3x9vvlZ7Tq/zqi5/88pOj/O6Pn/0Ck5/9er+v/tdT0/87Z+f+Mpfn/VHz4/7DB+v/t8Pz+/f393v39
/bf9/f22/f393PTz8/3V09L/npiV/56Zlv/DwL//6N/Z//3Kn///rV///59A//+fPv//nz7//qte//vx
6Nb43cM0/P39hdTn9/ZFpuj/O6Po/zyk6P88pOj/PKTo/zuj6P89o+f/ZLHr/7zX9f/n6/r//f387uzw
+4i7zPAVAAAAAAAAAADP0uAT8/P0hP39/e3k4+L/6uDY//7PqP//rF7//548//+fPv//oD///6A///+f
Pv//oUX//N/I8Pro1mX9/f2vttnz/D2j5/87o+j/PKTo/zyk6P88pOj/PKTo/zuj5/86o+f/hMDu//L2
+//x9fubts31GgAAAAAAAAAAAAAAAAAAAADb1tcZ+ff2lfz5+P/+zqX//6JI//+fP///nz7//6A///+g
P///oD///58///+ePv/80ar3+vf2iPz8/MSfz/H/OKLn/zyk6P88pOj/PKTo/zyk6P88pOj/PKPo/zyj
5/+u1fL//Pz8987h9zUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADu5d8w/f399f7Xt///n0L//58+//+g
P///oD///6A///+gP///oD///548//7Gl/z6+Pir+vv8xZrM8P85ouf/PKTo/zyk6P88pOj/PKTo/zyk
6P87o+j/QqXn/8jg9f/9/f3kz+T3FwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPLp3hL9/f3f/ePR//+i
SP//nz7//6A///+gP///oD///6A///+gP///nj3//sKP/vr39br7+/zFmszw/zmi5/88pOj/PKTo/zyk
6P88pOj/PKTo/zuj6P9Cpej/x+D1//39/enO6PgcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7+vdGP39
/eX94s///6JI//+fPv//oD///6A///+gP///oD///6A///+ePf/+w5D++vf2ufz8/MSh0PL/OaLn/zyk
6P88pOj/PKTo/zyk6P88pOj/PKPo/zui5/+p0vL//Pv7++Hx+Uik3PQCAAAAAAAAAAAAAAAAAAAAAM/g
xwLt8ORC/P39+f3bwP//oUb//58+//+gP///oD///6A///+gP///oD///548//7ImPv6+fiq/f39rbzb
9fw/pOf/O6Po/zyk6P88pOj/O6Po/zuj6P9Epuj/aLXr/7/f9v/y+fz/+Pv8ur/p9zKa3+8BAAAAAAAA
AACs4M0B1+zbL/v8+rby9/L/6urZ//zTr//+tG///6FE//+fPv//nz7//6A///+fP///nz///NOu9vr3
9Yf9/f2C2Oj39kan6P87o+j/PKTo/zyj6P86ouf/S6jo/6HO8f/J5vn/gt39/5fi/f/9/f34+fv8uNPx
+EDJ7vEWze/rFtLv5T76/Pu0/f39963ivP95zYr/ytu4//jk0//+xZX//qdT//+ePf//nz7//58+//+i
R//84c3v+ujXY9ns+Evz9/vkbLbr/zmi5/87o+f/UKro/5jL8P/K5vj/hN79/yjK/v8AxP//B8b//4jf
/f/g9P3//Pz8+f39/OT9/f3j/Pz8+eX06f+j37b/PcRq/zfDZv9AxGr/csd+/9DewP/15NL//sSR//6o
Vv//njz//q9k//vz7NT03sIyveD2IPf6+8GczfD/QaTo/36+7f+83fX/o+L8/03S/v8Nx///AcX//wDF
//8Axf//Esf+/0rS/v+T4f7/xez9/+T06P+p4rv/btGO/0XFb/85w2b/OcNm/znDZv86w2f/VsZ0/5bP
lv/m38X//N3D//62dv/+yZ3/+vbxqOjSpxKq2fQD6/X7b+Xw+fq93fX/r+f8/1zW/v8Nxv//AMX//wDG
//8Axv//AMb//wDG//8Axv//AMX//wPE//9A0P//sebC/0HFbP84w2b/OcRn/zrEZ/86xGf/OsRn/zrE
Z/85xGb/OsNn/13Fdf+l0Zz/7ejY//z18fPu6tVSAAAAAAAAAADM6fgk+/v72c3t/P8cyf//A8X//wDF
//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axv//AMX//zjQ//+v5sH/QcVt/zrEZ/86xGf/OsRn/zrE
Z/86xGf/OsRn/zrEZ/86xGf/OMNm/z3CZ/+84L3/+fr4wuPhxBQAAAAAAAAAAAAAAADm9Ptj9vr97U7T
/v8Fxv//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDG//8Axf//OND//6/mwf9BxW3/OsRn/zrE
Z/86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/87w2j/aM6I//L48+Df7dlKAAAAAAAAAAAAAAAAAAAAALXm
+hnx+fyYyO79/kHP/v8Axf//AMb//wDG//8Axv//AMb//wDG//8Axv//AMb//wDF//840P//r+bB/0HF
bf86xGf/OsRn/zrEZ/86xGf/OsRn/zrEZ/86xGf/OcNm/17Lgf/I6tL76fbsfLvetw8AAAAAAAAAAAAA
AAAAAAAAAAAAAK/o/Bb2+/280e/9+EHP/v8Gxv//AMX//wDG//8Axv//AMb//wDG//8Axv//AMX//zjQ
//+v5sH/QcVt/zrEZ/86xGf/OsRn/zrEZ/86xGf/OcNm/zvEaP9fzIH/zOzV8/b6+KS25MALAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAALTr/TT2+/27yu79/lDT/v8CxP//AMX//wDG//8Axv//AMb//wDG
//8Axf//OND//6/mwf9BxW3/OsRn/zrEZ/86xGf/OsRn/znDZv84wmX/bdCM/8vr1Pz2+/ekvunLJAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKDn/RXs+f2T9/r96pbi/v86z/7/CMb//wDF
//8Axf//AMb//wDF//840P//r+bB/0HFbf85xGf/OcNn/zjDZf87w2j/X8yC/6Pftv/1+vbh5vbsfqnj
vAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIni/RfK8f1d9fr909Xy
/fiM4P3/S9L+/xXI//8Kxv//AMT//zfQ//+u5sH/PsVr/z3Eaf9Exm//ac6J/5vdsP/a8eD09fr3xtLw
202Z368QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AACj6P0f0vP9ZfT6/Ljy+f3d0/D987Lo/fmI4f7+nOX9/9bx3v+k4bj9u+fH+Njv3vLv+PLY8vn0rszu
11ix5sIWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAB03f0CieL9GbPr/T/i9v1y/f39mf38/bn8/P3D/Pz8w/38/Lb9/f2T6fbta7/q
zjig4bcUftabAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AAf//AAD//AAAP/gA
AB/wAAAP4AAAB8AAAAPAAAADgAAAAQAAAAEAAAAAAAAAAAABgAAAA8AAAAfgAAAH4AAAB+AAAAPAAAAB
gAAAAAAAAAAAAAAAAAAAAAABgAAAAcAAAAPAAAAD4AAAB/AAAA/4AAAf/AAAP/8AAP//gAH/KAAAABAA
AAAgAAAAAQAgAAAAAABABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2x/ol3OP7gdbf
+8TL1vrh6efm4Ofm5cDn5uZ709DPHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ61+Qbh5/uCqr369FiA
+P89bff/TXn4/7q1s/+alJL/pqGe/8/My/Dm5eV1xsLBAwAAAAAAAAAAAAAAAK7D+Qbg5vutcJH4/jtr
9/88bPj/PGz4/056+P+6trT/m5WS/5uVkv+alJH/sKup/urp6J3Nx8MDAAAAAAAAAADr8PuEdJT4/ztr
+P88bPj/PGz4/zxs+P9Oevj/ura0/5uVkv+blZL/m5WS/5qUkf+wrKr+7efjcQAAAADE3/Yow9/19afE
9v9ojPj/PGz4/zxs+P87a/f/UXz3/7u2tP+alJH/m5WS/5qUkf+fmpf/ysC4//riz+7w07Yb4O75hl2x
6v9Apej/gL7u/6O7+P9Wf/j/mbH5/uPo++Tx8PDjycbF/pyWk/+9t7T/8cik//6oVP/+qlr/+OTScuHu
+co+pOj/PKTo/zuj6P9Gpuj/xt72/+Ts+ousv+oFwMXcBPHv74jy4tX//q9j//+fPv//oD///59A//vk
z7XM5PbiOqPn/zyk6P88pOj/PaTn/9zs+Pa41fUTAAAAAAAAAADl3NIQ/e3g9P+gQv//oD///6A///+f
Pf/83sXYzeX24jqj5/88pOj/PKTo/z2j5//a6/j4v+P3GgAAAAAAAAAA4ubTF/3u4vf/oEL//6A///+g
P///nz3//N/F1+Pv+cg/pOj/PKPo/z+k6P+GxO//sub7/+v3+6e16O8WvejeFfL486TB5MT/79Kq//6r
W///nz7//6BB//vl0rTg7/mEYbLr/3G67P+V2fn/Ls3+/wHF//9x2/7/1PH99uH05/aP2qf/OsNn/0nE
bf+s1qf/+Mqc//6zbf/05tJwv+P3Jdvt+fRK0/7/A8X//wDG//8Axv//AMX//x7K//941pf/OcNm/zrE
Z/86xGf/OcNn/17HeP/n7uDs4dmyGQAAAADg9PuAV9X+/gDF//8Axv//AMb//wDG//8cy///eNaX/zrE
Z/86xGf/OsRn/znDZv9y0pH+3e7cbQAAAAAAAAAAk+H8Bdz0/alY1v7+AMX//wDG//8Axv//HMv//3jW
l/86xGf/OsRn/znDZv9005L+3vPkmJ/drgIAAAAAAAAAAAAAAAB+3/0FzfH9fKfn/fI4z/7/B8b//xvK
//931Zb/PcRp/17Mgf+05sTu0e/bb4/bpwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACV5f0hyfD9e9nz
/b7H7/3e3fPk3d7y5LrQ79t1n+C0HAAAAAAAAAAAAAAAAAAAAADwDwAAwAMAAIABAACAAQAAAAAAAAAA
AAAAAAAAAYAAAAGAAAAAAAAAAAAAAAAAAACAAQAAgAEAAMADAADwDwAA
</value>
</data>
<metadata name="timer1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>639, 17</value>
</metadata>

View File

@ -235,6 +235,7 @@ namespace Sunny.UI.Demo
// uiLabel1
//
this.uiLabel1.Font = new System.Drawing.Font("宋体", 12F);
this.uiLabel1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(48)))));
this.uiLabel1.Location = new System.Drawing.Point(30, 288);
this.uiLabel1.Name = "uiLabel1";
this.uiLabel1.Size = new System.Drawing.Size(698, 23);
@ -263,6 +264,7 @@ namespace Sunny.UI.Demo
// uiLabel2
//
this.uiLabel2.Font = new System.Drawing.Font("宋体", 12F);
this.uiLabel2.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(48)))));
this.uiLabel2.Location = new System.Drawing.Point(176, 383);
this.uiLabel2.Name = "uiLabel2";
this.uiLabel2.Size = new System.Drawing.Size(172, 23);
@ -272,7 +274,9 @@ namespace Sunny.UI.Demo
//
// uiLine1
//
this.uiLine1.BackColor = System.Drawing.Color.Transparent;
this.uiLine1.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.uiLine1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(48)))));
this.uiLine1.Location = new System.Drawing.Point(30, 430);
this.uiLine1.MinimumSize = new System.Drawing.Size(1, 1);
this.uiLine1.Name = "uiLine1";
@ -283,7 +287,9 @@ namespace Sunny.UI.Demo
//
// uiLine2
//
this.uiLine2.BackColor = System.Drawing.Color.Transparent;
this.uiLine2.Font = new System.Drawing.Font("宋体", 12F);
this.uiLine2.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(48)))));
this.uiLine2.Location = new System.Drawing.Point(30, 55);
this.uiLine2.MinimumSize = new System.Drawing.Size(16, 16);
this.uiLine2.Name = "uiLine2";
@ -298,12 +304,15 @@ namespace Sunny.UI.Demo
this.cbFont.DropDownStyle = Sunny.UI.UIDropDownStyle.DropDownList;
this.cbFont.FillColor = System.Drawing.Color.White;
this.cbFont.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.cbFont.ItemHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(155)))), ((int)(((byte)(200)))), ((int)(((byte)(255)))));
this.cbFont.ItemSelectForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255)))));
this.cbFont.Location = new System.Drawing.Point(101, 473);
this.cbFont.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.cbFont.MinimumSize = new System.Drawing.Size(63, 0);
this.cbFont.Name = "cbFont";
this.cbFont.Padding = new System.Windows.Forms.Padding(0, 0, 30, 2);
this.cbFont.Size = new System.Drawing.Size(469, 29);
this.cbFont.SymbolSize = 24;
this.cbFont.TabIndex = 79;
this.cbFont.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft;
this.cbFont.Watermark = "";
@ -311,6 +320,7 @@ namespace Sunny.UI.Demo
// uiLabel3
//
this.uiLabel3.Font = new System.Drawing.Font("宋体", 12F);
this.uiLabel3.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(48)))));
this.uiLabel3.Location = new System.Drawing.Point(30, 524);
this.uiLabel3.Name = "uiLabel3";
this.uiLabel3.Size = new System.Drawing.Size(172, 23);
@ -321,6 +331,7 @@ namespace Sunny.UI.Demo
// uiLabel4
//
this.uiLabel4.Font = new System.Drawing.Font("宋体", 12F);
this.uiLabel4.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(48)))));
this.uiLabel4.Location = new System.Drawing.Point(30, 476);
this.uiLabel4.Name = "uiLabel4";
this.uiLabel4.Size = new System.Drawing.Size(85, 23);
@ -359,6 +370,7 @@ namespace Sunny.UI.Demo
// uiLabel5
//
this.uiLabel5.Font = new System.Drawing.Font("宋体", 12F);
this.uiLabel5.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(48)))));
this.uiLabel5.Location = new System.Drawing.Point(511, 524);
this.uiLabel5.Name = "uiLabel5";
this.uiLabel5.Size = new System.Drawing.Size(59, 23);
@ -396,7 +408,7 @@ namespace Sunny.UI.Demo
this.Padding = new System.Windows.Forms.Padding(0, 35, 0, 0);
this.PageIndex = 999;
this.ShowTitle = true;
this.Symbol = 262210;
this.Symbol = 558295;
this.Text = "多彩主题";
this.ResumeLayout(false);

View File

@ -32,7 +32,6 @@
this.btnWarn = new Sunny.UI.UISymbolButton();
this.btnSuccess = new Sunny.UI.UISymbolButton();
this.btnAsk = new Sunny.UI.UISymbolButton();
this.btnAuto = new Sunny.UI.UISymbolButton();
this.btnStatus2 = new Sunny.UI.UISymbolButton();
this.btnInfo = new Sunny.UI.UISymbolButton();
this.btnPasswordInput = new Sunny.UI.UISymbolButton();
@ -89,7 +88,7 @@
this.btnError.StyleCustomMode = true;
this.btnError.Symbol = 61532;
this.btnError.TabIndex = 29;
this.btnError.Text = "Error";
this.btnError.Text = "错误";
this.btnError.TipsFont = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.btnError.Click += new System.EventHandler(this.btnError_Click);
//
@ -115,7 +114,7 @@
this.btnWarn.StyleCustomMode = true;
this.btnWarn.Symbol = 61553;
this.btnWarn.TabIndex = 28;
this.btnWarn.Text = "Warn";
this.btnWarn.Text = "警告";
this.btnWarn.TipsFont = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.btnWarn.Click += new System.EventHandler(this.btnWarn_Click);
//
@ -141,7 +140,7 @@
this.btnSuccess.StyleCustomMode = true;
this.btnSuccess.Symbol = 61528;
this.btnSuccess.TabIndex = 27;
this.btnSuccess.Text = "Success";
this.btnSuccess.Text = "成功";
this.btnSuccess.TipsFont = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.btnSuccess.Click += new System.EventHandler(this.btnSuccess_Click);
//
@ -154,29 +153,13 @@
this.btnAsk.Name = "btnAsk";
this.btnAsk.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0);
this.btnAsk.Size = new System.Drawing.Size(100, 35);
this.btnAsk.Style = Sunny.UI.UIStyle.Custom;
this.btnAsk.StyleCustomMode = true;
this.btnAsk.Symbol = 61529;
this.btnAsk.TabIndex = 26;
this.btnAsk.Text = "Query";
this.btnAsk.Text = "确认";
this.btnAsk.TipsFont = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.btnAsk.Click += new System.EventHandler(this.btnAsk_Click);
//
// btnAuto
//
this.btnAuto.Cursor = System.Windows.Forms.Cursors.Hand;
this.btnAuto.Font = new System.Drawing.Font("宋体", 12F);
this.btnAuto.Location = new System.Drawing.Point(30, 88);
this.btnAuto.MinimumSize = new System.Drawing.Size(1, 1);
this.btnAuto.Name = "btnAuto";
this.btnAuto.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0);
this.btnAuto.Size = new System.Drawing.Size(100, 35);
this.btnAuto.Symbol = 61732;
this.btnAuto.TabIndex = 31;
this.btnAuto.Text = "Auto";
this.btnAuto.TipsFont = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.btnAuto.Click += new System.EventHandler(this.btnAuto_Click);
//
// btnStatus2
//
this.btnStatus2.Cursor = System.Windows.Forms.Cursors.Hand;
@ -195,26 +178,16 @@
// btnInfo
//
this.btnInfo.Cursor = System.Windows.Forms.Cursors.Hand;
this.btnInfo.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(140)))), ((int)(((byte)(140)))), ((int)(((byte)(140)))));
this.btnInfo.FillColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(140)))), ((int)(((byte)(140)))), ((int)(((byte)(140)))));
this.btnInfo.FillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(163)))), ((int)(((byte)(163)))), ((int)(((byte)(163)))));
this.btnInfo.FillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(112)))), ((int)(((byte)(112)))), ((int)(((byte)(112)))));
this.btnInfo.FillSelectedColor = System.Drawing.Color.FromArgb(((int)(((byte)(112)))), ((int)(((byte)(112)))), ((int)(((byte)(112)))));
this.btnInfo.Font = new System.Drawing.Font("宋体", 12F);
this.btnInfo.Location = new System.Drawing.Point(258, 88);
this.btnInfo.Location = new System.Drawing.Point(30, 88);
this.btnInfo.MinimumSize = new System.Drawing.Size(1, 1);
this.btnInfo.Name = "btnInfo";
this.btnInfo.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0);
this.btnInfo.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(140)))), ((int)(((byte)(140)))), ((int)(((byte)(140)))));
this.btnInfo.RectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(163)))), ((int)(((byte)(163)))), ((int)(((byte)(163)))));
this.btnInfo.RectPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(112)))), ((int)(((byte)(112)))), ((int)(((byte)(112)))));
this.btnInfo.RectSelectedColor = System.Drawing.Color.FromArgb(((int)(((byte)(112)))), ((int)(((byte)(112)))), ((int)(((byte)(112)))));
this.btnInfo.Size = new System.Drawing.Size(100, 35);
this.btnInfo.Style = Sunny.UI.UIStyle.Custom;
this.btnInfo.StyleCustomMode = true;
this.btnInfo.Symbol = 61530;
this.btnInfo.TabIndex = 37;
this.btnInfo.Text = "Info";
this.btnInfo.Text = "提示";
this.btnInfo.TipsFont = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.btnInfo.Click += new System.EventHandler(this.btnInfo_Click);
//
@ -353,7 +326,7 @@
this.uiLine5.Location = new System.Drawing.Point(30, 292);
this.uiLine5.MinimumSize = new System.Drawing.Size(16, 16);
this.uiLine5.Name = "uiLine5";
this.uiLine5.Size = new System.Drawing.Size(670, 20);
this.uiLine5.Size = new System.Drawing.Size(442, 20);
this.uiLine5.TabIndex = 58;
this.uiLine5.Text = "UINotifier";
this.uiLine5.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
@ -371,7 +344,7 @@
this.uiSymbolButton2.StyleCustomMode = true;
this.uiSymbolButton2.Symbol = 61530;
this.uiSymbolButton2.TabIndex = 57;
this.uiSymbolButton2.Text = "Info";
this.uiSymbolButton2.Text = "提示";
this.uiSymbolButton2.TipsFont = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.uiSymbolButton2.Click += new System.EventHandler(this.uiSymbolButton2_Click);
//
@ -397,7 +370,7 @@
this.uiSymbolButton4.StyleCustomMode = true;
this.uiSymbolButton4.Symbol = 61532;
this.uiSymbolButton4.TabIndex = 55;
this.uiSymbolButton4.Text = "Error";
this.uiSymbolButton4.Text = "错误";
this.uiSymbolButton4.TipsFont = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.uiSymbolButton4.Click += new System.EventHandler(this.uiSymbolButton4_Click);
//
@ -423,7 +396,7 @@
this.uiSymbolButton5.StyleCustomMode = true;
this.uiSymbolButton5.Symbol = 61553;
this.uiSymbolButton5.TabIndex = 54;
this.uiSymbolButton5.Text = "Warn";
this.uiSymbolButton5.Text = "警告";
this.uiSymbolButton5.TipsFont = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.uiSymbolButton5.Click += new System.EventHandler(this.uiSymbolButton5_Click);
//
@ -449,7 +422,7 @@
this.uiSymbolButton6.StyleCustomMode = true;
this.uiSymbolButton6.Symbol = 61528;
this.uiSymbolButton6.TabIndex = 53;
this.uiSymbolButton6.Text = "Success";
this.uiSymbolButton6.Text = "成功";
this.uiSymbolButton6.TipsFont = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.uiSymbolButton6.Click += new System.EventHandler(this.uiSymbolButton6_Click);
//
@ -461,9 +434,9 @@
this.uiLine6.Location = new System.Drawing.Point(30, 450);
this.uiLine6.MinimumSize = new System.Drawing.Size(16, 16);
this.uiLine6.Name = "uiLine6";
this.uiLine6.Size = new System.Drawing.Size(328, 20);
this.uiLine6.Size = new System.Drawing.Size(668, 20);
this.uiLine6.TabIndex = 59;
this.uiLine6.Text = "ULocalize";
this.uiLine6.Text = "国际化";
this.uiLine6.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// btnEN
@ -477,7 +450,7 @@
this.btnEN.Size = new System.Drawing.Size(100, 35);
this.btnEN.Symbol = 57571;
this.btnEN.TabIndex = 61;
this.btnEN.Text = "EN";
this.btnEN.Text = "English";
this.btnEN.TipsFont = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.btnEN.Click += new System.EventHandler(this.btnEN_Click);
//
@ -493,7 +466,7 @@
this.btnCH.StyleCustomMode = true;
this.btnCH.Symbol = 57571;
this.btnCH.TabIndex = 60;
this.btnCH.Text = "CH";
this.btnCH.Text = "中文";
this.btnCH.TipsFont = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.btnCH.Click += new System.EventHandler(this.btnCH_Click);
//
@ -532,7 +505,7 @@
this.uiSymbolButton7.StyleCustomMode = true;
this.uiSymbolButton7.Symbol = 61532;
this.uiSymbolButton7.TabIndex = 64;
this.uiSymbolButton7.Text = "Error";
this.uiSymbolButton7.Text = "错误";
this.uiSymbolButton7.TipsFont = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.uiSymbolButton7.Click += new System.EventHandler(this.uiSymbolButton7_Click);
//
@ -558,7 +531,7 @@
this.uiSymbolButton8.StyleCustomMode = true;
this.uiSymbolButton8.Symbol = 61553;
this.uiSymbolButton8.TabIndex = 63;
this.uiSymbolButton8.Text = "Warn";
this.uiSymbolButton8.Text = "警告";
this.uiSymbolButton8.TipsFont = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.uiSymbolButton8.Click += new System.EventHandler(this.uiSymbolButton8_Click);
//
@ -584,7 +557,7 @@
this.uiSymbolButton9.StyleCustomMode = true;
this.uiSymbolButton9.Symbol = 61528;
this.uiSymbolButton9.TabIndex = 62;
this.uiSymbolButton9.Text = "Success";
this.uiSymbolButton9.Text = "成功";
this.uiSymbolButton9.TipsFont = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.uiSymbolButton9.Click += new System.EventHandler(this.uiSymbolButton9_Click);
//
@ -612,7 +585,7 @@
this.uiSymbolButton3.Size = new System.Drawing.Size(100, 35);
this.uiSymbolButton3.Symbol = 62144;
this.uiSymbolButton3.TabIndex = 68;
this.uiSymbolButton3.Text = "Login";
this.uiSymbolButton3.Text = "登录";
this.uiSymbolButton3.TipsFont = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.uiSymbolButton3.Click += new System.EventHandler(this.uiSymbolButton3_Click);
//
@ -627,7 +600,7 @@
this.uiSymbolButton10.Size = new System.Drawing.Size(100, 35);
this.uiSymbolButton10.Symbol = 61447;
this.uiSymbolButton10.TabIndex = 67;
this.uiSymbolButton10.Text = "Login";
this.uiSymbolButton10.Text = "登录";
this.uiSymbolButton10.TipsFont = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.uiSymbolButton10.Click += new System.EventHandler(this.uiSymbolButton10_Click);
//
@ -664,10 +637,10 @@
this.uiLine10.BackColor = System.Drawing.Color.Transparent;
this.uiLine10.Font = new System.Drawing.Font("宋体", 12F);
this.uiLine10.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(48)))));
this.uiLine10.Location = new System.Drawing.Point(372, 450);
this.uiLine10.Location = new System.Drawing.Point(486, 292);
this.uiLine10.MinimumSize = new System.Drawing.Size(16, 16);
this.uiLine10.Name = "uiLine10";
this.uiLine10.Size = new System.Drawing.Size(328, 20);
this.uiLine10.Size = new System.Drawing.Size(214, 20);
this.uiLine10.TabIndex = 74;
this.uiLine10.Text = "选择文件夹";
this.uiLine10.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
@ -676,7 +649,7 @@
//
this.uiSymbolButton13.Cursor = System.Windows.Forms.Cursors.Hand;
this.uiSymbolButton13.Font = new System.Drawing.Font("宋体", 12F);
this.uiSymbolButton13.Location = new System.Drawing.Point(372, 482);
this.uiSymbolButton13.Location = new System.Drawing.Point(484, 324);
this.uiSymbolButton13.MinimumSize = new System.Drawing.Size(1, 1);
this.uiSymbolButton13.Name = "uiSymbolButton13";
this.uiSymbolButton13.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0);
@ -719,7 +692,7 @@
//
this.AllowShowTitle = true;
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
this.ClientSize = new System.Drawing.Size(800, 549);
this.ClientSize = new System.Drawing.Size(800, 590);
this.Controls.Add(this.uiLine11);
this.Controls.Add(this.uiSymbolButton12);
this.Controls.Add(this.uiLine1);
@ -740,7 +713,6 @@
this.Controls.Add(this.uiSymbolButton1);
this.Controls.Add(this.uiLine8);
this.Controls.Add(this.uiLine6);
this.Controls.Add(this.btnAuto);
this.Controls.Add(this.uiLine3);
this.Controls.Add(this.uiSymbolButton3);
this.Controls.Add(this.btnCH);
@ -772,7 +744,6 @@
private UISymbolButton btnWarn;
private UISymbolButton btnSuccess;
private UISymbolButton btnAsk;
private UISymbolButton btnAuto;
private UISymbolButton btnStatus2;
private UISymbolButton btnInfo;
private UISymbolButton btnPasswordInput;

View File

@ -4,96 +4,110 @@ using System.Threading;
namespace Sunny.UI.Demo
{
public partial class FDialogs : UIPage
public partial class FDialogs : UIPage, ITranslate
{
public FDialogs()
{
InitializeComponent();
}
public override void Init()
{
base.Init();
btnCH.PerformClick();
}
private void btnInfo_Click(object sender, EventArgs e)
{
this.ShowInfoDialog2(CodeTranslator.Current.Default);
this.ShowInfoDialog(CodeTranslator.Current.Default);
}
private void btnAsk_Click(object sender, EventArgs e)
{
if (ShowAskDialog("确认信息提示框"))
if (this.ShowAskDialog2(CodeTranslator.Current.Confirm, true))
{
ShowSuccessTip("您点击了确定按钮");
this.ShowSuccessTip(CodeTranslator.Current.PressedOK);
}
else
{
ShowErrorTip("您点击了取消按钮");
this.ShowErrorTip(CodeTranslator.Current.PressedCancel);
}
}
private void btnAuto_Click(object sender, EventArgs e)
{
UIMessageDialog.ShowMessageDialog("跟随界面主题风格信息提示框", UILocalize.InfoTitle, false, Style);
if (this.ShowAskDialog(CodeTranslator.Current.Confirm))
{
this.ShowSuccessTip(CodeTranslator.Current.PressedOK);
}
else
{
this.ShowErrorTip(CodeTranslator.Current.PressedCancel);
}
}
private void btnSuccess_Click(object sender, EventArgs e)
{
ShowSuccessDialog("正确信息提示框");
this.ShowSuccessDialog2(CodeTranslator.Current.Success, false, 3000);
this.ShowSuccessDialog(CodeTranslator.Current.Success, false, 3000);
}
private void btnWarn_Click(object sender, EventArgs e)
{
ShowWarningDialog("警告信息提示框");
this.ShowWarningDialog2(CodeTranslator.Current.Warning);
this.ShowWarningDialog(CodeTranslator.Current.Warning);
}
private void btnError_Click(object sender, EventArgs e)
{
ShowErrorDialog("错误信息提示框");
this.ShowErrorDialog2(CodeTranslator.Current.Error);
this.ShowErrorDialog(CodeTranslator.Current.Error);
}
private void btnStatus2_Click(object sender, EventArgs e)
{
this.ShowStatusForm(100, "数据加载中......", 0);
this.ShowStatusForm(100, CodeTranslator.Current.Loading + "......", 0);
for (int i = 0; i < 88; i++)
{
SystemEx.Delay(50);
this.SetStatusFormDescription("数据加载中(" + i + "%)......");
this.SetStatusFormDescription(CodeTranslator.Current.Loading + "(" + i + "%)......");
this.SetStatusFormStepIt();
}
this.HideStatusForm();
}
private void btnInfo_Click(object sender, EventArgs e)
{
ShowInfoDialog("默认信息提示框");
}
private void btnStringInput_Click(object sender, EventArgs e)
{
string value = "请输入字符串";
if (this.InputStringDialog(ref value, true, "请输入字符串:", true))
string value = CodeTranslator.Current.InputString;
if (this.ShowInputStringDialog(ref value, true, CodeTranslator.Current.InputString, true))
{
ShowInfoDialog(value);
this.ShowInfoDialog(value);
}
}
private void btnIntInput_Click(object sender, EventArgs e)
{
int value = 0;
if (this.InputIntegerDialog(ref value))
if (this.ShowInputIntegerDialog(ref value))
{
ShowInfoDialog(value.ToString());
this.ShowInfoDialog(value.ToString());
}
}
private void btnDoubleInput_Click(object sender, EventArgs e)
{
double value = 0;
if (this.InputDoubleDialog(ref value))
if (this.ShowInputDoubleDialog(ref value))
{
ShowInfoDialog(value.ToString("F2"));
this.ShowInfoDialog(value.ToString("F2"));
}
}
private void btnPasswordInput_Click(object sender, EventArgs e)
{
string value = "";
if (this.InputPasswordDialog(ref value))
if (this.ShowInputPasswordDialog(ref value))
{
ShowInfoDialog(value);
this.ShowInfoDialog(value);
}
}
@ -103,58 +117,48 @@ namespace Sunny.UI.Demo
int index = 2;
if (this.ShowSelectDialog(ref index, items))
{
ShowInfoDialog(index.ToString());
this.ShowInfoDialog(index.ToString());
}
}
private void uiSymbolButton2_Click(object sender, EventArgs e)
{
ShowInfoNotifier("Info", InfoNotifierClick);
this.ShowInfoNotifier("Hello SunnyUI!", InfoNotifierClick);
}
private void InfoNotifierClick(object sender, EventArgs e)
private void InfoNotifierClick(object sender, DescriptionEventArgs e)
{
ShowInfoTip("嗨,你点击了右下角的弹窗消息");
this.ShowInfoTip(e.Description);
}
private void uiSymbolButton6_Click(object sender, EventArgs e)
{
ShowSuccessNotifier("Success");
this.ShowSuccessNotifier("Success");
}
private void uiSymbolButton5_Click(object sender, EventArgs e)
{
ShowWarningNotifier("Warning");
this.ShowWarningNotifier("Warning");
}
private void uiSymbolButton4_Click(object sender, EventArgs e)
{
ShowErrorNotifier("Error");
}
private void btnCH_Click(object sender, EventArgs e)
{
UILocalizeHelper.SetCH();
}
private void btnEN_Click(object sender, EventArgs e)
{
UILocalizeHelper.SetEN();
this.ShowErrorNotifier("Error");
}
private void uiSymbolButton9_Click(object sender, EventArgs e)
{
ShowSuccessTip("轻便消息提示框 - 成功");
this.ShowSuccessTip(CodeTranslator.Current.Success);
}
private void uiSymbolButton8_Click(object sender, EventArgs e)
{
ShowWarningTip("轻便消息提示框 - 警告");
this.ShowWarningTip(CodeTranslator.Current.Warning);
}
private void uiSymbolButton7_Click(object sender, EventArgs e)
{
ShowErrorTip("轻便消息提示框 - 错误");
this.ShowErrorTip(CodeTranslator.Current.Error);
}
private void uiSymbolButton10_Click(object sender, EventArgs e)
@ -163,7 +167,7 @@ namespace Sunny.UI.Demo
frm.ShowDialog();
if (frm.IsLogin)
{
UIMessageTip.ShowOk("登录成功");
UIMessageTip.ShowOk(CodeTranslator.Current.LoginSuccess);
}
frm.Dispose();
@ -184,7 +188,7 @@ namespace Sunny.UI.Demo
frm.ShowDialog();
if (frm.IsLogin)
{
UIMessageTip.ShowOk("登录成功");
UIMessageTip.ShowOk(CodeTranslator.Current.LoginSuccess);
}
frm.Dispose();
@ -197,24 +201,24 @@ namespace Sunny.UI.Demo
private void uiSymbolButton11_Click(object sender, EventArgs e)
{
this.ShowWaitForm("准备开始...");
this.ShowWaitForm(CodeTranslator.Current.Prepare);
Thread.Sleep(1000);
this.SetWaitFormDescription(UILocalize.SystemProcessing + "20%");
this.SetWaitFormDescription(UIStyles.CurrentResources.SystemProcessing + "20%");
Thread.Sleep(1000);
this.SetWaitFormDescription(UILocalize.SystemProcessing + "40%");
this.SetWaitFormDescription(UIStyles.CurrentResources.SystemProcessing + "40%");
Thread.Sleep(1000);
this.SetWaitFormDescription(UILocalize.SystemProcessing + "60%");
this.SetWaitFormDescription(UIStyles.CurrentResources.SystemProcessing + "60%");
Thread.Sleep(1000);
this.SetWaitFormDescription(UILocalize.SystemProcessing + "80%");
this.SetWaitFormDescription(UIStyles.CurrentResources.SystemProcessing + "80%");
Thread.Sleep(1000);
this.SetWaitFormDescription(UILocalize.SystemProcessing + "100%");
this.SetWaitFormDescription(UIStyles.CurrentResources.SystemProcessing + "100%");
this.HideWaitForm();
}
private void uiSymbolButton13_Click(object sender, EventArgs e)
{
string dir = "";
if (DirEx.SelectDirEx("扩展打开文件夹", ref dir))
if (DirEx.SelectDirEx(CodeTranslator.Current.OpenDir, ref dir))
{
UIMessageTip.ShowOk(dir);
}
@ -226,5 +230,43 @@ namespace Sunny.UI.Demo
Thread.Sleep(2000);
this.HideProcessForm();
}
private void btnCH_Click(object sender, EventArgs e)
{
UIStyles.CultureInfo = CultureInfos.zh_CN;
}
private void btnEN_Click(object sender, EventArgs e)
{
UIStyles.CultureInfo = CultureInfos.en_US;
}
/// <summary>
/// 重载多语翻译
/// </summary>
public override void Translate()
{
//必须保留
base.Translate();
//读取翻译代码中的多语资源
CodeTranslator.Load(this);
}
private class CodeTranslator : IniCodeTranslator<CodeTranslator>
{
public string Default { get; set; } = "默认信息提示框";
public string Confirm { get; set; } = "确认信息提示框";
public string PressedOK { get; set; } = "您点击了确定按钮";
public string PressedCancel { get; set; } = "您点击了取消按钮";
public string Success { get; set; } = "正确信息提示框";
public string Warning { get; set; } = "警告信息提示框";
public string Error { get; set; } = "错误信息提示框";
public string Loading { get; set; } = "数据加载中";
public string InputString { get; set; } = "请输入字符串";
public string PressedNotifier { get; set; } = "嗨,你点击了右下角的弹窗消息";
public string LoginSuccess { get; set; } = "登录成功";
public string Prepare { get; set; } = "准备开始";
public string OpenDir { get; set; } = "打开文件夹";
}
}
}

View File

@ -39,7 +39,7 @@ namespace Sunny.UI.Demo
frm.ShowDialog();
if (frm.IsOK)
{
ShowSuccessDialog(frm.Person.ToString());
this.ShowSuccessDialog(frm.Person.ToString());
}
frm.Dispose();
@ -116,7 +116,7 @@ namespace Sunny.UI.Demo
if (e.Form["Age"].ToString().ToInt() < 18 || e.Form["Age"].ToString().ToInt() > 60)
{
e.Form.SetEditorFocus("Age");
ShowWarningTip("年龄范围为18到60岁");
this.ShowWarningTip("年龄范围为18到60岁");
return false;
}

View File

@ -18,7 +18,7 @@
}
else
{
ShowErrorTip("用户名或者密码错误。");
this.ShowErrorTip("用户名或者密码错误。");
}
}
}

430
SunnyUI.Demo/Forms/FSymbols.Designer.cs generated Normal file
View File

@ -0,0 +1,430 @@
namespace Sunny.UI.Demo
{
partial class FSymbols
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.uiPanel1 = new Sunny.UI.UIPanel();
this.uiSymbolLabel1 = new Sunny.UI.UISymbolLabel();
this.uiSymbolButton2 = new Sunny.UI.UISymbolButton();
this.uiTextBox2 = new Sunny.UI.UITextBox();
this.uiSymbolButton1 = new Sunny.UI.UISymbolButton();
this.uiLabel1 = new Sunny.UI.UILabel();
this.uiTextBox1 = new Sunny.UI.UITextBox();
this.uiTabControl1 = new Sunny.UI.UITabControl();
this.tabPage1 = new System.Windows.Forms.TabPage();
this.lpV6Solid = new Sunny.UI.UIFlowLayoutPanel();
this.tabPage2 = new System.Windows.Forms.TabPage();
this.lpV6Regular = new Sunny.UI.UIFlowLayoutPanel();
this.tabPage3 = new System.Windows.Forms.TabPage();
this.lpV6Brands = new Sunny.UI.UIFlowLayoutPanel();
this.tabPage4 = new System.Windows.Forms.TabPage();
this.lpAwesome = new Sunny.UI.UIFlowLayoutPanel();
this.tabPage5 = new System.Windows.Forms.TabPage();
this.lpElegant = new Sunny.UI.UIFlowLayoutPanel();
this.tabPage6 = new System.Windows.Forms.TabPage();
this.lpMaterialIcons = new Sunny.UI.UIFlowLayoutPanel();
this.tabPage7 = new System.Windows.Forms.TabPage();
this.lblResult = new Sunny.UI.UIFlowLayoutPanel();
this.uiPanel1.SuspendLayout();
this.uiTabControl1.SuspendLayout();
this.tabPage1.SuspendLayout();
this.tabPage2.SuspendLayout();
this.tabPage3.SuspendLayout();
this.tabPage4.SuspendLayout();
this.tabPage5.SuspendLayout();
this.tabPage6.SuspendLayout();
this.tabPage7.SuspendLayout();
this.SuspendLayout();
//
// uiPanel1
//
this.uiPanel1.Controls.Add(this.uiSymbolLabel1);
this.uiPanel1.Controls.Add(this.uiSymbolButton2);
this.uiPanel1.Controls.Add(this.uiTextBox2);
this.uiPanel1.Controls.Add(this.uiSymbolButton1);
this.uiPanel1.Controls.Add(this.uiLabel1);
this.uiPanel1.Controls.Add(this.uiTextBox1);
this.uiPanel1.Dock = System.Windows.Forms.DockStyle.Top;
this.uiPanel1.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.uiPanel1.Location = new System.Drawing.Point(0, 35);
this.uiPanel1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.uiPanel1.MinimumSize = new System.Drawing.Size(1, 1);
this.uiPanel1.Name = "uiPanel1";
this.uiPanel1.RadiusSides = Sunny.UI.UICornerRadiusSides.None;
this.uiPanel1.RectSides = ((System.Windows.Forms.ToolStripStatusLabelBorderSides)((System.Windows.Forms.ToolStripStatusLabelBorderSides.Left | System.Windows.Forms.ToolStripStatusLabelBorderSides.Right)));
this.uiPanel1.Size = new System.Drawing.Size(1004, 46);
this.uiPanel1.TabIndex = 0;
this.uiPanel1.Text = null;
this.uiPanel1.TextAlignment = System.Drawing.ContentAlignment.MiddleCenter;
//
// uiSymbolLabel1
//
this.uiSymbolLabel1.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.uiSymbolLabel1.Location = new System.Drawing.Point(406, 6);
this.uiSymbolLabel1.MinimumSize = new System.Drawing.Size(1, 1);
this.uiSymbolLabel1.Name = "uiSymbolLabel1";
this.uiSymbolLabel1.Size = new System.Drawing.Size(98, 35);
this.uiSymbolLabel1.TabIndex = 5;
this.uiSymbolLabel1.Text = "图标值";
//
// uiSymbolButton2
//
this.uiSymbolButton2.Cursor = System.Windows.Forms.Cursors.Hand;
this.uiSymbolButton2.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.uiSymbolButton2.Location = new System.Drawing.Point(595, 6);
this.uiSymbolButton2.MinimumSize = new System.Drawing.Size(1, 1);
this.uiSymbolButton2.Name = "uiSymbolButton2";
this.uiSymbolButton2.Size = new System.Drawing.Size(100, 35);
this.uiSymbolButton2.Symbol = 557715;
this.uiSymbolButton2.TabIndex = 3;
this.uiSymbolButton2.Text = "复制";
this.uiSymbolButton2.TipsFont = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.uiSymbolButton2.Click += new System.EventHandler(this.uiSymbolButton2_Click);
//
// uiTextBox2
//
this.uiTextBox2.Cursor = System.Windows.Forms.Cursors.IBeam;
this.uiTextBox2.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.uiTextBox2.Location = new System.Drawing.Point(508, 9);
this.uiTextBox2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.uiTextBox2.MinimumSize = new System.Drawing.Size(1, 16);
this.uiTextBox2.Name = "uiTextBox2";
this.uiTextBox2.Padding = new System.Windows.Forms.Padding(5);
this.uiTextBox2.ShowText = false;
this.uiTextBox2.Size = new System.Drawing.Size(80, 29);
this.uiTextBox2.TabIndex = 2;
this.uiTextBox2.Text = "0";
this.uiTextBox2.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft;
this.uiTextBox2.Type = Sunny.UI.UITextBox.UIEditType.Integer;
this.uiTextBox2.Watermark = "";
//
// uiSymbolButton1
//
this.uiSymbolButton1.Cursor = System.Windows.Forms.Cursors.Hand;
this.uiSymbolButton1.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.uiSymbolButton1.Location = new System.Drawing.Point(286, 6);
this.uiSymbolButton1.MinimumSize = new System.Drawing.Size(1, 1);
this.uiSymbolButton1.Name = "uiSymbolButton1";
this.uiSymbolButton1.Size = new System.Drawing.Size(100, 35);
this.uiSymbolButton1.Symbol = 61442;
this.uiSymbolButton1.TabIndex = 1;
this.uiSymbolButton1.Text = "查找";
this.uiSymbolButton1.TipsFont = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.uiSymbolButton1.Click += new System.EventHandler(this.uiSymbolButton1_Click);
//
// uiLabel1
//
this.uiLabel1.AutoSize = true;
this.uiLabel1.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.uiLabel1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(48)))));
this.uiLabel1.Location = new System.Drawing.Point(19, 15);
this.uiLabel1.Name = "uiLabel1";
this.uiLabel1.Size = new System.Drawing.Size(103, 16);
this.uiLabel1.TabIndex = 4;
this.uiLabel1.Text = "图标英文名称";
this.uiLabel1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// uiTextBox1
//
this.uiTextBox1.ButtonSymbol = 361453;
this.uiTextBox1.ButtonSymbolOffset = new System.Drawing.Point(0, 1);
this.uiTextBox1.Cursor = System.Windows.Forms.Cursors.IBeam;
this.uiTextBox1.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.uiTextBox1.Location = new System.Drawing.Point(129, 9);
this.uiTextBox1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.uiTextBox1.MinimumSize = new System.Drawing.Size(1, 16);
this.uiTextBox1.Name = "uiTextBox1";
this.uiTextBox1.Padding = new System.Windows.Forms.Padding(5);
this.uiTextBox1.ShowButton = true;
this.uiTextBox1.ShowText = false;
this.uiTextBox1.Size = new System.Drawing.Size(150, 29);
this.uiTextBox1.TabIndex = 0;
this.uiTextBox1.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft;
this.uiTextBox1.Watermark = "";
this.uiTextBox1.ButtonClick += new System.EventHandler(this.uiTextBox1_ButtonClick);
this.uiTextBox1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.uiTextBox1_KeyDown);
//
// uiTabControl1
//
this.uiTabControl1.Alignment = System.Windows.Forms.TabAlignment.Bottom;
this.uiTabControl1.Controls.Add(this.tabPage1);
this.uiTabControl1.Controls.Add(this.tabPage2);
this.uiTabControl1.Controls.Add(this.tabPage3);
this.uiTabControl1.Controls.Add(this.tabPage4);
this.uiTabControl1.Controls.Add(this.tabPage5);
this.uiTabControl1.Controls.Add(this.tabPage6);
this.uiTabControl1.Controls.Add(this.tabPage7);
this.uiTabControl1.Dock = System.Windows.Forms.DockStyle.Fill;
this.uiTabControl1.DrawMode = System.Windows.Forms.TabDrawMode.OwnerDrawFixed;
this.uiTabControl1.Font = new System.Drawing.Font("宋体", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.uiTabControl1.ItemSize = new System.Drawing.Size(115, 40);
this.uiTabControl1.Location = new System.Drawing.Point(0, 81);
this.uiTabControl1.MainPage = "";
this.uiTabControl1.Name = "uiTabControl1";
this.uiTabControl1.SelectedIndex = 0;
this.uiTabControl1.Size = new System.Drawing.Size(1004, 611);
this.uiTabControl1.SizeMode = System.Windows.Forms.TabSizeMode.Fixed;
this.uiTabControl1.TabIndex = 1;
this.uiTabControl1.TipsFont = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
//
// tabPage1
//
this.tabPage1.Controls.Add(this.lpV6Solid);
this.tabPage1.Location = new System.Drawing.Point(0, 0);
this.tabPage1.Name = "tabPage1";
this.tabPage1.Size = new System.Drawing.Size(1004, 571);
this.tabPage1.TabIndex = 0;
this.tabPage1.Text = "FontAwesome V6";
this.tabPage1.UseVisualStyleBackColor = true;
//
// lpV6Solid
//
this.lpV6Solid.Dock = System.Windows.Forms.DockStyle.Fill;
this.lpV6Solid.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.lpV6Solid.Location = new System.Drawing.Point(0, 0);
this.lpV6Solid.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.lpV6Solid.MinimumSize = new System.Drawing.Size(1, 1);
this.lpV6Solid.Name = "lpV6Solid";
this.lpV6Solid.Padding = new System.Windows.Forms.Padding(2);
this.lpV6Solid.RadiusSides = Sunny.UI.UICornerRadiusSides.None;
this.lpV6Solid.ShowText = false;
this.lpV6Solid.Size = new System.Drawing.Size(1004, 571);
this.lpV6Solid.TabIndex = 0;
this.lpV6Solid.Text = "uiFlowLayoutPanel1";
this.lpV6Solid.TextAlignment = System.Drawing.ContentAlignment.MiddleCenter;
//
// tabPage2
//
this.tabPage2.Controls.Add(this.lpV6Regular);
this.tabPage2.Location = new System.Drawing.Point(0, 0);
this.tabPage2.Name = "tabPage2";
this.tabPage2.Size = new System.Drawing.Size(200, 60);
this.tabPage2.TabIndex = 1;
this.tabPage2.Text = "V6 Regular";
this.tabPage2.UseVisualStyleBackColor = true;
//
// lpV6Regular
//
this.lpV6Regular.Dock = System.Windows.Forms.DockStyle.Fill;
this.lpV6Regular.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.lpV6Regular.Location = new System.Drawing.Point(0, 0);
this.lpV6Regular.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.lpV6Regular.MinimumSize = new System.Drawing.Size(1, 1);
this.lpV6Regular.Name = "lpV6Regular";
this.lpV6Regular.Padding = new System.Windows.Forms.Padding(2);
this.lpV6Regular.RadiusSides = Sunny.UI.UICornerRadiusSides.None;
this.lpV6Regular.ShowText = false;
this.lpV6Regular.Size = new System.Drawing.Size(200, 60);
this.lpV6Regular.TabIndex = 1;
this.lpV6Regular.Text = "uiFlowLayoutPanel2";
this.lpV6Regular.TextAlignment = System.Drawing.ContentAlignment.MiddleCenter;
//
// tabPage3
//
this.tabPage3.Controls.Add(this.lpV6Brands);
this.tabPage3.Location = new System.Drawing.Point(0, 0);
this.tabPage3.Name = "tabPage3";
this.tabPage3.Size = new System.Drawing.Size(200, 60);
this.tabPage3.TabIndex = 2;
this.tabPage3.Text = "V6 Brands";
this.tabPage3.UseVisualStyleBackColor = true;
//
// lpV6Brands
//
this.lpV6Brands.Dock = System.Windows.Forms.DockStyle.Fill;
this.lpV6Brands.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.lpV6Brands.Location = new System.Drawing.Point(0, 0);
this.lpV6Brands.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.lpV6Brands.MinimumSize = new System.Drawing.Size(1, 1);
this.lpV6Brands.Name = "lpV6Brands";
this.lpV6Brands.Padding = new System.Windows.Forms.Padding(2);
this.lpV6Brands.RadiusSides = Sunny.UI.UICornerRadiusSides.None;
this.lpV6Brands.ShowText = false;
this.lpV6Brands.Size = new System.Drawing.Size(200, 60);
this.lpV6Brands.TabIndex = 1;
this.lpV6Brands.Text = "uiFlowLayoutPanel3";
this.lpV6Brands.TextAlignment = System.Drawing.ContentAlignment.MiddleCenter;
//
// tabPage4
//
this.tabPage4.Controls.Add(this.lpAwesome);
this.tabPage4.Location = new System.Drawing.Point(0, 0);
this.tabPage4.Name = "tabPage4";
this.tabPage4.Size = new System.Drawing.Size(200, 60);
this.tabPage4.TabIndex = 3;
this.tabPage4.Text = "FontAwesome V4";
this.tabPage4.UseVisualStyleBackColor = true;
//
// lpAwesome
//
this.lpAwesome.Dock = System.Windows.Forms.DockStyle.Fill;
this.lpAwesome.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.lpAwesome.Location = new System.Drawing.Point(0, 0);
this.lpAwesome.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.lpAwesome.MinimumSize = new System.Drawing.Size(1, 1);
this.lpAwesome.Name = "lpAwesome";
this.lpAwesome.Padding = new System.Windows.Forms.Padding(2);
this.lpAwesome.RadiusSides = Sunny.UI.UICornerRadiusSides.None;
this.lpAwesome.ShowText = false;
this.lpAwesome.Size = new System.Drawing.Size(200, 60);
this.lpAwesome.TabIndex = 1;
this.lpAwesome.Text = "uiFlowLayoutPanel4";
this.lpAwesome.TextAlignment = System.Drawing.ContentAlignment.MiddleCenter;
//
// tabPage5
//
this.tabPage5.Controls.Add(this.lpElegant);
this.tabPage5.Location = new System.Drawing.Point(0, 0);
this.tabPage5.Name = "tabPage5";
this.tabPage5.Size = new System.Drawing.Size(200, 60);
this.tabPage5.TabIndex = 4;
this.tabPage5.Text = "ElegantIcons";
this.tabPage5.UseVisualStyleBackColor = true;
//
// lpElegant
//
this.lpElegant.Dock = System.Windows.Forms.DockStyle.Fill;
this.lpElegant.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.lpElegant.Location = new System.Drawing.Point(0, 0);
this.lpElegant.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.lpElegant.MinimumSize = new System.Drawing.Size(1, 1);
this.lpElegant.Name = "lpElegant";
this.lpElegant.Padding = new System.Windows.Forms.Padding(2);
this.lpElegant.RadiusSides = Sunny.UI.UICornerRadiusSides.None;
this.lpElegant.ShowText = false;
this.lpElegant.Size = new System.Drawing.Size(200, 60);
this.lpElegant.TabIndex = 1;
this.lpElegant.Text = "uiFlowLayoutPanel5";
this.lpElegant.TextAlignment = System.Drawing.ContentAlignment.MiddleCenter;
//
// tabPage6
//
this.tabPage6.Controls.Add(this.lpMaterialIcons);
this.tabPage6.Location = new System.Drawing.Point(0, 0);
this.tabPage6.Name = "tabPage6";
this.tabPage6.Size = new System.Drawing.Size(200, 60);
this.tabPage6.TabIndex = 5;
this.tabPage6.Text = "MaterialIcons";
this.tabPage6.UseVisualStyleBackColor = true;
//
// lpMaterialIcons
//
this.lpMaterialIcons.Dock = System.Windows.Forms.DockStyle.Fill;
this.lpMaterialIcons.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.lpMaterialIcons.Location = new System.Drawing.Point(0, 0);
this.lpMaterialIcons.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.lpMaterialIcons.MinimumSize = new System.Drawing.Size(1, 1);
this.lpMaterialIcons.Name = "lpMaterialIcons";
this.lpMaterialIcons.Padding = new System.Windows.Forms.Padding(2);
this.lpMaterialIcons.RadiusSides = Sunny.UI.UICornerRadiusSides.None;
this.lpMaterialIcons.ShowText = false;
this.lpMaterialIcons.Size = new System.Drawing.Size(200, 60);
this.lpMaterialIcons.TabIndex = 1;
this.lpMaterialIcons.Text = "uiFlowLayoutPanel6";
this.lpMaterialIcons.TextAlignment = System.Drawing.ContentAlignment.MiddleCenter;
//
// tabPage7
//
this.tabPage7.Controls.Add(this.lblResult);
this.tabPage7.Location = new System.Drawing.Point(0, 0);
this.tabPage7.Name = "tabPage7";
this.tabPage7.Size = new System.Drawing.Size(200, 60);
this.tabPage7.TabIndex = 6;
this.tabPage7.Text = "查找结果";
this.tabPage7.UseVisualStyleBackColor = true;
//
// lblResult
//
this.lblResult.Dock = System.Windows.Forms.DockStyle.Fill;
this.lblResult.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.lblResult.Location = new System.Drawing.Point(0, 0);
this.lblResult.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.lblResult.MinimumSize = new System.Drawing.Size(1, 1);
this.lblResult.Name = "lblResult";
this.lblResult.Padding = new System.Windows.Forms.Padding(2);
this.lblResult.RadiusSides = Sunny.UI.UICornerRadiusSides.None;
this.lblResult.ShowText = false;
this.lblResult.Size = new System.Drawing.Size(200, 60);
this.lblResult.TabIndex = 1;
this.lblResult.Text = "uiFlowLayoutPanel7";
this.lblResult.TextAlignment = System.Drawing.ContentAlignment.MiddleCenter;
//
// FSymbols
//
this.AllowShowTitle = true;
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
this.ClientSize = new System.Drawing.Size(1004, 692);
this.Controls.Add(this.uiTabControl1);
this.Controls.Add(this.uiPanel1);
this.Name = "FSymbols";
this.Padding = new System.Windows.Forms.Padding(0, 35, 0, 0);
this.PageIndex = 99999;
this.ShowTitle = true;
this.Symbol = 558426;
this.Text = "字体图标";
this.Shown += new System.EventHandler(this.FSymbols_Shown);
this.uiPanel1.ResumeLayout(false);
this.uiPanel1.PerformLayout();
this.uiTabControl1.ResumeLayout(false);
this.tabPage1.ResumeLayout(false);
this.tabPage2.ResumeLayout(false);
this.tabPage3.ResumeLayout(false);
this.tabPage4.ResumeLayout(false);
this.tabPage5.ResumeLayout(false);
this.tabPage6.ResumeLayout(false);
this.tabPage7.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private UIPanel uiPanel1;
private UISymbolButton uiSymbolButton1;
private UILabel uiLabel1;
private UITextBox uiTextBox1;
private UITabControl uiTabControl1;
private System.Windows.Forms.TabPage tabPage1;
private System.Windows.Forms.TabPage tabPage2;
private System.Windows.Forms.TabPage tabPage3;
private System.Windows.Forms.TabPage tabPage4;
private System.Windows.Forms.TabPage tabPage5;
private System.Windows.Forms.TabPage tabPage6;
private System.Windows.Forms.TabPage tabPage7;
private UIFlowLayoutPanel lpV6Solid;
private UIFlowLayoutPanel lpV6Regular;
private UIFlowLayoutPanel lpV6Brands;
private UIFlowLayoutPanel lpAwesome;
private UIFlowLayoutPanel lpElegant;
private UIFlowLayoutPanel lpMaterialIcons;
private UIFlowLayoutPanel lblResult;
private UISymbolButton uiSymbolButton2;
private UITextBox uiTextBox2;
private UISymbolLabel uiSymbolLabel1;
}
}

View File

@ -0,0 +1,142 @@
using System.Windows.Forms;
namespace Sunny.UI.Demo
{
public partial class FSymbols : UIPage
{
private UISymbolPanel fontAwesomeV4;
private UISymbolPanel elegantIcons;
private UISymbolPanel fontAweSomeV6Regular;
private UISymbolPanel fontAweSomeV6Solid;
private UISymbolPanel fontAweSomeV6Brands;
private UISymbolPanel materialIcons;
private UISymbolPanel searchSymbolPanel;
public FSymbols()
{
InitializeComponent();
fontAwesomeV4 = new UISymbolPanel(typeof(FontAwesomeIcons), UISymbolType.FontAwesomeV4);
elegantIcons = new UISymbolPanel(typeof(FontElegantIcons), UISymbolType.FontAwesomeV4);
fontAweSomeV6Regular = new UISymbolPanel(typeof(FontAweSomeV6Regular), UISymbolType.FontAwesomeV6Regular);
fontAweSomeV6Solid = new UISymbolPanel(typeof(FontAweSomeV6Solid), UISymbolType.FontAwesomeV6Solid);
fontAweSomeV6Brands = new UISymbolPanel(typeof(FontAweSomeV6Brands), UISymbolType.FontAwesomeV6Brands);
materialIcons = new UISymbolPanel(typeof(MaterialIcons), UISymbolType.MaterialIcons);
searchSymbolPanel = new UISymbolPanel();
lpV6Solid.Add(fontAweSomeV6Solid);
lpV6Regular.Add(fontAweSomeV6Regular);
lpV6Brands.Add(fontAweSomeV6Brands);
lpElegant.Add(elegantIcons);
lpMaterialIcons.Add(materialIcons);
lblResult.Add(searchSymbolPanel);
lpAwesome.Add(fontAwesomeV4);
fontAwesomeV4.ValueChanged += CustomSymbolPanel_ValueChanged;
elegantIcons.ValueChanged += CustomSymbolPanel_ValueChanged;
fontAweSomeV6Brands.ValueChanged += CustomSymbolPanel_ValueChanged;
fontAweSomeV6Regular.ValueChanged += CustomSymbolPanel_ValueChanged;
fontAweSomeV6Solid.ValueChanged += CustomSymbolPanel_ValueChanged;
materialIcons.ValueChanged += CustomSymbolPanel_ValueChanged;
searchSymbolPanel.ValueChanged += CustomSymbolPanel_ValueChanged;
}
private void CustomSymbolPanel_ValueChanged(object sender, SymbolValue symbol)
{
uiTextBox2.IntValue = symbol.Value;
uiSymbolLabel1.Symbol = symbol.Value;
this.ShowInfoTip(symbol.ToString());
}
private void uiSymbolButton1_Click(object sender, System.EventArgs e)
{
string filter = uiTextBox1.Text.Trim();
fontAwesomeV4.Filter = filter;
elegantIcons.Filter = filter;
fontAweSomeV6Regular.Filter = filter;
fontAweSomeV6Solid.Filter = filter;
fontAweSomeV6Brands.Filter = filter;
materialIcons.Filter = filter;
searchSymbolPanel.Clear();
if (filter.IsNullOrEmpty()) return;
for (int i = 0; i < fontAwesomeV4.SymbolCount; i++)
{
var value = fontAwesomeV4.Get(i);
if (value.Name.ToUpper().Contains(filter.ToUpper()))
searchSymbolPanel.Add(value);
}
for (int i = 0; i < elegantIcons.SymbolCount; i++)
{
var value = elegantIcons.Get(i);
if (value.Name.ToUpper().Contains(filter.ToUpper()))
searchSymbolPanel.Add(value);
}
for (int i = 0; i < fontAweSomeV6Regular.SymbolCount; i++)
{
var value = fontAweSomeV6Regular.Get(i);
if (value.Name.ToUpper().Contains(filter.ToUpper()))
searchSymbolPanel.Add(value);
}
for (int i = 0; i < fontAweSomeV6Solid.SymbolCount; i++)
{
var value = fontAweSomeV6Solid.Get(i);
if (value.Name.ToUpper().Contains(filter.ToUpper()))
searchSymbolPanel.Add(value);
}
for (int i = 0; i < fontAweSomeV6Brands.SymbolCount; i++)
{
var value = fontAweSomeV6Brands.Get(i);
if (value.Name.ToUpper().Contains(filter.ToUpper()))
searchSymbolPanel.Add(value);
}
for (int i = 0; i < materialIcons.SymbolCount; i++)
{
var value = materialIcons.Get(i);
if (value.Name.ToUpper().Contains(filter.ToUpper()))
searchSymbolPanel.Add(value);
}
searchSymbolPanel.Invalidate();
uiTabControl1.SelectedTab = tabPage7;
}
private void FSymbols_Shown(object sender, System.EventArgs e)
{
uiTabControl1.SelectedTab = tabPage1;
uiTextBox1.Focus();
}
public override void Init()
{
base.Init();
uiTextBox1.Focus();
searchSymbolPanel.Clear();
}
private void uiSymbolButton2_Click(object sender, System.EventArgs e)
{
Clipboard.SetText(uiTextBox2.Text);
}
private void uiTextBox1_ButtonClick(object sender, System.EventArgs e)
{
uiTextBox1.Text = "";
uiSymbolButton1.PerformClick();
uiTabControl1.SelectedTab = tabPage1;
}
private void uiTextBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
uiSymbolButton1.PerformClick();
}
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -56,6 +56,7 @@ namespace Sunny.UI.Demo
this.uiDigitalLabel2 = new Sunny.UI.UIDigitalLabel();
this.uiDigitalLabel1 = new Sunny.UI.UIDigitalLabel();
this.uiLine4 = new Sunny.UI.UILine();
this.uiBattery7 = new Sunny.UI.UIBattery();
this.SuspendLayout();
//
// uiBattery6
@ -170,7 +171,7 @@ namespace Sunny.UI.Demo
this.uiLedStopwatch1.Name = "uiLedStopwatch1";
this.uiLedStopwatch1.Size = new System.Drawing.Size(190, 34);
this.uiLedStopwatch1.TabIndex = 61;
this.uiLedStopwatch1.Text = "12:50";
this.uiLedStopwatch1.Text = "01:05";
//
// uiLedDisplay1
//
@ -330,7 +331,6 @@ namespace Sunny.UI.Demo
this.uiDigitalLabel2.Size = new System.Drawing.Size(208, 38);
this.uiDigitalLabel2.TabIndex = 108;
this.uiDigitalLabel2.Text = "uiDigitalLabel2";
this.uiDigitalLabel2.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
this.uiDigitalLabel2.Value = 6789.9D;
//
// uiDigitalLabel1
@ -344,7 +344,6 @@ namespace Sunny.UI.Demo
this.uiDigitalLabel1.Size = new System.Drawing.Size(208, 42);
this.uiDigitalLabel1.TabIndex = 107;
this.uiDigitalLabel1.Text = "uiDigitalLabel1";
this.uiDigitalLabel1.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
this.uiDigitalLabel1.TextOffset = new System.Drawing.Point(6, 0);
this.uiDigitalLabel1.Value = -123.45D;
//
@ -361,11 +360,25 @@ namespace Sunny.UI.Demo
this.uiLine4.Text = "UIDigitalLabel";
this.uiLine4.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// uiBattery7
//
this.uiBattery7.Font = new System.Drawing.Font("宋体", 12F);
this.uiBattery7.Location = new System.Drawing.Point(42, 410);
this.uiBattery7.MinimumSize = new System.Drawing.Size(1, 1);
this.uiBattery7.Name = "uiBattery7";
this.uiBattery7.Size = new System.Drawing.Size(73, 105);
this.uiBattery7.SymbolOffset = new System.Drawing.Point(1, 3);
this.uiBattery7.SymbolRotate = 270;
this.uiBattery7.SymbolSize = 100;
this.uiBattery7.TabIndex = 110;
this.uiBattery7.Text = "uiBattery7";
//
// FLed
//
this.AllowShowTitle = true;
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
this.ClientSize = new System.Drawing.Size(800, 555);
this.Controls.Add(this.uiBattery7);
this.Controls.Add(this.uiLine4);
this.Controls.Add(this.uiDigitalLabel2);
this.Controls.Add(this.uiDigitalLabel1);
@ -428,5 +441,6 @@ namespace Sunny.UI.Demo
private UIDigitalLabel uiDigitalLabel2;
private UIDigitalLabel uiDigitalLabel1;
private UILine uiLine4;
private UIBattery uiBattery7;
}
}

View File

@ -19,7 +19,7 @@
private void timer1_Tick(object sender, System.EventArgs e)
{
value++;
uiBattery1.Power = value;
uiBattery7.Power = uiBattery1.Power = value;
uiLedDisplay1.Text = value + " Ω";
uiDigitalLabel2.Value += 0.1;
}

View File

@ -45,6 +45,12 @@ namespace Sunny.UI.Demo
this.uiLedBulb6 = new Sunny.UI.UILedBulb();
this.uiLight5 = new Sunny.UI.UILight();
this.uiLight6 = new Sunny.UI.UILight();
this.uiStatusBox1 = new Sunny.UI.UIStatusBox();
this.uiLine1 = new Sunny.UI.UILine();
this.uiButton1 = new Sunny.UI.UIButton();
this.uiButton2 = new Sunny.UI.UIButton();
this.uiButton3 = new Sunny.UI.UIButton();
((System.ComponentModel.ISupportInitialize)(this.uiStatusBox1)).BeginInit();
this.SuspendLayout();
//
// uiLedBulb4
@ -78,7 +84,9 @@ namespace Sunny.UI.Demo
//
// uiLine8
//
this.uiLine8.BackColor = System.Drawing.Color.Transparent;
this.uiLine8.Font = new System.Drawing.Font("宋体", 12F);
this.uiLine8.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(48)))));
this.uiLine8.Location = new System.Drawing.Point(381, 55);
this.uiLine8.MinimumSize = new System.Drawing.Size(16, 16);
this.uiLine8.Name = "uiLine8";
@ -144,7 +152,9 @@ namespace Sunny.UI.Demo
//
// uiLine2
//
this.uiLine2.BackColor = System.Drawing.Color.Transparent;
this.uiLine2.Font = new System.Drawing.Font("宋体", 12F);
this.uiLine2.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(48)))));
this.uiLine2.Location = new System.Drawing.Point(30, 55);
this.uiLine2.MinimumSize = new System.Drawing.Size(16, 16);
this.uiLine2.Name = "uiLine2";
@ -223,11 +233,113 @@ namespace Sunny.UI.Demo
this.uiLight6.TabIndex = 75;
this.uiLight6.Text = "uiLight6";
//
// uiStatusBox1
//
this.uiStatusBox1.Image = global::Sunny.UI.Demo.Properties.Resources.led_g;
this.uiStatusBox1.Location = new System.Drawing.Point(30, 272);
this.uiStatusBox1.Name = "uiStatusBox1";
this.uiStatusBox1.Size = new System.Drawing.Size(36, 36);
this.uiStatusBox1.Status1 = global::Sunny.UI.Demo.Properties.Resources.led_g;
this.uiStatusBox1.Status2 = global::Sunny.UI.Demo.Properties.Resources.led_y;
this.uiStatusBox1.Status3 = global::Sunny.UI.Demo.Properties.Resources.led_r;
this.uiStatusBox1.TabIndex = 77;
this.uiStatusBox1.TabStop = false;
//
// uiLine1
//
this.uiLine1.BackColor = System.Drawing.Color.Transparent;
this.uiLine1.Font = new System.Drawing.Font("宋体", 12F);
this.uiLine1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(48)))));
this.uiLine1.Location = new System.Drawing.Point(30, 230);
this.uiLine1.MinimumSize = new System.Drawing.Size(16, 16);
this.uiLine1.Name = "uiLine1";
this.uiLine1.Size = new System.Drawing.Size(319, 20);
this.uiLine1.TabIndex = 79;
this.uiLine1.Text = "UILight";
this.uiLine1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// uiButton1
//
this.uiButton1.Cursor = System.Windows.Forms.Cursors.Hand;
this.uiButton1.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(110)))), ((int)(((byte)(190)))), ((int)(((byte)(40)))));
this.uiButton1.FillColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(110)))), ((int)(((byte)(190)))), ((int)(((byte)(40)))));
this.uiButton1.FillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(139)))), ((int)(((byte)(203)))), ((int)(((byte)(83)))));
this.uiButton1.FillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(152)))), ((int)(((byte)(32)))));
this.uiButton1.FillSelectedColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(152)))), ((int)(((byte)(32)))));
this.uiButton1.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.uiButton1.LightColor = System.Drawing.Color.FromArgb(((int)(((byte)(245)))), ((int)(((byte)(251)))), ((int)(((byte)(241)))));
this.uiButton1.Location = new System.Drawing.Point(78, 273);
this.uiButton1.MinimumSize = new System.Drawing.Size(1, 1);
this.uiButton1.Name = "uiButton1";
this.uiButton1.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(110)))), ((int)(((byte)(190)))), ((int)(((byte)(40)))));
this.uiButton1.RectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(139)))), ((int)(((byte)(203)))), ((int)(((byte)(83)))));
this.uiButton1.RectPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(152)))), ((int)(((byte)(32)))));
this.uiButton1.RectSelectedColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(152)))), ((int)(((byte)(32)))));
this.uiButton1.Size = new System.Drawing.Size(75, 35);
this.uiButton1.Style = Sunny.UI.UIStyle.Custom;
this.uiButton1.TabIndex = 80;
this.uiButton1.Text = "切换";
this.uiButton1.TipsFont = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.uiButton1.Click += new System.EventHandler(this.uiButton1_Click);
//
// uiButton2
//
this.uiButton2.Cursor = System.Windows.Forms.Cursors.Hand;
this.uiButton2.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(155)))), ((int)(((byte)(40)))));
this.uiButton2.FillColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(155)))), ((int)(((byte)(40)))));
this.uiButton2.FillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(227)))), ((int)(((byte)(175)))), ((int)(((byte)(83)))));
this.uiButton2.FillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(176)))), ((int)(((byte)(124)))), ((int)(((byte)(32)))));
this.uiButton2.FillSelectedColor = System.Drawing.Color.FromArgb(((int)(((byte)(176)))), ((int)(((byte)(124)))), ((int)(((byte)(32)))));
this.uiButton2.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.uiButton2.LightColor = System.Drawing.Color.FromArgb(((int)(((byte)(253)))), ((int)(((byte)(249)))), ((int)(((byte)(241)))));
this.uiButton2.Location = new System.Drawing.Point(159, 273);
this.uiButton2.MinimumSize = new System.Drawing.Size(1, 1);
this.uiButton2.Name = "uiButton2";
this.uiButton2.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(155)))), ((int)(((byte)(40)))));
this.uiButton2.RectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(227)))), ((int)(((byte)(175)))), ((int)(((byte)(83)))));
this.uiButton2.RectPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(176)))), ((int)(((byte)(124)))), ((int)(((byte)(32)))));
this.uiButton2.RectSelectedColor = System.Drawing.Color.FromArgb(((int)(((byte)(176)))), ((int)(((byte)(124)))), ((int)(((byte)(32)))));
this.uiButton2.Size = new System.Drawing.Size(75, 35);
this.uiButton2.Style = Sunny.UI.UIStyle.Custom;
this.uiButton2.TabIndex = 81;
this.uiButton2.Text = "切换";
this.uiButton2.TipsFont = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.uiButton2.Click += new System.EventHandler(this.uiButton2_Click);
//
// uiButton3
//
this.uiButton3.Cursor = System.Windows.Forms.Cursors.Hand;
this.uiButton3.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(80)))), ((int)(((byte)(80)))));
this.uiButton3.FillColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(80)))), ((int)(((byte)(80)))));
this.uiButton3.FillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(115)))), ((int)(((byte)(115)))));
this.uiButton3.FillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(184)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
this.uiButton3.FillSelectedColor = System.Drawing.Color.FromArgb(((int)(((byte)(184)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
this.uiButton3.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.uiButton3.LightColor = System.Drawing.Color.FromArgb(((int)(((byte)(253)))), ((int)(((byte)(243)))), ((int)(((byte)(243)))));
this.uiButton3.Location = new System.Drawing.Point(240, 273);
this.uiButton3.MinimumSize = new System.Drawing.Size(1, 1);
this.uiButton3.Name = "uiButton3";
this.uiButton3.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(80)))), ((int)(((byte)(80)))));
this.uiButton3.RectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(115)))), ((int)(((byte)(115)))));
this.uiButton3.RectPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(184)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
this.uiButton3.RectSelectedColor = System.Drawing.Color.FromArgb(((int)(((byte)(184)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
this.uiButton3.Size = new System.Drawing.Size(75, 35);
this.uiButton3.Style = Sunny.UI.UIStyle.Custom;
this.uiButton3.TabIndex = 82;
this.uiButton3.Text = "切换";
this.uiButton3.TipsFont = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.uiButton3.Click += new System.EventHandler(this.uiButton3_Click);
//
// FLight
//
this.AllowShowTitle = true;
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
this.ClientSize = new System.Drawing.Size(800, 450);
this.Controls.Add(this.uiButton3);
this.Controls.Add(this.uiButton2);
this.Controls.Add(this.uiButton1);
this.Controls.Add(this.uiLine1);
this.Controls.Add(this.uiStatusBox1);
this.Controls.Add(this.uiLight5);
this.Controls.Add(this.uiLight6);
this.Controls.Add(this.uiLedBulb5);
@ -247,6 +359,7 @@ namespace Sunny.UI.Demo
this.ShowTitle = true;
this.Symbol = 362751;
this.Text = "Light";
((System.ComponentModel.ISupportInitialize)(this.uiStatusBox1)).EndInit();
this.ResumeLayout(false);
}
@ -267,5 +380,10 @@ namespace Sunny.UI.Demo
private UILedBulb uiLedBulb6;
private UILight uiLight5;
private UILight uiLight6;
private UIStatusBox uiStatusBox1;
private UILine uiLine1;
private UIButton uiButton1;
private UIButton uiButton2;
private UIButton uiButton3;
}
}

View File

@ -6,5 +6,27 @@
{
InitializeComponent();
}
public enum LightState
{
Green = 1,
Yellow = 2,
Red = 3
}
private void uiButton1_Click(object sender, System.EventArgs e)
{
uiStatusBox1.Status = (int)LightState.Green;
}
private void uiButton2_Click(object sender, System.EventArgs e)
{
uiStatusBox1.Status = (int)LightState.Yellow;
}
private void uiButton3_Click(object sender, System.EventArgs e)
{
uiStatusBox1.Status = (int)LightState.Red;
}
}
}

View File

@ -9,7 +9,7 @@
private void uiTurnSwitch1_ValueChanged(object sender, bool value)
{
ShowInfoTip(value.ToString());
this.ShowInfoTip(value.ToString());
}
}
}

View File

@ -13,6 +13,13 @@ namespace Sunny.UI.Demo
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
//增加一个繁体中文的内置资源配置
UIStyles.BuiltInResources.TryAdd(CultureInfos.zh_TW.LCID, new zh_TW_Resources());
//从项目方案生成多语言配置文件生成文件在可执行文件夹的Language目录下
//生成后界面没有修改的情况下,可注释掉下一行,只运行一次即可
//TranslateHelper.LoadCsproj(@"D:\Source\SunnyUI\SunnyUI.Demo\SunnyUI.Demo.csproj");
Application.Run(new FMain());
}
}

View File

@ -9,7 +9,7 @@ using System.Runtime.InteropServices;
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("SunnyUI.Net")]
[assembly: AssemblyProduct("SunnyUI.Demo")]
[assembly: AssemblyCopyright("Copyright ©SunnyUI.Net 2012-2023")]
[assembly: AssemblyCopyright("Copyright ©SunnyUI.Net 2012-2024")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
@ -31,5 +31,5 @@ using System.Runtime.InteropServices;
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
//通过使用 "*",如下所示:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("3.4.2.0")]
[assembly: AssemblyFileVersion("3.4.2.0")]
[assembly: AssemblyVersion("3.8.0.1")]
[assembly: AssemblyFileVersion("3.8.0.1")]

View File

@ -470,6 +470,36 @@ namespace Sunny.UI.Demo.Properties {
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap led_g {
get {
object obj = ResourceManager.GetObject("led_g", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap led_r {
get {
object obj = ResourceManager.GetObject("led_r", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap led_y {
get {
object obj = ResourceManager.GetObject("led_y", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
@ -600,6 +630,16 @@ namespace Sunny.UI.Demo.Properties {
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap Sunny24 {
get {
object obj = ResourceManager.GetObject("Sunny24", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
@ -623,9 +663,9 @@ namespace Sunny.UI.Demo.Properties {
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap SunnyUISmall {
internal static System.Drawing.Bitmap SunnyUI72 {
get {
object obj = ResourceManager.GetObject("SunnyUISmall", resourceCulture);
object obj = ResourceManager.GetObject("SunnyUI72", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}

View File

@ -214,6 +214,15 @@
<data name="lazio" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\lazio.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="led_g" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\led_g.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="led_r" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\led_r.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="led_y" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\led_y.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="mallorca" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\mallorca.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
@ -253,14 +262,17 @@
<data name="sevilla" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\sevilla.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Sunny24" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Sunny24.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="SunnyLogin" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\SunnyLogin.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="SunnyUI" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\SunnyUI.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="SunnyUISmall" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\SunnyUISmall.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
<data name="SunnyUI72" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\SunnyUI72.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Tom" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Tom.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@ -41,15 +41,34 @@
<ApplicationManifest>app.manifest</ApplicationManifest>
</PropertyGroup>
<ItemGroup>
<Reference Include="SunnyUI, Version=3.6.2.0, Culture=neutral, PublicKeyToken=27d7d2e821d97aeb, processorArchitecture=MSIL">
<HintPath>..\packages\SunnyUI.3.6.2\lib\net472\SunnyUI.dll</HintPath>
<Reference Include="SunnyUI, Version=3.8.3.0, Culture=neutral, PublicKeyToken=27d7d2e821d97aeb, processorArchitecture=MSIL">
<HintPath>..\packages\SunnyUI.3.8.3\lib\net472\SunnyUI.dll</HintPath>
</Reference>
<Reference Include="SunnyUI.Common, Version=3.5.1.0, Culture=neutral, PublicKeyToken=5a271fb7ba597231, processorArchitecture=MSIL">
<HintPath>..\packages\SunnyUI.Common.3.5.1\lib\net472\SunnyUI.Common.dll</HintPath>
<Reference Include="SunnyUI.COM, Version=9.0.3.1, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\SunnyUI.COM.9.0.3.1\lib\net472\SunnyUI.COM.dll</HintPath>
</Reference>
<Reference Include="SunnyUI.Common, Version=3.8.3.0, Culture=neutral, PublicKeyToken=5a271fb7ba597231, processorArchitecture=MSIL">
<HintPath>..\packages\SunnyUI.Common.3.8.3\lib\net472\SunnyUI.Common.dll</HintPath>
</Reference>
<Reference Include="SunnyUI.FrameDecoder, Version=7.6.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\SunnyUI.FrameDecoder.7.6.0\lib\net472\SunnyUI.FrameDecoder.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Buffers, Version=4.0.5.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Buffers.4.6.1\lib\net462\System.Buffers.dll</HintPath>
</Reference>
<Reference Include="System.Core" />
<Reference Include="System.Design" />
<Reference Include="System.Memory, Version=4.0.5.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Memory.4.6.3\lib\net462\System.Memory.dll</HintPath>
</Reference>
<Reference Include="System.Numerics" />
<Reference Include="System.Numerics.Vectors, Version=4.1.6.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Numerics.Vectors.4.6.1\lib\net462\System.Numerics.Vectors.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=6.0.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.6.1.2\lib\net462\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
</Reference>
<Reference Include="System.Web.Extensions" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
@ -145,6 +164,12 @@
<Compile Include="Forms\Frames\FCustomMain.Designer.cs">
<DependentUpon>FCustomMain.cs</DependentUpon>
</Compile>
<Compile Include="Forms\FSymbols.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Forms\FSymbols.Designer.cs">
<DependentUpon>FSymbols.cs</DependentUpon>
</Compile>
<Compile Include="Industrial\FSwitch.cs">
<SubType>Form</SubType>
</Compile>
@ -388,6 +413,7 @@
<DependentUpon>FCommon.cs</DependentUpon>
</Compile>
<Compile Include="Units\UMapperDemo.cs" />
<Compile Include="Units\UZhTW.cs" />
<EmbeddedResource Include="Charts\FDoughnutChart.resx">
<DependentUpon>FDoughnutChart.cs</DependentUpon>
</EmbeddedResource>
@ -430,6 +456,9 @@
<EmbeddedResource Include="Forms\Frames\FCustomMain.resx">
<DependentUpon>FCustomMain.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Forms\FSymbols.resx">
<DependentUpon>FSymbols.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Industrial\FLight.resx">
<DependentUpon>FLight.cs</DependentUpon>
</EmbeddedResource>
@ -741,6 +770,11 @@
<None Include="Resources\9.png" />
<None Include="Resources\Home_32x32.png" />
<None Include="Resources\Tom.gif" />
<None Include="Resources\Sunny24.png" />
<None Include="Resources\SunnyUI72.png" />
<None Include="Resources\led_g.png" />
<None Include="Resources\led_r.png" />
<None Include="Resources\led_y.png" />
<Content Include="SunnyUI.ico" />
</ItemGroup>
<ItemGroup />

View File

@ -0,0 +1,55 @@
using System.Globalization;
namespace Sunny.UI.Demo
{
/// <summary>
/// 多語言字符串定義
/// </summary>
public class zh_TW_Resources : UIBuiltInResources
{
public override CultureInfo CultureInfo { get; } = CultureInfos.zh_TW;
public override string InfoTitle { get; set; } = "提示";
public override string SuccessTitle { get; set; } = "正確";
public override string WarningTitle { get; set; } = "警告";
public override string ErrorTitle { get; set; } = "錯誤";
public override string AskTitle { get; set; } = "提示";
public override string InputTitle { get; set; } = "輸入";
public override string SelectTitle { get; set; } = "選擇";
public override string CloseAll { get; set; } = "全部關閉";
public override string OK { get; set; } = "確定";
public override string Cancel { get; set; } = "取消";
public override string GridNoData { get; set; } = "[ 無資料 ]";
public override string GridDataLoading { get; set; } = "資料加載中,請稍候...";
public override string GridDataSourceException { get; set; } = "資料源必須為DataTable或者List";
public override string SystemProcessing { get; set; } = "系統正在處理中,請稍候...";
public override string Monday { get; set; } = "一";
public override string Tuesday { get; set; } = "二";
public override string Wednesday { get; set; } = "三";
public override string Thursday { get; set; } = "四";
public override string Friday { get; set; } = "五";
public override string Saturday { get; set; } = "六";
public override string Sunday { get; set; } = "日";
public override string Prev { get; set; } = "上一頁";
public override string Next { get; set; } = "下一頁";
public override string SelectPageLeft { get; set; } = "第";
public override string SelectPageRight { get; set; } = "頁";
public override string January { get; set; } = "一月";
public override string February { get; set; } = "二月";
public override string March { get; set; } = "三月";
public override string April { get; set; } = "四月";
public override string May { get; set; } = "五月";
public override string June { get; set; } = "六月";
public override string July { get; set; } = "七月";
public override string August { get; set; } = "八月";
public override string September { get; set; } = "九月";
public override string October { get; set; } = "十月";
public override string November { get; set; } = "十一月";
public override string December { get; set; } = "十二月";
public override string Today { get; set; } = "今天";
public override string Search { get; set; } = "搜尋";
public override string Clear { get; set; } = "清除";
public override string Open { get; set; } = "打開";
public override string Save { get; set; } = "保存";
public override string All { get; set; } = "全部";
}
}

View File

@ -1,3 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2"/></startup></configuration>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" /></startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="SunnyUI.Common" publicKeyToken="5a271fb7ba597231" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.7.0.0" newVersion="3.7.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.3.0" newVersion="6.0.3.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.5.0" newVersion="4.0.5.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.5.0" newVersion="4.0.5.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

View File

@ -1,5 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="SunnyUI" version="3.6.2" targetFramework="net472" />
<package id="SunnyUI.Common" version="3.5.1" targetFramework="net472" />
<package id="SunnyUI" version="3.8.3" targetFramework="net472" />
<package id="SunnyUI.COM" version="9.0.3.1" targetFramework="net472" />
<package id="SunnyUI.Common" version="3.8.3" targetFramework="net472" />
<package id="SunnyUI.FrameDecoder" version="7.6.0" targetFramework="net472" />
<package id="System.Buffers" version="4.6.1" targetFramework="net472" />
<package id="System.Memory" version="4.6.3" targetFramework="net472" />
<package id="System.Numerics.Vectors" version="4.6.1" targetFramework="net472" />
<package id="System.Runtime.CompilerServices.Unsafe" version="6.1.2" targetFramework="net472" />
</packages>

View File

@ -2,3 +2,139 @@
# Default severity for analyzer diagnostics with category 'Style'
dotnet_analyzer_diagnostic.category-Style.severity = none
# WFO1000: A property should determine its property content serialization with the DesignerSerializationVisibilityAttribute, DefaultValueAttribute or the ShouldSerializeProperty method
dotnet_diagnostic.WFO1000.severity = silent
csharp_using_directive_placement = outside_namespace:silent
csharp_style_expression_bodied_methods = false:silent
csharp_style_expression_bodied_constructors = false:silent
csharp_style_expression_bodied_operators = false:silent
csharp_style_expression_bodied_properties = true:silent
csharp_style_expression_bodied_indexers = true:silent
csharp_style_expression_bodied_accessors = true:silent
csharp_style_expression_bodied_lambdas = true:silent
csharp_style_expression_bodied_local_functions = false:silent
csharp_style_conditional_delegate_call = true:suggestion
csharp_style_var_for_built_in_types = false:silent
csharp_space_around_binary_operators = before_and_after
csharp_indent_labels = one_less_than_current
csharp_style_var_when_type_is_apparent = false:silent
csharp_style_var_elsewhere = false:silent
csharp_prefer_simple_using_statement = true:suggestion
csharp_prefer_braces = true:silent
csharp_style_namespace_declarations = block_scoped:silent
csharp_style_prefer_method_group_conversion = true:silent
csharp_style_prefer_top_level_statements = true:silent
csharp_style_prefer_primary_constructors = true:suggestion
csharp_prefer_system_threading_lock = true:suggestion
csharp_prefer_static_local_function = true:suggestion
csharp_prefer_static_anonymous_function = true:suggestion
csharp_style_prefer_readonly_struct = true:suggestion
csharp_style_prefer_readonly_struct_member = true:suggestion
csharp_style_allow_embedded_statements_on_same_line_experimental = true:silent
csharp_style_allow_blank_lines_between_consecutive_braces_experimental = true:silent
csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = true:silent
csharp_style_allow_blank_line_after_token_in_conditional_expression_experimental = true:silent
csharp_style_allow_blank_line_after_token_in_arrow_expression_clause_experimental = true:silent
csharp_style_prefer_switch_expression = true:suggestion
csharp_style_prefer_pattern_matching = true:silent
csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion
csharp_style_pattern_matching_over_as_with_null_check = true:suggestion
csharp_style_prefer_not_pattern = true:suggestion
csharp_style_prefer_extended_property_pattern = true:suggestion
csharp_style_throw_expression = true:suggestion
csharp_style_prefer_null_check_over_type_check = true:suggestion
csharp_prefer_simple_default_expression = true:suggestion
csharp_style_prefer_local_over_anonymous_function = true:suggestion
csharp_style_prefer_index_operator = true:suggestion
csharp_style_prefer_range_operator = true:suggestion
csharp_style_implicit_object_creation_when_type_is_apparent = true:suggestion
csharp_style_prefer_tuple_swap = true:suggestion
csharp_style_prefer_utf8_string_literals = true:suggestion
csharp_style_inlined_variable_declaration = true:suggestion
csharp_style_deconstructed_variable_declaration = true:suggestion
csharp_style_unused_value_assignment_preference = discard_variable:suggestion
csharp_style_unused_value_expression_statement_preference = discard_variable:silent
[*.{cs,vb}]
#### 命名样式 ####
# 命名规则
dotnet_naming_rule.interface_should_be_以_i_开始.severity = suggestion
dotnet_naming_rule.interface_should_be_以_i_开始.symbols = interface
dotnet_naming_rule.interface_should_be_以_i_开始.style = 以_i_开始
dotnet_naming_rule.类型_should_be_帕斯卡拼写法.severity = suggestion
dotnet_naming_rule.类型_should_be_帕斯卡拼写法.symbols = 类型
dotnet_naming_rule.类型_should_be_帕斯卡拼写法.style = 帕斯卡拼写法
dotnet_naming_rule.非字段成员_should_be_帕斯卡拼写法.severity = suggestion
dotnet_naming_rule.非字段成员_should_be_帕斯卡拼写法.symbols = 非字段成员
dotnet_naming_rule.非字段成员_should_be_帕斯卡拼写法.style = 帕斯卡拼写法
# 符号规范
dotnet_naming_symbols.interface.applicable_kinds = interface
dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.interface.required_modifiers =
dotnet_naming_symbols.类型.applicable_kinds = class, struct, interface, enum
dotnet_naming_symbols.类型.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.类型.required_modifiers =
dotnet_naming_symbols.非字段成员.applicable_kinds = property, event, method
dotnet_naming_symbols.非字段成员.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.非字段成员.required_modifiers =
# 命名样式
dotnet_naming_style.以_i_开始.required_prefix = I
dotnet_naming_style.以_i_开始.required_suffix =
dotnet_naming_style.以_i_开始.word_separator =
dotnet_naming_style.以_i_开始.capitalization = pascal_case
dotnet_naming_style.帕斯卡拼写法.required_prefix =
dotnet_naming_style.帕斯卡拼写法.required_suffix =
dotnet_naming_style.帕斯卡拼写法.word_separator =
dotnet_naming_style.帕斯卡拼写法.capitalization = pascal_case
dotnet_naming_style.帕斯卡拼写法.required_prefix =
dotnet_naming_style.帕斯卡拼写法.required_suffix =
dotnet_naming_style.帕斯卡拼写法.word_separator =
dotnet_naming_style.帕斯卡拼写法.capitalization = pascal_case
end_of_line = crlf
dotnet_style_qualification_for_field = false:silent
dotnet_style_qualification_for_property = false:silent
dotnet_style_qualification_for_method = false:silent
dotnet_style_qualification_for_event = false:silent
tab_width = 4
indent_size = 4
dotnet_style_operator_placement_when_wrapping = beginning_of_line
dotnet_style_require_accessibility_modifiers = for_non_interface_members:silent
dotnet_code_quality_unused_parameters = all:suggestion
dotnet_style_readonly_field = true:suggestion
dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent
dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent
dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent
dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent
dotnet_style_allow_multiple_blank_lines_experimental = true:silent
dotnet_style_allow_statement_immediately_after_block_experimental = true:silent
dotnet_style_coalesce_expression = true:suggestion
dotnet_style_null_propagation = true:suggestion
dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion
dotnet_style_prefer_auto_properties = true:silent
dotnet_style_object_initializer = true:suggestion
dotnet_style_collection_initializer = true:suggestion
dotnet_style_prefer_simplified_boolean_expressions = true:suggestion
dotnet_style_prefer_conditional_expression_over_assignment = true:silent
dotnet_style_prefer_conditional_expression_over_return = true:silent
dotnet_style_explicit_tuple_names = true:suggestion
dotnet_style_prefer_inferred_tuple_names = true:suggestion
dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion
dotnet_style_prefer_compound_assignment = true:suggestion
dotnet_style_prefer_simplified_interpolation = true:suggestion
dotnet_style_prefer_collection_expression = when_types_loosely_match:suggestion
dotnet_style_namespace_match_folder = true:suggestion
dotnet_style_predefined_type_for_locals_parameters_members = true:silent
dotnet_style_predefined_type_for_member_access = true:silent
dotnet_diagnostic.CA2022.severity = silent

View File

@ -1,6 +1,6 @@
/******************************************************************************
* SunnyUI
* CopyRight (C) 2012-2023 ShenYongHua().
* CopyRight (C) 2012-2025 ShenYongHua().
* QQ群56829229 QQ17612584 EMailSunnyUI@QQ.Com
*
* Blog: https://www.cnblogs.com/yhuse
@ -31,6 +31,9 @@
* 2023-05-13: V3.3.6 Option.BarInterval,Bar之间间隔-1
* 2023-05-14: V3.3.6 DrawString函数
* 2023-06-06: V3.3.7 Y轴文字居中
* 2024-06-08: V3.6.6 X轴文字带角度显示时居中
* 2024-10-25: V3.7.2 ShowData
* 2025-03-05: V3.8.1 Y轴零度线偏移量Option.ZeroLineOffset
******************************************************************************/
using System;
@ -47,6 +50,7 @@ namespace Sunny.UI
/// 柱状图
/// </summary>
[ToolboxItem(true)]
[Description("柱状图控件")]
public class UIBarChart : UIChart
{
private bool NeedDraw;
@ -208,7 +212,7 @@ namespace Sunny.UI
float ww = Math.Min(x2, series.MaxWidth);
xx -= ww / 2.0f;
float YZeroPos = YScale.CalcYPixel(0, DrawOrigin.Y, DrawSize.Height);
float YZeroPos = YScale.CalcYPixel(Option.ZeroLineOffset, DrawOrigin.Y, DrawSize.Height);
float VPos = YScale.CalcYPixel(series.Data[j], DrawOrigin.Y, DrawSize.Height);
if (VPos <= YZeroPos)
@ -254,7 +258,7 @@ namespace Sunny.UI
float ww = Math.Min(x2, series.MaxWidth);
float xl = (DrawBarWidth - Option.SeriesCount * ww - (Option.SeriesCount - 1) * Option.BarInterval) / 2.0f;
float xx = barX + xl + i * ww + i * Option.BarInterval;
float YZeroPos = YScale.CalcYPixel(0, DrawOrigin.Y, DrawSize.Height);
float YZeroPos = YScale.CalcYPixel(Option.ZeroLineOffset, DrawOrigin.Y, DrawSize.Height);
float VPos = YScale.CalcYPixel(series.Data[j], DrawOrigin.Y, DrawSize.Height);
if (VPos <= YZeroPos)
@ -513,7 +517,7 @@ namespace Sunny.UI
{
int angle = (Option.XAxis.AxisLabel.Angle + 36000) % 360;
if (angle > 0 && angle <= 90)
g.DrawRotateString(data, TempFont, ForeColor, new PointF(start, DrawOrigin.Y + Option.XAxis.AxisTick.Length),
g.DrawRotateString(data, TempFont, ForeColor, new PointF(start + DrawBarWidth / 2, DrawOrigin.Y + Option.XAxis.AxisTick.Length),
new StringFormat() { Alignment = StringAlignment.Far }, (3600 - Option.XAxis.AxisLabel.Angle) % 360);
else
g.DrawString(data, TempFont, ForeColor, new Rectangle((int)start, DrawOrigin.Y + Option.XAxis.AxisTick.Length, (int)DrawBarWidth, Height), ContentAlignment.TopCenter);
@ -535,6 +539,11 @@ namespace Sunny.UI
double[] YLabels = YScale.CalcLabels();
float[] labels = YScale.CalcYPixels(YLabels, DrawOrigin.Y, DrawSize.Height);
float wmax = 0;
using Pen pn = new Pen(ForeColor);
pn.DashStyle = DashStyle.Dash;
pn.DashPattern = new float[] { 3, 3 };
for (int i = 0; i < labels.Length; i++)
{
if (labels[i] > DrawOrigin.Y) continue;
@ -545,17 +554,16 @@ namespace Sunny.UI
if (YLabels[i].IsNanOrInfinity()) continue;
if (!Option.YAxis.ShowGridLine) continue;
if (!YLabels[i].EqualsDouble(0))
{
using Pen pn = new Pen(ForeColor);
pn.DashStyle = DashStyle.Dash;
pn.DashPattern = new float[] { 3, 3 };
g.DrawLine(pn, DrawOrigin.X, labels[i], Width - Option.Grid.Right, labels[i]);
}
else
{
g.DrawLine(ForeColor, DrawOrigin.X, labels[i], Width - Option.Grid.Right, labels[i]);
}
//if (!YLabels[i].EqualsDouble(Option.ZeroLineOffset))
//{
g.DrawLine(pn, DrawOrigin.X, labels[i], Width - Option.Grid.Right, labels[i]);
//}
//else
//{
// g.DrawLine(ForeColor, DrawOrigin.X, labels[i], Width - Option.Grid.Right, labels[i]);
//}
}
if (Option.YAxis.AxisLabel.Show)
@ -574,6 +582,9 @@ namespace Sunny.UI
float yy = Option.Grid.Top + DrawSize.Height / 2.0f;
g.DrawRotateString(Option.YAxis.Name, TempFont, ForeColor, new PointF(xx, yy), 270);
}
float YZeroPos = YScale.CalcYPixel(Option.ZeroLineOffset, DrawOrigin.Y, DrawSize.Height);
g.DrawLine(ForeColor, DrawOrigin.X, YZeroPos, Width - Option.Grid.Right, YZeroPos);
}
private void DrawAxisScales(Graphics g)
@ -645,5 +656,23 @@ namespace Sunny.UI
public UIBarSeries Series { get; set; }
}
public void ShowData(string[] labels, double[] values, string title = "")
{
int len = Math.Min(labels.Length, values.Length);
if (len == 0) return;
UIBarOption option = new UIBarOption();
option.Title.Text = title;
var series = new UIBarSeries();
for (int i = 0; i < len; i++)
{
option.XAxis.Data.Add(labels[i]);
series.AddData(values[i]);
}
option.Series.Add(series);
SetOption(option);
}
}
}

View File

@ -1,6 +1,6 @@
/******************************************************************************
* SunnyUI
* CopyRight (C) 2012-2023 ShenYongHua().
* CopyRight (C) 2012-2025 ShenYongHua().
* QQ群56829229 QQ17612584 EMailSunnyUI@QQ.Com
*
* Blog: https://www.cnblogs.com/yhuse
@ -87,6 +87,11 @@ namespace Sunny.UI
public int BarInterval { get; set; } = -1;
/// <summary>
/// Y轴零度线偏移
/// </summary>
public double ZeroLineOffset { get; set; } = 0;
public void AddSeries(UIBarSeries series)
{
if (series == null)

View File

@ -1,6 +1,6 @@
/******************************************************************************
* SunnyUI
* CopyRight (C) 2012-2023 ShenYongHua().
* CopyRight (C) 2012-2025 ShenYongHua().
* QQ群56829229 QQ17612584 EMailSunnyUI@QQ.Com
*
* Blog: https://www.cnblogs.com/yhuse
@ -73,7 +73,7 @@ namespace Sunny.UI
tip.Visible = false;
}
protected readonly UITransparentPanel tip = new UITransparentPanel();
internal readonly UITransparentPanel tip = new UITransparentPanel();
private UIChartStyleType chartStyleType = UIChartStyleType.Plain;
[DefaultValue(UIChartStyleType.Plain)]

View File

@ -1,6 +1,6 @@
/******************************************************************************
* SunnyUI
* CopyRight (C) 2012-2023 ShenYongHua().
* CopyRight (C) 2012-2025 ShenYongHua().
* QQ群56829229 QQ17612584 EMailSunnyUI@QQ.Com
*
* Blog: https://www.cnblogs.com/yhuse

View File

@ -1,6 +1,6 @@
/******************************************************************************
* SunnyUI
* CopyRight (C) 2012-2023 ShenYongHua().
* CopyRight (C) 2012-2025 ShenYongHua().
* QQ群56829229 QQ17612584 EMailSunnyUI@QQ.Com
*
* Blog: https://www.cnblogs.com/yhuse
@ -20,6 +20,7 @@
* 2021-07-22: V3.0.5
* 2022-07-29: V3.2.2 Option.DecimalPlaces
* 2023-05-14: V3.3.6 DrawString函数
* 2024-05-07: V3.6.6 0
******************************************************************************/
using System;
@ -31,7 +32,7 @@ using System.Windows.Forms;
namespace Sunny.UI
{
[ToolboxItem(true), Description("甜甜圈图")]
[ToolboxItem(true), Description("甜甜圈图控件")]
public sealed class UIDoughnutChart : UIChart
{
/// <summary>
@ -126,12 +127,11 @@ namespace Sunny.UI
all += data.Value;
}
if (all.IsZero()) return;
float start = 0;
for (int i = 0; i < pie.Data.Count; i++)
{
float angle = (float)(pie.Data[i].Value * 360.0f / all);
float percent = (float)(pie.Data[i].Value * 100.0f / all);
float angle = all.IsZero() ? 0 : (float)(pie.Data[i].Value * 360.0f / all);
float percent = all.IsZero() ? 0 : (float)(pie.Data[i].Value * 100.0f / all);
string text = "";
if (Option.ToolTip != null)
{
@ -166,26 +166,42 @@ namespace Sunny.UI
for (int pieIndex = 0; pieIndex < series.Count; pieIndex++)
{
var pie = series[pieIndex];
if (pie.Data.Count == 0) continue;
for (int azIndex = 0; azIndex < pie.Data.Count; azIndex++)
double all = 0;
foreach (var data in pie.Data)
{
Angle angle = Angles[pieIndex][azIndex];
Color color = ChartStyle.GetColor(azIndex);
UIPieSeriesData data = pie.Data[azIndex];
if (data.StyleCustomMode) color = data.Color;
all += data.Value;
}
if (ActiveAzIndex == azIndex)
g.FillFan(color, angle.Center, angle.Inner, angle.Outer + 5, angle.Start - 90, angle.Sweep);
else
g.FillFan(color, angle.Center, angle.Inner, angle.Outer, angle.Start - 90, angle.Sweep);
Angles[pieIndex][azIndex].TextSize = TextRenderer.MeasureText(Angles[pieIndex][azIndex].Text, TempFont);
if (pie.Label.Show && ActiveAzIndex == azIndex)
if (all.IsZero())
{
Angle angle = Angles[pieIndex][0];
g.DrawEllipse(rectColor, new RectangleF(angle.Center.X - angle.Inner, angle.Center.Y - angle.Inner, angle.Inner * 2, angle.Inner * 2));
g.DrawEllipse(rectColor, new RectangleF(angle.Center.X - angle.Outer, angle.Center.Y - angle.Outer, angle.Outer * 2, angle.Outer * 2));
}
else
{
for (int azIndex = 0; azIndex < pie.Data.Count; azIndex++)
{
if (pie.Label.Position == UIPieSeriesLabelPosition.Center)
Angle angle = Angles[pieIndex][azIndex];
Color color = ChartStyle.GetColor(azIndex);
UIPieSeriesData data = pie.Data[azIndex];
if (data.StyleCustomMode) color = data.Color;
if (ActiveAzIndex == azIndex)
g.FillFan(color, angle.Center, angle.Inner, angle.Outer + 5, angle.Start - 90, angle.Sweep);
else
g.FillFan(color, angle.Center, angle.Inner, angle.Outer, angle.Start - 90, angle.Sweep);
Angles[pieIndex][azIndex].TextSize = TextRenderer.MeasureText(Angles[pieIndex][azIndex].Text, TempFont);
if (pie.Label.Show && ActiveAzIndex == azIndex)
{
g.DrawString(pie.Data[azIndex].Name, Font, color, new Rectangle((int)angle.Center.X - Width, (int)angle.Center.Y - Height, Width * 2, Height * 2), ContentAlignment.MiddleCenter);
if (pie.Label.Position == UIPieSeriesLabelPosition.Center)
{
g.DrawString(pie.Data[azIndex].Name, Font, color, new Rectangle((int)angle.Center.X - Width, (int)angle.Center.Y - Height, Width * 2, Height * 2), ContentAlignment.MiddleCenter);
}
}
}
}
@ -233,9 +249,9 @@ namespace Sunny.UI
{
Angle angle = Angles[pieIndex][azIndex];
PointF pf = angle.Center;
if (Drawing.CalcDistance(e.Location, pf) > angle.Outer) continue;
if (Drawing.CalcDistance(e.Location, pf) < angle.Inner) continue;
double az = Drawing.CalcAngle(e.Location, pf);
if (e.Location.CalcDistance(pf) > angle.Outer) continue;
if (e.Location.CalcDistance(pf) < angle.Inner) continue;
double az = e.Location.CalcAngle(pf);
if (az >= angle.Start && az <= angle.Start + angle.Sweep)
{
SetPieAndAzIndex(pieIndex, azIndex);

View File

@ -1,6 +1,6 @@
/******************************************************************************
* SunnyUI
* CopyRight (C) 2012-2023 ShenYongHua().
* CopyRight (C) 2012-2025 ShenYongHua().
* QQ群56829229 QQ17612584 EMailSunnyUI@QQ.Com
*
* Blog: https://www.cnblogs.com/yhuse
@ -52,6 +52,9 @@
* 2023-10-05: V3.5.0 X轴和Y轴鼠标选择区域并返回选中范围
* 2023-10-20: V3.5.1 线DashStyle样式
* 2023-11-22: V3.6.0
* 2024-07-01: V3.6.7 Y轴自定义坐标显示
* 2024-11-13: V3.7.2 线
* 2024-11-14: V3.7.2 线
******************************************************************************/
using System;
@ -66,10 +69,19 @@ using System.Windows.Forms;
namespace Sunny.UI
{
[ToolboxItem(true)]
[Description("曲线图控件")]
public class UILineChart : UIChart
{
protected bool NeedDraw;
[DefaultValue(MouseLineType.None)]
[Description("鼠标移上绘制十字线样式"), Category("SunnyUI")]
public MouseLineType MouseLine { get; set; }
[DefaultValue(typeof(Color), "Red")]
[Description("鼠标移上绘制十字线颜色"), Category("SunnyUI")]
public Color MouseLineColor { get; set; } = Color.Red;
/// <summary>
/// 重载控件尺寸变更
/// </summary>
@ -97,7 +109,7 @@ namespace Sunny.UI
NeedDraw = false;
if (Option?.Series == null || Option.Series.Count == 0) return;
if (DrawSize.Width <= 0 || DrawSize.Height <= 0) return;
CalcAxises();
CalcAxes();
foreach (var series in Option.Series.Values)
{
@ -136,7 +148,7 @@ namespace Sunny.UI
protected UIScale YScale;
protected UIScale Y2Scale;
protected void CalcAxises()
protected void CalcAxes()
{
if (Option.XAxisType == UIAxisType.DateTime)
XScale = new UIDateScale();
@ -288,6 +300,23 @@ namespace Sunny.UI
DrawAxisScales(g);
DrawPointSymbols(g);
DrawOther(g);
if (MousePoint.InRect(DrawRect))
{
switch (MouseLine)
{
case MouseLineType.Horizontal:
g.DrawLine(MouseLineColor, DrawRect.Left + 1, MousePoint.Y, DrawRect.Right - 1, MousePoint.Y);
break;
case MouseLineType.Vertical:
g.DrawLine(MouseLineColor, MousePoint.X, DrawRect.Top + 1, MousePoint.X, DrawRect.Bottom - 1);
break;
case MouseLineType.Cross:
g.DrawLine(MouseLineColor, DrawRect.Left + 1, MousePoint.Y, DrawRect.Right - 1, MousePoint.Y);
g.DrawLine(MouseLineColor, MousePoint.X, DrawRect.Top + 1, MousePoint.X, DrawRect.Bottom - 1);
break;
}
}
}
private void DrawAxis(Graphics g)
@ -445,6 +474,11 @@ namespace Sunny.UI
else
label = YLabels[i].ToString("F" + Option.YAxis.AxisLabel.DecimalPlaces);
if (Option.YAxis.HaveCustomLabels && Option.YAxis.CustomLabels.GetLabel(i).IsValid())
{
label = Option.YAxis.CustomLabels.GetLabel(i);
}
Size sf = TextRenderer.MeasureText(label, TempFont);
widthMax = Math.Max(widthMax, sf.Width);
@ -842,6 +876,7 @@ namespace Sunny.UI
private readonly List<UILineSelectPoint> selectPoints = new List<UILineSelectPoint>();
private readonly List<UILineSelectPoint> selectPointsTemp = new List<UILineSelectPoint>();
public Point MousePoint;
/// <summary>
/// 重载鼠标移动事件
/// </summary>
@ -949,7 +984,7 @@ namespace Sunny.UI
using Graphics g = this.CreateGraphics();
using var TempFont = Font.DPIScaleFont(UIStyles.DefaultSubFontSize);
Size sf = TextRenderer.MeasureText(sb.ToString(), TempFont);
tip.Size = new Size(sf.Width + 4, sf.Height + 4);
tip.Size = new Size(sf.Width + 4, sf.Height + 10);
int x = e.Location.X + 15;
int y = e.Location.Y + 20;
@ -1008,6 +1043,9 @@ namespace Sunny.UI
}
}
MousePoint = e.Location;
if (MouseLine != MouseLineType.None) Invalidate();
}
public delegate void OnPointValue(object sender, UILineSelectPoint[] points);

View File

@ -1,6 +1,6 @@
/******************************************************************************
* SunnyUI
* CopyRight (C) 2012-2023 ShenYongHua().
* CopyRight (C) 2012-2025 ShenYongHua().
* QQ群56829229 QQ17612584 EMailSunnyUI@QQ.Com
*
* Blog: https://www.cnblogs.com/yhuse
@ -33,6 +33,14 @@ using System.Linq;
namespace Sunny.UI
{
public enum MouseLineType
{
None,
Horizontal,
Vertical,
Cross
}
public enum UISeriesDataOrder
{
X,

View File

@ -1,6 +1,6 @@
/******************************************************************************
* SunnyUI
* CopyRight (C) 2012-2023 ShenYongHua().
* CopyRight (C) 2012-2025 ShenYongHua().
* QQ群56829229 QQ17612584 EMailSunnyUI@QQ.Com
*
* Blog: https://www.cnblogs.com/yhuse

View File

@ -1,6 +1,6 @@
/******************************************************************************
* SunnyUI
* CopyRight (C) 2012-2023 ShenYongHua().
* CopyRight (C) 2012-2025 ShenYongHua().
* QQ群56829229 QQ17612584 EMailSunnyUI@QQ.Com
*
* Blog: https://www.cnblogs.com/yhuse
@ -32,6 +32,7 @@ using System.Windows.Forms;
namespace Sunny.UI
{
[ToolboxItem(true)]
[Description("饼状图控件")]
public sealed class UIPieChart : UIChart
{
/// <summary>
@ -273,9 +274,9 @@ namespace Sunny.UI
if (!e.Location.InRect(rect)) continue;
PointF pf = new PointF(rect.Left + rect.Width / 2.0f, rect.Top + rect.Height / 2.0f);
if (Drawing.CalcDistance(e.Location, pf) * 2 > rect.Width) continue;
if (e.Location.CalcDistance(pf) * 2 > rect.Width) continue;
double az = Drawing.CalcAngle(e.Location, pf);
double az = e.Location.CalcAngle(pf);
for (int azIndex = 0; azIndex < Option.Series[pieIndex].Data.Count; azIndex++)
{
Angle angle = Angles[pieIndex][azIndex];

View File

@ -1,6 +1,6 @@
/******************************************************************************
* SunnyUI
* CopyRight (C) 2012-2023 ShenYongHua().
* CopyRight (C) 2012-2025 ShenYongHua().
* QQ群56829229 QQ17612584 EMailSunnyUI@QQ.Com
*
* Blog: https://www.cnblogs.com/yhuse

View File

@ -1,6 +1,6 @@
/******************************************************************************
* SunnyUI
* CopyRight (C) 2012-2023 ShenYongHua().
* CopyRight (C) 2012-2025 ShenYongHua().
* QQ群56829229 QQ17612584 EMailSunnyUI@QQ.Com
*
* Blog: https://www.cnblogs.com/yhuse

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,133 @@
using System;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using Microsoft.Win32;
namespace Sunny.UI
{
public static class ApplicationEx
{
private static readonly string StartUpPath = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";
/// <summary>
/// 获取当前应用程序的 GUID
/// </summary>
/// <returns>应用程序的 GUID</returns>
public static Guid AppGuid()
{
var asm = Assembly.GetEntryAssembly();
if (asm == null) return Guid.Empty;
object[] attr = (asm.GetCustomAttributes(typeof(GuidAttribute), true));
return attr.Length > 0 && attr[0] is GuidAttribute ga ? new Guid(ga.Value) : Guid.Empty;
}
/// <summary>
/// 获取指定特殊文件夹的路径,并处理路径格式
/// </summary>
/// <param name="specialFolder">特殊文件夹枚举</param>
/// <returns>处理后的文件夹路径</returns>
public static string Folder(this Environment.SpecialFolder specialFolder) => Environment.GetFolderPath(specialFolder).DealPath();
/// <summary>
/// 获取指定特殊文件夹下的应用程序文件夹路径,并在必要时创建该文件夹
/// </summary>
/// <param name="specialFolder">特殊文件夹枚举</param>
/// <param name="createIfNotExists">如果文件夹不存在,是否创建</param>
/// <returns>应用程序文件夹路径</returns>
public static string FolderWithApplication(this Environment.SpecialFolder specialFolder, bool createIfNotExists = true)
{
var dir = (specialFolder.Folder() + Application.ProductName).DealPath();
if (createIfNotExists) Dir.CreateDir(dir);
return dir;
}
/// <summary>
/// 获取当前漫游用户的应用程序特定数据的公共储存库的目录
/// C:\Users\{YourUserName}\AppData\Roaming\{Application.ProductName}\
/// </summary>
/// <returns>应用程序数据文件夹路径</returns>
public static string ApplicationDataFolder() => Environment.SpecialFolder.ApplicationData.FolderWithApplication();
/// <summary>
/// 获取当前非漫游用户使用的应用程序特定数据的公共储存库的目录
/// C:\Users\{YourUserName}\AppData\Local\{Application.ProductName}\
/// </summary>
/// <returns>本地应用程序数据文件夹路径</returns>
public static string LocalApplicationDataFolder() => Environment.SpecialFolder.LocalApplicationData.FolderWithApplication();
/// <summary>
/// 获取所有用户使用的应用程序特定数据的公共储存库的目录
/// C:\ProgramData \{Application.ProductName}\
/// </summary>
/// <returns>公共应用程序数据文件夹路径</returns>
public static string CommonApplicationDataFolder() => Environment.SpecialFolder.CommonApplicationData.FolderWithApplication();
/// <summary>
/// 增加当前程序到开机自动运行
/// </summary>
/// <param name="arguments">启动参数</param>
public static void AddToStartup(string arguments)
{
using var key = Registry.CurrentUser.OpenSubKey(StartUpPath, true);
key?.SetValue(Application.ProductName, $"\"{Application.ExecutablePath}\" {arguments}");
}
/// <summary>
/// 增加当前程序到开机自动运行
/// </summary>
public static void AddToStartup()
{
using var key = Registry.CurrentUser.OpenSubKey(StartUpPath, true);
key?.SetValue(Application.ProductName, $"\"{Application.ExecutablePath}\"");
}
/// <summary>
/// 从开机自动运行移除当前程序
/// </summary>
public static void RemoveFromStartup()
{
using var key = Registry.CurrentUser.OpenSubKey(StartUpPath, true);
if (Application.ProductName != null) key?.DeleteValue(Application.ProductName, false);
}
/// <summary>
/// 判断当前程序是否开机自动运行
/// </summary>
/// <returns>是否开机自动运行</returns>
public static bool StartupEnabled()
{
using var key = Registry.CurrentUser.OpenSubKey(StartUpPath, false);
return key != null && key.GetValue(Application.ProductName) != null;
}
/// <summary>
/// 检查并更新当前程序开机自动运行路径
/// </summary>
public static void CheckAndUpdateStartupPath()
{
if (!StartupEnabled()) return;
string arg = string.Empty;
// 从注册表键值中读取启动参数
using var key = Registry.CurrentUser.OpenSubKey(StartUpPath, true);
if (key == null) return;
string oldValue = key.GetValue(Application.ProductName)?.ToString();
if (oldValue == null) return;
if (oldValue.StartsWith("\""))
{
arg = string.Join("\"", oldValue.Split('\"').Skip(2)).Trim();
}
else if (oldValue.Contains(" "))
{
arg = string.Join(" ", oldValue.Split(' ').Skip(1));
}
if (string.IsNullOrEmpty(arg))
AddToStartup();
else
AddToStartup(arg);
}
}
}

View File

@ -1,11 +1,33 @@
namespace Sunny.UI
{
/// <summary>
/// 提供程序集引用的常量定义。
/// </summary>
internal static class AssemblyRefEx
{
/// <summary>
/// 程序集版本号。
/// </summary>
internal const string Version = "4.0.0.0";
/// <summary>
/// Microsoft 公钥。
/// </summary>
internal const string MicrosoftPublicKey = "b03f5f7f11d50a3a";
/// <summary>
/// System.Design 程序集引用。
/// </summary>
internal const string SystemDesign = "System.Design, Version=" + Version + ", Culture=neutral, PublicKeyToken=" + MicrosoftPublicKey;
/// <summary>
/// System.Drawing.Design 程序集引用。
/// </summary>
internal const string SystemDrawingDesign = "System.Drawing.Design, Version=" + Version + ", Culture=neutral, PublicKeyToken=" + MicrosoftPublicKey;
/// <summary>
/// System.Drawing 程序集引用。
/// </summary>
internal const string SystemDrawing = "System.Drawing, Version=" + Version + ", Culture=neutral, PublicKeyToken=" + MicrosoftPublicKey;
}
}

View File

@ -1,6 +1,6 @@
/******************************************************************************
* SunnyUI
* CopyRight (C) 2012-2023 ShenYongHua().
* CopyRight (C) 2012-2025 ShenYongHua().
* QQ群56829229 QQ17612584 EMailSunnyUI@QQ.Com
*
* Blog: https://www.cnblogs.com/yhuse
@ -57,10 +57,14 @@ namespace Sunny.UI
BackgroundLoop
}
private static SoundPlayer _SoundPlayer;
private static SoundPlayer _soundPlayer;
#region Methods
/// <summary>
/// 停止播放声音。
/// </summary>
/// <param name="sound">SoundPlayer 对象。</param>
private static void InternalStop(SoundPlayer sound)
{
new SecurityPermission(SecurityPermissionFlag.UnmanagedCode).Assert();
@ -74,60 +78,66 @@ namespace Sunny.UI
}
}
/// <summary>播放。wav声音文件。</summary>
/// <param name="location">String包含声音文件的名称 </param>
/// <PermissionSet><IPermission class="System.Security.Permissions.EnvironmentPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true" /><IPermission class="System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true" /><IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Flags="UnmanagedCode, ControlThread" /><IPermission class="System.Net.WebPermission, System, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true" /></PermissionSet>
/// <summary>
/// 播放 .wav 声音文件。
/// </summary>
/// <param name="location">包含声音文件的名称的字符串。</param>
public static void Play(string location)
{
Play(location, AudioPlayMode.Background);
}
/// <summary>
/// 播放。wav声音文件.
/// 播放 .wav 声音文件。
/// </summary>
/// <param name="location">AudioPlayMode枚举模式播放声音。默认情况下AudioPlayMode.Background。</param>
/// <param name="playMode">String包含声音文件的名称</param>
/// <param name="location">包含声音文件的名称的字符串。</param>
/// <param name="playMode">AudioPlayMode 枚举,指示播放模式。</param>
public static void Play(string location, AudioPlayMode playMode)
{
ValidateAudioPlayModeEnum(playMode, "playMode");
string text1 = ValidateFilename(location);
SoundPlayer player1 = new SoundPlayer(text1);
Play(player1, playMode);
ValidateAudioPlayModeEnum(playMode, nameof(playMode));
var validatedLocation = ValidateFilename(location);
SoundPlayer player = new SoundPlayer(validatedLocation);
Play(player, playMode);
}
/// <summary>
/// 根据播放模式播放声音。
/// </summary>
/// <param name="sound">SoundPlayer 对象。</param>
/// <param name="mode">AudioPlayMode 枚举,指示播放模式。</param>
private static void Play(SoundPlayer sound, AudioPlayMode mode)
{
if (_SoundPlayer != null)
if (_soundPlayer != null)
{
InternalStop(_SoundPlayer);
InternalStop(_soundPlayer);
}
_SoundPlayer = sound;
_soundPlayer = sound;
switch (mode)
{
case AudioPlayMode.WaitToComplete:
_SoundPlayer.PlaySync();
return;
_soundPlayer.PlaySync();
break;
case AudioPlayMode.Background:
_SoundPlayer.Play();
return;
_soundPlayer.Play();
break;
case AudioPlayMode.BackgroundLoop:
_SoundPlayer.PlayLooping();
return;
_soundPlayer.PlayLooping();
break;
}
}
/// <summary>
/// 播放系统声音。
/// </summary>
/// <param name="systemSound">对象代表系统播放声音。</param>
/// <param name="systemSound">SystemSound 对象代表系统播放声音。</param>
public static void PlaySystemSound(SystemSound systemSound)
{
if (systemSound == null)
{
throw new ArgumentNullException();
throw new ArgumentNullException(nameof(systemSound));
}
systemSound.Play();
@ -136,26 +146,35 @@ namespace Sunny.UI
/// <summary>
/// 停止在后台播放声音。
/// </summary>
/// <filterpriority>1</filterpriority>
public static void Stop()
{
SoundPlayer player1 = new SoundPlayer();
InternalStop(player1);
SoundPlayer player = new SoundPlayer();
InternalStop(player);
}
/// <summary>
/// 验证 AudioPlayMode 枚举值。
/// </summary>
/// <param name="value">AudioPlayMode 枚举值。</param>
/// <param name="paramName">参数名称。</param>
private static void ValidateAudioPlayModeEnum(AudioPlayMode value, string paramName)
{
if ((value < AudioPlayMode.WaitToComplete) || (value > AudioPlayMode.BackgroundLoop))
if (!Enum.IsDefined(typeof(AudioPlayMode), value))
{
throw new InvalidEnumArgumentException(paramName, (int)value, typeof(AudioPlayMode));
}
}
/// <summary>
/// 验证文件名。
/// </summary>
/// <param name="location">文件名字符串。</param>
/// <returns>验证后的文件名。</returns>
private static string ValidateFilename(string location)
{
if (string.IsNullOrEmpty(location))
{
throw new ArgumentNullException();
throw new ArgumentNullException(nameof(location));
}
return location;
@ -170,18 +189,18 @@ namespace Sunny.UI
public static class Mp3Player
{
/// <summary>
/// 播放
/// 播放 MP3 文件。
/// </summary>
/// <param name="MP3_FileName">文件名</param>
/// <param name="Repeat">重复</param>
public static void Play(string MP3_FileName, bool Repeat)
/// <param name="mp3FileName">文件名。</param>
/// <param name="repeat">是否重复播放。</param>
public static void Play(string mp3FileName, bool repeat)
{
Win32.WinMM.mciSendString("open \"" + MP3_FileName + "\" type mpegvideo alias MediaFile", null, 0, IntPtr.Zero);
Win32.WinMM.mciSendString("play MediaFile" + (Repeat ? " repeat" : string.Empty), null, 0, IntPtr.Zero);
Win32.WinMM.mciSendString($"open \"{mp3FileName}\" type mpegvideo alias MediaFile", null, 0, IntPtr.Zero);
Win32.WinMM.mciSendString($"play MediaFile{(repeat ? " repeat" : string.Empty)}", null, 0, IntPtr.Zero);
}
/// <summary>
/// 暂停
/// 暂停播放。
/// </summary>
public static void Pause()
{
@ -189,7 +208,7 @@ namespace Sunny.UI
}
/// <summary>
/// 停止
/// 停止播放。
/// </summary>
public static void Stop()
{

View File

@ -0,0 +1,743 @@
/******************************************************************************
* SunnyUI
* CopyRight (C) 2012-2023 ShenYongHua().
* QQ群56829229 QQ17612584 EMailSunnyUI@QQ.Com
*
* Blog: https://www.cnblogs.com/yhuse
* Gitee: https://gitee.com/yhuse/SunnyUI
* GitHub: https://github.com/yhuse/SunnyUI
*
* SunnyUI.Common.dll can be used for free under the MIT license.
* If you use this code, please keep this note.
* 使
******************************************************************************
* : UBaseConfig.cs
* :
* : V3.1
* : 2020-01-01
*
* 2020-01-01: V2.2.0
******************************************************************************/
using System;
using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.ComponentModel;
using System.Reflection;
using System.Xml.Serialization;
namespace Sunny.UI
{
/// <summary>
/// 配置文件基类
/// </summary>
/// <typeparam name="TConfig">类型</typeparam>
public abstract class BaseConfig<TConfig> where TConfig : BaseConfig<TConfig>, new()
{
/// <summary>
/// 实体对象
/// </summary>
protected static TConfig current;
/// <summary>
/// 配置文件描述
/// </summary>
public static string Description
{
get
{
var fileanddesc = ConfigHelper.GetConfigFile<TConfig>();
return fileanddesc.Item2;
}
}
/// <summary>
/// 配置文件名
/// </summary>
public static string ConfigFile
{
get
{
var fileanddesc = ConfigHelper.GetConfigFile<TConfig>();
return fileanddesc.Item1;
}
}
/// <summary>
/// 当前可执行文件路径,末尾包括\
/// </summary>
/// <returns>结果</returns>
private static string CurrentDir()
{
return Environment.CurrentDirectory.DealPath();
}
/// <summary>
/// 当前实例。通过置空可以使其重新加载。
/// </summary>
public static TConfig Current
{
get
{
if (current != null)
{
return current;
}
// 现在没有对象尝试加载若返回null则实例化一个新的
current = CreateNew();
if (!current.Load(CurrentDir() + ConfigFile))
{
try
{
// 根据配置,有可能不保存,直接返回默认
current.Save();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
return current;
}
set => current = value;
}
private static TConfig CreateNew()
{
TConfig config = new TConfig();
config.SetDefault();
return config;
}
/// <summary>保存到配置文件中去</summary>
public void Save()
{
Save(null);
}
/// <summary>
/// 加载指定配置文件
/// </summary>
/// <returns>结果</returns>
public bool Load()
{
return Load(null);
}
/// <summary>
/// 加密
/// </summary>
/// <param name="str">字符串</param>
/// <returns>加密后字符串</returns>
public string Encrypt(string str)
{
Random random = new Random();
var value = random.Next(100000, 999999);
string tmp = str + value.ToString();
return tmp.DesEncrypt();
}
/// <summary>
/// 解密
/// </summary>
/// <param name="str">字符串</param>
/// <returns>解密后字符串</returns>
public string Decrypt(string str)
{
string result = str.DesDecrypt();
return result.Left(result.Length - 6);
}
/// <summary>加载指定配置文件</summary>
/// <param name="filename">文件名</param>
/// <returns>结果</returns>
public abstract bool Load(string filename);
/// <summary>保存到配置文件中去</summary>
/// <param name="filename">文件名</param>
public abstract void Save(string filename);
/// <summary>
/// 设置默认值
/// </summary>
public virtual void SetDefault()
{
}
}
/// <summary>
/// 忽略此属性的配置存储
/// </summary>
[AttributeUsage(AttributeTargets.Property)]
public class MapperIgnoreAttribute : Attribute
{
}
/// <summary>
/// 忽略此属性的配置存储
/// </summary>
[AttributeUsage(AttributeTargets.Property)]
public class IgnoreAttribute : Attribute
{
}
/// <summary>
/// 配置文件帮助类
/// </summary>
public static class ConfigHelper
{
/// <summary>
/// 类型是否能够转为指定基类
/// </summary>
/// <param name="type">类型</param>
/// <param name="baseType">基类</param>
/// <returns>是否能够转为指定基类</returns>
public static bool As(this Type type, Type baseType)
{
if (type == null)
{
return false;
}
// 如果基类是泛型定义
if (baseType.IsGenericTypeDefinition && type.IsGenericType && !type.IsGenericTypeDefinition)
{
type = type.GetGenericTypeDefinition();
}
if (type == baseType)
{
return true;
}
if (baseType.IsAssignableFrom(type))
{
return true;
}
var rs = false;
// 接口
if (baseType.IsInterface)
{
if (type.GetInterface(baseType.FullName) != null)
{
rs = true;
}
else
foreach (var e in type.GetInterfaces())
{
if (e.IsGenericType && baseType.IsGenericTypeDefinition ? e.GetGenericTypeDefinition() == baseType : e == baseType)
{
rs = true;
break;
}
}
}
// 判断是否子类时,支持只反射加载的程序集
if (!rs && type.Assembly.ReflectionOnly)
{
// 反射加载时,需要特殊处理接口
while (!rs && type != typeof(object))
{
if (type == null)
{
continue;
}
if (type.FullName == baseType.FullName && type.AssemblyQualifiedName == baseType.AssemblyQualifiedName)
{
rs = true;
}
type = type.BaseType;
}
}
return rs;
}
/// <summary>是否泛型字典</summary>
/// <param name="type">类型</param>
/// <returns>是否泛型字典</returns>
public static bool IsDictionary(this Type type) => type != null && type.IsGenericType && type.As(typeof(IDictionary<,>));
/// <summary>是否泛型列表</summary>
/// <param name="type">类型</param>
/// <returns>是否泛型列表</returns>
public static bool IsList(this Type type)
{
return type != null && type.IsGenericType && type.As(typeof(IList<>));
//return Array.IndexOf(type.GetInterfaces(), typeof(IEnumerable)) > -1;
}
/// <summary>获取成员绑定的显示名优先DisplayName然后Description</summary>
/// <param name="member">member</param>
/// <returns>显示名</returns>
public static string DisplayName(this PropertyInfo member)
{
var att = member.GetCustomAttribute<DisplayNameAttribute>();
if (att != null && !att.DisplayName.IsNullOrWhiteSpace())
{
return att.DisplayName;
}
return "";
}
/// <summary>获取成员绑定的显示名优先DisplayName然后Description</summary>
/// <param name="member">member</param>
/// <returns>显示名</returns>
public static string Description(this PropertyInfo member)
{
var att2 = member.GetCustomAttribute<DescriptionAttribute>();
if (att2 != null && !att2.Description.IsNullOrWhiteSpace())
{
return att2.Description;
}
return "";
}
/// <summary>
/// 获取需要的属性,删除忽略的属性
/// </summary>
/// <param name="type">类型</param>
/// <returns>属性列表</returns>
public static List<PropertyInfo> GetNeedProperties(this Type type)
{
var list = type.GetProperties();
List<PropertyInfo> result = new List<PropertyInfo>();
foreach (var info in list)
{
if (info.GetCustomAttribute<XmlIgnoreAttribute>() != null)
{
continue;
}
if (info.GetCustomAttribute<ConfigIgnoreAttribute>() != null)
{
continue;
}
if (info.GetCustomAttribute<MapperIgnoreAttribute>() != null)
{
continue;
}
if (info.GetCustomAttribute<IgnoreAttribute>() != null)
{
continue;
}
result.Add(info);
}
return result;
}
/// <summary>
/// 获取配置文件路径
/// </summary>
/// <typeparam name="TConfig">类型</typeparam>
/// <returns>文件名</returns>
public static Tuple<string, string> GetConfigFile<TConfig>()
{
string filename;
string description = "配置文件";
var att = typeof(TConfig).GetCustomAttribute<ConfigFileAttribute>();
if (att == null || att.FileName.IsNullOrWhiteSpace())
{
filename = $"{typeof(TConfig).Name}.cfg";
}
else
{
filename = att.FileName;
if (!att.Description.IsNullOrEmpty())
{
description = att.Description;
}
}
return new Tuple<string, string>(filename, description);
}
/// <summary>
/// 初始化属性
/// </summary>
/// <param name="config">配置类</param>
/// <typeparam name="TConfig">类型</typeparam>
/// <returns>节点</returns>
/// <exception cref="ApplicationException">ApplicationException</exception>
public static ConcurrentDictionary<string, Ident> InitIdents<TConfig>(TConfig config)
{
ConcurrentDictionary<string, Ident> idents = new ConcurrentDictionary<string, Ident>();
var list = config.GetType().GetNeedProperties();
foreach (PropertyInfo info in list)
{
Ident ident = new Ident
{
Key = info.Name,
Show = true,
Description = info.Description(),
IsList = info.PropertyType.IsList()
};
var section = info.GetCustomAttribute<ConfigSectionAttribute>();
ident.Section = section != null ? section.Section : "";
var propertyatt = info.GetCustomAttribute<ConfigPropertyAttribute>();
ident.Caption = propertyatt != null ? propertyatt.Caption : "";
ident.Unit = propertyatt != null ? propertyatt.Unit : "";
ident.Description = propertyatt != null ? propertyatt.Description : "";
var indexatt = info.GetCustomAttribute<ConfigIndexAttribute>();
ident.Index = indexatt?.Index ?? short.MaxValue + idents.Count;
ident.Show = indexatt == null || indexatt.Show;
if (ident.Description.IsNullOrEmpty())
{
ident.Description = info.DisplayName() ?? info.Description();
}
if (ident.Description.IsNullOrEmpty())
{
ident.Description = "";
}
if (!idents.ContainsKey(ident.Key))
{
idents.TryAdd(ident.Key, ident);
}
}
return idents;
}
/// <summary>
/// 类型默认值
/// </summary>
/// <param name="targetType">类型</param>
/// <returns>默认值</returns>
public static object DefaultValue(Type targetType)
{
return targetType.IsValueType ? Activator.CreateInstance(targetType) : null;
}
/// <summary>
/// 读取对象数值
/// </summary>
/// <param name="config">配置文件</param>
/// <param name="idents">节点</param>
/// <typeparam name="TConfig">类型</typeparam>
/// <exception cref="ApplicationException">ApplicationException</exception>
public static void LoadConfigValue<TConfig>(TConfig config, ConcurrentDictionary<string, Ident> idents)
{
var list = config.GetType().GetNeedProperties();
foreach (PropertyInfo info in list)
{
object defaultobj = info.GetValue(config, null);
Type type = info.PropertyType;
if (type == typeof(string))
{
object value = idents[info.Name].Value;
info.SetValue(config, Convert.ChangeType(value == null ? defaultobj : value, type), null);
continue;
}
if (ConvertEx.CanConvent(type))
{
object value = ConvertEx.StringToObject(idents[info.Name].Value, type, defaultobj);
info.SetValue(config, Convert.ChangeType(value, type), null);
continue;
}
if (type.IsList())
{
Type[] genericTypes = type.GetGenericArguments();
if (genericTypes.Length != 1)
{
throw new ApplicationException("转换出错: " + type.FullName);
}
Type childtype = genericTypes[0];
Type typeDataList = typeof(List<>).MakeGenericType(childtype);
MethodInfo methodInfo = typeDataList.GetMethod("Add", BindingFlags.Public | BindingFlags.Instance);
if (methodInfo == null)
{
continue;
}
object listvalue = typeDataList.InvokeMember(null, BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.CreateInstance, null, null, new object[] { });
foreach (string strvalue in idents[info.Name].Values)
{
if (childtype == typeof(string))
{
object value = strvalue;
methodInfo.Invoke(listvalue, new[] { value });
}
else if (ConvertEx.CanConvent(childtype))
{
object value = ConvertEx.StringToObject(strvalue, childtype, DefaultValue(childtype));
methodInfo.Invoke(listvalue, new[] { value });
}
}
info.SetValue(config, listvalue, null);
continue;
}
throw new ApplicationException("不支持此类型: " + type.FullName);
}
}
/// <summary>
/// 设置对象数值
/// </summary>
/// <param name="config">配置文件</param>
/// <param name="idents">节点</param>
/// <typeparam name="TConfig">类型</typeparam>
/// <exception cref="ApplicationException">ApplicationException</exception>
public static void SaveConfigValue<TConfig>(TConfig config, ConcurrentDictionary<string, Ident> idents)
{
var list = config.GetType().GetNeedProperties();
foreach (PropertyInfo info in list)
{
object obj = info.GetValue(config, null);
Type type = info.PropertyType;
if (ConvertEx.CanConvent(type))
{
string value = ConvertEx.ObjectToString(obj, type);
idents[info.Name].Value = value;
continue;
}
if (type.IsList())
{
Type[] genericTypes = type.GetGenericArguments();
if (genericTypes.Length != 1)
{
throw new ApplicationException("转换出错: " + type.FullName);
}
Type childtype = genericTypes[0];
IEnumerable en = obj as IEnumerable;
if (en == null)
{
throw new ApplicationException("转换出错: " + type.FullName);
}
idents[info.Name].Values.Clear();
foreach (object child in en)
{
if (ConvertEx.CanConvent(childtype))
{
idents[info.Name].Values.Add(ConvertEx.ObjectToString(child, childtype));
}
else
{
throw new ApplicationException("不支持此类型: " + type.FullName);
}
}
continue;
}
throw new ApplicationException("不支持此类型: " + type.FullName);
}
}
}
/// <summary>配置文件特性</summary>
[AttributeUsage(AttributeTargets.Class)]
public class ConfigFileAttribute : Attribute
{
/// <summary>
/// 配置文件名
/// </summary>
public string FileName { get; }
/// <summary>
/// 描述
/// </summary>
public string Description { get; }
/// <summary>
/// 配置文件
/// </summary>
public ConfigFileAttribute() : this(string.Empty, string.Empty)
{
}
/// <summary>配置文件</summary>
/// <param name="fileName">文件名</param>
/// <param name="description">描述</param>
public ConfigFileAttribute(string fileName, string description = "")
{
FileName = fileName;
Description = description;
}
}
/// <summary>
/// 数据节点
/// </summary>
public class Ident
{
/// <summary>
/// 节
/// </summary>
public string Section { get; set; }
/// <summary>
/// 键
/// </summary>
public string Key { get; set; }
/// <summary>
/// 值
/// </summary>
public string Value { get; set; }
/// <summary>
/// 描述
/// </summary>
public string Description { get; set; }
/// <summary>
/// 名称
/// </summary>
public string Caption { get; set; }
/// <summary>
/// 单位
/// </summary>
public string Unit { get; set; }
/// <summary>
/// 序号
/// </summary>
public int Index { get; set; }
/// <summary>
/// 是否显示
/// </summary>
public bool Show { get; set; }
/// <summary>
/// ToString()
/// </summary>
/// <returns>String</returns>
public override string ToString()
{
return Index + " [" + Section + "] " + Key + " = ?";
}
/// <summary>
/// 是否是列表类型
/// </summary>
public bool IsList { get; set; }
/// <summary>
/// 列表值
/// </summary>
public List<string> Values = new List<string>();
}
/// <summary>
/// 配置属性节点特性
/// </summary>
[AttributeUsage(AttributeTargets.Property)]
public class ConfigSectionAttribute : Attribute
{
/// <summary>
/// 节
/// </summary>
public string Section { get; }
/// <summary>属性节点特性</summary>
/// <param name="section">节</param>
public ConfigSectionAttribute(string section)
{
Section = section;
}
}
/// <summary>
/// 配置属性描述特性
/// </summary>
[AttributeUsage(AttributeTargets.Property)]
public class ConfigPropertyAttribute : Attribute
{
/// <summary>
/// 标题
/// </summary>
public string Caption { get; }
/// <summary>
/// 单位
/// </summary>
public string Unit { get; }
/// <summary>
/// 描述
/// </summary>
public string Description { get; }
/// <summary>
/// 配置文件属性
/// </summary>
/// <param name="caption">标题</param>
/// <param name="unit">单位</param>
/// <param name="description">描述</param>
public ConfigPropertyAttribute(string caption, string description = "", string unit = "")
{
Caption = caption;
Unit = unit;
Description = description;
}
}
/// <summary>
/// 忽略此属性的配置存储
/// </summary>
[AttributeUsage(AttributeTargets.Property)]
public class ConfigIgnoreAttribute : Attribute
{
}
/// <summary>
/// 配置序号描述特性
/// </summary>
[AttributeUsage(AttributeTargets.Property)]
public class ConfigIndexAttribute : Attribute
{
/// <summary>
/// 序号
/// </summary>
public int Index { get; }
/// <summary>
/// 是否显示
/// </summary>
public bool Show { get; }
/// <summary>配置序号特性</summary>
/// <param name="index">序号</param>
/// <param name="show">是否显示</param>
public ConfigIndexAttribute(int index, bool show = true)
{
Index = index;
Show = show;
}
}
}

View File

@ -1,6 +1,6 @@
/******************************************************************************
* SunnyUI
* CopyRight (C) 2012-2023 ShenYongHua().
* CopyRight (C) 2012-2025 ShenYongHua().
* QQ群56829229 QQ17612584 EMailSunnyUI@QQ.Com
*
* Blog: https://www.cnblogs.com/yhuse
@ -153,20 +153,16 @@ namespace Sunny.UI
/// </summary>
public class BmpFile
{
BmpHead head;
byte[] data;
/// <summary>
/// 慢于 bitmap.Save(XX,ImageFormat.Bmp)只是为了解释BMP文件数据格式
/// </summary>
/// <param name="bitmap"></param>
public BmpFile(Bitmap bitmap)
{
head = new BmpHead();
var head = new BmpHead();
head.Init(bitmap);
data = new byte[head.FileSize];
Array.Copy(head.ToBytes(), 0, data, 0, (int)head.BitmapDataOffset);
Data = new byte[head.FileSize];
Array.Copy(head.ToBytes(), 0, Data, 0, (int)head.BitmapDataOffset);
var sourceArea = new Rectangle(0, 0, bitmap.Width, bitmap.Height);
var bitmapData = bitmap.LockBits(sourceArea, ImageLockMode.ReadOnly, PixelFormat.Format32bppPArgb);
@ -200,10 +196,10 @@ namespace Sunny.UI
/// <param name="bmpData">数据从左上角开始为每个点的B、G、R循环</param>
public BmpFile(int width, int height, byte[] bmpData)
{
head = new BmpHead();
var head = new BmpHead();
head.Init(width, height);
data = new byte[head.FileSize];
Array.Copy(head.ToBytes(), 0, data, 0, (int)head.BitmapDataOffset);
Data = new byte[head.FileSize];
Array.Copy(head.ToBytes(), 0, Data, 0, (int)head.BitmapDataOffset);
if (bmpData.Length != width * height * 3) return;
//BMP文件的数据从左下角开始每行向上。System.Drawing.Bitmap数据是从左上角开始每行向下
@ -212,7 +208,7 @@ namespace Sunny.UI
{
int offset = height - 1 - i;
offset *= width * 3;
Array.Copy(bmpData, offset, data, idx, width * 3);
Array.Copy(bmpData, offset, Data, idx, width * 3);
idx += width * 3;
}
}
@ -220,7 +216,7 @@ namespace Sunny.UI
/// <summary>
/// 二进制数据
/// </summary>
public byte[] Data => data;
public byte[] Data { get; }
/// <summary>
/// 保存文件
@ -228,7 +224,7 @@ namespace Sunny.UI
/// <param name="fileName">文件名</param>
public void SaveToFile(string fileName)
{
File.WriteAllBytes(fileName, data);
File.WriteAllBytes(fileName, Data);
}
/// <summary>
@ -237,7 +233,7 @@ namespace Sunny.UI
/// <returns>图片</returns>
public Bitmap Bitmap()
{
MemoryStream ms = new MemoryStream(data);
var ms = new MemoryStream(Data);
ms.Position = 0;
return new Bitmap(ms);
}

View File

@ -1,146 +0,0 @@
/******************************************************************************
* SunnyUI
* CopyRight (C) 2012-2023 ShenYongHua().
* QQ群56829229 QQ17612584 EMailSunnyUI@QQ.Com
*
* Blog: https://www.cnblogs.com/yhuse
* Gitee: https://gitee.com/yhuse/SunnyUI
* GitHub: https://github.com/yhuse/SunnyUI
*
* SunnyUI.dll can be used for free under the GPL-3.0 license.
* If you use this code, please keep this note.
* 使
******************************************************************************
* : UCompress.cs
* :
* : V3.4
* : 2023-07-17
*
* 2023-07-17: V3.4.0
******************************************************************************/
using System;
using System.Runtime.InteropServices;
namespace Sunny.UI
{
public enum DataFrameCompressType
{
[DisplayText("None")]
None = 0,
[DisplayText("FastLZ")]
FastLZ = 1,
[DisplayText("ZLib")]
ZLib = 2,
[DisplayText("GZip")]
GZip = 3,
[DisplayText("Deflate")]
Deflate = 4
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct DataFrame
{
public DateTime DateTime;
public byte[] Data;
public int Index;
public int CRC;
public DataFrame(DateTime dateTime, byte[] data, int index, int crc)
{
DateTime = dateTime;
Data = data;
Index = index;
CRC = crc;
}
public static DataFrame Empty()
{
#if NET40
return new DataFrame(DateTime.MinValue, new byte[0], -1, 0);
#else
return new DataFrame(DateTime.MinValue, Array.Empty<byte>(), -1, 0);
#endif
}
}
public static class DataFrameCompressHelper
{
public static byte[] Compress(DataFrame frame, DataFrameCompressType compressType, out int compressedLength, out int decompressLength)
{
byte[] compressed;
decompressLength = frame.Data.Length;
switch (compressType)
{
case DataFrameCompressType.None:
compressed = frame.Data;
break;
case DataFrameCompressType.FastLZ:
if (FastLZ.CheckFastLZDll())
{
compressed = FastLZ.Compress(frame.Data, 0, frame.Data.Length);
decompressLength = Math.Max(frame.Data.Length * 2, 66);
}
else
{
throw new NullReferenceException("FastLZx86.dll and FastLZx64.dll not exists.");
}
break;
case DataFrameCompressType.ZLib:
compressed = frame.Data.ZLibCompress();
break;
case DataFrameCompressType.GZip:
compressed = frame.Data.GZipCompress();
break;
case DataFrameCompressType.Deflate:
compressed = frame.Data.DeflateCompress();
break;
default:
compressed = frame.Data;
break;
}
compressedLength = compressed.Length;
return compressed;
}
public static byte[] Decompress(byte[] package, DataFrameCompressType compressType, int decompressLength)
{
byte[] data;
switch (compressType)
{
case DataFrameCompressType.None:
data = package;
break;
case DataFrameCompressType.FastLZ:
if (FastLZ.CheckFastLZDll())
{
data = FastLZ.Decompress(package, 0, package.Length, decompressLength);
}
else
{
throw new NullReferenceException("FastLZx86.dll and FastLZx64.dll not exists.");
}
break;
case DataFrameCompressType.ZLib:
data = package.ZLibDecompress();
break;
case DataFrameCompressType.GZip:
data = package.GZipDecompress();
break;
case DataFrameCompressType.Deflate:
data = package.DeflateDecompress();
break;
default:
data = package;
break;
}
return data;
}
}
}

View File

@ -1,6 +1,6 @@
/******************************************************************************
* SunnyUI
* CopyRight (C) 2012-2023 ShenYongHua().
* CopyRight (C) 2012-2025 ShenYongHua().
* QQ群56829229 QQ17612584 EMailSunnyUI@QQ.Com
*
* Blog: https://www.cnblogs.com/yhuse
@ -18,6 +18,7 @@
*
* 2020-01-01: V2.2.0
* 2023-04-02: V3.3.4 null的Bug
* 2024-11-06: V3.7.2 UITreeView增加了一个刷新节点状态的扩展函数
******************************************************************************/
using System;
@ -90,22 +91,6 @@ namespace Sunny.UI
return ctrl.PointToScreen(new Point(0, 0));
}
/// <summary>
/// 控件的根窗体
/// </summary>
/// <param name="ctrl">控件</param>
/// <returns>根窗体</returns>
public static Form RootForm(this Control ctrl)
{
if (ctrl == null) return null;
while (ctrl.Parent != null)
{
ctrl = ctrl.Parent;
}
return ctrl as Form;
}
/// <summary>
/// 设置控件位于容器的中心
/// </summary>
@ -388,14 +373,11 @@ namespace Sunny.UI
internal static void HideComboDropDown(this Control ctrl)
{
var ctrls = ctrl?.FindForm()?.GetInterfaceControls("IHideDropDown", true);
var ctrls = ctrl?.FindForm()?.GetInterfaceControls<IHideDropDown>(true);
if (ctrls == null) return;
foreach (var control in ctrls)
{
if (control is IHideDropDown item)
{
item.HideDropDown();
}
control.HideDropDown();
}
}
@ -406,21 +388,43 @@ namespace Sunny.UI
/// <param name="interfaceName">接口名称</param>
/// <param name="includeChild"></param>
/// <returns>控件列表</returns>
public static List<Control> GetInterfaceControls(this Control ctrl, string interfaceName, bool includeChild = false)
public static List<T> GetInterfaceControls<T>(this Control ctrl, bool includeChild = false)
{
List<Control> values = new List<Control>();
List<T> values = new();
if (ctrl.IsNull()) return values;
foreach (Control obj in ctrl.Controls)
{
if (obj.GetType().GetInterface(interfaceName) != null)
if (obj is T it && it != null)
{
values.Add(obj);
values.Add(it);
}
if (includeChild && obj.Controls.Count > 0)
{
values.AddRange(obj.GetInterfaceControls(interfaceName, true));
values.AddRange(obj.GetInterfaceControls<T>(includeChild));
}
}
return values;
}
internal static List<T> GetTranslateControls<T>(this Control ctrl)
{
List<T> values = new();
if (ctrl.IsNull()) return values;
foreach (Control obj in ctrl.Controls)
{
if (obj is T it && it != null)
{
values.Add(it);
}
if (obj.Controls.Count > 0)
{
if (obj is UIPage) continue;
values.AddRange(obj.GetTranslateControls<T>());
}
}
@ -527,32 +531,38 @@ namespace Sunny.UI
/// <returns>全选状态(Checked),半选状态(Indeterminate),未选状态(Unchecked)</returns>
public static CheckState CheckState(this TreeNode node)
{
if (GetChildNodeCheckedState(node))
if (node.Nodes.Count > 0)
{
return System.Windows.Forms.CheckState.Indeterminate;
var count = node.Nodes.Cast<TreeNode>().Where(n => n.Checked).ToList().Count;
if (count == 0)
{
return System.Windows.Forms.CheckState.Unchecked;
}
else if (count == node.Nodes.Count)
{
return System.Windows.Forms.CheckState.Checked;
}
else
{
return System.Windows.Forms.CheckState.Indeterminate;
}
}
return node.Checked ? System.Windows.Forms.CheckState.Checked : System.Windows.Forms.CheckState.Unchecked;
}
private static bool GetChildNodeCheckedState(TreeNode node)
public static void RefreshCheckState(this TreeNode node)
{
if (node.TreeView is not UITreeView.TreeViewEx tv) return;
System.Windows.Forms.CheckState state = node.CheckState();
if (node.Nodes.Count > 0)
{
var count = node.Nodes.Cast<TreeNode>().Where(n => n.Checked).ToList().Count;
if (count > 0 && count < node.Nodes.Count)
{
return true;
}
else
{
foreach (TreeNode nd in node.Nodes)
{
return GetChildNodeCheckedState(nd);
}
}
if (state == System.Windows.Forms.CheckState.Checked && !node.Checked) node.Checked = true;
if (state == System.Windows.Forms.CheckState.Unchecked && node.Checked) node.Checked = false;
}
return false;
tv.DicNodeStatus[node.GetHashCode()] = state == System.Windows.Forms.CheckState.Indeterminate;
tv.Invalidate();
}
public static void Disabled(this Control ctrl)

View File

@ -0,0 +1,371 @@
/******************************************************************************
* SunnyUI
* CopyRight (C) 2012-2023 ShenYongHua().
* QQ群56829229 QQ17612584 EMailSunnyUI@QQ.Com
*
* Blog: https://www.cnblogs.com/yhuse
* Gitee: https://gitee.com/yhuse/SunnyUI
* GitHub: https://github.com/yhuse/SunnyUI
*
* SunnyUI.Common.dll can be used for free under the MIT license.
* If you use this code, please keep this note.
* 使
******************************************************************************
* : UConvertEx.cs
* :
* : V3.1
* : 2020-01-01
*
* 2020-11-20: V3.0.0
******************************************************************************/
using System;
using System.Drawing;
namespace Sunny.UI
{
/// <summary>
/// 对象转换扩展类
/// </summary>
public static class ConvertEx
{
/// <summary>
/// 可以对象和字符串互相转换的类型
/// </summary>
/// <param name="type">类型</param>
/// <returns>结果</returns>
public static bool CanConvent(Type type)
{
bool result = false;
TypeCode typeCode = Type.GetTypeCode(type);
switch (typeCode)
{
case TypeCode.String:
case TypeCode.Char:
case TypeCode.SByte:
case TypeCode.Byte:
case TypeCode.Int16:
case TypeCode.UInt16:
case TypeCode.Int32:
case TypeCode.UInt32:
case TypeCode.Int64:
case TypeCode.UInt64:
case TypeCode.Single:
case TypeCode.Double:
case TypeCode.Decimal:
case TypeCode.Boolean:
case TypeCode.DateTime:
result = true;
break;
case TypeCode.Object:
if (type == typeof(Point) ||
type == typeof(PointF) ||
type == typeof(Color) ||
type == typeof(Size) ||
type == typeof(SizeF))
{
result = true;
}
break;
}
return result;
}
/// <summary>
/// 字符串转对象
/// </summary>
/// <param name="str">字符串</param>
/// <param name="type">类型</param>
/// <param name="defaultobj">默认对象</param>
/// <returns>对象</returns>
public static object StringToObject(string str, Type type, object defaultobj)
{
object obj = defaultobj;
if (type == typeof(string))
{
return str;
}
if (str.IsNullOrEmpty())
{
return defaultobj;
}
TypeCode typeCode = Type.GetTypeCode(type);
switch (typeCode)
{
case TypeCode.Char:
obj = str.ToChar((char)defaultobj);
break;
case TypeCode.SByte:
obj = str.ToSByte((sbyte)defaultobj);
break;
case TypeCode.Byte:
obj = str.ToByte((byte)defaultobj);
break;
case TypeCode.Int16:
obj = str.ToShort((short)defaultobj);
break;
case TypeCode.UInt16:
obj = str.ToUShort((ushort)defaultobj);
break;
case TypeCode.Int32:
obj = str.ToInt((int)defaultobj);
break;
case TypeCode.UInt32:
obj = str.ToUInt((uint)defaultobj);
break;
case TypeCode.Int64:
obj = str.ToLong((long)defaultobj);
break;
case TypeCode.UInt64:
obj = str.ToULong((ulong)defaultobj);
break;
case TypeCode.Single:
obj = str.ToFloat((float)defaultobj);
break;
case TypeCode.Double:
obj = str.ToDouble((double)defaultobj);
break;
case TypeCode.Decimal:
obj = str.ToDecimal((decimal)defaultobj);
break;
case TypeCode.Boolean:
if (str.ToUpper().Equals(bool.TrueString.ToUpper()))
{
obj = true;
}
if (str.ToUpper().Equals(bool.FalseString.ToUpper()))
{
obj = false;
}
break;
case TypeCode.DateTime:
try
{
DateTime dt = str.ToDateTime(DateTimeEx.DateTimeFormat);
obj = dt;
}
catch (Exception e)
{
Console.WriteLine(e);
}
break;
case TypeCode.Object:
obj = StringToObjectEx(str, type, defaultobj);
break;
default:
throw new ApplicationException("不支持此类型: " + type.FullName);
}
if (type == typeof(DateTime))
{
}
return obj;
}
/// <summary>
/// 字符串转对象扩展
/// </summary>
/// <param name="str">字符串</param>
/// <param name="type">类型</param>
/// <param name="defaultobj">默认对象</param>
/// <returns>对象</returns>
private static object StringToObjectEx(string str, Type type, object defaultobj)
{
object obj = defaultobj;
if (type == typeof(Point))
{
string[] strs = str.ToUpper().Replace("X:", "").Replace("Y:", "").Trim().Split(";");
if (strs.Length == 2)
{
if (int.TryParse(strs[0], out var x) && int.TryParse(strs[1], out var y))
{
obj = new Point(x, y);
}
}
}
else if (type == typeof(PointF))
{
string[] strs = str.ToUpper().Replace("X:", "").Replace("Y:", "").Trim().Split(";");
if (strs.Length == 2)
{
if (float.TryParse(strs[0], out var x) && float.TryParse(strs[1], out var y))
{
obj = new PointF(x, y);
}
}
}
else if (type == typeof(Color))
{
string[] strs = str.ToUpper().Replace("A:", "").Replace("R:", "").Replace("G:", "").Replace("B:", "").Trim().Split(";");
if (strs.Length == 4)
{
if (int.TryParse(strs[0], out var a) && int.TryParse(strs[1], out var r) && int.TryParse(strs[2], out var g) && int.TryParse(strs[3], out var b))
{
if (a.InRange(0, 255) && r.InRange(0, 255) && g.InRange(0, 255) && b.InRange(0, 255))
{
obj = Color.FromArgb(a, r, g, b);
}
}
}
}
else if (type == typeof(Size))
{
string[] strs = str.ToUpper().Replace("W:", "").Replace("H:", "").Trim().Split(";");
if (strs.Length == 2)
{
if (int.TryParse(strs[0], out var x) && int.TryParse(strs[1], out var y))
{
obj = new Size(x, y);
}
}
}
else if (type == typeof(SizeF))
{
string[] strs = str.ToUpper().Replace("W:", "").Replace("H:", "").Trim().Split(";");
if (strs.Length == 2)
{
if (float.TryParse(strs[0], out var x) && float.TryParse(strs[1], out var y))
{
obj = new SizeF(x, y);
}
}
}
else
{
throw new ApplicationException("不支持此类型: " + type.FullName);
}
return obj;
}
/// <summary>
/// 对象转字符串
/// </summary>
/// <param name="obj">对象</param>
/// <param name="type">类型</param>
/// <returns>字符串</returns>
public static string ObjectToString(object obj, Type type)
{
string value;
TypeCode typeCode = Type.GetTypeCode(type);
switch (typeCode)
{
case TypeCode.String:
if (obj == null)
{
obj = "";
}
value = obj.ToString();
break;
case TypeCode.Char:
case TypeCode.SByte:
case TypeCode.Byte:
case TypeCode.Int16:
case TypeCode.UInt16:
case TypeCode.Int32:
case TypeCode.UInt32:
case TypeCode.Int64:
case TypeCode.UInt64:
case TypeCode.Single:
case TypeCode.Double:
case TypeCode.Decimal:
value = obj.ToString();
break;
case TypeCode.Boolean:
value = (bool)obj ? bool.TrueString : bool.FalseString;
break;
case TypeCode.DateTime:
value = ((DateTime)obj).ToString(DateTimeEx.DateTimeFormat);
break;
case TypeCode.Object:
value = ObjectToStringEx(obj, type);
break;
default:
throw new ApplicationException("不支持此类型: " + type.FullName);
}
return value;
}
/// <summary>
/// 对象转字符串扩展
/// </summary>
/// <param name="obj">对象</param>
/// <param name="type">类型</param>
/// <returns>字符串</returns>
private static string ObjectToStringEx(object obj, Type type)
{
string value;
if (type == typeof(Point))
{
Point point = (Point)obj;
value = "X:" + point.X + "; Y:" + point.Y;
}
else if (type == typeof(PointF))
{
PointF point = (PointF)obj;
value = "X:" + point.X + "; Y:" + point.Y;
}
else if (type == typeof(Color))
{
Color color = (Color)obj;
value = "A:" + color.A + "; R:" + color.R + "; G:" + color.G + "; B:" + color.B;
}
else if (type == typeof(Size))
{
Size size = (Size)obj;
value = "W:" + size.Width + "; H:" + size.Height;
}
else if (type == typeof(SizeF))
{
SizeF size = (SizeF)obj;
value = "W:" + size.Width + "; H:" + size.Height;
}
else
{
throw new ApplicationException("不支持此类型: " + type.FullName);
}
return value;
}
}
}

View File

@ -0,0 +1,382 @@
/******************************************************************************
* SunnyUI
* CopyRight (C) 2012-2023 ShenYongHua().
* QQ群56829229 QQ17612584 EMailSunnyUI@QQ.Com
*
* Blog: https://www.cnblogs.com/yhuse
* Gitee: https://gitee.com/yhuse/SunnyUI
* GitHub: https://github.com/yhuse/SunnyUI
*
* SunnyUI.dll can be used for free under the GPL-3.0 license.
* If you use this code, please keep this note.
* 使
******************************************************************************
* : UDateTimeInt64.cs
* :
* : V2.2
* : 2020-09-23
*
* 2020-09-23: V2.2.8
* 2020-10-10: V2.2.8 Double互转
******************************************************************************/
using System;
namespace Sunny.UI
{
/// <summary>
/// 日期与长整形和浮点型互转
/// Value长整形为1970年1月1日0时起的毫秒数
/// DoubleValue双精度浮点数1970年1月1日0时起的天数
/// </summary>
public struct DateTimeInt64 : IComparable, IEquatable<DateTimeInt64>, IEquatable<long>, IEquatable<DateTime>
{
public long Value { get; set; }
public const long Jan1st1970Ticks = 621355968000000000; //Jan1st1970.Ticks;
public const long Dec31th9999Ticks = 3155378975999990000; //DateTime.MaxValue.Ticks;
public const string DefaultFormatString = DateTimeEx.DateTimeFormatEx;
public const double MillisecondsPerDay = 86400000.0;
/// <summary>
/// 返回当前时间的毫秒数, 这个毫秒其实就是自1970年1月1日0时起的毫秒数
/// </summary>
public static long CurrentDateTimeToTicks()
{
return (DateTime.UtcNow.Ticks - Jan1st1970Ticks) / 10000;
}
public double DoubleValue
{
get { return Value * 1.0 / MillisecondsPerDay; }
set { Value = (long)(value * MillisecondsPerDay); }
}
/// <summary>
/// 返回指定时间的毫秒数, 这个毫秒其实就是自1970年1月1日0时起的毫秒数
/// </summary>
public static long DateTimeToTicks(DateTime datetime)
{
return (datetime.ToUniversalTime().Ticks - Jan1st1970Ticks) / 10000;
}
/// <summary>
/// 从一个代表自1970年1月1日0时起的毫秒数转换为DateTime (北京时间)
/// </summary>
public static DateTime TicksToDateTime(long ticks)
{
#pragma warning disable CS0618 // 类型或成员已过时
return TimeZone.CurrentTimeZone.ToLocalTime(TicksToUTCDateTime(ticks));
#pragma warning restore CS0618 // 类型或成员已过时
}
/// <summary>
/// 从一个代表自1970年1月1日0时起的毫秒数转换为DateTime (UTC时间)
/// </summary>
public static DateTime TicksToUTCDateTime(long ticks)
{
return new DateTime(ticks * 10000 + Jan1st1970Ticks);
}
public DateTimeInt64(long ticks)
{
ticks = MakeValidDate(ticks);
Value = ticks;
}
public DateTimeInt64(double doubleTicks)
{
doubleTicks = MakeValidDate((long)(doubleTicks * MillisecondsPerDay));
Value = (long)doubleTicks;
}
public DateTimeInt64(DateTime dateTime)
{
Value = DateTimeToTicks(dateTime);
}
public DateTimeInt64(int year, int month, int day)
{
Value = DateTimeToTicks(new DateTime(year, month, day));
}
public DateTimeInt64(int year, int month, int day, int hour, int minute, int second)
{
Value = DateTimeToTicks(new DateTime(year, month, day, hour, minute, second));
}
public DateTimeInt64(int year, int month, int day, int hour, int minute, int second, int millisecond)
{
Value = DateTimeToTicks(new DateTime(year, month, day, hour, minute, second, millisecond));
}
public DateTimeInt64(DateTimeInt64 dtValue)
{
Value = dtValue.Value;
}
public bool IsValidDate
{
get { return Value >= 0 && Value <= Dec31th9999Ticks - Jan1st1970Ticks; }
}
public DateTime DateTime
{
get { return TicksToDateTime(Value); }
set { Value = DateTimeToTicks(value); }
}
public static bool CheckValidDate(long ticks)
{
return ticks >= 0 && ticks <= Dec31th9999Ticks - Jan1st1970Ticks;
}
public static long MakeValidDate(long ticks)
{
if (ticks < 0)
ticks = 0;
if (ticks > Dec31th9999Ticks - Jan1st1970Ticks)
ticks = Dec31th9999Ticks - Jan1st1970Ticks;
return ticks;
}
public void AddMilliseconds(double milliseconds)
{
Value = DateTimeToTicks(DateTime.AddMilliseconds(milliseconds));
}
public void AddSeconds(double seconds)
{
Value = DateTimeToTicks(DateTime.AddSeconds(seconds));
}
public void AddMinutes(double minutes)
{
Value = DateTimeToTicks(DateTime.AddMinutes(minutes));
}
public void AddHours(double hours)
{
Value = DateTimeToTicks(DateTime.AddHours(hours));
}
public void AddDays(double days)
{
Value = DateTimeToTicks(DateTime.AddDays(days));
}
public void AddMonths(int months)
{
Value = DateTimeToTicks(DateTime.AddMonths(months));
}
public void AddYears(int years)
{
Value = DateTimeToTicks(DateTime.AddYears(years));
}
public static long operator -(DateTimeInt64 dtValue1, DateTimeInt64 dtValue2)
{
return dtValue1.Value - dtValue2.Value;
}
public static long operator +(DateTimeInt64 dtValue1, DateTimeInt64 dtValue2)
{
return dtValue1.Value + dtValue2.Value;
}
public static DateTimeInt64 operator -(DateTimeInt64 dtValue1, long dtValue2)
{
dtValue1.Value -= dtValue2;
return dtValue1;
}
public static DateTimeInt64 operator +(DateTimeInt64 dtValue1, long dtValue2)
{
dtValue1.Value += dtValue2;
return dtValue1;
}
public static DateTimeInt64 operator ++(DateTimeInt64 dtValue)
{
dtValue.AddDays(1);
return dtValue;
}
public static DateTimeInt64 operator --(DateTimeInt64 dtValue)
{
dtValue.AddDays(-1);
return dtValue;
}
public static implicit operator long(DateTimeInt64 dtValue)
{
return dtValue.Value;
}
public static implicit operator DateTimeInt64(long ticks)
{
return new DateTimeInt64(ticks);
}
public static implicit operator DateTimeInt64(DateTime dt)
{
return new DateTimeInt64(dt);
}
public static implicit operator DateTime(DateTimeInt64 dt)
{
return dt.DateTime;
}
public static implicit operator double(DateTimeInt64 dtValue)
{
return dtValue.DoubleValue;
}
public static implicit operator DateTimeInt64(double ticks)
{
return new DateTimeInt64(ticks);
}
public static bool operator ==(DateTimeInt64 dtValue1, DateTimeInt64 dtValue2)
{
return dtValue1.Value == dtValue2.Value;
}
public static bool operator !=(DateTimeInt64 dtValue1, DateTimeInt64 dtValue2)
{
return dtValue1.Value != dtValue2.Value;
}
public static bool operator ==(DateTimeInt64 dtValue, long ticks)
{
return dtValue.Value == ticks;
}
public static bool operator !=(DateTimeInt64 dtValue, long ticks)
{
return dtValue.Value != ticks;
}
public static bool operator <(DateTimeInt64 dtValue1, DateTimeInt64 dtValue2)
{
return dtValue1.Value < dtValue2.Value;
}
public static bool operator >(DateTimeInt64 dtValue1, DateTimeInt64 dtValue2)
{
return dtValue1.Value > dtValue2.Value;
}
public static bool operator <=(DateTimeInt64 dtValue1, DateTimeInt64 dtValue2)
{
return dtValue1.Value <= dtValue2.Value;
}
public static bool operator >=(DateTimeInt64 dtValue1, DateTimeInt64 dtValue2)
{
return dtValue1.Value >= dtValue2.Value;
}
public static bool operator <(DateTimeInt64 dtValue, long ticks)
{
return dtValue.Value < ticks;
}
public static bool operator >(DateTimeInt64 dtValue, long ticks)
{
return dtValue.Value > ticks;
}
public static bool operator <=(DateTimeInt64 dtValue, long ticks)
{
return dtValue.Value <= ticks;
}
public static bool operator >=(DateTimeInt64 dtValue, long ticks)
{
return dtValue.Value >= ticks;
}
public override bool Equals(object obj)
{
if (obj is DateTimeInt64 dtValue)
{
return dtValue.Value == Value;
}
else if (obj is long longValue)
{
return longValue == Value;
}
else
{
return false;
}
}
public override int GetHashCode()
{
return Value.GetHashCode();
}
int IComparable.CompareTo(object obj)
{
if (!(obj is DateTimeInt64)) throw new ArgumentException();
return (Value).CompareTo(((DateTimeInt64)obj).Value);
}
public string ToString(long ticks)
{
return ToString(ticks, DefaultFormatString);
}
public override string ToString()
{
return ToString(Value, DefaultFormatString);
}
public string ToString(string fmtStr)
{
return ToString(Value, fmtStr);
}
public static string ToString(long dtValue, string fmtStr)
{
DateTime dt = TicksToDateTime(dtValue);
return dt.ToString(fmtStr);
}
public bool Equals(DateTimeInt64 dtValue)
{
return Value == dtValue.Value;
}
public bool Equals(long ticks)
{
return Value == ticks;
}
public bool Equals(DateTime datetime)
{
return Value == (new DateTimeInt64(datetime)).Value;
}
public string DateTimeString => DateTime.DateTimeString();
public string DateString => DateTime.DateString();
public string TimeString => DateTime.TimeString();
public string HourMinuteString => DateTime.ToString("HH:mm");
public int Year => DateTime.Year;
public int Month => DateTime.Month;
public int Day => DateTime.Day;
public int Hour => DateTime.Hour;
public int Minute => DateTime.Minute;
public int Second => DateTime.Second;
public int Millisecond => DateTime.Millisecond;
}
}

View File

@ -116,11 +116,19 @@ namespace Sunny.UI
/// <summary>
/// 背景色
/// </summary>
public Color BackColor;
public Color BackColor { get; set; }
/// <summary>
/// 前景色
/// </summary>
public Color ForeColor;
public Color ForeColor { get; set; }
public Color HoverColor { get; set; }
public Color SelectedColor { get; set; }
public Color SelectedForeColor { get; set; }
public bool HaveHoveColor { get; set; } = false;
}
}

View File

@ -1,6 +1,6 @@
/******************************************************************************
* SunnyUI
* CopyRight (C) 2012-2023 ShenYongHua().
* CopyRight (C) 2012-2025 ShenYongHua().
* QQ群56829229 QQ17612584 EMailSunnyUI@QQ.Com
*
* Blog: https://www.cnblogs.com/yhuse
@ -19,10 +19,7 @@
* 2020-01-01: V2.2.0
******************************************************************************/
using System;
using System.Collections.Generic;
using System.IO;
using System.Text.RegularExpressions;
using System.Windows.Forms;
namespace Sunny.UI
@ -32,38 +29,6 @@ namespace Sunny.UI
/// </summary>
public static class DirEx
{
/// <summary>
/// 调用WINAPI删除文件夹
/// </summary>
/// <param name="directory">文件夹</param>
public static void Delete(this string directory)
{
if (Directory.Exists(directory))
{
var files = Directory.EnumerateFiles(directory, "*", SearchOption.AllDirectories);
foreach (string file in files)
{
Win32.Kernel.DeleteFile(file);
}
var directories = Directory.EnumerateDirectories(directory, "*", SearchOption.AllDirectories);
foreach (string dir in directories)
{
Directory.Delete(dir, true);
}
}
}
/// <summary>
/// 当前可执行文件路径,末尾包括文件夹分隔符(windows为\linux为/)
/// </summary>
/// <returns>结果</returns>
public static string CurrentDir()
{
//return Environment.CurrentDirectory.DealPath();
return AppDomain.CurrentDomain.BaseDirectory.DealPath();
}
/// <summary>
/// 选择文件夹
/// </summary>
@ -73,17 +38,9 @@ namespace Sunny.UI
/// <returns>是否选择文件夹</returns>
public static bool SelectDir(string desc, ref string dir, bool showNewButton = true)
{
bool bOk = false;
using (FolderBrowserDialog fd = new FolderBrowserDialog { Description = desc, ShowNewFolderButton = showNewButton })
{
fd.SelectedPath = dir;
if (fd.ShowDialog() == DialogResult.OK)
{
dir = fd.SelectedPath.DealPath();
bOk = true;
}
}
using FolderBrowserDialog fd = new FolderBrowserDialog { Description = desc, ShowNewFolderButton = showNewButton, SelectedPath = dir };
bool bOk = fd.ShowDialog() == DialogResult.OK;
if (bOk) dir = fd.SelectedPath.DealPath();
return bOk;
}
@ -95,118 +52,12 @@ namespace Sunny.UI
/// <returns>是否选择文件夹</returns>
public static bool SelectDirEx(string desc, ref string dir)
{
bool bOk = false;
using (FolderBrowserDialogEx fd = new FolderBrowserDialogEx { Description = desc, DirectoryPath = dir })
{
if (fd.ShowDialog(null) == DialogResult.OK)
{
dir = fd.DirectoryPath.DealPath();
bOk = true;
}
}
using FolderBrowserDialogEx fd = new FolderBrowserDialogEx { Description = desc, DirectoryPath = dir };
bool bOk = fd.ShowDialog(null) == DialogResult.OK;
if (bOk) dir = fd.DirectoryPath.DealPath();
return bOk;
}
/// <summary>
/// Temp文件夹末尾包括\
/// </summary>
/// <returns>结果</returns>
public static string TempPath()
{
return Path.GetTempPath().DealPath();
}
/// <summary>
/// Temp文件夹下唯一的新建临时文件夹末尾包括\
/// </summary>
/// <returns>结果</returns>
public static string TempRandomPath()
{
string path = FileEx.TempFileName(false);
Directory.CreateDirectory(path);
return path.DealPath();
}
/// <summary>
/// 检测指定目录是否存在
/// </summary>
/// <param name="dir">目录的绝对路径</param>
/// <returns>结果</returns>
public static bool Exists(string dir)
{
return Directory.Exists(dir);
}
/// <summary>
/// 创建一个目录
/// </summary>
/// <param name="dir">目录的绝对路径</param>
public static void CreateDir(string dir)
{
//如果目录不存在则创建该目录
if (!Exists(dir))
{
Directory.CreateDirectory(dir);
}
}
/// <summary>
/// 尝试删除非空文件夹
/// </summary>
/// <param name="dir">文件夹</param>
/// <returns>结果</returns>
public static bool TryDelete(string dir)
{
try
{
Directory.Delete(dir);
return !Directory.Exists(dir);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return false;
}
}
/// <summary>
/// 清空指定的文件夹,但不删除文件夹
/// </summary>
/// <param name="dir">文件夹</param>
public static void EmptyDir(string dir)
{
foreach (string d in Directory.GetFileSystemEntries(dir))
{
if (File.Exists(d))
{
FileInfo fi = new FileInfo(d);
if (fi.Attributes.ToString().IndexOf("ReadOnly", StringComparison.Ordinal) != -1)
{
fi.Attributes = FileAttributes.Normal;
}
fi.TryDelete();
}
else
{
DirectoryInfo d1 = new DirectoryInfo(d);
EmptyDir(d1.FullName); //递归删除子文件夹
TryDelete(d);
}
}
}
/// <summary>
/// 删除指定的文件夹
/// </summary>
/// <param name="dir">文件夹</param>
public static void DeleteDir(string dir)
{
EmptyDir(dir);
TryDelete(dir);
}
/// <summary>
/// 调用系统资源管理器打开文件夹,如果是文件则选中文件
/// </summary>
@ -218,236 +69,10 @@ namespace Sunny.UI
System.Diagnostics.Process.Start("Explorer.exe", @"/select," + dir);
}
if (Exists(dir))
if (Directory.Exists(dir))
{
System.Diagnostics.Process.Start("Explorer.exe", dir);
}
}
/// <summary>
/// 在指定目录下创建以年月日分级的子目录,末尾包括\
/// </summary>
/// <param name="dt">日期</param>
/// <param name="path">文件夹</param>
/// <param name="createIfNotExist">不存在是否创建</param>
/// <returns>文件夹名</returns>
public static string YearMonthDayFolder(this DateTime dt, string path, bool createIfNotExist = false)
{
if (path.IsNullOrEmpty())
{
return path;
}
string result = path.DealPath() + dt.YearString() + "\\" + dt.YearMonthString() + "\\" + dt.DateString() + "\\";
if (createIfNotExist)
{
DirEx.CreateDir(result);
}
return result;
}
/// <summary>
/// 在指定目录下创建以年月分级的子目录,末尾包括\
/// </summary>
/// <param name="dt">日期</param>
/// <param name="path">文件夹</param>
/// <param name="createIfNotExist">不存在是否创建</param>
/// <returns>文件夹名</returns>
public static string YearMonthFolder(this DateTime dt, string path, bool createIfNotExist = false)
{
if (path.IsNullOrEmpty())
{
return path;
}
string result = path.DealPath() + dt.YearString() + "\\" + dt.YearMonthString() + "\\";
if (createIfNotExist)
{
DirEx.CreateDir(result);
}
return result;
}
/// <summary>
/// 创建年月文件夹,末尾包括\
/// </summary>
/// <param name="dir">路径</param>
/// <param name="datetime">时间</param>
/// <returns>文件夹</returns>
public static string CreateYearMonthFolder(string dir, DateTime datetime)
{
return datetime.YearMonthFolder(dir, true);
}
/// <summary>
/// 创建年月日文件夹,末尾包括\
/// </summary>
/// <param name="dir">路径</param>
/// <param name="datetime">时间</param>
/// <returns>文件夹</returns>
public static string CreateYearMonthDayFolder(string dir, DateTime datetime)
{
return datetime.YearMonthDayFolder(dir, true);
}
/// <summary>
/// 获取指定目录中的匹配项(文件或目录)
/// </summary>
/// <param name="dir">要搜索的目录</param>
/// <param name="regexPattern">项名模式正则。null表示忽略模式匹配返回所有项</param>
/// <param name="depth">递归深度。负数表示不限0表示仅顶级</param>
/// <param name="throwEx">是否抛异常</param>
/// <returns>结果</returns>
public static string[] GetFileSystemEntries(string dir, string regexPattern = null, int depth = 0, bool throwEx = false)
{
List<string> lst = new List<string>();
try
{
foreach (string item in Directory.GetFileSystemEntries(dir))
{
try
{
string filename = Path.GetFileName(item);
if (regexPattern == null || Regex.IsMatch(filename, regexPattern, RegexOptions.IgnoreCase | RegexOptions.Multiline))
{
lst.Add(item);
}
//递归
if (depth != 0 && (File.GetAttributes(item) & FileAttributes.Directory) == FileAttributes.Directory)
{
lst.AddRange(GetFileSystemEntries(item, regexPattern, depth - 1, throwEx));
}
}
catch
{
if (throwEx)
{
throw;
}
}
}
}
catch
{
if (throwEx)
{
throw;
}
}
return lst.ToArray();
}
/// <summary>
/// 获取指定目录中的匹配文件
/// </summary>
/// <param name="dir">要搜索的目录</param>
/// <param name="regexPattern">文件名模式正则。null表示忽略模式匹配返回所有文件</param>
/// <param name="depth">递归深度。负数表示不限0表示仅顶级</param>
/// <param name="throwEx">是否抛异常</param>
/// <returns>结果</returns>
public static string[] GetFiles(string dir, string regexPattern = null, int depth = 0, bool throwEx = false)
{
List<string> lst = new List<string>();
try
{
foreach (string item in Directory.GetFileSystemEntries(dir))
{
try
{
bool isFile = (File.GetAttributes(item) & FileAttributes.Directory) != FileAttributes.Directory;
string filename = Path.GetFileName(item);
if (isFile && (regexPattern == null || Regex.IsMatch(filename, regexPattern, RegexOptions.IgnoreCase | RegexOptions.Multiline)))
{
lst.Add(item);
}
//递归
if (depth != 0 && !isFile)
{
lst.AddRange(GetFiles(item, regexPattern, depth - 1, throwEx));
}
}
catch
{
if (throwEx)
{
throw;
}
}
}
}
catch
{
if (throwEx)
{
throw;
}
}
return lst.ToArray();
}
/// <summary>
/// 获取指定目录中的匹配目录
/// </summary>
/// <param name="dir">要搜索的目录</param>
/// <param name="regexPattern">目fu录名模式正则。null表示忽略模式匹配返回所有目录</param>
/// <param name="depth">递归深度。负数表示不限0表示仅顶级</param>
/// <param name="throwEx">是否抛异常</param>
/// <returns>结果</returns>
public static string[] GetDirectories(string dir, string regexPattern = null, int depth = 0, bool throwEx = false)
{
List<string> lst = new List<string>();
try
{
foreach (string item in Directory.GetDirectories(dir))
{
try
{
string filename = Path.GetFileName(item);
if (filename == null)
{
continue;
}
if (regexPattern == null || Regex.IsMatch(filename, regexPattern, RegexOptions.IgnoreCase | RegexOptions.Multiline))
{
lst.Add(item);
}
//递归
if (depth != 0)
{
lst.AddRange(GetDirectories(item, regexPattern, depth - 1, throwEx));
}
}
catch
{
if (throwEx)
{
throw;
}
}
}
}
catch
{
if (throwEx)
{
throw;
}
}
return lst.ToArray();
}
}
}

View File

@ -1,6 +1,6 @@
/******************************************************************************
* SunnyUI
* CopyRight (C) 2012-2023 ShenYongHua().
* CopyRight (C) 2012-2025 ShenYongHua().
* QQ群56829229 QQ17612584 EMailSunnyUI@QQ.Com
*
* Blog: https://www.cnblogs.com/yhuse

View File

@ -1,6 +1,6 @@
/******************************************************************************
* SunnyUI
* CopyRight (C) 2012-2023 ShenYongHua().
* CopyRight (C) 2012-2025 ShenYongHua().
* QQ群56829229 QQ17612584 EMailSunnyUI@QQ.Com
*
* Blog: https://www.cnblogs.com/yhuse
@ -427,12 +427,10 @@ namespace Sunny.UI
}
// Simply copy the argb values array
// ReSharper disable once InconsistentNaming
int* s0t = _scan0;
fixed (int* source = colors)
{
// ReSharper disable once InconsistentNaming
int* s0s = source;
int count = Width * Height;

View File

@ -1,356 +0,0 @@
/******************************************************************************
* SunnyUI
* CopyRight (C) 2012-2023 ShenYongHua().
* QQ群56829229 QQ17612584 EMailSunnyUI@QQ.Com
*
* Blog: https://www.cnblogs.com/yhuse
* Gitee: https://gitee.com/yhuse/SunnyUI
* GitHub: https://github.com/yhuse/SunnyUI
*
* SunnyUI.dll can be used for free under the GPL-3.0 license.
* If you use this code, please keep this note.
* 使
******************************************************************************
* : FastLZ.cs
* : FastLZ压缩解压类
* : V3.1
* : 2022-03-31
* : https://ariya.github.io/FastLZ/
*
* FastLZ (MIT license) is an ANSI C/C90 implementation of Lempel-Ziv 77
* algorithm (LZ77) of lossless data compression. It is suitable to compress
* series of text/paragraphs, sequences of raw pixel data, or any other blocks
* of data with lots of repetition. It is not intended to be used on images,
* videos, and other formats of data typically already in an optimal
* compressed form.
*
* 2022-03-31: V3.1.2
* 2022-07-07: V3.2.1
* 2022-07-07: V3.2.1 FastLZx86.dllFastLZx64.dll资源文件
******************************************************************************
*
* int fastlz_compress_level(int level, const void* input, int length, void* output);
*
* level 12
* 1
* 2
* 使fastlz_decompress进行解压缩
*
* input
* length 16
* output 5%66
*
*
******************************************************************************
*
* int fastlz_decompress(const void* input, int length, void* output, int maxout);
*
* input
* length
* output
* maxout maxout中指定的值
*
* 0
*
******************************************************************************
* CompressExDecompressEx
* 168!\r\n结尾
* 20:
* 4(!FLZ)
* 4SecondsUnix时间戳Jan1st1970开始的秒数
* 4Milliseconds
* 4(maxout)
* 4()
* 8:
* 4
* 1(*)
* 1(CRC,,0)
* 2(\r\n)
******************************************************************************
* FastLZx86.dllFastLZx64.dll见项目 https://gitee.com/yhuse/SunnyUI.FastLZ
******************************************************************************/
using System;
using System.IO;
using System.Runtime.InteropServices;
namespace Sunny.UI
{
public static unsafe class FastLZx86
{
[DllImport("FastLZx86.dll", EntryPoint = "FastLZ_Compress", CallingConvention = CallingConvention.Cdecl)]
public static extern int FastLZ_Compress(void* input, int length, void* output);
[DllImport("FastLZx86.dll", EntryPoint = "FastLZ_Compress_level", CallingConvention = CallingConvention.Cdecl)]
public static extern int FastLZ_Compress_level(int level, void* input, int length, void* output);
[DllImport("FastLZx86.dll", EntryPoint = "FastLZ_Decompress", CallingConvention = CallingConvention.Cdecl)]
public static extern int FastLZ_Decompress(void* input, int length, void* output, int maxout);
}
public static unsafe class FastLZx64
{
[DllImport("FastLZx64.dll", EntryPoint = "FastLZ_Compress", CallingConvention = CallingConvention.Cdecl)]
public static extern int FastLZ_Compress(void* input, int length, void* output);
[DllImport("FastLZx64.dll", EntryPoint = "FastLZ_Compress_level", CallingConvention = CallingConvention.Cdecl)]
public static extern int FastLZ_Compress_level(int level, void* input, int length, void* output);
[DllImport("FastLZx64.dll", EntryPoint = "FastLZ_Decompress", CallingConvention = CallingConvention.Cdecl)]
public static extern int FastLZ_Decompress(void* input, int length, void* output, int maxout);
}
public enum FastLZCompressionLevel
{
Level1 = 1,
Level2 = 2
}
/// <summary>
/// FastLZ压缩解压类
/// </summary>
public static unsafe class FastLZ
{
/// <summary>
/// 是否64位
/// </summary>
/// <returns></returns>
private static bool Is64bitApp()
{
return IntPtr.Size == 8;
}
/// <summary>
/// 压缩(原生)
/// </summary>
/// <param name="input">输入</param>
/// <param name="begin">起始位置</param>
/// <param name="length">长度</param>
/// <returns>压缩结果</returns>
public static byte[] Compress(byte[] input, int begin, int length)
{
CheckFastLZDll();
byte[] output = new byte[Math.Max(length * 2, 66)];
fixed (void* pSrc1 = &input[begin])
fixed (void* pSrc2 = output)
{
int outlen = Is64bitApp() ? FastLZx64.FastLZ_Compress(pSrc1, length, pSrc2) : FastLZx86.FastLZ_Compress(pSrc1, length, pSrc2);
byte[] result = new byte[outlen];
Array.Copy(output, 0, result, 0, outlen);
return result;
}
}
/// <summary>
/// 压缩(原生)
/// </summary>
/// <param name="level">压缩级别</param>
/// <param name="input">输入</param>
/// <param name="begin">起始位置</param>
/// <param name="length">长度</param>
/// <returns>压缩结果</returns>
public static byte[] Compress(FastLZCompressionLevel level, byte[] input, int begin, int length)
{
CheckFastLZDll();
byte[] output = new byte[Math.Max(length * 2, 66)];
fixed (void* pSrc1 = &input[begin])
fixed (void* pSrc2 = output)
{
int outlen = Is64bitApp() ? FastLZx64.FastLZ_Compress_level((int)level, pSrc1, length, pSrc2) : FastLZx86.FastLZ_Compress_level((int)level, pSrc1, length, pSrc2);
byte[] result = new byte[outlen];
Array.Copy(output, 0, result, 0, outlen);
return result;
}
}
/// <summary>
/// 解压缩(原生)
/// </summary>
/// <param name="input">输入</param>
/// <param name="begin">起始位置</param>
/// <param name="length">长度</param>
/// <param name="maxout">解压结果最大长度</param>
/// <returns>解压缩结果</returns>
public static byte[] Decompress(byte[] input, int begin, int length, int maxout)
{
CheckFastLZDll();
byte[] output = new byte[maxout + 66];
fixed (byte* pSrc1 = &input[begin])
fixed (byte* pSrc2 = output)
{
int outlen = Is64bitApp() ? FastLZx64.FastLZ_Decompress(pSrc1, length, pSrc2, output.Length) : FastLZx86.FastLZ_Decompress(pSrc1, length, pSrc2, output.Length);
byte[] result = new byte[outlen];
Array.Copy(output, 0, result, 0, outlen);
return result;
}
}
private static byte[] ExHead = "!FLZ".ToEnBytes(4);
private const int ExHeadAllLength = 20;
private const int ExTailAllLength = 8;
private static DateTime Jan1st1970 = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
/// <summary>
/// 压缩(扩展)
/// </summary>
/// <param name="input">输入</param>
/// <param name="begin">起始位置</param>
/// <param name="length">长度</param>
/// <param name="datetime">时间</param>
/// <param name="index">索引</param>
/// <returns>压缩结果</returns>
public static byte[] CompressEx(byte[] input, int begin, int length, DateTime dateTime, int index)
{
CheckFastLZDll();
byte[] result = CompressEx(input, begin, length);
if (result.Length > 0)
{
TimeSpan span = dateTime - Jan1st1970;
int totalSeconds = (int)span.TotalSeconds;
int milliseconds = span.Milliseconds;
Array.Copy(BitConverter.GetBytes(totalSeconds), 0, result, 4, 4);
Array.Copy(BitConverter.GetBytes(milliseconds), 0, result, 8, 4);
Array.Copy(BitConverter.GetBytes(index), 0, result, result.Length - 8, 4);
}
return result;
}
/// <summary>
/// 压缩(扩展)
/// </summary>
/// <param name="input">输入</param>
/// <param name="begin">起始位置</param>
/// <param name="length">长度</param>
/// <returns>压缩结果</returns>
public static byte[] CompressEx(byte[] input, int begin, int length)
{
CheckFastLZDll();
byte[] result = new byte[0];
if (begin + length > input.Length) return result;
byte[] output = new byte[Math.Max(length * 2, 66)];
fixed (void* pSrc1 = &input[begin])
fixed (void* pSrc2 = output)
{
int outlen = Is64bitApp() ? FastLZx64.FastLZ_Compress(pSrc1, length, pSrc2) : FastLZx86.FastLZ_Compress(pSrc1, length, pSrc2);
result = new byte[outlen + ExHeadAllLength + ExTailAllLength];
Array.Copy(ExHead, 0, result, 0, ExHead.Length);
Array.Copy(BitConverter.GetBytes((int)0), 0, result, 4, 4);
Array.Copy(BitConverter.GetBytes((int)0), 0, result, 8, 4);
Array.Copy(BitConverter.GetBytes((int)output.Length), 0, result, 12, 4);
Array.Copy(BitConverter.GetBytes((int)outlen), 0, result, 16, 4);
Array.Copy(output, 0, result, ExHeadAllLength, outlen);
Array.Copy(BitConverter.GetBytes((int)0), 0, result, result.Length - 8, 4);
result[result.Length - 4] = 42; //*
result[result.Length - 3] = 0; //CRC
result[result.Length - 2] = 13; //\r
result[result.Length - 1] = 10; //\n
return result;
}
}
/// <summary>
/// 解压缩(扩展)
/// </summary>
/// <param name="input">输入</param>
/// <param name="begin">起始位置</param>
/// <param name="length">长度</param>
/// <returns>解压缩结果</returns>
public static byte[] DecompressEx(byte[] input, int begin, int length)
{
CheckFastLZDll();
byte[] result = new byte[0];
if (input.Length <= 2 + ExHeadAllLength + ExTailAllLength) return result;
if (begin + length > input.Length) return result;
if (input[begin] != 33) return result;
if (input[begin + length - 4] != 42) return result;
if (length != BitConverter.ToInt32(input, begin + 16) + ExHeadAllLength + ExTailAllLength) return result;
byte[] output = new byte[BitConverter.ToInt32(input, begin + ExHead.Length)];
fixed (byte* pSrc1 = &input[begin + ExHeadAllLength])
fixed (byte* pSrc2 = output)
{
length = length - ExHeadAllLength - ExTailAllLength;
int outlen = Is64bitApp() ? FastLZx64.FastLZ_Decompress(pSrc1, length, pSrc2, output.Length) : FastLZx86.FastLZ_Decompress(pSrc1, length, pSrc2, output.Length);
result = new byte[outlen];
Array.Copy(output, 0, result, 0, outlen);
return result;
}
}
/// <summary>
/// 解压缩(扩展)
/// </summary>
/// <param name="input">输入</param>
/// <param name="begin">起始位置</param>
/// <param name="length">长度</param>
/// <param name="datetime">时间</param>
/// <param name="index">索引</param>
/// <returns>解压缩结果</returns>
public static byte[] DecompressEx(byte[] input, int begin, int length, out DateTime datetime, out int index)
{
CheckFastLZDll();
byte[] result = DecompressEx(input, begin, length);
datetime = Jan1st1970;
index = 0;
if (result.Length > 0)
{
datetime = Jan1st1970.AddSeconds(BitConverter.ToInt32(input, begin + 4)).AddMilliseconds(BitConverter.ToInt32(input, begin + 8));
index = BitConverter.ToInt32(input, begin + length - 8);
}
return result;
}
private static bool FileExist = false;
public static bool CheckFastLZDll()
{
if (FileExist) return true;
if (File.Exists(DirEx.CurrentDir() + "FastLZx86.dll") && File.Exists(DirEx.CurrentDir() + "FastLZx64.dll"))
{
FileExist = true;
return true;
}
try
{
CreateResourceToFile(DirEx.CurrentDir() + "FastLZx86.dll", "Sunny.UI.Common.FastLZx86.dat");
CreateResourceToFile(DirEx.CurrentDir() + "FastLZx64.dll", "Sunny.UI.Common.FastLZx64.dat");
}
catch
{
return false;
}
FileExist = File.Exists(DirEx.CurrentDir() + "FastLZx86.dll") && File.Exists(DirEx.CurrentDir() + "FastLZx64.dll");
return FileExist;
}
/// <summary>
/// 从系统资源中保存文件
/// </summary>
/// <param name="file">文件名</param>
/// <param name="resource">资源名称</param>
private static void CreateResourceToFile(string file, string resource)
{
if (!File.Exists(file))
{
Stream stream = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(resource);
if (stream != null)
{
byte[] buffer = new byte[stream.Length];
stream.Read(buffer, 0, (int)stream.Length);
stream.Close();
File.WriteAllBytes(file, buffer);
}
}
}
}
}

View File

@ -1,6 +1,6 @@
/******************************************************************************
* SunnyUI
* CopyRight (C) 2012-2023 ShenYongHua().
* CopyRight (C) 2012-2025 ShenYongHua().
* QQ群56829229 QQ17612584 EMailSunnyUI@QQ.Com
*
* Blog: https://www.cnblogs.com/yhuse
@ -43,7 +43,7 @@ namespace Sunny.UI
/// <param name="targetFileName"></param>
/// <param name="bFailIfExists"></param>
/// <returns></returns>
public static bool Copy(this string sourceFileName, string targetFileName, bool bFailIfExists = true)
public static bool Copy(string sourceFileName, string targetFileName, bool bFailIfExists = true)
{
if (File.Exists(sourceFileName))
{
@ -53,15 +53,6 @@ namespace Sunny.UI
return false;
}
/// <summary>
/// 调用WINAPI删除文件
/// </summary>
/// <param name="lpFileName">文件</param>
public static int DeleteFile(string lpFileName)
{
return Win32.Kernel.DeleteFile(lpFileName);
}
/// <summary>
/// 打开文件夹对话框
/// </summary>
@ -71,27 +62,22 @@ namespace Sunny.UI
/// <returns>打开是否成功</returns>
public static bool OpenDialog(ref string filename, string filter = "", string defaultExt = "")
{
using (OpenFileDialog od = new OpenFileDialog { Title = "打开" })
{
try
{
od.FileName = filename;
od.Filter = filter;
}
catch
{
od.Filter = "";
}
using OpenFileDialog od = new OpenFileDialog { Title = UIStyles.CurrentResources.Open };
od.DefaultExt = defaultExt;
if (od.ShowDialog() == DialogResult.OK)
{
filename = od.FileName;
return true;
}
try
{
od.FileName = filename;
od.Filter = filter;
}
catch
{
od.Filter = "";
}
return false;
od.DefaultExt = defaultExt;
bool isOk = od.ShowDialog() == DialogResult.OK;
if (isOk) filename = od.FileName;
return isOk;
}
/// <summary>
@ -103,27 +89,21 @@ namespace Sunny.UI
/// <returns>保存是否成功</returns>
public static bool SaveDialog(ref string filename, string filter = "", string defaultExt = "")
{
using (SaveFileDialog od = new SaveFileDialog { Title = "保存" })
using SaveFileDialog od = new SaveFileDialog { Title = UIStyles.CurrentResources.Save };
try
{
try
{
od.FileName = filename;
od.Filter = filter;
}
catch
{
od.Filter = "";
}
od.DefaultExt = defaultExt;
if (od.ShowDialog() == DialogResult.OK)
{
filename = od.FileName;
return true;
}
od.FileName = filename;
od.Filter = filter;
}
catch
{
od.Filter = "";
}
return false;
od.DefaultExt = defaultExt;
bool isOk = od.ShowDialog() == DialogResult.OK;
if (isOk) filename = od.FileName;
return isOk;
}
/// <summary>
@ -542,52 +522,6 @@ namespace Sunny.UI
}
}
/// <summary>
/// 复制
/// </summary>
/// <param name="source">源目录</param>
/// <param name="dest">目标目录</param>
public static void Copy(string source, string dest)
{
Copy(new DirectoryInfo(source), new DirectoryInfo(dest));
}
/// <summary>
/// 复制
/// </summary>
/// <param name="source">源目录</param>
/// <param name="dest">目标目录</param>
public static void Copy(DirectoryInfo source, DirectoryInfo dest)
{
if (dest.FullName.StartsWith(source.FullName, StringComparison.CurrentCultureIgnoreCase))
{
throw new Exception("父目录不能拷贝到子目录!");
}
if (!source.Exists)
{
return;
}
if (!dest.Exists)
{
dest.Create();
}
FileInfo[] files = source.GetFiles();
foreach (FileInfo file in files)
{
File.Copy(file.FullName, Path.Combine(dest.FullName, file.Name), true);
}
DirectoryInfo[] dirs = source.GetDirectories();
foreach (DirectoryInfo dir in dirs)
{
Copy(dir.FullName, Path.Combine(dest.FullName, dir.Name));
}
}
/// <summary>
/// 根据完整文件路径获取FileStream
/// </summary>
@ -605,16 +539,6 @@ namespace Sunny.UI
return fileStream;
}
/// <summary>
/// 检测指定文件是否存在,如果存在则返回true。
/// </summary>
/// <param name="filePath">文件的绝对路径</param>
/// <returns>结果</returns>
public static bool Exists(string filePath)
{
return File.Exists(filePath);
}
/// <summary>
/// 创建一个文件。
/// </summary>
@ -625,7 +549,7 @@ namespace Sunny.UI
try
{
//如果文件不存在则创建该文件
if (!Exists(filePath))
if (!File.Exists(filePath))
{
//创建一个FileInfo对象
FileInfo file = new FileInfo(filePath);
@ -654,7 +578,7 @@ namespace Sunny.UI
try
{
//如果文件不存在则创建该文件
if (!Exists(filePath))
if (!File.Exists(filePath))
{
//创建一个FileInfo对象
FileInfo file = new FileInfo(filePath);

View File

@ -3,7 +3,6 @@ using System.ComponentModel;
using System.Drawing.Design;
using System.Runtime.InteropServices;
using System.Windows.Forms;
// ReSharper disable UnusedMember.Local
namespace Sunny.UI
{

View File

@ -1,6 +1,6 @@
/******************************************************************************
* SunnyUI
* CopyRight (C) 2012-2023 ShenYongHua().
* CopyRight (C) 2012-2025 ShenYongHua().
* QQ群56829229 QQ17612584 EMailSunnyUI@QQ.Com
*
* Blog: https://www.cnblogs.com/yhuse
@ -382,7 +382,6 @@ namespace Sunny.UI
/// <summary>
/// 创建圆角路径
/// </summary>
/// <param name="g">绘图图面</param>
/// <param name="rect">区域</param>
/// <param name="radius">圆角大小</param>
/// <param name="cornerLeftTop">左上角</param>

View File

@ -1,6 +1,6 @@
/******************************************************************************
* SunnyUI
* CopyRight (C) 2012-2023 ShenYongHua().
* CopyRight (C) 2012-2025 ShenYongHua().
* QQ群56829229 QQ17612584 EMailSunnyUI@QQ.Com
*
* Blog: https://www.cnblogs.com/yhuse
@ -37,6 +37,7 @@
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Windows.Forms;
namespace Sunny.UI
@ -55,7 +56,7 @@ namespace Sunny.UI
timer = new Timer();
timer.Tick += Timer_Tick;
if (FileEx.Exists(fileName))
if (File.Exists(fileName))
{
Image = Image.FromFile(fileName);
}

View File

@ -1,6 +1,6 @@
/******************************************************************************
* SunnyUI
* CopyRight (C) 2012-2023 ShenYongHua().
* CopyRight (C) 2012-2025 ShenYongHua().
* QQ群56829229 QQ17612584 EMailSunnyUI@QQ.Com
*
* Blog: https://www.cnblogs.com/yhuse
@ -33,6 +33,70 @@ namespace Sunny.UI
/// </summary>
public static class GraphicsEx
{
public static string TruncateText(Graphics graphics, string text, Font font, float maxWidth)
{
// If the text is empty or null, return it as-is.
if (string.IsNullOrEmpty(text)) return text;
// Measure the original string.
SizeF size = graphics.MeasureString(text, font);
// If the original string fits within the width, return it as-is.
if (size.Width <= maxWidth) return text;
// Otherwise, truncate the string until it fits.
string truncatedText = text;
for (int i = text.Length; i > 0; i--)
{
truncatedText = text.Left(i) + "...";
size = graphics.MeasureString(truncatedText, font);
if (size.Width <= maxWidth)
break;
}
return truncatedText;
}
public static void DrawTruncateString(this Graphics g, string text, Font font, Color color, Rectangle rect, float maxWidth, HorizontalAlignment alignment)
{
text = TruncateText(g, text, font, maxWidth);
g.DrawString(text, font, color, rect, alignment.ToContentAlignment());
}
internal static ContentAlignment ToContentAlignment(this HorizontalAlignment alignment)
{
switch (alignment)
{
case HorizontalAlignment.Left: return ContentAlignment.MiddleLeft;
case HorizontalAlignment.Center: return ContentAlignment.MiddleCenter;
case HorizontalAlignment.Right: return ContentAlignment.MiddleRight;
}
return ContentAlignment.MiddleLeft;
}
internal static HorizontalAlignment ToHorizontalAlignment(this ContentAlignment alignment)
{
switch (alignment)
{
case ContentAlignment.TopLeft:
case ContentAlignment.MiddleLeft:
case ContentAlignment.BottomLeft:
return HorizontalAlignment.Left;
case ContentAlignment.TopCenter:
case ContentAlignment.MiddleCenter:
case ContentAlignment.BottomCenter:
return HorizontalAlignment.Center;
case ContentAlignment.TopRight:
case ContentAlignment.MiddleRight:
case ContentAlignment.BottomRight:
return HorizontalAlignment.Right;
}
return HorizontalAlignment.Left;
}
public static void DrawString(this Graphics g, string text, Font font, Color color, Rectangle rect, ContentAlignment alignment, int offsetX = 0, int offsetY = 0)
{
if (text.IsNullOrEmpty()) return;

View File

@ -1,865 +0,0 @@
/******************************************************************************
* SunnyUI
* CopyRight (C) 2012-2023 ShenYongHua().
* QQ群56829229 QQ17612584 EMailSunnyUI@QQ.Com
*
* Blog: https://www.cnblogs.com/yhuse
* Gitee: https://gitee.com/yhuse/SunnyUI
* GitHub: https://github.com/yhuse/SunnyUI
*
* SunnyUI.dll can be used for free under the GPL-3.0 license.
* If you use this code, please keep this note.
* 使
******************************************************************************
* : UHook.cs
* :
* : V3.1
* : 2020-01-01
*
* 2020-01-01: V2.2.0
******************************************************************************/
using Sunny.UI.Win32;
using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;
// ReSharper disable UnusedMember.Local
#pragma warning disable 1591
namespace Sunny.UI
{
/// <summary>
/// Abstract base class for Mouse and Keyboard hooks
/// </summary>
public abstract class GlobalHook
{
#region Windows API Code
[StructLayout(LayoutKind.Sequential)]
protected class POINT
{
public int x;
public int y;
}
[StructLayout(LayoutKind.Sequential)]
protected class MouseHookStruct
{
public POINT pt;
public int hwnd;
public int wHitTestCode;
public int dwExtraInfo;
}
[StructLayout(LayoutKind.Sequential)]
protected class MouseLLHookStruct
{
public POINT pt;
public int mouseData;
public int flags;
public int time;
public int dwExtraInfo;
}
[StructLayout(LayoutKind.Sequential)]
protected class KeyboardHookStruct
{
public int vkCode;
public int scanCode;
public int flags;
public int time;
public int dwExtraInfo;
}
[DllImport("user32.dll", CharSet = CharSet.Auto,
CallingConvention = CallingConvention.StdCall, SetLastError = true)]
protected static extern int SetWindowsHookEx(
int idHook,
HookProc lpfn,
IntPtr hMod,
int dwThreadId);
[DllImport("user32.dll", CharSet = CharSet.Auto,
CallingConvention = CallingConvention.StdCall, SetLastError = true)]
protected static extern int UnhookWindowsHookEx(int idHook);
[DllImport("user32.dll", CharSet = CharSet.Auto,
CallingConvention = CallingConvention.StdCall)]
protected static extern int CallNextHookEx(
int idHook,
int nCode,
int wParam,
IntPtr lParam);
[DllImport("user32")]
protected static extern int ToAscii(
int uVirtKey,
int uScanCode,
byte[] lpbKeyState,
byte[] lpwTransKey,
int fuState);
[DllImport("user32")]
protected static extern int GetKeyboardState(byte[] pbKeyState);
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
protected static extern short GetKeyState(int vKey);
protected delegate int HookProc(int nCode, int wParam, IntPtr lParam);
protected const int WH_MOUSE_LL = 14;
protected const int WH_KEYBOARD_LL = 13;
protected const int WH_MOUSE = 7;
protected const int WH_KEYBOARD = 2;
protected const int WM_MOUSEMOVE = 0x200;
protected const int WM_LBUTTONDOWN = 0x201;
protected const int WM_RBUTTONDOWN = 0x204;
protected const int WM_MBUTTONDOWN = 0x207;
protected const int WM_LBUTTONUP = 0x202;
protected const int WM_RBUTTONUP = 0x205;
protected const int WM_MBUTTONUP = 0x208;
protected const int WM_LBUTTONDBLCLK = 0x203;
protected const int WM_RBUTTONDBLCLK = 0x206;
protected const int WM_MBUTTONDBLCLK = 0x209;
protected const int WM_MOUSEWHEEL = 0x020A;
protected const int WM_KEYDOWN = 0x100;
protected const int WM_KEYUP = 0x101;
protected const int WM_SYSKEYDOWN = 0x104;
protected const int WM_SYSKEYUP = 0x105;
protected const byte VK_SHIFT = 0x10;
protected const byte VK_CAPITAL = 0x14;
protected const byte VK_NUMLOCK = 0x90;
protected const byte VK_LSHIFT = 0xA0;
protected const byte VK_RSHIFT = 0xA1;
protected const byte VK_LCONTROL = 0xA2;
protected const byte VK_RCONTROL = 0x3;
protected const byte VK_LALT = 0xA4;
protected const byte VK_RALT = 0xA5;
protected const byte LLKHF_ALTDOWN = 0x20;
#endregion Windows API Code
#region Private Variables
protected int _hookType;
protected int _handleToHook;
protected bool _isStarted;
protected HookProc _hookCallback;
#endregion Private Variables
#region Properties
public bool IsStarted
{
get
{
return _isStarted;
}
}
#endregion Properties
#region Constructor
public GlobalHook()
{
Application.ApplicationExit += Application_ApplicationExit;
}
#endregion Constructor
#region Methods
public void Start()
{
if (!_isStarted && _hookType != 0)
{
// Make sure we keep a reference to this delegate!
// If not, GC randomly collects it, and a NullReference exception is thrown
_hookCallback = HookCallbackProcedure;
_handleToHook = SetWindowsHookEx(_hookType, _hookCallback, (IntPtr)Kernel.GetModuleHandle(null), 0);
//Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0);
// Were we able to sucessfully start hook?
if (_handleToHook != 0)
{
_isStarted = true;
}
}
}
public void Stop()
{
if (_isStarted)
{
UnhookWindowsHookEx(_handleToHook);
_isStarted = false;
}
}
protected virtual int HookCallbackProcedure(int nCode, Int32 wParam, IntPtr lParam)
{
// This method must be overriden by each extending hook
return 0;
}
protected void Application_ApplicationExit(object sender, EventArgs e)
{
if (_isStarted)
{
Stop();
}
}
#endregion Methods
}
/// <summary>
/// Captures global keyboard events
/// </summary>
public class KeyboardHook : GlobalHook
{
#region Events
public event KeyEventHandler KeyDown;
public event KeyEventHandler KeyUp;
public event KeyPressEventHandler KeyPress;
#endregion Events
#region Constructor
public KeyboardHook()
{
_hookType = WH_KEYBOARD_LL;
}
#endregion Constructor
#region Methods
protected override int HookCallbackProcedure(int nCode, int wParam, IntPtr lParam)
{
bool handled = false;
if (nCode > -1 && (KeyDown != null || KeyUp != null || KeyPress != null))
{
KeyboardHookStruct keyboardHookStruct =
(KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct));
// Is Control being held down?
bool control = ((GetKeyState(VK_LCONTROL) & 0x80) != 0) ||
((GetKeyState(VK_RCONTROL) & 0x80) != 0);
// Is Shift being held down?
bool shift = ((GetKeyState(VK_LSHIFT) & 0x80) != 0) ||
((GetKeyState(VK_RSHIFT) & 0x80) != 0);
// Is Alt being held down?
bool alt = ((GetKeyState(VK_LALT) & 0x80) != 0) ||
((GetKeyState(VK_RALT) & 0x80) != 0);
// Is CapsLock on?
bool capslock = (GetKeyState(VK_CAPITAL) != 0);
// Create event using keycode and control/shift/alt values found above
KeyEventArgs e = new KeyEventArgs(
(Keys)(
keyboardHookStruct.vkCode |
(control ? (int)Keys.Control : 0) |
(shift ? (int)Keys.Shift : 0) |
(alt ? (int)Keys.Alt : 0)
));
// Handle KeyDown and KeyUp events
switch (wParam)
{
case WM_KEYDOWN:
case WM_SYSKEYDOWN:
if (KeyDown != null)
{
KeyDown(this, e);
handled = e.Handled;
}
break;
case WM_KEYUP:
case WM_SYSKEYUP:
if (KeyUp != null)
{
KeyUp(this, e);
handled = e.Handled;
}
break;
}
// Handle KeyPress event
if (wParam == WM_KEYDOWN &&
!handled &&
!e.SuppressKeyPress &&
KeyPress != null)
{
byte[] keyState = new byte[256];
byte[] inBuffer = new byte[2];
GetKeyboardState(keyState);
if (ToAscii(keyboardHookStruct.vkCode,
keyboardHookStruct.scanCode,
keyState,
inBuffer,
keyboardHookStruct.flags) == 1)
{
char key = (char)inBuffer[0];
if ((capslock ^ shift) && Char.IsLetter(key))
key = Char.ToUpper(key);
KeyPressEventArgs e2 = new KeyPressEventArgs(key);
KeyPress(this, e2);
handled = e.Handled;
}
}
}
if (handled)
{
return 1;
}
else
{
return CallNextHookEx(_handleToHook, nCode, wParam, lParam);
}
}
#endregion Methods
}
/// <summary>
/// Captures global mouse events
/// </summary>
public class MouseHook : GlobalHook
{
#region MouseEventType Enum
private enum MouseEventType
{
None,
MouseDown,
MouseUp,
DoubleClick,
MouseWheel,
MouseMove
}
#endregion MouseEventType Enum
#region Events
public event MouseEventHandler MouseDown;
public event MouseEventHandler MouseUp;
public event MouseEventHandler MouseMove;
public event MouseEventHandler MouseWheel;
public event MouseEventHandler Click;
public event MouseEventHandler DoubleClick;
#endregion Events
#region Constructor
public MouseHook()
{
_hookType = WH_MOUSE_LL;
}
#endregion Constructor
#region Methods
protected override int HookCallbackProcedure(int nCode, int wParam, IntPtr lParam)
{
if (nCode > -1 && (MouseDown != null || MouseUp != null || MouseMove != null))
{
MouseLLHookStruct mouseHookStruct =
(MouseLLHookStruct)Marshal.PtrToStructure(lParam, typeof(MouseLLHookStruct));
MouseButtons button = GetButton(wParam);
MouseEventType eventType = GetEventType(wParam);
MouseEventArgs e = new MouseEventArgs(
button,
(eventType == MouseEventType.DoubleClick ? 2 : 1),
mouseHookStruct.pt.x,
mouseHookStruct.pt.y,
(eventType == MouseEventType.MouseWheel ? (short)((mouseHookStruct.mouseData >> 16) & 0xffff) : 0));
// Prevent multiple Right Click events (this probably happens for popup menus)
if (button == MouseButtons.Right && mouseHookStruct.flags != 0)
{
eventType = MouseEventType.None;
}
switch (eventType)
{
case MouseEventType.MouseDown:
MouseDown?.Invoke(this, e);
break;
case MouseEventType.MouseUp:
Click?.Invoke(this, e);
MouseUp?.Invoke(this, e);
break;
case MouseEventType.DoubleClick:
DoubleClick?.Invoke(this, e);
break;
case MouseEventType.MouseWheel:
MouseWheel?.Invoke(this, e);
break;
case MouseEventType.MouseMove:
MouseMove?.Invoke(this, e);
break;
}
}
return CallNextHookEx(_handleToHook, nCode, wParam, lParam);
}
private MouseButtons GetButton(Int32 wParam)
{
switch (wParam)
{
case WM_LBUTTONDOWN:
case WM_LBUTTONUP:
case WM_LBUTTONDBLCLK:
return MouseButtons.Left;
case WM_RBUTTONDOWN:
case WM_RBUTTONUP:
case WM_RBUTTONDBLCLK:
return MouseButtons.Right;
case WM_MBUTTONDOWN:
case WM_MBUTTONUP:
case WM_MBUTTONDBLCLK:
return MouseButtons.Middle;
default:
return MouseButtons.None;
}
}
private MouseEventType GetEventType(Int32 wParam)
{
switch (wParam)
{
case WM_LBUTTONDOWN:
case WM_RBUTTONDOWN:
case WM_MBUTTONDOWN:
return MouseEventType.MouseDown;
case WM_LBUTTONUP:
case WM_RBUTTONUP:
case WM_MBUTTONUP:
return MouseEventType.MouseUp;
case WM_LBUTTONDBLCLK:
case WM_RBUTTONDBLCLK:
case WM_MBUTTONDBLCLK:
return MouseEventType.DoubleClick;
case WM_MOUSEWHEEL:
return MouseEventType.MouseWheel;
case WM_MOUSEMOVE:
return MouseEventType.MouseMove;
default:
return MouseEventType.None;
}
}
#endregion Methods
}
/// <summary>
/// Standard Keyboard Shortcuts used by most applications
/// </summary>
public enum StandardShortcut
{
Copy,
Cut,
Paste,
SelectAll,
Save,
Open,
New,
Close,
Print
}
/// <summary>
/// Simulate keyboard key presses
/// </summary>
public static class KeyboardSimulator
{
#region Windows API Code
private const int KEYEVENTF_EXTENDEDKEY = 0x1;
private const int KEYEVENTF_KEYUP = 0x2;
[DllImport("user32.dll")]
private static extern void keybd_event(byte key, byte scan, int flags, int extraInfo);
#endregion Windows API Code
#region Methods
public static void KeyDown(Keys key)
{
keybd_event(ParseKey(key), 0, 0, 0);
}
public static void KeyUp(Keys key)
{
keybd_event(ParseKey(key), 0, KEYEVENTF_KEYUP, 0);
}
public static void KeyPress(Keys key)
{
KeyDown(key);
KeyUp(key);
}
public static void SimulateStandardShortcut(StandardShortcut shortcut)
{
switch (shortcut)
{
case StandardShortcut.Copy:
KeyDown(Keys.Control);
KeyPress(Keys.C);
KeyUp(Keys.Control);
break;
case StandardShortcut.Cut:
KeyDown(Keys.Control);
KeyPress(Keys.X);
KeyUp(Keys.Control);
break;
case StandardShortcut.Paste:
KeyDown(Keys.Control);
KeyPress(Keys.V);
KeyUp(Keys.Control);
break;
case StandardShortcut.SelectAll:
KeyDown(Keys.Control);
KeyPress(Keys.A);
KeyUp(Keys.Control);
break;
case StandardShortcut.Save:
KeyDown(Keys.Control);
KeyPress(Keys.S);
KeyUp(Keys.Control);
break;
case StandardShortcut.Open:
KeyDown(Keys.Control);
KeyPress(Keys.O);
KeyUp(Keys.Control);
break;
case StandardShortcut.New:
KeyDown(Keys.Control);
KeyPress(Keys.N);
KeyUp(Keys.Control);
break;
case StandardShortcut.Close:
KeyDown(Keys.Alt);
KeyPress(Keys.F4);
KeyUp(Keys.Alt);
break;
case StandardShortcut.Print:
KeyDown(Keys.Control);
KeyPress(Keys.P);
KeyUp(Keys.Control);
break;
}
}
private static byte ParseKey(Keys key)
{
// Alt, Shift, and Control need to be changed for API function to work with them
switch (key)
{
case Keys.Alt:
return 18;
case Keys.Control:
return 17;
case Keys.Shift:
return 16;
default:
return (byte)key;
}
}
#endregion Methods
}
/// <summary>
/// And X, Y point on the screen
/// </summary>
public struct MousePoint
{
public MousePoint(Point p)
{
X = p.X;
Y = p.Y;
}
public int X;
public int Y;
public static implicit operator Point(MousePoint p)
{
return new Point(p.X, p.Y);
}
}
/// <summary>
/// Mouse buttons that can be pressed
/// </summary>
public enum MouseButton
{
Left = 0x2,
Right = 0x8,
Middle = 0x20
}
/// <summary>
/// Operations that simulate mouse events
/// </summary>
public static class MouseSimulator
{
#region Windows API Code
[DllImport("user32.dll")]
private static extern int ShowCursor(bool show);
[DllImport("user32.dll")]
private static extern void mouse_event(int flags, int dX, int dY, int buttons, int extraInfo);
private const int MOUSEEVENTF_MOVE = 0x1;
private const int MOUSEEVENTF_LEFTDOWN = 0x2;
private const int MOUSEEVENTF_LEFTUP = 0x4;
private const int MOUSEEVENTF_RIGHTDOWN = 0x8;
private const int MOUSEEVENTF_RIGHTUP = 0x10;
private const int MOUSEEVENTF_MIDDLEDOWN = 0x20;
private const int MOUSEEVENTF_MIDDLEUP = 0x40;
private const int MOUSEEVENTF_WHEEL = 0x800;
private const int MOUSEEVENTF_ABSOLUTE = 0x8000;
#endregion Windows API Code
#region Properties
/// <summary>
/// Gets or sets a structure that represents both X and Y mouse coordinates
/// </summary>
public static MousePoint Position
{
get
{
return new MousePoint(Cursor.Position);
}
set
{
Cursor.Position = value;
}
}
/// <summary>
/// Gets or sets only the mouse's x coordinate
/// </summary>
public static int X
{
get
{
return Cursor.Position.X;
}
set
{
Cursor.Position = new Point(value, Y);
}
}
/// <summary>
/// Gets or sets only the mouse's y coordinate
/// </summary>
public static int Y
{
get
{
return Cursor.Position.Y;
}
set
{
Cursor.Position = new Point(X, value);
}
}
#endregion Properties
#region Methods
/// <summary>
/// Press a mouse button down
/// </summary>
/// <param name="button"></param>
public static void MouseDown(MouseButton button)
{
mouse_event(((int)button), 0, 0, 0, 0);
}
public static void MouseDown(MouseButtons button)
{
switch (button)
{
case MouseButtons.Left:
MouseDown(MouseButton.Left);
break;
case MouseButtons.Middle:
MouseDown(MouseButton.Middle);
break;
case MouseButtons.Right:
MouseDown(MouseButton.Right);
break;
}
}
/// <summary>
/// Let a mouse button up
/// </summary>
/// <param name="button"></param>
public static void MouseUp(MouseButton button)
{
mouse_event(((int)button) * 2, 0, 0, 0, 0);
}
public static void MouseUp(MouseButtons button)
{
switch (button)
{
case MouseButtons.Left:
MouseUp(MouseButton.Left);
break;
case MouseButtons.Middle:
MouseUp(MouseButton.Middle);
break;
case MouseButtons.Right:
MouseUp(MouseButton.Right);
break;
}
}
/// <summary>
/// Click a mouse button (down then up)
/// </summary>
/// <param name="button"></param>
public static void Click(MouseButton button)
{
MouseDown(button);
MouseUp(button);
}
public static void Click(MouseButtons button)
{
switch (button)
{
case MouseButtons.Left:
Click(MouseButton.Left);
break;
case MouseButtons.Middle:
Click(MouseButton.Middle);
break;
case MouseButtons.Right:
Click(MouseButton.Right);
break;
}
}
/// <summary>
/// Double click a mouse button (down then up twice)
/// </summary>
/// <param name="button"></param>
public static void DoubleClick(MouseButton button)
{
Click(button);
Click(button);
}
public static void DoubleClick(MouseButtons button)
{
switch (button)
{
case MouseButtons.Left:
DoubleClick(MouseButton.Left);
break;
case MouseButtons.Middle:
DoubleClick(MouseButton.Middle);
break;
case MouseButtons.Right:
DoubleClick(MouseButton.Right);
break;
}
}
/// <summary>
/// Show a hidden current on currently application
/// </summary>
public static void Show()
{
ShowCursor(true);
}
/// <summary>
/// Hide mouse cursor only on current application's forms
/// </summary>
public static void Hide()
{
ShowCursor(false);
}
#endregion Methods
}
}

View File

@ -1,6 +1,6 @@
/******************************************************************************
* SunnyUI
* CopyRight (C) 2012-2023 ShenYongHua().
* CopyRight (C) 2012-2025 ShenYongHua().
* QQ群56829229 QQ17612584 EMailSunnyUI@QQ.Com
*
* Blog: https://www.cnblogs.com/yhuse

View File

@ -1,6 +1,6 @@
/******************************************************************************
* SunnyUI
* CopyRight (C) 2012-2023 ShenYongHua().
* CopyRight (C) 2012-2025 ShenYongHua().
* QQ群56829229 QQ17612584 EMailSunnyUI@QQ.Com
*
* Blog: https://www.cnblogs.com/yhuse

View File

@ -1,6 +1,6 @@
/******************************************************************************
* SunnyUI
* CopyRight (C) 2012-2023 ShenYongHua().
* CopyRight (C) 2012-2025 ShenYongHua().
* QQ群56829229 QQ17612584 EMailSunnyUI@QQ.Com
*
* Blog: https://www.cnblogs.com/yhuse
@ -18,6 +18,7 @@
*
* 2020-01-01: V2.2.0
* 2022-11-01: V3.2.6 Load传入
* 2024-02-27: V3.6.3
******************************************************************************/
using System;
@ -25,24 +26,57 @@ using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.IO;
using System.Reflection;
using System.Text;
using System.Windows.Forms;
namespace Sunny.UI
{
/// <summary>
/// INI 配置文件类
/// </summary>
/// <typeparam name="TConfig">类型</typeparam>
public class IniConfig<TConfig> : BaseConfig<TConfig> where TConfig : IniConfig<TConfig>, new()
/// <typeparam name="T">类型</typeparam>
public class IniConfig<T> : BaseConfig<T> where T : IniConfig<T>, new()
{
#region
/// <summary>
/// Ini文件编码格式
/// </summary>
[ConfigIgnore]
public Encoding IniEncoding { get; private set; } = Encoding.Default;
[ConfigIgnore]
public object this[string property]
{
get
{
PropertyInfo info = Current.GetType().GetProperty(property);
if (info == null)
{
throw new ArgumentNullException("属性名称不存在:" + property);
}
return info.GetValue(this, null);
}
set
{
PropertyInfo info = Current.GetType().GetProperty(property);
if (info == null)
{
throw new ArgumentNullException("属性名称不存在:" + property);
}
try
{
Type propertyType = info.PropertyType;
info.SetValue(Current, Convert.ChangeType(value, propertyType), null);
}
catch (Exception)
{
throw new ArgumentException("属性值转换失败:" + property + ", " + value);
}
}
}
public bool Load(string fileName, Encoding encoding)
{
IniEncoding = encoding;
@ -56,12 +90,12 @@ namespace Sunny.UI
{
if (filename.IsNullOrWhiteSpace())
{
filename = DirEx.CurrentDir() + ConfigFile;
filename = Dir.CurrentDir() + ConfigFile;
}
if (filename.IsNullOrWhiteSpace())
{
throw new ApplicationException($"未指定{typeof(TConfig).Name}的配置文件路径!");
throw new ApplicationException($"未指定{typeof(T).Name}的配置文件路径!");
}
if (!File.Exists(filename))
@ -114,12 +148,12 @@ namespace Sunny.UI
{
if (filename.IsNullOrWhiteSpace())
{
filename = DirEx.CurrentDir() + ConfigFile;
filename = Dir.CurrentDir() + ConfigFile;
}
if (filename.IsNullOrWhiteSpace())
{
throw new ApplicationException($"未指定{typeof(TConfig).Name}的配置文件路径!");
throw new ApplicationException($"未指定{typeof(T).Name}的配置文件路径!");
}
ConcurrentDictionary<string, Ident> idents = ConfigHelper.InitIdents(current);
@ -132,7 +166,10 @@ namespace Sunny.UI
}
ConfigHelper.SaveConfigValue(Current, idents);
List<string> strs = new List<string> { ";<!--" + Description + "-->", "" };
StringBuilder strs = new StringBuilder();
strs.AppendLine(";<?Ini Version=\"" + UIGlobal.Version + "\" Encoding=\"" + IniEncoding.BodyName + "\"?>");
strs.AppendLine(";<?Update Time=\"" + DateTime.Now.DateTimeString() + "\"?>");
strs.AppendLine("");
Dictionary<string, List<Ident>> listidents = new Dictionary<string, List<Ident>>();
foreach (var ident in idents.Values)
{
@ -148,7 +185,7 @@ namespace Sunny.UI
foreach (var values in listidents)
{
strs.Add("[" + values.Key + "]");
strs.AppendLine("[" + values.Key + "]");
SortedList<int, Ident> slist = new SortedList<int, Ident>();
foreach (var ident in values.Value)
@ -160,30 +197,236 @@ namespace Sunny.UI
{
if (!ident.Description.IsNullOrEmpty())
{
strs.Add(";<!--" + ident.Description + "-->");
strs.AppendLine(";<!--" + ident.Description + "-->");
}
if (ident.IsList)
{
for (int i = 0; i < ident.Values.Count; i++)
{
strs.Add("Value" + i + "=" + ident.Values[i]);
strs.AppendLine("Value" + i + "=" + ident.Values[i]);
}
}
else
{
strs.Add(ident.Key + "=" + ident.Value);
strs.AppendLine(ident.Key + "=" + ident.Value);
}
}
strs.Add("");
strs.AppendLine("");
}
listidents.Clear();
DirEx.CreateDir(Path.GetDirectoryName(filename));
File.WriteAllLines(filename, strs.ToArray(), IniEncoding);
Dir.CreateDir(Path.GetDirectoryName(filename));
string filetmp = filename + "." + RandomEx.RandomPureChar(3);
File.Delete(filetmp);
StreamWriter sw = new StreamWriter(filetmp, false, IniEncoding);
sw.WriteLine(strs.ToString());
sw.Flush();
sw.Dispose();
try
{
File.Delete(filename);
File.Move(filetmp, filename);
}
catch (Exception ex)
{
MessageBox.Show("配置文件存储失败: " + filename + " ," + ex.Message);
}
}
}
/// <summary>
/// INI 配置文件类
/// </summary>
/// <typeparam name="T">类型</typeparam>
public class IniUTF8Config<T> : BaseConfig<T> where T : IniUTF8Config<T>, new()
{
[ConfigIgnore]
public object this[string property]
{
get
{
PropertyInfo info = Current.GetType().GetProperty(property);
if (info == null)
{
throw new ArgumentNullException("属性名称不存在:" + property);
}
return info.GetValue(this, null);
}
set
{
PropertyInfo info = Current.GetType().GetProperty(property);
if (info == null)
{
throw new ArgumentNullException("属性名称不存在:" + property);
}
try
{
Type propertyType = info.PropertyType;
info.SetValue(Current, Convert.ChangeType(value, propertyType), null);
}
catch (Exception)
{
throw new ArgumentException("属性值转换失败:" + property + ", " + value);
}
}
}
#endregion
/// <summary>加载指定配置文件</summary>
/// <param name="filename">文件名</param>
/// <returns>结果</returns>
public override bool Load(string filename)
{
if (filename.IsNullOrWhiteSpace())
{
filename = Dir.CurrentDir() + ConfigFile;
}
if (filename.IsNullOrWhiteSpace())
{
throw new ApplicationException($"未指定{typeof(T).Name}的配置文件路径!");
}
if (!File.Exists(filename))
{
return false;
}
try
{
ConcurrentDictionary<string, Ident> idents = ConfigHelper.InitIdents(current);
foreach (var ident in idents.Values)
{
if (ident.Section.IsNullOrEmpty())
{
ident.Section = "Setup";
}
}
IniFile ini = new IniFile(filename, Encoding.UTF8);
foreach (var ident in idents.Values)
{
if (ident.IsList)
{
ident.Values.Clear();
NameValueCollection list = ini.GetSectionValues(ident.Section + "-" + ident.Key);
foreach (var pair in list)
{
ident.Values.Add(ini.Read(ident.Section + "-" + ident.Key, pair.ToString(), ""));
}
}
else
{
ident.Value = ini.Read(ident.Section, ident.Key, "");
}
}
ConfigHelper.LoadConfigValue(current, idents);
return true;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return false;
}
}
/// <summary>保存到配置文件中去</summary>
/// <param name="filename">文件名</param>
public override void Save(string filename)
{
if (filename.IsNullOrWhiteSpace())
{
filename = Dir.CurrentDir() + ConfigFile;
}
if (filename.IsNullOrWhiteSpace())
{
throw new ApplicationException($"未指定{typeof(T).Name}的配置文件路径!");
}
ConcurrentDictionary<string, Ident> idents = ConfigHelper.InitIdents(current);
foreach (var ident in idents.Values)
{
if (ident.Section.IsNullOrEmpty())
{
ident.Section = "Setup";
}
}
ConfigHelper.SaveConfigValue(Current, idents);
StringBuilder strs = new StringBuilder();
strs.AppendLine(";<?Ini Version=\"" + UIGlobal.Version + "\" Encoding=\"" + Encoding.UTF8.BodyName + "\"?>");
strs.AppendLine(";<?Update Time=\"" + DateTime.Now.DateTimeString() + "\"?>");
strs.AppendLine("");
Dictionary<string, List<Ident>> listidents = new Dictionary<string, List<Ident>>();
foreach (var ident in idents.Values)
{
string section = ident.IsList ? ident.Section + "-" + ident.Key : ident.Section;
if (!listidents.ContainsKey(section))
{
listidents.Add(section, new List<Ident>());
}
listidents[section].Add(ident);
}
foreach (var values in listidents)
{
strs.AppendLine("[" + values.Key + "]");
SortedList<int, Ident> slist = new SortedList<int, Ident>();
foreach (var ident in values.Value)
{
slist.Add(ident.Index, ident);
}
foreach (var ident in slist.Values)
{
if (!ident.Description.IsNullOrEmpty())
{
strs.AppendLine(";<!--" + ident.Description + "-->");
}
if (ident.IsList)
{
for (int i = 0; i < ident.Values.Count; i++)
{
strs.AppendLine("Value" + i + "=" + ident.Values[i]);
}
}
else
{
strs.AppendLine(ident.Key + "=" + ident.Value);
}
}
strs.AppendLine("");
}
listidents.Clear();
Dir.CreateDir(Path.GetDirectoryName(filename));
string filetmp = filename + "." + RandomEx.RandomPureChar(3);
File.Delete(filetmp);
StreamWriter sw = new StreamWriter(filetmp, false, Encoding.UTF8);
sw.WriteLine(strs.ToString());
sw.Flush();
sw.Dispose();
try
{
File.Delete(filename);
File.Move(filetmp, filename);
}
catch (Exception ex)
{
MessageBox.Show("配置文件存储失败: " + filename + " ," + ex.Message);
}
}
}
}

View File

@ -1,6 +1,6 @@
/******************************************************************************
* SunnyUI
* CopyRight (C) 2012-2023 ShenYongHua().
* CopyRight (C) 2012-2025 ShenYongHua().
* QQ群56829229 QQ17612584 EMailSunnyUI@QQ.Com
*
* Blog: https://www.cnblogs.com/yhuse
@ -22,7 +22,6 @@
* 2023-08-11: v3.4.1
******************************************************************************/
using Sunny.UI.Win32;
using System;
using System.Collections.Specialized;
using System.ComponentModel;
@ -31,6 +30,7 @@ using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using Sunny.UI.Win32;
namespace Sunny.UI
{
@ -65,7 +65,7 @@ namespace Sunny.UI
FileName = fileName;
FileInfo fi = new FileInfo(FileName);
DirEx.CreateDir(fi.DirectoryName);
Dir.CreateDir(fi.DirectoryName);
if (!Directory.Exists(fi.DirectoryName))
{
@ -78,7 +78,7 @@ namespace Sunny.UI
//文件不存在,建立文件
using (StreamWriter sw = new StreamWriter(fileName, false, IniEncoding))
{
sw.WriteLine(";<?ini version=\"" + UIGlobal.Version + "\" encoding=\"" + IniEncoding.BodyName + "\"?>");
sw.WriteLine(";<?Ini Version=\"" + UIGlobal.Version + "\" Encoding=\"" + Encoding.UTF8.BodyName + "\"?>");
sw.WriteLine("");
}
}
@ -149,7 +149,7 @@ namespace Sunny.UI
/// <returns>结果</returns>
public string Read(string section, string key, string Default)
{
byte[] buffer = new byte[4096];
byte[] buffer = new byte[4096 * 16];
if (Default == null)
{
Default = "";
@ -299,57 +299,6 @@ namespace Sunny.UI
/// </summary>
public class IniFile : IniBase
{
/// <summary>
/// 写结构
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="value">value</param>
/// <typeparam name="T">T</typeparam>
public void WriteStruct<T>(string section, string key, T value) where T : struct
{
Write(section, key, value.ToBytes());
}
/// <summary>
/// 读结构
/// </summary>
/// <typeparam name="T">T</typeparam>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="Default">Normal</param>
/// <returns>结果</returns>
public T ReadStruct<T>(string section, string key, T Default) where T : struct
{
//得到结构体的大小
int size = Default.Size();
byte[] bytes = Read(section, key, "").ToHexBytes();
return size > bytes.Length ? Default : bytes.ToStruct<T>();
}
/// <summary>
/// 写Byte数组
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="value">value</param>
public void Write(string section, string key, byte[] value)
{
Write(section, key, value.ToHexString());
}
/// <summary>
/// 读Byte数组
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="Default">Normal</param>
/// <returns>结果</returns>
public byte[] ReadBytes(string section, string key, byte[] Default)
{
return Read(section, key, Default.ToHexString()).ToHexBytes();
}
/// <summary>
/// 写Char
/// </summary>

View File

@ -0,0 +1,790 @@
/******************************************************************************
* SunnyUI
* CopyRight (C) 2012-2023 ShenYongHua().
* QQ群56829229 QQ17612584 EMailSunnyUI@QQ.Com
*
* Blog: https://www.cnblogs.com/yhuse
* Gitee: https://gitee.com/yhuse/SunnyUI
* GitHub: https://github.com/yhuse/SunnyUI
*
* SunnyUI.dll can be used for free under the GPL-3.0 license.
* If you use this code, please keep this note.
* 使
******************************************************************************
* : UIniFileEx.cs
* : INI WinAPI
* : V3.1
* : 2021-10-27
*
* 2021-10-27: V2.2.0
******************************************************************************/
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
namespace Sunny.UI
{
public class IniFileEx
{
private readonly Dictionary<string, NameValueCollection> data = new Dictionary<string, NameValueCollection>();
private static readonly Regex regRemoveEmptyLines =
new Regex
(
@"(\s*;[\d\D]*?\r?\n)+|\r?\n(\s*\r?\n)*",
RegexOptions.Multiline | RegexOptions.Compiled
);
private static readonly Regex regParseIniData =
new Regex
(
@"
(?<IsSection>
^\s*\[(?<SectionName>[^\]]+)?\]\s*$
)
|
(?<IsKeyValue>
^\s*(?<Key>[^(\s*\=\s*)]+)?\s*\=\s*(?<Value>[\d\D]*)$
)",
RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace
);
public IniFileEx(string fileName) : this(fileName, Encoding.Default) { }
public IniFileEx(string fileName, Encoding encoding)
{
FileName = fileName;
Encoding = encoding;
using FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None);
ReadIniData(fs, encoding);
}
/// <summary>
/// 文件名
/// </summary>
[Description("文件名")]
public string FileName { get; set; } //INI文件名
public Encoding Encoding { get; set; }
private void ReadIniData(Stream stream, Encoding encoding)
{
string lastSection = string.Empty;
data.Add(lastSection, new NameValueCollection());
if (stream != null && encoding != null)
{
using StreamReader reader = new StreamReader(stream, encoding);
string iniData = reader.ReadToEnd();
iniData = regRemoveEmptyLines.Replace(iniData, "\n");
string[] lines = iniData.Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries);
foreach (string s in lines)
{
Match m = regParseIniData.Match(s);
if (m.Success)
{
if (m.Groups["IsSection"].Length > 0)
{
string sName = m.Groups["SectionName"].Value.ToLowerInvariant();
if (lastSection != sName)
{
lastSection = sName;
if (!data.ContainsKey(sName))
{
data.Add(sName, new NameValueCollection());
}
}
}
else if (m.Groups["IsKeyValue"].Length > 0)
{
data[lastSection].Add(m.Groups["Key"].Value, m.Groups["Value"].Value);
}
}
}
}
}
public NameValueCollection this[string section]
{
get
{
section = section.ToLowerInvariant();
if (!data.ContainsKey(section))
data.Add(section, new NameValueCollection());
return data[section];
}
}
public string this[string section, string key]
{
get => this[section][key];
set => this[section][key] = value;
}
public object this[string section, string key, Type t]
{
get
{
if (t == null || t == (Type)Type.Missing)
return this[section][key];
return GetValue(section, key, null, t);
}
set
{
if (t == null || t == (Type)Type.Missing)
this[section][key] = string.Empty;
else
SetValue(section, key, value);
}
}
public string[] KeyNames(string section)
{
return this[section].AllKeys;
}
public string[] SectionValues(string section)
{
return this[section].GetValues(0);
}
private object GetValue(string section, string key, object defaultValue, Type t)
{
section = section.ToLowerInvariant();
key = key.ToLowerInvariant();
if (!data.ContainsKey(section)) return defaultValue;
string v = data[section][key];
if (string.IsNullOrEmpty(v)) return defaultValue;
TypeConverter conv = TypeDescriptor.GetConverter(t);
if (!conv.CanConvertFrom(typeof(string))) return defaultValue;
try
{
return conv.ConvertFrom(v);
}
catch
{
return defaultValue;
}
}
private T GetValue<T>(string section, string key, T defaultValue)
{
return (T)GetValue(section, key, defaultValue, typeof(T));
}
private void SetValue(string section, string key, object value)
{
if (value == null)
{
this[section][key] = string.Empty;
}
else
{
TypeConverter conv = TypeDescriptor.GetConverter(value);
if (!conv.CanConvertTo(typeof(string)))
{
this[section][key] = value.ToString();
}
else
{
this[section][key] = (string)conv.ConvertTo(value, typeof(string));
}
}
UpdateFile();
}
public void Write(string section, string key, string value)
{
SetValue(section, key, value);
}
public string Read(string section, string key, string Default)
{
return GetValue(section, key, Default);
}
/// <summary>
/// 读取指定的Section的所有Value到列表中
/// </summary>
/// <param name="section">section</param>
public NameValueCollection GetSectionValues(string section)
{
return this[section];
}
public void UpdateFile()
{
Save();
}
public void Save()
{
Save(FileName, Encoding);
}
public void Save(string fileName, Encoding encoding)
{
using FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None);
Save(fs, encoding);
}
private void Save(Stream stream, Encoding encoding)
{
using StreamWriter sw = new StreamWriter(stream, encoding);
foreach (var cur in data)
{
if (!string.IsNullOrEmpty(cur.Key))
{
sw.WriteLine("[{0}]", cur.Key);
}
NameValueCollection col = cur.Value;
foreach (string key in col.Keys)
{
if (!string.IsNullOrEmpty(key))
{
string value = col[key];
if (!string.IsNullOrEmpty(value))
sw.WriteLine("{0}={1}", key, value);
}
}
}
sw.Flush();
}
public bool HasSection(string section)
{
return data.ContainsKey(section.ToLowerInvariant());
}
public bool HasKey(string section, string key)
{
return
data.ContainsKey(section) &&
!string.IsNullOrEmpty(data[section][key]);
}
/// <summary>
/// 写结构
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="value">value</param>
/// <typeparam name="T">T</typeparam>
public void WriteStruct<T>(string section, string key, T value) where T : struct
{
Write(section, key, value.ToBytes());
}
/// <summary>
/// 读结构
/// </summary>
/// <typeparam name="T">T</typeparam>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="Default">Normal</param>
/// <returns>结果</returns>
public T ReadStruct<T>(string section, string key, T Default) where T : struct
{
//得到结构体的大小
int size = StructEx.Size(Default);
byte[] bytes = Read(section, key, "").ToHexBytes();
return size > bytes.Length ? Default : bytes.ToStruct<T>();
}
/// <summary>
/// 写Byte数组
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="value">value</param>
public void Write(string section, string key, byte[] value)
{
Write(section, key, value.ToHexString());
}
/// <summary>
/// 读Byte数组
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="Default">Normal</param>
/// <returns>结果</returns>
public byte[] ReadBytes(string section, string key, byte[] Default)
{
return Read(section, key, Default.ToHexString()).ToHexBytes();
}
/// <summary>
/// 写Char
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="value">value</param>
public void Write(string section, string key, char value)
{
Write(section, key, value.ToString());
}
/// <summary>
/// 读Char
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="Default">Normal</param>
/// <returns>结果</returns>
public char ReadChar(string section, string key, char Default = ' ')
{
return Read(section, key, Default.ToString()).ToChar(Default);
}
/// <summary>
/// 写Decimal
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="value">value</param>
public void Write(string section, string key, decimal value)
{
Write(section, key, value.ToString(CultureInfo.InvariantCulture));
}
/// <summary>
/// 读Decimal
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="Default">Normal</param>
/// <returns>结果</returns>
public decimal ReadDecimal(string section, string key, decimal Default = 0)
{
return Read(section, key, Default.ToString(CultureInfo.InvariantCulture)).ToDecimal(Default);
}
/// <summary>
/// 写整数
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="value">value</param>
public void Write(string section, string key, short value)
{
Write(section, key, value.ToString());
}
/// <summary>
/// 读整数
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="Default">Normal</param>
/// <returns>结果</returns>
public short ReadShort(string section, string key, short Default = 0)
{
return Read(section, key, Default.ToString()).ToShort(Default);
}
/// <summary>
/// 写整数
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="value">value</param>
public void Write(string section, string key, ushort value)
{
Write(section, key, value.ToString());
}
/// <summary>
/// 读整数
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="Default">Normal</param>
/// <returns>结果</returns>
public ushort ReadUShort(string section, string key, ushort Default = 0)
{
return Read(section, key, Default.ToString()).ToUShort(Default);
}
/// <summary>
/// 写整数
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="value">value</param>
public void Write(string section, string key, int value)
{
Write(section, key, value.ToString());
}
/// <summary>
/// 读整数
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="Default">Normal</param>
/// <returns>结果</returns>
public int ReadInt(string section, string key, int Default = 0)
{
return Read(section, key, Default.ToString()).ToInt(Default);
}
/// <summary>
/// 写整数
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="value">value</param>
public void Write(string section, string key, uint value)
{
Write(section, key, value.ToString());
}
/// <summary>
/// 读整数
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="Default">Normal</param>
/// <returns>结果</returns>
public uint ReadUInt(string section, string key, uint Default = 0)
{
return Read(section, key, Default.ToString()).ToUInt(Default);
}
/// <summary>
/// 写整数
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="value">value</param>
public void Write(string section, string key, ulong value)
{
Write(section, key, value.ToString());
}
/// <summary>
/// 读整数
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="Default">Normal</param>
/// <returns>结果</returns>
public ulong ReadULong(string section, string key, ulong Default = 0)
{
return Read(section, key, Default.ToString()).ToULong(Default);
}
/// <summary>
/// 写整数
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="value">value</param>
public void Write(string section, string key, long value)
{
Write(section, key, value.ToString());
}
/// <summary>
/// 读整数
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="Default">Normal</param>
/// <returns>结果</returns>
public long ReadLong(string section, string key, long Default = 0)
{
return Read(section, key, Default.ToString()).ToLong(Default);
}
/// <summary>
/// 写布尔
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="value">value</param>
public void Write(string section, string key, bool value)
{
Write(section, key, value ? bool.TrueString : bool.FalseString);
}
/// <summary>
/// 读布尔
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="Default">Normal</param>
/// <returns>结果</returns>
public bool ReadBool(string section, string key, bool Default = false)
{
string str = Read(section, key, Default.ToString());
if (string.Equals(str, bool.TrueString, StringComparison.CurrentCultureIgnoreCase))
{
return true;
}
if (string.Equals(str, bool.FalseString, StringComparison.CurrentCultureIgnoreCase))
{
return false;
}
return Default;
}
/// <summary>
/// 写Double
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="value">value</param>
public void Write(string section, string key, double value)
{
Write(section, key, value.ToString(CultureInfo.InvariantCulture));
}
/// <summary>
/// 读Double
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="Default">Normal</param>
/// <returns>结果</returns>
public double ReadDouble(string section, string key, double Default = 0)
{
return Read(section, key, Default.ToString(CultureInfo.InvariantCulture)).ToDouble(Default);
}
/// <summary>
/// 写Float
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="value">value</param>
public void Write(string section, string key, float value)
{
Write(section, key, value.ToString(CultureInfo.InvariantCulture));
}
/// <summary>
/// 读Float
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="Default">Normal</param>
/// <returns>结果</returns>
public float ReadFloat(string section, string key, float Default = 0)
{
return Read(section, key, Default.ToString(CultureInfo.InvariantCulture)).ToFloat(Default);
}
/// <summary>
/// 写Byte
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="value">value</param>
public void Write(string section, string key, byte value)
{
Write(section, key, value.ToString());
}
/// <summary>
/// 读Byte
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="Default">Normal</param>
/// <returns>结果</returns>
public byte ReadByte(string section, string key, byte Default = 0)
{
return Read(section, key, Default.ToString()).ToByte(Default);
}
/// <summary>
/// 写SByte
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="value">value</param>
public void Write(string section, string key, sbyte value)
{
Write(section, key, value.ToString());
}
/// <summary>
/// 读Byte
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="Default">Normal</param>
/// <returns>结果</returns>
public sbyte ReadSByte(string section, string key, sbyte Default = 0)
{
return Read(section, key, Default.ToString()).ToSByte(Default);
}
/// <summary>
/// 写DateTime
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="value">value</param>
public void Write(string section, string key, DateTime value)
{
Write(section, key, value.ToString(DateTimeEx.DateTimeFormat));
}
/// <summary>
/// 读DateTime
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="Default">Normal</param>
/// <returns>结果</returns>
public DateTime ReadDateTime(string section, string key, DateTime Default)
{
string str = Read(section, key, Default.ToString(CultureInfo.InvariantCulture));
try
{
return str.ToDateTime(DateTimeEx.DateTimeFormat);
}
catch (Exception)
{
return Default;
}
}
/// <summary>
/// 写Point
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="value">value</param>
public void Write(string section, string key, Point value)
{
Write(section, key, ConvertEx.ObjectToString(value, typeof(Point)));
}
/// <summary>
/// 读Point
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="Default">Normal</param>
/// <returns>结果</returns>
public Point ReadPoint(string section, string key, Point Default)
{
string str = Read(section, key, "");
return (Point)ConvertEx.StringToObject(str, typeof(Point), Default);
}
/// <summary>
/// 写PointF
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="value">value</param>
public void Write(string section, string key, PointF value)
{
Write(section, key, ConvertEx.ObjectToString(value, typeof(PointF)));
}
/// <summary>
/// 读PointF
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="Default">Normal</param>
/// <returns>结果</returns>
public PointF ReadPointF(string section, string key, PointF Default)
{
string str = Read(section, key, "");
return (PointF)ConvertEx.StringToObject(str, typeof(PointF), Default);
}
/// <summary>
/// 写Size
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="value">value</param>
public void Write(string section, string key, Size value)
{
Write(section, key, ConvertEx.ObjectToString(value, typeof(Size)));
}
/// <summary>
/// 读Size
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="Default">Normal</param>
/// <returns>结果</returns>
public Size ReadSize(string section, string key, Size Default)
{
string str = Read(section, key, "");
return (Size)ConvertEx.StringToObject(str, typeof(Size), Default);
}
/// <summary>
/// 写SizeF
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="value">value</param>
public void Write(string section, string key, SizeF value)
{
Write(section, key, ConvertEx.ObjectToString(value, typeof(SizeF)));
}
/// <summary>
/// 读SizeF
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="Default">Normal</param>
/// <returns>结果</returns>
public SizeF ReadSizeF(string section, string key, SizeF Default)
{
string str = Read(section, key, "");
return (SizeF)ConvertEx.StringToObject(str, typeof(SizeF), Default);
}
/// <summary>
/// 写Color
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="value">value</param>
public void Write(string section, string key, Color value)
{
Write(section, key, ConvertEx.ObjectToString(value, typeof(Color)));
}
/// <summary>
/// 读Color
/// </summary>
/// <param name="section">section</param>
/// <param name="key">key</param>
/// <param name="Default">Normal</param>
/// <returns>结果</returns>
public Color ReadColor(string section, string key, Color Default)
{
string str = Read(section, key, "");
return (Color)ConvertEx.StringToObject(str, typeof(Color), Default);
}
}
}

View File

@ -1,6 +1,6 @@
/******************************************************************************
* SunnyUI
* CopyRight (C) 2012-2023 ShenYongHua().
* CopyRight (C) 2012-2025 ShenYongHua().
* QQ群56829229 QQ17612584 EMailSunnyUI@QQ.Com
*
* Blog: https://www.cnblogs.com/yhuse
@ -97,8 +97,10 @@ namespace Sunny.UI
string jsonStr = Serialize(obj);
try
{
DirEx.CreateDir(Path.GetDirectoryName(filename));
File.WriteAllText(filename, jsonStr, encoding);
StreamWriter streamWriter = new StreamWriter(filename, false, encoding);
streamWriter.Write(jsonStr);
streamWriter.Flush();
streamWriter.Close();
}
catch (Exception e)
{

View File

@ -1,345 +0,0 @@
/******************************************************************************
* SunnyUI
* CopyRight (C) 2012-2023 ShenYongHua().
* QQ群56829229 QQ17612584 EMailSunnyUI@QQ.Com
*
* Blog: https://www.cnblogs.com/yhuse
* Gitee: https://gitee.com/yhuse/SunnyUI
* GitHub: https://github.com/yhuse/SunnyUI
*
* SunnyUI.Common.dll can be used for free under the MIT license.
* If you use this code, please keep this note.
* 使
******************************************************************************
* : UIFormHelper.cs
* :
* : V3.1
* : 2020-01-01
*
* 2020-04-19: V2.2.0
* 2021-07-24: V3.0.5
******************************************************************************/
namespace Sunny.UI
{
/// <summary>
/// 多语言字符串定义
/// </summary>
public static class UILocalize
{
/// <summary>
/// 提示
/// </summary>
public static string InfoTitle = "提示";
/// <summary>
/// 正确
/// </summary>
public static string SuccessTitle = "正确";
/// <summary>
/// 警告
/// </summary>
public static string WarningTitle = "警告";
/// <summary>
/// 错误
/// </summary>
public static string ErrorTitle = "错误";
/// <summary>
/// 提示
/// </summary>
public static string AskTitle = "提示";
/// <summary>
/// 输入
/// </summary>
public static string InputTitle = "输入";
/// <summary>
/// 选择
/// </summary>
public static string SelectTitle = "选择";
/// <summary>
/// 全部关闭
/// </summary>
public static string CloseAll = "全部关闭";
/// <summary>
/// 确定
/// </summary>
public static string OK = "确定";
/// <summary>
/// 取消
/// </summary>
public static string Cancel = "取消";
/// <summary>
/// [ 无数据 ]
/// </summary>
public static string GridNoData = "[ 无数据 ]";
/// <summary>
/// 数据加载中,请稍候...
/// </summary>
public static string GridDataLoading = "数据加载中,请稍候...";
/// <summary>
/// 数据源必须为DataTable或者List
/// </summary>
public static string GridDataSourceException = "数据源必须为DataTable或者List";
/// <summary>
/// "系统正在处理中,请稍候..."
/// </summary>
public static string SystemProcessing = "系统正在处理中,请稍候...";
/// <summary>
/// 星期一
/// </summary>
public static string Monday = "一";
/// <summary>
/// 星期二
/// </summary>
public static string Tuesday = "二";
/// <summary>
/// 星期三
/// </summary>
public static string Wednesday = "三";
/// <summary>
/// 星期四
/// </summary>
public static string Thursday = "四";
/// <summary>
/// 星期五
/// </summary>
public static string Friday = "五";
/// <summary>
/// 星期六
/// </summary>
public static string Saturday = "六";
/// <summary>
/// 星期日
/// </summary>
public static string Sunday = "日";
/// <summary>
/// 上一页
/// </summary>
public static string Prev = "上一页";
/// <summary>
/// 下一页
/// </summary>
public static string Next = "下一页";
/// <summary>
/// 第
/// </summary>
public static string SelectPageLeft = "第";
/// <summary>
/// 页
/// </summary>
public static string SelectPageRight = "页";
/// <summary>
/// 一月
/// </summary>
public static string January = "一月";
/// <summary>
/// 二月
/// </summary>
public static string February = "二月";
/// <summary>
/// 三月
/// </summary>
public static string March = "三月";
/// <summary>
/// 四月
/// </summary>
public static string April = "四月";
/// <summary>
/// 五月
/// </summary>
public static string May = "五月";
/// <summary>
/// 六月
/// </summary>
public static string June = "六月";
/// <summary>
/// 七月
/// </summary>
public static string July = "七月";
/// <summary>
/// 八月
/// </summary>
public static string August = "八月";
/// <summary>
/// 九月
/// </summary>
public static string September = "九月";
/// <summary>
/// 十月
/// </summary>
public static string October = "十月";
/// <summary>
/// 十一月
/// </summary>
public static string November = "十一月";
/// <summary>
/// 十二月
/// </summary>
public static string December = "十二月";
/// <summary>
/// 今天
/// </summary>
public static string Today = "今天";
/// <summary>
/// 搜索
/// </summary>
public static string Search = "搜索";
/// <summary>
/// 清除
/// </summary>
public static string Clear = "清除";
}
/// <summary>
/// 多语言字符串帮助类
/// </summary>
public static class UILocalizeHelper
{
/// <summary>
/// 设置为英文
/// </summary>
public static void SetEN()
{
UILocalize.InfoTitle = "Info";
UILocalize.SuccessTitle = "Success";
UILocalize.WarningTitle = "Warning";
UILocalize.ErrorTitle = "Error";
UILocalize.AskTitle = "Query";
UILocalize.InputTitle = "Input";
UILocalize.SelectTitle = "Select";
UILocalize.CloseAll = "Close all";
UILocalize.OK = "OK";
UILocalize.Cancel = "Cancel";
UILocalize.GridNoData = "[ No data ]";
UILocalize.GridDataLoading = "Data loading, please wait...";
UILocalize.GridDataSourceException = "The data source must be DataTable or List";
UILocalize.SystemProcessing = "The system is processing, please wait...";
UILocalize.Monday = "Mon.";
UILocalize.Tuesday = "Tue.";
UILocalize.Wednesday = "Wed.";
UILocalize.Thursday = "Thur.";
UILocalize.Friday = "Fri.";
UILocalize.Saturday = "Sat.";
UILocalize.Sunday = "Sun.";
UILocalize.Prev = "Previous";
UILocalize.Next = "Next";
UILocalize.SelectPageLeft = "Page";
UILocalize.SelectPageRight = "";
UILocalize.January = "Jan.";
UILocalize.February = "Feb.";
UILocalize.March = "Mar.";
UILocalize.April = "Apr.";
UILocalize.May = "May";
UILocalize.June = "Jun.";
UILocalize.July = "Jul.";
UILocalize.August = "Aug.";
UILocalize.September = "Sep.";
UILocalize.October = "Oct.";
UILocalize.November = "Nov.";
UILocalize.December = "Dec.";
UILocalize.Today = "Today";
UILocalize.Search = "Search";
UILocalize.Clear = "Clear";
UIStyles.Translate();
}
/// <summary>
/// 设置为中文
/// </summary>
public static void SetCH()
{
UILocalize.InfoTitle = "提示";
UILocalize.SuccessTitle = "正确";
UILocalize.WarningTitle = "警告";
UILocalize.ErrorTitle = "错误";
UILocalize.AskTitle = "提示";
UILocalize.InputTitle = "输入";
UILocalize.SelectTitle = "选择";
UILocalize.CloseAll = "全部关闭";
UILocalize.OK = "确定";
UILocalize.Cancel = "取消";
UILocalize.GridNoData = "[ 无数据 ]";
UILocalize.GridDataLoading = "数据加载中,请稍候...";
UILocalize.GridDataSourceException = "数据源必须为DataTable或者List";
UILocalize.SystemProcessing = "系统正在处理中,请稍候...";
UILocalize.Monday = "一";
UILocalize.Tuesday = "二";
UILocalize.Wednesday = "三";
UILocalize.Thursday = "四";
UILocalize.Friday = "五";
UILocalize.Saturday = "六";
UILocalize.Sunday = "日";
UILocalize.Prev = "上一页";
UILocalize.Next = "下一页";
UILocalize.SelectPageLeft = "第";
UILocalize.SelectPageRight = "页";
UILocalize.January = "一月";
UILocalize.February = "二月";
UILocalize.March = "三月";
UILocalize.April = "四月";
UILocalize.May = "五月";
UILocalize.June = "六月";
UILocalize.July = "七月";
UILocalize.August = "八月";
UILocalize.September = "九月";
UILocalize.October = "十月";
UILocalize.November = "十一月";
UILocalize.December = "十二月";
UILocalize.Today = "今天";
UILocalize.Search = "搜索";
UILocalize.Clear = "清除";
UIStyles.Translate();
}
}
}

View File

@ -1,6 +1,6 @@
/******************************************************************************
* SunnyUI
* CopyRight (C) 2012-2023 ShenYongHua().
* CopyRight (C) 2012-2025 ShenYongHua().
* QQ群56829229 QQ17612584 EMailSunnyUI@QQ.Com
*
* Blog: https://www.cnblogs.com/yhuse
@ -194,29 +194,11 @@ namespace Sunny.UI
public string Value { get; set; }
}
/// <summary>
/// 析构函数
/// </summary>
public void Dispose()
protected override void FinalStop()
{
Stop();
try
{
var mmf = MemoryMappedFile.OpenExisting(MapName);
mmf.Dispose();
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
/// <summary>
/// 析构函数
/// </summary>
~MMFile()
{
Dispose();
var mmf = MemoryMappedFile.OpenExisting(MapName);
mmf.Dispose();
base.FinalStop();
}
}

203
SunnyUI/Common/UMapper.cs Normal file
View File

@ -0,0 +1,203 @@
/******************************************************************************
* SunnyUI
* CopyRight (C) 2012-2023 ShenYongHua().
* QQ群56829229 QQ17612584 EMailSunnyUI@QQ.Com
*
* Blog: https://www.cnblogs.com/yhuse
* Gitee: https://gitee.com/yhuse/SunnyUI
* GitHub: https://github.com/yhuse/SunnyUI
*
* SunnyUI.dll can be used for free under the GPL-3.0 license.
* If you use this code, please keep this note.
* 使
******************************************************************************
* : UMapper.cs
* : StructList和数组
* : V3.1
* : 2021-09-30
*
* 2021-09-30: V3.0.7
******************************************************************************/
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
namespace Sunny.UI
{
/// <summary>
/// 轻量级的对象映射框架
/// </summary>
public static class Mapper
{
private static void Execute<T1, T2>(T1 source, T2 dest)
where T1 : class, new()
where T2 : class, new()
{
if (source == null || dest == null)
{
return;
}
var listSource = source.GetType().GetNeedProperties().ToDictionary(prop => prop.Name);
var listDest = dest.GetType().GetNeedProperties().ToDictionary(prop => prop.Name);
foreach (var item in listDest)
{
if (listSource.NotContainsKey(item.Key)) continue;
var sourceInfo = listSource[item.Key];
Type sourceType = sourceInfo.PropertyType;
object sourceValue = sourceInfo.GetValue(source, null);
var destInfo = item.Value;
Type destType = item.Value.PropertyType;
if (!sourceType.Equals(destType)) continue;
if (sourceType.IsValueType)
{
//Console.WriteLine("ValueType: " + item.Key + ", " + sourceType.FullName);
destInfo.SetValue(dest, sourceValue, null);
}
else
{
if (sourceType == typeof(string))
{
//Console.WriteLine("String: " + item.Key + ", " + sourceType.FullName);
destInfo.SetValue(dest, sourceValue, null);
continue;
}
if (sourceType.IsList())
{
//Console.WriteLine("List: " + item.Key + ", " + sourceType.FullName);
Type[] sourceTypes = sourceType.GetGenericArguments();
Type[] destTypes = destType.GetGenericArguments();
if (sourceTypes.Length != 1) continue;
if (destTypes.Length != 1) continue;
if (!sourceTypes[0].Equals(destTypes[0])) continue;
if (sourceValue == null)
{
destInfo.SetValue(dest, null, null);
}
else
{
Type typeDataList = typeof(List<>).MakeGenericType(destTypes[0]);
MethodInfo AddInfo = typeDataList.GetMethod("Add", BindingFlags.Public | BindingFlags.Instance);
if (AddInfo == null) continue;
if (sourceTypes[0].IsValueType || sourceTypes[0] == typeof(string))
{
object listvalue = typeDataList.InvokeMember(null, BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.CreateInstance, null, null, new object[] { });
IEnumerable sourceList = sourceValue as IEnumerable;
foreach (var listItem in sourceList)
{
AddInfo.Invoke(listvalue, new[] { listItem });
}
destInfo.SetValue(dest, listvalue, null);
}
else
{
//暂时不考虑
}
}
continue;
}
if (sourceType.IsArray)
{
//Console.WriteLine("Array: " + item.Key + ", " + sourceType.FullName);
if (sourceValue == null)
{
destInfo.SetValue(dest, null, null);
}
else
{
ICollection sourceList = sourceValue as ICollection;
Type type = sourceType.GetElementType();
var array = Array.CreateInstance(type, sourceList.Count);
int index = 0;
foreach (var listItem in sourceList)
{
array.SetValue(listItem, index++);
}
destInfo.SetValue(dest, array, null);
}
continue;
}
if (sourceType.IsDictionary())
{
continue;
}
//类没有无参构造函数的话,创建有问题
//if (sourceType.IsClass)
//{
// if (sourceValue == null)
// {
// destInfo.SetValue(dest, null, null);
// }
// else
// {
// object obj = Activator.CreateInstance(sourceType, null);
// obj.MapperFrom(sourceValue);
// destInfo.SetValue(dest, obj, null);
// }
//
// continue;
//}
}
}
}
/// <summary>
/// T1映射到T2
/// </summary>
/// <typeparam name="T1">T1</typeparam>
/// <typeparam name="T2">T2</typeparam>
/// <param name="source">源</param>
/// <param name="dest">目标</param>
public static void MapperTo<T1, T2>(this T1 source, T2 dest)
where T1 : class, new()
where T2 : class, new()
{
Execute(source, dest);
}
/// <summary>
/// T1从T2映射
/// </summary>
/// <typeparam name="T1">T1</typeparam>
/// <typeparam name="T2">T2</typeparam>
/// <param name="source">源</param>
/// <param name="dest">目标</param>
public static void MapperFrom<T1, T2>(this T1 dest, T2 source)
where T1 : class, new()
where T2 : class, new()
{
Execute(source, dest);
}
/// <summary>
/// 获取数组的类类型
/// </summary>
/// <param name="t">类型</param>
/// <returns>类类型</returns>
public static Type GetArrayElementType(this Type t)
{
if (!t.IsArray) return null;
string name = t.FullName.Replace("[]", string.Empty);
return t.Assembly.GetType(name);
}
}
}

View File

@ -1,6 +1,6 @@
/******************************************************************************
* SunnyUI
* CopyRight (C) 2012-2023 ShenYongHua().
* CopyRight (C) 2012-2025 ShenYongHua().
* QQ群56829229 QQ17612584 EMailSunnyUI@QQ.Com
*
* Blog: https://www.cnblogs.com/yhuse
@ -332,6 +332,8 @@ namespace Sunny.UI
textBounds.X += style.IconSpacing;
}
DefStringFormat.Alignment = StringAlignment.Near;
DefStringFormat.LineAlignment = StringAlignment.Near;
textBounds.Size = Size.Truncate(GraphicsUtils.MeasureString(text, tmpFont, 0, DefStringFormat));
size.Width += textBounds.Width;
@ -386,6 +388,8 @@ namespace Sunny.UI
{
textBrush = new SolidBrush(style.TextColor);
//DEBUG: g.DrawRectangle(new Border(Color.Red){ Width=1, Direction= Direction.Inner}.Pen, textBounds);
DefStringFormat.Alignment = StringAlignment.Near;
DefStringFormat.LineAlignment = StringAlignment.Near;
g.DrawString(text, tmpFont, textBrush, textBounds.Location, DefStringFormat);
}
@ -1501,10 +1505,6 @@ namespace Sunny.UI
[DllImport("user32.dll", SetLastError = true)]
private static extern bool DestroyWindow(IntPtr hWnd);
// ReSharper disable NotAccessedField.Local
// ReSharper disable FieldCanBeMadeReadOnly.Local
// ReSharper disable MemberCanBePrivate.Local
// ReSharper disable UnusedField.Compiler
#pragma warning disable 414
#pragma warning disable 649
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
@ -1559,10 +1559,6 @@ namespace Sunny.UI
}
}
// ReSharper restore UnusedField.Compiler
// ReSharper restore MemberCanBePrivate.Local
// ReSharper restore FieldCanBeMadeReadOnly.Local
// ReSharper restore NotAccessedField.Local
#pragma warning restore 649
#pragma warning restore 414
#endregion

View File

@ -1,6 +1,6 @@
/******************************************************************************
* SunnyUI
* CopyRight (C) 2012-2023 ShenYongHua().
* CopyRight (C) 2012-2025 ShenYongHua().
* QQ群56829229 QQ17612584 EMailSunnyUI@QQ.Com
*
* Blog: https://www.cnblogs.com/yhuse

View File

@ -1,6 +1,6 @@
/******************************************************************************
* SunnyUI
* CopyRight (C) 2012-2023 ShenYongHua().
* CopyRight (C) 2012-2025 ShenYongHua().
* QQ群56829229 QQ17612584 EMailSunnyUI@QQ.Com
*
* Blog: https://www.cnblogs.com/yhuse

View File

@ -1,6 +1,6 @@
/******************************************************************************
* SunnyUI
* CopyRight (C) 2012-2023 ShenYongHua().
* CopyRight (C) 2012-2025 ShenYongHua().
* QQ群56829229 QQ17612584 EMailSunnyUI@QQ.Com
*
* Blog: https://www.cnblogs.com/yhuse

View File

@ -1,6 +1,6 @@
/******************************************************************************
* SunnyUI
* CopyRight (C) 2012-2023 ShenYongHua().
* CopyRight (C) 2012-2025 ShenYongHua().
* QQ群56829229 QQ17612584 EMailSunnyUI@QQ.Com
*
* Blog: https://www.cnblogs.com/yhuse
@ -19,11 +19,8 @@
* 2020-01-01: V2.2.0
******************************************************************************/
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Text;
namespace Sunny.UI
{
@ -172,7 +169,7 @@ namespace Sunny.UI
{
Process process = new Process();
process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; //隐藏压缩窗口
process.StartInfo.FileName = DirEx.CurrentDir() + "7z.exe";
process.StartInfo.FileName = Dir.CurrentDir() + "7z.exe";
process.StartInfo.CreateNoWindow = false;
process.StartInfo.Arguments = arguments;
process.Start();
@ -189,67 +186,5 @@ namespace Sunny.UI
return true;
}
/// <summary>
/// 压缩数组
/// </summary>
/// <param name="input">数组</param>
/// <returns>结果</returns>
public static byte[] Compress(byte[] input)
{
string filename = FileEx.TempFileName();
string filename7z = FileEx.TempFileName();
File.WriteAllBytes(filename, input);
ZipFile(filename, filename7z);
byte[] bts = File.ReadAllBytes(filename7z);
FileEx.TryDelete(filename);
FileEx.TryDelete(filename7z);
return bts;
}
/// <summary>
/// 解压缩数组
/// </summary>
/// <param name="input">数组</param>
/// <returns>结果</returns>
public static byte[] Decompress(byte[] input)
{
string zipfile = FileEx.TempFileName();
File.WriteAllBytes(zipfile, input);
string unzipDir = DirEx.TempRandomPath();
UnZipFile(zipfile, unzipDir);
string[] fall = Directory.GetFiles(unzipDir, "*.*", SearchOption.TopDirectoryOnly);
string unzipfile = fall[0];
byte[] bts = File.ReadAllBytes(unzipfile);
FileEx.TryDelete(unzipfile);
FileEx.TryDelete(zipfile);
DirEx.TryDelete(unzipDir);
return bts;
}
/// <summary>
/// 压缩字符串
/// </summary>
/// <param name="input">字符串</param>
/// <returns>结果</returns>
public static string Compress(string input)
{
byte[] inputBytes = Encoding.Default.GetBytes(input);
byte[] result = Compress(inputBytes);
return Convert.ToBase64String(result);
}
/// <summary>
/// 解压缩字符串
/// </summary>
/// <param name="input">字符串</param>
/// <returns>结果</returns>
public static string Decompress(string input)
{
byte[] inputBytes = Convert.FromBase64String(input);
byte[] depressBytes = Decompress(inputBytes);
return Encoding.Default.GetString(depressBytes);
}
}
}

Some files were not shown because too many files have changed in this diff Show More