Compare commits

...

234 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
487 changed files with 24562 additions and 13384 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;
//不自动生成列
@ -74,7 +74,7 @@ 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值

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,7 +97,7 @@ 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], "字体图标", 99999);
@ -94,17 +105,17 @@ namespace Sunny.UI.Demo
node = uiNavBar1.CreateChildNode(uiNavBar1.Nodes[4], "多彩主题", UIStyle.Colorful.Value());
uiNavBar1.SetNodeSymbol(node, 558295);
//左侧导航主节点关联页面
uiNavMenu1.CreateNode(AddPage(new FSymbols()));
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);
//根据页面类型获取页面
@ -166,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");
}
}
@ -184,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("用户名或者密码错误。");
}
}
}

View File

@ -45,7 +45,7 @@ namespace Sunny.UI.Demo
{
uiTextBox2.IntValue = symbol.Value;
uiSymbolLabel1.Symbol = symbol.Value;
ShowInfoTip(symbol.ToString());
this.ShowInfoTip(symbol.ToString());
}
private void uiSymbolButton1_Click(object sender, System.EventArgs e)

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.3.0, Culture=neutral, PublicKeyToken=27d7d2e821d97aeb, processorArchitecture=MSIL">
<HintPath>..\packages\SunnyUI.3.6.3\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.6.3.0, Culture=neutral, PublicKeyToken=5a271fb7ba597231, processorArchitecture=MSIL">
<HintPath>..\packages\SunnyUI.Common.3.6.3\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" />
@ -394,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>
@ -750,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.3" targetFramework="net472" />
<package id="SunnyUI.Common" version="3.6.3" 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

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

@ -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,864 +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;
#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);
}

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);
}
}
}

View File

@ -1,189 +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.
* 使
******************************************************************************
* : USuspendCtrlAltDel.cs
* : winlogon线程来屏蔽Ctrl+Alt+Delete
* : V3.1
* : 2020-01-01
*
* 2020-09-17: V2.2.7
******************************************************************************/
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace Sunny.UI
{
/// <summary>
/// 通过挂起winlogon.exe线程来屏蔽Ctrl+Alt+Delete
/// 程序需要管理员权限
/// 需要提升进程权限为SE_PRIVILEGE_ENABLED权限
/// winlogon管理着开关机登录界面等功能
/// 调用Suspend挂起winlogon.exe用完后需要Resume否则无法调用关机界面
/// </summary>
public static class SuspendCtrlAltDelete
{
/// <summary>
/// 获取权限
/// </summary>
public static void GetSeDebugPrivilege()
{
IntPtr hToken;
LUID luidSEDebugNameValue = new LUID();
if (!OpenProcessToken(Process.GetCurrentProcess().Handle, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, out hToken))
{
Console.WriteLine("OpenProcessToken() failed, error = {0} . SeDebugPrivilege is not available", Marshal.GetLastWin32Error());
return;
}
else
{
Console.WriteLine("OpenProcessToken() successfully");
}
if (!LookupPrivilegeValue(null, SE_DEBUG_NAME, ref luidSEDebugNameValue))
{
Console.WriteLine("LookupPrivilegeValue() failed, error = {0} .SeDebugPrivilege is not available", Marshal.GetLastWin32Error());
CloseHandle(hToken);
return;
}
else
{
Console.WriteLine("LookupPrivilegeValue() successfully");
}
TOKEN_PRIVILEGES tkpPrivileges = new TOKEN_PRIVILEGES();
tkpPrivileges.PrivilegeCount = 1;
tkpPrivileges.Privilege.Luid = luidSEDebugNameValue;
tkpPrivileges.Privilege.Attributes = SE_PRIVILEGE_ENABLED;
if (!AdjustTokenPrivileges(hToken, false, ref tkpPrivileges, 0, IntPtr.Zero, 0))
{
Console.WriteLine("LookupPrivilegeValue() failed, error = {0} .SeDebugPrivilege is not available", Marshal.GetLastWin32Error());
}
else
{
Console.WriteLine("SeDebugPrivilege is now available");
}
CloseHandle(hToken);
}
/// <summary>
/// 挂起
/// </summary>
public static void Suspend()
{
Process[] processes = Process.GetProcesses();
foreach (Process process in processes)
{
if (process.ProcessName == "winlogon")
{
IntPtr p = OpenThread(PROCESS_ALL_ACCESS, false, (IntPtr)process.Threads[0].Id);
SuspendThread(p);
CloseHandle(p);
}
}
}
/// <summary>
/// 恢复
/// </summary>
public static void Resume()
{
Process[] processes = Process.GetProcesses();
foreach (Process process in processes)
{
if (process.ProcessName == "winlogon")
{
IntPtr p = OpenThread(PROCESS_ALL_ACCESS, false, (IntPtr)process.Threads[0].Id);
ResumeThread(p);
CloseHandle(p);
}
}
}
const int PROCESS_ALL_ACCESS = 0x001F03FF;
const string SE_DEBUG_NAME = "SeDebugPrivilege";
const uint SE_PRIVILEGE_ENABLED = 0x00000002;
const uint STANDARD_RIGHTS_REQUIRED = 0x000F0000;
const uint STANDARD_RIGHTS_READ = 0x00020000;
const uint TOKEN_ASSIGN_PRIMARY = 0x0001;
const uint TOKEN_DUPLICATE = 0x0002;
const uint TOKEN_IMPERSONATE = 0x0004;
const uint TOKEN_QUERY = 0x0008;
const uint TOKEN_QUERY_SOURCE = 0x0010;
const uint TOKEN_ADJUST_PRIVILEGES = 0x0020;
const uint TOKEN_ADJUST_GROUPS = 0x0040;
const uint TOKEN_ADJUST_DEFAULT = 0x0080;
const uint TOKEN_ADJUST_SESSIONID = 0x0100;
const uint TOKEN_READ = STANDARD_RIGHTS_READ | TOKEN_QUERY;
const uint TOKEN_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED | TOKEN_ASSIGN_PRIMARY |
TOKEN_DUPLICATE | TOKEN_IMPERSONATE | TOKEN_QUERY | TOKEN_QUERY_SOURCE |
TOKEN_ADJUST_PRIVILEGES | TOKEN_ADJUST_GROUPS | TOKEN_ADJUST_DEFAULT |
TOKEN_ADJUST_SESSIONID);
[DllImport("kernel32.dll")]
private static extern IntPtr OpenThread(int dwDesiredAccess, bool bInheritHandle, IntPtr dwThreadId);
[DllImport("kernel32.dll")]
private static extern bool CloseHandle(IntPtr hObject);
[DllImport("kernel32")]
private static extern int SuspendThread(IntPtr hThread);
[DllImport("kernel32")]
private static extern int ResumeThread(IntPtr hThread);
[DllImport("advapi32.dll", SetLastError = true)]
private static extern bool OpenProcessToken(IntPtr processHandle, uint desiredAccess, out IntPtr tokenHandle);
[DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool LookupPrivilegeValue(string lpSystemName, string lpName,
[MarshalAs(UnmanagedType.Struct)] ref LUID lpLuid);
[DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool AdjustTokenPrivileges(IntPtr TokenHandle,
[MarshalAs(UnmanagedType.Bool)] bool DisableAllPrivileges,
[MarshalAs(UnmanagedType.Struct)] ref TOKEN_PRIVILEGES NewState,
uint BufferLength, IntPtr PreviousState, uint ReturnLength);
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
private struct LUID
{
internal int LowPart;
internal uint HighPart;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
private struct TOKEN_PRIVILEGES
{
internal int PrivilegeCount;
internal LUID_AND_ATTRIBUTES Privilege;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
private struct LUID_AND_ATTRIBUTES
{
internal LUID Luid;
internal uint Attributes;
}
}
}

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

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