From 99e9eeee167c5b19cc5ef156e05319b98fa7ed0d Mon Sep 17 00:00:00 2001 From: Sunny Date: Mon, 11 May 2020 21:11:29 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=A1=B9=E7=9B=AE=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LICENSE | 674 ++++++ SunnyUI.Demo/Controls/FAvatar.Designer.cs | 228 ++ SunnyUI.Demo/Controls/FAvatar.cs | 17 + SunnyUI.Demo/Controls/FAvatar.resx | 123 + SunnyUI.Demo/Controls/FButton.Designer.cs | 1029 +++++++++ SunnyUI.Demo/Controls/FButton.cs | 13 + SunnyUI.Demo/Controls/FButton.resx | 120 + SunnyUI.Demo/Controls/FCheckBox.Designer.cs | 153 ++ SunnyUI.Demo/Controls/FCheckBox.cs | 31 + SunnyUI.Demo/Controls/FCheckBox.resx | 120 + .../Controls/FContextMenuStrip.Designer.cs | 103 + SunnyUI.Demo/Controls/FContextMenuStrip.cs | 35 + SunnyUI.Demo/Controls/FContextMenuStrip.resx | 123 + .../Controls/FDataGridView.Designer.cs | 103 + SunnyUI.Demo/Controls/FDataGridView.cs | 55 + SunnyUI.Demo/Controls/FDataGridView.resx | 120 + SunnyUI.Demo/Controls/FLabel.Designer.cs | 162 ++ SunnyUI.Demo/Controls/FLabel.cs | 18 + SunnyUI.Demo/Controls/FLabel.resx | 120 + SunnyUI.Demo/Controls/FLine.Designer.cs | 216 ++ SunnyUI.Demo/Controls/FLine.cs | 10 + SunnyUI.Demo/Controls/FLine.resx | 120 + SunnyUI.Demo/Controls/FListBox.Designer.cs | 149 ++ SunnyUI.Demo/Controls/FListBox.cs | 45 + SunnyUI.Demo/Controls/FListBox.resx | 120 + SunnyUI.Demo/Controls/FMeter.Designer.cs | 192 ++ SunnyUI.Demo/Controls/FMeter.cs | 27 + SunnyUI.Demo/Controls/FMeter.resx | 824 +++++++ SunnyUI.Demo/Controls/FNavigation.Designer.cs | 374 ++++ SunnyUI.Demo/Controls/FNavigation.cs | 10 + SunnyUI.Demo/Controls/FNavigation.resx | 120 + SunnyUI.Demo/Controls/FOther.Designer.cs | 356 +++ SunnyUI.Demo/Controls/FOther.cs | 26 + SunnyUI.Demo/Controls/FOther.resx | 123 + SunnyUI.Demo/Controls/FPanel.Designer.cs | 95 + SunnyUI.Demo/Controls/FPanel.cs | 10 + SunnyUI.Demo/Controls/FPanel.resx | 120 + .../Controls/FRadioButton.Designer.cs | 350 +++ SunnyUI.Demo/Controls/FRadioButton.cs | 15 + SunnyUI.Demo/Controls/FRadioButton.resx | 120 + SunnyUI.Demo/Controls/FTabControl.Designer.cs | 214 ++ SunnyUI.Demo/Controls/FTabControl.cs | 10 + SunnyUI.Demo/Controls/FTabControl.resx | 120 + SunnyUI.Demo/Controls/FTextBox.Designer.cs | 314 +++ SunnyUI.Demo/Controls/FTextBox.cs | 19 + SunnyUI.Demo/Controls/FTextBox.resx | 120 + SunnyUI.Demo/Controls/FTransfer.Designer.cs | 100 + SunnyUI.Demo/Controls/FTransfer.cs | 10 + SunnyUI.Demo/Controls/FTransfer.resx | 120 + SunnyUI.Demo/Controls/FTreeView.Designer.cs | 162 ++ SunnyUI.Demo/Controls/FTreeView.cs | 10 + SunnyUI.Demo/Controls/FTreeView.resx | 120 + SunnyUI.Demo/FMain.Designer.cs | 111 + SunnyUI.Demo/FMain.cs | 64 + SunnyUI.Demo/FMain.resx | 786 +++++++ SunnyUI.Demo/Forms/FDialogs.Designer.cs | 438 ++++ SunnyUI.Demo/Forms/FDialogs.cs | 126 ++ SunnyUI.Demo/Forms/FDialogs.resx | 120 + SunnyUI.Demo/Forms/FEdit.Designer.cs | 272 +++ SunnyUI.Demo/Forms/FEdit.cs | 55 + SunnyUI.Demo/Forms/FEdit.resx | 120 + SunnyUI.Demo/Forms/FEditor.Designer.cs | 98 + SunnyUI.Demo/Forms/FEditor.cs | 70 + SunnyUI.Demo/Forms/FEditor.resx | 120 + SunnyUI.Demo/Forms/FFrames.Designer.cs | 203 ++ SunnyUI.Demo/Forms/FFrames.cs | 54 + SunnyUI.Demo/Forms/FFrames.resx | 120 + .../Forms/Frames/FAsideHeaderMain.Designer.cs | 66 + SunnyUI.Demo/Forms/Frames/FAsideHeaderMain.cs | 31 + .../Forms/Frames/FAsideHeaderMain.resx | 120 + .../Frames/FAsideHeaderMainFooter.Designer.cs | 71 + .../Forms/Frames/FAsideHeaderMainFooter.cs | 31 + .../Forms/Frames/FAsideHeaderMainFooter.resx | 120 + .../Forms/Frames/FAsideMain.Designer.cs | 58 + SunnyUI.Demo/Forms/Frames/FAsideMain.cs | 26 + SunnyUI.Demo/Forms/Frames/FAsideMain.resx | 120 + .../Forms/Frames/FHeaderAsideMain.Designer.cs | 81 + SunnyUI.Demo/Forms/Frames/FHeaderAsideMain.cs | 26 + .../Forms/Frames/FHeaderAsideMain.resx | 120 + .../Frames/FHeaderAsideMainFooter.Designer.cs | 88 + .../Forms/Frames/FHeaderAsideMainFooter.cs | 31 + .../Forms/Frames/FHeaderAsideMainFooter.resx | 120 + .../Forms/Frames/FHeaderMain.Designer.cs | 87 + SunnyUI.Demo/Forms/Frames/FHeaderMain.cs | 26 + SunnyUI.Demo/Forms/Frames/FHeaderMain.resx | 120 + .../Frames/FHeaderMainFooter.Designer.cs | 85 + .../Forms/Frames/FHeaderMainFooter.cs | 31 + .../Forms/Frames/FHeaderMainFooter.resx | 120 + SunnyUI.Demo/Forms/Pages/FPage1.Designer.cs | 67 + SunnyUI.Demo/Forms/Pages/FPage1.cs | 10 + SunnyUI.Demo/Forms/Pages/FPage1.resx | 120 + SunnyUI.Demo/Forms/Pages/FPage2.Designer.cs | 67 + SunnyUI.Demo/Forms/Pages/FPage2.cs | 10 + SunnyUI.Demo/Forms/Pages/FPage2.resx | 120 + SunnyUI.Demo/Forms/Pages/FPage3.Designer.cs | 67 + SunnyUI.Demo/Forms/Pages/FPage3.cs | 10 + SunnyUI.Demo/Forms/Pages/FPage3.resx | 120 + .../Forms/Pages/FTitlePage1.Designer.cs | 72 + SunnyUI.Demo/Forms/Pages/FTitlePage1.cs | 10 + SunnyUI.Demo/Forms/Pages/FTitlePage1.resx | 120 + .../Forms/Pages/FTitlePage2.Designer.cs | 72 + SunnyUI.Demo/Forms/Pages/FTitlePage2.cs | 10 + SunnyUI.Demo/Forms/Pages/FTitlePage2.resx | 120 + .../Forms/Pages/FTitlePage3.Designer.cs | 72 + SunnyUI.Demo/Forms/Pages/FTitlePage3.cs | 10 + SunnyUI.Demo/Forms/Pages/FTitlePage3.resx | 120 + SunnyUI.Demo/Program.cs | 19 + SunnyUI.Demo/Properties/AssemblyInfo.cs | 35 + SunnyUI.Demo/Properties/Resources.Designer.cs | 283 +++ SunnyUI.Demo/Properties/Resources.resx | 187 ++ SunnyUI.Demo/Properties/Settings.Designer.cs | 26 + SunnyUI.Demo/Properties/Settings.settings | 7 + SunnyUI.Demo/Resources/AHM.png | Bin 0 -> 2055 bytes SunnyUI.Demo/Resources/AHM1.png | Bin 0 -> 2060 bytes SunnyUI.Demo/Resources/AHMF.png | Bin 0 -> 2464 bytes SunnyUI.Demo/Resources/AHMF1.png | Bin 0 -> 2469 bytes SunnyUI.Demo/Resources/AM.png | Bin 0 -> 1140 bytes SunnyUI.Demo/Resources/AM1.png | Bin 0 -> 1592 bytes SunnyUI.Demo/Resources/HAM.png | Bin 0 -> 2051 bytes SunnyUI.Demo/Resources/HAM1.png | Bin 0 -> 2070 bytes SunnyUI.Demo/Resources/HAMF.png | Bin 0 -> 2690 bytes SunnyUI.Demo/Resources/HAMF1.png | Bin 0 -> 2691 bytes SunnyUI.Demo/Resources/HM.png | Bin 0 -> 1497 bytes SunnyUI.Demo/Resources/HM1.png | Bin 0 -> 1499 bytes SunnyUI.Demo/Resources/HMF.png | Bin 0 -> 1872 bytes SunnyUI.Demo/Resources/HMF1.png | Bin 0 -> 1873 bytes SunnyUI.Demo/Resources/SunnyUI.png | Bin 0 -> 4040 bytes SunnyUI.Demo/Resources/SunnyUISmall.png | Bin 0 -> 2354 bytes SunnyUI.Demo/Resources/dashboard.png | Bin 0 -> 1066 bytes SunnyUI.Demo/Resources/dashboard0.png | Bin 0 -> 971 bytes SunnyUI.Demo/Resources/relationship.png | Bin 0 -> 616 bytes SunnyUI.Demo/Resources/relationship0.png | Bin 0 -> 661 bytes SunnyUI.Demo/Resources/save.png | Bin 0 -> 700 bytes SunnyUI.Demo/Resources/save0.png | Bin 0 -> 629 bytes SunnyUI.Demo/SunnyUI.Demo.csproj | 418 ++++ SunnyUI.Demo/SunnyUI.ico | Bin 0 -> 39438 bytes SunnyUI.ico | Bin 0 -> 39438 bytes SunnyUI.sln | 34 + .../DropItem/UIComboBoxItem.Designer.cs | 70 + SunnyUI/Controls/DropItem/UIComboBoxItem.cs | 73 + SunnyUI/Controls/DropItem/UIComboBoxItem.resx | 120 + .../DropItem/UIDateTimeItem.Designer.cs | 61 + SunnyUI/Controls/DropItem/UIDateTimeItem.cs | 54 + .../DropItem/UIDropControl.Designer.cs | 46 + SunnyUI/Controls/DropItem/UIDropControl.cs | 305 +++ SunnyUI/Controls/DropItem/UIDropControl.resx | 120 + SunnyUI/Controls/DropItem/UIDropDown.cs | 324 +++ .../DropItem/UIDropDownItem.Designer.cs | 43 + SunnyUI/Controls/DropItem/UIDropDownItem.cs | 96 + SunnyUI/Controls/TypeEditor/UIDropEditor.cs | 104 + .../TypeEditor/UIRadiusSidesEditor.cs | 402 ++++ SunnyUI/Controls/UIAnalogMeter.cs | 421 ++++ SunnyUI/Controls/UIAnalogMeterRender.cs | 482 ++++ SunnyUI/Controls/UIAvatar.cs | 284 +++ SunnyUI/Controls/UIButton.cs | 295 +++ SunnyUI/Controls/UICheckBox.cs | 183 ++ SunnyUI/Controls/UICheckBoxGroup.cs | 255 +++ SunnyUI/Controls/UIComboBox.Designer.cs | 47 + SunnyUI/Controls/UIComboBox.cs | 151 ++ SunnyUI/Controls/UIComboBox.resx | 120 + SunnyUI/Controls/UIContextMenuStrip.cs | 115 + SunnyUI/Controls/UIControl.cs | 692 ++++++ SunnyUI/Controls/UIDataGridView.cs | 445 ++++ SunnyUI/Controls/UIDatePicker.Designer.cs | 48 + SunnyUI/Controls/UIDatePicker.cs | 93 + SunnyUI/Controls/UIDatePicker.resx | 120 + SunnyUI/Controls/UIDoubleUpDown.cs | 165 ++ SunnyUI/Controls/UIDoubleUpDown.designer.cs | 140 ++ SunnyUI/Controls/UIDoubleUpDown.resx | 120 + SunnyUI/Controls/UIEdit.cs | 496 ++++ SunnyUI/Controls/UIGlobal.cs | 122 + SunnyUI/Controls/UIGrid.cs | 1062 +++++++++ SunnyUI/Controls/UIGrid.resx | 120 + SunnyUI/Controls/UIGridColumn.cs | 203 ++ SunnyUI/Controls/UIGridRow.cs | 604 +++++ SunnyUI/Controls/UIGridRow.resx | 120 + SunnyUI/Controls/UIGroupBox.Designer.cs | 42 + SunnyUI/Controls/UIGroupBox.cs | 119 + SunnyUI/Controls/UIImageButton.cs | 399 ++++ SunnyUI/Controls/UIImageListBox.Designer.cs | 37 + SunnyUI/Controls/UIImageListBox.cs | 563 +++++ SunnyUI/Controls/UIIntegerUpDown.cs | 159 ++ SunnyUI/Controls/UIIntegerUpDown.designer.cs | 140 ++ SunnyUI/Controls/UIIntegerUpDown.resx | 120 + SunnyUI/Controls/UILabel.cs | 383 ++++ SunnyUI/Controls/UILedBulb.cs | 203 ++ SunnyUI/Controls/UILedDisplay.cs | 519 +++++ SunnyUI/Controls/UILedStopwatch.cs | 140 ++ SunnyUI/Controls/UILight.cs | 227 ++ SunnyUI/Controls/UILine.cs | 212 ++ SunnyUI/Controls/UIListBox.Designer.cs | 38 + SunnyUI/Controls/UIListBox.cs | 458 ++++ SunnyUI/Controls/UIListBox.resx | 120 + SunnyUI/Controls/UILogo.cs | 179 ++ SunnyUI/Controls/UINavBar.Designer.cs | 36 + SunnyUI/Controls/UINavBar.cs | 481 ++++ SunnyUI/Controls/UINavMenu.cs | 822 +++++++ SunnyUI/Controls/UIPanel.Designer.cs | 44 + SunnyUI/Controls/UIPanel.cs | 560 +++++ SunnyUI/Controls/UIProcessBar.cs | 199 ++ SunnyUI/Controls/UIProgressIndicator.cs | 150 ++ SunnyUI/Controls/UIRadioButton.cs | 208 ++ SunnyUI/Controls/UIRadioButtonGroup.cs | 233 ++ SunnyUI/Controls/UIRoundMeter.cs | 271 +++ SunnyUI/Controls/UIScrollBar.cs | 469 ++++ SunnyUI/Controls/UISwitch.cs | 174 ++ SunnyUI/Controls/UISymbolButton.cs | 203 ++ SunnyUI/Controls/UITabControl.cs | 402 ++++ SunnyUI/Controls/UITabControlMenu.cs | 405 ++++ SunnyUI/Controls/UITextBox.Designer.cs | 46 + SunnyUI/Controls/UITextBox.cs | 300 +++ SunnyUI/Controls/UITextBox.resx | 120 + SunnyUI/Controls/UITitlePanel.Designer.cs | 43 + SunnyUI/Controls/UITitlePanel.cs | 167 ++ SunnyUI/Controls/UITrackBar.cs | 211 ++ SunnyUI/Controls/UITransfer.Designer.cs | 163 ++ SunnyUI/Controls/UITransfer.cs | 224 ++ SunnyUI/Controls/UITransfer.resx | 120 + SunnyUI/Controls/UITreeView.cs | 574 +++++ SunnyUI/Font/ElegantIcons.png | Bin 0 -> 526030 bytes SunnyUI/Font/ElegantIcons.ttf | Bin 0 -> 59388 bytes SunnyUI/Font/Font Awesome Icons.png | Bin 0 -> 1090587 bytes SunnyUI/Font/FontAwesome.ttf | Bin 0 -> 165548 bytes SunnyUI/Font/UIFontImage.cs | 403 ++++ SunnyUI/Font/UIFontImageDefine.cs | 1216 ++++++++++ SunnyUI/Font/UIFontImages.cs | 312 +++ SunnyUI/Font/UIFontImages.designer.cs | 160 ++ SunnyUI/Font/UIFontImages.resx | 126 ++ SunnyUI/Forms/UIEditForm.Designer.cs | 105 + SunnyUI/Forms/UIEditForm.cs | 133 ++ SunnyUI/Forms/UIEditForm.resx | 120 + SunnyUI/Forms/UIForm.cs | 888 ++++++++ SunnyUI/Forms/UIForm.designer.cs | 48 + SunnyUI/Forms/UIForm.resx | 120 + SunnyUI/Forms/UIFormHelper.cs | 371 +++ SunnyUI/Forms/UIInputForm.Designer.cs | 91 + SunnyUI/Forms/UIInputForm.cs | 67 + SunnyUI/Forms/UIInputForm.resx | 120 + SunnyUI/Forms/UIMessageForm.Designer.cs | 111 + SunnyUI/Forms/UIMessageForm.cs | 145 ++ SunnyUI/Forms/UIMessageForm.resx | 120 + SunnyUI/Forms/UINotifier.cs | 778 +++++++ SunnyUI/Forms/UINotifier.designer.cs | 200 ++ SunnyUI/Forms/UINotifier.resx | 123 + SunnyUI/Forms/UISelectForm.Designer.cs | 88 + SunnyUI/Forms/UISelectForm.cs | 62 + SunnyUI/Forms/UISelectForm.resx | 120 + SunnyUI/Forms/UIStatusForm.Designer.cs | 82 + SunnyUI/Forms/UIStatusForm.cs | 89 + SunnyUI/Forms/UIStatusForm.resx | 120 + .../UIAsideHeaderMainFooterFrame.Designer.cs | 71 + .../Frames/UIAsideHeaderMainFooterFrame.cs | 31 + .../Frames/UIAsideHeaderMainFooterFrame.resx | 120 + .../Frames/UIAsideHeaderMainFrame.Designer.cs | 76 + SunnyUI/Frames/UIAsideHeaderMainFrame.cs | 31 + SunnyUI/Frames/UIAsideHeaderMainFrame.resx | 120 + SunnyUI/Frames/UIAsideMainFrame.Designer.cs | 73 + SunnyUI/Frames/UIAsideMainFrame.cs | 31 + SunnyUI/Frames/UIAsideMainFrame.resx | 120 + .../UIHeaderAsideMainFooterFrame.Designer.cs | 75 + .../Frames/UIHeaderAsideMainFooterFrame.cs | 31 + .../Frames/UIHeaderAsideMainFooterFrame.resx | 120 + .../Frames/UIHeaderAsideMainFrame.Designer.cs | 77 + SunnyUI/Frames/UIHeaderAsideMainFrame.cs | 31 + SunnyUI/Frames/UIHeaderAsideMainFrame.resx | 120 + .../UIHeaderMainFooterFrame.Designer.cs | 77 + SunnyUI/Frames/UIHeaderMainFooterFrame.cs | 31 + SunnyUI/Frames/UIHeaderMainFooterFrame.resx | 120 + SunnyUI/Frames/UIHeaderMainFrame.Designer.cs | 72 + SunnyUI/Frames/UIHeaderMainFrame.cs | 31 + SunnyUI/Frames/UIHeaderMainFrame.resx | 120 + SunnyUI/Frames/UIMainFrame.Designer.cs | 89 + SunnyUI/Frames/UIMainFrame.cs | 49 + SunnyUI/Frames/UIMainFrame.resx | 120 + SunnyUI/Pages/UIPage.Designer.cs | 56 + SunnyUI/Pages/UIPage.cs | 238 ++ SunnyUI/Pages/UIPage.resx | 120 + SunnyUI/Pages/UITitlePage.Designer.cs | 80 + SunnyUI/Pages/UITitlePage.cs | 120 + SunnyUI/Pages/UITitlePage.resx | 120 + SunnyUI/Properties/AssemblyInfo.cs | 35 + SunnyUI/Properties/Resources.Designer.cs | 161 ++ SunnyUI/Properties/Resources.resx | 153 ++ SunnyUI/Resources/Browse.plb | Bin 0 -> 771 bytes SunnyUI/Resources/close.png | Bin 0 -> 228 bytes SunnyUI/Resources/gps1.png | Bin 0 -> 21965 bytes SunnyUI/Resources/gps_postion.png | Bin 0 -> 6186 bytes SunnyUI/Resources/img_notifier.png | Bin 0 -> 168 bytes SunnyUI/Resources/info.png | Bin 0 -> 744 bytes SunnyUI/Resources/ko.png | Bin 0 -> 763 bytes SunnyUI/Resources/menu.png | Bin 0 -> 166 bytes SunnyUI/Resources/notifier.png | Bin 0 -> 445 bytes SunnyUI/Resources/ok.png | Bin 0 -> 827 bytes SunnyUI/Resources/warning.png | Bin 0 -> 1288 bytes SunnyUI/Resources/wind.png | Bin 0 -> 23751 bytes SunnyUI/Resources/wind_postion.png | Bin 0 -> 3258 bytes SunnyUI/Static/UArray.cs | 1059 +++++++++ SunnyUI/Static/UAssembly.cs | 86 + SunnyUI/Static/UAttribute.cs | 264 +++ SunnyUI/Static/UAudio.cs | 202 ++ SunnyUI/Static/UCollections.cs | 217 ++ SunnyUI/Static/UControl.cs | 417 ++++ SunnyUI/Static/UDataReader.cs | 505 +++++ SunnyUI/Static/UDateTime.cs | 836 +++++++ SunnyUI/Static/UDir.cs | 373 ++++ SunnyUI/Static/UEnum.cs | 160 ++ SunnyUI/Static/UFile.cs | 819 +++++++ SunnyUI/Static/UGDI.cs | 561 +++++ SunnyUI/Static/UImage.cs | 560 +++++ SunnyUI/Static/ULocalize.cs | 43 + SunnyUI/Static/UMath.cs | 844 +++++++ SunnyUI/Static/UMessageTip.cs | 1986 +++++++++++++++++ SunnyUI/Static/UPrivilegeAPI.cs | 252 +++ SunnyUI/Static/URandom.cs | 226 ++ SunnyUI/Static/UScrollBarInfo.cs | 157 ++ SunnyUI/Static/UString.cs | 1264 +++++++++++ SunnyUI/Static/USyncTime.cs | 421 ++++ SunnyUI/Static/USystem.cs | 375 ++++ SunnyUI/Style/UIMenuStyle.cs | 61 + SunnyUI/Style/UIStyle.cs | 643 ++++++ SunnyUI/Style/UIStyleColor.cs | 523 +++++ SunnyUI/Style/UIStyleManager.cs | 64 + SunnyUI/SunnyUI.csproj | 562 +++++ SunnyUI/Units/UBackgroundWorker.cs | 172 ++ SunnyUI/Units/UBaseConfig.cs | 563 +++++ SunnyUI/Units/UCrc32.cs | 132 ++ SunnyUI/Units/UFastBitmap.cs | 935 ++++++++ SunnyUI/Units/UHook.cs | 865 +++++++ SunnyUI/Units/UIdentityCard.cs | 246 ++ SunnyUI/Units/UIniConfig.cs | 176 ++ SunnyUI/Units/UIniFile.cs | 1137 ++++++++++ SunnyUI/Units/UKeyScope.cs | 238 ++ SunnyUI/Units/ULimitedQueue.cs | 96 + SunnyUI/Units/UListEx.cs | 91 + SunnyUI/Units/ULogFile.cs | 567 +++++ SunnyUI/Units/USerialPort.cs | 233 ++ SunnyUI/Units/USevenZip.cs | 255 +++ SunnyUI/Units/UStringList.cs | 222 ++ SunnyUI/Units/UTemplate.cs | 70 + SunnyUI/Units/UThunder.cs | 764 +++++++ SunnyUI/Units/UUdp.cs | 279 +++ SunnyUI/Units/UWMI.cs | 564 +++++ SunnyUI/Units/UXmlConfig.cs | 156 ++ Updates.txt | 35 + 344 files changed, 64546 insertions(+) create mode 100644 LICENSE create mode 100644 SunnyUI.Demo/Controls/FAvatar.Designer.cs create mode 100644 SunnyUI.Demo/Controls/FAvatar.cs create mode 100644 SunnyUI.Demo/Controls/FAvatar.resx create mode 100644 SunnyUI.Demo/Controls/FButton.Designer.cs create mode 100644 SunnyUI.Demo/Controls/FButton.cs create mode 100644 SunnyUI.Demo/Controls/FButton.resx create mode 100644 SunnyUI.Demo/Controls/FCheckBox.Designer.cs create mode 100644 SunnyUI.Demo/Controls/FCheckBox.cs create mode 100644 SunnyUI.Demo/Controls/FCheckBox.resx create mode 100644 SunnyUI.Demo/Controls/FContextMenuStrip.Designer.cs create mode 100644 SunnyUI.Demo/Controls/FContextMenuStrip.cs create mode 100644 SunnyUI.Demo/Controls/FContextMenuStrip.resx create mode 100644 SunnyUI.Demo/Controls/FDataGridView.Designer.cs create mode 100644 SunnyUI.Demo/Controls/FDataGridView.cs create mode 100644 SunnyUI.Demo/Controls/FDataGridView.resx create mode 100644 SunnyUI.Demo/Controls/FLabel.Designer.cs create mode 100644 SunnyUI.Demo/Controls/FLabel.cs create mode 100644 SunnyUI.Demo/Controls/FLabel.resx create mode 100644 SunnyUI.Demo/Controls/FLine.Designer.cs create mode 100644 SunnyUI.Demo/Controls/FLine.cs create mode 100644 SunnyUI.Demo/Controls/FLine.resx create mode 100644 SunnyUI.Demo/Controls/FListBox.Designer.cs create mode 100644 SunnyUI.Demo/Controls/FListBox.cs create mode 100644 SunnyUI.Demo/Controls/FListBox.resx create mode 100644 SunnyUI.Demo/Controls/FMeter.Designer.cs create mode 100644 SunnyUI.Demo/Controls/FMeter.cs create mode 100644 SunnyUI.Demo/Controls/FMeter.resx create mode 100644 SunnyUI.Demo/Controls/FNavigation.Designer.cs create mode 100644 SunnyUI.Demo/Controls/FNavigation.cs create mode 100644 SunnyUI.Demo/Controls/FNavigation.resx create mode 100644 SunnyUI.Demo/Controls/FOther.Designer.cs create mode 100644 SunnyUI.Demo/Controls/FOther.cs create mode 100644 SunnyUI.Demo/Controls/FOther.resx create mode 100644 SunnyUI.Demo/Controls/FPanel.Designer.cs create mode 100644 SunnyUI.Demo/Controls/FPanel.cs create mode 100644 SunnyUI.Demo/Controls/FPanel.resx create mode 100644 SunnyUI.Demo/Controls/FRadioButton.Designer.cs create mode 100644 SunnyUI.Demo/Controls/FRadioButton.cs create mode 100644 SunnyUI.Demo/Controls/FRadioButton.resx create mode 100644 SunnyUI.Demo/Controls/FTabControl.Designer.cs create mode 100644 SunnyUI.Demo/Controls/FTabControl.cs create mode 100644 SunnyUI.Demo/Controls/FTabControl.resx create mode 100644 SunnyUI.Demo/Controls/FTextBox.Designer.cs create mode 100644 SunnyUI.Demo/Controls/FTextBox.cs create mode 100644 SunnyUI.Demo/Controls/FTextBox.resx create mode 100644 SunnyUI.Demo/Controls/FTransfer.Designer.cs create mode 100644 SunnyUI.Demo/Controls/FTransfer.cs create mode 100644 SunnyUI.Demo/Controls/FTransfer.resx create mode 100644 SunnyUI.Demo/Controls/FTreeView.Designer.cs create mode 100644 SunnyUI.Demo/Controls/FTreeView.cs create mode 100644 SunnyUI.Demo/Controls/FTreeView.resx create mode 100644 SunnyUI.Demo/FMain.Designer.cs create mode 100644 SunnyUI.Demo/FMain.cs create mode 100644 SunnyUI.Demo/FMain.resx create mode 100644 SunnyUI.Demo/Forms/FDialogs.Designer.cs create mode 100644 SunnyUI.Demo/Forms/FDialogs.cs create mode 100644 SunnyUI.Demo/Forms/FDialogs.resx create mode 100644 SunnyUI.Demo/Forms/FEdit.Designer.cs create mode 100644 SunnyUI.Demo/Forms/FEdit.cs create mode 100644 SunnyUI.Demo/Forms/FEdit.resx create mode 100644 SunnyUI.Demo/Forms/FEditor.Designer.cs create mode 100644 SunnyUI.Demo/Forms/FEditor.cs create mode 100644 SunnyUI.Demo/Forms/FEditor.resx create mode 100644 SunnyUI.Demo/Forms/FFrames.Designer.cs create mode 100644 SunnyUI.Demo/Forms/FFrames.cs create mode 100644 SunnyUI.Demo/Forms/FFrames.resx create mode 100644 SunnyUI.Demo/Forms/Frames/FAsideHeaderMain.Designer.cs create mode 100644 SunnyUI.Demo/Forms/Frames/FAsideHeaderMain.cs create mode 100644 SunnyUI.Demo/Forms/Frames/FAsideHeaderMain.resx create mode 100644 SunnyUI.Demo/Forms/Frames/FAsideHeaderMainFooter.Designer.cs create mode 100644 SunnyUI.Demo/Forms/Frames/FAsideHeaderMainFooter.cs create mode 100644 SunnyUI.Demo/Forms/Frames/FAsideHeaderMainFooter.resx create mode 100644 SunnyUI.Demo/Forms/Frames/FAsideMain.Designer.cs create mode 100644 SunnyUI.Demo/Forms/Frames/FAsideMain.cs create mode 100644 SunnyUI.Demo/Forms/Frames/FAsideMain.resx create mode 100644 SunnyUI.Demo/Forms/Frames/FHeaderAsideMain.Designer.cs create mode 100644 SunnyUI.Demo/Forms/Frames/FHeaderAsideMain.cs create mode 100644 SunnyUI.Demo/Forms/Frames/FHeaderAsideMain.resx create mode 100644 SunnyUI.Demo/Forms/Frames/FHeaderAsideMainFooter.Designer.cs create mode 100644 SunnyUI.Demo/Forms/Frames/FHeaderAsideMainFooter.cs create mode 100644 SunnyUI.Demo/Forms/Frames/FHeaderAsideMainFooter.resx create mode 100644 SunnyUI.Demo/Forms/Frames/FHeaderMain.Designer.cs create mode 100644 SunnyUI.Demo/Forms/Frames/FHeaderMain.cs create mode 100644 SunnyUI.Demo/Forms/Frames/FHeaderMain.resx create mode 100644 SunnyUI.Demo/Forms/Frames/FHeaderMainFooter.Designer.cs create mode 100644 SunnyUI.Demo/Forms/Frames/FHeaderMainFooter.cs create mode 100644 SunnyUI.Demo/Forms/Frames/FHeaderMainFooter.resx create mode 100644 SunnyUI.Demo/Forms/Pages/FPage1.Designer.cs create mode 100644 SunnyUI.Demo/Forms/Pages/FPage1.cs create mode 100644 SunnyUI.Demo/Forms/Pages/FPage1.resx create mode 100644 SunnyUI.Demo/Forms/Pages/FPage2.Designer.cs create mode 100644 SunnyUI.Demo/Forms/Pages/FPage2.cs create mode 100644 SunnyUI.Demo/Forms/Pages/FPage2.resx create mode 100644 SunnyUI.Demo/Forms/Pages/FPage3.Designer.cs create mode 100644 SunnyUI.Demo/Forms/Pages/FPage3.cs create mode 100644 SunnyUI.Demo/Forms/Pages/FPage3.resx create mode 100644 SunnyUI.Demo/Forms/Pages/FTitlePage1.Designer.cs create mode 100644 SunnyUI.Demo/Forms/Pages/FTitlePage1.cs create mode 100644 SunnyUI.Demo/Forms/Pages/FTitlePage1.resx create mode 100644 SunnyUI.Demo/Forms/Pages/FTitlePage2.Designer.cs create mode 100644 SunnyUI.Demo/Forms/Pages/FTitlePage2.cs create mode 100644 SunnyUI.Demo/Forms/Pages/FTitlePage2.resx create mode 100644 SunnyUI.Demo/Forms/Pages/FTitlePage3.Designer.cs create mode 100644 SunnyUI.Demo/Forms/Pages/FTitlePage3.cs create mode 100644 SunnyUI.Demo/Forms/Pages/FTitlePage3.resx create mode 100644 SunnyUI.Demo/Program.cs create mode 100644 SunnyUI.Demo/Properties/AssemblyInfo.cs create mode 100644 SunnyUI.Demo/Properties/Resources.Designer.cs create mode 100644 SunnyUI.Demo/Properties/Resources.resx create mode 100644 SunnyUI.Demo/Properties/Settings.Designer.cs create mode 100644 SunnyUI.Demo/Properties/Settings.settings create mode 100644 SunnyUI.Demo/Resources/AHM.png create mode 100644 SunnyUI.Demo/Resources/AHM1.png create mode 100644 SunnyUI.Demo/Resources/AHMF.png create mode 100644 SunnyUI.Demo/Resources/AHMF1.png create mode 100644 SunnyUI.Demo/Resources/AM.png create mode 100644 SunnyUI.Demo/Resources/AM1.png create mode 100644 SunnyUI.Demo/Resources/HAM.png create mode 100644 SunnyUI.Demo/Resources/HAM1.png create mode 100644 SunnyUI.Demo/Resources/HAMF.png create mode 100644 SunnyUI.Demo/Resources/HAMF1.png create mode 100644 SunnyUI.Demo/Resources/HM.png create mode 100644 SunnyUI.Demo/Resources/HM1.png create mode 100644 SunnyUI.Demo/Resources/HMF.png create mode 100644 SunnyUI.Demo/Resources/HMF1.png create mode 100644 SunnyUI.Demo/Resources/SunnyUI.png create mode 100644 SunnyUI.Demo/Resources/SunnyUISmall.png create mode 100644 SunnyUI.Demo/Resources/dashboard.png create mode 100644 SunnyUI.Demo/Resources/dashboard0.png create mode 100644 SunnyUI.Demo/Resources/relationship.png create mode 100644 SunnyUI.Demo/Resources/relationship0.png create mode 100644 SunnyUI.Demo/Resources/save.png create mode 100644 SunnyUI.Demo/Resources/save0.png create mode 100644 SunnyUI.Demo/SunnyUI.Demo.csproj create mode 100644 SunnyUI.Demo/SunnyUI.ico create mode 100644 SunnyUI.ico create mode 100644 SunnyUI.sln create mode 100644 SunnyUI/Controls/DropItem/UIComboBoxItem.Designer.cs create mode 100644 SunnyUI/Controls/DropItem/UIComboBoxItem.cs create mode 100644 SunnyUI/Controls/DropItem/UIComboBoxItem.resx create mode 100644 SunnyUI/Controls/DropItem/UIDateTimeItem.Designer.cs create mode 100644 SunnyUI/Controls/DropItem/UIDateTimeItem.cs create mode 100644 SunnyUI/Controls/DropItem/UIDropControl.Designer.cs create mode 100644 SunnyUI/Controls/DropItem/UIDropControl.cs create mode 100644 SunnyUI/Controls/DropItem/UIDropControl.resx create mode 100644 SunnyUI/Controls/DropItem/UIDropDown.cs create mode 100644 SunnyUI/Controls/DropItem/UIDropDownItem.Designer.cs create mode 100644 SunnyUI/Controls/DropItem/UIDropDownItem.cs create mode 100644 SunnyUI/Controls/TypeEditor/UIDropEditor.cs create mode 100644 SunnyUI/Controls/TypeEditor/UIRadiusSidesEditor.cs create mode 100644 SunnyUI/Controls/UIAnalogMeter.cs create mode 100644 SunnyUI/Controls/UIAnalogMeterRender.cs create mode 100644 SunnyUI/Controls/UIAvatar.cs create mode 100644 SunnyUI/Controls/UIButton.cs create mode 100644 SunnyUI/Controls/UICheckBox.cs create mode 100644 SunnyUI/Controls/UICheckBoxGroup.cs create mode 100644 SunnyUI/Controls/UIComboBox.Designer.cs create mode 100644 SunnyUI/Controls/UIComboBox.cs create mode 100644 SunnyUI/Controls/UIComboBox.resx create mode 100644 SunnyUI/Controls/UIContextMenuStrip.cs create mode 100644 SunnyUI/Controls/UIControl.cs create mode 100644 SunnyUI/Controls/UIDataGridView.cs create mode 100644 SunnyUI/Controls/UIDatePicker.Designer.cs create mode 100644 SunnyUI/Controls/UIDatePicker.cs create mode 100644 SunnyUI/Controls/UIDatePicker.resx create mode 100644 SunnyUI/Controls/UIDoubleUpDown.cs create mode 100644 SunnyUI/Controls/UIDoubleUpDown.designer.cs create mode 100644 SunnyUI/Controls/UIDoubleUpDown.resx create mode 100644 SunnyUI/Controls/UIEdit.cs create mode 100644 SunnyUI/Controls/UIGlobal.cs create mode 100644 SunnyUI/Controls/UIGrid.cs create mode 100644 SunnyUI/Controls/UIGrid.resx create mode 100644 SunnyUI/Controls/UIGridColumn.cs create mode 100644 SunnyUI/Controls/UIGridRow.cs create mode 100644 SunnyUI/Controls/UIGridRow.resx create mode 100644 SunnyUI/Controls/UIGroupBox.Designer.cs create mode 100644 SunnyUI/Controls/UIGroupBox.cs create mode 100644 SunnyUI/Controls/UIImageButton.cs create mode 100644 SunnyUI/Controls/UIImageListBox.Designer.cs create mode 100644 SunnyUI/Controls/UIImageListBox.cs create mode 100644 SunnyUI/Controls/UIIntegerUpDown.cs create mode 100644 SunnyUI/Controls/UIIntegerUpDown.designer.cs create mode 100644 SunnyUI/Controls/UIIntegerUpDown.resx create mode 100644 SunnyUI/Controls/UILabel.cs create mode 100644 SunnyUI/Controls/UILedBulb.cs create mode 100644 SunnyUI/Controls/UILedDisplay.cs create mode 100644 SunnyUI/Controls/UILedStopwatch.cs create mode 100644 SunnyUI/Controls/UILight.cs create mode 100644 SunnyUI/Controls/UILine.cs create mode 100644 SunnyUI/Controls/UIListBox.Designer.cs create mode 100644 SunnyUI/Controls/UIListBox.cs create mode 100644 SunnyUI/Controls/UIListBox.resx create mode 100644 SunnyUI/Controls/UILogo.cs create mode 100644 SunnyUI/Controls/UINavBar.Designer.cs create mode 100644 SunnyUI/Controls/UINavBar.cs create mode 100644 SunnyUI/Controls/UINavMenu.cs create mode 100644 SunnyUI/Controls/UIPanel.Designer.cs create mode 100644 SunnyUI/Controls/UIPanel.cs create mode 100644 SunnyUI/Controls/UIProcessBar.cs create mode 100644 SunnyUI/Controls/UIProgressIndicator.cs create mode 100644 SunnyUI/Controls/UIRadioButton.cs create mode 100644 SunnyUI/Controls/UIRadioButtonGroup.cs create mode 100644 SunnyUI/Controls/UIRoundMeter.cs create mode 100644 SunnyUI/Controls/UIScrollBar.cs create mode 100644 SunnyUI/Controls/UISwitch.cs create mode 100644 SunnyUI/Controls/UISymbolButton.cs create mode 100644 SunnyUI/Controls/UITabControl.cs create mode 100644 SunnyUI/Controls/UITabControlMenu.cs create mode 100644 SunnyUI/Controls/UITextBox.Designer.cs create mode 100644 SunnyUI/Controls/UITextBox.cs create mode 100644 SunnyUI/Controls/UITextBox.resx create mode 100644 SunnyUI/Controls/UITitlePanel.Designer.cs create mode 100644 SunnyUI/Controls/UITitlePanel.cs create mode 100644 SunnyUI/Controls/UITrackBar.cs create mode 100644 SunnyUI/Controls/UITransfer.Designer.cs create mode 100644 SunnyUI/Controls/UITransfer.cs create mode 100644 SunnyUI/Controls/UITransfer.resx create mode 100644 SunnyUI/Controls/UITreeView.cs create mode 100644 SunnyUI/Font/ElegantIcons.png create mode 100644 SunnyUI/Font/ElegantIcons.ttf create mode 100644 SunnyUI/Font/Font Awesome Icons.png create mode 100644 SunnyUI/Font/FontAwesome.ttf create mode 100644 SunnyUI/Font/UIFontImage.cs create mode 100644 SunnyUI/Font/UIFontImageDefine.cs create mode 100644 SunnyUI/Font/UIFontImages.cs create mode 100644 SunnyUI/Font/UIFontImages.designer.cs create mode 100644 SunnyUI/Font/UIFontImages.resx create mode 100644 SunnyUI/Forms/UIEditForm.Designer.cs create mode 100644 SunnyUI/Forms/UIEditForm.cs create mode 100644 SunnyUI/Forms/UIEditForm.resx create mode 100644 SunnyUI/Forms/UIForm.cs create mode 100644 SunnyUI/Forms/UIForm.designer.cs create mode 100644 SunnyUI/Forms/UIForm.resx create mode 100644 SunnyUI/Forms/UIFormHelper.cs create mode 100644 SunnyUI/Forms/UIInputForm.Designer.cs create mode 100644 SunnyUI/Forms/UIInputForm.cs create mode 100644 SunnyUI/Forms/UIInputForm.resx create mode 100644 SunnyUI/Forms/UIMessageForm.Designer.cs create mode 100644 SunnyUI/Forms/UIMessageForm.cs create mode 100644 SunnyUI/Forms/UIMessageForm.resx create mode 100644 SunnyUI/Forms/UINotifier.cs create mode 100644 SunnyUI/Forms/UINotifier.designer.cs create mode 100644 SunnyUI/Forms/UINotifier.resx create mode 100644 SunnyUI/Forms/UISelectForm.Designer.cs create mode 100644 SunnyUI/Forms/UISelectForm.cs create mode 100644 SunnyUI/Forms/UISelectForm.resx create mode 100644 SunnyUI/Forms/UIStatusForm.Designer.cs create mode 100644 SunnyUI/Forms/UIStatusForm.cs create mode 100644 SunnyUI/Forms/UIStatusForm.resx create mode 100644 SunnyUI/Frames/UIAsideHeaderMainFooterFrame.Designer.cs create mode 100644 SunnyUI/Frames/UIAsideHeaderMainFooterFrame.cs create mode 100644 SunnyUI/Frames/UIAsideHeaderMainFooterFrame.resx create mode 100644 SunnyUI/Frames/UIAsideHeaderMainFrame.Designer.cs create mode 100644 SunnyUI/Frames/UIAsideHeaderMainFrame.cs create mode 100644 SunnyUI/Frames/UIAsideHeaderMainFrame.resx create mode 100644 SunnyUI/Frames/UIAsideMainFrame.Designer.cs create mode 100644 SunnyUI/Frames/UIAsideMainFrame.cs create mode 100644 SunnyUI/Frames/UIAsideMainFrame.resx create mode 100644 SunnyUI/Frames/UIHeaderAsideMainFooterFrame.Designer.cs create mode 100644 SunnyUI/Frames/UIHeaderAsideMainFooterFrame.cs create mode 100644 SunnyUI/Frames/UIHeaderAsideMainFooterFrame.resx create mode 100644 SunnyUI/Frames/UIHeaderAsideMainFrame.Designer.cs create mode 100644 SunnyUI/Frames/UIHeaderAsideMainFrame.cs create mode 100644 SunnyUI/Frames/UIHeaderAsideMainFrame.resx create mode 100644 SunnyUI/Frames/UIHeaderMainFooterFrame.Designer.cs create mode 100644 SunnyUI/Frames/UIHeaderMainFooterFrame.cs create mode 100644 SunnyUI/Frames/UIHeaderMainFooterFrame.resx create mode 100644 SunnyUI/Frames/UIHeaderMainFrame.Designer.cs create mode 100644 SunnyUI/Frames/UIHeaderMainFrame.cs create mode 100644 SunnyUI/Frames/UIHeaderMainFrame.resx create mode 100644 SunnyUI/Frames/UIMainFrame.Designer.cs create mode 100644 SunnyUI/Frames/UIMainFrame.cs create mode 100644 SunnyUI/Frames/UIMainFrame.resx create mode 100644 SunnyUI/Pages/UIPage.Designer.cs create mode 100644 SunnyUI/Pages/UIPage.cs create mode 100644 SunnyUI/Pages/UIPage.resx create mode 100644 SunnyUI/Pages/UITitlePage.Designer.cs create mode 100644 SunnyUI/Pages/UITitlePage.cs create mode 100644 SunnyUI/Pages/UITitlePage.resx create mode 100644 SunnyUI/Properties/AssemblyInfo.cs create mode 100644 SunnyUI/Properties/Resources.Designer.cs create mode 100644 SunnyUI/Properties/Resources.resx create mode 100644 SunnyUI/Resources/Browse.plb create mode 100644 SunnyUI/Resources/close.png create mode 100644 SunnyUI/Resources/gps1.png create mode 100644 SunnyUI/Resources/gps_postion.png create mode 100644 SunnyUI/Resources/img_notifier.png create mode 100644 SunnyUI/Resources/info.png create mode 100644 SunnyUI/Resources/ko.png create mode 100644 SunnyUI/Resources/menu.png create mode 100644 SunnyUI/Resources/notifier.png create mode 100644 SunnyUI/Resources/ok.png create mode 100644 SunnyUI/Resources/warning.png create mode 100644 SunnyUI/Resources/wind.png create mode 100644 SunnyUI/Resources/wind_postion.png create mode 100644 SunnyUI/Static/UArray.cs create mode 100644 SunnyUI/Static/UAssembly.cs create mode 100644 SunnyUI/Static/UAttribute.cs create mode 100644 SunnyUI/Static/UAudio.cs create mode 100644 SunnyUI/Static/UCollections.cs create mode 100644 SunnyUI/Static/UControl.cs create mode 100644 SunnyUI/Static/UDataReader.cs create mode 100644 SunnyUI/Static/UDateTime.cs create mode 100644 SunnyUI/Static/UDir.cs create mode 100644 SunnyUI/Static/UEnum.cs create mode 100644 SunnyUI/Static/UFile.cs create mode 100644 SunnyUI/Static/UGDI.cs create mode 100644 SunnyUI/Static/UImage.cs create mode 100644 SunnyUI/Static/ULocalize.cs create mode 100644 SunnyUI/Static/UMath.cs create mode 100644 SunnyUI/Static/UMessageTip.cs create mode 100644 SunnyUI/Static/UPrivilegeAPI.cs create mode 100644 SunnyUI/Static/URandom.cs create mode 100644 SunnyUI/Static/UScrollBarInfo.cs create mode 100644 SunnyUI/Static/UString.cs create mode 100644 SunnyUI/Static/USyncTime.cs create mode 100644 SunnyUI/Static/USystem.cs create mode 100644 SunnyUI/Style/UIMenuStyle.cs create mode 100644 SunnyUI/Style/UIStyle.cs create mode 100644 SunnyUI/Style/UIStyleColor.cs create mode 100644 SunnyUI/Style/UIStyleManager.cs create mode 100644 SunnyUI/SunnyUI.csproj create mode 100644 SunnyUI/Units/UBackgroundWorker.cs create mode 100644 SunnyUI/Units/UBaseConfig.cs create mode 100644 SunnyUI/Units/UCrc32.cs create mode 100644 SunnyUI/Units/UFastBitmap.cs create mode 100644 SunnyUI/Units/UHook.cs create mode 100644 SunnyUI/Units/UIdentityCard.cs create mode 100644 SunnyUI/Units/UIniConfig.cs create mode 100644 SunnyUI/Units/UIniFile.cs create mode 100644 SunnyUI/Units/UKeyScope.cs create mode 100644 SunnyUI/Units/ULimitedQueue.cs create mode 100644 SunnyUI/Units/UListEx.cs create mode 100644 SunnyUI/Units/ULogFile.cs create mode 100644 SunnyUI/Units/USerialPort.cs create mode 100644 SunnyUI/Units/USevenZip.cs create mode 100644 SunnyUI/Units/UStringList.cs create mode 100644 SunnyUI/Units/UTemplate.cs create mode 100644 SunnyUI/Units/UThunder.cs create mode 100644 SunnyUI/Units/UUdp.cs create mode 100644 SunnyUI/Units/UWMI.cs create mode 100644 SunnyUI/Units/UXmlConfig.cs create mode 100644 Updates.txt diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..9cecc1d4 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {one line to give the program's name and a brief idea of what it does.} + Copyright (C) {year} {name of author} + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + {project} Copyright (C) {year} {fullname} + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/SunnyUI.Demo/Controls/FAvatar.Designer.cs b/SunnyUI.Demo/Controls/FAvatar.Designer.cs new file mode 100644 index 00000000..a0fb8f8a --- /dev/null +++ b/SunnyUI.Demo/Controls/FAvatar.Designer.cs @@ -0,0 +1,228 @@ +namespace Sunny.UI.Demo +{ + partial class FAvatar + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.uiAvatar1 = new Sunny.UI.UIAvatar(); + this.uiAvatar2 = new Sunny.UI.UIAvatar(); + this.uiAvatar3 = new Sunny.UI.UIAvatar(); + this.uiAvatar4 = new Sunny.UI.UIAvatar(); + this.uiLabel1 = new Sunny.UI.UILabel(); + this.uiLabel2 = new Sunny.UI.UILabel(); + this.uiLabel3 = new Sunny.UI.UILabel(); + this.uiLabel4 = new Sunny.UI.UILabel(); + this.uiContextMenuStrip1 = new Sunny.UI.UIContextMenuStrip(); + this.设置ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.更改密码ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripSeparator(); + this.退出ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.uiLine1 = new Sunny.UI.UILine(); + this.PagePanel.SuspendLayout(); + this.uiContextMenuStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // PagePanel + // + this.PagePanel.Controls.Add(this.uiLine1); + this.PagePanel.Controls.Add(this.uiLabel4); + this.PagePanel.Controls.Add(this.uiLabel3); + this.PagePanel.Controls.Add(this.uiLabel2); + this.PagePanel.Controls.Add(this.uiLabel1); + this.PagePanel.Controls.Add(this.uiAvatar4); + this.PagePanel.Controls.Add(this.uiAvatar3); + this.PagePanel.Controls.Add(this.uiAvatar2); + this.PagePanel.Controls.Add(this.uiAvatar1); + this.PagePanel.Text = ""; + // + // uiAvatar1 + // + this.uiAvatar1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiAvatar1.Location = new System.Drawing.Point(102, 50); + this.uiAvatar1.Name = "uiAvatar1"; + this.uiAvatar1.Size = new System.Drawing.Size(60, 60); + this.uiAvatar1.TabIndex = 0; + this.uiAvatar1.Text = "uiAvatar1"; + // + // uiAvatar2 + // + 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.Location = new System.Drawing.Point(30, 50); + this.uiAvatar2.Name = "uiAvatar2"; + this.uiAvatar2.Size = new System.Drawing.Size(60, 60); + this.uiAvatar2.TabIndex = 1; + this.uiAvatar2.Text = "uiAvatar2"; + // + // uiAvatar3 + // + this.uiAvatar3.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(255)))), ((int)(((byte)(192))))); + this.uiAvatar3.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiAvatar3.Icon = Sunny.UI.UIAvatar.UIIcon.Text; + this.uiAvatar3.Location = new System.Drawing.Point(174, 50); + this.uiAvatar3.Name = "uiAvatar3"; + this.uiAvatar3.Size = new System.Drawing.Size(60, 60); + this.uiAvatar3.Style = Sunny.UI.UIStyle.Custom; + this.uiAvatar3.TabIndex = 2; + this.uiAvatar3.Text = "Avatar"; + // + // uiAvatar4 + // + this.uiAvatar4.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiAvatar4.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(128)))), ((int)(((byte)(128)))), ((int)(((byte)(255))))); + this.uiAvatar4.Location = new System.Drawing.Point(362, 50); + this.uiAvatar4.Name = "uiAvatar4"; + this.uiAvatar4.Size = new System.Drawing.Size(60, 60); + this.uiAvatar4.Style = Sunny.UI.UIStyle.Custom; + this.uiAvatar4.Symbol = 61715; + this.uiAvatar4.TabIndex = 3; + this.uiAvatar4.Text = "uiAvatar4"; + this.uiAvatar4.Click += new System.EventHandler(this.uiAvatar4_Click); + // + // uiLabel1 + // + this.uiLabel1.AutoSize = true; + this.uiLabel1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLabel1.Location = new System.Drawing.Point(39, 117); + this.uiLabel1.Name = "uiLabel1"; + this.uiLabel1.Size = new System.Drawing.Size(42, 21); + this.uiLabel1.TabIndex = 4; + this.uiLabel1.Text = "图片"; + this.uiLabel1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiLabel2 + // + this.uiLabel2.AutoSize = true; + this.uiLabel2.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLabel2.Location = new System.Drawing.Point(111, 117); + this.uiLabel2.Name = "uiLabel2"; + this.uiLabel2.Size = new System.Drawing.Size(42, 21); + this.uiLabel2.TabIndex = 5; + this.uiLabel2.Text = "图标"; + this.uiLabel2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiLabel3 + // + this.uiLabel3.AutoSize = true; + this.uiLabel3.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLabel3.Location = new System.Drawing.Point(183, 117); + this.uiLabel3.Name = "uiLabel3"; + this.uiLabel3.Size = new System.Drawing.Size(42, 21); + this.uiLabel3.TabIndex = 6; + this.uiLabel3.Text = "文字"; + this.uiLabel3.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiLabel4 + // + this.uiLabel4.AutoSize = true; + this.uiLabel4.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLabel4.Location = new System.Drawing.Point(355, 117); + this.uiLabel4.Name = "uiLabel4"; + this.uiLabel4.Size = new System.Drawing.Size(74, 21); + this.uiLabel4.TabIndex = 7; + this.uiLabel4.Text = "左键菜单"; + this.uiLabel4.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiContextMenuStrip1 + // + this.uiContextMenuStrip1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiContextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.设置ToolStripMenuItem, + this.更改密码ToolStripMenuItem, + this.toolStripMenuItem1, + this.退出ToolStripMenuItem}); + this.uiContextMenuStrip1.Name = "uiContextMenuStrip1"; + this.uiContextMenuStrip1.Size = new System.Drawing.Size(113, 88); + // + // 设置ToolStripMenuItem + // + this.设置ToolStripMenuItem.Name = "设置ToolStripMenuItem"; + this.设置ToolStripMenuItem.Size = new System.Drawing.Size(112, 26); + this.设置ToolStripMenuItem.Text = "设置"; + // + // 更改密码ToolStripMenuItem + // + this.更改密码ToolStripMenuItem.Name = "更改密码ToolStripMenuItem"; + this.更改密码ToolStripMenuItem.Size = new System.Drawing.Size(112, 26); + this.更改密码ToolStripMenuItem.Text = "密码"; + // + // toolStripMenuItem1 + // + this.toolStripMenuItem1.Name = "toolStripMenuItem1"; + this.toolStripMenuItem1.Size = new System.Drawing.Size(109, 6); + // + // 退出ToolStripMenuItem + // + this.退出ToolStripMenuItem.Name = "退出ToolStripMenuItem"; + this.退出ToolStripMenuItem.Size = new System.Drawing.Size(112, 26); + this.退出ToolStripMenuItem.Text = "退出"; + // + // uiLine1 + // + this.uiLine1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLine1.Location = new System.Drawing.Point(30, 20); + this.uiLine1.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine1.Name = "uiLine1"; + this.uiLine1.Size = new System.Drawing.Size(670, 20); + this.uiLine1.TabIndex = 19; + this.uiLine1.Text = "UIAvatar"; + this.uiLine1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // FAvatar + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 450); + this.Name = "FAvatar"; + this.Text = "Avatar"; + this.Controls.SetChildIndex(this.PagePanel, 0); + this.PagePanel.ResumeLayout(false); + this.PagePanel.PerformLayout(); + this.uiContextMenuStrip1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private UILabel uiLabel4; + private UILabel uiLabel3; + private UILabel uiLabel2; + private UILabel uiLabel1; + private UIAvatar uiAvatar4; + private UIAvatar uiAvatar3; + private UIAvatar uiAvatar2; + private UIAvatar uiAvatar1; + private UIContextMenuStrip uiContextMenuStrip1; + private System.Windows.Forms.ToolStripMenuItem 设置ToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem 更改密码ToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem 退出ToolStripMenuItem; + private UILine uiLine1; + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Controls/FAvatar.cs b/SunnyUI.Demo/Controls/FAvatar.cs new file mode 100644 index 00000000..5e89019e --- /dev/null +++ b/SunnyUI.Demo/Controls/FAvatar.cs @@ -0,0 +1,17 @@ +using System; + +namespace Sunny.UI.Demo +{ + public partial class FAvatar : UITitlePage + { + public FAvatar() + { + InitializeComponent(); + } + + private void uiAvatar4_Click(object sender, EventArgs e) + { + uiContextMenuStrip1.Show(uiAvatar4, 0, uiAvatar4.Height); + } + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Controls/FAvatar.resx b/SunnyUI.Demo/Controls/FAvatar.resx new file mode 100644 index 00000000..93ecf1d7 --- /dev/null +++ b/SunnyUI.Demo/Controls/FAvatar.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/SunnyUI.Demo/Controls/FButton.Designer.cs b/SunnyUI.Demo/Controls/FButton.Designer.cs new file mode 100644 index 00000000..25d023e0 --- /dev/null +++ b/SunnyUI.Demo/Controls/FButton.Designer.cs @@ -0,0 +1,1029 @@ +namespace Sunny.UI.Demo +{ + partial class FButton + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.uiButton1 = new Sunny.UI.UIButton(); + this.uiButton2 = new Sunny.UI.UIButton(); + this.uiButton3 = new Sunny.UI.UIButton(); + this.uiButton4 = new Sunny.UI.UIButton(); + this.uiButton5 = new Sunny.UI.UIButton(); + this.uiButton6 = new Sunny.UI.UIButton(); + this.uiButton7 = new Sunny.UI.UIButton(); + this.uiButton8 = new Sunny.UI.UIButton(); + this.uiButton9 = new Sunny.UI.UIButton(); + this.uiButton10 = new Sunny.UI.UIButton(); + this.uiButton11 = new Sunny.UI.UIButton(); + this.uiButton12 = new Sunny.UI.UIButton(); + this.uiButton13 = new Sunny.UI.UIButton(); + this.uiButton14 = new Sunny.UI.UIButton(); + this.uiButton15 = new Sunny.UI.UIButton(); + this.uiButton16 = new Sunny.UI.UIButton(); + this.uiButton17 = new Sunny.UI.UIButton(); + this.uiButton18 = new Sunny.UI.UIButton(); + this.uiLine1 = new Sunny.UI.UILine(); + this.uiLine2 = new Sunny.UI.UILine(); + this.uiSymbolButton1 = new Sunny.UI.UISymbolButton(); + this.uiSymbolButton2 = new Sunny.UI.UISymbolButton(); + this.uiSymbolButton3 = new Sunny.UI.UISymbolButton(); + this.uiSymbolButton4 = new Sunny.UI.UISymbolButton(); + this.uiSymbolButton5 = new Sunny.UI.UISymbolButton(); + this.uiSymbolButton6 = new Sunny.UI.UISymbolButton(); + this.uiSymbolButton7 = new Sunny.UI.UISymbolButton(); + this.uiSymbolButton8 = new Sunny.UI.UISymbolButton(); + this.uiSymbolButton9 = new Sunny.UI.UISymbolButton(); + this.uiSymbolButton10 = new Sunny.UI.UISymbolButton(); + this.uiSymbolButton11 = new Sunny.UI.UISymbolButton(); + this.uiSymbolButton12 = new Sunny.UI.UISymbolButton(); + this.uiLine3 = new Sunny.UI.UILine(); + this.uiSymbolButton13 = new Sunny.UI.UISymbolButton(); + this.uiSymbolButton14 = new Sunny.UI.UISymbolButton(); + this.uiSymbolButton15 = new Sunny.UI.UISymbolButton(); + this.uiSymbolButton16 = new Sunny.UI.UISymbolButton(); + this.uiSymbolButton17 = new Sunny.UI.UISymbolButton(); + this.uiSymbolButton18 = new Sunny.UI.UISymbolButton(); + this.uiSymbolButton19 = new Sunny.UI.UISymbolButton(); + this.uiSymbolButton20 = new Sunny.UI.UISymbolButton(); + this.uiSymbolButton21 = new Sunny.UI.UISymbolButton(); + this.uiSymbolButton22 = new Sunny.UI.UISymbolButton(); + this.uiSymbolButton23 = new Sunny.UI.UISymbolButton(); + this.uiSymbolButton24 = new Sunny.UI.UISymbolButton(); + this.uiSwitch1 = new Sunny.UI.UISwitch(); + this.uiLine4 = new Sunny.UI.UILine(); + this.uiSwitch2 = new Sunny.UI.UISwitch(); + this.uiLine5 = new Sunny.UI.UILine(); + this.uiImageButton1 = new Sunny.UI.UIImageButton(); + this.uiImageButton2 = new Sunny.UI.UIImageButton(); + this.uiImageButton3 = new Sunny.UI.UIImageButton(); + this.PagePanel.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.uiImageButton1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.uiImageButton2)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.uiImageButton3)).BeginInit(); + this.SuspendLayout(); + // + // PagePanel + // + this.PagePanel.Controls.Add(this.uiImageButton3); + this.PagePanel.Controls.Add(this.uiImageButton2); + this.PagePanel.Controls.Add(this.uiImageButton1); + this.PagePanel.Controls.Add(this.uiLine5); + this.PagePanel.Controls.Add(this.uiSwitch2); + this.PagePanel.Controls.Add(this.uiLine4); + this.PagePanel.Controls.Add(this.uiSwitch1); + this.PagePanel.Controls.Add(this.uiSymbolButton24); + this.PagePanel.Controls.Add(this.uiSymbolButton23); + this.PagePanel.Controls.Add(this.uiSymbolButton22); + this.PagePanel.Controls.Add(this.uiSymbolButton19); + this.PagePanel.Controls.Add(this.uiSymbolButton20); + this.PagePanel.Controls.Add(this.uiSymbolButton21); + this.PagePanel.Controls.Add(this.uiSymbolButton13); + this.PagePanel.Controls.Add(this.uiSymbolButton14); + this.PagePanel.Controls.Add(this.uiSymbolButton15); + this.PagePanel.Controls.Add(this.uiSymbolButton16); + this.PagePanel.Controls.Add(this.uiSymbolButton17); + this.PagePanel.Controls.Add(this.uiSymbolButton18); + this.PagePanel.Controls.Add(this.uiLine3); + this.PagePanel.Controls.Add(this.uiSymbolButton7); + this.PagePanel.Controls.Add(this.uiSymbolButton8); + this.PagePanel.Controls.Add(this.uiSymbolButton9); + this.PagePanel.Controls.Add(this.uiSymbolButton10); + this.PagePanel.Controls.Add(this.uiSymbolButton11); + this.PagePanel.Controls.Add(this.uiSymbolButton12); + this.PagePanel.Controls.Add(this.uiSymbolButton6); + this.PagePanel.Controls.Add(this.uiSymbolButton5); + this.PagePanel.Controls.Add(this.uiSymbolButton3); + this.PagePanel.Controls.Add(this.uiSymbolButton4); + this.PagePanel.Controls.Add(this.uiSymbolButton2); + this.PagePanel.Controls.Add(this.uiSymbolButton1); + this.PagePanel.Controls.Add(this.uiLine2); + this.PagePanel.Controls.Add(this.uiLine1); + this.PagePanel.Controls.Add(this.uiButton13); + this.PagePanel.Controls.Add(this.uiButton14); + this.PagePanel.Controls.Add(this.uiButton15); + this.PagePanel.Controls.Add(this.uiButton16); + this.PagePanel.Controls.Add(this.uiButton17); + this.PagePanel.Controls.Add(this.uiButton18); + this.PagePanel.Controls.Add(this.uiButton7); + this.PagePanel.Controls.Add(this.uiButton8); + this.PagePanel.Controls.Add(this.uiButton9); + this.PagePanel.Controls.Add(this.uiButton10); + this.PagePanel.Controls.Add(this.uiButton11); + this.PagePanel.Controls.Add(this.uiButton12); + this.PagePanel.Controls.Add(this.uiButton4); + this.PagePanel.Controls.Add(this.uiButton5); + this.PagePanel.Controls.Add(this.uiButton6); + this.PagePanel.Controls.Add(this.uiButton3); + this.PagePanel.Controls.Add(this.uiButton2); + this.PagePanel.Controls.Add(this.uiButton1); + this.PagePanel.Size = new System.Drawing.Size(800, 499); + this.PagePanel.Text = ""; + // + // uiButton1 + // + this.uiButton1.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiButton1.FillColor = System.Drawing.Color.White; + this.uiButton1.FillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.uiButton1.FillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.uiButton1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiButton1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(96)))), ((int)(((byte)(98)))), ((int)(((byte)(102))))); + this.uiButton1.ForeHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255))))); + this.uiButton1.ForePressColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(131)))), ((int)(((byte)(229))))); + this.uiButton1.Location = new System.Drawing.Point(30, 50); + this.uiButton1.Name = "uiButton1"; + this.uiButton1.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.uiButton1.RectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(197)))), ((int)(((byte)(222)))), ((int)(((byte)(255))))); + this.uiButton1.Size = new System.Drawing.Size(100, 35); + this.uiButton1.Style = Sunny.UI.UIStyle.White; + this.uiButton1.StyleCustomMode = true; + this.uiButton1.TabIndex = 0; + this.uiButton1.Text = "White"; + // + // uiButton2 + // + this.uiButton2.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiButton2.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiButton2.Location = new System.Drawing.Point(144, 50); + this.uiButton2.Name = "uiButton2"; + this.uiButton2.Size = new System.Drawing.Size(100, 35); + this.uiButton2.StyleCustomMode = true; + this.uiButton2.TabIndex = 1; + this.uiButton2.Text = "Blue"; + // + // uiButton3 + // + this.uiButton3.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiButton3.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(110)))), ((int)(((byte)(190)))), ((int)(((byte)(40))))); + this.uiButton3.FillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(136)))), ((int)(((byte)(202)))), ((int)(((byte)(81))))); + this.uiButton3.FillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(168)))), ((int)(((byte)(35))))); + this.uiButton3.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiButton3.Location = new System.Drawing.Point(258, 50); + this.uiButton3.Name = "uiButton3"; + this.uiButton3.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(110)))), ((int)(((byte)(190)))), ((int)(((byte)(40))))); + this.uiButton3.RectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(136)))), ((int)(((byte)(202)))), ((int)(((byte)(81))))); + this.uiButton3.RectPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(168)))), ((int)(((byte)(35))))); + this.uiButton3.Size = new System.Drawing.Size(100, 35); + this.uiButton3.Style = Sunny.UI.UIStyle.Green; + this.uiButton3.StyleCustomMode = true; + this.uiButton3.TabIndex = 2; + this.uiButton3.Text = "Green"; + // + // uiButton4 + // + this.uiButton4.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiButton4.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.uiButton4.FillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(232)))), ((int)(((byte)(127)))), ((int)(((byte)(128))))); + this.uiButton4.FillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(202)))), ((int)(((byte)(87)))), ((int)(((byte)(89))))); + this.uiButton4.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiButton4.Location = new System.Drawing.Point(600, 50); + this.uiButton4.Name = "uiButton4"; + this.uiButton4.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.uiButton4.RectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(232)))), ((int)(((byte)(127)))), ((int)(((byte)(128))))); + this.uiButton4.RectPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(202)))), ((int)(((byte)(87)))), ((int)(((byte)(89))))); + this.uiButton4.Size = new System.Drawing.Size(100, 35); + this.uiButton4.Style = Sunny.UI.UIStyle.Red; + this.uiButton4.StyleCustomMode = true; + this.uiButton4.TabIndex = 5; + this.uiButton4.Text = "Red"; + // + // uiButton5 + // + this.uiButton5.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiButton5.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(155)))), ((int)(((byte)(40))))); + this.uiButton5.FillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(223)))), ((int)(((byte)(174)))), ((int)(((byte)(86))))); + this.uiButton5.FillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(137)))), ((int)(((byte)(43))))); + this.uiButton5.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiButton5.Location = new System.Drawing.Point(486, 50); + this.uiButton5.Name = "uiButton5"; + this.uiButton5.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(155)))), ((int)(((byte)(40))))); + this.uiButton5.RectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(223)))), ((int)(((byte)(174)))), ((int)(((byte)(86))))); + this.uiButton5.RectPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(137)))), ((int)(((byte)(43))))); + this.uiButton5.Size = new System.Drawing.Size(100, 35); + this.uiButton5.Style = Sunny.UI.UIStyle.Orange; + this.uiButton5.StyleCustomMode = true; + this.uiButton5.TabIndex = 4; + this.uiButton5.Text = "Orange"; + // + // uiButton6 + // + this.uiButton6.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiButton6.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(140)))), ((int)(((byte)(140)))), ((int)(((byte)(140))))); + this.uiButton6.FillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(158)))), ((int)(((byte)(160)))), ((int)(((byte)(165))))); + this.uiButton6.FillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(121)))), ((int)(((byte)(123)))), ((int)(((byte)(129))))); + this.uiButton6.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiButton6.Location = new System.Drawing.Point(372, 50); + this.uiButton6.Name = "uiButton6"; + this.uiButton6.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(140)))), ((int)(((byte)(140)))), ((int)(((byte)(140))))); + this.uiButton6.RectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(158)))), ((int)(((byte)(160)))), ((int)(((byte)(165))))); + this.uiButton6.RectPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(121)))), ((int)(((byte)(123)))), ((int)(((byte)(129))))); + this.uiButton6.Size = new System.Drawing.Size(100, 35); + this.uiButton6.Style = Sunny.UI.UIStyle.Gray; + this.uiButton6.StyleCustomMode = true; + this.uiButton6.TabIndex = 3; + this.uiButton6.Text = "Gray"; + // + // uiButton7 + // + this.uiButton7.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiButton7.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(251)))), ((int)(((byte)(238)))), ((int)(((byte)(238))))); + this.uiButton7.FillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.uiButton7.FillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(202)))), ((int)(((byte)(87)))), ((int)(((byte)(89))))); + this.uiButton7.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiButton7.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.uiButton7.Location = new System.Drawing.Point(600, 100); + this.uiButton7.Name = "uiButton7"; + this.uiButton7.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.uiButton7.RectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.uiButton7.RectPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(202)))), ((int)(((byte)(87)))), ((int)(((byte)(89))))); + this.uiButton7.Size = new System.Drawing.Size(100, 35); + this.uiButton7.Style = Sunny.UI.UIStyle.LightRed; + this.uiButton7.StyleCustomMode = true; + this.uiButton7.TabIndex = 11; + this.uiButton7.Text = "LightRed"; + // + // uiButton8 + // + this.uiButton8.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiButton8.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(251)))), ((int)(((byte)(245)))), ((int)(((byte)(233))))); + this.uiButton8.FillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(155)))), ((int)(((byte)(40))))); + this.uiButton8.FillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(137)))), ((int)(((byte)(43))))); + this.uiButton8.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiButton8.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(155)))), ((int)(((byte)(40))))); + this.uiButton8.Location = new System.Drawing.Point(486, 100); + this.uiButton8.Name = "uiButton8"; + this.uiButton8.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(155)))), ((int)(((byte)(40))))); + this.uiButton8.RectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(155)))), ((int)(((byte)(40))))); + this.uiButton8.RectPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(137)))), ((int)(((byte)(43))))); + this.uiButton8.Size = new System.Drawing.Size(100, 35); + this.uiButton8.Style = Sunny.UI.UIStyle.LightOrange; + this.uiButton8.StyleCustomMode = true; + this.uiButton8.TabIndex = 10; + this.uiButton8.Text = "LightOrange"; + // + // uiButton9 + // + this.uiButton9.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiButton9.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(242)))), ((int)(((byte)(242)))), ((int)(((byte)(244))))); + this.uiButton9.FillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(140)))), ((int)(((byte)(140)))), ((int)(((byte)(140))))); + this.uiButton9.FillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(121)))), ((int)(((byte)(123)))), ((int)(((byte)(129))))); + this.uiButton9.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiButton9.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(140)))), ((int)(((byte)(140)))), ((int)(((byte)(140))))); + this.uiButton9.Location = new System.Drawing.Point(372, 100); + this.uiButton9.Name = "uiButton9"; + this.uiButton9.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(140)))), ((int)(((byte)(140)))), ((int)(((byte)(140))))); + this.uiButton9.RectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(140)))), ((int)(((byte)(140)))), ((int)(((byte)(140))))); + this.uiButton9.RectPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(121)))), ((int)(((byte)(123)))), ((int)(((byte)(129))))); + this.uiButton9.Size = new System.Drawing.Size(100, 35); + this.uiButton9.Style = Sunny.UI.UIStyle.LightGray; + this.uiButton9.StyleCustomMode = true; + this.uiButton9.TabIndex = 9; + this.uiButton9.Text = "LightGray"; + // + // uiButton10 + // + this.uiButton10.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiButton10.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(239)))), ((int)(((byte)(248)))), ((int)(((byte)(232))))); + this.uiButton10.FillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(110)))), ((int)(((byte)(190)))), ((int)(((byte)(40))))); + this.uiButton10.FillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(168)))), ((int)(((byte)(35))))); + this.uiButton10.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiButton10.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(110)))), ((int)(((byte)(190)))), ((int)(((byte)(40))))); + this.uiButton10.Location = new System.Drawing.Point(258, 100); + this.uiButton10.Name = "uiButton10"; + this.uiButton10.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(110)))), ((int)(((byte)(190)))), ((int)(((byte)(40))))); + this.uiButton10.RectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(110)))), ((int)(((byte)(190)))), ((int)(((byte)(40))))); + this.uiButton10.RectPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(168)))), ((int)(((byte)(35))))); + this.uiButton10.Size = new System.Drawing.Size(100, 35); + this.uiButton10.Style = Sunny.UI.UIStyle.LightGreen; + this.uiButton10.StyleCustomMode = true; + this.uiButton10.TabIndex = 8; + this.uiButton10.Text = "LightGreen"; + // + // uiButton11 + // + this.uiButton11.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiButton11.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiButton11.Location = new System.Drawing.Point(144, 100); + this.uiButton11.Name = "uiButton11"; + this.uiButton11.Size = new System.Drawing.Size(100, 35); + this.uiButton11.StyleCustomMode = true; + this.uiButton11.TabIndex = 7; + this.uiButton11.Text = "LightBlue"; + // + // uiButton12 + // + this.uiButton12.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiButton12.FillColor = System.Drawing.Color.White; + this.uiButton12.FillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.uiButton12.FillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.uiButton12.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiButton12.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(96)))), ((int)(((byte)(98)))), ((int)(((byte)(102))))); + this.uiButton12.ForeHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255))))); + this.uiButton12.ForePressColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(131)))), ((int)(((byte)(229))))); + this.uiButton12.Location = new System.Drawing.Point(30, 100); + this.uiButton12.Name = "uiButton12"; + this.uiButton12.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.uiButton12.RectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(197)))), ((int)(((byte)(222)))), ((int)(((byte)(255))))); + this.uiButton12.Size = new System.Drawing.Size(100, 35); + this.uiButton12.Style = Sunny.UI.UIStyle.White; + this.uiButton12.StyleCustomMode = true; + this.uiButton12.TabIndex = 6; + this.uiButton12.Text = "White"; + // + // uiButton13 + // + this.uiButton13.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiButton13.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.uiButton13.FillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(232)))), ((int)(((byte)(127)))), ((int)(((byte)(128))))); + this.uiButton13.FillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(202)))), ((int)(((byte)(87)))), ((int)(((byte)(89))))); + this.uiButton13.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiButton13.Location = new System.Drawing.Point(600, 150); + this.uiButton13.Name = "uiButton13"; + this.uiButton13.Radius = 35; + this.uiButton13.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.uiButton13.RectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(232)))), ((int)(((byte)(127)))), ((int)(((byte)(128))))); + this.uiButton13.RectPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(202)))), ((int)(((byte)(87)))), ((int)(((byte)(89))))); + this.uiButton13.Size = new System.Drawing.Size(100, 35); + this.uiButton13.Style = Sunny.UI.UIStyle.Red; + this.uiButton13.StyleCustomMode = true; + this.uiButton13.TabIndex = 17; + this.uiButton13.Text = "Red"; + // + // uiButton14 + // + this.uiButton14.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiButton14.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(155)))), ((int)(((byte)(40))))); + this.uiButton14.FillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(223)))), ((int)(((byte)(174)))), ((int)(((byte)(86))))); + this.uiButton14.FillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(137)))), ((int)(((byte)(43))))); + this.uiButton14.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiButton14.Location = new System.Drawing.Point(486, 150); + this.uiButton14.Name = "uiButton14"; + this.uiButton14.Radius = 35; + this.uiButton14.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(155)))), ((int)(((byte)(40))))); + this.uiButton14.RectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(223)))), ((int)(((byte)(174)))), ((int)(((byte)(86))))); + this.uiButton14.RectPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(137)))), ((int)(((byte)(43))))); + this.uiButton14.Size = new System.Drawing.Size(100, 35); + this.uiButton14.Style = Sunny.UI.UIStyle.Orange; + this.uiButton14.StyleCustomMode = true; + this.uiButton14.TabIndex = 16; + this.uiButton14.Text = "Orange"; + // + // uiButton15 + // + this.uiButton15.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiButton15.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(140)))), ((int)(((byte)(140)))), ((int)(((byte)(140))))); + this.uiButton15.FillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(158)))), ((int)(((byte)(160)))), ((int)(((byte)(165))))); + this.uiButton15.FillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(121)))), ((int)(((byte)(123)))), ((int)(((byte)(129))))); + this.uiButton15.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiButton15.Location = new System.Drawing.Point(372, 150); + this.uiButton15.Name = "uiButton15"; + this.uiButton15.Radius = 35; + this.uiButton15.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(140)))), ((int)(((byte)(140)))), ((int)(((byte)(140))))); + this.uiButton15.RectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(158)))), ((int)(((byte)(160)))), ((int)(((byte)(165))))); + this.uiButton15.RectPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(121)))), ((int)(((byte)(123)))), ((int)(((byte)(129))))); + this.uiButton15.Size = new System.Drawing.Size(100, 35); + this.uiButton15.Style = Sunny.UI.UIStyle.Gray; + this.uiButton15.StyleCustomMode = true; + this.uiButton15.TabIndex = 15; + this.uiButton15.Text = "Gray"; + // + // uiButton16 + // + this.uiButton16.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiButton16.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(110)))), ((int)(((byte)(190)))), ((int)(((byte)(40))))); + this.uiButton16.FillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(136)))), ((int)(((byte)(202)))), ((int)(((byte)(81))))); + this.uiButton16.FillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(168)))), ((int)(((byte)(35))))); + this.uiButton16.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiButton16.Location = new System.Drawing.Point(258, 150); + this.uiButton16.Name = "uiButton16"; + this.uiButton16.Radius = 35; + this.uiButton16.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(110)))), ((int)(((byte)(190)))), ((int)(((byte)(40))))); + this.uiButton16.RectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(136)))), ((int)(((byte)(202)))), ((int)(((byte)(81))))); + this.uiButton16.RectPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(168)))), ((int)(((byte)(35))))); + this.uiButton16.Size = new System.Drawing.Size(100, 35); + this.uiButton16.Style = Sunny.UI.UIStyle.Green; + this.uiButton16.StyleCustomMode = true; + this.uiButton16.TabIndex = 14; + this.uiButton16.Text = "Green"; + // + // uiButton17 + // + this.uiButton17.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiButton17.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiButton17.Location = new System.Drawing.Point(144, 150); + this.uiButton17.Name = "uiButton17"; + this.uiButton17.Radius = 35; + this.uiButton17.Size = new System.Drawing.Size(100, 35); + this.uiButton17.StyleCustomMode = true; + this.uiButton17.TabIndex = 13; + this.uiButton17.Text = "Blue"; + // + // uiButton18 + // + this.uiButton18.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiButton18.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiButton18.Location = new System.Drawing.Point(30, 150); + this.uiButton18.Name = "uiButton18"; + this.uiButton18.Radius = 35; + this.uiButton18.Size = new System.Drawing.Size(100, 35); + this.uiButton18.TabIndex = 12; + this.uiButton18.Text = "Round"; + // + // uiLine1 + // + this.uiLine1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLine1.Location = new System.Drawing.Point(30, 20); + this.uiLine1.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine1.Name = "uiLine1"; + this.uiLine1.Size = new System.Drawing.Size(670, 20); + this.uiLine1.TabIndex = 18; + this.uiLine1.Text = "UIButton"; + this.uiLine1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiLine2 + // + this.uiLine2.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLine2.Location = new System.Drawing.Point(30, 200); + this.uiLine2.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine2.Name = "uiLine2"; + this.uiLine2.Size = new System.Drawing.Size(670, 16); + this.uiLine2.TabIndex = 19; + this.uiLine2.Text = "UISymbolButton"; + this.uiLine2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiSymbolButton1 + // + this.uiSymbolButton1.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiSymbolButton1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiSymbolButton1.Location = new System.Drawing.Point(30, 230); + this.uiSymbolButton1.Name = "uiSymbolButton1"; + this.uiSymbolButton1.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0); + this.uiSymbolButton1.Size = new System.Drawing.Size(100, 35); + this.uiSymbolButton1.StyleCustomMode = true; + this.uiSymbolButton1.TabIndex = 20; + this.uiSymbolButton1.Text = "OK"; + // + // uiSymbolButton2 + // + this.uiSymbolButton2.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiSymbolButton2.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.uiSymbolButton2.FillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(232)))), ((int)(((byte)(127)))), ((int)(((byte)(128))))); + this.uiSymbolButton2.FillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(202)))), ((int)(((byte)(87)))), ((int)(((byte)(89))))); + this.uiSymbolButton2.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiSymbolButton2.Location = new System.Drawing.Point(144, 230); + this.uiSymbolButton2.Name = "uiSymbolButton2"; + this.uiSymbolButton2.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0); + this.uiSymbolButton2.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.uiSymbolButton2.RectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(232)))), ((int)(((byte)(127)))), ((int)(((byte)(128))))); + this.uiSymbolButton2.RectPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(202)))), ((int)(((byte)(87)))), ((int)(((byte)(89))))); + this.uiSymbolButton2.Size = new System.Drawing.Size(100, 35); + this.uiSymbolButton2.Style = Sunny.UI.UIStyle.Red; + this.uiSymbolButton2.StyleCustomMode = true; + this.uiSymbolButton2.Symbol = 61453; + this.uiSymbolButton2.TabIndex = 21; + this.uiSymbolButton2.Text = "Cancel"; + // + // uiSymbolButton3 + // + this.uiSymbolButton3.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiSymbolButton3.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(110)))), ((int)(((byte)(190)))), ((int)(((byte)(40))))); + this.uiSymbolButton3.FillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(136)))), ((int)(((byte)(202)))), ((int)(((byte)(81))))); + this.uiSymbolButton3.FillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(168)))), ((int)(((byte)(35))))); + this.uiSymbolButton3.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiSymbolButton3.Location = new System.Drawing.Point(372, 230); + this.uiSymbolButton3.Name = "uiSymbolButton3"; + this.uiSymbolButton3.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0); + this.uiSymbolButton3.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(110)))), ((int)(((byte)(190)))), ((int)(((byte)(40))))); + this.uiSymbolButton3.RectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(136)))), ((int)(((byte)(202)))), ((int)(((byte)(81))))); + this.uiSymbolButton3.RectPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(168)))), ((int)(((byte)(35))))); + this.uiSymbolButton3.Size = new System.Drawing.Size(100, 35); + this.uiSymbolButton3.Style = Sunny.UI.UIStyle.Green; + this.uiSymbolButton3.StyleCustomMode = true; + this.uiSymbolButton3.Symbol = 61530; + this.uiSymbolButton3.TabIndex = 23; + this.uiSymbolButton3.Text = "Success"; + // + // uiSymbolButton4 + // + this.uiSymbolButton4.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiSymbolButton4.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiSymbolButton4.Location = new System.Drawing.Point(258, 230); + this.uiSymbolButton4.Name = "uiSymbolButton4"; + this.uiSymbolButton4.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0); + this.uiSymbolButton4.Size = new System.Drawing.Size(100, 35); + this.uiSymbolButton4.StyleCustomMode = true; + this.uiSymbolButton4.Symbol = 61529; + this.uiSymbolButton4.TabIndex = 22; + this.uiSymbolButton4.Text = "Query"; + // + // uiSymbolButton5 + // + this.uiSymbolButton5.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiSymbolButton5.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(155)))), ((int)(((byte)(40))))); + this.uiSymbolButton5.FillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(223)))), ((int)(((byte)(174)))), ((int)(((byte)(86))))); + this.uiSymbolButton5.FillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(137)))), ((int)(((byte)(43))))); + this.uiSymbolButton5.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiSymbolButton5.Location = new System.Drawing.Point(486, 230); + this.uiSymbolButton5.Name = "uiSymbolButton5"; + this.uiSymbolButton5.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0); + this.uiSymbolButton5.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(155)))), ((int)(((byte)(40))))); + this.uiSymbolButton5.RectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(223)))), ((int)(((byte)(174)))), ((int)(((byte)(86))))); + this.uiSymbolButton5.RectPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(137)))), ((int)(((byte)(43))))); + this.uiSymbolButton5.Size = new System.Drawing.Size(100, 35); + this.uiSymbolButton5.Style = Sunny.UI.UIStyle.Orange; + this.uiSymbolButton5.StyleCustomMode = true; + this.uiSymbolButton5.Symbol = 61553; + this.uiSymbolButton5.TabIndex = 24; + this.uiSymbolButton5.Text = "Warn"; + // + // uiSymbolButton6 + // + this.uiSymbolButton6.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiSymbolButton6.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.uiSymbolButton6.FillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(232)))), ((int)(((byte)(127)))), ((int)(((byte)(128))))); + this.uiSymbolButton6.FillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(202)))), ((int)(((byte)(87)))), ((int)(((byte)(89))))); + this.uiSymbolButton6.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiSymbolButton6.Location = new System.Drawing.Point(600, 230); + this.uiSymbolButton6.Name = "uiSymbolButton6"; + this.uiSymbolButton6.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0); + this.uiSymbolButton6.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.uiSymbolButton6.RectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(232)))), ((int)(((byte)(127)))), ((int)(((byte)(128))))); + this.uiSymbolButton6.RectPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(202)))), ((int)(((byte)(87)))), ((int)(((byte)(89))))); + this.uiSymbolButton6.Size = new System.Drawing.Size(100, 35); + this.uiSymbolButton6.Style = Sunny.UI.UIStyle.Red; + this.uiSymbolButton6.StyleCustomMode = true; + this.uiSymbolButton6.Symbol = 61532; + this.uiSymbolButton6.TabIndex = 25; + this.uiSymbolButton6.Text = "Error"; + // + // uiSymbolButton7 + // + this.uiSymbolButton7.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiSymbolButton7.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.uiSymbolButton7.FillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(232)))), ((int)(((byte)(127)))), ((int)(((byte)(128))))); + this.uiSymbolButton7.FillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(202)))), ((int)(((byte)(87)))), ((int)(((byte)(89))))); + this.uiSymbolButton7.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiSymbolButton7.IsCircle = true; + this.uiSymbolButton7.Location = new System.Drawing.Point(235, 280); + this.uiSymbolButton7.Name = "uiSymbolButton7"; + this.uiSymbolButton7.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0); + this.uiSymbolButton7.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.uiSymbolButton7.RectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(232)))), ((int)(((byte)(127)))), ((int)(((byte)(128))))); + this.uiSymbolButton7.RectPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(202)))), ((int)(((byte)(87)))), ((int)(((byte)(89))))); + this.uiSymbolButton7.Size = new System.Drawing.Size(35, 35); + this.uiSymbolButton7.Style = Sunny.UI.UIStyle.Red; + this.uiSymbolButton7.StyleCustomMode = true; + this.uiSymbolButton7.Symbol = 61809; + this.uiSymbolButton7.TabIndex = 31; + // + // uiSymbolButton8 + // + this.uiSymbolButton8.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiSymbolButton8.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(155)))), ((int)(((byte)(40))))); + this.uiSymbolButton8.FillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(223)))), ((int)(((byte)(174)))), ((int)(((byte)(86))))); + this.uiSymbolButton8.FillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(137)))), ((int)(((byte)(43))))); + this.uiSymbolButton8.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiSymbolButton8.IsCircle = true; + this.uiSymbolButton8.Location = new System.Drawing.Point(194, 280); + this.uiSymbolButton8.Name = "uiSymbolButton8"; + this.uiSymbolButton8.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0); + this.uiSymbolButton8.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(155)))), ((int)(((byte)(40))))); + this.uiSymbolButton8.RectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(223)))), ((int)(((byte)(174)))), ((int)(((byte)(86))))); + this.uiSymbolButton8.RectPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(137)))), ((int)(((byte)(43))))); + this.uiSymbolButton8.Size = new System.Drawing.Size(35, 35); + this.uiSymbolButton8.Style = Sunny.UI.UIStyle.Orange; + this.uiSymbolButton8.StyleCustomMode = true; + this.uiSymbolButton8.Symbol = 61445; + this.uiSymbolButton8.TabIndex = 30; + // + // uiSymbolButton9 + // + this.uiSymbolButton9.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiSymbolButton9.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(110)))), ((int)(((byte)(190)))), ((int)(((byte)(40))))); + this.uiSymbolButton9.FillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(136)))), ((int)(((byte)(202)))), ((int)(((byte)(81))))); + this.uiSymbolButton9.FillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(168)))), ((int)(((byte)(35))))); + this.uiSymbolButton9.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiSymbolButton9.IsCircle = true; + this.uiSymbolButton9.Location = new System.Drawing.Point(153, 280); + this.uiSymbolButton9.Name = "uiSymbolButton9"; + this.uiSymbolButton9.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0); + this.uiSymbolButton9.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(110)))), ((int)(((byte)(190)))), ((int)(((byte)(40))))); + this.uiSymbolButton9.RectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(136)))), ((int)(((byte)(202)))), ((int)(((byte)(81))))); + this.uiSymbolButton9.RectPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(168)))), ((int)(((byte)(35))))); + this.uiSymbolButton9.Size = new System.Drawing.Size(35, 35); + this.uiSymbolButton9.Style = Sunny.UI.UIStyle.Green; + this.uiSymbolButton9.StyleCustomMode = true; + this.uiSymbolButton9.Symbol = 57607; + this.uiSymbolButton9.TabIndex = 29; + // + // uiSymbolButton10 + // + this.uiSymbolButton10.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiSymbolButton10.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiSymbolButton10.IsCircle = true; + this.uiSymbolButton10.Location = new System.Drawing.Point(112, 280); + this.uiSymbolButton10.Name = "uiSymbolButton10"; + this.uiSymbolButton10.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0); + this.uiSymbolButton10.Size = new System.Drawing.Size(35, 35); + this.uiSymbolButton10.StyleCustomMode = true; + this.uiSymbolButton10.TabIndex = 28; + // + // uiSymbolButton11 + // + this.uiSymbolButton11.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiSymbolButton11.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.uiSymbolButton11.FillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(232)))), ((int)(((byte)(127)))), ((int)(((byte)(128))))); + this.uiSymbolButton11.FillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(202)))), ((int)(((byte)(87)))), ((int)(((byte)(89))))); + this.uiSymbolButton11.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiSymbolButton11.IsCircle = true; + this.uiSymbolButton11.Location = new System.Drawing.Point(71, 280); + this.uiSymbolButton11.Name = "uiSymbolButton11"; + this.uiSymbolButton11.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0); + this.uiSymbolButton11.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.uiSymbolButton11.RectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(232)))), ((int)(((byte)(127)))), ((int)(((byte)(128))))); + this.uiSymbolButton11.RectPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(202)))), ((int)(((byte)(87)))), ((int)(((byte)(89))))); + this.uiSymbolButton11.Size = new System.Drawing.Size(35, 35); + this.uiSymbolButton11.Style = Sunny.UI.UIStyle.Red; + this.uiSymbolButton11.StyleCustomMode = true; + this.uiSymbolButton11.Symbol = 61508; + this.uiSymbolButton11.TabIndex = 27; + // + // uiSymbolButton12 + // + this.uiSymbolButton12.CircleRectWidth = 2; + this.uiSymbolButton12.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiSymbolButton12.FillColor = System.Drawing.Color.White; + this.uiSymbolButton12.FillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.uiSymbolButton12.FillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.uiSymbolButton12.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiSymbolButton12.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(96)))), ((int)(((byte)(98)))), ((int)(((byte)(102))))); + this.uiSymbolButton12.ForeHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255))))); + this.uiSymbolButton12.ForePressColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(131)))), ((int)(((byte)(229))))); + this.uiSymbolButton12.IsCircle = true; + this.uiSymbolButton12.Location = new System.Drawing.Point(30, 280); + this.uiSymbolButton12.Name = "uiSymbolButton12"; + this.uiSymbolButton12.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0); + this.uiSymbolButton12.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.uiSymbolButton12.RectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(197)))), ((int)(((byte)(222)))), ((int)(((byte)(255))))); + this.uiSymbolButton12.Size = new System.Drawing.Size(35, 35); + this.uiSymbolButton12.Style = Sunny.UI.UIStyle.White; + this.uiSymbolButton12.StyleCustomMode = true; + this.uiSymbolButton12.Symbol = 61442; + this.uiSymbolButton12.TabIndex = 26; + // + // uiLine3 + // + this.uiLine3.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLine3.Location = new System.Drawing.Point(30, 330); + this.uiLine3.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine3.Name = "uiLine3"; + this.uiLine3.Size = new System.Drawing.Size(670, 20); + this.uiLine3.TabIndex = 32; + this.uiLine3.Text = "UISymbolButton 按钮组"; + this.uiLine3.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiSymbolButton13 + // + this.uiSymbolButton13.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiSymbolButton13.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiSymbolButton13.Location = new System.Drawing.Point(260, 360); + this.uiSymbolButton13.Name = "uiSymbolButton13"; + this.uiSymbolButton13.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0); + this.uiSymbolButton13.RadiusSides = Sunny.UI.UICornerRadiusSides.None; + this.uiSymbolButton13.RectSides = ((System.Windows.Forms.ToolStripStatusLabelBorderSides)(((System.Windows.Forms.ToolStripStatusLabelBorderSides.Top | System.Windows.Forms.ToolStripStatusLabelBorderSides.Right) + | System.Windows.Forms.ToolStripStatusLabelBorderSides.Bottom))); + this.uiSymbolButton13.Size = new System.Drawing.Size(46, 35); + this.uiSymbolButton13.Symbol = 61518; + this.uiSymbolButton13.TabIndex = 38; + // + // uiSymbolButton14 + // + this.uiSymbolButton14.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiSymbolButton14.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiSymbolButton14.Location = new System.Drawing.Point(214, 360); + this.uiSymbolButton14.Name = "uiSymbolButton14"; + this.uiSymbolButton14.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0); + this.uiSymbolButton14.RadiusSides = Sunny.UI.UICornerRadiusSides.None; + this.uiSymbolButton14.RectSides = ((System.Windows.Forms.ToolStripStatusLabelBorderSides)(((System.Windows.Forms.ToolStripStatusLabelBorderSides.Top | System.Windows.Forms.ToolStripStatusLabelBorderSides.Right) + | System.Windows.Forms.ToolStripStatusLabelBorderSides.Bottom))); + this.uiSymbolButton14.Size = new System.Drawing.Size(46, 35); + this.uiSymbolButton14.Symbol = 61514; + this.uiSymbolButton14.TabIndex = 37; + // + // uiSymbolButton15 + // + this.uiSymbolButton15.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiSymbolButton15.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiSymbolButton15.Location = new System.Drawing.Point(168, 360); + this.uiSymbolButton15.Name = "uiSymbolButton15"; + this.uiSymbolButton15.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0); + this.uiSymbolButton15.RadiusSides = Sunny.UI.UICornerRadiusSides.None; + this.uiSymbolButton15.RectSides = ((System.Windows.Forms.ToolStripStatusLabelBorderSides)(((System.Windows.Forms.ToolStripStatusLabelBorderSides.Top | System.Windows.Forms.ToolStripStatusLabelBorderSides.Right) + | System.Windows.Forms.ToolStripStatusLabelBorderSides.Bottom))); + this.uiSymbolButton15.Size = new System.Drawing.Size(46, 35); + this.uiSymbolButton15.Symbol = 61513; + this.uiSymbolButton15.TabIndex = 36; + // + // uiSymbolButton16 + // + this.uiSymbolButton16.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiSymbolButton16.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiSymbolButton16.Location = new System.Drawing.Point(122, 360); + this.uiSymbolButton16.Name = "uiSymbolButton16"; + this.uiSymbolButton16.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0); + this.uiSymbolButton16.RadiusSides = Sunny.UI.UICornerRadiusSides.None; + this.uiSymbolButton16.RectSides = ((System.Windows.Forms.ToolStripStatusLabelBorderSides)(((System.Windows.Forms.ToolStripStatusLabelBorderSides.Top | System.Windows.Forms.ToolStripStatusLabelBorderSides.Right) + | System.Windows.Forms.ToolStripStatusLabelBorderSides.Bottom))); + this.uiSymbolButton16.Size = new System.Drawing.Size(46, 35); + this.uiSymbolButton16.Symbol = 61517; + this.uiSymbolButton16.TabIndex = 35; + // + // uiSymbolButton17 + // + this.uiSymbolButton17.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiSymbolButton17.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiSymbolButton17.Location = new System.Drawing.Point(76, 360); + this.uiSymbolButton17.Name = "uiSymbolButton17"; + this.uiSymbolButton17.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0); + this.uiSymbolButton17.RadiusSides = Sunny.UI.UICornerRadiusSides.None; + this.uiSymbolButton17.RectSides = ((System.Windows.Forms.ToolStripStatusLabelBorderSides)(((System.Windows.Forms.ToolStripStatusLabelBorderSides.Top | System.Windows.Forms.ToolStripStatusLabelBorderSides.Right) + | System.Windows.Forms.ToolStripStatusLabelBorderSides.Bottom))); + this.uiSymbolButton17.Size = new System.Drawing.Size(46, 35); + this.uiSymbolButton17.Symbol = 61516; + this.uiSymbolButton17.TabIndex = 34; + // + // uiSymbolButton18 + // + this.uiSymbolButton18.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiSymbolButton18.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiSymbolButton18.Location = new System.Drawing.Point(30, 360); + this.uiSymbolButton18.Name = "uiSymbolButton18"; + this.uiSymbolButton18.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0); + 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.TabIndex = 33; + // + // uiSymbolButton19 + // + this.uiSymbolButton19.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiSymbolButton19.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiSymbolButton19.Location = new System.Drawing.Point(516, 360); + this.uiSymbolButton19.Name = "uiSymbolButton19"; + this.uiSymbolButton19.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0); + 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.TabIndex = 41; + // + // uiSymbolButton20 + // + this.uiSymbolButton20.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiSymbolButton20.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiSymbolButton20.Location = new System.Drawing.Point(352, 360); + this.uiSymbolButton20.Name = "uiSymbolButton20"; + this.uiSymbolButton20.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0); + this.uiSymbolButton20.RadiusSides = ((Sunny.UI.UICornerRadiusSides)((Sunny.UI.UICornerRadiusSides.RightTop | Sunny.UI.UICornerRadiusSides.RightBottom))); + this.uiSymbolButton20.RectSides = ((System.Windows.Forms.ToolStripStatusLabelBorderSides)(((System.Windows.Forms.ToolStripStatusLabelBorderSides.Top | System.Windows.Forms.ToolStripStatusLabelBorderSides.Right) + | System.Windows.Forms.ToolStripStatusLabelBorderSides.Bottom))); + this.uiSymbolButton20.Size = new System.Drawing.Size(46, 35); + this.uiSymbolButton20.Symbol = 61522; + this.uiSymbolButton20.TabIndex = 40; + // + // uiSymbolButton21 + // + this.uiSymbolButton21.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiSymbolButton21.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiSymbolButton21.Location = new System.Drawing.Point(306, 360); + this.uiSymbolButton21.Name = "uiSymbolButton21"; + this.uiSymbolButton21.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0); + this.uiSymbolButton21.RadiusSides = Sunny.UI.UICornerRadiusSides.None; + this.uiSymbolButton21.RectSides = ((System.Windows.Forms.ToolStripStatusLabelBorderSides)(((System.Windows.Forms.ToolStripStatusLabelBorderSides.Top | System.Windows.Forms.ToolStripStatusLabelBorderSides.Right) + | System.Windows.Forms.ToolStripStatusLabelBorderSides.Bottom))); + this.uiSymbolButton21.Size = new System.Drawing.Size(46, 35); + this.uiSymbolButton21.Symbol = 61520; + this.uiSymbolButton21.TabIndex = 39; + // + // uiSymbolButton22 + // + this.uiSymbolButton22.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiSymbolButton22.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiSymbolButton22.Location = new System.Drawing.Point(562, 360); + this.uiSymbolButton22.Name = "uiSymbolButton22"; + this.uiSymbolButton22.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0); + this.uiSymbolButton22.RadiusSides = Sunny.UI.UICornerRadiusSides.None; + this.uiSymbolButton22.RectSides = ((System.Windows.Forms.ToolStripStatusLabelBorderSides)(((System.Windows.Forms.ToolStripStatusLabelBorderSides.Top | System.Windows.Forms.ToolStripStatusLabelBorderSides.Right) + | System.Windows.Forms.ToolStripStatusLabelBorderSides.Bottom))); + this.uiSymbolButton22.Size = new System.Drawing.Size(46, 35); + this.uiSymbolButton22.Symbol = 61508; + this.uiSymbolButton22.TabIndex = 42; + // + // uiSymbolButton23 + // + this.uiSymbolButton23.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiSymbolButton23.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiSymbolButton23.Location = new System.Drawing.Point(608, 360); + this.uiSymbolButton23.Name = "uiSymbolButton23"; + this.uiSymbolButton23.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0); + this.uiSymbolButton23.RadiusSides = Sunny.UI.UICornerRadiusSides.None; + this.uiSymbolButton23.RectSides = ((System.Windows.Forms.ToolStripStatusLabelBorderSides)(((System.Windows.Forms.ToolStripStatusLabelBorderSides.Top | System.Windows.Forms.ToolStripStatusLabelBorderSides.Right) + | System.Windows.Forms.ToolStripStatusLabelBorderSides.Bottom))); + this.uiSymbolButton23.Size = new System.Drawing.Size(46, 35); + this.uiSymbolButton23.Symbol = 61544; + this.uiSymbolButton23.TabIndex = 43; + // + // uiSymbolButton24 + // + this.uiSymbolButton24.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiSymbolButton24.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiSymbolButton24.Location = new System.Drawing.Point(654, 360); + this.uiSymbolButton24.Name = "uiSymbolButton24"; + this.uiSymbolButton24.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0); + this.uiSymbolButton24.RadiusSides = ((Sunny.UI.UICornerRadiusSides)((Sunny.UI.UICornerRadiusSides.RightTop | Sunny.UI.UICornerRadiusSides.RightBottom))); + 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.TabIndex = 44; + // + // uiSwitch1 + // + this.uiSwitch1.Active = true; + this.uiSwitch1.ActiveText = "On"; + this.uiSwitch1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiSwitch1.InActiveColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(192)))), ((int)(((byte)(192))))); + this.uiSwitch1.InActiveText = "Off"; + this.uiSwitch1.Location = new System.Drawing.Point(30, 441); + this.uiSwitch1.Name = "uiSwitch1"; + this.uiSwitch1.Size = new System.Drawing.Size(75, 29); + this.uiSwitch1.TabIndex = 45; + this.uiSwitch1.Text = "uiSwitch1"; + // + // uiLine4 + // + this.uiLine4.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLine4.Location = new System.Drawing.Point(30, 412); + this.uiLine4.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine4.Name = "uiLine4"; + this.uiLine4.Size = new System.Drawing.Size(312, 20); + this.uiLine4.TabIndex = 46; + this.uiLine4.Text = "UISwitch"; + this.uiLine4.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiSwitch2 + // + this.uiSwitch2.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiSwitch2.InActiveColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(192)))), ((int)(((byte)(192))))); + this.uiSwitch2.Location = new System.Drawing.Point(112, 441); + this.uiSwitch2.Name = "uiSwitch2"; + this.uiSwitch2.RectSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.None; + this.uiSwitch2.Size = new System.Drawing.Size(75, 29); + this.uiSwitch2.TabIndex = 47; + this.uiSwitch2.Text = "uiSwitch2"; + // + // uiLine5 + // + this.uiLine5.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLine5.Location = new System.Drawing.Point(388, 412); + this.uiLine5.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine5.Name = "uiLine5"; + this.uiLine5.Size = new System.Drawing.Size(312, 20); + this.uiLine5.TabIndex = 48; + this.uiLine5.Text = "UIImageButton"; + this.uiLine5.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiImageButton1 + // + this.uiImageButton1.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiImageButton1.Image = global::Sunny.UI.Demo.Properties.Resources.dashboard0; + this.uiImageButton1.ImageHover = global::Sunny.UI.Demo.Properties.Resources.dashboard; + this.uiImageButton1.ImagePress = global::Sunny.UI.Demo.Properties.Resources.dashboard0; + this.uiImageButton1.Location = new System.Drawing.Point(395, 438); + this.uiImageButton1.Name = "uiImageButton1"; + this.uiImageButton1.Size = new System.Drawing.Size(92, 35); + this.uiImageButton1.TabIndex = 49; + this.uiImageButton1.TabStop = false; + this.uiImageButton1.Text = "Home"; + this.uiImageButton1.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // uiImageButton2 + // + this.uiImageButton2.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiImageButton2.Image = global::Sunny.UI.Demo.Properties.Resources.relationship0; + this.uiImageButton2.ImageHover = global::Sunny.UI.Demo.Properties.Resources.relationship; + this.uiImageButton2.ImagePress = global::Sunny.UI.Demo.Properties.Resources.relationship0; + this.uiImageButton2.Location = new System.Drawing.Point(495, 438); + this.uiImageButton2.Name = "uiImageButton2"; + this.uiImageButton2.Size = new System.Drawing.Size(43, 35); + this.uiImageButton2.TabIndex = 50; + this.uiImageButton2.TabStop = false; + this.uiImageButton2.Text = null; + // + // uiImageButton3 + // + this.uiImageButton3.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiImageButton3.Image = global::Sunny.UI.Demo.Properties.Resources.save0; + this.uiImageButton3.ImageHover = global::Sunny.UI.Demo.Properties.Resources.save; + this.uiImageButton3.ImagePress = global::Sunny.UI.Demo.Properties.Resources.save0; + this.uiImageButton3.Location = new System.Drawing.Point(546, 438); + this.uiImageButton3.Name = "uiImageButton3"; + this.uiImageButton3.Size = new System.Drawing.Size(43, 35); + this.uiImageButton3.TabIndex = 51; + this.uiImageButton3.TabStop = false; + this.uiImageButton3.Text = null; + // + // FButton + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 534); + this.Name = "FButton"; + this.PageIndex = 1001; + this.Text = "Button"; + this.PagePanel.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.uiImageButton1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.uiImageButton2)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.uiImageButton3)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private UIButton uiButton13; + private UIButton uiButton14; + private UIButton uiButton15; + private UIButton uiButton16; + private UIButton uiButton17; + private UIButton uiButton18; + private UIButton uiButton7; + private UIButton uiButton8; + private UIButton uiButton9; + private UIButton uiButton10; + private UIButton uiButton11; + private UIButton uiButton12; + private UIButton uiButton4; + private UIButton uiButton5; + private UIButton uiButton6; + private UIButton uiButton3; + private UIButton uiButton2; + private UIButton uiButton1; + private UILine uiLine1; + private UISymbolButton uiSymbolButton2; + private UISymbolButton uiSymbolButton1; + private UILine uiLine2; + private UISymbolButton uiSymbolButton3; + private UISymbolButton uiSymbolButton4; + private UISymbolButton uiSymbolButton6; + private UISymbolButton uiSymbolButton5; + private UISymbolButton uiSymbolButton7; + private UISymbolButton uiSymbolButton8; + private UISymbolButton uiSymbolButton9; + private UISymbolButton uiSymbolButton10; + private UISymbolButton uiSymbolButton11; + private UISymbolButton uiSymbolButton12; + private UISymbolButton uiSymbolButton19; + private UISymbolButton uiSymbolButton20; + private UISymbolButton uiSymbolButton21; + private UISymbolButton uiSymbolButton13; + private UISymbolButton uiSymbolButton14; + private UISymbolButton uiSymbolButton15; + private UISymbolButton uiSymbolButton16; + private UISymbolButton uiSymbolButton17; + private UISymbolButton uiSymbolButton18; + private UILine uiLine3; + private UISymbolButton uiSymbolButton24; + private UISymbolButton uiSymbolButton23; + private UISymbolButton uiSymbolButton22; + private UISwitch uiSwitch2; + private UILine uiLine4; + private UISwitch uiSwitch1; + private UILine uiLine5; + private UIImageButton uiImageButton3; + private UIImageButton uiImageButton2; + private UIImageButton uiImageButton1; + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Controls/FButton.cs b/SunnyUI.Demo/Controls/FButton.cs new file mode 100644 index 00000000..e75440d6 --- /dev/null +++ b/SunnyUI.Demo/Controls/FButton.cs @@ -0,0 +1,13 @@ +using System; +using System.Drawing; + +namespace Sunny.UI.Demo +{ + public partial class FButton : UITitlePage + { + public FButton() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Controls/FButton.resx b/SunnyUI.Demo/Controls/FButton.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/SunnyUI.Demo/Controls/FButton.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SunnyUI.Demo/Controls/FCheckBox.Designer.cs b/SunnyUI.Demo/Controls/FCheckBox.Designer.cs new file mode 100644 index 00000000..97c9bc1a --- /dev/null +++ b/SunnyUI.Demo/Controls/FCheckBox.Designer.cs @@ -0,0 +1,153 @@ +namespace Sunny.UI.Demo +{ + partial class FCheckBox + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.uiCheckBox1 = new Sunny.UI.UICheckBox(); + this.uiLine1 = new Sunny.UI.UILine(); + this.uiCheckBox3 = new Sunny.UI.UICheckBox(); + this.uiCheckBox4 = new Sunny.UI.UICheckBox(); + this.uiCheckBox2 = new Sunny.UI.UICheckBox(); + this.uiCheckBoxGroup1 = new Sunny.UI.UICheckBoxGroup(); + this.PagePanel.SuspendLayout(); + this.SuspendLayout(); + // + // PagePanel + // + this.PagePanel.Controls.Add(this.uiCheckBoxGroup1); + this.PagePanel.Controls.Add(this.uiCheckBox2); + this.PagePanel.Controls.Add(this.uiCheckBox4); + this.PagePanel.Controls.Add(this.uiCheckBox3); + this.PagePanel.Controls.Add(this.uiLine1); + this.PagePanel.Controls.Add(this.uiCheckBox1); + this.PagePanel.Size = new System.Drawing.Size(800, 521); + // + // uiCheckBox1 + // + this.uiCheckBox1.Checked = true; + this.uiCheckBox1.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiCheckBox1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiCheckBox1.Location = new System.Drawing.Point(30, 48); + this.uiCheckBox1.Name = "uiCheckBox1"; + this.uiCheckBox1.Padding = new System.Windows.Forms.Padding(22, 0, 0, 0); + this.uiCheckBox1.Size = new System.Drawing.Size(150, 35); + this.uiCheckBox1.TabIndex = 0; + this.uiCheckBox1.Text = "uiCheckBox1"; + // + // uiLine1 + // + this.uiLine1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLine1.Location = new System.Drawing.Point(30, 20); + this.uiLine1.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine1.Name = "uiLine1"; + this.uiLine1.Size = new System.Drawing.Size(670, 20); + this.uiLine1.TabIndex = 19; + this.uiLine1.Text = "UICheckBox"; + this.uiLine1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiCheckBox3 + // + this.uiCheckBox3.Checked = true; + this.uiCheckBox3.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiCheckBox3.Enabled = false; + this.uiCheckBox3.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiCheckBox3.Location = new System.Drawing.Point(354, 46); + this.uiCheckBox3.Name = "uiCheckBox3"; + this.uiCheckBox3.Padding = new System.Windows.Forms.Padding(22, 0, 0, 0); + this.uiCheckBox3.Size = new System.Drawing.Size(150, 35); + this.uiCheckBox3.TabIndex = 21; + this.uiCheckBox3.Text = "uiCheckBox3"; + // + // uiCheckBox4 + // + this.uiCheckBox4.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiCheckBox4.Enabled = false; + this.uiCheckBox4.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiCheckBox4.Location = new System.Drawing.Point(516, 46); + this.uiCheckBox4.Name = "uiCheckBox4"; + this.uiCheckBox4.Padding = new System.Windows.Forms.Padding(22, 0, 0, 0); + this.uiCheckBox4.Size = new System.Drawing.Size(150, 35); + this.uiCheckBox4.TabIndex = 22; + this.uiCheckBox4.Text = "uiCheckBox4"; + // + // uiCheckBox2 + // + this.uiCheckBox2.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiCheckBox2.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiCheckBox2.Location = new System.Drawing.Point(192, 48); + this.uiCheckBox2.Name = "uiCheckBox2"; + this.uiCheckBox2.Padding = new System.Windows.Forms.Padding(22, 0, 0, 0); + this.uiCheckBox2.Size = new System.Drawing.Size(150, 35); + this.uiCheckBox2.TabIndex = 39; + this.uiCheckBox2.Text = "uiCheckBox2"; + // + // uiCheckBoxGroup1 + // + this.uiCheckBoxGroup1.ColumnCount = 2; + this.uiCheckBoxGroup1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiCheckBoxGroup1.Items.AddRange(new object[] { + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8"}); + this.uiCheckBoxGroup1.Location = new System.Drawing.Point(30, 91); + this.uiCheckBoxGroup1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.uiCheckBoxGroup1.Name = "uiCheckBoxGroup1"; + this.uiCheckBoxGroup1.Size = new System.Drawing.Size(670, 211); + this.uiCheckBoxGroup1.TabIndex = 41; + this.uiCheckBoxGroup1.Text = "UICheckBoxGroup"; + this.uiCheckBoxGroup1.ValueChanged += new Sunny.UI.UICheckBoxGroup.OnValueChanged(this.uiCheckBoxGroup1_ValueChanged); + // + // FCheckBox + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 556); + this.Name = "FCheckBox"; + this.PageIndex = 1002; + this.Text = "CheckBox"; + this.PagePanel.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private UICheckBox uiCheckBox1; + private UILine uiLine1; + private UICheckBox uiCheckBox4; + private UICheckBox uiCheckBox3; + private UICheckBox uiCheckBox2; + private UICheckBoxGroup uiCheckBoxGroup1; + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Controls/FCheckBox.cs b/SunnyUI.Demo/Controls/FCheckBox.cs new file mode 100644 index 00000000..840ff7cb --- /dev/null +++ b/SunnyUI.Demo/Controls/FCheckBox.cs @@ -0,0 +1,31 @@ +using System.Text; +using System.Windows.Forms; + +namespace Sunny.UI.Demo +{ + public partial class FCheckBox : UITitlePage + { + public FCheckBox() + { + InitializeComponent(); + } + + private void uiRadioButtonGroup1_ValueChanged(object sender, int index, string text) + { + MessageBox.Show(index.ToString()); + } + + private void uiCheckBoxGroup1_ValueChanged(object sender, int index, string text, bool isChecked) + { + StringBuilder sb = new StringBuilder(); + sb.Append("SelectedIndexes: "); + foreach (var selectedIndex in uiCheckBoxGroup1.SelectedIndexes) + { + sb.Append(selectedIndex); + sb.Append(", "); + } + + this.ShowInfoDialog("SelectedIndex: " + index + ", SelectedText: " + text + "\n" + sb.ToString()); + } + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Controls/FCheckBox.resx b/SunnyUI.Demo/Controls/FCheckBox.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/SunnyUI.Demo/Controls/FCheckBox.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SunnyUI.Demo/Controls/FContextMenuStrip.Designer.cs b/SunnyUI.Demo/Controls/FContextMenuStrip.Designer.cs new file mode 100644 index 00000000..39273d1f --- /dev/null +++ b/SunnyUI.Demo/Controls/FContextMenuStrip.Designer.cs @@ -0,0 +1,103 @@ +namespace Sunny.UI.Demo +{ + partial class FContextMenuStrip + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.uiButton1 = new Sunny.UI.UIButton(); + this.uiButton2 = new Sunny.UI.UIButton(); + this.uiLine1 = new Sunny.UI.UILine(); + this.uiContextMenuStrip1 = new Sunny.UI.UIContextMenuStrip(); + this.PagePanel.SuspendLayout(); + this.SuspendLayout(); + // + // PagePanel + // + this.PagePanel.Controls.Add(this.uiLine1); + this.PagePanel.Controls.Add(this.uiButton2); + this.PagePanel.Controls.Add(this.uiButton1); + // + // uiButton1 + // + this.uiButton1.ContextMenuStrip = this.uiContextMenuStrip1; + this.uiButton1.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiButton1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiButton1.Location = new System.Drawing.Point(30, 57); + this.uiButton1.Name = "uiButton1"; + this.uiButton1.Size = new System.Drawing.Size(232, 35); + this.uiButton1.TabIndex = 0; + this.uiButton1.Text = "右键菜单"; + // + // uiButton2 + // + this.uiButton2.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiButton2.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiButton2.Location = new System.Drawing.Point(294, 57); + this.uiButton2.Name = "uiButton2"; + this.uiButton2.Size = new System.Drawing.Size(232, 35); + this.uiButton2.TabIndex = 1; + this.uiButton2.Text = "左键菜单"; + this.uiButton2.Click += new System.EventHandler(this.uiButton2_Click); + // + // uiLine1 + // + this.uiLine1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLine1.Location = new System.Drawing.Point(30, 20); + this.uiLine1.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine1.Name = "uiLine1"; + this.uiLine1.Size = new System.Drawing.Size(670, 20); + this.uiLine1.TabIndex = 19; + this.uiLine1.Text = "UIContextMenuStrip"; + this.uiLine1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiContextMenuStrip1 + // + this.uiContextMenuStrip1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiContextMenuStrip1.Name = "uiContextMenuStrip1"; + this.uiContextMenuStrip1.Size = new System.Drawing.Size(61, 4); + // + // FContextMenuStrip + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 450); + this.Name = "FContextMenuStrip"; + this.Text = "ContextMenuStrip"; + this.Controls.SetChildIndex(this.PagePanel, 0); + this.PagePanel.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private UIButton uiButton1; + private UIButton uiButton2; + private UILine uiLine1; + private UIContextMenuStrip uiContextMenuStrip1; + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Controls/FContextMenuStrip.cs b/SunnyUI.Demo/Controls/FContextMenuStrip.cs new file mode 100644 index 00000000..b984f371 --- /dev/null +++ b/SunnyUI.Demo/Controls/FContextMenuStrip.cs @@ -0,0 +1,35 @@ +using System; +using System.Windows.Forms; + +namespace Sunny.UI.Demo +{ + public partial class FContextMenuStrip : UITitlePage + { + public FContextMenuStrip() + { + InitializeComponent(); + + var styles = UIStyles.PopularStyles(); + foreach (UIStyle style in styles) + { + ToolStripMenuItem item = new ToolStripMenuItem(style.DisplayText()) { Tag = style }; + item.Click += Item_Click; + uiContextMenuStrip1.Items.Add(item); + } + } + + private void Item_Click(object sender, EventArgs e) + { + ToolStripMenuItem item = (ToolStripMenuItem)sender; + if (item.Tag != null && item.Tag is UIStyle style) + { + this.Style = style; + } + } + + private void uiButton2_Click(object sender, System.EventArgs e) + { + uiButton2.ShowContextMenuStrip(uiContextMenuStrip1, 0, uiButton2.Height); + } + } +} diff --git a/SunnyUI.Demo/Controls/FContextMenuStrip.resx b/SunnyUI.Demo/Controls/FContextMenuStrip.resx new file mode 100644 index 00000000..93ecf1d7 --- /dev/null +++ b/SunnyUI.Demo/Controls/FContextMenuStrip.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/SunnyUI.Demo/Controls/FDataGridView.Designer.cs b/SunnyUI.Demo/Controls/FDataGridView.Designer.cs new file mode 100644 index 00000000..e6dcd165 --- /dev/null +++ b/SunnyUI.Demo/Controls/FDataGridView.Designer.cs @@ -0,0 +1,103 @@ +namespace Sunny.UI.Demo +{ + partial class FDataGridView + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle3 = new System.Windows.Forms.DataGridViewCellStyle(); + this.uiDataGridView1 = new Sunny.UI.UIDataGridView(); + this.PagePanel.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.uiDataGridView1)).BeginInit(); + this.SuspendLayout(); + // + // PagePanel + // + this.PagePanel.Controls.Add(this.uiDataGridView1); + // + // uiDataGridView1 + // + this.uiDataGridView1.AllowUserToAddRows = false; + this.uiDataGridView1.AllowUserToResizeRows = false; + dataGridViewCellStyle1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.uiDataGridView1.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle1; + this.uiDataGridView1.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill; + this.uiDataGridView1.BackgroundColor = System.Drawing.Color.White; + this.uiDataGridView1.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.uiDataGridView1.CellBorderStyle = System.Windows.Forms.DataGridViewCellBorderStyle.None; + this.uiDataGridView1.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255))))); + dataGridViewCellStyle2.Font = new System.Drawing.Font("微软雅黑", 12F); + dataGridViewCellStyle2.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle2.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle2.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.uiDataGridView1.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle2; + this.uiDataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + this.uiDataGridView1.Dock = System.Windows.Forms.DockStyle.Fill; + this.uiDataGridView1.EnableHeadersVisualStyles = false; + this.uiDataGridView1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiDataGridView1.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255))))); + this.uiDataGridView1.Location = new System.Drawing.Point(0, 0); + this.uiDataGridView1.MultiSelect = false; + this.uiDataGridView1.Name = "uiDataGridView1"; + this.uiDataGridView1.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255))))); + this.uiDataGridView1.RowHeadersVisible = false; + dataGridViewCellStyle3.BackColor = System.Drawing.Color.White; + this.uiDataGridView1.RowsDefaultCellStyle = dataGridViewCellStyle3; + this.uiDataGridView1.RowTemplate.Height = 29; + this.uiDataGridView1.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.uiDataGridView1.SelectedIndex = -1; + this.uiDataGridView1.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.uiDataGridView1.ShowRect = false; + this.uiDataGridView1.Size = new System.Drawing.Size(800, 415); + this.uiDataGridView1.Style = Sunny.UI.UIStyle.Custom; + this.uiDataGridView1.TabIndex = 0; + this.uiDataGridView1.TagString = null; + // + // FDataGridView + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 450); + this.Name = "FDataGridView"; + this.PageIndex = 1006; + this.Text = "DataGridView"; + this.PagePanel.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.uiDataGridView1)).EndInit(); + this.ResumeLayout(false); + + } + + + #endregion + + private UIDataGridView uiDataGridView1; + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Controls/FDataGridView.cs b/SunnyUI.Demo/Controls/FDataGridView.cs new file mode 100644 index 00000000..8349f8ea --- /dev/null +++ b/SunnyUI.Demo/Controls/FDataGridView.cs @@ -0,0 +1,55 @@ +using System.Collections.Generic; +using System.Windows.Forms; + +namespace Sunny.UI.Demo +{ + public partial class FDataGridView : UITitlePage + { + public FDataGridView() + { + InitializeComponent(); + + uiDataGridView1.AddColumn("Column1", "Column1", 100); + uiDataGridView1.AddColumn("Column2", "Column2").SetFixedMode(100); + uiDataGridView1.AddColumn("Column3", "Column3").SetFixedMode(100); + //uiDataGridView1.AddColumn("Column4", "Column4", 20); + + uiDataGridView1.ReadOnly = true; + } + + public override void Init() + { + base.Init(); + + List datas = new List(); + for (int i = 0; i < 200; i++) + { + Data data = new Data(); + data.Column1 = "Data" + i.ToString("D2"); + data.Column2 = i.Mod(2) == 0 ? "A" : "B"; + data.Column3 = "编辑"; + data.Column4 = i.Mod(4) == 0; + datas.Add(data); + } + + uiDataGridView1.DataSource = datas; + uiDataGridView1.SelectedIndex = 160; + } + + public class Data + { + public string Column1 { get; set; } + + public string Column2 { get; set; } + + public string Column3 { get; set; } + + public bool Column4 { get; set; } + + public override string ToString() + { + return Column1; + } + } + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Controls/FDataGridView.resx b/SunnyUI.Demo/Controls/FDataGridView.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/SunnyUI.Demo/Controls/FDataGridView.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SunnyUI.Demo/Controls/FLabel.Designer.cs b/SunnyUI.Demo/Controls/FLabel.Designer.cs new file mode 100644 index 00000000..65b4107f --- /dev/null +++ b/SunnyUI.Demo/Controls/FLabel.Designer.cs @@ -0,0 +1,162 @@ +namespace Sunny.UI.Demo +{ + partial class FLabel + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.uiLabel1 = new Sunny.UI.UILabel(); + this.uiLinkLabel1 = new Sunny.UI.UILinkLabel(); + this.uiLine1 = new Sunny.UI.UILine(); + this.uiLine2 = new Sunny.UI.UILine(); + this.uiLine3 = new Sunny.UI.UILine(); + this.uiSymbolLabel1 = new Sunny.UI.UISymbolLabel(); + this.uiSymbolLabel2 = new Sunny.UI.UISymbolLabel(); + this.PagePanel.SuspendLayout(); + this.SuspendLayout(); + // + // PagePanel + // + this.PagePanel.Controls.Add(this.uiSymbolLabel2); + this.PagePanel.Controls.Add(this.uiSymbolLabel1); + this.PagePanel.Controls.Add(this.uiLine3); + this.PagePanel.Controls.Add(this.uiLine2); + this.PagePanel.Controls.Add(this.uiLine1); + this.PagePanel.Controls.Add(this.uiLinkLabel1); + this.PagePanel.Controls.Add(this.uiLabel1); + // + // uiLabel1 + // + this.uiLabel1.AutoSize = true; + this.uiLabel1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLabel1.Location = new System.Drawing.Point(42, 55); + this.uiLabel1.Name = "uiLabel1"; + this.uiLabel1.Size = new System.Drawing.Size(102, 21); + this.uiLabel1.TabIndex = 0; + this.uiLabel1.Text = "Hello world!"; + this.uiLabel1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiLinkLabel1 + // + this.uiLinkLabel1.ActiveLinkColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(155)))), ((int)(((byte)(40))))); + this.uiLinkLabel1.AutoSize = true; + this.uiLinkLabel1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLinkLabel1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(48))))); + this.uiLinkLabel1.LinkBehavior = System.Windows.Forms.LinkBehavior.AlwaysUnderline; + this.uiLinkLabel1.LinkColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(48))))); + this.uiLinkLabel1.Location = new System.Drawing.Point(42, 127); + this.uiLinkLabel1.Name = "uiLinkLabel1"; + this.uiLinkLabel1.Size = new System.Drawing.Size(146, 21); + this.uiLinkLabel1.Style = Sunny.UI.UIStyle.Custom; + this.uiLinkLabel1.TabIndex = 1; + this.uiLinkLabel1.TabStop = true; + this.uiLinkLabel1.Text = "www.SunnyUI.net"; + this.uiLinkLabel1.VisitedLinkColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.uiLinkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.uiLinkLabel1_LinkClicked); + // + // uiLine1 + // + this.uiLine1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLine1.Location = new System.Drawing.Point(30, 20); + this.uiLine1.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine1.Name = "uiLine1"; + this.uiLine1.Size = new System.Drawing.Size(670, 20); + this.uiLine1.TabIndex = 19; + this.uiLine1.Text = "UILabel"; + this.uiLine1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiLine2 + // + this.uiLine2.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLine2.Location = new System.Drawing.Point(30, 92); + this.uiLine2.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine2.Name = "uiLine2"; + this.uiLine2.Size = new System.Drawing.Size(670, 20); + this.uiLine2.TabIndex = 20; + this.uiLine2.Text = "UILinkLabel"; + this.uiLine2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiLine3 + // + this.uiLine3.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLine3.Location = new System.Drawing.Point(30, 173); + this.uiLine3.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine3.Name = "uiLine3"; + this.uiLine3.Size = new System.Drawing.Size(670, 20); + this.uiLine3.TabIndex = 21; + this.uiLine3.Text = "UISymbolLabel"; + this.uiLine3.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiSymbolLabel1 + // + this.uiSymbolLabel1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiSymbolLabel1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(48))))); + this.uiSymbolLabel1.Location = new System.Drawing.Point(42, 209); + this.uiSymbolLabel1.Name = "uiSymbolLabel1"; + this.uiSymbolLabel1.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0); + this.uiSymbolLabel1.Size = new System.Drawing.Size(91, 24); + this.uiSymbolLabel1.TabIndex = 22; + this.uiSymbolLabel1.Text = "OK"; + this.uiSymbolLabel1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiSymbolLabel2 + // + this.uiSymbolLabel2.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiSymbolLabel2.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(48))))); + this.uiSymbolLabel2.Location = new System.Drawing.Point(139, 209); + this.uiSymbolLabel2.Name = "uiSymbolLabel2"; + this.uiSymbolLabel2.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0); + this.uiSymbolLabel2.Size = new System.Drawing.Size(91, 24); + this.uiSymbolLabel2.Symbol = 61453; + this.uiSymbolLabel2.TabIndex = 23; + this.uiSymbolLabel2.Text = "Cancel"; + this.uiSymbolLabel2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // FLabel + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 450); + this.Name = "FLabel"; + this.StyleCustomMode = true; + this.Text = "Label"; + this.PagePanel.ResumeLayout(false); + this.PagePanel.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private UILabel uiLabel1; + private UILinkLabel uiLinkLabel1; + private UILine uiLine3; + private UILine uiLine2; + private UILine uiLine1; + private UISymbolLabel uiSymbolLabel1; + private UISymbolLabel uiSymbolLabel2; + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Controls/FLabel.cs b/SunnyUI.Demo/Controls/FLabel.cs new file mode 100644 index 00000000..ce636100 --- /dev/null +++ b/SunnyUI.Demo/Controls/FLabel.cs @@ -0,0 +1,18 @@ +using System.Diagnostics; +using System.Windows.Forms; + +namespace Sunny.UI.Demo +{ + public partial class FLabel : UITitlePage + { + public FLabel() + { + InitializeComponent(); + } + + private void uiLinkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + Process.Start(uiLinkLabel1.Text); + } + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Controls/FLabel.resx b/SunnyUI.Demo/Controls/FLabel.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/SunnyUI.Demo/Controls/FLabel.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SunnyUI.Demo/Controls/FLine.Designer.cs b/SunnyUI.Demo/Controls/FLine.Designer.cs new file mode 100644 index 00000000..d99d99d9 --- /dev/null +++ b/SunnyUI.Demo/Controls/FLine.Designer.cs @@ -0,0 +1,216 @@ +namespace Sunny.UI.Demo +{ + partial class FLine + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.uiLine1 = new Sunny.UI.UILine(); + this.uiLine2 = new Sunny.UI.UILine(); + this.uiLine3 = new Sunny.UI.UILine(); + this.uiLine4 = new Sunny.UI.UILine(); + this.uiLine5 = new Sunny.UI.UILine(); + this.uiLine6 = new Sunny.UI.UILine(); + this.uiLine7 = new Sunny.UI.UILine(); + this.uiLine8 = new Sunny.UI.UILine(); + this.uiLine9 = new Sunny.UI.UILine(); + this.uiLine10 = new Sunny.UI.UILine(); + this.uiLine11 = new Sunny.UI.UILine(); + this.PagePanel.SuspendLayout(); + this.SuspendLayout(); + // + // PagePanel + // + this.PagePanel.Controls.Add(this.uiLine11); + this.PagePanel.Controls.Add(this.uiLine10); + this.PagePanel.Controls.Add(this.uiLine7); + this.PagePanel.Controls.Add(this.uiLine8); + this.PagePanel.Controls.Add(this.uiLine9); + this.PagePanel.Controls.Add(this.uiLine4); + this.PagePanel.Controls.Add(this.uiLine5); + this.PagePanel.Controls.Add(this.uiLine6); + this.PagePanel.Controls.Add(this.uiLine3); + this.PagePanel.Controls.Add(this.uiLine2); + this.PagePanel.Controls.Add(this.uiLine1); + this.PagePanel.Size = new System.Drawing.Size(800, 521); + // + // uiLine1 + // + this.uiLine1.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.uiLine1.Location = new System.Drawing.Point(30, 20); + this.uiLine1.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine1.Name = "uiLine1"; + this.uiLine1.Size = new System.Drawing.Size(443, 33); + this.uiLine1.TabIndex = 0; + this.uiLine1.Text = "文字左上 LineSize=1"; + this.uiLine1.TextAlign = System.Drawing.ContentAlignment.TopLeft; + // + // uiLine2 + // + this.uiLine2.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLine2.LineSize = 2; + this.uiLine2.Location = new System.Drawing.Point(30, 58); + this.uiLine2.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine2.Name = "uiLine2"; + this.uiLine2.Size = new System.Drawing.Size(443, 29); + this.uiLine2.TabIndex = 1; + this.uiLine2.Text = "文字左中 LineSize=2"; + this.uiLine2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiLine3 + // + this.uiLine3.Font = new System.Drawing.Font("微软雅黑", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.uiLine3.LineSize = 3; + this.uiLine3.Location = new System.Drawing.Point(30, 93); + this.uiLine3.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine3.Name = "uiLine3"; + this.uiLine3.Size = new System.Drawing.Size(443, 51); + this.uiLine3.TabIndex = 2; + this.uiLine3.Text = "文字左下 LineSize=3"; + this.uiLine3.TextAlign = System.Drawing.ContentAlignment.BottomLeft; + // + // uiLine4 + // + this.uiLine4.Font = new System.Drawing.Font("微软雅黑", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.uiLine4.LineSize = 3; + this.uiLine4.Location = new System.Drawing.Point(30, 245); + this.uiLine4.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine4.Name = "uiLine4"; + this.uiLine4.Size = new System.Drawing.Size(443, 51); + this.uiLine4.TabIndex = 5; + this.uiLine4.Text = "文字中下"; + this.uiLine4.TextAlign = System.Drawing.ContentAlignment.BottomCenter; + // + // uiLine5 + // + this.uiLine5.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLine5.LineSize = 2; + this.uiLine5.Location = new System.Drawing.Point(30, 210); + this.uiLine5.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine5.Name = "uiLine5"; + this.uiLine5.Size = new System.Drawing.Size(443, 29); + this.uiLine5.TabIndex = 4; + this.uiLine5.Text = "文字居中"; + // + // uiLine6 + // + this.uiLine6.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.uiLine6.Location = new System.Drawing.Point(30, 172); + this.uiLine6.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine6.Name = "uiLine6"; + this.uiLine6.Size = new System.Drawing.Size(443, 33); + this.uiLine6.TabIndex = 3; + this.uiLine6.Text = "文字中上"; + this.uiLine6.TextAlign = System.Drawing.ContentAlignment.TopCenter; + // + // uiLine7 + // + this.uiLine7.Font = new System.Drawing.Font("微软雅黑", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.uiLine7.LineSize = 3; + this.uiLine7.Location = new System.Drawing.Point(30, 393); + this.uiLine7.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine7.Name = "uiLine7"; + this.uiLine7.Size = new System.Drawing.Size(443, 51); + this.uiLine7.TabIndex = 8; + this.uiLine7.Text = "文字右下"; + this.uiLine7.TextAlign = System.Drawing.ContentAlignment.BottomRight; + // + // uiLine8 + // + this.uiLine8.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLine8.LineSize = 2; + this.uiLine8.Location = new System.Drawing.Point(30, 358); + this.uiLine8.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine8.Name = "uiLine8"; + this.uiLine8.Size = new System.Drawing.Size(443, 29); + this.uiLine8.TabIndex = 7; + this.uiLine8.Text = "文字右中"; + this.uiLine8.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // uiLine9 + // + this.uiLine9.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.uiLine9.Location = new System.Drawing.Point(30, 320); + this.uiLine9.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine9.Name = "uiLine9"; + this.uiLine9.Size = new System.Drawing.Size(443, 33); + this.uiLine9.TabIndex = 6; + this.uiLine9.Text = "文字右上"; + this.uiLine9.TextAlign = System.Drawing.ContentAlignment.TopRight; + // + // uiLine10 + // + this.uiLine10.Direction = Sunny.UI.UILine.LineDirection.Vertical; + this.uiLine10.Font = new System.Drawing.Font("微软雅黑", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.uiLine10.Location = new System.Drawing.Point(521, 32); + this.uiLine10.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine10.Name = "uiLine10"; + this.uiLine10.Size = new System.Drawing.Size(51, 388); + this.uiLine10.TabIndex = 11; + this.uiLine10.Text = "uiLine10"; + this.uiLine10.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiLine11 + // + this.uiLine11.Direction = Sunny.UI.UILine.LineDirection.Vertical; + this.uiLine11.Font = new System.Drawing.Font("微软雅黑", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.uiLine11.LineSize = 2; + this.uiLine11.Location = new System.Drawing.Point(578, 32); + this.uiLine11.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine11.Name = "uiLine11"; + this.uiLine11.Size = new System.Drawing.Size(51, 388); + this.uiLine11.TabIndex = 12; + this.uiLine11.Text = "uiLine11"; + this.uiLine11.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // FLine + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 556); + this.Name = "FLine"; + this.PageIndex = 1004; + this.Text = "Line"; + this.PagePanel.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private UILine uiLine7; + private UILine uiLine8; + private UILine uiLine9; + private UILine uiLine4; + private UILine uiLine5; + private UILine uiLine6; + private UILine uiLine3; + private UILine uiLine2; + private UILine uiLine1; + private UILine uiLine10; + private UILine uiLine11; + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Controls/FLine.cs b/SunnyUI.Demo/Controls/FLine.cs new file mode 100644 index 00000000..aedddd68 --- /dev/null +++ b/SunnyUI.Demo/Controls/FLine.cs @@ -0,0 +1,10 @@ +namespace Sunny.UI.Demo +{ + public partial class FLine : UITitlePage + { + public FLine() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Controls/FLine.resx b/SunnyUI.Demo/Controls/FLine.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/SunnyUI.Demo/Controls/FLine.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SunnyUI.Demo/Controls/FListBox.Designer.cs b/SunnyUI.Demo/Controls/FListBox.Designer.cs new file mode 100644 index 00000000..4e1a4cd2 --- /dev/null +++ b/SunnyUI.Demo/Controls/FListBox.Designer.cs @@ -0,0 +1,149 @@ +namespace Sunny.UI.Demo +{ + partial class FListBox + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.uiImageListBox1 = new Sunny.UI.UIImageListBox(); + this.uiLine1 = new Sunny.UI.UILine(); + this.uiLine2 = new Sunny.UI.UILine(); + this.uiListBox1 = new Sunny.UI.UIListBox(); + this.uiCheckBox1 = new Sunny.UI.UICheckBox(); + this.PagePanel.SuspendLayout(); + this.SuspendLayout(); + // + // PagePanel + // + this.PagePanel.Controls.Add(this.uiCheckBox1); + this.PagePanel.Controls.Add(this.uiListBox1); + this.PagePanel.Controls.Add(this.uiLine2); + this.PagePanel.Controls.Add(this.uiLine1); + this.PagePanel.Controls.Add(this.uiImageListBox1); + this.PagePanel.Size = new System.Drawing.Size(800, 465); + // + // uiImageListBox1 + // + this.uiImageListBox1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiImageListBox1.ItemHeight = 80; + this.uiImageListBox1.ItemSelectForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.uiImageListBox1.Location = new System.Drawing.Point(355, 48); + this.uiImageListBox1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.uiImageListBox1.Name = "uiImageListBox1"; + this.uiImageListBox1.Padding = new System.Windows.Forms.Padding(2); + this.uiImageListBox1.Size = new System.Drawing.Size(266, 343); + this.uiImageListBox1.TabIndex = 1; + this.uiImageListBox1.Text = "uiImageListBox1"; + this.uiImageListBox1.ItemDoubleClick += new System.EventHandler(this.uiImageListBox1_ItemDoubleClick); + // + // uiLine1 + // + this.uiLine1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLine1.Location = new System.Drawing.Point(33, 20); + this.uiLine1.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine1.Name = "uiLine1"; + this.uiLine1.Size = new System.Drawing.Size(266, 18); + this.uiLine1.TabIndex = 19; + this.uiLine1.Text = "uiListBox"; + this.uiLine1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiLine2 + // + this.uiLine2.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLine2.Location = new System.Drawing.Point(355, 20); + this.uiLine2.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine2.Name = "uiLine2"; + this.uiLine2.Size = new System.Drawing.Size(266, 18); + this.uiLine2.TabIndex = 20; + this.uiLine2.Text = "uiImageListBox"; + this.uiLine2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiListBox1 + // + this.uiListBox1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiListBox1.Items.AddRange(new object[] { + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15", + "16", + "17", + "18"}); + this.uiListBox1.ItemSelectForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.uiListBox1.Location = new System.Drawing.Point(33, 48); + this.uiListBox1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.uiListBox1.Name = "uiListBox1"; + this.uiListBox1.Padding = new System.Windows.Forms.Padding(2); + this.uiListBox1.Size = new System.Drawing.Size(270, 343); + this.uiListBox1.TabIndex = 21; + this.uiListBox1.Text = "uiListBox1"; + this.uiListBox1.ItemDoubleClick += new System.EventHandler(this.uiListBox1_ItemDoubleClick); + // + // uiCheckBox1 + // + this.uiCheckBox1.Checked = true; + this.uiCheckBox1.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiCheckBox1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiCheckBox1.Location = new System.Drawing.Point(355, 399); + this.uiCheckBox1.Name = "uiCheckBox1"; + this.uiCheckBox1.Padding = new System.Windows.Forms.Padding(22, 0, 0, 0); + this.uiCheckBox1.Size = new System.Drawing.Size(266, 35); + this.uiCheckBox1.TabIndex = 22; + this.uiCheckBox1.Text = "ShowDescription"; + this.uiCheckBox1.ValueChanged += new Sunny.UI.UICheckBox.OnValueChanged(this.uiCheckBox1_ValueChanged); + // + // FListBox + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 500); + this.Name = "FListBox"; + this.Text = "ListBox"; + this.PagePanel.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + private UIImageListBox uiImageListBox1; + private UILine uiLine2; + private UILine uiLine1; + private UIListBox uiListBox1; + private UICheckBox uiCheckBox1; + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Controls/FListBox.cs b/SunnyUI.Demo/Controls/FListBox.cs new file mode 100644 index 00000000..13d30f2c --- /dev/null +++ b/SunnyUI.Demo/Controls/FListBox.cs @@ -0,0 +1,45 @@ +using System.IO; + +namespace Sunny.UI.Demo +{ + public partial class FListBox : UITitlePage + { + public FListBox() + { + InitializeComponent(); + } + + public override void Init() + { + uiListBox1.Items.Clear(); + for (int i = 0; i < 20; i++) + { + uiListBox1.Items.Add(i); + } + + uiImageListBox1.Items.Clear(); + string[] files = System.IO.Directory.GetFiles(DirEx.CurrentDir() + "Team", + "*.png", SearchOption.TopDirectoryOnly); + foreach (string file in files) + { + uiImageListBox1.AddImage(file, file.FileInfo().Name); + } + } + + private void uiImageListBox1_ItemDoubleClick(object sender, System.EventArgs e) + { + this.ShowInfoDialog(uiImageListBox1.SelectedItem.ImagePath); + } + + private void uiCheckBox1_ValueChanged(object sender, bool value) + { + uiImageListBox1.ShowDescription = !uiImageListBox1.ShowDescription; + uiImageListBox1.ItemHeight = uiImageListBox1.ShowDescription ? 80 : 50; + } + + private void uiListBox1_ItemDoubleClick(object sender, System.EventArgs e) + { + this.ShowInfoDialog(uiListBox1.SelectedItem.ToString()); + } + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Controls/FListBox.resx b/SunnyUI.Demo/Controls/FListBox.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/SunnyUI.Demo/Controls/FListBox.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SunnyUI.Demo/Controls/FMeter.Designer.cs b/SunnyUI.Demo/Controls/FMeter.Designer.cs new file mode 100644 index 00000000..68d1d0b2 --- /dev/null +++ b/SunnyUI.Demo/Controls/FMeter.Designer.cs @@ -0,0 +1,192 @@ +namespace Sunny.UI.Demo +{ + partial class FMeter + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FMeter)); + this.uiAnalogMeter1 = new Sunny.UI.UIAnalogMeter(); + this.uiLine9 = new Sunny.UI.UILine(); + this.uiLine7 = new Sunny.UI.UILine(); + this.uiLine6 = new Sunny.UI.UILine(); + this.uiLine1 = new Sunny.UI.UILine(); + this.uiLedStopwatch1 = new Sunny.UI.UILedStopwatch(); + this.uiLedDisplay1 = new Sunny.UI.UILedDisplay(); + this.timer1 = new System.Windows.Forms.Timer(this.components); + this.uiRoundMeter2 = new Sunny.UI.UIRoundMeter(); + this.uiRoundMeter1 = new Sunny.UI.UIRoundMeter(); + this.PagePanel.SuspendLayout(); + this.SuspendLayout(); + // + // PagePanel + // + this.PagePanel.Controls.Add(this.uiAnalogMeter1); + this.PagePanel.Controls.Add(this.uiLine9); + this.PagePanel.Controls.Add(this.uiLine7); + this.PagePanel.Controls.Add(this.uiRoundMeter2); + this.PagePanel.Controls.Add(this.uiLine6); + this.PagePanel.Controls.Add(this.uiRoundMeter1); + this.PagePanel.Controls.Add(this.uiLine1); + this.PagePanel.Controls.Add(this.uiLedStopwatch1); + this.PagePanel.Controls.Add(this.uiLedDisplay1); + // + // uiAnalogMeter1 + // + this.uiAnalogMeter1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiAnalogMeter1.Location = new System.Drawing.Point(381, 146); + this.uiAnalogMeter1.MaxValue = 100D; + this.uiAnalogMeter1.MinValue = 0D; + this.uiAnalogMeter1.Name = "uiAnalogMeter1"; + this.uiAnalogMeter1.Renderer = null; + this.uiAnalogMeter1.Size = new System.Drawing.Size(140, 140); + this.uiAnalogMeter1.TabIndex = 52; + this.uiAnalogMeter1.Text = "uiAnalogMeter1"; + this.uiAnalogMeter1.Value = 0D; + // + // uiLine9 + // + this.uiLine9.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLine9.Location = new System.Drawing.Point(381, 105); + this.uiLine9.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine9.Name = "uiLine9"; + this.uiLine9.Size = new System.Drawing.Size(319, 20); + this.uiLine9.TabIndex = 51; + this.uiLine9.Text = "UIAnalogMeter"; + this.uiLine9.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiLine7 + // + this.uiLine7.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLine7.Location = new System.Drawing.Point(381, 20); + this.uiLine7.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine7.Name = "uiLine7"; + this.uiLine7.Size = new System.Drawing.Size(319, 20); + this.uiLine7.TabIndex = 50; + this.uiLine7.Text = "UILedStopwatch"; + this.uiLine7.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiLine6 + // + this.uiLine6.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLine6.Location = new System.Drawing.Point(30, 105); + this.uiLine6.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine6.Name = "uiLine6"; + this.uiLine6.Size = new System.Drawing.Size(319, 20); + this.uiLine6.TabIndex = 48; + this.uiLine6.Text = "UIRoundMeter"; + this.uiLine6.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiLine1 + // + this.uiLine1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLine1.Location = new System.Drawing.Point(30, 20); + 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 = 46; + this.uiLine1.Text = "UILedDisplay"; + this.uiLine1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiLedStopwatch1 + // + this.uiLedStopwatch1.Active = true; + this.uiLedStopwatch1.BackColor = System.Drawing.Color.Black; + this.uiLedStopwatch1.ForeColor = System.Drawing.Color.Lime; + this.uiLedStopwatch1.Location = new System.Drawing.Point(381, 52); + this.uiLedStopwatch1.Name = "uiLedStopwatch1"; + this.uiLedStopwatch1.Size = new System.Drawing.Size(190, 34); + this.uiLedStopwatch1.TabIndex = 45; + this.uiLedStopwatch1.Text = "01:18"; + // + // uiLedDisplay1 + // + this.uiLedDisplay1.BackColor = System.Drawing.Color.Black; + this.uiLedDisplay1.ForeColor = System.Drawing.Color.Lime; + this.uiLedDisplay1.Location = new System.Drawing.Point(30, 52); + this.uiLedDisplay1.Name = "uiLedDisplay1"; + this.uiLedDisplay1.Size = new System.Drawing.Size(190, 34); + this.uiLedDisplay1.TabIndex = 44; + this.uiLedDisplay1.Text = "999.9 Ω"; + // + // timer1 + // + this.timer1.Tick += new System.EventHandler(this.timer1_Tick); + // + // uiRoundMeter2 + // + this.uiRoundMeter2.Angle = 0D; + this.uiRoundMeter2.AngleImage = ((System.Drawing.Image)(resources.GetObject("uiRoundMeter2.AngleImage"))); + this.uiRoundMeter2.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("uiRoundMeter2.BackgroundImage"))); + this.uiRoundMeter2.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None; + this.uiRoundMeter2.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiRoundMeter2.Location = new System.Drawing.Point(186, 141); + this.uiRoundMeter2.MeterType = Sunny.UI.UIRoundMeter.TMeterType.Wind; + this.uiRoundMeter2.Name = "uiRoundMeter2"; + this.uiRoundMeter2.Size = new System.Drawing.Size(140, 140); + this.uiRoundMeter2.TabIndex = 49; + this.uiRoundMeter2.Text = "uiRoundMeter2"; + // + // uiRoundMeter1 + // + this.uiRoundMeter1.Angle = 0D; + this.uiRoundMeter1.AngleImage = ((System.Drawing.Image)(resources.GetObject("uiRoundMeter1.AngleImage"))); + this.uiRoundMeter1.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("uiRoundMeter1.BackgroundImage"))); + this.uiRoundMeter1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None; + this.uiRoundMeter1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiRoundMeter1.Location = new System.Drawing.Point(30, 136); + this.uiRoundMeter1.Name = "uiRoundMeter1"; + this.uiRoundMeter1.Size = new System.Drawing.Size(150, 150); + this.uiRoundMeter1.TabIndex = 47; + this.uiRoundMeter1.Text = "uiRoundMeter1"; + // + // FMeter + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 450); + this.Name = "FMeter"; + this.Text = "Meter"; + this.PagePanel.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private UIAnalogMeter uiAnalogMeter1; + private UILine uiLine9; + private UILine uiLine7; + private UIRoundMeter uiRoundMeter2; + private UILine uiLine6; + private UIRoundMeter uiRoundMeter1; + private UILine uiLine1; + private UILedStopwatch uiLedStopwatch1; + private UILedDisplay uiLedDisplay1; + private System.Windows.Forms.Timer timer1; + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Controls/FMeter.cs b/SunnyUI.Demo/Controls/FMeter.cs new file mode 100644 index 00000000..25a5b377 --- /dev/null +++ b/SunnyUI.Demo/Controls/FMeter.cs @@ -0,0 +1,27 @@ +namespace Sunny.UI.Demo +{ + public partial class FMeter : UITitlePage + { + public FMeter() + { + InitializeComponent(); + } + + private int value; + + public override void Init() + { + uiLedStopwatch1.Active = true; + value = 0; + timer1.ReStart(); + } + + private void timer1_Tick(object sender, System.EventArgs e) + { + value++; + uiRoundMeter1.Angle = value * 10; + uiRoundMeter2.Angle = value * 10; + uiAnalogMeter1.Value = value; + } + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Controls/FMeter.resx b/SunnyUI.Demo/Controls/FMeter.resx new file mode 100644 index 00000000..af441c40 --- /dev/null +++ b/SunnyUI.Demo/Controls/FMeter.resx @@ -0,0 +1,824 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + + 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 + f+uvSxAXl/8PnMmNTepNpz0AAAAASUVORK5CYII= + + + + + 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 + + + \ No newline at end of file diff --git a/SunnyUI.Demo/Controls/FNavigation.Designer.cs b/SunnyUI.Demo/Controls/FNavigation.Designer.cs new file mode 100644 index 00000000..8dd59d7d --- /dev/null +++ b/SunnyUI.Demo/Controls/FNavigation.Designer.cs @@ -0,0 +1,374 @@ +namespace Sunny.UI.Demo +{ + partial class FNavigation + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.Windows.Forms.TreeNode treeNode43 = new System.Windows.Forms.TreeNode("节点0"); + System.Windows.Forms.TreeNode treeNode44 = new System.Windows.Forms.TreeNode("节点1"); + System.Windows.Forms.TreeNode treeNode45 = new System.Windows.Forms.TreeNode("节点2"); + System.Windows.Forms.TreeNode treeNode46 = new System.Windows.Forms.TreeNode("节点0", new System.Windows.Forms.TreeNode[] { + treeNode43, + treeNode44, + treeNode45}); + System.Windows.Forms.TreeNode treeNode47 = new System.Windows.Forms.TreeNode("节点1"); + System.Windows.Forms.TreeNode treeNode48 = new System.Windows.Forms.TreeNode("节点2"); + System.Windows.Forms.TreeNode treeNode49 = new System.Windows.Forms.TreeNode("节点3"); + System.Windows.Forms.TreeNode treeNode50 = new System.Windows.Forms.TreeNode("节点0", new System.Windows.Forms.TreeNode[] { + treeNode46, + treeNode47, + treeNode48, + treeNode49}); + System.Windows.Forms.TreeNode treeNode51 = new System.Windows.Forms.TreeNode("节点4"); + System.Windows.Forms.TreeNode treeNode52 = new System.Windows.Forms.TreeNode("节点5"); + System.Windows.Forms.TreeNode treeNode53 = new System.Windows.Forms.TreeNode("节点6"); + System.Windows.Forms.TreeNode treeNode54 = new System.Windows.Forms.TreeNode("节点1", new System.Windows.Forms.TreeNode[] { + treeNode51, + treeNode52, + treeNode53}); + System.Windows.Forms.TreeNode treeNode55 = new System.Windows.Forms.TreeNode("节点7"); + System.Windows.Forms.TreeNode treeNode56 = new System.Windows.Forms.TreeNode("节点8"); + System.Windows.Forms.TreeNode treeNode57 = new System.Windows.Forms.TreeNode("节点2", new System.Windows.Forms.TreeNode[] { + treeNode55, + treeNode56}); + System.Windows.Forms.TreeNode treeNode58 = new System.Windows.Forms.TreeNode("节点9"); + System.Windows.Forms.TreeNode treeNode59 = new System.Windows.Forms.TreeNode("节点3", new System.Windows.Forms.TreeNode[] { + treeNode58}); + System.Windows.Forms.TreeNode treeNode22 = new System.Windows.Forms.TreeNode("节点14"); + System.Windows.Forms.TreeNode treeNode23 = new System.Windows.Forms.TreeNode("节点15"); + System.Windows.Forms.TreeNode treeNode24 = new System.Windows.Forms.TreeNode("节点16"); + System.Windows.Forms.TreeNode treeNode25 = new System.Windows.Forms.TreeNode("节点17"); + System.Windows.Forms.TreeNode treeNode26 = new System.Windows.Forms.TreeNode("节点0", new System.Windows.Forms.TreeNode[] { + treeNode22, + treeNode23, + treeNode24, + treeNode25}); + System.Windows.Forms.TreeNode treeNode27 = new System.Windows.Forms.TreeNode("节点18"); + System.Windows.Forms.TreeNode treeNode28 = new System.Windows.Forms.TreeNode("节点19"); + System.Windows.Forms.TreeNode treeNode29 = new System.Windows.Forms.TreeNode("节点20"); + System.Windows.Forms.TreeNode treeNode30 = new System.Windows.Forms.TreeNode("节点1", new System.Windows.Forms.TreeNode[] { + treeNode27, + treeNode28, + treeNode29}); + 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("节点4"); + System.Windows.Forms.TreeNode treeNode34 = new System.Windows.Forms.TreeNode("节点5"); + System.Windows.Forms.TreeNode treeNode35 = new System.Windows.Forms.TreeNode("节点6"); + System.Windows.Forms.TreeNode treeNode36 = new System.Windows.Forms.TreeNode("节点7"); + System.Windows.Forms.TreeNode treeNode37 = new System.Windows.Forms.TreeNode("节点8"); + System.Windows.Forms.TreeNode treeNode38 = new System.Windows.Forms.TreeNode("节点9"); + System.Windows.Forms.TreeNode treeNode39 = new System.Windows.Forms.TreeNode("节点10"); + System.Windows.Forms.TreeNode treeNode40 = new System.Windows.Forms.TreeNode("节点11"); + System.Windows.Forms.TreeNode treeNode41 = new System.Windows.Forms.TreeNode("节点12"); + System.Windows.Forms.TreeNode treeNode42 = new System.Windows.Forms.TreeNode("节点13"); + System.Windows.Forms.TreeNode treeNode1 = new System.Windows.Forms.TreeNode("节点14"); + System.Windows.Forms.TreeNode treeNode2 = new System.Windows.Forms.TreeNode("节点15"); + System.Windows.Forms.TreeNode treeNode3 = new System.Windows.Forms.TreeNode("节点16"); + System.Windows.Forms.TreeNode treeNode4 = new System.Windows.Forms.TreeNode("节点17"); + 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("节点18"); + System.Windows.Forms.TreeNode treeNode7 = new System.Windows.Forms.TreeNode("节点19"); + System.Windows.Forms.TreeNode treeNode8 = new System.Windows.Forms.TreeNode("节点20"); + System.Windows.Forms.TreeNode treeNode9 = new System.Windows.Forms.TreeNode("节点1", new System.Windows.Forms.TreeNode[] { + treeNode6, + treeNode7, + treeNode8}); + System.Windows.Forms.TreeNode treeNode10 = new System.Windows.Forms.TreeNode("节点2"); + System.Windows.Forms.TreeNode treeNode11 = new System.Windows.Forms.TreeNode("节点3"); + System.Windows.Forms.TreeNode treeNode12 = new System.Windows.Forms.TreeNode("节点4"); + System.Windows.Forms.TreeNode treeNode13 = new System.Windows.Forms.TreeNode("节点5"); + System.Windows.Forms.TreeNode treeNode14 = new System.Windows.Forms.TreeNode("节点6"); + System.Windows.Forms.TreeNode treeNode15 = new System.Windows.Forms.TreeNode("节点7"); + System.Windows.Forms.TreeNode treeNode16 = new System.Windows.Forms.TreeNode("节点8"); + System.Windows.Forms.TreeNode treeNode17 = new System.Windows.Forms.TreeNode("节点9"); + System.Windows.Forms.TreeNode treeNode18 = new System.Windows.Forms.TreeNode("节点10"); + System.Windows.Forms.TreeNode treeNode19 = new System.Windows.Forms.TreeNode("节点11"); + System.Windows.Forms.TreeNode treeNode20 = new System.Windows.Forms.TreeNode("节点12"); + System.Windows.Forms.TreeNode treeNode21 = new System.Windows.Forms.TreeNode("节点13"); + this.uiNavBar1 = new Sunny.UI.UINavBar(); + this.uiLine1 = new Sunny.UI.UILine(); + this.uiNavMenu1 = new Sunny.UI.UINavMenu(); + this.uiNavMenu2 = new Sunny.UI.UINavMenu(); + this.uiLine2 = new Sunny.UI.UILine(); + this.PagePanel.SuspendLayout(); + this.uiNavBar1.SuspendLayout(); + this.SuspendLayout(); + // + // PagePanel + // + this.PagePanel.Controls.Add(this.uiLine2); + this.PagePanel.Controls.Add(this.uiNavMenu2); + this.PagePanel.Controls.Add(this.uiNavMenu1); + this.PagePanel.Controls.Add(this.uiNavBar1); + this.PagePanel.Size = new System.Drawing.Size(800, 545); + // + // uiNavBar1 + // + this.uiNavBar1.Controls.Add(this.uiLine1); + this.uiNavBar1.Dock = System.Windows.Forms.DockStyle.Top; + this.uiNavBar1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiNavBar1.Location = new System.Drawing.Point(0, 0); + this.uiNavBar1.Name = "uiNavBar1"; + treeNode43.Name = "节点0"; + treeNode43.Text = "节点0"; + treeNode44.Name = "节点1"; + treeNode44.Text = "节点1"; + treeNode45.Name = "节点2"; + treeNode45.Text = "节点2"; + treeNode46.Name = "节点0"; + treeNode46.Text = "节点0"; + treeNode47.Name = "节点1"; + treeNode47.Text = "节点1"; + treeNode48.Name = "节点2"; + treeNode48.Text = "节点2"; + treeNode49.Name = "节点3"; + treeNode49.Text = "节点3"; + treeNode50.Name = "节点0"; + treeNode50.Text = "节点0"; + treeNode51.Name = "节点4"; + treeNode51.Text = "节点4"; + treeNode52.Name = "节点5"; + treeNode52.Text = "节点5"; + treeNode53.Name = "节点6"; + treeNode53.Text = "节点6"; + treeNode54.Name = "节点1"; + treeNode54.Text = "节点1"; + treeNode55.Name = "节点7"; + treeNode55.Text = "节点7"; + treeNode56.Name = "节点8"; + treeNode56.Text = "节点8"; + treeNode57.Name = "节点2"; + treeNode57.Text = "节点2"; + treeNode58.Name = "节点9"; + treeNode58.Text = "节点9"; + treeNode59.Name = "节点3"; + treeNode59.Text = "节点3"; + this.uiNavBar1.Nodes.AddRange(new System.Windows.Forms.TreeNode[] { + treeNode50, + treeNode54, + treeNode57, + treeNode59}); + this.uiNavBar1.Size = new System.Drawing.Size(800, 110); + this.uiNavBar1.TabIndex = 0; + this.uiNavBar1.Text = "uiNavBar1"; + // + // uiLine1 + // + this.uiLine1.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(56)))), ((int)(((byte)(56)))), ((int)(((byte)(56))))); + this.uiLine1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLine1.ForeColor = System.Drawing.Color.White; + this.uiLine1.Location = new System.Drawing.Point(30, 20); + this.uiLine1.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine1.Name = "uiLine1"; + this.uiLine1.Size = new System.Drawing.Size(670, 20); + this.uiLine1.Style = Sunny.UI.UIStyle.Custom; + this.uiLine1.StyleCustomMode = true; + this.uiLine1.TabIndex = 20; + this.uiLine1.Text = "UINavBar"; + this.uiLine1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiNavMenu1 + // + this.uiNavMenu1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(56)))), ((int)(((byte)(56)))), ((int)(((byte)(56))))); + this.uiNavMenu1.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.uiNavMenu1.DrawMode = System.Windows.Forms.TreeViewDrawMode.OwnerDrawAll; + this.uiNavMenu1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiNavMenu1.ItemHeight = 50; + this.uiNavMenu1.Location = new System.Drawing.Point(30, 157); + this.uiNavMenu1.Name = "uiNavMenu1"; + treeNode22.Name = "节点14"; + treeNode22.Text = "节点14"; + treeNode23.Name = "节点15"; + treeNode23.Text = "节点15"; + treeNode24.Name = "节点16"; + treeNode24.Text = "节点16"; + treeNode25.Name = "节点17"; + treeNode25.Text = "节点17"; + treeNode26.Name = "节点0"; + treeNode26.Text = "节点0"; + treeNode27.Name = "节点18"; + treeNode27.Text = "节点18"; + treeNode28.Name = "节点19"; + treeNode28.Text = "节点19"; + treeNode29.Name = "节点20"; + treeNode29.Text = "节点20"; + treeNode30.Name = "节点1"; + treeNode30.Text = "节点1"; + treeNode31.Name = "节点2"; + treeNode31.Text = "节点2"; + treeNode32.Name = "节点3"; + treeNode32.Text = "节点3"; + treeNode33.Name = "节点4"; + treeNode33.Text = "节点4"; + treeNode34.Name = "节点5"; + treeNode34.Text = "节点5"; + treeNode35.Name = "节点6"; + treeNode35.Text = "节点6"; + treeNode36.Name = "节点7"; + treeNode36.Text = "节点7"; + treeNode37.Name = "节点8"; + treeNode37.Text = "节点8"; + treeNode38.Name = "节点9"; + treeNode38.Text = "节点9"; + treeNode39.Name = "节点10"; + treeNode39.Text = "节点10"; + treeNode40.Name = "节点11"; + treeNode40.Text = "节点11"; + treeNode41.Name = "节点12"; + treeNode41.Text = "节点12"; + treeNode42.Name = "节点13"; + treeNode42.Text = "节点13"; + this.uiNavMenu1.Nodes.AddRange(new System.Windows.Forms.TreeNode[] { + treeNode26, + treeNode30, + treeNode31, + treeNode32, + treeNode33, + treeNode34, + treeNode35, + treeNode36, + treeNode37, + treeNode38, + treeNode39, + treeNode40, + treeNode41, + treeNode42}); + this.uiNavMenu1.Size = new System.Drawing.Size(253, 353); + this.uiNavMenu1.TabIndex = 1; + // + // uiNavMenu2 + // + this.uiNavMenu2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(250)))), ((int)(((byte)(250)))), ((int)(((byte)(250))))); + this.uiNavMenu2.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.uiNavMenu2.DrawMode = System.Windows.Forms.TreeViewDrawMode.OwnerDrawAll; + this.uiNavMenu2.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(250)))), ((int)(((byte)(250)))), ((int)(((byte)(250))))); + this.uiNavMenu2.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiNavMenu2.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(48))))); + this.uiNavMenu2.HoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(230)))), ((int)(((byte)(230))))); + this.uiNavMenu2.ItemHeight = 50; + this.uiNavMenu2.Location = new System.Drawing.Point(299, 157); + this.uiNavMenu2.MenuStyle = Sunny.UI.UIMenuStyle.White; + this.uiNavMenu2.Name = "uiNavMenu2"; + treeNode1.Name = "节点14"; + treeNode1.Text = "节点14"; + treeNode2.Name = "节点15"; + treeNode2.Text = "节点15"; + treeNode3.Name = "节点16"; + treeNode3.Text = "节点16"; + treeNode4.Name = "节点17"; + treeNode4.Text = "节点17"; + treeNode5.Name = "节点0"; + treeNode5.Text = "节点0"; + treeNode6.Name = "节点18"; + treeNode6.Text = "节点18"; + treeNode7.Name = "节点19"; + treeNode7.Text = "节点19"; + treeNode8.Name = "节点20"; + treeNode8.Text = "节点20"; + treeNode9.Name = "节点1"; + treeNode9.Text = "节点1"; + treeNode10.Name = "节点2"; + treeNode10.Text = "节点2"; + treeNode11.Name = "节点3"; + treeNode11.Text = "节点3"; + treeNode12.Name = "节点4"; + treeNode12.Text = "节点4"; + treeNode13.Name = "节点5"; + treeNode13.Text = "节点5"; + treeNode14.Name = "节点6"; + treeNode14.Text = "节点6"; + treeNode15.Name = "节点7"; + treeNode15.Text = "节点7"; + treeNode16.Name = "节点8"; + treeNode16.Text = "节点8"; + treeNode17.Name = "节点9"; + treeNode17.Text = "节点9"; + treeNode18.Name = "节点10"; + treeNode18.Text = "节点10"; + treeNode19.Name = "节点11"; + treeNode19.Text = "节点11"; + treeNode20.Name = "节点12"; + treeNode20.Text = "节点12"; + treeNode21.Name = "节点13"; + treeNode21.Text = "节点13"; + this.uiNavMenu2.Nodes.AddRange(new System.Windows.Forms.TreeNode[] { + treeNode5, + treeNode9, + treeNode10, + treeNode11, + treeNode12, + treeNode13, + treeNode14, + treeNode15, + treeNode16, + treeNode17, + treeNode18, + treeNode19, + treeNode20, + treeNode21}); + this.uiNavMenu2.SelectedColor = System.Drawing.Color.FromArgb(((int)(((byte)(240)))), ((int)(((byte)(240)))), ((int)(((byte)(240))))); + this.uiNavMenu2.Size = new System.Drawing.Size(253, 353); + this.uiNavMenu2.TabIndex = 2; + // + // uiLine2 + // + this.uiLine2.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLine2.Location = new System.Drawing.Point(30, 125); + this.uiLine2.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine2.Name = "uiLine2"; + this.uiLine2.Size = new System.Drawing.Size(670, 20); + this.uiLine2.TabIndex = 19; + this.uiLine2.Text = "UINavMenu"; + this.uiLine2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // FNavigation + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 580); + this.Name = "FNavigation"; + this.Text = "NavBar"; + this.PagePanel.ResumeLayout(false); + this.uiNavBar1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private UINavBar uiNavBar1; + private UINavMenu uiNavMenu1; + private UINavMenu uiNavMenu2; + private UILine uiLine1; + private UILine uiLine2; + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Controls/FNavigation.cs b/SunnyUI.Demo/Controls/FNavigation.cs new file mode 100644 index 00000000..bd71e968 --- /dev/null +++ b/SunnyUI.Demo/Controls/FNavigation.cs @@ -0,0 +1,10 @@ +namespace Sunny.UI.Demo +{ + public partial class FNavigation : UITitlePage + { + public FNavigation() + { + InitializeComponent(); + } + } +} diff --git a/SunnyUI.Demo/Controls/FNavigation.resx b/SunnyUI.Demo/Controls/FNavigation.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/SunnyUI.Demo/Controls/FNavigation.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SunnyUI.Demo/Controls/FOther.Designer.cs b/SunnyUI.Demo/Controls/FOther.Designer.cs new file mode 100644 index 00000000..80f615e1 --- /dev/null +++ b/SunnyUI.Demo/Controls/FOther.Designer.cs @@ -0,0 +1,356 @@ +namespace Sunny.UI.Demo +{ + partial class FOther + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.uiLight1 = new Sunny.UI.UILight(); + this.uiLine2 = new Sunny.UI.UILine(); + this.uiLight2 = new Sunny.UI.UILight(); + this.uiLight3 = new Sunny.UI.UILight(); + this.uiProcessBar1 = new Sunny.UI.UIProcessBar(); + this.uiLine3 = new Sunny.UI.UILine(); + this.uiProgressIndicator1 = new Sunny.UI.UIProgressIndicator(); + this.uiLine4 = new Sunny.UI.UILine(); + this.uiTrackBar1 = new Sunny.UI.UITrackBar(); + this.uiLine5 = new Sunny.UI.UILine(); + this.timer1 = new System.Windows.Forms.Timer(this.components); + this.uiScrollBar1 = new Sunny.UI.UIScrollBar(); + this.uiLight4 = new Sunny.UI.UILight(); + this.uiLedBulb1 = new Sunny.UI.UILedBulb(); + this.uiLine8 = new Sunny.UI.UILine(); + this.uiLedBulb2 = new Sunny.UI.UILedBulb(); + this.uiLedBulb3 = new Sunny.UI.UILedBulb(); + this.uiLedBulb4 = new Sunny.UI.UILedBulb(); + this.uiLine1 = new Sunny.UI.UILine(); + this.uiScrollBar2 = new Sunny.UI.UIScrollBar(); + this.uiScrollBar3 = new Sunny.UI.UIScrollBar(); + this.uiScrollBar4 = new Sunny.UI.UIScrollBar(); + this.PagePanel.SuspendLayout(); + this.SuspendLayout(); + // + // PagePanel + // + this.PagePanel.Controls.Add(this.uiScrollBar4); + this.PagePanel.Controls.Add(this.uiScrollBar3); + this.PagePanel.Controls.Add(this.uiScrollBar2); + this.PagePanel.Controls.Add(this.uiLine1); + this.PagePanel.Controls.Add(this.uiLedBulb4); + this.PagePanel.Controls.Add(this.uiLedBulb3); + this.PagePanel.Controls.Add(this.uiLedBulb2); + this.PagePanel.Controls.Add(this.uiLine8); + this.PagePanel.Controls.Add(this.uiLedBulb1); + this.PagePanel.Controls.Add(this.uiLight4); + this.PagePanel.Controls.Add(this.uiScrollBar1); + this.PagePanel.Controls.Add(this.uiLine5); + this.PagePanel.Controls.Add(this.uiTrackBar1); + this.PagePanel.Controls.Add(this.uiLine4); + this.PagePanel.Controls.Add(this.uiProgressIndicator1); + this.PagePanel.Controls.Add(this.uiLine3); + this.PagePanel.Controls.Add(this.uiProcessBar1); + this.PagePanel.Controls.Add(this.uiLight3); + this.PagePanel.Controls.Add(this.uiLight2); + this.PagePanel.Controls.Add(this.uiLine2); + this.PagePanel.Controls.Add(this.uiLight1); + this.PagePanel.Size = new System.Drawing.Size(800, 472); + // + // uiLight1 + // + this.uiLight1.CenterColor = System.Drawing.Color.FromArgb(((int)(((byte)(239)))), ((int)(((byte)(248)))), ((int)(((byte)(232))))); + this.uiLight1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLight1.Location = new System.Drawing.Point(30, 52); + this.uiLight1.Name = "uiLight1"; + this.uiLight1.Radius = 35; + this.uiLight1.Size = new System.Drawing.Size(35, 35); + this.uiLight1.TabIndex = 20; + this.uiLight1.Text = "uiLight1"; + // + // uiLine2 + // + this.uiLine2.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLine2.Location = new System.Drawing.Point(30, 20); + this.uiLine2.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine2.Name = "uiLine2"; + this.uiLine2.Size = new System.Drawing.Size(319, 20); + this.uiLine2.TabIndex = 21; + this.uiLine2.Text = "UILight"; + this.uiLine2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiLight2 + // + this.uiLight2.CenterColor = System.Drawing.Color.FromArgb(((int)(((byte)(239)))), ((int)(((byte)(248)))), ((int)(((byte)(232))))); + this.uiLight2.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLight2.Location = new System.Drawing.Point(114, 52); + this.uiLight2.Name = "uiLight2"; + this.uiLight2.Radius = 35; + this.uiLight2.Size = new System.Drawing.Size(35, 35); + this.uiLight2.State = Sunny.UI.UILightState.Off; + this.uiLight2.TabIndex = 22; + this.uiLight2.Text = "uiLight2"; + // + // uiLight3 + // + this.uiLight3.CenterColor = System.Drawing.Color.FromArgb(((int)(((byte)(239)))), ((int)(((byte)(248)))), ((int)(((byte)(232))))); + this.uiLight3.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLight3.Location = new System.Drawing.Point(156, 52); + this.uiLight3.Name = "uiLight3"; + this.uiLight3.Radius = 35; + this.uiLight3.Size = new System.Drawing.Size(35, 35); + this.uiLight3.State = Sunny.UI.UILightState.Blink; + this.uiLight3.TabIndex = 23; + this.uiLight3.Text = "uiLight3"; + // + // uiProcessBar1 + // + this.uiProcessBar1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiProcessBar1.Location = new System.Drawing.Point(30, 136); + this.uiProcessBar1.MinimumSize = new System.Drawing.Size(70, 23); + this.uiProcessBar1.Name = "uiProcessBar1"; + this.uiProcessBar1.Size = new System.Drawing.Size(319, 29); + this.uiProcessBar1.TabIndex = 24; + this.uiProcessBar1.Text = "0.0%"; + // + // uiLine3 + // + this.uiLine3.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLine3.Location = new System.Drawing.Point(30, 103); + this.uiLine3.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine3.Name = "uiLine3"; + this.uiLine3.Size = new System.Drawing.Size(319, 20); + this.uiLine3.TabIndex = 25; + this.uiLine3.Text = "UIProcessBar"; + this.uiLine3.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiProgressIndicator1 + // + this.uiProgressIndicator1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiProgressIndicator1.Location = new System.Drawing.Point(30, 217); + this.uiProgressIndicator1.Name = "uiProgressIndicator1"; + this.uiProgressIndicator1.Size = new System.Drawing.Size(119, 132); + this.uiProgressIndicator1.TabIndex = 26; + this.uiProgressIndicator1.Text = "uiProgressIndicator1"; + // + // uiLine4 + // + this.uiLine4.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLine4.Location = new System.Drawing.Point(30, 182); + this.uiLine4.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine4.Name = "uiLine4"; + this.uiLine4.Size = new System.Drawing.Size(319, 20); + this.uiLine4.TabIndex = 27; + this.uiLine4.Text = "UIProgressIndicator"; + this.uiLine4.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiTrackBar1 + // + this.uiTrackBar1.DisableColor = System.Drawing.Color.Silver; + this.uiTrackBar1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiTrackBar1.Location = new System.Drawing.Point(381, 136); + this.uiTrackBar1.Name = "uiTrackBar1"; + this.uiTrackBar1.Size = new System.Drawing.Size(158, 29); + this.uiTrackBar1.Style = Sunny.UI.UIStyle.Custom; + this.uiTrackBar1.TabIndex = 30; + this.uiTrackBar1.Text = "uiTrackBar1"; + // + // uiLine5 + // + this.uiLine5.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLine5.Location = new System.Drawing.Point(381, 101); + this.uiLine5.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine5.Name = "uiLine5"; + this.uiLine5.Size = new System.Drawing.Size(319, 20); + this.uiLine5.TabIndex = 31; + this.uiLine5.Text = "UITrackBar"; + this.uiLine5.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // timer1 + // + this.timer1.Tick += new System.EventHandler(this.timer1_Tick); + // + // uiScrollBar1 + // + this.uiScrollBar1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiScrollBar1.Location = new System.Drawing.Point(381, 217); + this.uiScrollBar1.Name = "uiScrollBar1"; + this.uiScrollBar1.Size = new System.Drawing.Size(23, 163); + this.uiScrollBar1.TabIndex = 35; + this.uiScrollBar1.Text = "uiScrollBar1"; + // + // uiLight4 + // + this.uiLight4.CenterColor = System.Drawing.Color.FromArgb(((int)(((byte)(239)))), ((int)(((byte)(248)))), ((int)(((byte)(232))))); + this.uiLight4.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLight4.Location = new System.Drawing.Point(72, 52); + this.uiLight4.Name = "uiLight4"; + this.uiLight4.OnColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.uiLight4.Radius = 35; + this.uiLight4.ShowLightLine = false; + this.uiLight4.Size = new System.Drawing.Size(35, 35); + this.uiLight4.TabIndex = 36; + this.uiLight4.Text = "uiLight4"; + // + // uiLedBulb1 + // + this.uiLedBulb1.Location = new System.Drawing.Point(381, 52); + this.uiLedBulb1.Name = "uiLedBulb1"; + this.uiLedBulb1.Size = new System.Drawing.Size(32, 32); + this.uiLedBulb1.TabIndex = 37; + this.uiLedBulb1.Text = "uiLedBulb1"; + // + // uiLine8 + // + this.uiLine8.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLine8.Location = new System.Drawing.Point(381, 20); + this.uiLine8.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine8.Name = "uiLine8"; + this.uiLine8.Size = new System.Drawing.Size(319, 20); + this.uiLine8.TabIndex = 38; + this.uiLine8.Text = "UILedBulb"; + this.uiLine8.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiLedBulb2 + // + this.uiLedBulb2.Color = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(192)))), ((int)(((byte)(192))))); + this.uiLedBulb2.Location = new System.Drawing.Point(423, 52); + this.uiLedBulb2.Name = "uiLedBulb2"; + this.uiLedBulb2.Size = new System.Drawing.Size(32, 32); + this.uiLedBulb2.TabIndex = 39; + this.uiLedBulb2.Text = "uiLedBulb2"; + // + // uiLedBulb3 + // + this.uiLedBulb3.Location = new System.Drawing.Point(465, 52); + this.uiLedBulb3.Name = "uiLedBulb3"; + this.uiLedBulb3.On = false; + this.uiLedBulb3.Size = new System.Drawing.Size(32, 32); + this.uiLedBulb3.TabIndex = 40; + this.uiLedBulb3.Text = "uiLedBulb3"; + // + // uiLedBulb4 + // + this.uiLedBulb4.Blink = true; + this.uiLedBulb4.BlinkInterval = 500; + this.uiLedBulb4.Location = new System.Drawing.Point(507, 52); + this.uiLedBulb4.Name = "uiLedBulb4"; + this.uiLedBulb4.Size = new System.Drawing.Size(32, 32); + this.uiLedBulb4.TabIndex = 41; + this.uiLedBulb4.Text = "uiLedBulb4"; + // + // uiLine1 + // + this.uiLine1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLine1.Location = new System.Drawing.Point(381, 182); + 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 = 42; + this.uiLine1.Text = "UIScrollBar"; + this.uiLine1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiScrollBar2 + // + this.uiScrollBar2.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(239)))), ((int)(((byte)(248)))), ((int)(((byte)(232))))); + this.uiScrollBar2.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiScrollBar2.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(110)))), ((int)(((byte)(190)))), ((int)(((byte)(40))))); + this.uiScrollBar2.HoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(136)))), ((int)(((byte)(202)))), ((int)(((byte)(81))))); + this.uiScrollBar2.Location = new System.Drawing.Point(423, 217); + this.uiScrollBar2.Name = "uiScrollBar2"; + this.uiScrollBar2.PressColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(168)))), ((int)(((byte)(35))))); + this.uiScrollBar2.Size = new System.Drawing.Size(23, 163); + this.uiScrollBar2.Style = Sunny.UI.UIStyle.Green; + this.uiScrollBar2.StyleCustomMode = true; + this.uiScrollBar2.TabIndex = 43; + this.uiScrollBar2.Text = "uiScrollBar2"; + // + // uiScrollBar3 + // + this.uiScrollBar3.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(251)))), ((int)(((byte)(245)))), ((int)(((byte)(233))))); + this.uiScrollBar3.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiScrollBar3.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(155)))), ((int)(((byte)(40))))); + this.uiScrollBar3.HoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(223)))), ((int)(((byte)(174)))), ((int)(((byte)(86))))); + this.uiScrollBar3.Location = new System.Drawing.Point(465, 217); + this.uiScrollBar3.Name = "uiScrollBar3"; + this.uiScrollBar3.PressColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(137)))), ((int)(((byte)(43))))); + this.uiScrollBar3.Size = new System.Drawing.Size(23, 163); + this.uiScrollBar3.Style = Sunny.UI.UIStyle.Orange; + this.uiScrollBar3.StyleCustomMode = true; + this.uiScrollBar3.TabIndex = 44; + this.uiScrollBar3.Text = "uiScrollBar3"; + // + // uiScrollBar4 + // + this.uiScrollBar4.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(251)))), ((int)(((byte)(238)))), ((int)(((byte)(238))))); + this.uiScrollBar4.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiScrollBar4.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.uiScrollBar4.HoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(232)))), ((int)(((byte)(127)))), ((int)(((byte)(128))))); + this.uiScrollBar4.Location = new System.Drawing.Point(507, 217); + this.uiScrollBar4.Name = "uiScrollBar4"; + this.uiScrollBar4.PressColor = System.Drawing.Color.FromArgb(((int)(((byte)(202)))), ((int)(((byte)(87)))), ((int)(((byte)(89))))); + this.uiScrollBar4.Size = new System.Drawing.Size(23, 163); + this.uiScrollBar4.Style = Sunny.UI.UIStyle.Red; + this.uiScrollBar4.StyleCustomMode = true; + this.uiScrollBar4.TabIndex = 45; + this.uiScrollBar4.Text = "uiScrollBar4"; + // + // FOther + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 507); + this.Name = "FOther"; + this.Text = "Other"; + this.PagePanel.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + private UILight uiLight3; + private UILight uiLight2; + private UILine uiLine2; + private UILight uiLight1; + private UITrackBar uiTrackBar1; + private UILine uiLine4; + private UIProgressIndicator uiProgressIndicator1; + private UILine uiLine3; + private UIProcessBar uiProcessBar1; + private UILine uiLine5; + private System.Windows.Forms.Timer timer1; + private UIScrollBar uiScrollBar1; + private UILight uiLight4; + private UILedBulb uiLedBulb2; + private UILine uiLine8; + private UILedBulb uiLedBulb1; + private UILedBulb uiLedBulb4; + private UILedBulb uiLedBulb3; + private UIScrollBar uiScrollBar2; + private UILine uiLine1; + private UIScrollBar uiScrollBar4; + private UIScrollBar uiScrollBar3; + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Controls/FOther.cs b/SunnyUI.Demo/Controls/FOther.cs new file mode 100644 index 00000000..732ce8c5 --- /dev/null +++ b/SunnyUI.Demo/Controls/FOther.cs @@ -0,0 +1,26 @@ +namespace Sunny.UI.Demo +{ + public partial class FOther : UITitlePage + { + public FOther() + { + InitializeComponent(); + } + + private int value; + + public override void Init() + { + value = 0; + timer1.ReStart(); + } + + private void timer1_Tick(object sender, System.EventArgs e) + { + value++; + uiTrackBar1.Value = value; + uiProcessBar1.Value = value; + uiScrollBar1.Value = value; + } + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Controls/FOther.resx b/SunnyUI.Demo/Controls/FOther.resx new file mode 100644 index 00000000..1f666f26 --- /dev/null +++ b/SunnyUI.Demo/Controls/FOther.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/SunnyUI.Demo/Controls/FPanel.Designer.cs b/SunnyUI.Demo/Controls/FPanel.Designer.cs new file mode 100644 index 00000000..0007ddd7 --- /dev/null +++ b/SunnyUI.Demo/Controls/FPanel.Designer.cs @@ -0,0 +1,95 @@ +namespace Sunny.UI.Demo +{ + partial class FPanel + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.uiTitlePanel1 = new Sunny.UI.UITitlePanel(); + this.uiPanel1 = new Sunny.UI.UIPanel(); + this.uiGroupBox1 = new Sunny.UI.UIGroupBox(); + this.PagePanel.SuspendLayout(); + this.SuspendLayout(); + // + // PagePanel + // + this.PagePanel.Controls.Add(this.uiGroupBox1); + this.PagePanel.Controls.Add(this.uiPanel1); + this.PagePanel.Controls.Add(this.uiTitlePanel1); + this.PagePanel.Size = new System.Drawing.Size(800, 453); + // + // uiTitlePanel1 + // + this.uiTitlePanel1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiTitlePanel1.ForeColor = System.Drawing.Color.White; + this.uiTitlePanel1.Location = new System.Drawing.Point(30, 230); + this.uiTitlePanel1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.uiTitlePanel1.Name = "uiTitlePanel1"; + this.uiTitlePanel1.Padding = new System.Windows.Forms.Padding(1, 35, 1, 1); + this.uiTitlePanel1.Size = new System.Drawing.Size(270, 180); + this.uiTitlePanel1.Style = Sunny.UI.UIStyle.Custom; + this.uiTitlePanel1.TabIndex = 1; + this.uiTitlePanel1.Text = "uiTitlePanel1"; + // + // uiPanel1 + // + this.uiPanel1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiPanel1.Location = new System.Drawing.Point(30, 20); + this.uiPanel1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.uiPanel1.Name = "uiPanel1"; + this.uiPanel1.Size = new System.Drawing.Size(270, 180); + this.uiPanel1.TabIndex = 3; + this.uiPanel1.Text = "uiPanel1"; + // + // uiGroupBox1 + // + this.uiGroupBox1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiGroupBox1.Location = new System.Drawing.Point(331, 4); + this.uiGroupBox1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.uiGroupBox1.Name = "uiGroupBox1"; + this.uiGroupBox1.Size = new System.Drawing.Size(270, 196); + this.uiGroupBox1.TabIndex = 4; + this.uiGroupBox1.Text = "uiGroupBox1"; + // + // FPanel + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 488); + this.Name = "FPanel"; + this.PageIndex = 1005; + this.Text = "Panel"; + this.PagePanel.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + private UITitlePanel uiTitlePanel1; + private UIPanel uiPanel1; + private UIGroupBox uiGroupBox1; + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Controls/FPanel.cs b/SunnyUI.Demo/Controls/FPanel.cs new file mode 100644 index 00000000..2bd51f66 --- /dev/null +++ b/SunnyUI.Demo/Controls/FPanel.cs @@ -0,0 +1,10 @@ +namespace Sunny.UI.Demo +{ + public partial class FPanel : UITitlePage + { + public FPanel() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Controls/FPanel.resx b/SunnyUI.Demo/Controls/FPanel.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/SunnyUI.Demo/Controls/FPanel.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SunnyUI.Demo/Controls/FRadioButton.Designer.cs b/SunnyUI.Demo/Controls/FRadioButton.Designer.cs new file mode 100644 index 00000000..430adffb --- /dev/null +++ b/SunnyUI.Demo/Controls/FRadioButton.Designer.cs @@ -0,0 +1,350 @@ +namespace Sunny.UI.Demo +{ + partial class FRadioButton + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.uiRadioButton12 = new Sunny.UI.UIRadioButton(); + this.uiRadioButton13 = new Sunny.UI.UIRadioButton(); + this.uiLabel3 = new Sunny.UI.UILabel(); + this.uiRadioButton9 = new Sunny.UI.UIRadioButton(); + this.uiRadioButton10 = new Sunny.UI.UIRadioButton(); + this.uiRadioButton11 = new Sunny.UI.UIRadioButton(); + this.uiLabel2 = new Sunny.UI.UILabel(); + this.uiRadioButton5 = new Sunny.UI.UIRadioButton(); + this.uiRadioButton7 = new Sunny.UI.UIRadioButton(); + this.uiRadioButton8 = new Sunny.UI.UIRadioButton(); + this.uiLabel1 = new Sunny.UI.UILabel(); + this.uiRadioButton6 = new Sunny.UI.UIRadioButton(); + this.uiRadioButton3 = new Sunny.UI.UIRadioButton(); + this.uiRadioButton4 = new Sunny.UI.UIRadioButton(); + this.uiLine3 = new Sunny.UI.UILine(); + this.uiRadioButton2 = new Sunny.UI.UIRadioButton(); + this.uiRadioButton1 = new Sunny.UI.UIRadioButton(); + this.uiLine2 = new Sunny.UI.UILine(); + this.uiRadioButtonGroup1 = new Sunny.UI.UIRadioButtonGroup(); + this.PagePanel.SuspendLayout(); + this.SuspendLayout(); + // + // PagePanel + // + this.PagePanel.Controls.Add(this.uiRadioButtonGroup1); + this.PagePanel.Controls.Add(this.uiRadioButton12); + this.PagePanel.Controls.Add(this.uiRadioButton13); + this.PagePanel.Controls.Add(this.uiLabel3); + this.PagePanel.Controls.Add(this.uiRadioButton9); + this.PagePanel.Controls.Add(this.uiRadioButton10); + this.PagePanel.Controls.Add(this.uiRadioButton11); + this.PagePanel.Controls.Add(this.uiLabel2); + this.PagePanel.Controls.Add(this.uiRadioButton5); + this.PagePanel.Controls.Add(this.uiRadioButton7); + this.PagePanel.Controls.Add(this.uiRadioButton8); + this.PagePanel.Controls.Add(this.uiLabel1); + this.PagePanel.Controls.Add(this.uiRadioButton6); + this.PagePanel.Controls.Add(this.uiRadioButton3); + this.PagePanel.Controls.Add(this.uiRadioButton4); + this.PagePanel.Controls.Add(this.uiLine3); + this.PagePanel.Controls.Add(this.uiRadioButton2); + this.PagePanel.Controls.Add(this.uiRadioButton1); + this.PagePanel.Controls.Add(this.uiLine2); + this.PagePanel.Size = new System.Drawing.Size(800, 563); + // + // uiRadioButton12 + // + this.uiRadioButton12.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiRadioButton12.Enabled = false; + this.uiRadioButton12.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiRadioButton12.GroupIndex = 4; + this.uiRadioButton12.Location = new System.Drawing.Point(516, 48); + this.uiRadioButton12.Name = "uiRadioButton12"; + this.uiRadioButton12.Padding = new System.Windows.Forms.Padding(22, 0, 0, 0); + this.uiRadioButton12.Size = new System.Drawing.Size(156, 35); + this.uiRadioButton12.TabIndex = 61; + this.uiRadioButton12.Text = "uiRadioButton12"; + // + // uiRadioButton13 + // + this.uiRadioButton13.Checked = true; + this.uiRadioButton13.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiRadioButton13.Enabled = false; + this.uiRadioButton13.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiRadioButton13.GroupIndex = 4; + this.uiRadioButton13.Location = new System.Drawing.Point(354, 48); + this.uiRadioButton13.Name = "uiRadioButton13"; + this.uiRadioButton13.Padding = new System.Windows.Forms.Padding(22, 0, 0, 0); + this.uiRadioButton13.Size = new System.Drawing.Size(156, 35); + this.uiRadioButton13.TabIndex = 60; + this.uiRadioButton13.Text = "uiRadioButton13"; + // + // uiLabel3 + // + this.uiLabel3.AutoSize = true; + this.uiLabel3.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLabel3.Location = new System.Drawing.Point(49, 219); + this.uiLabel3.Name = "uiLabel3"; + this.uiLabel3.Size = new System.Drawing.Size(131, 21); + this.uiLabel3.TabIndex = 59; + this.uiLabel3.Text = "GroupIndex = 3"; + this.uiLabel3.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiRadioButton9 + // + this.uiRadioButton9.Checked = true; + this.uiRadioButton9.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiRadioButton9.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiRadioButton9.GroupIndex = 3; + this.uiRadioButton9.Location = new System.Drawing.Point(516, 212); + this.uiRadioButton9.Name = "uiRadioButton9"; + this.uiRadioButton9.Padding = new System.Windows.Forms.Padding(22, 0, 0, 0); + this.uiRadioButton9.Size = new System.Drawing.Size(156, 35); + this.uiRadioButton9.TabIndex = 58; + this.uiRadioButton9.Text = "uiRadioButton33"; + // + // uiRadioButton10 + // + this.uiRadioButton10.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiRadioButton10.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiRadioButton10.GroupIndex = 3; + this.uiRadioButton10.Location = new System.Drawing.Point(354, 212); + this.uiRadioButton10.Name = "uiRadioButton10"; + this.uiRadioButton10.Padding = new System.Windows.Forms.Padding(22, 0, 0, 0); + this.uiRadioButton10.Size = new System.Drawing.Size(156, 35); + this.uiRadioButton10.TabIndex = 57; + this.uiRadioButton10.Text = "uiRadioButton32"; + // + // uiRadioButton11 + // + this.uiRadioButton11.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiRadioButton11.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiRadioButton11.GroupIndex = 3; + this.uiRadioButton11.Location = new System.Drawing.Point(192, 212); + this.uiRadioButton11.Name = "uiRadioButton11"; + this.uiRadioButton11.Padding = new System.Windows.Forms.Padding(22, 0, 0, 0); + this.uiRadioButton11.Size = new System.Drawing.Size(156, 35); + this.uiRadioButton11.TabIndex = 56; + this.uiRadioButton11.Text = "uiRadioButton31"; + // + // uiLabel2 + // + this.uiLabel2.AutoSize = true; + this.uiLabel2.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLabel2.Location = new System.Drawing.Point(49, 178); + this.uiLabel2.Name = "uiLabel2"; + this.uiLabel2.Size = new System.Drawing.Size(131, 21); + this.uiLabel2.TabIndex = 55; + this.uiLabel2.Text = "GroupIndex = 2"; + this.uiLabel2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiRadioButton5 + // + this.uiRadioButton5.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiRadioButton5.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiRadioButton5.GroupIndex = 2; + this.uiRadioButton5.Location = new System.Drawing.Point(516, 171); + this.uiRadioButton5.Name = "uiRadioButton5"; + this.uiRadioButton5.Padding = new System.Windows.Forms.Padding(22, 0, 0, 0); + this.uiRadioButton5.Size = new System.Drawing.Size(156, 35); + this.uiRadioButton5.TabIndex = 54; + this.uiRadioButton5.Text = "uiRadioButton23"; + // + // uiRadioButton7 + // + this.uiRadioButton7.Checked = true; + this.uiRadioButton7.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiRadioButton7.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiRadioButton7.GroupIndex = 2; + this.uiRadioButton7.Location = new System.Drawing.Point(354, 171); + this.uiRadioButton7.Name = "uiRadioButton7"; + this.uiRadioButton7.Padding = new System.Windows.Forms.Padding(22, 0, 0, 0); + this.uiRadioButton7.Size = new System.Drawing.Size(156, 35); + this.uiRadioButton7.TabIndex = 53; + this.uiRadioButton7.Text = "uiRadioButton22"; + // + // uiRadioButton8 + // + this.uiRadioButton8.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiRadioButton8.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiRadioButton8.GroupIndex = 2; + this.uiRadioButton8.Location = new System.Drawing.Point(192, 171); + this.uiRadioButton8.Name = "uiRadioButton8"; + this.uiRadioButton8.Padding = new System.Windows.Forms.Padding(22, 0, 0, 0); + this.uiRadioButton8.Size = new System.Drawing.Size(156, 35); + this.uiRadioButton8.TabIndex = 52; + this.uiRadioButton8.Text = "uiRadioButton21"; + // + // uiLabel1 + // + this.uiLabel1.AutoSize = true; + this.uiLabel1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLabel1.Location = new System.Drawing.Point(49, 137); + this.uiLabel1.Name = "uiLabel1"; + this.uiLabel1.Size = new System.Drawing.Size(131, 21); + this.uiLabel1.TabIndex = 51; + this.uiLabel1.Text = "GroupIndex = 1"; + this.uiLabel1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiRadioButton6 + // + this.uiRadioButton6.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiRadioButton6.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiRadioButton6.GroupIndex = 1; + this.uiRadioButton6.Location = new System.Drawing.Point(516, 130); + this.uiRadioButton6.Name = "uiRadioButton6"; + this.uiRadioButton6.Padding = new System.Windows.Forms.Padding(22, 0, 0, 0); + this.uiRadioButton6.Size = new System.Drawing.Size(156, 35); + this.uiRadioButton6.TabIndex = 50; + this.uiRadioButton6.Text = "uiRadioButton13"; + // + // uiRadioButton3 + // + this.uiRadioButton3.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiRadioButton3.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiRadioButton3.GroupIndex = 1; + this.uiRadioButton3.Location = new System.Drawing.Point(354, 130); + this.uiRadioButton3.Name = "uiRadioButton3"; + this.uiRadioButton3.Padding = new System.Windows.Forms.Padding(22, 0, 0, 0); + this.uiRadioButton3.Size = new System.Drawing.Size(156, 35); + this.uiRadioButton3.TabIndex = 49; + this.uiRadioButton3.Text = "uiRadioButton12"; + // + // uiRadioButton4 + // + this.uiRadioButton4.Checked = true; + this.uiRadioButton4.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiRadioButton4.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiRadioButton4.GroupIndex = 1; + this.uiRadioButton4.Location = new System.Drawing.Point(192, 130); + this.uiRadioButton4.Name = "uiRadioButton4"; + this.uiRadioButton4.Padding = new System.Windows.Forms.Padding(22, 0, 0, 0); + this.uiRadioButton4.Size = new System.Drawing.Size(156, 35); + this.uiRadioButton4.TabIndex = 48; + this.uiRadioButton4.Text = "uiRadioButton11"; + // + // uiLine3 + // + this.uiLine3.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLine3.Location = new System.Drawing.Point(30, 96); + this.uiLine3.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine3.Name = "uiLine3"; + this.uiLine3.Size = new System.Drawing.Size(670, 20); + this.uiLine3.TabIndex = 47; + this.uiLine3.Text = "UIRadioButton 分组"; + this.uiLine3.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiRadioButton2 + // + this.uiRadioButton2.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiRadioButton2.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiRadioButton2.Location = new System.Drawing.Point(192, 48); + this.uiRadioButton2.Name = "uiRadioButton2"; + this.uiRadioButton2.Padding = new System.Windows.Forms.Padding(22, 0, 0, 0); + this.uiRadioButton2.Size = new System.Drawing.Size(150, 35); + this.uiRadioButton2.TabIndex = 46; + this.uiRadioButton2.Text = "uiRadioButton2"; + // + // uiRadioButton1 + // + this.uiRadioButton1.Checked = true; + this.uiRadioButton1.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiRadioButton1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiRadioButton1.Location = new System.Drawing.Point(30, 48); + this.uiRadioButton1.Name = "uiRadioButton1"; + this.uiRadioButton1.Padding = new System.Windows.Forms.Padding(22, 0, 0, 0); + this.uiRadioButton1.Size = new System.Drawing.Size(150, 35); + this.uiRadioButton1.TabIndex = 45; + this.uiRadioButton1.Text = "uiRadioButton1"; + // + // uiLine2 + // + this.uiLine2.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLine2.Location = new System.Drawing.Point(30, 20); + this.uiLine2.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine2.Name = "uiLine2"; + this.uiLine2.Size = new System.Drawing.Size(670, 20); + this.uiLine2.TabIndex = 44; + this.uiLine2.Text = "UIRadioButton"; + this.uiLine2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiRadioButtonGroup1 + // + this.uiRadioButtonGroup1.ColumnCount = 3; + this.uiRadioButtonGroup1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiRadioButtonGroup1.Items.AddRange(new object[] { + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9"}); + this.uiRadioButtonGroup1.Location = new System.Drawing.Point(30, 253); + this.uiRadioButtonGroup1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.uiRadioButtonGroup1.Name = "uiRadioButtonGroup1"; + this.uiRadioButtonGroup1.Size = new System.Drawing.Size(670, 173); + this.uiRadioButtonGroup1.TabIndex = 63; + this.uiRadioButtonGroup1.Text = "UIRadioButtonGroup"; + this.uiRadioButtonGroup1.ValueChanged += new Sunny.UI.UIRadioButtonGroup.OnValueChanged(this.uiRadioButtonGroup1_ValueChanged); + // + // FRadioButton + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 598); + this.Name = "FRadioButton"; + this.Text = "RadioButton"; + this.PagePanel.ResumeLayout(false); + this.PagePanel.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private UIRadioButton uiRadioButton12; + private UIRadioButton uiRadioButton13; + private UILabel uiLabel3; + private UIRadioButton uiRadioButton9; + private UIRadioButton uiRadioButton10; + private UIRadioButton uiRadioButton11; + private UILabel uiLabel2; + private UIRadioButton uiRadioButton5; + private UIRadioButton uiRadioButton7; + private UIRadioButton uiRadioButton8; + private UILabel uiLabel1; + private UIRadioButton uiRadioButton6; + private UIRadioButton uiRadioButton3; + private UIRadioButton uiRadioButton4; + private UILine uiLine3; + private UIRadioButton uiRadioButton2; + private UIRadioButton uiRadioButton1; + private UILine uiLine2; + private UIRadioButtonGroup uiRadioButtonGroup1; + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Controls/FRadioButton.cs b/SunnyUI.Demo/Controls/FRadioButton.cs new file mode 100644 index 00000000..6a926c2a --- /dev/null +++ b/SunnyUI.Demo/Controls/FRadioButton.cs @@ -0,0 +1,15 @@ +namespace Sunny.UI.Demo +{ + public partial class FRadioButton : UITitlePage + { + public FRadioButton() + { + InitializeComponent(); + } + + private void uiRadioButtonGroup1_ValueChanged(object sender, int index, string text) + { + this.ShowInfoDialog("SelectedIndex: " + index + ", SelectedText: " + text); + } + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Controls/FRadioButton.resx b/SunnyUI.Demo/Controls/FRadioButton.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/SunnyUI.Demo/Controls/FRadioButton.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SunnyUI.Demo/Controls/FTabControl.Designer.cs b/SunnyUI.Demo/Controls/FTabControl.Designer.cs new file mode 100644 index 00000000..f03d7528 --- /dev/null +++ b/SunnyUI.Demo/Controls/FTabControl.Designer.cs @@ -0,0 +1,214 @@ +namespace Sunny.UI.Demo +{ + partial class FTabControl + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.uiTabControl1 = new Sunny.UI.UITabControl(); + this.tabPage1 = new System.Windows.Forms.TabPage(); + this.tabPage2 = new System.Windows.Forms.TabPage(); + this.uiLine1 = new Sunny.UI.UILine(); + this.tabPage3 = new System.Windows.Forms.TabPage(); + this.tabPage4 = new System.Windows.Forms.TabPage(); + this.uiLine2 = new Sunny.UI.UILine(); + this.uiTabControlMenu1 = new Sunny.UI.UITabControlMenu(); + this.tabPage5 = new System.Windows.Forms.TabPage(); + this.tabPage6 = new System.Windows.Forms.TabPage(); + this.tabPage7 = new System.Windows.Forms.TabPage(); + this.tabPage8 = new System.Windows.Forms.TabPage(); + this.PagePanel.SuspendLayout(); + this.uiTabControl1.SuspendLayout(); + this.uiTabControlMenu1.SuspendLayout(); + this.SuspendLayout(); + // + // PagePanel + // + this.PagePanel.Controls.Add(this.uiTabControlMenu1); + this.PagePanel.Controls.Add(this.uiLine2); + this.PagePanel.Controls.Add(this.uiLine1); + this.PagePanel.Controls.Add(this.uiTabControl1); + this.PagePanel.Size = new System.Drawing.Size(800, 619); + // + // uiTabControl1 + // + this.uiTabControl1.Controls.Add(this.tabPage1); + this.uiTabControl1.Controls.Add(this.tabPage2); + this.uiTabControl1.Controls.Add(this.tabPage3); + this.uiTabControl1.Controls.Add(this.tabPage4); + this.uiTabControl1.DrawMode = System.Windows.Forms.TabDrawMode.OwnerDrawFixed; + this.uiTabControl1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiTabControl1.ItemSize = new System.Drawing.Size(150, 40); + this.uiTabControl1.Location = new System.Drawing.Point(30, 52); + this.uiTabControl1.Name = "uiTabControl1"; + this.uiTabControl1.SelectedIndex = 0; + this.uiTabControl1.Size = new System.Drawing.Size(670, 183); + this.uiTabControl1.SizeMode = System.Windows.Forms.TabSizeMode.Fixed; + this.uiTabControl1.TabIndex = 0; + // + // tabPage1 + // + this.tabPage1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(192)))), ((int)(((byte)(255))))); + this.tabPage1.Location = new System.Drawing.Point(0, 40); + this.tabPage1.Name = "tabPage1"; + this.tabPage1.Size = new System.Drawing.Size(670, 143); + this.tabPage1.TabIndex = 0; + this.tabPage1.Text = "tabPage1"; + // + // tabPage2 + // + this.tabPage2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); + this.tabPage2.Location = new System.Drawing.Point(0, 40); + this.tabPage2.Name = "tabPage2"; + this.tabPage2.Size = new System.Drawing.Size(670, 143); + this.tabPage2.TabIndex = 1; + this.tabPage2.Text = "tabPage2"; + // + // uiLine1 + // + this.uiLine1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLine1.Location = new System.Drawing.Point(30, 20); + this.uiLine1.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine1.Name = "uiLine1"; + this.uiLine1.Size = new System.Drawing.Size(670, 20); + this.uiLine1.TabIndex = 19; + this.uiLine1.Text = "UITabControl"; + this.uiLine1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // tabPage3 + // + this.tabPage3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(255)))), ((int)(((byte)(192))))); + this.tabPage3.Location = new System.Drawing.Point(0, 40); + this.tabPage3.Name = "tabPage3"; + this.tabPage3.Size = new System.Drawing.Size(670, 143); + this.tabPage3.TabIndex = 2; + this.tabPage3.Text = "tabPage3"; + // + // tabPage4 + // + this.tabPage4.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(192))))); + this.tabPage4.Location = new System.Drawing.Point(0, 40); + this.tabPage4.Name = "tabPage4"; + this.tabPage4.Size = new System.Drawing.Size(670, 143); + this.tabPage4.TabIndex = 3; + this.tabPage4.Text = "tabPage4"; + // + // uiLine2 + // + this.uiLine2.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLine2.Location = new System.Drawing.Point(30, 253); + this.uiLine2.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine2.Name = "uiLine2"; + this.uiLine2.Size = new System.Drawing.Size(670, 20); + this.uiLine2.TabIndex = 20; + this.uiLine2.Text = "UITabControlMenu"; + this.uiLine2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiTabControlMenu1 + // + this.uiTabControlMenu1.Alignment = System.Windows.Forms.TabAlignment.Left; + this.uiTabControlMenu1.Controls.Add(this.tabPage5); + this.uiTabControlMenu1.Controls.Add(this.tabPage6); + this.uiTabControlMenu1.Controls.Add(this.tabPage7); + this.uiTabControlMenu1.Controls.Add(this.tabPage8); + this.uiTabControlMenu1.DrawMode = System.Windows.Forms.TabDrawMode.OwnerDrawFixed; + this.uiTabControlMenu1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiTabControlMenu1.ItemSize = new System.Drawing.Size(40, 200); + this.uiTabControlMenu1.Location = new System.Drawing.Point(30, 288); + this.uiTabControlMenu1.Multiline = true; + this.uiTabControlMenu1.Name = "uiTabControlMenu1"; + this.uiTabControlMenu1.SelectedIndex = 0; + this.uiTabControlMenu1.Size = new System.Drawing.Size(670, 239); + this.uiTabControlMenu1.SizeMode = System.Windows.Forms.TabSizeMode.Fixed; + this.uiTabControlMenu1.TabIndex = 21; + this.uiTabControlMenu1.TextAlignment = System.Windows.Forms.HorizontalAlignment.Center; + // + // tabPage5 + // + this.tabPage5.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(192)))), ((int)(((byte)(255))))); + this.tabPage5.Location = new System.Drawing.Point(201, 0); + this.tabPage5.Name = "tabPage5"; + this.tabPage5.Size = new System.Drawing.Size(469, 239); + this.tabPage5.TabIndex = 0; + this.tabPage5.Text = "tabPage5"; + // + // tabPage6 + // + this.tabPage6.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); + this.tabPage6.Location = new System.Drawing.Point(201, 0); + this.tabPage6.Name = "tabPage6"; + this.tabPage6.Size = new System.Drawing.Size(469, 239); + this.tabPage6.TabIndex = 1; + this.tabPage6.Text = "tabPage6"; + // + // tabPage7 + // + this.tabPage7.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(255)))), ((int)(((byte)(192))))); + this.tabPage7.Location = new System.Drawing.Point(201, 0); + this.tabPage7.Name = "tabPage7"; + this.tabPage7.Size = new System.Drawing.Size(469, 239); + this.tabPage7.TabIndex = 2; + this.tabPage7.Text = "tabPage7"; + // + // tabPage8 + // + this.tabPage8.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(192))))); + this.tabPage8.Location = new System.Drawing.Point(201, 0); + this.tabPage8.Name = "tabPage8"; + this.tabPage8.Size = new System.Drawing.Size(469, 239); + this.tabPage8.TabIndex = 3; + this.tabPage8.Text = "tabPage8"; + // + // FTabControl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 654); + this.Name = "FTabControl"; + this.Text = "TabControl"; + this.PagePanel.ResumeLayout(false); + this.uiTabControl1.ResumeLayout(false); + this.uiTabControlMenu1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private UITabControl uiTabControl1; + private System.Windows.Forms.TabPage tabPage1; + private System.Windows.Forms.TabPage tabPage2; + private UITabControlMenu uiTabControlMenu1; + private System.Windows.Forms.TabPage tabPage5; + private System.Windows.Forms.TabPage tabPage6; + private UILine uiLine2; + private UILine uiLine1; + private System.Windows.Forms.TabPage tabPage3; + private System.Windows.Forms.TabPage tabPage4; + private System.Windows.Forms.TabPage tabPage7; + private System.Windows.Forms.TabPage tabPage8; + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Controls/FTabControl.cs b/SunnyUI.Demo/Controls/FTabControl.cs new file mode 100644 index 00000000..b10c1d84 --- /dev/null +++ b/SunnyUI.Demo/Controls/FTabControl.cs @@ -0,0 +1,10 @@ +namespace Sunny.UI.Demo +{ + public partial class FTabControl : UITitlePage + { + public FTabControl() + { + InitializeComponent(); + } + } +} diff --git a/SunnyUI.Demo/Controls/FTabControl.resx b/SunnyUI.Demo/Controls/FTabControl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/SunnyUI.Demo/Controls/FTabControl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SunnyUI.Demo/Controls/FTextBox.Designer.cs b/SunnyUI.Demo/Controls/FTextBox.Designer.cs new file mode 100644 index 00000000..7a445f81 --- /dev/null +++ b/SunnyUI.Demo/Controls/FTextBox.Designer.cs @@ -0,0 +1,314 @@ +namespace Sunny.UI.Demo +{ + partial class FTextBox + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.uiIntegerUpDown1 = new Sunny.UI.UIIntegerUpDown(); + this.uiTextBox1 = new Sunny.UI.UITextBox(); + this.uiLabel1 = new Sunny.UI.UILabel(); + this.uiLabel2 = new Sunny.UI.UILabel(); + this.uiTextBox2 = new Sunny.UI.UITextBox(); + this.uiLabel3 = new Sunny.UI.UILabel(); + this.uiTextBox3 = new Sunny.UI.UITextBox(); + this.uiComboBox1 = new Sunny.UI.UIComboBox(); + this.uiComboBox2 = new Sunny.UI.UIComboBox(); + this._uiDatePicker1 = new Sunny.UI.UIDatePicker(); + this.uiDoubleUpDown1 = new Sunny.UI.UIDoubleUpDown(); + this.uiLine1 = new Sunny.UI.UILine(); + this.uiLine2 = new Sunny.UI.UILine(); + this.uiLine3 = new Sunny.UI.UILine(); + this.uiLine4 = new Sunny.UI.UILine(); + this.uiLine5 = new Sunny.UI.UILine(); + this.PagePanel.SuspendLayout(); + this.SuspendLayout(); + // + // PagePanel + // + this.PagePanel.Controls.Add(this.uiLine5); + this.PagePanel.Controls.Add(this.uiLine4); + this.PagePanel.Controls.Add(this.uiLine3); + this.PagePanel.Controls.Add(this.uiLine2); + this.PagePanel.Controls.Add(this.uiLine1); + this.PagePanel.Controls.Add(this.uiDoubleUpDown1); + this.PagePanel.Controls.Add(this._uiDatePicker1); + this.PagePanel.Controls.Add(this.uiComboBox2); + this.PagePanel.Controls.Add(this.uiComboBox1); + this.PagePanel.Controls.Add(this.uiLabel3); + this.PagePanel.Controls.Add(this.uiTextBox3); + this.PagePanel.Controls.Add(this.uiLabel2); + this.PagePanel.Controls.Add(this.uiTextBox2); + this.PagePanel.Controls.Add(this.uiLabel1); + this.PagePanel.Controls.Add(this.uiTextBox1); + this.PagePanel.Controls.Add(this.uiIntegerUpDown1); + this.PagePanel.Size = new System.Drawing.Size(800, 530); + // + // uiIntegerUpDown1 + // + this.uiIntegerUpDown1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiIntegerUpDown1.Location = new System.Drawing.Point(394, 212); + this.uiIntegerUpDown1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.uiIntegerUpDown1.Maximum = 100; + this.uiIntegerUpDown1.Minimum = -100; + this.uiIntegerUpDown1.MinimumSize = new System.Drawing.Size(100, 0); + this.uiIntegerUpDown1.Name = "uiIntegerUpDown1"; + this.uiIntegerUpDown1.Size = new System.Drawing.Size(150, 29); + this.uiIntegerUpDown1.TabIndex = 2; + this.uiIntegerUpDown1.Text = "_uiIntegerUpDown1"; + // + // uiTextBox1 + // + this.uiTextBox1.Cursor = System.Windows.Forms.Cursors.IBeam; + this.uiTextBox1.FillColor = System.Drawing.Color.White; + this.uiTextBox1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiTextBox1.Location = new System.Drawing.Point(117, 54); + this.uiTextBox1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.uiTextBox1.Name = "uiTextBox1"; + this.uiTextBox1.Padding = new System.Windows.Forms.Padding(5); + this.uiTextBox1.Size = new System.Drawing.Size(221, 29); + this.uiTextBox1.TabIndex = 3; + this.uiTextBox1.Text = "uiTextBox1"; + // + // uiLabel1 + // + this.uiLabel1.AutoSize = true; + this.uiLabel1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLabel1.Location = new System.Drawing.Point(38, 58); + this.uiLabel1.Name = "uiLabel1"; + this.uiLabel1.Size = new System.Drawing.Size(55, 21); + this.uiLabel1.TabIndex = 4; + this.uiLabel1.Text = "String"; + this.uiLabel1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiLabel2 + // + this.uiLabel2.AutoSize = true; + this.uiLabel2.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLabel2.Location = new System.Drawing.Point(38, 97); + this.uiLabel2.Name = "uiLabel2"; + this.uiLabel2.Size = new System.Drawing.Size(65, 21); + this.uiLabel2.TabIndex = 6; + this.uiLabel2.Text = "Integer"; + this.uiLabel2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiTextBox2 + // + this.uiTextBox2.Cursor = System.Windows.Forms.Cursors.IBeam; + this.uiTextBox2.FillColor = System.Drawing.Color.White; + this.uiTextBox2.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiTextBox2.Location = new System.Drawing.Point(117, 93); + this.uiTextBox2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.uiTextBox2.Maximum = 9D; + this.uiTextBox2.Minimum = 0D; + this.uiTextBox2.Name = "uiTextBox2"; + this.uiTextBox2.Padding = new System.Windows.Forms.Padding(5); + this.uiTextBox2.Size = new System.Drawing.Size(221, 29); + this.uiTextBox2.TabIndex = 5; + this.uiTextBox2.Text = "0"; + this.uiTextBox2.Type = Sunny.UI.UITextBox.UIEditType.Integer; + // + // uiLabel3 + // + this.uiLabel3.AutoSize = true; + this.uiLabel3.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLabel3.Location = new System.Drawing.Point(38, 136); + this.uiLabel3.Name = "uiLabel3"; + this.uiLabel3.Size = new System.Drawing.Size(65, 21); + this.uiLabel3.TabIndex = 8; + this.uiLabel3.Text = "Double"; + this.uiLabel3.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiTextBox3 + // + this.uiTextBox3.Cursor = System.Windows.Forms.Cursors.IBeam; + this.uiTextBox3.FillColor = System.Drawing.Color.White; + this.uiTextBox3.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiTextBox3.Location = new System.Drawing.Point(117, 132); + this.uiTextBox3.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.uiTextBox3.Name = "uiTextBox3"; + this.uiTextBox3.Padding = new System.Windows.Forms.Padding(5); + this.uiTextBox3.Size = new System.Drawing.Size(221, 29); + this.uiTextBox3.TabIndex = 7; + this.uiTextBox3.Text = "0.00"; + this.uiTextBox3.Type = Sunny.UI.UITextBox.UIEditType.Double; + // + // uiComboBox1 + // + this.uiComboBox1.FillColor = System.Drawing.Color.White; + this.uiComboBox1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiComboBox1.Items.AddRange(new object[] { + "1", + "2", + "3", + "4", + "5", + "6"}); + this.uiComboBox1.Location = new System.Drawing.Point(30, 212); + this.uiComboBox1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.uiComboBox1.MinimumSize = new System.Drawing.Size(63, 0); + this.uiComboBox1.Name = "uiComboBox1"; + this.uiComboBox1.Padding = new System.Windows.Forms.Padding(0, 0, 30, 0); + this.uiComboBox1.Size = new System.Drawing.Size(150, 29); + this.uiComboBox1.TabIndex = 11; + this.uiComboBox1.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiComboBox2 + // + this.uiComboBox2.DropDownStyle = Sunny.UI.UIDropDownStyle.DropDownList; + this.uiComboBox2.FillColor = System.Drawing.Color.White; + this.uiComboBox2.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiComboBox2.Items.AddRange(new object[] { + "1", + "2", + "3", + "4", + "5", + "6"}); + this.uiComboBox2.Location = new System.Drawing.Point(188, 212); + this.uiComboBox2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.uiComboBox2.MinimumSize = new System.Drawing.Size(63, 0); + this.uiComboBox2.Name = "uiComboBox2"; + this.uiComboBox2.Padding = new System.Windows.Forms.Padding(0, 0, 30, 0); + this.uiComboBox2.Size = new System.Drawing.Size(150, 29); + this.uiComboBox2.TabIndex = 12; + this.uiComboBox2.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft; + // + // _uiDatePicker1 + // + this._uiDatePicker1.DropDownStyle = Sunny.UI.UIDropDownStyle.DropDownList; + this._uiDatePicker1.FillColor = System.Drawing.Color.White; + this._uiDatePicker1.Font = new System.Drawing.Font("微软雅黑", 12F); + this._uiDatePicker1.Location = new System.Drawing.Point(30, 294); + this._uiDatePicker1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this._uiDatePicker1.MinimumSize = new System.Drawing.Size(63, 0); + this._uiDatePicker1.Name = "_uiDatePicker1"; + this._uiDatePicker1.Padding = new System.Windows.Forms.Padding(0, 0, 30, 0); + this._uiDatePicker1.Size = new System.Drawing.Size(150, 29); + this._uiDatePicker1.TabIndex = 13; + this._uiDatePicker1.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft; + this._uiDatePicker1.Value = new System.DateTime(2020, 4, 16, 0, 0, 0, 0); + // + // uiDoubleUpDown1 + // + this.uiDoubleUpDown1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiDoubleUpDown1.Location = new System.Drawing.Point(394, 294); + this.uiDoubleUpDown1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.uiDoubleUpDown1.MinimumSize = new System.Drawing.Size(100, 0); + this.uiDoubleUpDown1.Name = "uiDoubleUpDown1"; + this.uiDoubleUpDown1.Size = new System.Drawing.Size(150, 29); + this.uiDoubleUpDown1.TabIndex = 14; + this.uiDoubleUpDown1.Text = "uiDoubleUpDown1"; + this.uiDoubleUpDown1.Value = 0D; + // + // uiLine1 + // + this.uiLine1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLine1.Location = new System.Drawing.Point(30, 20); + this.uiLine1.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine1.Name = "uiLine1"; + this.uiLine1.Size = new System.Drawing.Size(670, 20); + this.uiLine1.TabIndex = 20; + this.uiLine1.Text = "UITextBox"; + this.uiLine1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiLine2 + // + this.uiLine2.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLine2.Location = new System.Drawing.Point(30, 178); + this.uiLine2.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine2.Name = "uiLine2"; + this.uiLine2.Size = new System.Drawing.Size(308, 20); + this.uiLine2.TabIndex = 21; + this.uiLine2.Text = "UICombobox"; + this.uiLine2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiLine3 + // + this.uiLine3.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLine3.Location = new System.Drawing.Point(30, 260); + this.uiLine3.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine3.Name = "uiLine3"; + this.uiLine3.Size = new System.Drawing.Size(306, 20); + this.uiLine3.TabIndex = 22; + this.uiLine3.Text = "UIDatePicker"; + this.uiLine3.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiLine4 + // + this.uiLine4.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLine4.Location = new System.Drawing.Point(394, 178); + this.uiLine4.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine4.Name = "uiLine4"; + this.uiLine4.Size = new System.Drawing.Size(306, 20); + this.uiLine4.TabIndex = 23; + this.uiLine4.Text = "UIIntegerUpDown"; + this.uiLine4.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiLine5 + // + this.uiLine5.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLine5.Location = new System.Drawing.Point(394, 260); + this.uiLine5.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine5.Name = "uiLine5"; + this.uiLine5.Size = new System.Drawing.Size(306, 20); + this.uiLine5.TabIndex = 24; + this.uiLine5.Text = "UIDoubleUpDown"; + this.uiLine5.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // FTextBox + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 565); + this.Name = "FTextBox"; + this.PageIndex = 1003; + this.Text = "TextBox"; + this.PagePanel.ResumeLayout(false); + this.PagePanel.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + private UILabel uiLabel3; + private UITextBox uiTextBox3; + private UILabel uiLabel2; + private UITextBox uiTextBox2; + private UILabel uiLabel1; + private UITextBox uiTextBox1; + private UIIntegerUpDown uiIntegerUpDown1; + private UIDatePicker _uiDatePicker1; + private UIComboBox uiComboBox2; + private UIComboBox uiComboBox1; + private UIDoubleUpDown uiDoubleUpDown1; + private UILine uiLine4; + private UILine uiLine3; + private UILine uiLine2; + private UILine uiLine1; + private UILine uiLine5; + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Controls/FTextBox.cs b/SunnyUI.Demo/Controls/FTextBox.cs new file mode 100644 index 00000000..1239a840 --- /dev/null +++ b/SunnyUI.Demo/Controls/FTextBox.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace Sunny.UI.Demo +{ + public partial class FTextBox : UITitlePage + { + public FTextBox() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Controls/FTextBox.resx b/SunnyUI.Demo/Controls/FTextBox.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/SunnyUI.Demo/Controls/FTextBox.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SunnyUI.Demo/Controls/FTransfer.Designer.cs b/SunnyUI.Demo/Controls/FTransfer.Designer.cs new file mode 100644 index 00000000..f1811855 --- /dev/null +++ b/SunnyUI.Demo/Controls/FTransfer.Designer.cs @@ -0,0 +1,100 @@ +namespace Sunny.UI.Demo +{ + partial class FTransfer + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.uiTransfer1 = new Sunny.UI.UITransfer(); + this.uiLine1 = new Sunny.UI.UILine(); + this.PagePanel.SuspendLayout(); + this.SuspendLayout(); + // + // PagePanel + // + this.PagePanel.Controls.Add(this.uiLine1); + this.PagePanel.Controls.Add(this.uiTransfer1); + // + // uiTransfer1 + // + this.uiTransfer1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiTransfer1.ItemsLeft.AddRange(new object[] { + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8"}); + this.uiTransfer1.ItemsRight.AddRange(new object[] { + "9", + "10", + "11", + "12", + "13", + "14", + "15", + "16"}); + this.uiTransfer1.Location = new System.Drawing.Point(30, 55); + this.uiTransfer1.Margin = new System.Windows.Forms.Padding(7, 9, 7, 9); + this.uiTransfer1.Name = "uiTransfer1"; + this.uiTransfer1.Padding = new System.Windows.Forms.Padding(1); + this.uiTransfer1.RadiusSides = Sunny.UI.UICornerRadiusSides.None; + this.uiTransfer1.RectSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.None; + this.uiTransfer1.Size = new System.Drawing.Size(427, 370); + this.uiTransfer1.TabIndex = 3; + this.uiTransfer1.Text = "uiTransfer1"; + // + // uiLine1 + // + this.uiLine1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLine1.Location = new System.Drawing.Point(30, 20); + this.uiLine1.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine1.Name = "uiLine1"; + this.uiLine1.Size = new System.Drawing.Size(670, 20); + this.uiLine1.TabIndex = 19; + this.uiLine1.Text = "UITransfer"; + this.uiLine1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // FTransfer + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 450); + this.Name = "FTransfer"; + this.Text = "Transfer"; + this.PagePanel.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private UITransfer uiTransfer1; + private UILine uiLine1; + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Controls/FTransfer.cs b/SunnyUI.Demo/Controls/FTransfer.cs new file mode 100644 index 00000000..5bf5e86a --- /dev/null +++ b/SunnyUI.Demo/Controls/FTransfer.cs @@ -0,0 +1,10 @@ +namespace Sunny.UI.Demo +{ + public partial class FTransfer : UITitlePage + { + public FTransfer() + { + InitializeComponent(); + } + } +} diff --git a/SunnyUI.Demo/Controls/FTransfer.resx b/SunnyUI.Demo/Controls/FTransfer.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/SunnyUI.Demo/Controls/FTransfer.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SunnyUI.Demo/Controls/FTreeView.Designer.cs b/SunnyUI.Demo/Controls/FTreeView.Designer.cs new file mode 100644 index 00000000..5d68a22d --- /dev/null +++ b/SunnyUI.Demo/Controls/FTreeView.Designer.cs @@ -0,0 +1,162 @@ +namespace Sunny.UI.Demo +{ + partial class FTreeView + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.Windows.Forms.TreeNode treeNode1 = new System.Windows.Forms.TreeNode("节点8"); + System.Windows.Forms.TreeNode treeNode2 = new System.Windows.Forms.TreeNode("节点9"); + System.Windows.Forms.TreeNode treeNode3 = new System.Windows.Forms.TreeNode("节点10"); + System.Windows.Forms.TreeNode treeNode4 = new System.Windows.Forms.TreeNode("节点11"); + System.Windows.Forms.TreeNode treeNode5 = new System.Windows.Forms.TreeNode("节点12"); + System.Windows.Forms.TreeNode treeNode6 = new System.Windows.Forms.TreeNode("节点13"); + System.Windows.Forms.TreeNode treeNode7 = new System.Windows.Forms.TreeNode("节点0", new System.Windows.Forms.TreeNode[] { + treeNode1, + treeNode2, + treeNode3, + treeNode4, + treeNode5, + treeNode6}); + System.Windows.Forms.TreeNode treeNode8 = new System.Windows.Forms.TreeNode("节点14"); + System.Windows.Forms.TreeNode treeNode9 = new System.Windows.Forms.TreeNode("节点15"); + System.Windows.Forms.TreeNode treeNode10 = new System.Windows.Forms.TreeNode("节点16"); + System.Windows.Forms.TreeNode treeNode11 = new System.Windows.Forms.TreeNode("节点1", new System.Windows.Forms.TreeNode[] { + treeNode8, + treeNode9, + treeNode10}); + System.Windows.Forms.TreeNode treeNode12 = new System.Windows.Forms.TreeNode("节点2"); + System.Windows.Forms.TreeNode treeNode13 = new System.Windows.Forms.TreeNode("节点3"); + System.Windows.Forms.TreeNode treeNode14 = new System.Windows.Forms.TreeNode("节点4"); + System.Windows.Forms.TreeNode treeNode15 = new System.Windows.Forms.TreeNode("节点5"); + System.Windows.Forms.TreeNode treeNode16 = new System.Windows.Forms.TreeNode("节点6"); + System.Windows.Forms.TreeNode treeNode17 = new System.Windows.Forms.TreeNode("节点17"); + System.Windows.Forms.TreeNode treeNode18 = new System.Windows.Forms.TreeNode("节点18"); + System.Windows.Forms.TreeNode treeNode19 = new System.Windows.Forms.TreeNode("节点19"); + System.Windows.Forms.TreeNode treeNode20 = new System.Windows.Forms.TreeNode("节点7", new System.Windows.Forms.TreeNode[] { + treeNode17, + treeNode18, + treeNode19}); + this.uiTreeView1 = new Sunny.UI.UITreeView(); + this.uiLine1 = new Sunny.UI.UILine(); + this.PagePanel.SuspendLayout(); + this.SuspendLayout(); + // + // PagePanel + // + this.PagePanel.Controls.Add(this.uiLine1); + this.PagePanel.Controls.Add(this.uiTreeView1); + // + // uiTreeView1 + // + this.uiTreeView1.BackColor = System.Drawing.Color.White; + this.uiTreeView1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.uiTreeView1.DrawMode = System.Windows.Forms.TreeViewDrawMode.OwnerDrawAll; + this.uiTreeView1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiTreeView1.ItemHeight = 28; + this.uiTreeView1.Location = new System.Drawing.Point(33, 54); + this.uiTreeView1.Name = "uiTreeView1"; + treeNode1.Name = "节点8"; + treeNode1.Text = "节点8"; + treeNode2.Name = "节点9"; + treeNode2.Text = "节点9"; + treeNode3.Name = "节点10"; + treeNode3.Text = "节点10"; + treeNode4.Name = "节点11"; + treeNode4.Text = "节点11"; + treeNode5.Name = "节点12"; + treeNode5.Text = "节点12"; + treeNode6.Name = "节点13"; + treeNode6.Text = "节点13"; + treeNode7.Name = "节点0"; + treeNode7.Text = "节点0"; + treeNode8.Name = "节点14"; + treeNode8.Text = "节点14"; + treeNode9.Name = "节点15"; + treeNode9.Text = "节点15"; + treeNode10.Name = "节点16"; + treeNode10.Text = "节点16"; + treeNode11.Name = "节点1"; + treeNode11.Text = "节点1"; + treeNode12.Name = "节点2"; + treeNode12.Text = "节点2"; + treeNode13.Name = "节点3"; + treeNode13.Text = "节点3"; + treeNode14.Name = "节点4"; + treeNode14.Text = "节点4"; + treeNode15.Name = "节点5"; + treeNode15.Text = "节点5"; + treeNode16.Name = "节点6"; + treeNode16.Text = "节点6"; + treeNode17.Name = "节点17"; + treeNode17.Text = "节点17"; + treeNode18.Name = "节点18"; + treeNode18.Text = "节点18"; + treeNode19.Name = "节点19"; + treeNode19.Text = "节点19"; + treeNode20.Name = "节点7"; + treeNode20.Text = "节点7"; + this.uiTreeView1.Nodes.AddRange(new System.Windows.Forms.TreeNode[] { + treeNode7, + treeNode11, + treeNode12, + treeNode13, + treeNode14, + treeNode15, + treeNode16, + treeNode20}); + this.uiTreeView1.Size = new System.Drawing.Size(266, 313); + this.uiTreeView1.TabIndex = 0; + // + // uiLine1 + // + this.uiLine1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLine1.Location = new System.Drawing.Point(33, 20); + this.uiLine1.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine1.Name = "uiLine1"; + this.uiLine1.Size = new System.Drawing.Size(670, 16); + this.uiLine1.TabIndex = 19; + this.uiLine1.Text = "UITreeView"; + this.uiLine1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // FTreeView + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 450); + this.Name = "FTreeView"; + this.Text = "TreeView"; + this.PagePanel.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private UITreeView uiTreeView1; + private UILine uiLine1; + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Controls/FTreeView.cs b/SunnyUI.Demo/Controls/FTreeView.cs new file mode 100644 index 00000000..34496724 --- /dev/null +++ b/SunnyUI.Demo/Controls/FTreeView.cs @@ -0,0 +1,10 @@ +namespace Sunny.UI.Demo +{ + public partial class FTreeView : UITitlePage + { + public FTreeView() + { + InitializeComponent(); + } + } +} diff --git a/SunnyUI.Demo/Controls/FTreeView.resx b/SunnyUI.Demo/Controls/FTreeView.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/SunnyUI.Demo/Controls/FTreeView.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SunnyUI.Demo/FMain.Designer.cs b/SunnyUI.Demo/FMain.Designer.cs new file mode 100644 index 00000000..63e7ed49 --- /dev/null +++ b/SunnyUI.Demo/FMain.Designer.cs @@ -0,0 +1,111 @@ +namespace Sunny.UI.Demo +{ + partial class FMain + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.Windows.Forms.TreeNode treeNode1 = new System.Windows.Forms.TreeNode("控件"); + System.Windows.Forms.TreeNode treeNode2 = new System.Windows.Forms.TreeNode("窗体"); + System.Windows.Forms.TreeNode treeNode3 = new System.Windows.Forms.TreeNode("主题"); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FMain)); + this.uiLogo1 = new Sunny.UI.UILogo(); + this.uiAvatar = new Sunny.UI.UIAvatar(); + this.StyleManager = new Sunny.UI.UIStyleManager(this.components); + this.Header.SuspendLayout(); + this.SuspendLayout(); + // + // Aside + // + this.Aside.ItemHeight = 36; + this.Aside.LineColor = System.Drawing.Color.Black; + this.Aside.Size = new System.Drawing.Size(250, 575); + // + // Header + // + this.Header.Controls.Add(this.uiAvatar); + this.Header.Controls.Add(this.uiLogo1); + treeNode1.Name = "节点0"; + treeNode1.Text = "控件"; + treeNode2.Name = "节点1"; + treeNode2.Text = "窗体"; + treeNode3.Name = "节点2"; + treeNode3.Text = "主题"; + this.Header.Nodes.AddRange(new System.Windows.Forms.TreeNode[] { + treeNode1, + treeNode2, + treeNode3}); + this.Header.SelectedIndex = 0; + this.Header.Size = new System.Drawing.Size(1024, 110); + this.Header.MenuItemClick += new Sunny.UI.UINavBar.OnMenuItemClick(this.Header_MenuItemClick); + // + // Main + // + this.Main.Size = new System.Drawing.Size(774, 575); + // + // uiLogo1 + // + this.uiLogo1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLogo1.Location = new System.Drawing.Point(20, 15); + this.uiLogo1.MaximumSize = new System.Drawing.Size(300, 80); + this.uiLogo1.MinimumSize = new System.Drawing.Size(300, 80); + this.uiLogo1.Name = "uiLogo1"; + this.uiLogo1.Size = new System.Drawing.Size(300, 80); + this.uiLogo1.Style = Sunny.UI.UIStyle.Custom; + this.uiLogo1.TabIndex = 3; + this.uiLogo1.Text = "uiLogo1"; + // + // uiAvatar + // + this.uiAvatar.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.uiAvatar.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiAvatar.Location = new System.Drawing.Point(943, 25); + this.uiAvatar.Name = "uiAvatar"; + this.uiAvatar.Size = new System.Drawing.Size(65, 61); + this.uiAvatar.TabIndex = 4; + this.uiAvatar.Text = "uiAvatar1"; + // + // FMain + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1024, 720); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Name = "FMain"; + this.Text = "SunnyUI.Net"; + this.Header.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private UILogo uiLogo1; + private UIAvatar uiAvatar; + private UIStyleManager StyleManager; + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/FMain.cs b/SunnyUI.Demo/FMain.cs new file mode 100644 index 00000000..fa7cb1d9 --- /dev/null +++ b/SunnyUI.Demo/FMain.cs @@ -0,0 +1,64 @@ +using Sunny.UI.Demo.Forms; +using System.Windows.Forms; + +namespace Sunny.UI.Demo +{ + public partial class FMain : UIHeaderAsideMainFrame + { + public FMain() + { + InitializeComponent(); + + int pageIndex = 1000; + Header.SetNodePageIndex(Header.Nodes[0], pageIndex); + TreeNode parent = Aside.CreateNode("Controls", pageIndex); + Aside.CreateChildNode(parent, AddPage(new FButton(), ++pageIndex)); + Aside.CreateChildNode(parent, AddPage(new FLabel(), ++pageIndex)); + Aside.CreateChildNode(parent, AddPage(new FCheckBox(), ++pageIndex)); + Aside.CreateChildNode(parent, AddPage(new FRadioButton(), ++pageIndex)); + Aside.CreateChildNode(parent, AddPage(new FTextBox(), ++pageIndex)); + Aside.CreateChildNode(parent, AddPage(new FDataGridView(), ++pageIndex)); + Aside.CreateChildNode(parent, AddPage(new FListBox(), ++pageIndex)); + Aside.CreateChildNode(parent, AddPage(new FTreeView(), ++pageIndex)); + Aside.CreateChildNode(parent, AddPage(new FNavigation(), ++pageIndex)); + Aside.CreateChildNode(parent, AddPage(new FTabControl(), ++pageIndex)); + Aside.CreateChildNode(parent, AddPage(new FLine(), ++pageIndex)); + Aside.CreateChildNode(parent, AddPage(new FPanel(), ++pageIndex)); + Aside.CreateChildNode(parent, AddPage(new FAvatar(), ++pageIndex)); + Aside.CreateChildNode(parent, AddPage(new FContextMenuStrip(), ++pageIndex)); + Aside.CreateChildNode(parent, AddPage(new FMeter(), ++pageIndex)); + Aside.CreateChildNode(parent, AddPage(new FOther(), ++pageIndex)); + + pageIndex = 2000; + Header.SetNodePageIndex(Header.Nodes[1], pageIndex); + parent = Aside.CreateNode("Forms", pageIndex); + Aside.CreateChildNode(parent, AddPage(new FDialogs(), ++pageIndex)); + Aside.CreateChildNode(parent, AddPage(new FEditor(), ++pageIndex)); + Aside.CreateChildNode(parent, AddPage(new FFrames(), ++pageIndex)); + + var styles = UIStyles.PopularStyles(); + foreach (UIStyle style in styles) + { + Header.CreateChildNode(Header.Nodes[2], style.DisplayText(), style.Value()); + } + + Aside.SelectFirst(); + } + + private void Header_MenuItemClick(string text, int menuIndex, int pageIndex) + { + switch (menuIndex) + { + case 0: + case 1: + Aside.SelectPage(pageIndex); + break; + + case 2: + UIStyle style = (UIStyle)pageIndex; + StyleManager.Style = style; + break; + } + } + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/FMain.resx b/SunnyUI.Demo/FMain.resx new file mode 100644 index 00000000..e046224e --- /dev/null +++ b/SunnyUI.Demo/FMain.resx @@ -0,0 +1,786 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + + AAABAAcAMDAAAAEACACoDgAAdgAAACAgAAABAAgAqAgAAB4PAAAQEAAAAQAIAGgFAADGFwAAQEAAAAEA + IAAoQgAALh0AADAwAAABACAAqCUAAFZfAAAgIAAAAQAgAKgQAAD+hAAAEBAAAAEAIABoBAAAppUAACgA + AAAwAAAAYAAAAAEACAAAAAAAAAkAAAAAAAAAAAAAAAEAAAABAAAAAAAAOsFnAEPDbQBLxnUAVMh6AGDI + egD+nT4A/p5BAP2gRQD8o0sA/KZTAPqpVQD4p1gA9qtbAPurXAD2rGAA+axiAPOuawDstW0A8rFlAPqx + ZwD3sWsA+7JrAOi6dgDvsngA87VyAPm1cwD2t3oA9Lp8APm7ewA8bPQAQG/0AERy9ABJdfQATXn1AFJ8 + 9QBby4MAZMyIAHPNiQB10I8AYs+QAGjRlgB505cAXNG5AHXUogBk070APKHlAHuT3ABVgPUAW4P0AF+J + 9QBlivUAao71AGyR9QBylPUAdZr1AHub9gBCpOUASafmAEyp5gBRqucAVK3oAFmu6ABcsekAYq/qAGOz + 6gBptOoAYbruAGy77ABxtewAfrfvAHO77AB7vO0AeqL0AATD/QAWx/0AJ8v7ADXO9wAzzPsAOs78ADzQ + /QBEztYATdDYAHrYxgBm1t0Ad9zfAEPO+wBMz/sAWM/5AEnS/ABS1PYAXtj3AFTU/ABa1fwAX9j8AGnA + 7wB0wO4AfcLuAGvJ9AB0xfEAe8bwAHPN9QB8zfQAY9j0AGXT+gBr0vkAY9j5AGva/QB63PYAftb5AHLb + +wB93PsAmJKPAJqUkQCdmJUAn5qZAKGalgChnJwApqGdAKujnACzppwAop+hAKaioACqpaIArqmlAKel + qACopqsAqqisALKpowC8raAAsayqAL6xpQC1sK0AvbOsAK6tswCzsbMAvbi2ALKyuQC4trkAvLm5ANu3 + lwDTt5wA2riZAOu3hQDtu4IA6rqMAPC3gQD1vYIA+b6DAPa+iwDku5QA472aAPC/kQDEsqIAyrakAM+4 + owDLuakAyLyzAMC8ugCDzo0AiNKXAJTQkwCW0psAndGZALDPmACj0ZcApNCYALLRmgCJ2agAltaiAJPb + qgCM3LYAm92xAKnWpADXyZEA2c6aAMDRnQDP0J4A0dGfAN3QnwDgwYMA7MGFAPbAhQD0w4kA+sGLAOHI + kADrypYA7saZAOXNnADtyJoA9caQAPrFkwDwy5cA88WYAPHKnAD8y5wA2cKtAMnWqQDT1KcAx8G+AMzD + uwDWwbAA6sWjAO3JpgDixKkA5MiuAO/NrADxzawA6NGjAODMugCDmd4AmKPJAJ2ozAC8vMQApq/RALa/ + 2wCPo+AAgL7uAIOi9gCNp/QAhKv0AI2p9ACGo/gAiqb4AI2o+ACSrPQAg7XxAIy09ACEufAAlbX2AJ2z + 9QCVvPQAnLv2AJmx+QCnt+YAobfyAKC5+ACH3c8AgsHuAIrG7wCPxfAAhszzAIrK8ACUxPEAm8P0AJLK + 8ACayPIAidT2AITW+ACA3/oAmNDyAMrGwwDMyMYAw8PJAMrJywD///8AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADm4dvd4eHq1wD91YrV/f4AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAA4Dg0MjAxMTTS1IqGfnV7fIee/gAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAOneNjIxIiIiMDEv1Ip/e3Jze3uEivwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADp2jYzMSMh + IR8iMDEv04Z/eXFzcnV7goSK/AAAAAAAAAAAAAAAAAAAAAAAAAAAAOA2MCIgHx8fHh8fIzEv04l/eXFx + cXJwcnJ3gor8AAAAAAAAAAAAAAAAAAAAAAAA4DYxIh4eHh4eHh4hITEv1IZ/eXBxcHBwcHJye4KeAAAA + AAAAAAAAAAAAAAAAAADgNTEiHx4eHh4eHh4hIzEv04l/eXBwcHBwcHByc3qCngAAAAAAAAAAAAAAAAAA + AOA1MCAfHx4eHh4eHh4gIjAv04Z/eXBwcHFwcHBwcnJ1goj8AAAAAAAAAAAAAAAA7No0IiAfHh4eHh4e + Hh4hIjEv04l/eXBwcHBxcHBwcHB0e4THAAAAAAAAAAAAAAAAAOE3MSEhHx4eHh4eHh4hIzEv1IZ/eXBw + cHBwcHBxcnJygoTHAAAAAAAAAAAAAAAAAOxJNTEhHx4eHh4eHh4hIzEv04l/eXBwcHBwcXBwcHJ0goXI + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2LCAdLwBdW19lAAAAAAAAAAAAAAAAAAAAAAAAAAB0 + IBwaGhotAFxWVllcYwAAAAAAAAAAAAAAAAAAAAB3HBoaGhoaGi0AXFZWVlZWWWUAAAAAAAAAAAAAAAAA + ciAaGhkZGRoaLQBcVlZWVlZWW2EAAAAAAAAAAAAAAHEaGhoZGRkZGRotAFxWVlZWVlZWWWAAAAAAAAAA + AAB3IBoaGRkZGRkaGi0AXFZWVlZWVlZWW2MAAAAAAAAAAAB0HRsZGRkZGRkaLQBcVlZWVlZWVllcYQAA + AAAAAAAAAAAAKxoaGRkZGhwvAFxWVlZWVlZZXYEAAAAAAAAAADk1PgAAdyscGh0vAAAAgGBcWVZZX34A + ABcSAAAAAAB5MikyPHsAAHMqdwAAAAAAAIFZW2MAAG8RDQ0YAAAAADopKSkpKTp9AAAAAAAAAAAAAAAA + AG4PCwoKChIAAAAANikpKSkpKTUAAAAAAAAAAAAAAAAUDwoKCgoKDwAAAAApKSkoKCkpMgAAAAAAAAAA + AAAAAA8KCgoKCgoKAAAAACkpKSgoKSk5AAAAAAAAAAAAAAAAEgoKCgoKCgoAAAAAKSkoKCgoKTkAAAAA + AAAAAAAAAAASCgoKCgoKCgAAAAApKSgoKCgpNQAAAAAAAAAAAAAAABAKCgoKCgoKAAAAADIpKSgoKDI9 + AAAAAAAAAAAAAAAAABcPCgoKCgsAAAAAOSkpKSk1egAAAAAAAAAAAAAAAAAAAGwQCgoLEAAAAABAMik5 + egAAVUdKAAAAAAAAAAAJAyNrAABuEg8UAAAAAAA5PgAAAEtGQUFOAAAAAAAAJgIBAgdoAAAAF3AAAAAA + AAAAAE5FQUFBQUFBSVMAIgICAQEBAQIHZgAAAAAAAAAAAFJJQUFBQUFBQUFBTwAHAgEBAQEBAQEDJgAA + AAAAAAAAUUZBQUFBQUFBQUFPAAgBAQEBAQEBAQMnAAAAAAAAAAAAT0FBQUFBQUFBQU4ABwEBAQEBAQEB + IwAAAAAAAAAAAAAAT0VBQUFBQUFFTgAIAQEBAQEBAyIAAAAAAAAAAAAAAAAAT0VBQUFBQUFOAAcBAQEB + AQEmAAAAAAAAAAAAAAAAAAAAAExFQUFBQU4ACAEBAQMmaQAAAAAAAAAAAAAAAAAAAAAAAFNMRkVFTgAH + AwYiZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFQAAGoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA////////////4If//4CB//4AgH/8AIA/+ACAH/AAgA/4AIAP/gCAH+MD + gGfAx+GDwD/+A8A//APAP/wDwD/8A8A//APAP/wDwD/+A8B//wPBj/DD5wfgc/wAgB/wAIAP8ACAD/gA + gB/8AIA//gCAf/+AgP//wIP///2///////8oAAAAEAAAACAAAAABAAgAAAAAAAABAAAAAAAAAAAAAAAB + AAAAAQAAAAAAADnBZgA8wWcAPcJpAEPDbQBXyn0A/p0+AP6fQgD+oEQA/qJIAP6qWQD9tnIAO2v1ADxr + 9QA9bPUATXj1AFV/9gBhzIQAO6HlADyh5QBXgPUAWYL2AHqe9gBEpeYASKfmAFCq5wBesekAAcP+AATD + /gAIxP4AEcb+ABXH/gAjy/4AJcv+AC3N/gA2z/4AeMPvAH3D7wBr1/sAY9j9AGnY/ACYko8AmZOQAJyW + kwCdl5QAnpiVALi3ugDzvYgA9r6JAMO6sQDEvbcAwr26AIPVmgCK1ZoAltWdAPLBkwDMwbcAhaL2AJGt + 8wCTr/cAk634AMK+wACDwO4AhMnwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAADkPFQAtLgAAAAAAAAAAPA4ODhAAKSkqMwAAAAAA + Ow4ODg4QACkpKSoyAAAAAAAWDg4OFAApKSkqOAAAAD4ZAAAUOgAAPSoyAC8vAAAYExMaAAAAAAAANwcG + CQAAExMTFwAAAAAAAAkGBgYAABMTExcAAAAAAAAJBgYGAAAXExM/AAAAAAAAAAoGCAAAJSUAJh4AAAAA + BBEAAAsAAAAAHhwcHCMAAgICAzYAAAAAKBwcHBwgAAIBAQI1AAAAAAAnHBwcIAABAQE0AAAAAAAAAAAi + HCAAAwUAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA+J8AAOCHAADAgwAA4IMAAJmJAACH4QAAh+EAAIfh + AACH8QAAk80AAOCDAADAgwAA4IcAAPifAAD//wAAKAAAAEAAAACAAAAAAQAgAAAAAAAAQgAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAD1s9QRAbvINRXDtFEly6RZOdOQWUXXgE1B03gp8jccPjJjAMI+Y + ukGPlbArjpGmGJSVoxaenaUTqKWmC6yopgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAERw9QJEcPUMQG/1GD5t9R88bPYuPGz2Vzxs9nQ8bPZ5PGz2ejxs + 9m4wZfw9lJ7EMLizsJKzrqzPqKOhp5yWlH2hm5l4ramncbWxsE61sa8kpKCdFqunpQuppaICAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKdPUBVHn1Ckp09RlIcvUoRHD2TEBv9ng8bPaHPGz2ljxs + 9r88bPbcPGz24Txs9uE8bPbPOGr5dnmJvjmim5aSnpiW5puWk+yZk5HinZeV4KOenNqkn5y3oJuYjaah + n3Ouq6hIsKyqJ7Csqhi8ubcJqKOhAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABbfvUJU3n1HVV69URMdfZ3QnD2lj9u + 9rY+bfbbPGz26Dxs9u08bPb2PGz2/Txs9v88bPb/PGz26jhr+IZvgb08m5ONkpmTkO2Zk5D/mZOQ/5qU + kf+blZL8m5WS9JuWk+qfmZbXoZyZsqeioJSzr61zv7y7Prq2tBrEwb8HAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG6J9QZfgPUbWX31P053 + 9XxHc/WzQXD22T1t9u48bPb2PGz2/Dxs9v88bPb/PGz2/zxs9v88bPb/PGz2/zxs9uo4a/iGb4G8PJuT + jJKZk5DtmZOQ/5mTkP+Zk5D/mZOQ/5mTkP+Zk5D+mpSR+5uVkvWfmZbtpKCd1qyoprCzsK1wtrKvKJ+a + mAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADdp + 9QVMdfYhVHr2ckt19rlCcPbdPm729Dxs9vw8bPb+PGz2/zxs9v88bPb/PGz2/zxs9v88bPb/PGz2/zxs + 9v88bPbqOGv4hm+BvDybk4ySmZOQ7ZmTkP+Zk5D/mZOQ/5mTkP+Zk5D/mZOQ/5mTkP+Zk5D/mZOQ/puV + kvyfmpf0o56c1KWgnoeqpaM0ura0F7m2tAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAASnT1AkFv9Qo7a/YpP2/2f0Jv9t4/bvb5PW32/zxs9v88bPb/PGz2/zxs9v88bPb/PGz2/zxs + 9v88bPb/PGz2/zxs9v88bPb/PGz26jhr+IZvgbw8m5OMkpmTkO2Zk5D/mZOQ/5mTkP+Zk5D/mZOQ/5mT + kP+Zk5D/mZOQ/5mTkP+Zk5D/mZOQ/5mUkfiblpPkpaCevqunpW2ppaIko56cBgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAW331CGaD9iJTefZNQm/2jjxs9tU8bPb5PGz2/zxs9v88bPb/PGz2/zxs + 9v88bPb/PGz2/zxs9v88bPb/PGz2/zxs9v88bPb/PGz2/zxs9uo4a/iGb4G8PJuTjJKZk5DtmZOQ/5mT + kP+Zk5D/mZOQ/5mTkP+Zk5D/mZOQ/5mTkP+Zk5D/mZOQ/5mTkP+Zk5D/mpSR/52XlPahm5jOopyadZ+a + mCaempgHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUXf1B1Z69ihTefVxSnT2vkBu9uQ8bPb2PGz2/zxs + 9v88bPb/PGz2/zxs9v88bPb/PGz2/zxs9v88bPb/PGz2/zxs9v88bPb/PGz2/zxs9v88bPbqOGv4hm+B + vDybk4ySmZOQ7ZmTkP+Zk5D/mZOQ/5mTkP+Zk5D/mZOQ/5mTkP+Zk5D/mZOQ/5mTkP+Zk5D/mZOQ/5mT + kP+Zk5D+mpSR9JyWlMuclpR1m5WTKJuWlAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX3/1B1t89ihQdvV1SHL1yUBv + 9fM9bPb+PGz2/zxs9v88bPb/PGz2/zxs9v88bPb/PGz2/zxs9v88bPb/PGz2/zxs9v88bPb/PGz2/zxs + 9v88bPb/PGz26jhr+IZvgbw8m5OMkpmTkO2Zk5D/mZOQ/5mTkP+Zk5D/mZOQ/5mTkP+Zk5D/mZOQ/5mT + kP+Zk5D/mZOQ/5mTkP+Zk5D/mZOQ/5mTkP6ZlJHzmZSSyZmUkXWZk5EonZiVBwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaof1Bm6I + 9iZZffZ1SnT1yT9u9fM8bPb9PGz2/zxs9v88bPb/PGz2/zxs9v88bPb/PGz2/zxs9v88bPb/PGz2/zxs + 9v88bPb/PGz2/zxs9v88bPb/PGz2/zxs9uo4a/iGb4G8PJuTjJKZk5DtmZOQ/5mTkP+Zk5D/mZOQ/5mT + kP+Zk5D/mZOQ/5mTkP+Zk5D/mZOQ/5mTkP+Zk5D/mZOQ/5mTkP+Zk5D/mZOQ/ZmTkPOZk5HJm5WTdZ2Y + liainJkGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAGeE9hNef/ZnT3f2xkJw9vQ9bPb9PGz2/zxs9v88bPb/PGz2/zxs9v88bPb/PGz2/zxs + 9v88bPb/PGz2/zxs9v88bPb/PGz2/zxs9v88bPb/PGz2/zxs9v88bPbqOGv4hm+BvDybk4ySmZOQ7ZmT + kP+Zk5D/mZOQ/5mTkP+Zk5D/mZOQ/5mTkP+Zk5D/mZOQ/5mTkP+Zk5D/mZOQ/5mTkP+Zk5D/mZOQ/5mT + kP+Zk5D9mZOQ85uVk8uemZZ1o5+bI6ukngQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEeB8QRNdfY0SHT2oEJw9u89bfb+PGz2/zxs9v88bPb/PGz2/zxs + 9v88bPb/PGz2/zxs9v88bPb/PGz2/zxs9v88bPb/PGz2/zxs9v88bPb/PGz2/zxs9v88bPb/PGz26jhr + +IZvgbw8m5OMkpmTkO2Zk5D/mZOQ/5mTkP+Zk5D/mZOQ/5mTkP+Zk5D/mZOQ/5mTkP+Zk5D/mZOQ/5mT + kP+Zk5D/mZOQ/5mTkP+Zk5D/mZOQ/5mTkP6alJH0npiXzqeioHW4tLMcyL23BAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABbgfQLSHP1bEBu9tE9bPb5PGz2/zxs + 9v88bPb/PGz2/zxs9v88bPb/PGz2/zxs9v88bPb/PGz2/zxs9v88bPb/PGz2/zxs9v88bPb/PGz2/zxs + 9v88bPb/PGz2/zxs9uo4a/iGb4G8PJuTjJKZk5DtmZOQ/5mTkP+Zk5D/mZOQ/5mTkP+Zk5D/mZOQ/5mT + kP+Zk5D/mZOQ/5mTkP+Zk5D/mZOQ/5mTkP+Zk5D/mZOQ/5mTkP+Zk5D/mZOQ/puWk/akn53JsayrVrmu + pwsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWH/1DVN5 + 9l1Jc/axQG/23T1t9vQ8bPb8PGz2/jxs9v88bPb/PGz2/zxs9v88bPb/PGz2/zxs9v88bPb/PGz2/zxs + 9v88bPb/PGz2/zxs9v88bPb/PGz2/zxs9v88bPbqOGv4hm+BvDybk4ySmZOQ7ZmTkP+Zk5D/mZOQ/5mT + kP+Zk5D/mZOQ/5mTkP+Zk5D/mZOQ/5mTkP+Zk5D/mZOQ/5mTkP+Zk5D/mZOQ/5mTkP+Zk5D/mZOQ/5mT + kP6dl5T8o56b4q+qqHDBtq0TAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABEk+sBQ5LrBmSR8RBWhvIiUHz0QUlz9nxAbva0PGz22zxs9vM8bPb7PGz2/jxs9v88bPb/PGz2/zxs + 9v88bPb/PGz2/zxs9v88bPb/PGz2/zxs9v88bPb/PGz2/zxs9v88bPb/PGz26jhr+IZvgbw8m5OMkpmT + kO2Zk5D/mZOQ/5mTkP+Zk5D/mZOQ/5mTkP+Zk5D/mZOQ/5mTkP+Zk5D/mZOQ/5mTkP+Zk5D/mZOQ/5mT + kP+Zk5D/mZOQ/pqUkfqcl5TuoZya0qmlo5+4r6hJxq2aENegcAPXoG8BAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABEmOkBPp7nDTyi5jQ8ouZWPKHmPUqS7SFMgvIkQnP0RTtr9nw8bPazPm324j1t + 9vo8bPb/PGz2/zxs9v88bPb/PGz2/zxs9v88bPb/PGz2/zxs9v88bPb/PGz2/zxs9v88bPb/PGz2/zxs + 9uo4a/iGb4G8PJuTjJKZk5DtmZOQ/5mTkP+Zk5D/mZOQ/5mTkP+Zk5D/mZOQ/5mTkP+Zk5D/mZOQ/5mT + kP+Zk5D/mZOQ/5mTkP+Zk5D+mZSR+ZuVku2emJXPo56corGmnm7Eq5M84a6BM/esbjf/pl0g7qRkBwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP53nBTyi5jA8ouaJPKLmxjyi5qZBo+ZtRqDoPUeP + 7CNFf/AkQ3P0TEhz9plGcvbYP2728Txs9vs8bPb/PGz2/zxs9v88bPb/PGz2/zxs9v88bPb/PGz2/zxs + 9v88bPb9PGz29Txs9uk8bPbQOGr5dnqJvzihmpSSnJeU7ZqUkf+Zk5D/mZOQ/5mTkP+Zk5D/mZOQ/5mT + kP+Zk5D/mZOQ/5mTkP+Zk5D/mZOQ/5mTkP+alJH+nJeU956YltifmpiiqJ6Ybb+jjUHZpXUz9KJTTP+f + Q33/oUyQ/6NSVPCiXBPgoGQBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQZroAT6e5xQ8ouZhPKLmyzyi + 5vU8oubvPaLn1EOk56VLpuZtS6DoMk+O7xtcgfQ7U3n2c0Zy9q5AbvbcPW328Txs9vw8bPb/PGz2/zxs + 9v88bPb/PGz2/zxs9v49bfb1PWz24zxs9r08bPaPPGz2bzRn+j2Kl8MpsKunfaijoMufmZbcmpSR5pqU + kfWZk5D9mZOQ/5mTkP+Zk5D/mZOQ/5mTkP+Zk5D/mZOQ/5mTkP+blZL6n5mX66ahnsurpKCIu6KOR9ei + dDPwolxN/Z9He/+eQa//nkDf/59F2v+iTpD5o1gx66FdBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+d + 5wU8oOY0PKLmmTyi5ug8oub+PKLm/jyi5vo+oubvQqTn0EGk5otDoOhCSJrqIU+K8CFPdPdDRnH2dkFu + 9q89bPbcPGz28Txs9vw8bPb/PGz2/zxs9vY9bfbkQ3D1wENw9Yg9bPZSO2v2Kk105RVTdt4Ku77MEsK/ + vj20sK5jpZ+db52YlYqdl5TAm5WS5JmTkPaZk5D/mZOQ/5mTkP+Zk5D/mZOQ/5qUkfuclpPtoZyZ1Kmk + opmzrapgza+UPOymZkP8ok96/6BHsP+fQtr/nkHy/54//P+eQvb/oEe6/6JOTPOhVgkAAAAAAAAAAAAA + AAAAAAAAAAAAAECf5wFIoucUSabmYD+j5sk8oub4PKLm/jyi5v88oub/PKLm/jyi5vY8oubbO6LmsDui + 5XZCn+g7SJnqHUuC8SJEb/ZBPm32dTxs9rI8bPbdPGz29D1t9vk9bfbWQW/1j0x09U5Ze/UnVXrtDVB2 + 5QMAAAAAAAAAAIOTyAKIlL8Ii5O1DZqbqhKoo6Enop2aTp6YlY6blZLWmpSR+ZmTkP+Zk5D/mZSR+5qV + ku2dmJXUo56aoaikpGHEq5Q76KdqMPeiT03+oUiX/6BF1/+eQvP/nj/7/54//v+eP///nj/7/55Czv+f + RmT2oE8W8KBTAQAAAAAAAAAAAAAAAAAAAABIpOcEWaroMk6n55lBpObnPKLm/Tyi5v88oub/PKLm/zyi + 5v88oub+PKLm/Dyi5vM8oubaPqLntEWk521RpOg0WZ3rHEh78h86avY9PW32fUFv9sVHcvbTSXL2gD9t + 9So+bvMKTHnsAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlJSjApuWlwqemJYqoJuYf52Y + ld6blZL5nZeU/KCal+qinZqzop6cY7ejkzjhpGgt+Z9HQv6eQYL/nj68/54/4v+eP/j/nj/+/54///+e + P///nj///54//f+eQef/nkWZ/qBIMvigTQQAAAAAAAAAAAAAAAAAAAAARKPmCE2n50ZDpOe3PqPn9jyi + 5v88oub/PKLm/zyi5v88oub/PKLm/zyi5v88oub/PKLm/zyi5vc/o+ffR6Xntkim52VCmOkhP4ntCkR7 + 8hxSePVXWXv2Zll89SNUe/QFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAqaKfBaWfnSCnoZ9/paCdxaein8SwqqaVvKucTd+kcjL7oU5G/59Bgv+eP8f/nj/n/54/+f+e + P///nj///54///+eP///nj///54///+eP///nkD2/55Bt/+eQ0b7n0cIAAAAAAAAAAAAAAAAAAAAADyi + 5gg8ouZGPKLmtzyi5vY8oub/PKLm/zyi5v88oub/PKLm/zyi5v88oub/PKLm/zyi5v88oub/PaLm/j+j + 5vI/o+bIPKLmfzui5UNMm+ogaJDxFGSI8xJfhfMHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACqnpcFs6+tKLayr1y/sKRb17GQSPGucln9pFSD/6BHvf+e + QeP/nj/4/54///+eP///nj///54///+eP///nj///54///+eP///nj///54/9/+eP7z/nkBN/Z5DCgAA + AAAAAAAAAAAAAAAAAAA8ouYLPKLmUTyi5r48oub3PKLm/zyi5v88oub/PKLm/zyi5v88oub/PKLm/zyi + 5v88oub/PKLm/zyi5v88oub9PKLm8zyi5t1Ao+aoSaXnUFei6RAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMi5rAjNuaUR661zKPul + Vmb/ok21/6BG4v+eQfX/nkD+/54///+eP///nj///54///+eP///nj///54///+eP///nj///54///+e + P/r/nkLZ/55Fef6eQxYAAAAAAAAAAAAAAAAAAAAAPKLmGDyi5n88oubdPKLm+jyi5v88oub/PKLm/zyi + 5v88oub/PKLm/zyi5v88oub/PKLm/zyi5v88oub/PKLm/zyi5v88oub3P6Lmx0il52NEkusRAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA151lBP+dPjL/n0Oe/59D6/+eQP3/nj///54///+eP///nj///54///+eP///nj///54///+e + P///nj///54///+eP///nj/9/55B9v+eQ6v/nkEmAAAAAAAAAAAAAAAAAAAAADyi5iY8ouatPKLm+Dyi + 5v08oub/PKLm/zyi5v88oub/PKLm/zyi5v88oub/PKLm/zyi5v88oub/PKLm/zyi5v88oub/PaLm9UCj + 5rVJpudGRJbqCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAN6eYQT/nj8y/54/nv+eP+v/nj/9/54///+eP///nj///54///+e + P///nj///54///+eP///nj///54///+eP///nj///54///+eP///nj+4/54/KgAAAAAAAAAAAAAAAAAA + AAA8ouYqPKLmtzyi5v88oub/PKLm/zyi5v88oub/PKLm/zyi5v88oub/PKLm/zyi5v88oub/PKLm/zyi + 5v88oub/PKLm/UGj5ulJpuecU6jnMUab6QQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADin2AB855MHP+eP3D/nj/S/54/+/+e + P///nj///54///+eP///nj///54///+eP///nj///54///+eP///nj///54///+eP///nj///54/uP+e + PyoAAAAAAAAAAAAAAAAAAAAAPKLmKjyi5rc8oub/PKLm/zyi5v88oub/PKLm/zyi5v88oub/PKLm/zyi + 5v88oub/PKLm/zyi5v88oub/PKLm/zyi5vpAo+bPTKfna0qi5xpCnegBAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPGf + UAv/nj9M/54/u/+eP/f/nj///54///+eP///nj///54///+eP///nj///54///+eP///nj///54///+e + P///nj///54///+eP7j/nj8qAAAAAAAAAAAAAAAAAAAAADyi5io8oua3PKLm/zyi5v88oub/PKLm/zyi + 5v88oub/PKLm/zyi5v88oub/PKLm/zyi5v88oub/PKLm/zyi5v88oub2PKLmuj2i5ko/oOYKAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD3oEsI/54/Rv+eP7f/nj/2/54///+eP///nj///54///+eP///nj///54///+e + P///nj///54///+eP///nj///54///+eP///nj+4/54/KgAAAAAAAAAAAAAAAAAAAAA8ouYqPKLmtzyi + 5v88oub/PKLm/zyi5v88oub/PKLm/zyi5v88oub/PKLm/zyi5v88oub/PKLm/zyi5v88oub/PKLm9jyi + 5rg8ouZHPKLmCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9KBICP+eP0b/nj+3/54/9v+eP///nj///54///+e + P///nj///54///+eP///nj///54///+eP///nj///54///+eP///nj///54/uP+ePyoAAAAAAAAAAAAA + AAAAAAAAPKLmKjyi5rc8oub/PKLm/zyi5v88oub/PKLm/zyi5v88oub/PKLm/zyi5v88oub/PKLm/zyi + 5v88oub/PKLm/zyi5vc8oua7PqLmTDuk5wsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOyjSQv/n0NM/55Au/+e + P/f/nj///54///+eP///nj///54///+eP///nj///54///+eP///nj///54///+eP///nj///54///+e + P7j/nj8qAAAAAAAAAAAAAAAAAAAAADyi5io8oua3PKLm/zyi5v88oub/PKLm/zyi5v88oub/PKLm/zyi + 5v88oub/PKLm/zyi5v88oub/PKLm/zyi5v88oub7PqLm0kak53BBpugcNajqAgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANGo + UAHtqFoc/6RVcP+gRtL/nkD7/54+//+eP///nj///54///+eP///nj///54///+eP///nj///54///+e + P///nj///54///+eP///nj+4/54/KgAAAAAAAAAAAAAAAAAAAAA8ouYqPaLmtzyi5v88oub/PKLm/zyi + 5v88oub/PKLm/zyi5v88oub/PKLm/zyi5v88oub/PKLm/zyi5v88oub/PKLm/T6i5utDpOefSabnMzSr + 6wQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADHrFkD/6tuKv+lWYz/oUra/55B9v+eP/7/nj///54///+eP///nj///54///+e + P///nj///54///+eP///nj///54///+eP///nj///54/uP+ePyoAAAAAAAAAAAAAAAAAAAAAP6LmJUOk + 56s+oub2PKLm/Tyi5v88oub/PKLm/zyi5v88oub/PKLm/zyi5v88oub/PKLm/zyi5v88oub/PKLm/Tyi + 5vU8oubePaLmlUCj5jEtrO0EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAt65aAv+oZRv/o1VT/6BKkf+fRMj/nkHo/54/+P+e + P///nj///54///+eP///nj///54///+eP///nj///54///+eP///nj///55A//+fQbj/nkAqAAAAAAAA + AAAAAAAAAAAAAECj5hZFped5PqLm2Tyi5vo8oub/PKLm/zyi5v88oub/PKLm/zyi5v88oub/PKLm/zyi + 5v88oub/PKLm/j6i5vQ+o+bNPKLmijui5ko8ouYYJ67uAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC5rVoF2qdTEv+h + TS//n0Zc/55Bk/+eP8v/nj/r/54/+f+eP///nj///54///+eP///nj///54///+eP///nj///54//P+e + QvT/oEip/p5DJQAAAAAAAAAAAAAAAAAAAAA8ouYKPqLmTTyi5rw8oub2PKLm/zyi5v88oub/PKLm/zyi + 5v88oub/PKLm/zyi5v88oub/PaLm+D6j5uNEpOe9R6TmcDSo6i4Vt/UeDbz5JAi/+x0GwPwJAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEq/ + ZAlMvmQeTr5jLVm8YiVXvWQTw6ZJEv+dPi3/nj5X/55CpP+fQuP/n0H6/54///+eP///nj///54///+e + P///nj///54///+eP/r/nkLW/6FJc/2fRhQAAAAAAAAAAAAAAAAAAAAAO6LmCDyi5kY8oua3PKLm9jyi + 5v88oub/PKLm/zyi5v88oub/PKLm/zyi5v88oub5PKLm5z6i58hEpeeDTqfmRU6s6iAhu/caAcP+TADE + /5AAxP95AMT/LATB/QYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFbCcAZCwmssO8JoeTrCZ6k6wmeSPcJqVFfBbCZZxngOpLBXDP+gSDv/oUyO/6BHz/+e + Quv/nkD7/54///+eP///nj///54///+eP///nj/2/54/uv+eQEr5n0MJAAAAAAAAAAAAAAAAAAAAADmi + 5gQ7ouYyPKLmmTyi5uc8oub9PKLm/zyi5v88oub/PKLm/jyi5vg8oubiO6LmvTyh5oI8pOhBP6nqHRq5 + 9hsAxP80AMT/awDE/7sAxP/pAMT/4ADE/5IAxP8rAsL9CQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADvAZwk8wmgrQMNpkjzCaOI6wmf4OsJn7j3CadJFw22dUcRzW13I + fCu5uXUW9qVWIv+hTU3/oEeP/55CxP+eP+b/nj/4/54//f+eP///nj/+/55C9f+gRrX/ok1F86JJCAAA + AAAAAAAAAAAAAAAAAAA3pOcBOaPnFjyi5mQ8oubOPKLm+zyi5v88oub+PKLm+0Cj5vNDpOfYQqPmljel + 6Eowp+ojGbX0HQDE/zgAxP9oAMT/pgDE/9YAxP/vAMT//ADE//oAxP/hAMT/iQDE/zMCw/wPCMHzBAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOcF7BDrBbA84wmczOcJniDvCZ+E7wmf6OsJn/zrC + Z/86wmj6PMJp60XEbdJMxHCRTMJrOJaxWRHQplQR4qRLJf+dQVH/nj+P/54/wv+eQOr/nj/9/54//f+f + Q+T/oUyU+qRSMOukTAQAAAAAAAAAAAAAAAAAAAAAAAAAADek5wk8ouZLPKLmujyi5vY8oub8PKLm8kCj + 59tHpOexUafmekyq6DghtPIaA8L9MgDE/2UAxP+kAMT/1gDE/+4AxP/7AMT//wDE//8AxP//AMT/+gDE + /9oAxP+YAMT/WwDE/zAJw/UYE8PoDR3E4AQAAAAAAAAAADHDlQQxwooNNsJ4GDrCZzA6wmdaOsJnmDrC + Z9k6wmf6OsJn/zrCZ/86wmf/OsJn/zrCZ/88wmj6PsNp4zzCaJ84wmZfNMNpM2+5XhXGq1MU2KdLJfig + RFv/oEat/6BE5v+eQu7/n0LD/6BHXOikSxPapksBAAAAAAAAAAAAAAAAAAAAAAAAAAAzpukEOaPnMTyi + 5pA8oubaPKLm4D2i5q9HpOd7S6noRj2y7yUsu/UhC8L8QwDE/44AxP/SAMT/7gDE//oAxP//AMT//wDE + //8AxP//AMT//wDE//8AxP/4AMT/6ADE/8cBxP+XCcT/dxXF/1cgxf8qD8PhDx/DrwlGw2sgQsNrUz3C + aXc6wmeWOsJnxjrCZ+g6wmf4OsJn/zrCZ/86wmf/OsJn/zrCZ/86wmf/OsJn/zrCZ/o6wmfqOsJnzT/D + aZlMxG9jVch7M3nAcBbQr2Eb/KRTSP+iTYz/oEiq/6BGgv+eQDDjo0UFAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAALqnrATWl6BM8ouZUPKLmkDyi5n48ouZFLa/vJSC59iILwfw9AMT/bwDE/6cAxP/dAMT/+QDE + //8AxP//AMT//wDE//8AxP//AMT//wDE//8AxP//AMT//wDE//4AxP/3AMT/6wPE/90HxP/BBcX/jADE + /0Ucw64ePcNlXT3CaLc7wmffOsJn6zrCZ/c6wmf+OsJn/zrCZ/86wmf/OsJn/zrCZ/86wmf/OsJn/zrC + Z/86wmf/OsJn/jrCZ/g8wmjqQsNry03FcZtYxnhgeMF2KcGtWhL/o1gl/6RWQv+jVTHupE4PzadMAQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0pukGPKLmIT2h5TIrq+wlE7n2IAe//DsAxP9wAMT/pwDE + /9IAxP/uAMT/+gDE//4AxP//AMT//wDE//8AxP//AMT//wDE//8AxP//AMT//wDE//8AxP//AMT//wDE + //8AxP/9AMT/9wHE/9sAxP96HsOrNTvCY4o6wmfnOsJn/TrCZ/86wmf/OsJn/zrCZ/86wmf/OsJn/zrC + Z/86wmf/OsJn/zrCZ/86wmf/OsJn/zrCZ/86wmf/OsJn/jzCaPhBw2rrRsNtxUTEbHpbvWQyg7hnF5W3 + ZgzDrVkGvq1XAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKztASmt7gQTuPYJB7/7IADE + /2gAxP+sAMT/1ADE/+8AxP/6AMT//gDE//8AxP//AMT//wDE//8AxP//AMT//wDE//8AxP//AMT//wDE + //8AxP//AMT//wDE//8AxP//AMT//wDE//8AxP/qAMT/hh/Cqjw7wmOSOsJn7TrCZ/86wmf/OsJn/zrC + Z/86wmf/OsJn/zrCZ/86wmf/OsJn/zrCZ/86wmf/OsJn/zrCZ/86wmf/OsJn/zrCZ/86wmf/O8Jn/jvC + Z/M7wmfUPcNon0LDa0ZYv2gLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAG7XzAgLC/UIAxP+zAMT/7ADE//wAxP/+AMT//wDE//8AxP//AMT//wDE//8AxP//AMT//wDE + //8AxP//AMT//wDE//8AxP//AMT//wDE//8AxP//AMT//wDE//8AxP//AMT/6gDE/4Yfwqo8O8JjkjrC + Z+06wmf/OsJn/zrCZ/86wmf/OsJn/zrCZ/86wmf/OsJn/zrCZ/86wmf/OsJn/zrCZ/86wmf/OsJn/zrC + Z/86wmf/OsJn/zrCZ/86wmf+OsJn/D3CaOFAw2pwV8BrEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAABq29AQCwv0oAMT/mwDE//AAxP/+AMT//wDE//8AxP//AMT//wDE + //8AxP//AMT//wDE//8AxP//AMT//wDE//8AxP//AMT//wDE//8AxP//AMT//wDE//8AxP//AMT//wDE + /+oAxP+GH8KqPDvCY5I6wmftOsJn/zrCZ/86wmf/OsJn/zrCZ/86wmf/OsJn/zrCZ/86wmf/OsJn/zrC + Z/86wmf/OsJn/zrCZ/86wmf/OsJn/zrCZ/86wmf/OsJn/jrCZ/Y9wmjJQcNrV1HAagsAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsL+CwDE/2MAxP/HAMT/9QDE + //4AxP//AMT//wDE//8AxP//AMT//wDE//8AxP//AMT//wDE//8AxP//AMT//wDE//8AxP//AMT//wDE + //8AxP//AMT//wDE//8AxP/qAMT/hh/Cqjw7wmOSOsJn7TrCZ/86wmf/OsJn/zrCZ/86wmf/OsJn/zrC + Z/86wmf/OsJn/zrCZ/86wmf/OsJn/zrCZ/86wmf/OsJn/zrCZ/86wmf/OsJn/zvCZ/g8wmjTPsNqeEvC + bBxbwW4EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATB + /AQAxP8kAMT/dQDE/8sAxP/zAMT//QDE//8AxP//AMT//wDE//8AxP//AMT//wDE//8AxP//AMT//wDE + //8AxP//AMT//wDE//8AxP//AMT//wDE//8AxP//AMT/6gDE/4Yfwqo8O8JjkjrCZ+06wmf/OsJn/zrC + Z/86wmf/OsJn/zrCZ/86wmf/OsJn/zrCZ/86wmf/OsJn/zrCZ/86wmf/OsJn/zrCZ/86wmf/OsJn/zzC + aP1DxG3sS8VynE/GdTFbv2oDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAcL9BgDE/ycAxP91AMT/yQDE//MAxP/9AMT//wDE//8AxP//AMT//wDE + //8AxP//AMT//wDE//8AxP//AMT//wDE//8AxP//AMT//wDE//8AxP//AMT//wDE/+oAxP+GH8KqPDvC + Y5I6wmftOsJn/zrCZ/86wmf/OsJn/zrCZ/86wmf/OsJn/zrCZ/86wmf/OsJn/zrCZ/86wmf/OsJn/zrC + Z/86wmf/OsJn/zvCaP1Bw2vxUMV0v2HJgGBxy4oSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAw/4HAMT/KADE/3UAxP/JAMT/8wDE + //4AxP//AMT//wDE//8AxP//AMT//wDE//8AxP//AMT//wDE//8AxP//AMT//wDE//8AxP//AMT//wDE + //8AxP/qAMT/hh/Cqjw7wmOSOsJn7TrCZ/86wmf/OsJn/zrCZ/86wmf/OsJn/zrCZ/86wmf/OsJn/zrC + Z/86wmf/OsJn/zrCZ/86wmf/OsJn/zvCaP1Aw2vxSsVxw1nGeWxwyociZsmDBQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADE + /wcAxP8oAMT/dQDE/8sAxP/0AMT//gDE//8AxP//AMT//wDE//8AxP//AMT//wDE//8AxP//AMT//wDE + //8AxP//AMT//wDE//8AxP//AMT/6gDE/4Yfwqo8O8JjkjrCZ+06wmf/OsJn/zrCZ/86wmf/OsJn/zrC + Z/86wmf/OsJn/zrCZ/86wmf/OsJn/zrCZ/86wmf/OsJn/zzCaf1Dw23yTsVzw1TGdmxYxngjV8Z3BgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAMT/BwDE/ycAxP91AMT/zgDE//YAxP//AMT//wDE//8AxP//AMT//wDE + //8AxP//AMT//wDE//8AxP//AMT//wDE//8AxP//AMT//wDE/+oAxP+GH8KqPDvCY5I6wmftOsJn/zrC + Z/86wmf/OsJn/zrCZ/86wmf/OsJn/zrCZ/86wmf/OsJn/zrCZ/86wmf/OsJn/zrCZ/U/w2vgU8Z2tmHJ + f2dpyYIiVMV2BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD/////////////////////////gAB///////gAAA//////wAAAAf////+AAAAA + /////gAAAAB////8AAAAAB////AAAAAAD///4AAAAAAH///AAAAAAAP//4AAAAAAAf//AAAAAAAA//8A + AAAAAAB//gAAAAAAAD/+AAAAAAAAP/4AAAAAAAA/+AAAAAAAAA/wAAAAAAAAD/AAAAAAAAAH4AAAAAAA + AAfgAAAAAAAAB8AAAAMAAAADwAAAD/AAAAPAAAA//AAAA8AAAH/+AAADwAAB//8AAAPAAAH//4AAA8AA + Af//gAADwAAB//+AAAPAAAH//8AAA8AAA///wAADwAAD///AAAPAAAP//8AAA8AAAf//gAADwAAB//+A + AAPAAAH//4AAA8AAAf//wAADwAAA//8AAAPAAAB//gAAA8AAAD/8AAADwAAAD/AAAAPgAAABgAAAA+AA + AAAAAAAH4AAAAAAAAAfwAAAAAAAAD/AAAAAAAAA//AAAAAAAAD/8AAAAAAAAP/4AAAAAAAA//gAAAAAA + AH//AAAAAAAA//+AAAAAAAD//8AAAAAAAf//4AAAAAAD///wAAAAAAf///gAAAAAH////gAAAAA///// + AAAAAP////+AAAAB/////+AAAAf//////AAAH////////////////////////ygAAAAwAAAAYAAAAAEA + IAAAAAAAgCUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ2/vBEhx + 6QlPdeILVXfbCll41gZ2iMULgI6+HISOtRiJj6sLkZSnCpybpAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQW70BUBu + 9A8+bfUaPWz0ND1s9FY/bfJgQG7wXDpq8zqVnsA8q6qxkqOhp5CZlplio5+gXK+rq0Srp6YYpaCeDKCb + mQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARnL1BVB3 + 9RRJc/U1RHD1VUBu9oY8bPaiPGz2vDxs9t48bPboPGz23zlq+JGBi7NPnpeUvZuVku6alJHpnpmW5aGc + mc2gm5iep6Ogd62ppkqzsK4osa2rDqCbmAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAENw + 9QJTefQTVXr0OE529G9EcfauPm31zD1s9eY8bPb0O2v1+Dtr9f08bPb/O2v19Dhr9556hbBRmZKOv5iS + j/qZk5D/mZOQ/pmTkPqalZLxnZeU3qGcmcWtqqeZtbKwXq2opiKemJUBAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAQ3D0AUhy9RRUevVrSXT1r0Fv9dw9bPb1PGz1+ztr9f08bPb/O2v1/jtr9f48bPb/O2v19Dhr + 9556hbBRmZKNv5iSj/qZk5D/mJKP/piSj/6Zk5D+mZOQ/ZqUkfqemZbupJ+dzqikoYKppKIiqKOhCgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAEhy9QFKdPUOQW71Lj1t9oA/bvbqPW32/Dxs9v88bPb/PGz2/zxs9v88bPb/PGz2/zxs + 9v88bPb/PGz29Dlr9596hbBRmpOOv5mTkPqZk5D/mZOQ/5mTkP+Zk5D/mZOQ/5mTkP+Zk5D/mZOQ/JqV + ku6kn526p6OgXqCbmRiemJYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAARHD0AVN49RJZfPVYR3L1nz1s9to7a/X8O2v1/jtr9f48bPb/O2v1/jtr + 9f48bPb/O2v1/jtr9f48bPb/O2v19Dhr9556hbBRmZKNv5iSj/qZk5D/mJKP/piSj/6Zk5D/mJKP/pmT + kP+Yko/+mJKP/pmTkP+blZLznpiVwJ2YlmKclpQSnZiVAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFc/QBTHb0ElJ39VFIcvW/QG717jxs9vs7a/X+O2v1/jtr + 9f48bPb/O2v1/jtr9f48bPb/O2v1/jtr9f48bPb/O2v19Dhr9556hbBRmZKNv5iSj/qZk5D/mJKP/piS + j/6Zk5D/mJKP/pmTkP+Yko/+mJKP/pmTkP+Zk5D9mZOQ8pmUksGZlJFRnZaTEqCYlAEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUffQUYID2X0t19cE9bfX3PGz2/jxs + 9v88bPb/PGz2/zxs9v88bPb/PGz2/zxs9v88bPb/PGz2/zxs9v88bPb/PGz29Dlr9596hbBRmpOOv5mT + kPqZk5D/mZOQ/5mTkP+Zk5D/mZOQ/5mTkP+Zk5D/mZOQ/5mTkP+Zk5D/mZOQ/pmTkPeZk5HBnJaUYqOa + kxgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEWA8AFYe/Y7TXb1r0Fv + 9fE8bPb+O2v1/jxs9v87a/X+O2v1/jtr9f48bPb/O2v1/jtr9f48bPb/O2v1/jtr9f48bPb/O2v19Dhr + 9556hbBRmZKNv5iSj/qZk5D/mJKP/piSj/6Zk5D/mJKP/pmTkP+Yko/+mJKP/pmTkP+Yko/+mJKP/pmT + kP6Zk5DynJaUwKOem2GypJkMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFGC + 8gZHcvV3QG723Txs9vw8bPb/PGz2/zxs9v88bPb/PGz2/zxs9v88bPb/PGz2/zxs9v88bPb/PGz2/zxs + 9v88bPb/PGz29Dlr9596hbBRmpOOv5mTkPqZk5D/mZOQ/5mTkP+Zk5D/mZOQ/5mTkP+Zk5D/mZOQ/5mT + kP+Zk5D/mZOQ/5mTkP+Zk5D+mpSS86Kdm8K0rKk3vKONBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFWF8gpRevVfRnL1rD5t9dw8bPb1O2v1/Dxs9v47a/X+O2v1/jtr9f48bPb/O2v1/jtr + 9f48bPb/O2v1/jtr9f48bPb/O2v19Dhr9556hbBRmZKNv5iSj/qZk5D/mJKP/piSj/6Zk5D/mJKP/pmT + kP+Yko/+mJKP/pmTkP+Yko/+mJKP/pmTkP6Zk5D8m5aT9aOdm9m1rahRxaiOCQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABCk+oCQJbpEkuY6i1KkO0vS4DyQENy9HE7a/a1PGz14Dxs9vg7a/X+O2v1/jtr + 9f48bPb/O2v1/jtr9f48bPb/O2v1/jtr9f48bPb/O2v19Dhr9556hbBRmZKNv5iSj/qZk5D/mJKP/piS + j/6Zk5D/mJKP/pmTkP+Yko/+mJKP/pmTkP+Yko/+mJOQ/ZmTkPecl5TdpJ2Zs7Omm3rRrZA34qZ1Gtie + aQcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAl+kMPKHmTTuh5Zw9oeZ/RZvpSEaM7S5Cd/JEQ3H1iERx + 9tM9bfX2O2v1/Ttr9f48bPb/O2v1/jtr9f48bPb/O2v1/jtr9f08bPb1O2v14jhq+JGBi7NPnZeSv5qU + kfqZk5D/mJKP/piSj/6Zk5D/mJKP/pmTkP+Yko/+mJKP/pmTkP+alJH8m5aT7J2Ylr+qnZV6w6OHTeGk + akb4olJu/aNUYO+hXB0AAAAAAAAAAAAAAAAAAAAAAAAAAEGZ6AE9n+YwPKLmoDyi5u48oubtP6Lmykel + 5pJJnek/UYzvLFN/9FRGcfafP2720Txs9u88bPb8PGz2/jxs9v88bPb7PW327z5t9dM8bPaXPmz0Zzxr + 8jqepL81r6uoj6OdmryalZLVmpSR75mTkPuZk5D/mZOQ/5mTkP+Zk5D+mZOQ/JyWk/OjnZvNrqWfksKk + ilHloWVN+KBOfP6eQrT/nkDl/6BIvfuiU1DmnlsDAAAAAAAAAAAAAAAAAAAAAEKd5wlBouZjPKLl0Duh + 5fo8oub+PKHl+T6i5uc+ouakQJ/nYkaW6zVKg/E2RXP0YT5s9Zw8bPbYO2v18jxs9fs9bPbaQ2/1oEx0 + 9GNJc+8pT3XiEFp51waXosYQoqW3LZ+epj6hnJpknZiVn5qUkdqZk5D8mJKP/pmTkP2ZlJHynZeU16Oe + nKW8qJZh16l9RvCkXWP9oEiy/p5C3v+eQPT+nT/8/p5C3v+gSHLyoFMLAAAAAAAAAAAAAAAAPp7mAU+l + 5yBJpuagPqLl7Tuh5f08oub/O6Hl/juh5fw7oubvO6Hl0T6h56BIn+hOUZbrKkl98TA7a/ZpPm31skNw + 9dlEcPWAQG70L0t37Q9Te+MCAAAAAAAAAAAAAAAAe4m6AoeOrgSXlaAPnZeWLp6ZloCblpPqm5WS+52X + lPGgm5iwqZ+XaMqjfkDuoVZL+p9Ghv6eQcP+nkDy/p0//P+eP/7+nT7+/p1A7v+eRKH4n0sh8J9RAQAA + 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 + 6gM6ouZQPKLmvTyi5uU+oua0R6XneUSt60MruPQrCMH8WADE/6cAxP/hAMT/9gDE//0AxP//AMT//wDE + //4AxP/pAMT/wADE/4kLxPxYGMT2MhTD3xAlw6MLPcJ2LTvCblc6wmeIOsJnvzrCZ+k6wmf+OsJn/zrC + Z/86wmf/OsJn/jrCZ/Y6wmfNOsJnmE7Balt5v24mtbJgIvSlUlP/oUmo/59Fpv+fQlDOp00GAAAAAAAA + AAAAAAAAAAAAAAAAAAA0pegdPKHlXzij52suquw3Hbf1MAzA+08AxP+UAMP+zgDE//QAw/7+AMP+/gDD + /v4AxP//AMP+/gDD/v4AxP/+AMP++wDD/vIDxP/fBMT+twDE/mUkw5s0PMJmlTvBZ906wmfyOcFm+znB + Zv46wmf/OcFm/jrCZ/85wWb+OcFm/jrCZ/85wWb9OsFn9D/CadxMxHChX8N0W5i1YiLhqFsm5qdXLeCm + URIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqrO0HLKrsFxyy8SEHv/tPAcL+igDD/sAAxP/qAMP++QDE + //4Aw/7+AMP+/gDD/v4AxP//AMP+/gDD/v4AxP//AMP+/gDD/v4AxP/9AMP+7gDD/pglwphNOsFkvDnB + Zvg6wmf/OcFm/jnBZv46wmf/OcFm/jrCZ/85wWb+OcFm/jrCZ/85wWb+OcFm/jrCZ/w+wmjuP8JpwUjA + ZnhnvGgljLVfB6evVgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH7LyAgm++iwAxP+vAMT/5wDE + //gAxP/+AMT//wDE//8AxP//AMT//wDE//8AxP//AMT//wDE//8AxP//AMT//wDE//8AxP//AMT/9ADE + /58mwphROsJlvzrCZ/o6wmf/OsJn/zrCZ/86wmf/OsJn/zrCZ/86wmf/OsJn/zrCZ/86wmf/OsJn/zrC + Z/86wmf+OsJn9jzCZ9lGwmpQdrliCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHLTyAQi+ + +hkAxP+jAMP+8ADD/v0AxP//AMP+/gDE//8Aw/7+AMP+/gDD/v4AxP//AMP+/gDD/v4AxP//AMP+/gDD + /v4AxP//AMP+9ADD/p4mwphROsFkvznBZvo6wmf/OcFm/jnBZv46wmf/OcFm/jrCZ/85wWb+OcFm/jrC + Z/85wWb+OcFm/jrCZ/86wWb+OsFn9DzCaMJJwWo4b7pkBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAy8+QUAxP9aAMP+vgDD/vIAxP/+AMP+/gDE//8Aw/7+AMP+/gDD/v4AxP//AMP+/gDD + /v4AxP//AMP+/gDD/v4AxP//AMP+9ADD/p4mwphROsFkvznBZvo6wmf/OcFm/jnBZv46wmf/OcFm/jrC + Z/85wWb+OcFm/jrCZ/85wWb+OcFm/jrCZ/87wmj6QcNr1EXEbm1bvmcMAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwPwYAMT/YgDE/8EAxP/3AMT//gDE//8AxP//AMT//wDE + //8AxP//AMT//wDE//8AxP//AMT//wDE//8AxP//AMT/9ADE/58mwphROsJlvzrCZ/o6wmf/OsJn/zrC + Z/86wmf/OsJn/zrCZ/86wmf/OsJn/zrCZ/86wmf/OsJn/zrCZ/5Dw2zpVMZ3nGXJgi8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEwPwBAsH9EgDD/lEAxP/BAMP+8gDE + //4Aw/7+AMP+/gDD/v4AxP//AMP+/gDD/v4AxP//AMP+/gDD/v4AxP//AMP+9ADD/p4mwphROsFkvznB + Zvo6wmf/OcFm/jnBZv46wmf/OcFm/jrCZ/85wWb+OcFm/jrCZ/86wWf+O8Jo/EHDbOpPxXOYXsZ8OlDD + bwkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAML9AQDD + /hIAxP9iAMP+wADE//MAw/7+AMP+/gDD/v4AxP//AMP+/gDD/v4AxP//AMP+/gDD/v4AxP//AMP+9ADD + /p4mwphROsFkvznBZvo6wmf/OcFm/jnBZv46wmf/OcFm/jrCZ/85wWb+OcFm/jrCZ/86wmf3RMNt4VTG + d6RZxnk6RsNtCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAADD/gEAw/4YAMT/XgDE/7oAxP/uAMT//ADE//8AxP//AMT//wDE//8AxP//AMT//wDE + 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 + AAAAAAAAAAAAAAAAAAAAAAAAQI3rAkyM7hBMffJiQnH0qDtr9eY7a/X4O2v1/jtr9f47a/X+O2v1/jtr + 9f47a/X+O2v1+zlr9rqEiaR1mJKO5piSj/6Yko/+mJKP/piSj/6Yko/+mJKP/piSj/2Yko/8m5WS66Sd + mcXDq5c1zJ92BgAAAAAAAAAAAAAAAAAAAAA/l+gYP53mYkOY6VpFiO5EQHHzfUFv9cw7a/X6O2v1/Ttr + 9f47a/X+O2v1/jtr9f07a/XyOWr2sIiNpnSalJDmmJKP/piSj/6Yko/+mJKP/piSj/6Yko/+mZOQ+ZuV + k9yrnZKMyaOAX+6lZFXpoGAmAAAAAAAAAAAAAAAAQJfoAj2g5WY7oeXcPKHl6kKj5bxHmulVTYrvRUV0 + 9Is+bfXGO2v18ztr9fw9bPXmQW71ukFu8WRHcegzoKW6P6Sho4ablpO7mZSR5piSj/6Yko/+mZOQ9p2X + lOCwopeYyqSDYvGgVX78nkS6/p5B4P2gTH/hnVwDAAAAAAAAAABGn+cQQ6PlqDuh5fM7oeX9O6Hl9zyh + 5cg/nueMSpHsQkd98Ew7a/WhP2312kFu9YVHc/E4UnreC19+0QN/jb8Ji4+uFZuXmzicl5SFmpSR9JuV + kvegmZWztZ+McOOjZVz1oE+S/Z5B4/6dP/f+nT/2/p5DrvCeUREAAAAAPZzmAUGh5iY9oubYO6Hl/Tuh + 5f47oeX+O6Hl/juh5fw/ouXYQKDmh0WP6zBVhPE0SoDsCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKaW + kAiyqaJpwKmWfOWlbGv7n0ib/p0+6v6dPvv+nT7+/p0+/v6dPv3+nT/b+J1HK+2dUAE8n+UCO6DlODuh + 5eM7oeX9O6Hl/juh5f47oeX+O6Hl/juh5fs7oeXnRKDmcUiQ6xQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAMejgxTrpGJT/KBI0v6eQPL+nT79/p0+/v6dPv7+nT7+/p0+/f6dP+/8nUNO9Z1IBDyg + 5QY7oeVlO6Hl/Duh5f47oeX+O6Hl/juh5f47oeX+O6Hl/j2h5fNGouZjQpPpCwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA0JtoBvaeR0z+nT7r/p0+/v6dPv7+nT7+/p0+/v6dPv7+nT7+/p0+/v6d + Pmn7nUIGPKHlBzuh5Wk7oeX+O6Hl/juh5f47oeX+O6Hl/juh5f47oeX9PKHl4UKg5zg9l+kDAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADLn2UC755LK/6dPtr+nT79/p0+/v6dPv7+nT7+/p0+/v6d + Pv7+nT7+/p0+af2dPwY7oeUHO6HlaTuh5f47oeX+O6Hl/juh5f47oeX+O6Hl/juh5f07oeXbO6LnKzSh + 6gIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMKmXALsoUsr/p0/2v6dPv3+nT7+/p0+/v6d + Pv7+nT7+/p0+/v6dPv7+nT5p/Z0/Bjuh5Qc7oeVpO6Hl/juh5f47oeX+O6Hl/juh5f47oeX+O6Hl/Tyh + 5es/pOdML6nrBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuqtbBfGmV0b+nkLl/p0+/f6d + Pv7+nT7+/p0+/v6dPv7+nT7+/p0+/v6dPmn6nkAGOaLmBD+i5U48oeXvO6Hl/Tuh5f47oeX+O6Hl/juh + 5f48oubvPKLmvzKn6kEkr+0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYsV4Gw6tZIu2h + SXb9nT+2/p4/8f6eP/3+nT7+/p0+/v6dPv7+nT/4/p5CX/OfQgY2pOcBO6LlKzuh5ds7oeX8O6Hl/juh + 5f47oeX7PKHl60Ok5pc5q+tNDrr4Rgq9+TIbtusBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbrdvAVa8 + ZTRXvGJYgbVeMbqrUjj+nkSi/p5C5f6dPv3+nT7+/p0+/P6dP+P1n0Q55KJGAgAAAAA1pOcRO6Hlrjuh + 5fY8oub3P6Lm5Dmk540qq+xOE7r3TgLC/YkAw/7kAMP+1gHC/EYMvu4SFb7YAgAAAAAAAAAAN7+VAkO+ + eBI7wGhFO8Fn2DrBZvY+wmnPS8Rxi560YjHQp1BD955Cmv2eQNT+nj/2/p5Ew+ijTBwAAAAAAAAAAC+o + 6gM7oeV/O6Hl4D+i5rlFqOh5JrXyPwi++3AAw/7JAMP+7ADD/v0Aw/77AMP+vQHD/XcPw/E0FsLcEirC + nA83wXszOcFpdjnBZr06wWb7OsFm/jrBZ/s8wmjrRMBlll+8Y1Wrsl0y6KZPY/6fRb7+n0OByqhOCAAA + AAAAAAAAAAAAADGm6SYxpulOHLTzRAu++mcAw/6/AMP+7gDD/v4Aw/7+AMP+/gDD/v4Aw/79AMP++ALD + /t4Aw/6RLMKIXjrBZs85wWb4OcFm/TnBZv45wWb+OcFm/jnBZv45wWb7PMFn7EvDbqZvvGdTv61cI8yp + VBMAAAAAAAAAAAAAAAAAAAAAI6/vBBa29B0Bwv6iAMP+2wDD/vkAw/7+AMP+/gDD/v4Aw/7+AMP+/gDD + /v4Aw/7+AMP++gDD/rkswYZ0OcFm5TnBZv45wWb+OcFm/jnBZv45wWb+OcFm/jnBZv45wWb+O8Jn8T7B + Z8dhvGUulLJZAgAAAAAAAAAAAAAAAAAAAAAAAAAAErj2DADD/qYAw/7wAMP+/gDD/v4Aw/7+AMP+/gDD + /v4Aw/7+AMP+/gDD/v4Aw/77AMP+uizBhnU5wWXmOcFm/jnBZv45wWb+OcFm/jnBZv45wWb+OcFm/jnB + Zv47wWf2PsJpvGC8ZRwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVt/UBAsL9SQDD/rYAw/76AMP+/gDD + /v4Aw/7+AMP+/gDD/v4Aw/7+AMP+/gDD/vsAw/67LMGGdTnBZuY5wWb+OcFm/jnBZv45wWb+OcFm/jnB + Zv45wWb+OcFm/kTDbdlWxnhnaLtjAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIvvoEAcL9LADD + /rYAw/7yAMP+/gDD/v4Aw/7+AMP+/gDD/v4Aw/7+AMP++wDD/roswYZ1OcFl5jnBZv45wWb+OcFm/jnB + Zv45wWb+OcFm/jvBZ/hEw23dU8V1XlHCbxIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAACwfwEAMP+SgDD/rIAw/72AMP+/gDD/v4Aw/7+AMP+/gDD/v4Aw/77AMP+uyzBhnU5wWbmOcFm/jnB + Zv45wWb+OcFm/jnBZv46wWb9QsNrxV3HfXJKw28SR8BoAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAwv4CAMP+EgDD/nkAw/7EAMP+8QDD/voAw/7+AMP+/gDD/vsAw/66LMGGdTnB + ZeY5wWb+OcFm/jnBZvw5wWbxOcFmxT7CaYlFwm0hP8JpAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 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 + AACAAQAAwAMAAOAHAAD4HwAA + + + \ No newline at end of file diff --git a/SunnyUI.Demo/Forms/FDialogs.Designer.cs b/SunnyUI.Demo/Forms/FDialogs.Designer.cs new file mode 100644 index 00000000..e34bc8ca --- /dev/null +++ b/SunnyUI.Demo/Forms/FDialogs.Designer.cs @@ -0,0 +1,438 @@ +namespace Sunny.UI.Demo +{ + partial class FDialogs + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.btnError = new Sunny.UI.UISymbolButton(); + 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(); + this.btnDoubleInput = new Sunny.UI.UISymbolButton(); + this.btnIntInput = new Sunny.UI.UISymbolButton(); + this.btnStringInput = new Sunny.UI.UISymbolButton(); + this.uiLine1 = new Sunny.UI.UILine(); + this.uiLine2 = new Sunny.UI.UILine(); + this.uiLine3 = new Sunny.UI.UILine(); + this.uiLine4 = new Sunny.UI.UILine(); + this.uiSymbolButton1 = new Sunny.UI.UISymbolButton(); + this.uiLine5 = new Sunny.UI.UILine(); + this.uiSymbolButton2 = new Sunny.UI.UISymbolButton(); + this.uiSymbolButton4 = new Sunny.UI.UISymbolButton(); + this.uiSymbolButton5 = new Sunny.UI.UISymbolButton(); + this.uiSymbolButton6 = new Sunny.UI.UISymbolButton(); + this.PagePanel.SuspendLayout(); + this.SuspendLayout(); + // + // PagePanel + // + this.PagePanel.Controls.Add(this.uiLine5); + this.PagePanel.Controls.Add(this.uiSymbolButton2); + this.PagePanel.Controls.Add(this.uiSymbolButton4); + this.PagePanel.Controls.Add(this.uiSymbolButton5); + this.PagePanel.Controls.Add(this.uiSymbolButton6); + this.PagePanel.Controls.Add(this.uiLine4); + this.PagePanel.Controls.Add(this.uiSymbolButton1); + this.PagePanel.Controls.Add(this.uiLine3); + this.PagePanel.Controls.Add(this.uiLine2); + this.PagePanel.Controls.Add(this.uiLine1); + this.PagePanel.Controls.Add(this.btnPasswordInput); + this.PagePanel.Controls.Add(this.btnDoubleInput); + this.PagePanel.Controls.Add(this.btnIntInput); + this.PagePanel.Controls.Add(this.btnStringInput); + this.PagePanel.Controls.Add(this.btnInfo); + this.PagePanel.Controls.Add(this.btnStatus2); + this.PagePanel.Controls.Add(this.btnAuto); + this.PagePanel.Controls.Add(this.btnError); + this.PagePanel.Controls.Add(this.btnWarn); + this.PagePanel.Controls.Add(this.btnSuccess); + this.PagePanel.Controls.Add(this.btnAsk); + this.PagePanel.Size = new System.Drawing.Size(800, 514); + // + // btnError + // + this.btnError.Cursor = System.Windows.Forms.Cursors.Hand; + this.btnError.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.btnError.FillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(232)))), ((int)(((byte)(127)))), ((int)(((byte)(128))))); + this.btnError.FillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(202)))), ((int)(((byte)(87)))), ((int)(((byte)(89))))); + this.btnError.Font = new System.Drawing.Font("微软雅黑", 12F); + this.btnError.Location = new System.Drawing.Point(600, 53); + this.btnError.Name = "btnError"; + this.btnError.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0); + this.btnError.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.btnError.RectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(232)))), ((int)(((byte)(127)))), ((int)(((byte)(128))))); + this.btnError.RectPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(202)))), ((int)(((byte)(87)))), ((int)(((byte)(89))))); + this.btnError.Size = new System.Drawing.Size(100, 35); + this.btnError.Style = Sunny.UI.UIStyle.Red; + this.btnError.StyleCustomMode = true; + this.btnError.Symbol = 61532; + this.btnError.TabIndex = 29; + this.btnError.Text = "Error"; + this.btnError.Click += new System.EventHandler(this.btnError_Click); + // + // btnWarn + // + this.btnWarn.Cursor = System.Windows.Forms.Cursors.Hand; + this.btnWarn.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(155)))), ((int)(((byte)(40))))); + this.btnWarn.FillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(223)))), ((int)(((byte)(174)))), ((int)(((byte)(86))))); + this.btnWarn.FillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(137)))), ((int)(((byte)(43))))); + this.btnWarn.Font = new System.Drawing.Font("微软雅黑", 12F); + this.btnWarn.Location = new System.Drawing.Point(486, 53); + this.btnWarn.Name = "btnWarn"; + this.btnWarn.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0); + this.btnWarn.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(155)))), ((int)(((byte)(40))))); + this.btnWarn.RectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(223)))), ((int)(((byte)(174)))), ((int)(((byte)(86))))); + this.btnWarn.RectPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(137)))), ((int)(((byte)(43))))); + this.btnWarn.Size = new System.Drawing.Size(100, 35); + this.btnWarn.Style = Sunny.UI.UIStyle.Orange; + this.btnWarn.StyleCustomMode = true; + this.btnWarn.Symbol = 61553; + this.btnWarn.TabIndex = 28; + this.btnWarn.Text = "Warn"; + this.btnWarn.Click += new System.EventHandler(this.btnWarn_Click); + // + // btnSuccess + // + this.btnSuccess.Cursor = System.Windows.Forms.Cursors.Hand; + this.btnSuccess.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(110)))), ((int)(((byte)(190)))), ((int)(((byte)(40))))); + this.btnSuccess.FillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(136)))), ((int)(((byte)(202)))), ((int)(((byte)(81))))); + this.btnSuccess.FillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(168)))), ((int)(((byte)(35))))); + this.btnSuccess.Font = new System.Drawing.Font("微软雅黑", 12F); + this.btnSuccess.Location = new System.Drawing.Point(372, 53); + this.btnSuccess.Name = "btnSuccess"; + this.btnSuccess.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0); + this.btnSuccess.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(110)))), ((int)(((byte)(190)))), ((int)(((byte)(40))))); + this.btnSuccess.RectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(136)))), ((int)(((byte)(202)))), ((int)(((byte)(81))))); + this.btnSuccess.RectPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(168)))), ((int)(((byte)(35))))); + this.btnSuccess.Size = new System.Drawing.Size(100, 35); + this.btnSuccess.Style = Sunny.UI.UIStyle.Green; + this.btnSuccess.StyleCustomMode = true; + this.btnSuccess.Symbol = 61528; + this.btnSuccess.TabIndex = 27; + this.btnSuccess.Text = "Success"; + this.btnSuccess.Click += new System.EventHandler(this.btnSuccess_Click); + // + // btnAsk + // + this.btnAsk.Cursor = System.Windows.Forms.Cursors.Hand; + this.btnAsk.Font = new System.Drawing.Font("微软雅黑", 12F); + this.btnAsk.Location = new System.Drawing.Point(30, 53); + 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.StyleCustomMode = true; + this.btnAsk.Symbol = 61529; + this.btnAsk.TabIndex = 26; + this.btnAsk.Text = "Query"; + 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(144, 53); + 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.Click += new System.EventHandler(this.btnAuto_Click); + // + // btnStatus2 + // + this.btnStatus2.Cursor = System.Windows.Forms.Cursors.Hand; + this.btnStatus2.Font = new System.Drawing.Font("微软雅黑", 12F); + this.btnStatus2.Location = new System.Drawing.Point(30, 263); + this.btnStatus2.Name = "btnStatus2"; + this.btnStatus2.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0); + this.btnStatus2.Size = new System.Drawing.Size(214, 35); + this.btnStatus2.Symbol = 57595; + this.btnStatus2.TabIndex = 36; + this.btnStatus2.Text = "进度提示框"; + this.btnStatus2.Click += new System.EventHandler(this.btnStatus2_Click); + // + // 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.FillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(158)))), ((int)(((byte)(160)))), ((int)(((byte)(165))))); + this.btnInfo.FillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(121)))), ((int)(((byte)(123)))), ((int)(((byte)(129))))); + this.btnInfo.Font = new System.Drawing.Font("微软雅黑", 12F); + this.btnInfo.Location = new System.Drawing.Point(258, 53); + 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)(158)))), ((int)(((byte)(160)))), ((int)(((byte)(165))))); + this.btnInfo.RectPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(121)))), ((int)(((byte)(123)))), ((int)(((byte)(129))))); + this.btnInfo.Size = new System.Drawing.Size(100, 35); + this.btnInfo.Style = Sunny.UI.UIStyle.Gray; + this.btnInfo.StyleCustomMode = true; + this.btnInfo.Symbol = 61530; + this.btnInfo.TabIndex = 37; + this.btnInfo.Text = "Info"; + this.btnInfo.Click += new System.EventHandler(this.btnInfo_Click); + // + // btnPasswordInput + // + this.btnPasswordInput.Cursor = System.Windows.Forms.Cursors.Hand; + this.btnPasswordInput.Font = new System.Drawing.Font("微软雅黑", 12F); + this.btnPasswordInput.Location = new System.Drawing.Point(30, 182); + this.btnPasswordInput.Name = "btnPasswordInput"; + this.btnPasswordInput.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0); + this.btnPasswordInput.Size = new System.Drawing.Size(214, 35); + this.btnPasswordInput.Symbol = 61545; + this.btnPasswordInput.TabIndex = 46; + this.btnPasswordInput.Text = "密码输入框"; + this.btnPasswordInput.Click += new System.EventHandler(this.btnPasswordInput_Click); + // + // btnDoubleInput + // + this.btnDoubleInput.Cursor = System.Windows.Forms.Cursors.Hand; + this.btnDoubleInput.Font = new System.Drawing.Font("微软雅黑", 12F); + this.btnDoubleInput.Location = new System.Drawing.Point(486, 134); + this.btnDoubleInput.Name = "btnDoubleInput"; + this.btnDoubleInput.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0); + this.btnDoubleInput.Size = new System.Drawing.Size(214, 35); + this.btnDoubleInput.Symbol = 62022; + this.btnDoubleInput.TabIndex = 45; + this.btnDoubleInput.Text = "浮点数输入框"; + this.btnDoubleInput.Click += new System.EventHandler(this.btnDoubleInput_Click); + // + // btnIntInput + // + this.btnIntInput.Cursor = System.Windows.Forms.Cursors.Hand; + this.btnIntInput.Font = new System.Drawing.Font("微软雅黑", 12F); + this.btnIntInput.Location = new System.Drawing.Point(258, 134); + this.btnIntInput.Name = "btnIntInput"; + this.btnIntInput.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0); + this.btnIntInput.Size = new System.Drawing.Size(214, 35); + this.btnIntInput.Symbol = 62022; + this.btnIntInput.TabIndex = 44; + this.btnIntInput.Text = "整数输入框"; + this.btnIntInput.Click += new System.EventHandler(this.btnIntInput_Click); + // + // btnStringInput + // + this.btnStringInput.Cursor = System.Windows.Forms.Cursors.Hand; + this.btnStringInput.Font = new System.Drawing.Font("微软雅黑", 12F); + this.btnStringInput.Location = new System.Drawing.Point(30, 134); + this.btnStringInput.Name = "btnStringInput"; + this.btnStringInput.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0); + this.btnStringInput.Size = new System.Drawing.Size(214, 35); + this.btnStringInput.Symbol = 62022; + this.btnStringInput.TabIndex = 43; + this.btnStringInput.Text = "字符串输入框"; + this.btnStringInput.Click += new System.EventHandler(this.btnStringInput_Click); + // + // uiLine1 + // + this.uiLine1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLine1.Location = new System.Drawing.Point(30, 20); + this.uiLine1.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine1.Name = "uiLine1"; + this.uiLine1.Size = new System.Drawing.Size(670, 20); + this.uiLine1.TabIndex = 47; + this.uiLine1.Text = "UIMessageDialog"; + this.uiLine1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiLine2 + // + this.uiLine2.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLine2.Location = new System.Drawing.Point(30, 101); + this.uiLine2.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine2.Name = "uiLine2"; + this.uiLine2.Size = new System.Drawing.Size(670, 20); + this.uiLine2.TabIndex = 48; + this.uiLine2.Text = "UIInputDialog"; + this.uiLine2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiLine3 + // + this.uiLine3.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLine3.Location = new System.Drawing.Point(30, 230); + this.uiLine3.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine3.Name = "uiLine3"; + this.uiLine3.Size = new System.Drawing.Size(670, 20); + this.uiLine3.TabIndex = 49; + this.uiLine3.Text = "UIStatusDialog"; + this.uiLine3.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiLine4 + // + this.uiLine4.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLine4.Location = new System.Drawing.Point(30, 314); + this.uiLine4.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine4.Name = "uiLine4"; + this.uiLine4.Size = new System.Drawing.Size(670, 20); + this.uiLine4.TabIndex = 51; + this.uiLine4.Text = "UISelectDialog"; + this.uiLine4.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiSymbolButton1 + // + this.uiSymbolButton1.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiSymbolButton1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiSymbolButton1.Location = new System.Drawing.Point(30, 347); + this.uiSymbolButton1.Name = "uiSymbolButton1"; + this.uiSymbolButton1.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0); + this.uiSymbolButton1.Size = new System.Drawing.Size(214, 35); + this.uiSymbolButton1.Symbol = 61655; + this.uiSymbolButton1.TabIndex = 50; + this.uiSymbolButton1.Text = "下拉选择框"; + this.uiSymbolButton1.Click += new System.EventHandler(this.uiSymbolButton1_Click); + // + // uiLine5 + // + this.uiLine5.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLine5.Location = new System.Drawing.Point(30, 397); + this.uiLine5.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine5.Name = "uiLine5"; + this.uiLine5.Size = new System.Drawing.Size(670, 20); + this.uiLine5.TabIndex = 58; + this.uiLine5.Text = "UINotifier"; + this.uiLine5.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiSymbolButton2 + // + this.uiSymbolButton2.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiSymbolButton2.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiSymbolButton2.Location = new System.Drawing.Point(30, 430); + this.uiSymbolButton2.Name = "uiSymbolButton2"; + this.uiSymbolButton2.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0); + this.uiSymbolButton2.Size = new System.Drawing.Size(100, 35); + this.uiSymbolButton2.StyleCustomMode = true; + this.uiSymbolButton2.Symbol = 61530; + this.uiSymbolButton2.TabIndex = 57; + this.uiSymbolButton2.Text = "Info"; + this.uiSymbolButton2.Click += new System.EventHandler(this.uiSymbolButton2_Click); + // + // uiSymbolButton4 + // + this.uiSymbolButton4.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiSymbolButton4.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.uiSymbolButton4.FillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(232)))), ((int)(((byte)(127)))), ((int)(((byte)(128))))); + this.uiSymbolButton4.FillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(202)))), ((int)(((byte)(87)))), ((int)(((byte)(89))))); + this.uiSymbolButton4.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiSymbolButton4.Location = new System.Drawing.Point(372, 430); + this.uiSymbolButton4.Name = "uiSymbolButton4"; + this.uiSymbolButton4.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0); + this.uiSymbolButton4.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.uiSymbolButton4.RectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(232)))), ((int)(((byte)(127)))), ((int)(((byte)(128))))); + this.uiSymbolButton4.RectPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(202)))), ((int)(((byte)(87)))), ((int)(((byte)(89))))); + this.uiSymbolButton4.Size = new System.Drawing.Size(100, 35); + this.uiSymbolButton4.Style = Sunny.UI.UIStyle.Red; + this.uiSymbolButton4.StyleCustomMode = true; + this.uiSymbolButton4.Symbol = 61532; + this.uiSymbolButton4.TabIndex = 55; + this.uiSymbolButton4.Text = "Error"; + this.uiSymbolButton4.Click += new System.EventHandler(this.uiSymbolButton4_Click); + // + // uiSymbolButton5 + // + this.uiSymbolButton5.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiSymbolButton5.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(155)))), ((int)(((byte)(40))))); + this.uiSymbolButton5.FillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(223)))), ((int)(((byte)(174)))), ((int)(((byte)(86))))); + this.uiSymbolButton5.FillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(137)))), ((int)(((byte)(43))))); + this.uiSymbolButton5.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiSymbolButton5.Location = new System.Drawing.Point(258, 430); + this.uiSymbolButton5.Name = "uiSymbolButton5"; + this.uiSymbolButton5.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0); + this.uiSymbolButton5.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(155)))), ((int)(((byte)(40))))); + this.uiSymbolButton5.RectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(223)))), ((int)(((byte)(174)))), ((int)(((byte)(86))))); + this.uiSymbolButton5.RectPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(137)))), ((int)(((byte)(43))))); + this.uiSymbolButton5.Size = new System.Drawing.Size(100, 35); + this.uiSymbolButton5.Style = Sunny.UI.UIStyle.Orange; + this.uiSymbolButton5.StyleCustomMode = true; + this.uiSymbolButton5.Symbol = 61553; + this.uiSymbolButton5.TabIndex = 54; + this.uiSymbolButton5.Text = "Warn"; + this.uiSymbolButton5.Click += new System.EventHandler(this.uiSymbolButton5_Click); + // + // uiSymbolButton6 + // + this.uiSymbolButton6.Cursor = System.Windows.Forms.Cursors.Hand; + this.uiSymbolButton6.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(110)))), ((int)(((byte)(190)))), ((int)(((byte)(40))))); + this.uiSymbolButton6.FillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(136)))), ((int)(((byte)(202)))), ((int)(((byte)(81))))); + this.uiSymbolButton6.FillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(168)))), ((int)(((byte)(35))))); + this.uiSymbolButton6.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiSymbolButton6.Location = new System.Drawing.Point(144, 430); + this.uiSymbolButton6.Name = "uiSymbolButton6"; + this.uiSymbolButton6.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0); + this.uiSymbolButton6.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(110)))), ((int)(((byte)(190)))), ((int)(((byte)(40))))); + this.uiSymbolButton6.RectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(136)))), ((int)(((byte)(202)))), ((int)(((byte)(81))))); + this.uiSymbolButton6.RectPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(168)))), ((int)(((byte)(35))))); + this.uiSymbolButton6.Size = new System.Drawing.Size(100, 35); + this.uiSymbolButton6.Style = Sunny.UI.UIStyle.Green; + this.uiSymbolButton6.StyleCustomMode = true; + this.uiSymbolButton6.Symbol = 61528; + this.uiSymbolButton6.TabIndex = 53; + this.uiSymbolButton6.Text = "Success"; + this.uiSymbolButton6.Click += new System.EventHandler(this.uiSymbolButton6_Click); + // + // FDialogs + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 549); + this.Name = "FDialogs"; + this.PageIndex = 2001; + this.Text = "Dialogs"; + this.PagePanel.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private UISymbolButton btnError; + private UISymbolButton btnWarn; + private UISymbolButton btnSuccess; + private UISymbolButton btnAsk; + private UISymbolButton btnAuto; + private UISymbolButton btnStatus2; + private UISymbolButton btnInfo; + private UISymbolButton btnPasswordInput; + private UISymbolButton btnDoubleInput; + private UISymbolButton btnIntInput; + private UISymbolButton btnStringInput; + private UILine uiLine3; + private UILine uiLine2; + private UILine uiLine1; + private UILine uiLine4; + private UISymbolButton uiSymbolButton1; + private UILine uiLine5; + private UISymbolButton uiSymbolButton2; + private UISymbolButton uiSymbolButton4; + private UISymbolButton uiSymbolButton5; + private UISymbolButton uiSymbolButton6; + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Forms/FDialogs.cs b/SunnyUI.Demo/Forms/FDialogs.cs new file mode 100644 index 00000000..92ac63a3 --- /dev/null +++ b/SunnyUI.Demo/Forms/FDialogs.cs @@ -0,0 +1,126 @@ +using System; +using System.Collections.Generic; + +namespace Sunny.UI.Demo +{ + public partial class FDialogs : UITitlePage + { + public FDialogs() + { + InitializeComponent(); + } + + private void btnAsk_Click(object sender, EventArgs e) + { + if (this.ShowAskDialog("确认信息提示框")) + { + this.ShowInfoDialog("您点击了确定按钮"); + } + else + { + this.ShowErrorDialog("您点击了取消按钮"); + } + } + + private void btnAuto_Click(object sender, EventArgs e) + { + this.ShowInfoDialog("跟随界面主题风格信息提示框", Style); + } + + private void btnSuccess_Click(object sender, EventArgs e) + { + this.ShowSuccessDialog("正确信息提示框"); + } + + private void btnWarn_Click(object sender, EventArgs e) + { + this.ShowWarningDialog("警告信息提示框"); + } + + private void btnError_Click(object sender, EventArgs e) + { + this.ShowErrorDialog("错误信息提示框"); + } + + private void btnStatus2_Click(object sender, EventArgs e) + { + ShowStatus("提示", "数据加载中......"); + for (int i = 0; i < 100; i++) + { + SystemEx.Delay(50); + StatusStepIt(); + } + } + + private void btnInfo_Click(object sender, EventArgs e) + { + this.ShowInfoDialog("默认信息提示框"); + } + + private void btnStringInput_Click(object sender, EventArgs e) + { + string value = "请输入字符串"; + if (this.InputStringDialog(ref value)) + { + this.ShowInfoDialog(value); + } + } + + private void btnIntInput_Click(object sender, EventArgs e) + { + int value = 0; + if (this.InputIntegerDialog(ref value)) + { + this.ShowInfoDialog(value.ToString()); + } + } + + private void btnDoubleInput_Click(object sender, EventArgs e) + { + double value = 0; + if (this.InputDoubleDialog(ref value)) + { + this.ShowInfoDialog(value.ToString("F2")); + } + } + + private void btnPasswordInput_Click(object sender, EventArgs e) + { + string value = ""; + if (this.InputPasswordDialog(ref value)) + { + this.ShowInfoDialog(value); + } + } + + private void uiSymbolButton1_Click(object sender, EventArgs e) + { + List items = new List() { "0", "1", "2", "3", "4" }; + int index = 2; + if (this.ShowSelectDialog(ref index, items)) + { + this.ShowInfoDialog(index.ToString()); + } + } + + private void uiSymbolButton2_Click(object sender, EventArgs e) + { + this.ShowInfoNotifier("Info"); + } + + private void uiSymbolButton6_Click(object sender, EventArgs e) + { + this.ShowSuccessNotifier("Success"); + } + + private void uiSymbolButton5_Click(object sender, EventArgs e) + { + this.ShowWarningNotifier("Warning"); + } + + private void uiSymbolButton4_Click(object sender, EventArgs e) + { + this.ShowErrorNotifier("Error"); + } + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Forms/FDialogs.resx b/SunnyUI.Demo/Forms/FDialogs.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/SunnyUI.Demo/Forms/FDialogs.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SunnyUI.Demo/Forms/FEdit.Designer.cs b/SunnyUI.Demo/Forms/FEdit.Designer.cs new file mode 100644 index 00000000..def2f599 --- /dev/null +++ b/SunnyUI.Demo/Forms/FEdit.Designer.cs @@ -0,0 +1,272 @@ +namespace Sunny.UI.Demo.Forms +{ + partial class FEdit + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.edtName = new Sunny.UI.UITextBox(); + this.uiLabel2 = new Sunny.UI.UILabel(); + this.uiLabel3 = new Sunny.UI.UILabel(); + this.rbMale = new Sunny.UI.UIRadioButton(); + this.rbFemale = new Sunny.UI.UIRadioButton(); + this.edtAge = new Sunny.UI.UITextBox(); + this.uiLabel4 = new Sunny.UI.UILabel(); + this.cbDepartment = new Sunny.UI.UIComboBox(); + this.uiLabel5 = new Sunny.UI.UILabel(); + this.uiLabel6 = new Sunny.UI.UILabel(); + this.edtDate = new Sunny.UI.UIDatePicker(); + this.edtAddress = new Sunny.UI.UITextBox(); + this.uiLabel1 = new Sunny.UI.UILabel(); + this.SuspendLayout(); + // + // pnlBtm + // + this.pnlBtm.Location = new System.Drawing.Point(1, 304); + this.pnlBtm.Size = new System.Drawing.Size(518, 55); + this.pnlBtm.TabIndex = 7; + // + // edtName + // + this.edtName.Cursor = System.Windows.Forms.Cursors.IBeam; + this.edtName.FillColor = System.Drawing.Color.White; + this.edtName.Font = new System.Drawing.Font("微软雅黑", 12F); + this.edtName.Location = new System.Drawing.Point(150, 55); + this.edtName.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.edtName.Name = "edtName"; + this.edtName.Padding = new System.Windows.Forms.Padding(5); + this.edtName.Size = new System.Drawing.Size(340, 29); + this.edtName.TabIndex = 0; + // + // uiLabel2 + // + this.uiLabel2.AutoSize = true; + this.uiLabel2.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLabel2.Location = new System.Drawing.Point(56, 59); + this.uiLabel2.Name = "uiLabel2"; + this.uiLabel2.Size = new System.Drawing.Size(42, 21); + this.uiLabel2.TabIndex = 4; + this.uiLabel2.Text = "姓名"; + this.uiLabel2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiLabel3 + // + this.uiLabel3.AutoSize = true; + this.uiLabel3.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLabel3.Location = new System.Drawing.Point(56, 99); + this.uiLabel3.Name = "uiLabel3"; + this.uiLabel3.Size = new System.Drawing.Size(42, 21); + this.uiLabel3.TabIndex = 6; + this.uiLabel3.Text = "性别"; + this.uiLabel3.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // rbMale + // + this.rbMale.Checked = true; + this.rbMale.Cursor = System.Windows.Forms.Cursors.Hand; + this.rbMale.Font = new System.Drawing.Font("微软雅黑", 12F); + this.rbMale.Location = new System.Drawing.Point(150, 95); + this.rbMale.Name = "rbMale"; + this.rbMale.Padding = new System.Windows.Forms.Padding(22, 0, 0, 0); + this.rbMale.Size = new System.Drawing.Size(82, 29); + this.rbMale.TabIndex = 1; + this.rbMale.Text = "男"; + // + // rbFemale + // + this.rbFemale.Cursor = System.Windows.Forms.Cursors.Hand; + this.rbFemale.Font = new System.Drawing.Font("微软雅黑", 12F); + this.rbFemale.Location = new System.Drawing.Point(238, 95); + this.rbFemale.Name = "rbFemale"; + this.rbFemale.Padding = new System.Windows.Forms.Padding(22, 0, 0, 0); + this.rbFemale.Size = new System.Drawing.Size(82, 29); + this.rbFemale.TabIndex = 2; + this.rbFemale.Text = "女"; + // + // edtAge + // + this.edtAge.Cursor = System.Windows.Forms.Cursors.IBeam; + this.edtAge.FillColor = System.Drawing.Color.White; + this.edtAge.Font = new System.Drawing.Font("微软雅黑", 12F); + this.edtAge.Location = new System.Drawing.Point(150, 135); + this.edtAge.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.edtAge.Name = "edtAge"; + this.edtAge.Padding = new System.Windows.Forms.Padding(5); + this.edtAge.Size = new System.Drawing.Size(170, 29); + this.edtAge.TabIndex = 3; + this.edtAge.Text = "0"; + this.edtAge.Type = Sunny.UI.UITextBox.UIEditType.Integer; + // + // uiLabel4 + // + this.uiLabel4.AutoSize = true; + this.uiLabel4.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLabel4.Location = new System.Drawing.Point(56, 139); + this.uiLabel4.Name = "uiLabel4"; + this.uiLabel4.Size = new System.Drawing.Size(42, 21); + this.uiLabel4.TabIndex = 10; + this.uiLabel4.Text = "年龄"; + this.uiLabel4.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // cbDepartment + // + this.cbDepartment.DropDownStyle = Sunny.UI.UIDropDownStyle.DropDownList; + this.cbDepartment.FillColor = System.Drawing.Color.White; + this.cbDepartment.Font = new System.Drawing.Font("微软雅黑", 12F); + this.cbDepartment.Items.AddRange(new object[] { + "研发部", + "采购部", + "生产部", + "销售部", + "人事部", + "财务部", + "行政部", + "其他"}); + this.cbDepartment.Location = new System.Drawing.Point(150, 175); + this.cbDepartment.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.cbDepartment.MinimumSize = new System.Drawing.Size(63, 0); + this.cbDepartment.Name = "cbDepartment"; + this.cbDepartment.Padding = new System.Windows.Forms.Padding(0, 0, 30, 0); + this.cbDepartment.Size = new System.Drawing.Size(170, 29); + this.cbDepartment.TabIndex = 4; + this.cbDepartment.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiLabel5 + // + this.uiLabel5.AutoSize = true; + this.uiLabel5.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLabel5.Location = new System.Drawing.Point(56, 179); + this.uiLabel5.Name = "uiLabel5"; + this.uiLabel5.Size = new System.Drawing.Size(42, 21); + this.uiLabel5.TabIndex = 12; + this.uiLabel5.Text = "部门"; + this.uiLabel5.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiLabel6 + // + this.uiLabel6.AutoSize = true; + this.uiLabel6.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLabel6.Location = new System.Drawing.Point(56, 219); + this.uiLabel6.Name = "uiLabel6"; + this.uiLabel6.Size = new System.Drawing.Size(42, 21); + this.uiLabel6.TabIndex = 13; + this.uiLabel6.Text = "生日"; + this.uiLabel6.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // edtDate + // + this.edtDate.DropDownStyle = Sunny.UI.UIDropDownStyle.DropDownList; + this.edtDate.FillColor = System.Drawing.Color.White; + this.edtDate.Font = new System.Drawing.Font("微软雅黑", 12F); + this.edtDate.Location = new System.Drawing.Point(150, 215); + this.edtDate.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.edtDate.MinimumSize = new System.Drawing.Size(63, 0); + this.edtDate.Name = "edtDate"; + this.edtDate.Padding = new System.Windows.Forms.Padding(0, 0, 30, 0); + this.edtDate.Size = new System.Drawing.Size(170, 29); + this.edtDate.TabIndex = 5; + this.edtDate.Text = "2020-05-08"; + this.edtDate.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft; + this.edtDate.Value = new System.DateTime(2020, 5, 8, 0, 0, 0, 0); + // + // edtAddress + // + this.edtAddress.Cursor = System.Windows.Forms.Cursors.IBeam; + this.edtAddress.FillColor = System.Drawing.Color.White; + this.edtAddress.Font = new System.Drawing.Font("微软雅黑", 12F); + this.edtAddress.Location = new System.Drawing.Point(150, 254); + this.edtAddress.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.edtAddress.Name = "edtAddress"; + this.edtAddress.Padding = new System.Windows.Forms.Padding(5); + this.edtAddress.Size = new System.Drawing.Size(340, 29); + this.edtAddress.TabIndex = 6; + // + // uiLabel1 + // + this.uiLabel1.AutoSize = true; + this.uiLabel1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLabel1.Location = new System.Drawing.Point(56, 258); + this.uiLabel1.Name = "uiLabel1"; + this.uiLabel1.Size = new System.Drawing.Size(42, 21); + this.uiLabel1.TabIndex = 15; + this.uiLabel1.Text = "住址"; + this.uiLabel1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // FEdit + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(520, 362); + this.Controls.Add(this.edtAddress); + this.Controls.Add(this.uiLabel1); + this.Controls.Add(this.edtDate); + this.Controls.Add(this.uiLabel6); + this.Controls.Add(this.uiLabel5); + this.Controls.Add(this.cbDepartment); + this.Controls.Add(this.uiLabel4); + this.Controls.Add(this.edtAge); + this.Controls.Add(this.rbFemale); + this.Controls.Add(this.rbMale); + this.Controls.Add(this.uiLabel3); + this.Controls.Add(this.edtName); + this.Controls.Add(this.uiLabel2); + this.Name = "FEdit"; + this.Text = "UIEditFrom"; + this.Controls.SetChildIndex(this.pnlBtm, 0); + this.Controls.SetChildIndex(this.uiLabel2, 0); + this.Controls.SetChildIndex(this.edtName, 0); + this.Controls.SetChildIndex(this.uiLabel3, 0); + this.Controls.SetChildIndex(this.rbMale, 0); + this.Controls.SetChildIndex(this.rbFemale, 0); + this.Controls.SetChildIndex(this.edtAge, 0); + this.Controls.SetChildIndex(this.uiLabel4, 0); + this.Controls.SetChildIndex(this.cbDepartment, 0); + this.Controls.SetChildIndex(this.uiLabel5, 0); + this.Controls.SetChildIndex(this.uiLabel6, 0); + this.Controls.SetChildIndex(this.edtDate, 0); + this.Controls.SetChildIndex(this.uiLabel1, 0); + this.Controls.SetChildIndex(this.edtAddress, 0); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + private UITextBox edtName; + private UILabel uiLabel2; + private UILabel uiLabel3; + private UIRadioButton rbMale; + private UIRadioButton rbFemale; + private UITextBox edtAge; + private UILabel uiLabel4; + private UIComboBox cbDepartment; + private UILabel uiLabel5; + private UILabel uiLabel6; + private UIDatePicker edtDate; + private UITextBox edtAddress; + private UILabel uiLabel1; + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Forms/FEdit.cs b/SunnyUI.Demo/Forms/FEdit.cs new file mode 100644 index 00000000..da10ed1d --- /dev/null +++ b/SunnyUI.Demo/Forms/FEdit.cs @@ -0,0 +1,55 @@ +namespace Sunny.UI.Demo.Forms +{ + public partial class FEdit : UIEditForm + { + public FEdit() + { + InitializeComponent(); + } + + protected override bool CheckData() + { + return CheckEmpty(edtName, "请输入姓名") + && CheckEmpty(edtAge, "请输入年龄") + && CheckRange(edtAge, 18, 60, "输入年龄范围18~60") + && CheckEmpty(cbDepartment, "请选择部门") + && CheckEmpty(edtDate, "请选择生日"); + } + + private Person person; + + public Person Person + { + get + { + if (person == null) + { + person = new Person(); + } + + person.Name = edtName.Text; + person.Age = edtAge.IntValue; + person.Birthday = edtDate.Value; + person.Address = edtAddress.Text; + if (rbMale.Checked) + person.Sex = Sex.Male; + if (rbFemale.Checked) + person.Sex = Sex.Female; + person.Department = cbDepartment.Text; + return person; + } + + set + { + person = value; + edtName.Text = value.Name; + edtAge.IntValue = value.Age; + edtDate.Value = value.Birthday; + edtAddress.Text = value.Address; + cbDepartment.SelectedIndex = cbDepartment.Items.IndexOf(value.Department); + rbMale.Checked = value.Sex == Sex.Male; + rbFemale.Checked = value.Sex == Sex.Female; + } + } + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Forms/FEdit.resx b/SunnyUI.Demo/Forms/FEdit.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/SunnyUI.Demo/Forms/FEdit.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SunnyUI.Demo/Forms/FEditor.Designer.cs b/SunnyUI.Demo/Forms/FEditor.Designer.cs new file mode 100644 index 00000000..a340378c --- /dev/null +++ b/SunnyUI.Demo/Forms/FEditor.Designer.cs @@ -0,0 +1,98 @@ +namespace Sunny.UI.Demo.Forms +{ + partial class FEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.btnEdit = new Sunny.UI.UISymbolButton(); + this.uiLine1 = new Sunny.UI.UILine(); + this.btnAdd = new Sunny.UI.UISymbolButton(); + this.PagePanel.SuspendLayout(); + this.SuspendLayout(); + // + // PagePanel + // + this.PagePanel.Controls.Add(this.btnAdd); + this.PagePanel.Controls.Add(this.uiLine1); + this.PagePanel.Controls.Add(this.btnEdit); + // + // btnEdit + // + this.btnEdit.Cursor = System.Windows.Forms.Cursors.Hand; + this.btnEdit.Font = new System.Drawing.Font("微软雅黑", 12F); + this.btnEdit.Location = new System.Drawing.Point(152, 57); + this.btnEdit.Name = "btnEdit"; + this.btnEdit.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0); + this.btnEdit.Size = new System.Drawing.Size(100, 35); + this.btnEdit.Symbol = 61508; + this.btnEdit.TabIndex = 0; + this.btnEdit.Text = "编辑"; + this.btnEdit.Click += new System.EventHandler(this.btnEdit_Click); + // + // uiLine1 + // + this.uiLine1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLine1.Location = new System.Drawing.Point(30, 20); + this.uiLine1.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine1.Name = "uiLine1"; + this.uiLine1.Size = new System.Drawing.Size(670, 20); + this.uiLine1.TabIndex = 19; + this.uiLine1.Text = "UIEditForm"; + this.uiLine1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // btnAdd + // + this.btnAdd.Cursor = System.Windows.Forms.Cursors.Hand; + this.btnAdd.Font = new System.Drawing.Font("微软雅黑", 12F); + this.btnAdd.Location = new System.Drawing.Point(30, 57); + this.btnAdd.Name = "btnAdd"; + this.btnAdd.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0); + this.btnAdd.Size = new System.Drawing.Size(100, 35); + this.btnAdd.Symbol = 61543; + this.btnAdd.TabIndex = 20; + this.btnAdd.Text = "增加"; + this.btnAdd.Click += new System.EventHandler(this.btnAdd_Click); + // + // FEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 450); + this.Name = "FEditor"; + this.Text = "Editor"; + this.PagePanel.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private UISymbolButton btnEdit; + private UILine uiLine1; + private UISymbolButton btnAdd; + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Forms/FEditor.cs b/SunnyUI.Demo/Forms/FEditor.cs new file mode 100644 index 00000000..3a7abc65 --- /dev/null +++ b/SunnyUI.Demo/Forms/FEditor.cs @@ -0,0 +1,70 @@ +using System; + +namespace Sunny.UI.Demo.Forms +{ + public partial class FEditor : UITitlePage + { + public FEditor() + { + InitializeComponent(); + } + + private void btnEdit_Click(object sender, System.EventArgs e) + { + Person person = new Person(); + person.Name = "SunnyUI"; + person.Sex = Sex.Male; + person.Age = 18; + person.Department = "研发部"; + person.Birthday = new DateTime(2002, 1, 1); + + FEdit frm = new FEdit(); + frm.Person = person; + frm.ShowDialog(); + if (frm.IsOK) + { + this.ShowSuccessDialog(frm.Person.ToString()); + } + + frm.Dispose(); + } + + private void btnAdd_Click(object sender, EventArgs e) + { + FEdit frm = new FEdit(); + frm.ShowDialog(); + if (frm.IsOK) + { + this.ShowSuccessDialog(frm.Person.ToString()); + } + + frm.Dispose(); + } + } + + public class Person + { + public string Name { get; set; } + + public int Age { get; set; } + + public Sex Sex { get; set; } + + public string Department { get; set; } + + public DateTime Birthday { get; set; } + + public string Address { get; set; } + + public override string ToString() + { + return Name + ", " + Age + ", " + Department; + } + } + + public enum Sex + { + Male, + Female + } +} diff --git a/SunnyUI.Demo/Forms/FEditor.resx b/SunnyUI.Demo/Forms/FEditor.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/SunnyUI.Demo/Forms/FEditor.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SunnyUI.Demo/Forms/FFrames.Designer.cs b/SunnyUI.Demo/Forms/FFrames.Designer.cs new file mode 100644 index 00000000..5a010f16 --- /dev/null +++ b/SunnyUI.Demo/Forms/FFrames.Designer.cs @@ -0,0 +1,203 @@ +namespace Sunny.UI.Demo +{ + partial class FFrames + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.uiLine1 = new Sunny.UI.UILine(); + this.btnAM = new Sunny.UI.UIImageButton(); + this.btnAHMF = new Sunny.UI.UIImageButton(); + this.btnHAMF = new Sunny.UI.UIImageButton(); + this.btnHAM = new Sunny.UI.UIImageButton(); + this.btnAHM = new Sunny.UI.UIImageButton(); + this.btnHMF = new Sunny.UI.UIImageButton(); + this.btnHM = new Sunny.UI.UIImageButton(); + this.PagePanel.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.btnAM)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.btnAHMF)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.btnHAMF)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.btnHAM)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.btnAHM)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.btnHMF)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.btnHM)).BeginInit(); + this.SuspendLayout(); + // + // PagePanel + // + this.PagePanel.Controls.Add(this.uiLine1); + this.PagePanel.Controls.Add(this.btnAM); + this.PagePanel.Controls.Add(this.btnAHMF); + this.PagePanel.Controls.Add(this.btnHAMF); + this.PagePanel.Controls.Add(this.btnHAM); + this.PagePanel.Controls.Add(this.btnAHM); + this.PagePanel.Controls.Add(this.btnHMF); + this.PagePanel.Controls.Add(this.btnHM); + this.PagePanel.Size = new System.Drawing.Size(892, 592); + this.PagePanel.Style = Sunny.UI.UIStyle.Blue; + // + // uiLine1 + // + this.uiLine1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLine1.Location = new System.Drawing.Point(30, 20); + this.uiLine1.MinimumSize = new System.Drawing.Size(16, 16); + this.uiLine1.Name = "uiLine1"; + this.uiLine1.Size = new System.Drawing.Size(670, 20); + this.uiLine1.TabIndex = 48; + this.uiLine1.Text = "UIMainFrame"; + this.uiLine1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // btnAM + // + this.btnAM.Cursor = System.Windows.Forms.Cursors.Hand; + this.btnAM.Image = global::Sunny.UI.Demo.Properties.Resources.AM; + this.btnAM.ImageHover = global::Sunny.UI.Demo.Properties.Resources.AM1; + this.btnAM.Location = new System.Drawing.Point(30, 381); + this.btnAM.Name = "btnAM"; + this.btnAM.Size = new System.Drawing.Size(160, 120); + this.btnAM.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; + this.btnAM.TabIndex = 7; + this.btnAM.TabStop = false; + this.btnAM.Text = null; + this.btnAM.Click += new System.EventHandler(this.btnAM_Click); + // + // btnAHMF + // + this.btnAHMF.Cursor = System.Windows.Forms.Cursors.Hand; + this.btnAHMF.Image = global::Sunny.UI.Demo.Properties.Resources.AHMF; + this.btnAHMF.ImageHover = global::Sunny.UI.Demo.Properties.Resources.AHMF1; + this.btnAHMF.Location = new System.Drawing.Point(430, 381); + this.btnAHMF.Name = "btnAHMF"; + this.btnAHMF.Size = new System.Drawing.Size(160, 120); + this.btnAHMF.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; + this.btnAHMF.TabIndex = 6; + this.btnAHMF.TabStop = false; + this.btnAHMF.Text = null; + this.btnAHMF.Click += new System.EventHandler(this.btnAHMF_Click); + // + // btnHAMF + // + this.btnHAMF.Cursor = System.Windows.Forms.Cursors.Hand; + this.btnHAMF.Image = global::Sunny.UI.Demo.Properties.Resources.HAMF; + this.btnHAMF.ImageHover = global::Sunny.UI.Demo.Properties.Resources.HAMF1; + this.btnHAMF.Location = new System.Drawing.Point(230, 221); + this.btnHAMF.Name = "btnHAMF"; + this.btnHAMF.Size = new System.Drawing.Size(160, 120); + this.btnHAMF.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; + this.btnHAMF.TabIndex = 5; + this.btnHAMF.TabStop = false; + this.btnHAMF.Text = null; + this.btnHAMF.Click += new System.EventHandler(this.btnHAMF_Click); + // + // btnHAM + // + this.btnHAM.Cursor = System.Windows.Forms.Cursors.Hand; + this.btnHAM.Image = global::Sunny.UI.Demo.Properties.Resources.HAM; + this.btnHAM.ImageHover = global::Sunny.UI.Demo.Properties.Resources.HAM1; + this.btnHAM.Location = new System.Drawing.Point(30, 221); + this.btnHAM.Name = "btnHAM"; + this.btnHAM.Size = new System.Drawing.Size(160, 120); + this.btnHAM.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; + this.btnHAM.TabIndex = 4; + this.btnHAM.TabStop = false; + this.btnHAM.Text = null; + this.btnHAM.Click += new System.EventHandler(this.btnHAM_Click); + // + // btnAHM + // + this.btnAHM.Cursor = System.Windows.Forms.Cursors.Hand; + this.btnAHM.Image = global::Sunny.UI.Demo.Properties.Resources.AHM; + this.btnAHM.ImageHover = global::Sunny.UI.Demo.Properties.Resources.AHM1; + this.btnAHM.Location = new System.Drawing.Point(230, 381); + this.btnAHM.Name = "btnAHM"; + this.btnAHM.Size = new System.Drawing.Size(160, 120); + this.btnAHM.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; + this.btnAHM.TabIndex = 3; + this.btnAHM.TabStop = false; + this.btnAHM.Text = null; + this.btnAHM.Click += new System.EventHandler(this.btnAHM_Click); + // + // btnHMF + // + this.btnHMF.Cursor = System.Windows.Forms.Cursors.Hand; + this.btnHMF.Image = global::Sunny.UI.Demo.Properties.Resources.HMF; + this.btnHMF.ImageHover = global::Sunny.UI.Demo.Properties.Resources.HMF1; + this.btnHMF.Location = new System.Drawing.Point(230, 61); + this.btnHMF.Name = "btnHMF"; + this.btnHMF.Size = new System.Drawing.Size(160, 120); + this.btnHMF.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; + this.btnHMF.TabIndex = 2; + this.btnHMF.TabStop = false; + this.btnHMF.Text = null; + this.btnHMF.Click += new System.EventHandler(this.btnHMF_Click); + // + // btnHM + // + this.btnHM.Cursor = System.Windows.Forms.Cursors.Hand; + this.btnHM.Image = global::Sunny.UI.Demo.Properties.Resources.HM; + this.btnHM.ImageHover = global::Sunny.UI.Demo.Properties.Resources.HM1; + this.btnHM.Location = new System.Drawing.Point(30, 61); + this.btnHM.Name = "btnHM"; + this.btnHM.Size = new System.Drawing.Size(160, 120); + this.btnHM.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; + this.btnHM.TabIndex = 1; + this.btnHM.TabStop = false; + this.btnHM.Text = null; + this.btnHM.TextAlign = System.Drawing.ContentAlignment.BottomCenter; + this.btnHM.Click += new System.EventHandler(this.btnHM_Click); + // + // FFrames + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(892, 627); + this.Name = "FFrames"; + this.Style = Sunny.UI.UIStyle.Blue; + this.Text = "Frames"; + this.PagePanel.ResumeLayout(false); + this.PagePanel.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.btnAM)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.btnAHMF)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.btnHAMF)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.btnHAM)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.btnAHM)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.btnHMF)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.btnHM)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + private UIImageButton btnHM; + private UIImageButton btnAM; + private UIImageButton btnAHMF; + private UIImageButton btnHAMF; + private UIImageButton btnHAM; + private UIImageButton btnAHM; + private UIImageButton btnHMF; + private UILine uiLine1; + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Forms/FFrames.cs b/SunnyUI.Demo/Forms/FFrames.cs new file mode 100644 index 00000000..a4106f86 --- /dev/null +++ b/SunnyUI.Demo/Forms/FFrames.cs @@ -0,0 +1,54 @@ +using System.Windows.Forms; + +namespace Sunny.UI.Demo +{ + public partial class FFrames : UITitlePage + { + public FFrames() + { + InitializeComponent(); + } + + private void ShowFrame(UIMainFrame frame) + { + frame.WindowState = FormWindowState.Maximized; + frame.ShowDialog(); + frame.Dispose(); + } + + private void btnHM_Click(object sender, System.EventArgs e) + { + ShowFrame(new FHeaderMain()); + } + + private void btnHMF_Click(object sender, System.EventArgs e) + { + ShowFrame(new FHeaderMainFooter()); + } + + private void btnHAM_Click(object sender, System.EventArgs e) + { + ShowFrame(new FHeaderAsideMain()); + } + + private void btnHAMF_Click(object sender, System.EventArgs e) + { + ShowFrame(new FHeaderAsideMainFooter()); + } + + private void btnAM_Click(object sender, System.EventArgs e) + { + ShowFrame(new FAsideMain()); + } + + private void btnAHM_Click(object sender, System.EventArgs e) + { + ShowFrame(new FAsideHeaderMain()); + } + + private void btnAHMF_Click(object sender, System.EventArgs e) + { + ShowFrame(new FAsideHeaderMainFooter()); + } + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Forms/FFrames.resx b/SunnyUI.Demo/Forms/FFrames.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/SunnyUI.Demo/Forms/FFrames.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SunnyUI.Demo/Forms/Frames/FAsideHeaderMain.Designer.cs b/SunnyUI.Demo/Forms/Frames/FAsideHeaderMain.Designer.cs new file mode 100644 index 00000000..0eaef188 --- /dev/null +++ b/SunnyUI.Demo/Forms/Frames/FAsideHeaderMain.Designer.cs @@ -0,0 +1,66 @@ +namespace Sunny.UI.Demo +{ + partial class FAsideHeaderMain + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // Header + // + this.Header.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(76)))), ((int)(((byte)(76)))), ((int)(((byte)(76))))); + this.Header.ForeColor = System.Drawing.Color.White; + this.Header.Size = new System.Drawing.Size(774, 57); + this.Header.Style = Sunny.UI.UIStyle.Custom; + this.Header.StyleCustomMode = true; + // + // Aside + // + this.Aside.Size = new System.Drawing.Size(250, 685); + this.Aside.Style = Sunny.UI.UIStyle.Blue; + this.Aside.MenuItemClick += new Sunny.UI.UINavMenu.OnMenuItemClick(this.Aside_MenuItemClick); + // + // Main + // + this.Main.Size = new System.Drawing.Size(774, 628); + this.Main.Style = Sunny.UI.UIStyle.Blue; + // + // FAsideHeaderMain + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1024, 720); + this.Name = "FAsideHeaderMain"; + this.Style = Sunny.UI.UIStyle.Blue; + this.Text = "FAsideHeaderMain"; + this.ResumeLayout(false); + + } + + #endregion + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Forms/Frames/FAsideHeaderMain.cs b/SunnyUI.Demo/Forms/Frames/FAsideHeaderMain.cs new file mode 100644 index 00000000..5c258516 --- /dev/null +++ b/SunnyUI.Demo/Forms/Frames/FAsideHeaderMain.cs @@ -0,0 +1,31 @@ +namespace Sunny.UI.Demo +{ + public partial class FAsideHeaderMain : UIAsideHeaderMainFrame + { + public FAsideHeaderMain() + { + InitializeComponent(); + + //设置关联 + Aside.TabControl = Main; + + //增加页面到Main + AddPage(new FPage1(), 1001); + AddPage(new FPage2(), 1002); + AddPage(new FPage3(), 1003); + + //设置Header节点索引 + Aside.CreateNode("Page1", 1001); + Aside.CreateNode("Page2", 1002); + Aside.CreateNode("Page3", 1003); + + //显示默认界面 + Aside.SelectFirst(); + } + + private void Aside_MenuItemClick(System.Windows.Forms.TreeNode node, NavMenuItem item, int pageIndex) + { + Header.Text = "PageIndex: " + pageIndex; + } + } +} diff --git a/SunnyUI.Demo/Forms/Frames/FAsideHeaderMain.resx b/SunnyUI.Demo/Forms/Frames/FAsideHeaderMain.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/SunnyUI.Demo/Forms/Frames/FAsideHeaderMain.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SunnyUI.Demo/Forms/Frames/FAsideHeaderMainFooter.Designer.cs b/SunnyUI.Demo/Forms/Frames/FAsideHeaderMainFooter.Designer.cs new file mode 100644 index 00000000..e9ca9afa --- /dev/null +++ b/SunnyUI.Demo/Forms/Frames/FAsideHeaderMainFooter.Designer.cs @@ -0,0 +1,71 @@ +namespace Sunny.UI.Demo +{ + partial class FAsideHeaderMainFooter + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // Footer + // + this.Footer.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(173)))), ((int)(((byte)(178)))), ((int)(((byte)(181))))); + this.Footer.Location = new System.Drawing.Point(250, 664); + this.Footer.Size = new System.Drawing.Size(774, 56); + this.Footer.Style = Sunny.UI.UIStyle.Custom; + this.Footer.StyleCustomMode = true; + // + // Header + // + this.Header.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(76)))), ((int)(((byte)(76)))), ((int)(((byte)(76))))); + this.Header.ForeColor = System.Drawing.Color.White; + this.Header.Size = new System.Drawing.Size(774, 57); + this.Header.Style = Sunny.UI.UIStyle.Custom; + this.Header.StyleCustomMode = true; + // + // Aside + // + this.Aside.Size = new System.Drawing.Size(250, 685); + this.Aside.MenuItemClick += new Sunny.UI.UINavMenu.OnMenuItemClick(this.Aside_MenuItemClick); + // + // Main + // + this.Main.Size = new System.Drawing.Size(774, 572); + // + // FAsideHeaderMainFooter + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1024, 720); + this.Name = "FAsideHeaderMainFooter"; + this.Text = "FAsideHeaderMainFooter"; + this.ResumeLayout(false); + + } + + #endregion + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Forms/Frames/FAsideHeaderMainFooter.cs b/SunnyUI.Demo/Forms/Frames/FAsideHeaderMainFooter.cs new file mode 100644 index 00000000..02ab2a7f --- /dev/null +++ b/SunnyUI.Demo/Forms/Frames/FAsideHeaderMainFooter.cs @@ -0,0 +1,31 @@ +namespace Sunny.UI.Demo +{ + public partial class FAsideHeaderMainFooter : UIAsideHeaderMainFooterFrame + { + public FAsideHeaderMainFooter() + { + InitializeComponent(); + + //设置关联 + Aside.TabControl = Main; + + //增加页面到Main + AddPage(new FPage1(), 1001); + AddPage(new FPage2(), 1002); + AddPage(new FPage3(), 1003); + + //设置Header节点索引 + Aside.CreateNode("Page1", 1001); + Aside.CreateNode("Page2", 1002); + Aside.CreateNode("Page3", 1003); + + //显示默认界面 + Aside.SelectFirst(); + } + + private void Aside_MenuItemClick(System.Windows.Forms.TreeNode node, NavMenuItem item, int pageIndex) + { + Footer.Text = Header.Text = "PageIndex: " + pageIndex; + } + } +} diff --git a/SunnyUI.Demo/Forms/Frames/FAsideHeaderMainFooter.resx b/SunnyUI.Demo/Forms/Frames/FAsideHeaderMainFooter.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/SunnyUI.Demo/Forms/Frames/FAsideHeaderMainFooter.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SunnyUI.Demo/Forms/Frames/FAsideMain.Designer.cs b/SunnyUI.Demo/Forms/Frames/FAsideMain.Designer.cs new file mode 100644 index 00000000..ab4a3309 --- /dev/null +++ b/SunnyUI.Demo/Forms/Frames/FAsideMain.Designer.cs @@ -0,0 +1,58 @@ +namespace Sunny.UI.Demo +{ + partial class FAsideMain + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // Aside + // + this.Aside.LineColor = System.Drawing.Color.Black; + this.Aside.Size = new System.Drawing.Size(250, 685); + this.Aside.Style = Sunny.UI.UIStyle.Blue; + // + // Main + // + this.Main.Size = new System.Drawing.Size(774, 685); + this.Main.Style = Sunny.UI.UIStyle.Blue; + // + // FAsideMain + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1024, 720); + this.Name = "FAsideMain"; + this.Style = Sunny.UI.UIStyle.Blue; + this.Text = "FAsideMain"; + this.ResumeLayout(false); + + } + + #endregion + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Forms/Frames/FAsideMain.cs b/SunnyUI.Demo/Forms/Frames/FAsideMain.cs new file mode 100644 index 00000000..d4d1e496 --- /dev/null +++ b/SunnyUI.Demo/Forms/Frames/FAsideMain.cs @@ -0,0 +1,26 @@ +namespace Sunny.UI.Demo +{ + public partial class FAsideMain : UIAsideMainFrame + { + public FAsideMain() + { + InitializeComponent(); + + //设置关联 + Aside.TabControl = Main; + + //增加页面到Main + AddPage(new FTitlePage1(), 1001); + AddPage(new FTitlePage2(), 1002); + AddPage(new FTitlePage3(), 1003); + + //设置Header节点索引 + Aside.CreateNode("Page1", 1001); + Aside.CreateNode("Page2", 1002); + Aside.CreateNode("Page3", 1003); + + //显示默认界面 + Aside.SelectFirst(); + } + } +} diff --git a/SunnyUI.Demo/Forms/Frames/FAsideMain.resx b/SunnyUI.Demo/Forms/Frames/FAsideMain.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/SunnyUI.Demo/Forms/Frames/FAsideMain.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SunnyUI.Demo/Forms/Frames/FHeaderAsideMain.Designer.cs b/SunnyUI.Demo/Forms/Frames/FHeaderAsideMain.Designer.cs new file mode 100644 index 00000000..ab9e25e9 --- /dev/null +++ b/SunnyUI.Demo/Forms/Frames/FHeaderAsideMain.Designer.cs @@ -0,0 +1,81 @@ +namespace Sunny.UI.Demo +{ + partial class FHeaderAsideMain + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.uiLogo1 = new Sunny.UI.UILogo(); + this.Header.SuspendLayout(); + this.SuspendLayout(); + // + // Aside + // + this.Aside.LineColor = System.Drawing.Color.Black; + this.Aside.Size = new System.Drawing.Size(250, 575); + this.Aside.Style = Sunny.UI.UIStyle.Blue; + // + // Header + // + this.Header.Controls.Add(this.uiLogo1); + this.Header.Size = new System.Drawing.Size(1024, 110); + this.Header.Style = Sunny.UI.UIStyle.Blue; + // + // Main + // + this.Main.Size = new System.Drawing.Size(774, 575); + this.Main.Style = Sunny.UI.UIStyle.Blue; + // + // uiLogo1 + // + this.uiLogo1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLogo1.Location = new System.Drawing.Point(15, 15); + this.uiLogo1.MaximumSize = new System.Drawing.Size(300, 80); + this.uiLogo1.MinimumSize = new System.Drawing.Size(300, 80); + this.uiLogo1.Name = "uiLogo1"; + this.uiLogo1.Size = new System.Drawing.Size(300, 80); + this.uiLogo1.Style = Sunny.UI.UIStyle.Custom; + this.uiLogo1.TabIndex = 1; + this.uiLogo1.Text = "uiLogo1"; + // + // FHeaderAsideMain + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1024, 720); + this.Name = "FHeaderAsideMain"; + this.Style = Sunny.UI.UIStyle.Blue; + this.Text = "FHeaderAsideMain"; + this.Header.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private UILogo uiLogo1; + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Forms/Frames/FHeaderAsideMain.cs b/SunnyUI.Demo/Forms/Frames/FHeaderAsideMain.cs new file mode 100644 index 00000000..e0024758 --- /dev/null +++ b/SunnyUI.Demo/Forms/Frames/FHeaderAsideMain.cs @@ -0,0 +1,26 @@ +namespace Sunny.UI.Demo +{ + public partial class FHeaderAsideMain : UIHeaderAsideMainFrame + { + public FHeaderAsideMain() + { + InitializeComponent(); + + //设置关联 + Aside.TabControl = Main; + + //增加页面到Main + AddPage(new FTitlePage1(), 1001); + AddPage(new FTitlePage2(), 1002); + AddPage(new FTitlePage3(), 1003); + + //设置Header节点索引 + Aside.CreateNode("Page1", 1001); + Aside.CreateNode("Page2", 1002); + Aside.CreateNode("Page3", 1003); + + //显示默认界面 + Aside.SelectFirst(); + } + } +} diff --git a/SunnyUI.Demo/Forms/Frames/FHeaderAsideMain.resx b/SunnyUI.Demo/Forms/Frames/FHeaderAsideMain.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/SunnyUI.Demo/Forms/Frames/FHeaderAsideMain.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SunnyUI.Demo/Forms/Frames/FHeaderAsideMainFooter.Designer.cs b/SunnyUI.Demo/Forms/Frames/FHeaderAsideMainFooter.Designer.cs new file mode 100644 index 00000000..61f23f55 --- /dev/null +++ b/SunnyUI.Demo/Forms/Frames/FHeaderAsideMainFooter.Designer.cs @@ -0,0 +1,88 @@ +namespace Sunny.UI.Demo +{ + partial class FHeaderAsideMainFooter + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.uiLogo1 = new Sunny.UI.UILogo(); + this.Header.SuspendLayout(); + this.SuspendLayout(); + // + // Footer + // + this.Footer.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(173)))), ((int)(((byte)(178)))), ((int)(((byte)(181))))); + this.Footer.Location = new System.Drawing.Point(250, 664); + this.Footer.Size = new System.Drawing.Size(774, 56); + this.Footer.Style = Sunny.UI.UIStyle.Custom; + this.Footer.StyleCustomMode = true; + // + // Aside + // + this.Aside.Size = new System.Drawing.Size(250, 575); + this.Aside.Style = Sunny.UI.UIStyle.Blue; + this.Aside.MenuItemClick += new Sunny.UI.UINavMenu.OnMenuItemClick(this.Aside_MenuItemClick); + // + // Header + // + this.Header.Controls.Add(this.uiLogo1); + this.Header.Size = new System.Drawing.Size(1024, 110); + this.Header.Style = Sunny.UI.UIStyle.Blue; + // + // Main + // + this.Main.Size = new System.Drawing.Size(774, 519); + this.Main.Style = Sunny.UI.UIStyle.Blue; + // + // uiLogo1 + // + this.uiLogo1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLogo1.Location = new System.Drawing.Point(15, 15); + this.uiLogo1.MaximumSize = new System.Drawing.Size(300, 80); + this.uiLogo1.MinimumSize = new System.Drawing.Size(300, 80); + this.uiLogo1.Name = "uiLogo1"; + this.uiLogo1.Size = new System.Drawing.Size(300, 80); + this.uiLogo1.TabIndex = 2; + this.uiLogo1.Text = "uiLogo1"; + // + // FHeaderAsideMainFooter + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1024, 720); + this.Name = "FHeaderAsideMainFooter"; + this.Style = Sunny.UI.UIStyle.Blue; + this.Text = "FHeaderAsideMainFooter"; + this.Header.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private UILogo uiLogo1; + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Forms/Frames/FHeaderAsideMainFooter.cs b/SunnyUI.Demo/Forms/Frames/FHeaderAsideMainFooter.cs new file mode 100644 index 00000000..ccec642c --- /dev/null +++ b/SunnyUI.Demo/Forms/Frames/FHeaderAsideMainFooter.cs @@ -0,0 +1,31 @@ +namespace Sunny.UI.Demo +{ + public partial class FHeaderAsideMainFooter : UIHeaderAsideMainFooterFrame + { + public FHeaderAsideMainFooter() + { + InitializeComponent(); + + //设置关联 + Aside.TabControl = Main; + + //增加页面到Main + AddPage(new FTitlePage1(), 1001); + AddPage(new FTitlePage2(), 1002); + AddPage(new FTitlePage3(), 1003); + + //设置Header节点索引 + Aside.CreateNode("Page1", 1001); + Aside.CreateNode("Page2", 1002); + Aside.CreateNode("Page3", 1003); + + //显示默认界面 + Aside.SelectFirst(); + } + + private void Aside_MenuItemClick(System.Windows.Forms.TreeNode node, NavMenuItem item, int pageIndex) + { + Footer.Text = "PageIndex: " + pageIndex; + } + } +} diff --git a/SunnyUI.Demo/Forms/Frames/FHeaderAsideMainFooter.resx b/SunnyUI.Demo/Forms/Frames/FHeaderAsideMainFooter.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/SunnyUI.Demo/Forms/Frames/FHeaderAsideMainFooter.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SunnyUI.Demo/Forms/Frames/FHeaderMain.Designer.cs b/SunnyUI.Demo/Forms/Frames/FHeaderMain.Designer.cs new file mode 100644 index 00000000..434bb2fb --- /dev/null +++ b/SunnyUI.Demo/Forms/Frames/FHeaderMain.Designer.cs @@ -0,0 +1,87 @@ +namespace Sunny.UI.Demo +{ + partial class FHeaderMain + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.Windows.Forms.TreeNode treeNode1 = new System.Windows.Forms.TreeNode("Page1"); + System.Windows.Forms.TreeNode treeNode2 = new System.Windows.Forms.TreeNode("Page2"); + System.Windows.Forms.TreeNode treeNode3 = new System.Windows.Forms.TreeNode("Page3"); + this.uiLogo1 = new Sunny.UI.UILogo(); + this.Header.SuspendLayout(); + this.SuspendLayout(); + // + // Header + // + this.Header.Controls.Add(this.uiLogo1); + this.Header.Location = new System.Drawing.Point(0, 35); + treeNode1.Name = "节点0"; + treeNode1.Text = "Page1"; + treeNode2.Name = "节点1"; + treeNode2.Text = "Page2"; + treeNode3.Name = "节点2"; + treeNode3.Text = "Page3"; + this.Header.Nodes.AddRange(new System.Windows.Forms.TreeNode[] { + treeNode1, + treeNode2, + treeNode3}); + this.Header.Size = new System.Drawing.Size(1024, 110); + this.Header.TabControl = this.Main; + // + // Main + // + this.Main.Size = new System.Drawing.Size(1024, 575); + // + // uiLogo1 + // + this.uiLogo1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLogo1.Location = new System.Drawing.Point(15, 15); + this.uiLogo1.MaximumSize = new System.Drawing.Size(300, 80); + this.uiLogo1.MinimumSize = new System.Drawing.Size(300, 80); + this.uiLogo1.Name = "uiLogo1"; + this.uiLogo1.Size = new System.Drawing.Size(300, 80); + this.uiLogo1.Style = Sunny.UI.UIStyle.Custom; + this.uiLogo1.TabIndex = 0; + this.uiLogo1.Text = "uiLogo1"; + // + // FHeaderMain + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1024, 720); + this.Name = "FHeaderMain"; + this.Text = "FHeaderMain"; + this.Header.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private UILogo uiLogo1; + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Forms/Frames/FHeaderMain.cs b/SunnyUI.Demo/Forms/Frames/FHeaderMain.cs new file mode 100644 index 00000000..927e4a2f --- /dev/null +++ b/SunnyUI.Demo/Forms/Frames/FHeaderMain.cs @@ -0,0 +1,26 @@ +namespace Sunny.UI.Demo +{ + public partial class FHeaderMain : UIHeaderMainFrame + { + public FHeaderMain() + { + InitializeComponent(); + + //设置关联 + Header.TabControl = Main; + + //增加页面到Main + AddPage(new FTitlePage1(), 1001); + AddPage(new FTitlePage2(), 1002); + AddPage(new FTitlePage3(), 1003); + + //设置Header节点索引 + Header.SetNodePageIndex(Header.Nodes[0], 1001); + Header.SetNodePageIndex(Header.Nodes[1], 1002); + Header.SetNodePageIndex(Header.Nodes[2], 1003); + + //显示默认界面 + Header.SelectedIndex = 0; + } + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Forms/Frames/FHeaderMain.resx b/SunnyUI.Demo/Forms/Frames/FHeaderMain.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/SunnyUI.Demo/Forms/Frames/FHeaderMain.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SunnyUI.Demo/Forms/Frames/FHeaderMainFooter.Designer.cs b/SunnyUI.Demo/Forms/Frames/FHeaderMainFooter.Designer.cs new file mode 100644 index 00000000..e59c6989 --- /dev/null +++ b/SunnyUI.Demo/Forms/Frames/FHeaderMainFooter.Designer.cs @@ -0,0 +1,85 @@ +namespace Sunny.UI.Demo +{ + partial class FHeaderMainFooter + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.uiLogo1 = new Sunny.UI.UILogo(); + this.Header.SuspendLayout(); + this.SuspendLayout(); + // + // Footer + // + this.Footer.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(173)))), ((int)(((byte)(178)))), ((int)(((byte)(181))))); + this.Footer.Location = new System.Drawing.Point(0, 664); + this.Footer.Size = new System.Drawing.Size(1024, 56); + this.Footer.Style = Sunny.UI.UIStyle.Custom; + this.Footer.StyleCustomMode = true; + this.Footer.Text = ""; + // + // Header + // + this.Header.Controls.Add(this.uiLogo1); + this.Header.Size = new System.Drawing.Size(1024, 110); + this.Header.Style = Sunny.UI.UIStyle.Blue; + this.Header.MenuItemClick += new Sunny.UI.UINavBar.OnMenuItemClick(this.Header_MenuItemClick); + // + // Main + // + this.Main.Size = new System.Drawing.Size(1024, 519); + this.Main.Style = Sunny.UI.UIStyle.Blue; + // + // uiLogo1 + // + this.uiLogo1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.uiLogo1.Location = new System.Drawing.Point(15, 15); + this.uiLogo1.MaximumSize = new System.Drawing.Size(300, 80); + this.uiLogo1.MinimumSize = new System.Drawing.Size(300, 80); + this.uiLogo1.Name = "uiLogo1"; + this.uiLogo1.Size = new System.Drawing.Size(300, 80); + this.uiLogo1.Style = Sunny.UI.UIStyle.Custom; + this.uiLogo1.TabIndex = 1; + this.uiLogo1.Text = "uiLogo1"; + // + // FHeaderMainFooter + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1024, 720); + this.Name = "FHeaderMainFooter"; + this.Style = Sunny.UI.UIStyle.Blue; + this.Text = "FHeaderMainFooter"; + this.Header.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private UILogo uiLogo1; + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Forms/Frames/FHeaderMainFooter.cs b/SunnyUI.Demo/Forms/Frames/FHeaderMainFooter.cs new file mode 100644 index 00000000..4e66a855 --- /dev/null +++ b/SunnyUI.Demo/Forms/Frames/FHeaderMainFooter.cs @@ -0,0 +1,31 @@ +namespace Sunny.UI.Demo +{ + public partial class FHeaderMainFooter : UIHeaderMainFooterFrame + { + public FHeaderMainFooter() + { + InitializeComponent(); + + //设置关联 + Header.TabControl = Main; + + //增加页面到Main + AddPage(new FTitlePage1(), 1001); + AddPage(new FTitlePage2(), 1002); + AddPage(new FTitlePage3(), 1003); + + //设置Header节点索引 + Header.CreateNode("Page1", 1001); + Header.CreateNode("Page2", 1002); + Header.CreateNode("Page3", 1003); + + //显示默认界面 + Header.SelectedIndex = 0; + } + + private void Header_MenuItemClick(string text, int menuIndex, int pageIndex) + { + Footer.Text = "PageIndex: " + pageIndex; + } + } +} diff --git a/SunnyUI.Demo/Forms/Frames/FHeaderMainFooter.resx b/SunnyUI.Demo/Forms/Frames/FHeaderMainFooter.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/SunnyUI.Demo/Forms/Frames/FHeaderMainFooter.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SunnyUI.Demo/Forms/Pages/FPage1.Designer.cs b/SunnyUI.Demo/Forms/Pages/FPage1.Designer.cs new file mode 100644 index 00000000..71b009b3 --- /dev/null +++ b/SunnyUI.Demo/Forms/Pages/FPage1.Designer.cs @@ -0,0 +1,67 @@ +namespace Sunny.UI.Demo +{ + partial class FPage1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.uiSymbolLabel1 = new Sunny.UI.UISymbolLabel(); + this.SuspendLayout(); + // + // uiSymbolLabel1 + // + this.uiSymbolLabel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.uiSymbolLabel1.Font = new System.Drawing.Font("微软雅黑", 21.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.uiSymbolLabel1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255))))); + this.uiSymbolLabel1.Location = new System.Drawing.Point(0, 0); + this.uiSymbolLabel1.Name = "uiSymbolLabel1"; + this.uiSymbolLabel1.Padding = new System.Windows.Forms.Padding(68, 0, 0, 0); + this.uiSymbolLabel1.Size = new System.Drawing.Size(800, 450); + this.uiSymbolLabel1.Style = Sunny.UI.UIStyle.Custom; + this.uiSymbolLabel1.StyleCustomMode = true; + this.uiSymbolLabel1.Symbol = 61530; + this.uiSymbolLabel1.SymbolColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255))))); + this.uiSymbolLabel1.SymbolSize = 64; + this.uiSymbolLabel1.TabIndex = 0; + this.uiSymbolLabel1.Text = "This is Page1"; + // + // FPage1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 450); + this.Controls.Add(this.uiSymbolLabel1); + this.Name = "FPage1"; + this.Text = "FPage1"; + this.ResumeLayout(false); + + } + + #endregion + + private UISymbolLabel uiSymbolLabel1; + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Forms/Pages/FPage1.cs b/SunnyUI.Demo/Forms/Pages/FPage1.cs new file mode 100644 index 00000000..3ba5432d --- /dev/null +++ b/SunnyUI.Demo/Forms/Pages/FPage1.cs @@ -0,0 +1,10 @@ +namespace Sunny.UI.Demo +{ + public partial class FPage1 : UIPage + { + public FPage1() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Forms/Pages/FPage1.resx b/SunnyUI.Demo/Forms/Pages/FPage1.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/SunnyUI.Demo/Forms/Pages/FPage1.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SunnyUI.Demo/Forms/Pages/FPage2.Designer.cs b/SunnyUI.Demo/Forms/Pages/FPage2.Designer.cs new file mode 100644 index 00000000..3a66d1ba --- /dev/null +++ b/SunnyUI.Demo/Forms/Pages/FPage2.Designer.cs @@ -0,0 +1,67 @@ +namespace Sunny.UI.Demo +{ + partial class FPage2 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.uiSymbolLabel1 = new Sunny.UI.UISymbolLabel(); + this.SuspendLayout(); + // + // uiSymbolLabel1 + // + this.uiSymbolLabel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.uiSymbolLabel1.Font = new System.Drawing.Font("微软雅黑", 21.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.uiSymbolLabel1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(110)))), ((int)(((byte)(190)))), ((int)(((byte)(40))))); + this.uiSymbolLabel1.Location = new System.Drawing.Point(0, 0); + this.uiSymbolLabel1.Name = "uiSymbolLabel1"; + this.uiSymbolLabel1.Padding = new System.Windows.Forms.Padding(68, 0, 0, 0); + this.uiSymbolLabel1.Size = new System.Drawing.Size(800, 450); + this.uiSymbolLabel1.Style = Sunny.UI.UIStyle.Custom; + this.uiSymbolLabel1.StyleCustomMode = true; + this.uiSymbolLabel1.Symbol = 61528; + this.uiSymbolLabel1.SymbolColor = System.Drawing.Color.FromArgb(((int)(((byte)(110)))), ((int)(((byte)(190)))), ((int)(((byte)(40))))); + this.uiSymbolLabel1.SymbolSize = 64; + this.uiSymbolLabel1.TabIndex = 1; + this.uiSymbolLabel1.Text = "This is Page2"; + // + // FPage2 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 450); + this.Controls.Add(this.uiSymbolLabel1); + this.Name = "FPage2"; + this.Text = "FPage2"; + this.ResumeLayout(false); + + } + + #endregion + + private UISymbolLabel uiSymbolLabel1; + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Forms/Pages/FPage2.cs b/SunnyUI.Demo/Forms/Pages/FPage2.cs new file mode 100644 index 00000000..0934075c --- /dev/null +++ b/SunnyUI.Demo/Forms/Pages/FPage2.cs @@ -0,0 +1,10 @@ +namespace Sunny.UI.Demo +{ + public partial class FPage2 : UIPage + { + public FPage2() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Forms/Pages/FPage2.resx b/SunnyUI.Demo/Forms/Pages/FPage2.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/SunnyUI.Demo/Forms/Pages/FPage2.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SunnyUI.Demo/Forms/Pages/FPage3.Designer.cs b/SunnyUI.Demo/Forms/Pages/FPage3.Designer.cs new file mode 100644 index 00000000..eeef82a7 --- /dev/null +++ b/SunnyUI.Demo/Forms/Pages/FPage3.Designer.cs @@ -0,0 +1,67 @@ +namespace Sunny.UI.Demo +{ + partial class FPage3 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.uiSymbolLabel1 = new Sunny.UI.UISymbolLabel(); + this.SuspendLayout(); + // + // uiSymbolLabel1 + // + this.uiSymbolLabel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.uiSymbolLabel1.Font = new System.Drawing.Font("微软雅黑", 21.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.uiSymbolLabel1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(155)))), ((int)(((byte)(40))))); + this.uiSymbolLabel1.Location = new System.Drawing.Point(0, 0); + this.uiSymbolLabel1.Name = "uiSymbolLabel1"; + this.uiSymbolLabel1.Padding = new System.Windows.Forms.Padding(68, 0, 0, 0); + this.uiSymbolLabel1.Size = new System.Drawing.Size(800, 450); + this.uiSymbolLabel1.Style = Sunny.UI.UIStyle.Custom; + this.uiSymbolLabel1.StyleCustomMode = true; + this.uiSymbolLabel1.Symbol = 61553; + this.uiSymbolLabel1.SymbolColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(155)))), ((int)(((byte)(40))))); + this.uiSymbolLabel1.SymbolSize = 64; + this.uiSymbolLabel1.TabIndex = 2; + this.uiSymbolLabel1.Text = "This is Page3"; + // + // FPage3 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 450); + this.Controls.Add(this.uiSymbolLabel1); + this.Name = "FPage3"; + this.Text = "FPage3"; + this.ResumeLayout(false); + + } + + #endregion + + private UISymbolLabel uiSymbolLabel1; + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Forms/Pages/FPage3.cs b/SunnyUI.Demo/Forms/Pages/FPage3.cs new file mode 100644 index 00000000..37850407 --- /dev/null +++ b/SunnyUI.Demo/Forms/Pages/FPage3.cs @@ -0,0 +1,10 @@ +namespace Sunny.UI.Demo +{ + public partial class FPage3 : UIPage + { + public FPage3() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Forms/Pages/FPage3.resx b/SunnyUI.Demo/Forms/Pages/FPage3.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/SunnyUI.Demo/Forms/Pages/FPage3.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SunnyUI.Demo/Forms/Pages/FTitlePage1.Designer.cs b/SunnyUI.Demo/Forms/Pages/FTitlePage1.Designer.cs new file mode 100644 index 00000000..c4aa8dc0 --- /dev/null +++ b/SunnyUI.Demo/Forms/Pages/FTitlePage1.Designer.cs @@ -0,0 +1,72 @@ +namespace Sunny.UI.Demo +{ + partial class FTitlePage1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.uiSymbolLabel1 = new Sunny.UI.UISymbolLabel(); + this.PagePanel.SuspendLayout(); + this.SuspendLayout(); + // + // PagePanel + // + this.PagePanel.Controls.Add(this.uiSymbolLabel1); + // + // uiSymbolLabel1 + // + this.uiSymbolLabel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.uiSymbolLabel1.Font = new System.Drawing.Font("微软雅黑", 21.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.uiSymbolLabel1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255))))); + this.uiSymbolLabel1.Location = new System.Drawing.Point(0, 0); + this.uiSymbolLabel1.Name = "uiSymbolLabel1"; + this.uiSymbolLabel1.Padding = new System.Windows.Forms.Padding(68, 0, 0, 0); + this.uiSymbolLabel1.Size = new System.Drawing.Size(800, 415); + this.uiSymbolLabel1.Style = Sunny.UI.UIStyle.Custom; + this.uiSymbolLabel1.StyleCustomMode = true; + this.uiSymbolLabel1.Symbol = 61530; + this.uiSymbolLabel1.SymbolColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255))))); + this.uiSymbolLabel1.SymbolSize = 64; + this.uiSymbolLabel1.TabIndex = 1; + this.uiSymbolLabel1.Text = "This is TitlePage1"; + // + // FTitlePage1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 450); + this.Name = "FTitlePage1"; + this.Text = "FTitlePage1"; + this.PagePanel.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private UISymbolLabel uiSymbolLabel1; + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Forms/Pages/FTitlePage1.cs b/SunnyUI.Demo/Forms/Pages/FTitlePage1.cs new file mode 100644 index 00000000..fe23f9ce --- /dev/null +++ b/SunnyUI.Demo/Forms/Pages/FTitlePage1.cs @@ -0,0 +1,10 @@ +namespace Sunny.UI.Demo +{ + public partial class FTitlePage1 : UITitlePage + { + public FTitlePage1() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Forms/Pages/FTitlePage1.resx b/SunnyUI.Demo/Forms/Pages/FTitlePage1.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/SunnyUI.Demo/Forms/Pages/FTitlePage1.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SunnyUI.Demo/Forms/Pages/FTitlePage2.Designer.cs b/SunnyUI.Demo/Forms/Pages/FTitlePage2.Designer.cs new file mode 100644 index 00000000..07116113 --- /dev/null +++ b/SunnyUI.Demo/Forms/Pages/FTitlePage2.Designer.cs @@ -0,0 +1,72 @@ +namespace Sunny.UI.Demo +{ + partial class FTitlePage2 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.uiSymbolLabel1 = new Sunny.UI.UISymbolLabel(); + this.PagePanel.SuspendLayout(); + this.SuspendLayout(); + // + // PagePanel + // + this.PagePanel.Controls.Add(this.uiSymbolLabel1); + // + // uiSymbolLabel1 + // + this.uiSymbolLabel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.uiSymbolLabel1.Font = new System.Drawing.Font("微软雅黑", 21.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.uiSymbolLabel1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(110)))), ((int)(((byte)(190)))), ((int)(((byte)(40))))); + this.uiSymbolLabel1.Location = new System.Drawing.Point(0, 0); + this.uiSymbolLabel1.Name = "uiSymbolLabel1"; + this.uiSymbolLabel1.Padding = new System.Windows.Forms.Padding(68, 0, 0, 0); + this.uiSymbolLabel1.Size = new System.Drawing.Size(800, 415); + this.uiSymbolLabel1.Style = Sunny.UI.UIStyle.Custom; + this.uiSymbolLabel1.StyleCustomMode = true; + this.uiSymbolLabel1.Symbol = 61528; + this.uiSymbolLabel1.SymbolColor = System.Drawing.Color.FromArgb(((int)(((byte)(110)))), ((int)(((byte)(190)))), ((int)(((byte)(40))))); + this.uiSymbolLabel1.SymbolSize = 64; + this.uiSymbolLabel1.TabIndex = 2; + this.uiSymbolLabel1.Text = "This is TitlePage2"; + // + // FTitlePage2 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 450); + this.Name = "FTitlePage2"; + this.Text = "FTitlePage2"; + this.PagePanel.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private UISymbolLabel uiSymbolLabel1; + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Forms/Pages/FTitlePage2.cs b/SunnyUI.Demo/Forms/Pages/FTitlePage2.cs new file mode 100644 index 00000000..1d3a0d13 --- /dev/null +++ b/SunnyUI.Demo/Forms/Pages/FTitlePage2.cs @@ -0,0 +1,10 @@ +namespace Sunny.UI.Demo +{ + public partial class FTitlePage2 : UITitlePage + { + public FTitlePage2() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Forms/Pages/FTitlePage2.resx b/SunnyUI.Demo/Forms/Pages/FTitlePage2.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/SunnyUI.Demo/Forms/Pages/FTitlePage2.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SunnyUI.Demo/Forms/Pages/FTitlePage3.Designer.cs b/SunnyUI.Demo/Forms/Pages/FTitlePage3.Designer.cs new file mode 100644 index 00000000..78e09e33 --- /dev/null +++ b/SunnyUI.Demo/Forms/Pages/FTitlePage3.Designer.cs @@ -0,0 +1,72 @@ +namespace Sunny.UI.Demo +{ + partial class FTitlePage3 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.uiSymbolLabel1 = new Sunny.UI.UISymbolLabel(); + this.PagePanel.SuspendLayout(); + this.SuspendLayout(); + // + // PagePanel + // + this.PagePanel.Controls.Add(this.uiSymbolLabel1); + // + // uiSymbolLabel1 + // + this.uiSymbolLabel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.uiSymbolLabel1.Font = new System.Drawing.Font("微软雅黑", 21.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.uiSymbolLabel1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(155)))), ((int)(((byte)(40))))); + this.uiSymbolLabel1.Location = new System.Drawing.Point(0, 0); + this.uiSymbolLabel1.Name = "uiSymbolLabel1"; + this.uiSymbolLabel1.Padding = new System.Windows.Forms.Padding(68, 0, 0, 0); + this.uiSymbolLabel1.Size = new System.Drawing.Size(800, 415); + this.uiSymbolLabel1.Style = Sunny.UI.UIStyle.Custom; + this.uiSymbolLabel1.StyleCustomMode = true; + this.uiSymbolLabel1.Symbol = 61553; + this.uiSymbolLabel1.SymbolColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(155)))), ((int)(((byte)(40))))); + this.uiSymbolLabel1.SymbolSize = 64; + this.uiSymbolLabel1.TabIndex = 3; + this.uiSymbolLabel1.Text = "This is TitlePage3"; + // + // FTitlePage3 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 450); + this.Name = "FTitlePage3"; + this.Text = "FTitlePage3"; + this.PagePanel.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private UISymbolLabel uiSymbolLabel1; + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Forms/Pages/FTitlePage3.cs b/SunnyUI.Demo/Forms/Pages/FTitlePage3.cs new file mode 100644 index 00000000..84bb26da --- /dev/null +++ b/SunnyUI.Demo/Forms/Pages/FTitlePage3.cs @@ -0,0 +1,10 @@ +namespace Sunny.UI.Demo +{ + public partial class FTitlePage3 : UITitlePage + { + public FTitlePage3() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Forms/Pages/FTitlePage3.resx b/SunnyUI.Demo/Forms/Pages/FTitlePage3.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/SunnyUI.Demo/Forms/Pages/FTitlePage3.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SunnyUI.Demo/Program.cs b/SunnyUI.Demo/Program.cs new file mode 100644 index 00000000..5b2bc4e0 --- /dev/null +++ b/SunnyUI.Demo/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Windows.Forms; + +namespace Sunny.UI.Demo +{ + internal static class Program + { + /// + /// 应用程序的主入口点。 + /// + [STAThread] + private static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new FMain()); + } + } +} \ No newline at end of file diff --git a/SunnyUI.Demo/Properties/AssemblyInfo.cs b/SunnyUI.Demo/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..054225ee --- /dev/null +++ b/SunnyUI.Demo/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("Sunny.UI.Demo")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Sunny.UI.Demo")] +[assembly: AssemblyCopyright("Copyright © 2019")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("17f96b36-7cae-4692-8b1f-b802482ecd09")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] \ No newline at end of file diff --git a/SunnyUI.Demo/Properties/Resources.Designer.cs b/SunnyUI.Demo/Properties/Resources.Designer.cs new file mode 100644 index 00000000..5a5d4a89 --- /dev/null +++ b/SunnyUI.Demo/Properties/Resources.Designer.cs @@ -0,0 +1,283 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace Sunny.UI.Demo.Properties { + using System; + + + /// + /// 一个强类型的资源类,用于查找本地化的字符串等。 + /// + // 此类是由 StronglyTypedResourceBuilder + // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 + // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen + // (以 /str 作为命令选项),或重新生成 VS 项目。 + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// 返回此类使用的缓存的 ResourceManager 实例。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Sunny.UI.Demo.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 重写当前线程的 CurrentUICulture 属性 + /// 重写当前线程的 CurrentUICulture 属性。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap AHM { + get { + object obj = ResourceManager.GetObject("AHM", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap AHM1 { + get { + object obj = ResourceManager.GetObject("AHM1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap AHMF { + get { + object obj = ResourceManager.GetObject("AHMF", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap AHMF1 { + get { + object obj = ResourceManager.GetObject("AHMF1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap AM { + get { + object obj = ResourceManager.GetObject("AM", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap AM1 { + get { + object obj = ResourceManager.GetObject("AM1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap dashboard { + get { + object obj = ResourceManager.GetObject("dashboard", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap dashboard0 { + get { + object obj = ResourceManager.GetObject("dashboard0", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap HAM { + get { + object obj = ResourceManager.GetObject("HAM", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap HAM1 { + get { + object obj = ResourceManager.GetObject("HAM1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap HAMF { + get { + object obj = ResourceManager.GetObject("HAMF", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap HAMF1 { + get { + object obj = ResourceManager.GetObject("HAMF1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap HM { + get { + object obj = ResourceManager.GetObject("HM", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap HM1 { + get { + object obj = ResourceManager.GetObject("HM1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap HMF { + get { + object obj = ResourceManager.GetObject("HMF", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap HMF1 { + get { + object obj = ResourceManager.GetObject("HMF1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap relationship { + get { + object obj = ResourceManager.GetObject("relationship", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap relationship0 { + get { + object obj = ResourceManager.GetObject("relationship0", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap save { + get { + object obj = ResourceManager.GetObject("save", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap save0 { + get { + object obj = ResourceManager.GetObject("save0", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap SunnyUI { + get { + object obj = ResourceManager.GetObject("SunnyUI", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap SunnyUISmall { + get { + object obj = ResourceManager.GetObject("SunnyUISmall", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/SunnyUI.Demo/Properties/Resources.resx b/SunnyUI.Demo/Properties/Resources.resx new file mode 100644 index 00000000..c8be9658 --- /dev/null +++ b/SunnyUI.Demo/Properties/Resources.resx @@ -0,0 +1,187 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\AHM.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\AHM1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\AHMF.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\AHMF1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\AM.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\AM1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\dashboard.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\dashboard0.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\HAM.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\HAM1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\HAMF.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\HAMF1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\HM.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\HM1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\HMF.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\HMF1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\relationship.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\relationship0.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\save.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\save0.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\SunnyUI.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\SunnyUISmall.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/SunnyUI.Demo/Properties/Settings.Designer.cs b/SunnyUI.Demo/Properties/Settings.Designer.cs new file mode 100644 index 00000000..dc98ff7c --- /dev/null +++ b/SunnyUI.Demo/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace Sunny.UI.Demo.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.5.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/SunnyUI.Demo/Properties/Settings.settings b/SunnyUI.Demo/Properties/Settings.settings new file mode 100644 index 00000000..292b6157 --- /dev/null +++ b/SunnyUI.Demo/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/SunnyUI.Demo/Resources/AHM.png b/SunnyUI.Demo/Resources/AHM.png new file mode 100644 index 0000000000000000000000000000000000000000..b1f6cd7edf1bfef30fffa5283ec74926874d3407 GIT binary patch literal 2055 zcmbuAXHXM}7KO8biqbIx(m|9aT>$|Dp(9D?!2m&2NGJ&%>C$Udnh`;|A|(`oP(lYO zA{eAfi*#57jIan8+OqS0z4vy1ym>R*V6vKz22;x3!Ks3>&MBYqro&z0d83IkaYSBv}?d7yO<4`smkB>nl zg;js@^5Gw()nHf^(QcOhxJSl(awd$tV8AXhzPCN_f%p}q&&`ZO!M<%dz!U-8JLz^!q@-lZ#Qeowoodrgl$T6dHE zu7vZDZ@2D!VB15^qv*ml+q+v&W=bY=kfwogR&s)N9qr)1 zaL-dX@LO>Wazf+lsz8a!OJ%dSmRvTPHj5fwl~O~%Q#qOXG`Y<%d)p{+(;r&J<(;(O zcV-r3NZsqHpVZc4r{M19OTZzr4CyjQ4|R8RCxOy=q_(J09&oba@|G?%Zq#J!#-+lh z1^FSyniBCELAfo(3oCLfMud++%gB{LiMqL|%+@abmq+}R?sy3=@ts2Us67^T}k z>#%1i)L>S|1riT0Y1=6H8R4ujmKJy+&PvrrIi>dOt3-xA$FgN7`GRwuUS8&3r(_lM z*3KSwkHv4ACxvFPCdQS-0)ZO?(_rutByGLJz^p_)=hW1S7d0Fv7A!I|O;-=c z5h(aCz<%B2s-cUCSj9iI{jV$7U#OHqFa-+k7t9HzQETV|l|dCeF&r%XK<59IEHJ~X zJ48u>^14U0H+zr?7KX6GJisfdBzc518nIW-Av|@keul-(l+VJUnatZKU9ab)doFHI zJT>O7vu~K`Z`9ySP7V#Ae#(U zBeius)ZN2aD}YQYjC&1B%2155e;sR2gN-H~PJzw0qqzXkO3>yE3>tn31o8KwFU(Oku98vNNw*l59I#idct3;Ixsq zkXzExmVD(*L&Hwj@)zmeJV14Fj(dm8hH|Ep+#4-pDs6>4j+!}f$EH@r*N`$0|M`}2%*uRmi(Uy6y>hJc4fXRFw-1S;1}ryF+0Segf4;4LPm;dIrV(aF*VAu=uDl%(GkMp7 zN6id9OHRpe*YngNRUlP0Ys?)Ry%kb+jd87Ajjl2)aK-ys#QZ4^B|GbOn2AafRl=?2 z@%Af7i?2utxmF+tdNts~Hi-VrNP3&DhNe0PNc|b{+s-v9$>C=G#P7&2Bi=L3yM>oq zZFLeAyMwC-Y#KjLGKQMMspHXE`*41n!t$pBsB^Mi!E^Vxwa=b3vV$aeRR4{aX6Y)L zUMa3ea+I=1TD%|Iy6&*~3ekLz)dTh6znCQ^ShbyUi)wunf9 z+G>l>=?i`F5C_OLRzHIvL%HnJ8XaR!P6U1VNP`ngMgTT{s z$RI*oTTbrN*0sHuQ(K7fZ^agaJ75ewT_(58u_v%(dy$LHHl)t&cM z9|aN&K>kfwi_8l*S6342m*4!j#FtBq31$LrK<28Kjc7-8F?UN%Ajp-CbX^oC-VwT- zB{m$=g0muf_NjvsIBm@`lR6v7eBX2FJ)$Ddao)0~To0$3=kui>=jD2yz=553v9Vs{2HZ&8KC0a* zuKi;sMcxX+zFq_NcPg+y&M|JQjEtlR3)b#b^h!%_qSm^%3$vqiiAmv+6b@C}LgCYO zL@~>x(U-?Gt&lB?i>n75PpQ9$Gq=8`|F3fXqpSZfKE8O5da^$62^R_9FUozw({u1C z-RBGKt3xQGaAvT5g3zE(DBHf$r=vn^1wwv)&O|P7eov0ENdB8KkGkjS^9C5{!E`IM H9U}h(2%pEN literal 0 HcmV?d00001 diff --git a/SunnyUI.Demo/Resources/AHM1.png b/SunnyUI.Demo/Resources/AHM1.png new file mode 100644 index 0000000000000000000000000000000000000000..9f23b541660ec1b9b85280fe655b0d9f325bcb28 GIT binary patch literal 2060 zcmb7_dpHvcAIImGTSP8%Q0{73I*BegoH3U%EDReba%YTESq!ghgj{x9N@AM(-CR?I zw1aF>scafvx8V%KFuWc8`99D4{?YS%zQ6DDeV*U%-|sICVQ(cNrYHsg03=}6P{$)L zJrYiY|7h}FW3L_=UxcHT8K8lx%sL8!0T4R~0MMKzesELhD2s+$qapwR$$=l@ql8uY z0sz897!=}+yYY8%G@Rh7@WA2Lhc4Uv`#K##;A4V*st7@g8ublyhR@LWlNo()`N8CB zabKAL7jv(^p<}w~xS}*I?UT>9CC$@SgNbIo>PaI{lN}Mj0o@l@yEkK)tjzYnia{RF zWY3!#O`SQ|+&Z9w%%r!siykP^tvs&jm;G&<@cT?y+VV_v`e{LnH1;21vGXmH3N4-A zivgE+J<^P~*g3m~E~?*wy`~wtOeM<{8uxy^f7Z?6{TtrE`z{L1t=dh8s6&rOwDpFB z-fxNnFQk7rR=AA+a=2+yXZEjzg!sh&#pbvuR>#&g&!9PBj5K8bxwUB))a71Wd#<5# zq-OC1+iSY?2f+7*hlUt~80W9TlWr=>wzntN6gc|aKe$dF=RZYOUyX6ND|1-DHLZQ# zcj_!o_2UFJ2H_C(G!y&^yesz z@qF!NP<0G8TQBnI;oEO9R?N_w8R;%W&zM0@Lg3hyY!vZccle(;b&N#2>;^C$H8S7@ zJpt9Uk>yPA)%y_1Uyq2EC;zy_pJFRQn^`vmb(Do`c1a`@!imT|Ew%y7Em zOHyMSkzg=&-k|kp$C5^X!3IoLGCN>C-M^rq?aECSTT7{+_~QBU5bD%&F1e%5JP~Yg zr*t|VZZm2p`LcB3ggvs|L_e`tE13i$75B&21V3y^UuwSfOV`jG;-YC>B}mI$_ofCr zUl9#ms3*+~xYu#`*D3xbY9qlu;lcvKLjMWU!><( zZq{SdwW+u=s~$xUqOVL(VzK;JD4>oYZ?YP_K;!hAOfTIMKWT40>=XF-joU3bcO!&1 z1GM5%6mDKHx8~o`t0Xk>UZgXXiKv-bu*Q&MTVklkPYpNZ%x{|C4=OfV58)c?3hn%< zQn3dlXZtG+0Edo?DLE zV!oCygWpg6^!hVOo)>|A+emavW^T{&-Er-_Hn9CQX8kf8_;sYzz2sfiBQLq+6l2Wx z!2}jd^wfcF*$ld(BWyqW&?4tp;cA^bHSJR&6AKq*^nFGbK3Jg?BX+7|k};Zj?yT&? zu6@l^sCd#+yNL?@m8_J*G`O>}xxygOBJI^NMY5#p`DQ$s=k}k6+3`CU91!8)OfY+Bu%XaV(1|NWrx)s9s(ftUvuk&<*)!lx9-lj%-t zEdIMi^91G_PI&|j*|W{5V`deAX_pYc#_Zef?vn+iH_}LL&d)1z%Oo&KOW$r?`i(Xi z?fGP;Tb87mUP1^(jAv3Um&EFv^!*CBnc|C8h%q0N@|XKdm1LmYvfI2tsh3h&6KKw(J_jkE;U{d=Z&n`{xo9CE zL|235=9CRQGWvvL1?Zg_;&fym>x*OUEIRnxpnlv%zok$`jgX-#DQS zA&q`k$Jhjb zwXb0BH4jUV#(((JRDQVr<0=uk2~MRkZzH$HiF3eVt_ z5bfd5q+X+Ga}r=EO~wCs85rz z8_+^9wPYJbtklc7;JNT|t^TOA*ImzNZf*~obwhAukB*q^RPISclg`1cAMwpz)Sxu^ zdfP59OJyT0wnpZaY1zgZL)ApnF+P=_uYsSajgkk?T{AkFv~z+|Wmex!q723tAxXCx zjRhzb{?wdeiSJ2`z@xutHBpQ+?@qd_f#_6eTco{d{SLs;bbAE7;Gm-q4uDzMLmSMz G68-`BR=WBC literal 0 HcmV?d00001 diff --git a/SunnyUI.Demo/Resources/AHMF.png b/SunnyUI.Demo/Resources/AHMF.png new file mode 100644 index 0000000000000000000000000000000000000000..a6bed5f361f9e3cd03b254db00d73c52a38fc90c GIT binary patch literal 2464 zcmbW3X*d*&7RN1-NR~8Y--k@2Y`wNn*2bC{%S`rVifoN7G=oCKShF;inzA;-SRykL z5fL-VGD()V5(ZhPA=~S{AMS_y-1mOC&+|LyJpc1N=YKw)lWK2k!Otts%f`mWZ)ItE z^{_rZjA$N?!~DA=_>aTFj=E}biLI6@xo{|sAWdvc*x2eb`F6dy4)w86OIH*d+lj8f zgS|JT%J;CRZDnc#jdouyiM5B)Pj}GDZ7Vaih7(B!I(i&;U9~vV9#p;a&T>$Du<*f% zj8j#GY6Lyz*Y@`;_JoJ=C@Sah1OYus1Mh5+zIqK}A}SA4@B~??h*z{Vqk#m@(JESK zVvr13Q;jPY8bbMly)2wQb(r$4tua;9!3ZBI$wcuff%6*Cr8xyg@iQ&>l6 zsP-~5)SISmD+=sHy>mS9>GPWvpqGz(?SYKj!DScY;0KmDB21|9M$pEI1ti*A)D?u@ zT&DR=<31kGjmMzHSG!g&`cCr5I)!B##fro)fMdU@kFaf>Ne6n5x^}l(xrzC;zB-xM$W<-uU1f<37Ey^++{g za5ia7_^#6D(^!bmB9SRvqv95y`30+fGWO>1h?;cptfM_i;dxh=73=j4#5PibFR|-MYDew9VzbYF!^WJdh5=(^0^-0byzLaxQJw5_uVCL z-vAB$ubF?cTa%BTN!QbCF^w%taxV;0>l+|Sd1foH)TQ?WE|}yWp(UooQ1IUJK)sai zmOj~OYXjc)a*9anx7CEX-rDJ6KR4-PHtIpY=V$x@a{Kpyot%48=Mfi@t~@)R>l}W9 zYplw!mO9{|iW(hlaS`>vXL>Xl9&HKOX5SSnAls z8G-s>wAa2{MpIR_?bE#~uL(j4RBhyEAJ#BM3yw~2YnfMXW(|CRuAMSV$~r?U)myL& zL}C0G?UQMjF`A@LC(cJOxcLk{|2UW!k#T0Ye82GWl)*$Kb_{u&C+Ny|#8b-xs)kU; zaE$Otp)=gLVOB%FR5&9y55GIttpYx8hX$$WVmD+Wu*d3{z+E_PHE-Q0nymw0Cs zgLLurs#sg{B@FzoXbKVkc|;J0WM>@aSCTM_QVao(0pt@^<)d2tCR}xTr$5lB!D`DGI~@DIY;0bsLwq5(L1QYbwa> z=^69YJzU92e-u(z(NFmsG`8l<_Dyy{7qxC%Y;8jy+`gsD)z6Kh0+?~(cIZnU>3|XI)g2^&*8n(u zxtsa1%Fw6ih54SCtArf5O6Q(kqDx! zKpGtA{VLKUGXJSZj{O##Be1_^1sG*i#V4#wvvV*7EMuwW+NSPIODhgfh!V&`MvZcB;A}e){yub?E8V)aIZ~a zDQ8}INALFH`mfTF#z2Xw9jliwEDE#ZVi~9Er}rI4$YfN(r;zE2Ka$!xF>dpKZ99)A z2x3&7`+b;VtICt-8V>FAD42(Y$P%~L^YVyEch|xX4^n0&R$^3#&>Xyx7N2yI(q9JG zMK`xOkq@Y47_cNd<|-DswIeF~lKV0@-E-@)=gj}j3?`jR5+hP9<-c=VW?gZFrs$c< zeS-Htq4F9Y&AjkKdvhF388qBz+)bQJ03~*%T|A0PO|no6c>Daj)e?5B06@=d>{#g# z<}ZGTz-xaW%^_rfn$Jx;I+d4*ObGS2po=6y&8oqUzsjfJb3_GQuo|INa$B%+&Jm}GM(7|T(#vuqd)QEUrFx$5=xM7eRM93iqEtq= z&_ySS1RQAp>*8{8r*UNe(%cwhH56a= zG^XuYaiOL)4v3icrw!KQ`*A<4h9x1%kYab)c|MYZ-|RMn*Zu$Hp_7CVbEG zMO)wM*#Gn`yl}1fYo_t$s*kR6eU|bytd-xdIk1dzrqvcuKdTdUF7Dr-0LR!J%%4UA z&hH)3F6Qv7VzV-{HLbnmnfMnY^2Q7R literal 0 HcmV?d00001 diff --git a/SunnyUI.Demo/Resources/AHMF1.png b/SunnyUI.Demo/Resources/AHMF1.png new file mode 100644 index 0000000000000000000000000000000000000000..c8163977ff290808441e264733990d8b91934b0b GIT binary patch literal 2469 zcmbW3dpr{g8^>2sY^c!W5}nOuX3;@MA#%T^&2?7hQZ7gC_sdAAPMR#2vqC7Rkh_I7 zlC~MS&26(>YDDgoTPByi&inp*-ap>=^ZEXs-{*P$`Th4iPb%t)g(y%42mk;?tt?IL z_x;(vVuTLv*Pri$&hOiSaC-}5KowJNZod)mHL^7V0BQ-K9Z$jiUO2=O6Al1~(f`(g z_TW;l{h6+nsgYxh+fqL6vLjmNeXqw~O9mtiN*>A<5&&K|@`Sl~Ii9}heO5hhk*SRb zsr3~1o$(Jm9TY0tj`}_DrCLA~2y6q9kVws-7SZgF)WQx4We|;H0yv(4*Z`Sma&AQQ zk1H%G0T}G$`G2JA%6ChXf=18Vf@uc= zLkptr3lciwEnYQ}A`8rHjxs&QpZ$$WpC+zi_H;9g5ecmz(44}Cg0D^a4M&e4L!-)b z^8So1(K|eg9BDz>q^O~4F0!1R+>MQ5d-_*%cSKUmT~QV?anP*1}ArVVf-i1w$k2PVXv+4fv~ zXP6|y3O1!uv;`kS9Ixz_QMr5r&25M>{7p-3>dgRrofDmUv=tSsFbwuP2TC~fTMe=4 z+Ht>20RJ7lpLIx3dk?1!MmLjjhU>}KWdsT|T?3Q+R+|RQa%^89_>Z*`ys%= zzO&FH^{^Q5ep%sqGojfLI5M>hV z;89ZF?v!)E+N`Qw9r9WJJKZ;>wa$O-))@G8T9--R-1Hi)GLbo>V?Kmg&-i*#OWP^l#En_fNoq&N z4UUXC)FvQvclrdO_{wAUCGsn7!jlYcVB&M*UPv|d)%YvoTAe}Hj-S@0AFePz4qhTO zj&_O0ISix{*FRNw3+De+dwk%us*>>YgRUY1Xm$YA!Mc2L^7Pw1&*;|nXg*S zDB?|(Wtr(_X1Uz#9|`oFalhS4J8?P151_PIgQs?fm0w)0!bfgj4YnCd3(;Z!d&sRbm7BC69Yhayu&XN7&jlWiw6c7C=0EaJhp?+OYWobjRPY9Uf|)!fU9wc;OW%Th&(L)!ep5VI4f|OfU8N4UH%AiNY<3 z4ZkR>-WBn$Yj(7MI-&GDqHssEy1Qfe@zD39*)JOJD>ww8`cs*j>qZxNNt)}OxOh04 zEnVUxt6mLJ$E@6~VdpNgMBxp<%z$xt4GPEoU0lKaNCD>C34X0q3--ga1#jWlKe$T$ zNmJ`u&Oe^5NKi~4RZHh_ zSU5v|S2d50wCG$B3FZR?I36FyWkeJtMdbc(cG_Luub5M%GKsT!G2vH-7kI-E2t>uQPIrnL)7h5DDv96zT`}?XJE$B{AZEB6wFh_F-S~d0WimxbS=(Lbj!Sw)e27YuL2U*Nool?w>wx z?y;MSdno6CU0pB1$9GBx4&N*XSMmW^Uy^?KNZab8DyIoPX zf^aeF4{46-vXJRf!!N(4-qoH6xeTv2h>iusU8WfhCy5lKOr#_y{fEi5hukEmqsy;_ z4zvOX6ZxB_b-nbHfAYD(wFUymo`=)jEt(-Yl;F6s?SZ3_(iO5vw3fo%g_L{>{|NDP WkXfx=i0A%m1+X%^Vp?VFk^C=L|B|Kv literal 0 HcmV?d00001 diff --git a/SunnyUI.Demo/Resources/AM.png b/SunnyUI.Demo/Resources/AM.png new file mode 100644 index 0000000000000000000000000000000000000000..013a0ef79801da597c3acd3318e38f9824208449 GIT binary patch literal 1140 zcmeAS@N?(olHy`uVBq!ia0vp^3xK$Sg9%9fI*?}pq!^2X+?^QKos)S9a~60+7BevL9R^{>iA=cXr6{$eNrXi)Xv0AV?MFuwmV61|XBBL{cFlV&7nkRpn{)5hrf-wh zZaeqvA!ohUrrn%p|CObgP5pfOGQTfA`UlqUJetR6~IzQmONPF*r zV4wLuOv>&FA2@jA8V@QPRIsr1A9x@rVZ+o+U%`7R56*20%1T`PI{*Cjd_9e=mrmxI zmtGfN|6Orgzya%0Q*-n1T-nOor61RAjji8(`(m2!$}0Wswkg7m+rzIOdbB4h=iT$N zpN$NwZv}0=CReeW?{?_kSWS}$Yeh}>-|PQhwfo=7NTzk$O((HiX6S}Szumf@dHP1q z166fq$=|u={q3zxU8b`%Z2KEGuocZvr(q{Ya_PZHJ52V%gg(#hS`nF_xPzFl!FS#W$^c+6`ZSh;@JAVVYeyEn4bw?{DeToqGef3vb<{){jQp?TS1(+BfU~CLyGinaaK39lu4z8I!ahSYdc#w;y_K2$AM4dRV_7ek zYBnefZG3S`^Oj8Jey6?W&B_)f3mX&%FiFBP#CeAMl}0tS1&`)FZ4j)8s^%oAuPXoW`QYiqr+2)_*_x=;_`@{1*pYQX_^V^f*e8W~+^0XuX0Fbt~vw{h;RH!(K zLqg|uAPj{ef`-{z04ROHMInfWm|r&s0I1o=_Wi_!d=zQtfd&9%KK?5aMs!6W03gQDY`C*trxzZ7vq^2LfwqccruKPEuV2GYwJ+b%Guk&j<>e61H}^dK#@zK_WjY zzVLwwP)-?L3$~$1$RBhde`wS54IttJiI4#*rO7 zpfNWd6veUFqk}eZke67FRH6(8=B%*U*09+m8qIzMBbXbv-J- zy63ey4DPtDj%YbQ>YDh*jdV-3#|M{v34-}^ zD5kdEw{ypdat+y*bAYMe(5>0oP~Vfvv2Uy)2}V&Hcp zvs`6ndK+MmSZCVg?oW7qc#bQ*6s*&iXRC&T`vl6@6j#+aMi>N(mw1~oK10f)irwzR z)xOp*pMoTGXz9XpXAB`o4Z&=8pO50C`>UuCoTh9q8vUuMXac3smjkaiGezPMdphia zco1)4+9OkOWC5|2PR+Q}COT|VRuPdibCWyaLRDiftB?VjO>+m`J*$> ztjn>;wW?K3SvEAJ=!oh*w>Eo@&@M}E(6$Zko> zXFaH#KW}l*n+LQ_!PeB0EgkKKR4N`G(r-i6j+<_Ca5p_=WvFrAhpay|Mfh%xqpWI^ z07oO6fVp4DXPpQ?f||p2E^FM;QjxAs;438a(MrQasX>>;P#5*rm>Q1F4ymX_(RO!* z+_T09yLijT_2%ogqRLnx=8+(FBAhuIeV8E0l@2qWO@(5QFWlD5?B?Px-XG2)lCLEI ze{P`FEDtosrl)julVYKi*art^dD;#mdp3<;zlr$$--n?mJ9#mkHl^h*`e|)#Dox`} z=YBvvgFkqoUoOX`n6Ot)F&JOm%nq-*+gku~I`L#rUuKfkeIV;b-N?jvY8DCK9$;^M K!-`_zoAM78!1dq& literal 0 HcmV?d00001 diff --git a/SunnyUI.Demo/Resources/HAM.png b/SunnyUI.Demo/Resources/HAM.png new file mode 100644 index 0000000000000000000000000000000000000000..5681c96c1425740f88bab9efebc3b2e8f20a286d GIT binary patch literal 2051 zcmchYXEYlMAI8%X^Kz|Q)wp^>(Q2Z!MyXMi&>+;T#B6N0W)Nx=tvze2O+#}jjoF%| zRcgh!K@qcPkVeIbeckhZy?Fay{ z=OAEOW`VY}f?xyFhoU_sI3>;Fr9nlwKw?yJF`G~Vvs8x9>A_6biQAy}O~t&oNd#_3 z1~Cr&_PZlXBi!s_oPv~qbT|824qS+60xnf!6L0~_tcf}ImnODg>FS|~1ZRfN;WRxx zI)6?jhCx~_q^r;_LnmqfY`LAkvwEFWohjWTf5iM_01qgKk0ag zji0od9b7iB*CxSYyQrZud0Anx;)TSCy#$BQ!Ty4-r_o;X(X?DWciMvWY0X|+t7Q}b z2xMXZH+mdcaTzs3GG5NWGE~uf^xWt8)82xqjjG6WoF$Nbrt^bV=ZABWIiEMi6V10X zGf`8W2UqW<)rGC5RuJj6MT_o)b}X=R?=PjXj`~xd-+7EK-Hs%@>G~X7KSRmG;wq$a z{Kr`u%4US}O<{MGSIc8WI%Z6#r31Jb{-1$ppObR8^7F^$grY^yYkD{*;0Q-0LAp*X zcL@=>&j=c=u5I6v-BJU!gpS(h3suI6KrPBvrK596O>-BfA`o99Fw)?$$jn#M82;%& zsE$D6sH%br3e<@h1ZN36kkUzhgiHw!e)HUD*TX(DkzYx4-`;do!Ge2u<2bDfBA{ey zMICQbteWmi6mlyXaXn@-{dcc=^HaOTJ@BY*Sh@rDhT~021Hnzcj3O&pg;jwZ()Jxt zH5=DxoH2qUqQa8PZ)lQJ_+KOJ;cG;%F|bcvhVFUz=JlnX^fBnO8yX(vI<7Rxb;Ng=0Drvt`JZ`AT}%TJ|snzBS?Z{uh!WBgXI!FRKcYC%<{RYQ*# z(2p_JeT;CykqE?BVpv80WH887P95n+|K^xfyUtw2xG)T2V#PqYS-b~R zK#)&UhRdRSHsqTfU@a}`9qYdp|G#h0Wxh^R~gdy`K+U=4F z5>!2lFKoC-BoA4u&V?Cx2((dm@Z+*f2+LFQ!Rr*1LR&vIKaZUa7&sBNo`M?it^CsG z@pAHU?+JaYQxjv{JA&@XQ50jod@X*A>XuvS;VMDe@#aEc^@z!l+}90|i2Aa3(y_9h>|dfh$;q2enJ{hJ!5P7d(1zl6?-w5FGSj>8^Rt5Nt{T^SM#`If0{{ehv~uZkbS^7$^F@3vQ6JTRu6YMx zrnBZp;6mC6d#JZT4z$TyFBKZzLcmK|?q!aF9}cCUDHHTMk549{*1l z1b%~JN!`uUs4&R?fF=nEM|#;R_-(a1KOuK{r5F!_if_t!g#`Ev+ zCVtblUMgx_zK<--tP{M+?vq7E^%-pxAgWJ%iRtC4W4|- zbwJgop_L5km+^gQ5Vm;&|M~M_YPD_fCRZh~T+WPauQ}wDu$9!X{b$3{#sZ)Dx4?0i zXN7&Rwxb=bV_&D#`Ep;I3h$@R_+Gzd0r7(D3!!oT6X*e&<032dZi9sLyXtUCp{Lli z?f4@ed9R(??pIP10YOTcy*n&?KmWvE4r!|$b<3KC*iFjAVExb8fn!Y_uvX1G{HoIN z_3PVGGS_BWb>e>%OjxYG3#9Ac3dxQZa*D;?97H#deB}szU_l#YH46pv;$7Ff>L#P~ z1DHd`!1T_E>k+8+y2YB1!*b?Ig_7P0f6|;VkH}HGE3?>s{{KfH@`=wpDflBQ3b05& zx78&#`$tJ+%cyeN4mjMECc;l6VMB5IV{cgS+47YoC4~xnmsfUv6=8~qxHno>pA9zv M0XKwI-?NYW8xVv84*&oF literal 0 HcmV?d00001 diff --git a/SunnyUI.Demo/Resources/HAM1.png b/SunnyUI.Demo/Resources/HAM1.png new file mode 100644 index 0000000000000000000000000000000000000000..2aa822c66f8c8a22edded9466287493ee8cff4fe GIT binary patch literal 2070 zcmcJQYd8}O8^wjPOeSf`^tSk{HL}Ww&0Kf@T6S(!E z7a!^Y@W^4^?ZDhPG`?VKgdw1||J>qXIO+|vfB^vYPmb-m3mj(Q026dD03iD2KjQ1g zR@?;ugsM&9Fw_H=<-%xWCgNOoos9Nf^PGiQi(&iYz;_14Kmy7*_7YtxM~y5ks^WE; z_5IIBQh{AEN0KcIn*Cz0DyApEJxX5}|K@etn2gFp#@RnRLyBK)YX0;7@CtFhC1B3Rb*g! zc_U}5ZMj?UG^3ka2U+C$ySN7{ZM8c_Pk_FreY&R;Yv4XSlh_L-U(l(->W&NaKAuuc z`~uZZu?1RL{TA?F(fi|j<8!}I3!y7g=f`9H{3WlrJf(dwUZNz>YGV0U+$M|NCjSyc zdWHob1npW&qFg+q#Wi}-?VdeDpToy)1vUlGZT8=>@-c$>wx!w1*b3|fH z>0KFwf?=0bo*F-3Cz45`StW9IXhNW)Y5?z{e zsbxgGvj#EyAj7RM-rC&`?Mlj3lh6q(hm{v)l@?sxn+Xnya)5K=S9F~o21Rz=eVzH# z=b}~+({GM>zA#cO-RHbWzZKmiZtj$MV9%gO_upj*`FcNv#AywR+1miww5U6IkkpZL z;D_N)-v?o?h1y~!m~UIjNQT&^bm}M%gry*0Vwv6QgSM3uh%CC!mXpembAG07OaqhD z9EwZ3w0i@m#yP8R?ocuXZ-8gW&yttvOwvg{Z{r1NR+-VXm+F(Fgvs#z{oX~(`Q%%< zFH+y<=yGpja9nKDq%uF-U%zG%qslm((OmzkHQ2-mn_2!SI+0SNK)YP6VbA!cIc38i zxuosa&z=i%OgPz+HO~hs0hLQC3l!9PaQ%;8+yIl>I;G9fjNYp|{b?pNyqs*lV-~!s zZ+nOK-ls)GRW|TtmiM$~uG%aVu#^$sd{ls6=ocjZuu(oDWf{N}x{l_RB~{4Xig_ON zQ`~G;U{(Dg!s)a+5pm-91HoVJ|LX4l*7pW>ChS)=)EN3huOxP$T=Q~l-QBVk_d_{E zZ2EPi?_xpL&YE^2hB_|lesBI7M0ejrP+6dJQ+$_nO7!;RM(q0;m=SuHhkQXjA z!}%?GW@o>C&i~2CNQuDHN}KHccDSq1*V2wN@ufU8fkNz-Yh5S}JmbQ_6z?%6AUbQlLy z4~AC-*{ca;RRlCV!q4XSa8*Xv`Ve7A4Kb?E0mj%ii~ChUP1ezK7Woj0^rKQ!EE_-P z*rs%^pw0@eqVA@yyD$n8-nr>+c$P?28HkL0)|e>!IIBejgEo96Ss@00(D8$G)wxvP zjfu}5&q@hFv@2c4`iuL%^U_eT!?HZG6*Gp()g?Q38rCwcOc@rR7@gH!*>2Q>SLsK$ zh1a6qcnhR=Nl26za967IB**%S9gCC@@l=AL5wQ{3E~DW{Tp_HO0R&1U)*YjOfc)^7V%RH>sS_BQsDr*&awk;uoLedMm^tdB{foik1i zJrk~`bq>saxf9vlyHtqm21}U&~~|XU-mBYOw zNZck|cxT-RuN;dv580;o8sXP@1jR^lCJoZDYv({^&)(6v%NDQMTG=?pk2hzAR_PLU*DH}9!fQtX$3H*Lsu6Z mTT!E_22;3MV*44b1A%fM>4AK0NteT44lp&ggx4Cn#r_+1K-BpF literal 0 HcmV?d00001 diff --git a/SunnyUI.Demo/Resources/HAMF.png b/SunnyUI.Demo/Resources/HAMF.png new file mode 100644 index 0000000000000000000000000000000000000000..c09e7535fdcc1b784100f4141b34f70643768929 GIT binary patch literal 2690 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 literal 0 HcmV?d00001 diff --git a/SunnyUI.Demo/Resources/HM1.png b/SunnyUI.Demo/Resources/HM1.png new file mode 100644 index 0000000000000000000000000000000000000000..e814a474bb8a7a8fd1d31ac7e1b024f5d5092f73 GIT binary patch literal 1499 zcmb7EYd8}M7#^7-m)28m>EtO&$wAaC#laZLt=yX1GD5UDb88w7>!eL4wKjyZg^E$M z)X8nl;h3>gi@9xbCOa;L?ToV6(a-Z7fBNx$@AH1o`~LdA=Oy_0z_c}uGywpBwxvN?8Wxq};$!B0Lfck#p>2;wN>+J0e06Z<+`t>|;U27zHoJ$4(blBgZ z(v5x?4FCX>JfY43mm@w3vpvdE0o{x9bZ(_u4(iS^JzLgv9T)poCzj~-Iax~~G1drj zNemh!cKrdeg(CM+jebqube@AaGGoUwlm%2{FK(|+{){ii65^c_``kWdR9tCGm)WPj z(OqyP}_w?kJ-zt(sGD_`t}FG=_%=@mEpvwqmUlah=q zG`OS->;?BIfXWM7SL272kD_C~@WE{vc1V_!Uz@A>^ZKugW8m)0=Od2M;U4L@RUFkJ zbMpF6HrDp)>fIgh4GfGo;gN_WEiF_ z>4;e0+yRKxl9ONhduM9rLfBW!&c<83EK84^9Ei#8!w$fyrSr81AI}^5D+49US{PfY zec%baHqE~Ng>;UlHW@;%Z;geXFHf^A0GFK*nAMb5Wcs)B-c`vjE4;tZ?|0sb(>Fw$J6N6G zS-&(=S|?({heX9_~|KN4)2&NXoeq9u5D#) zSUu{Lbehyz2d6c6>r-p;^N*5b2@*_xvdagD*>H{nwr_v_n#x0OJq96%wc!`Uw?8&T zz~Ap7W*6;yEe+{ohtW1RZkYc5WsBniA`s(Vy4cs-glQqJ1<5npKH`>|1h;H!>o97Y zCv<}LE?=*0JqE!v9*ry}-tb!+ymwAT{V6oB+Q?0Aw(Kx4xLoDoDKvxa+5%bdm*|_R zLvrzpS|UU0_Tj;%j1p$VN{E3tol_Le@Db=;k~1%Q4^rYJnpTB!rf}5`4Q%YuB>4)3 zBS+0)E?Ox}w+CIo-XheK#}*S_v7vcY3~_+_>}Z1H^FSoCI)OmqAHsaJL<{FZZNoWg zdMs>SBUe8R9EFF_O?a&hL!p?Ih7)$C(S+IYOe@$Y^4!^muH&RA?*`~0K3K2@S2NbEXUmcJ692g%dP;L=?+>(ESY#i&J1 zkKrm?+A*z7iL>_0aa(XiUR@ZAh>t3y#1v#nbH!|5-?#WCs7ygCT2#;$zyE&!sgVE2 z`(tB5E9d9iIUp7PPxWKM?ToP*RP%U52(gFEzq%KJ`4f$Tmqa#h)?xy~Vi0z{HuC0M bnro^J?W)QZ%WWF#g$(d?^MTg8Aaef&0MXUP literal 0 HcmV?d00001 diff --git a/SunnyUI.Demo/Resources/HMF.png b/SunnyUI.Demo/Resources/HMF.png new file mode 100644 index 0000000000000000000000000000000000000000..9420be7c65b90c601a2abfd591a84e5fd05c88e8 GIT binary patch literal 1872 zcmbuAdpr{g8^=dzRyZwAZYgFcb54}|91)o|OLEC&8ChB`aa`J5!rU4sVkwtQr!87+ zy0{#7>bPV!Cb!g>%Q!@C*>Wkz`@a94_n-Iue7?Wu_xb(x{PTQ%57`;*AO}(f0RR9w zM}(cru0Prp0VugUH(Nu^c12B|HI~!NR<;CIog@#PYNzLM%AXn_aqN^A#$(I6$D+Zq6 zy&Opi(XRg;!o{&8wp7beLm&%IyThnO|#a6nry%D{!TztP4;l@Ts$J=3#vY%sUvXZG~lcgn|O^D*7 zz(eVQ&Ckz64Z^MB#&0wpyzqQJktna4^Up^g0tnOBu5Bu<_en!tpqk`EtGN0|)oMnho*bY7Uw6x(EM@LO=l*c{e-@g)Ynw-UkRdRK8QIlUg zitL4(gN?c$UAyfJ(_z!Tfcd+rDN@pV_Wl>r<6Ykt0qyby+51*H)v&8ETP`qOt4-Vg z#f3&eQoWosvAz~vM^sN77z`t)`-LTJ%%shJ3WiJWO;Li;E1=_4@iL<0U38qby}>r~ zNQdP9+u$Y(4+m8=7sH_L8^3#}jttL8oKIEgr84?ff$Aqj0yh=4ixw40xS{A($YZuo zJ0y##S)vrODK!w_{#Xd={ooQ(Vu@k^%mdm3XISQZ%dH^i2Qiidbt)_HT;->qFym1* zw1zU;R#@Adm1b>7#w%XfPe^t5i_<{~Ta`7-sq#OxX*UztI_&Tr+f&}4-`XR-EF=8LI?NdAAtg(&YZb4I(k6WjCVR(dAfZ*J+u{SrRM!7n7?*;qUqOq8SVUQ zzN0qTUJl%1G!OTTz*XSqk#DgxZHRxJ2Ez_l!`eFa3zjhbxQ+fCAXHWPkrd@?S=4oK zT%$jIi8UIzPVs1GXB*Fs9pinKOXw1qZcikWlKyvgl=qpTo*Uj01rdSTJ=9bGco-K( ztO$QFE1o2XC@OwJeM|P5KOvsS3 z1jjQ?JkQcapl@3rUQW_YpaC9OhIp8`gRtq!@u(4#@H$&958fv_Io3;I}@%WmCrYrd-kVsDQ9aN9$@|qXQJ*Q(ZA>MYs-l!IIG|!oe z)uc^gLnvRKSDSr~rUXY}g+8S&2ZqfC5B?scG4)xkIfr{@yNU79`{sMo$-}e7&xC9u zGD)DBc}C0!Z#3m-;6iFAoSOv#`?o)azBcl5{r9qk2>BHtxciWLQQ5n!=y>e?o9^jP z>dw1eY8CN;7x1jLC?X=DZ``cSToB`g-)ERY>n#t66r#Zb5{z;G(F-uk-E{Cm5JPDY>g-7G!TUe}LlN+(I; s`<27Q*|qXaf@;$12>mkCGKU@6k0VF^G|@z7M|-p#%N9%e8v~7zZ~y=R literal 0 HcmV?d00001 diff --git a/SunnyUI.Demo/Resources/HMF1.png b/SunnyUI.Demo/Resources/HMF1.png new file mode 100644 index 0000000000000000000000000000000000000000..054648ac5bf5acd87197e689b8efb32575a2536b GIT binary patch literal 1873 zcmbW2X*3&%7RRIZCAQ#MGK|`l@^qy3*3u>fwJ)u$Q_CdO7ELKlEU$ebttF}kwRDtX zXf266+t>+8?8`(*OSDM{+QGA>W4^o(@AQ3n=luTnfA0Ny|M%QXH&-Z7Oj!&70013f z4jyM-ai&C(b7%FaC)(`H_)s2DJHVR>Fzc)lh_H3B1pu0I#7}Mup7o-!Fn<&PAld(y z_=aO@LID7w4MzuCuf(9O(m2?xFSuuw+In+RapvY1B+$ipob;4e4kK(~q{?ReKavB{szjzY6l5zF+%4w!AR#&v-k8N)c zpVrUMmzw!4S)Q0llL3^R&qxvmnfE#jJ7g7BU7JGR=mVkub_)OUb#8tK%MUdsd2^ig z>*_4Myvdd{x^7I3z01S6f?>pGH}9r-_lJF4&`eZHrH1JZaB%TtM5`n`$*Hkcw`}7r zE^j;>$1L*CE*3aWcAl;ysLg0~mmfSO(ZKFSLlP{t^7ne?H}6v!ijl+X8^bt9JJ}Bj z1E??6i|9Q|TL0nZE zSY=z)Tg+$|XaP;UwCKea$YS6my0XnU1)#TMM~qNSJh<_PKPbuQfw2pP*+kRNe_z{Q za{@}47aXN}{&FY&f=MA7veV%b45qsvAduA>6@;~cc3`A-!KZ5@*W`=ViT>c=*5xD2g3VutL(G@}we!@xN#!>&x^Q_g;}d9nug`pq7;P$^yR~k8ft?o5MMA zuIXLM=w$c(`TjLWSfHuYAx4Z^xE-|^8owg~miB3s?k1$rn9RHq4pkh|cNw zBDMZIsSK6x zcKDjphqvUzIgPVHKmI!rI(oj=rKl+~zSfuBY2qP0ykOuN zs-8<}rPHWBuEw1$i13tx?kz<6%kSrAmQ5T=)Z43juU`*SK1?#S(t>ihN?;Iw)QRWKO0D* w4km}u!NiVEbyoEE%!tTgg70l|FVMc8tL7;0!x72}XKxVTc+J(}ja^9kpGK=-6#xJL literal 0 HcmV?d00001 diff --git a/SunnyUI.Demo/Resources/SunnyUI.png b/SunnyUI.Demo/Resources/SunnyUI.png new file mode 100644 index 0000000000000000000000000000000000000000..187c7fb3d3da9b0b717a3c9ac89f9b2173ce31d2 GIT binary patch literal 4040 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 Y0}753bPx&6NjRTE8o>=aE*5lz&ExCC`! z;>wke_=+(mYFrpM#-t0jJ{B$r8~+6tiXx@9@~$my=X%cV+{sWe&I~Mjlgqi!bAR*Q zZ>9j$OI?Aw0xO~bu1FS2B80#-S4W>|rP6s20D6P(<=Fjomk^P9%P%VeDj~0o4(l2w ziqWW~@~6|F>0)H;!Mc44cFpCl=KwMA{r=jgYRv8lOAx!RSlIds-9N*Ri6&-N! z)lV_g5kg+8=@rn*#3;?->|{rZO2~mP!xeCo9C?_V!$#4*SbbW2vNrDVvA9-?7VNfz5Nn0H@ z+HXGP;o9r0m<+XH#pi?8>@PqaM$(Vgo8Q?*d1^Yg6pamjdBTvtLT%*9vV^>OsvY|b zPnu9Q$z|67PVNlA?PNQ)Wv7HjHXvZ&oSb{9ZM9>zKndhvew81*r4j^llOnnKJD%B7 zRZ{5EbHGtn0yColNjDO-LtIzfg8fhm6N1W zDN!sGWL+p0W#qAZJ}>KUBl4J<=g5`EIEOVK_y1RHDauJc-oWxw$<(#-oZnAZ$%WP9 zmq@j(u{!$Ce8%)&!8Yh$JJo;%O8Hez8CR`Sr2mxYN6Bgywb_1j4{99DimGp%g5kau z%c{D4w8bl3gIW(a+XlQ+Q5_{8Mp;1(I*jf?)jlicMYn1X}wm{mli0gsHN|c(|ivc?H?K%dS5P=4>{VTl<|5$^z`%` kcC)v>r>;Oi_@% literal 0 HcmV?d00001 diff --git a/SunnyUI.Demo/Resources/dashboard0.png b/SunnyUI.Demo/Resources/dashboard0.png new file mode 100644 index 0000000000000000000000000000000000000000..d8503bc2f3a8012cacd5dc5fc55f61018a37554c GIT binary patch literal 971 zcmV;+12p`JP)Px&g-Jv~R9Fe^ltF6~K@`W|PBtOLplM9EwQWc}h!+pVLlukHDiwREG_@5G#j8*% z;ulbgv}!M2L==x!>OmotLcf5BAc&q6($us~V~8P?kZyK;Z+18CZez09Mo$??c4pq2 z|NG5R}s0NutNKdqQq#GD0015-_ zKwu+{uxje&q1cOO`Q$l;38x55WbkEeKDOu-lCNnd*`7;~y)(%h;1Li~0#+_Ta3jOh zcDf`W@ZiQ~^y#nUb*8EZN*x`X(!aSKvuiaP}k1mAyWYJH(XPypIfV4dGK7BS z;66Gzg?G|PTYSF*cVA^79}Xj|$k(%qkovI@tA1ze={RzIr=<#1-2T>7vrSn5xwt*da|Q-<>i$X`xGCaA0F1`b=aYv z94vi1`W9g?QULW!Ja2MOW#Loy35)? z`{&MM+&BSqteL)hP&1U?H@jI3Y0OHPAo6?*ny1i trgPx%B1uF+R9Fe^Ry|7tK@i=&h>*g@B!Z1Z5mShj2v%Z|&N?Y=EK^!UBwDBl3jPEe z%S)?W3b7KzN-QFxVquXF8;gTLZk?A8T~F_ryVHPh1AEzF+Q5O z)E#iO+=zfKc3ocWM|D_6(1BWyFKYu zA3Rv6_-=6Mg_*=rIWOB>Uu>Xo_*;Fn15V2Gg_&fQ3)UA5ZtoniGC>2qQ#x<(lPiw*fLti~|64!0F#TmX^5IX(A!`9fh ztM4rK9#8rUV;&kP3I{pqEG9Px%Pf0{UR9Fe^RzXV}Q4pS4HYyg3Vhj|NQV|LY_96(ShnAXqFBW#Kd}O_0{2IOo~hk8{WJ6+3S%ouv9{KAvG?#~cdTdnU!S(7GOsQ~Wm6)n*)6-n zwW^Di%y0YtZjKV)9OpR!^#folxDcw|U?aLmXxoe16YW1uENHZY63n`gTymTdbfJ?; znsD7lHBnLWf}{ndL_^}s+wtV@JWHct+WlcKZ}KdQel<6w7dNwbXkwaCP4w!xK}c?8 zTX*tV4g7UZEysOb4WK59fGxz84+oOPEiZy%UaN{;Xf;t*^niP_?eBW2ivf1LAVKr( zT>5iRPSCpAo>%b@lbVdFyMWU;%dz?aPmTl}dg8_#Vqz zBsEb1yel6SEIyAvnN(^)OEwfy*&xaz?eb~1^hnx=UlvKUV6~9zSk_?Hwa>(N#oEN; zgxsa&X=nn}m8hX47AJGDJQE8V)%H{k=*2SG#kIW*pXyVPmp{Tr*RzhLm6v!{t>((& zL{YXp-4j{S;@bZVxj4vwkD7q6N#;V_Z+q!cv9^mIm(wPvFjcCsc z_z9hjR&L_=J?yQIeDr=Ks>VD%Iuz1JBNOF|yg`J6UM10@AB9}{YgNL$P`GW;XDxD% v%Eb|4fOIS$nM=%PuQ(Jd5GxQX5JG`-Zl>B%X#5(X00000NkvXXu0mjf`JgPj literal 0 HcmV?d00001 diff --git a/SunnyUI.Demo/Resources/save.png b/SunnyUI.Demo/Resources/save.png new file mode 100644 index 0000000000000000000000000000000000000000..b87ae17fc23c5bc541d8aad3c61510ff712f0809 GIT binary patch literal 700 zcmV;t0z>_YP)Px%c1c7*R9Fe^RXuMLK@iClIA%aVgw@BQIm5NUbnmkSUb>4fa)WRC5$SA38V1AR>un40NY;^uuE5Bc8LsF zr7{^mujWdBq9+I2+d5U?$)W)4Ivsb`TkEcVJpou}=~?q(I=y!{mPaaDpk6|F7R{r3 zqkmSU(SjNj-h{$V*HB<{g#+re$Fab9bE2c=5!AguZrGGO_0J+i(lneiOa*L|6CV!uX zy~Z&|S$Xkuj&-rg3>4Q61|>^0OpBrJMsmrBTBdQcp37%up#0RhesE%@)9K|EqW95g z6t$WD$jU{K87RvrGjdQyJ3Cp$$fVwPx%FG)l}R9Fe^m$6C%K@f%~Ya&9>#zJCFA@;s08I@fjz{ywY7sroKi?3rS)RT%Y_Hf z4m9Btgl^l($yGmaep#W)@z?2Aexb+%Sn8$KLxY5>)&)(o1M7y?A)wN4r` zDetSrS?gs6O~ByMUquBCns8RqvtkmNL9-l9mxqt~iN&WjEz6NHgJR9m`3gc)TfO)+ z=^-|Q;%!EYh5Qyd#<6yp@%M+VHvFPgM zSMn7{GOLxJO>uONpHErV2I@-Bn=h~Ce?_M9FVWM~e32|1C>$spPzQbhAhhizPC+28 P00000NkvXXu0mjfx(*_q literal 0 HcmV?d00001 diff --git a/SunnyUI.Demo/SunnyUI.Demo.csproj b/SunnyUI.Demo/SunnyUI.Demo.csproj new file mode 100644 index 00000000..e22f4576 --- /dev/null +++ b/SunnyUI.Demo/SunnyUI.Demo.csproj @@ -0,0 +1,418 @@ + + + + + Debug + AnyCPU + {17F96B36-7CAE-4692-8B1F-B802482ECD09} + WinExe + Sunny.UI.Demo + SunnyUI.Demo + v4.0 + 512 + true + + + AnyCPU + true + full + false + Bin\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + false + Bin\ + TRACE + prompt + 4 + + + SunnyUI.ico + + + + ..\Bin\SunnyUI.dll + + + + + + + + + + Form + + + FAvatar.cs + + + Form + + + FButton.cs + + + Form + + + FCheckBox.cs + + + Form + + + FDataGridView.cs + + + Form + + + FLabel.cs + + + Form + + + FLine.cs + + + Form + + + FMeter.cs + + + Form + + + FTextBox.cs + + + Form + + + FListBox.cs + + + Form + + + FContextMenuStrip.cs + + + Form + + + FEdit.cs + + + Form + + + FEditor.cs + + + Form + + + FAsideHeaderMainFooter.cs + + + Form + + + FAsideHeaderMain.cs + + + Form + + + FAsideMain.cs + + + Form + + + FHeaderAsideMainFooter.cs + + + Form + + + FHeaderAsideMain.cs + + + Form + + + FHeaderMain.cs + + + Form + + + FMain.cs + + + Form + + + FFrames.cs + + + Form + + + FDialogs.cs + + + Form + + + FNavigation.cs + + + Form + + + FPanel.cs + + + Form + + + FRadioButton.cs + + + Form + + + FTransfer.cs + + + Form + + + FTreeView.cs + + + Form + + + FOther.cs + + + Form + + + FTabControl.cs + + + Form + + + FHeaderMainFooter.cs + + + Form + + + FPage1.cs + + + Form + + + FPage2.cs + + + Form + + + FPage3.cs + + + Form + + + FTitlePage1.cs + + + Form + + + FTitlePage2.cs + + + Form + + + FTitlePage3.cs + + + + + FAvatar.cs + + + FButton.cs + + + FCheckBox.cs + + + FMeter.cs + + + FTabControl.cs + + + FTextBox.cs + + + FDataGridView.cs + + + FLabel.cs + + + FLine.cs + + + FListBox.cs + + + FContextMenuStrip.cs + + + FEdit.cs + + + FEditor.cs + + + FAsideHeaderMainFooter.cs + + + FAsideHeaderMain.cs + + + FAsideMain.cs + + + FHeaderAsideMainFooter.cs + + + FMain.cs + + + FFrames.cs + + + FDialogs.cs + + + FNavigation.cs + + + FPanel.cs + + + FRadioButton.cs + + + FTransfer.cs + + + FTreeView.cs + + + FOther.cs + + + FHeaderAsideMain.cs + + + FHeaderMain.cs + + + FHeaderMainFooter.cs + + + FPage1.cs + + + FPage2.cs + + + FPage3.cs + + + FTitlePage1.cs + + + FTitlePage2.cs + + + FTitlePage3.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/SunnyUI.Demo/SunnyUI.ico b/SunnyUI.Demo/SunnyUI.ico new file mode 100644 index 0000000000000000000000000000000000000000..0036969b82c91b61400d78851345abad97dbec2b GIT binary patch literal 39438 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 literal 0 HcmV?d00001 diff --git a/SunnyUI.ico b/SunnyUI.ico new file mode 100644 index 0000000000000000000000000000000000000000..0036969b82c91b61400d78851345abad97dbec2b GIT binary patch literal 39438 zcmeHw2UwF=`~G1lg0pI^wOY4TtF2lW$ll0sYu(m~B149Xqu{EeZj?7gleq<>ZLmjZ_lcLg!wI}+JAQ2C@hchv*YA z!-!O~%t%$3HK~f2MkbBITDi65Z7TV(2U&rmg~FINz9%Pd2axM4ewvx?Qa%-`%Jr zV{Vs{pKewXo!eDJ_ii;Yz5RgL-hD(iJW3$&;(wGd0|Q8Cpf3px4ki(y zAtX91n4FCWCTwOXiD0wH@o+Xdc`TenhDVX8h-h*=>I6A+EQ}&`I zKC*4 z>;Z>7Og}^(-wq_n_d>{>y9{#g9+N!1%On}xZR8Di2N5OjAOikwQo;S5Jim63s!Gj|5_jsrX3^|sXnCeh94bl5rDU0-h27uyhgzYH_sIFA zzsZ5H4C0;mmTY5-$i7Gc*&Zz*`;H07Z((I*Ped8n7ga_MpAe93aYbbBIXu5uNRGyd zNXS_sIhr6K!IwoO;B+~OjL#&Y@x_F7v5f3|dWUS~z9oCo3dn)fLh{?q60+xdAvuy# zM1uGNav0}<*NVw*l)3E>%82*B6~zB;F}a?`CpWL95k5biTu;A2Boc|N0r*e;&3yj% z)924~ACl_7_WV^XZX)T7@uNqL7&&tEANTkC_N&LnO*dBNbW@NwK3jgx>sc#&v zZX4s& z8wtfI$s?7Y20##3SJ$m|{J*gpGqRR{svnte{B?ETy5m}{__H#`jTr@f(xdOlQR5#y z`0F<>H@7t|P^qi?y7gOvQk49cyn6BC#XnXE(!X#2QKQE{&&0#(J->Q-y1Kb}tlzR_ z-@g5R*YC(f6h1aHHhYnkmGwGf9E#4^XF0M5)qA#XT;t}kbxUx{Ex$vDeU5Tv_brU| zb@eR^1%fwO&&G`zpCOM1{VHSY#&uh$_v`-ObnDg)-7t;{V?A9RJwr2d^H(olzI(GJjUvzAzsj1nnLlS-T zR#)c-dT8tDn~7@qm0sNT@6lCLgC1?PF3>xcx>E1(uV+?2esZH%*LLvSy0wNzyCc-U zg)DlSfN>$cQTw>@WxF<-@DBf)GXJvZ;a}UJ0ssD8rLiMGYfY(w-o>wNP*FQ>dUd(0 zMjIOaJO4`YH{`#gW~2TalK)CQ|8llT0boC5O7A{_1S~qff zedgr3uR3?>przFzkzQ6980hJlEL^sH*|L=@?VaeYcgHbySOh2b^r?$+J-_bSjVFCz zYHDn1QACL2%K07oOim1K)oS1%W(;oKO^)v+E6=2G=@P_V>bP>=WE*Rn$qULA zAx;b(sHUo>J}5MXq^6xsNR~y9r=`mmul#x5OgkHEYik?3*{fDdLqrW7sIIE2s@7@{ zGc=qNo2G~cuA}`dspp9kC(fTY4bC)ZxR1 zs8i3fL#@?!$7(#|#A%*gjc+7jV^h!nz*_ztX4mp>Z8zonVMEjuu|uR*gQAqL+g1b&NR1V zDb$KzRaJe^cXfo3rR5|IfgtbXS5s3PIA~}ss>*UX%#*TE_=n(XgTHIkH$ox_JNTYt zOZ7ikO?|-N@1m6>tbgw8LuJ#1KX6Ta(*|JXYi1K}WaEF^cm4W-u@XBg1? zWrXymZU!M5)J?{;iMrl$mkNMu>9E8AJpjFitGKS~mJyX?g85zs(ZGM|_AaDuGV!V+ zYH(GMy4>~tKsT9&Q31wtgf&ZaVX7GwYkfQ9@m~2@*IdE ze>E{laU!NE&SYY$E3vuiPJX`rt9;&SNW@H2BF5ZR%(fz8jx7;KPAAn-Gl=;3Y*Kx4 z5vhu`C*pH1L>%uh91oWf_oJm`t$!IY z3VThAFb_2g&m@)+nZ!COi`W2@qqE4g=xj3eL^hd$dFh*G3KFS(kewvG*iW-LzD+v>tZtChL{YwDJEm@h{=SzVq)}% zn3(=4CRX>w#P%;Snf*{q=06e>$A84co&QY&R3L*|GEDkX+YXAe>%QvhxO_8Bbh&U z;j)I}bnnx%M~@!E$-J2}XU|(w*T*{gQ1N^wywr}vwNH;8Uw{3zJUpJyocoJX6l)L? zkKsWYKYc!P_M#dO>tvy8g+~nUgmCZmjWl?z@bi>Y_+FNN&mXD$(&*=JQN*u3MxT&% z-}meR_JnvZnm2pq?1jG)@>OT456@9UM(J)O#BJz0S%@vOY0}PLv~S;?-q0CB51q}j zhw{Hp9ouSYX-Oj(D}6p>jPmoY9r0943;i7-cszLUkRhX#pUWO=X(>I|R({@D8eH*w zFpeQjJ+GC1C#CSCX!?Uk=_$ugzLHANmfq8*@{ie2>oFm#5k=ch^rqpcA=-F4!(yVs zi>6wC2aI_-ckC*?qYd>EYjYzbJDG<;sw%1)_Bj8_MRtP_J2NBcVKt5PlMjA1mMb2T zsaCS5_&bScNXNz)lBx|-c$k8?<;Nt_Mlo7d`%dwkOj10C2pWp#{c9c*GD)7knVllM zT0f=7?>y9muSs0t%|;r9EWFyFm5ST%+-WxEW{6)yt#!W@@9x$9pQGwz1}a?yjLV&eZDQ(K&+N*P}Kl%-%Fy#Jy6Kc z(#UW_9MbUeIC|4KY1|TTZw#QeNhH-tNK_)B;}lv9`T#ZK6ct=34tg%XrsEV{?h2yE zTPa;vpLKn+Y+S-L#+U@-61Jsm9CF@OI_A)ok2`GF3&{*G5&7lj_L}j;EUa(O#+YIQ zLqtsJ*a7RNXi?`q|m)6LHPRktY~ z8C@p3KhxT@?`p@r{>dW__+K(Qa5VP&{f8pDA2}MO1fG4m4a2m0!O793GWdzm&4xc@F;ttjbB7=R8Yz_?y zSRZpNa!uUnSi88>rv`9XA>E=Q!`mJUXaCpgVxqfHWxA(O3+~sJuEN2lE+QL4XVH4_ z+zI#sNx(nAb2;veUsb-=b9bUPJIMDi!{0YE$k*phfX|^9A$~_Q!Wh9%ILzR9R*?U` zh)|~6$>=D{*b~RU1G*<%jMs#&n%a1X))~8qd<~pL z=k*;$e}ii_kPnD}YCs}K?s$i?-<-Ex(GBw1cNpWyd_Y10I|ND4(Zf}M06NKK2KYV< z4GuUH$z~lndn(2)DdDpIrSs={q;QioK2GwF3+=R9*m|M2@SEA2g$8!(gqtkfglCOh zM340xMQ`PNtCaXEcq?2v{{-;gTZ_L!4{}!weN;jhLg*nMb>RWpgxIsOF)ruNoEppw z^l!KW{Wxk(h90+4*a~^wclrjAtF?#dBJ%vHzLQ7*zLc~0J-l1WUs@&8t~ z<1cR~Fz*zF2KnD+2M2nfE(~G>`hS)-Vaht8#>@?(!D#2!Omr6|8ajzyfj4c_8sgTR zdmqhTQ76zo2+(id06c<@`V0>8J@QF)u+U4WF?W+_@Z_~Z5A<#6=+{g1npel)r-x6) zpVkR+z>z~G0Y?s}!}UNPIv93rpF{_%b_!cN?Gg=|y;~BrHLmEB9mX_F8!tekQIG9R9Q_7b*7UpL>%O>`P#`KQSLmW*$dxi)nES^1-1tO{cUy*PC|%7uGA zrb|n>oBHIbm>kY)z4TB~rPr-I-0Yx^(+p&>2Ky$IKaeBU}Nbf z3NUvSJ;Kk{9FMJ z0M4UVROs#T;}40Aj@%p-#=3#|-9O-y2?*u=`FnMN{H|aI_~pUA;zl%wwd*o_zr{ng z`%mC$Tg|lCC}9|#k}wSal`zeoNZ57<%fo&inHM_0(Y`>M_bh3-4*>6MKrBavKJ;MB z$+~OA$^6}fm2GSpnA>;Kp2EJ9+)GW&*ND~{If+hz-#_40R}Ug^e`Vq#Oa^wr&s5Z* zp|=J=vpr;g~piCAt@#h$c5!m@~!FpZypf3bvNP$gj)i*WA}bYN2wIuncC^$$a4 zmWm}itE*K+<|2cz%yjTBlXI8ArJ%YH0e??mXU0xozg}z1%${HwklV|8Yf(Q_XOR)w z1P|~(13U!;;7#X+4=`UmVB;>do4rx^-HZ+S?I*8&t)`G*o6j}XT}P7I{O%LiJ}~Hb zXRPad#|{a!Lp|OP9XtTn@){k0cOdFGbaX$A5f~c9;rx;kePlv*`AubP)k1v z%j_ZemVkF9AO<9|bK~0*rukA4Yf`sD*0g$cz><@tKKpp~D7(n40OWBNcvb@n?h2Rc zpb97fp6Ii)&Y5wt9H(%yN6!w)>uI^MxVO$Kksdg2HgXoFTDXe-v~m@B8#oGw>N}Na z*?7Kba{cbekucRDUq3C>=b>2p@&eaq&_g-x&tOlK3*DS$GlG}Ihxv?u&aod}&a^Pb z{-UiChJFHgz5vPq1#iloq8eo(OTsV<5VI^tm9cE=)dAD6%r>@>S>~wc@%mv|G@lim z-{+PZgk}9}5uSD4G9qi4v42iqgWdUBrW=cUPF*jYHG89I`Rq-?{?j)KTD&%KjLmF? z`p_pbl<5`D3Q3J*GgD%ZM;uLv4z~T5<2tG`)XrSOq`VET0^nv)4k-9G;2MgcgLnzU z#JrMeffqQn5AbaRm;>=ZbNNg3P%ltlih*kg=Y@Js<4aVmWgko<3+2Ry|LlWuiof$ZG@FUkR^ z0P1pV&UL8)JM*e#c-9ir!+Cfw_-T%ZA0Cm75 z8g4yv6!0Ac!~nG2Z>a5Sl0WK#5cwZx6_I6b>YH1yjD4s!o-uw=hy0@e1_1t)ON;p{ z^m74Wht`z^oQDFm?l;M^5kJ)!C+2{A@U*C`k>)`;_1f6FX*T!z1#^)~3B#r*&gx+tl3lNlZ7$!2{1q`Lw*_Y#;4(nlvX=5z`2Sq| zX`gWkbzq_aEAx|;eT6PcS=Md9*&IM0W`KJ9U&;RhbYKD0>t7W-KGYSkEdSg2(?0Vu z<_R_vI9VUG-ts=(ya}^vi?$!--|)Y+{8xheALg7a7o&*mo@1hNn;h%DkFWBxdr^~B z@}uVTlyGLapzlZfXNdMsUs0c1>NZ;cQFlM8{RjU%jGvk41AZDEo%hMw|Enivt4X4r zhDyR`@0Em3r1Lsj|64NlQPxp|{4s7B2-%~-fwp5U?foQEIy{PgVC3)<`Jaq` z{K+}0lBi|hNWx}JldvWpk}yrLK?m8;L0QY%L2R928iBuIz5X9EcQXsm@&y0K;L(!t zpBP~T`eB*35N;3V#uMRo|L)}5PgeeEUAP!Cr`40lX`LmZwm)JXI}iMQ!2Je5$3sob zeWZOw6~?~;3Cr>r#=irV>lZzT%v#`K3pW91*8B%~T?XDSO*vUtEI64iqoZ$(PrCs`$Rhae;^69a;s*V%Ph^65=OqYWd2tU9c5wuf6X*JYnxqUrkUM| z+&+CTm-c`yu?Or&9 z)_35<&T5DJoPhPc{g@Bl0Y8)l+BP<*2ij&_!t;scOp|)~qRq}!hYm)87hU^mX#In( zebBkV3;4T&b>XeLoNOb5W4XP0Toio+uA>15;4+W{WB`YO?^Su#_0m&PeS@bHl2>Tz z^6bAi zHYnx^Xe*6{=sV&te>5v$Th$w%jN@dfXoqEW1HYxfZJ-jMa{Bkbfe7FMPykc`6~J>~H}I1xzp7&!Zb_4EqBeJuTV~oRB)z_$m7^FCsD-?|ZJehZ?VX6nHHIH~{7S7N`UyN}xJ;0{8=Sff1T~VfQZl?DoA(- zlDDV*Sl;^X;5Y)91NZ}v0VVDV9juU`OjPLeSH6VH9M4<6a5R7APtF$?e3=$Kt?Q#m z>w#q~)49m+7zxW1Wx@C@+6X?%$GmKgb(bd*)(y^0eu~IZM;RCi&If@fKnB{lQ{cYQ z`dGHP-kE}d!!8T^w&hisfXja14}kKfJe7GXpO@iTHgHuXMdGKKB3buks$^E5RLRhe z{O28e^G|7-^Bwva^Btz4Y_9`fUmy+0256a==X--L)lDvN%YeT!z$V3c$&70ofAUOr z>2~+jFW*#grdguA??oGN9J;_-nc;|+VP=i4#r<$BPi0Jab{FuTF4w`YaLtCFDj3-3 zqNrb6Zj~N*I0KQuQ=lAB=Gxe~82(CuJT-*VNRe<`rAqeV+N>x4%Pzs2F_imS0qu0C=R&u_hX z$92K~FnH&G1os*}pbUwD65zfb-yXHz!TjeW`xei~zKJVQMZaYX8P5W50NSR13f>Am zd=~z49nv~cg*x@zkiW`hRBR z2XF%@0ciWBD8nD)ewO?P?`o42$2ZoguECSiJVwq@?5SF4uSVTb{nH(Xmd8)sP}l)&Z>x0^nnG@X7dNK2VMCP8Qpxy78x{tzC`r zPybnI>ppni*{E)0I#ASw+u$z(KC}(^RQ!boe20u_X=~5_lJ2!)W%|~B(^J=edhQCP zq)2FcK-)w|AQ5;4&@p~X_3+XB(Z7{p4)ljbiu3jb>AxCnzI~|Yiu7%tkNZ0vv;yC+ zfHA;MfQ}7meQ3!T=|lKS$2Az+(DB_96aMNr>y$N1;C?%vyZnRtI0dB-a#JK!542sR zbAwpmAy5QV0!_6IE#XgjR{}-ABj6O;yLF~1j@mO)J-W?FTmR|Wxt1zI)+Y1-UwvSm zdaC3^E0hP!Z|E8j?JH@SXsB*9i$8c)qE9ab=ZD(7&G-6G zk*I*9X1f&0H(#epj5?)CoS}o?aqkrH7@+GwF96D!wwZJc)ewI={}TW?So?Vne$P!) zo&GXUbv}-@fwd^(Mkx2+;J&5-Z`FI}vG0}lGd*kzJ#>K{;C`u|BIyr~=D-?&u7z#_ z7yw-lqI1Z4{E?^S`n;8xx2^QY`qu{Z=bls1pJ6OxJm>1hZ}5F(x+eHv$Gbswrbtx5 zQ48ooQpDX<`Q=}!^NYXJ;OCiY@n21A$A4eFE{YsbT*v*XZ)Y&%GO%rHx?%tpr|GW7=4ZKGKlKO`?@uD}&2qqhVr132I@gSr}0?}Xr^dEWGzeuPhYC|oaTaD2+Hu8Y*@(NX^8 z6NRghLGL2s4E({Nk&MXUs==jxsA~XGs7vF9D@{}8ddsity2}^ z$OmZz1`?T~;m{0#cWD54lV(_N>efE!cOpgrivY!UBD@FU;(te@8ZdD#P`6x@qdCdr zMcWzc{??kk{z2=tyHeYF?@#QxeSci{-3OxE9y$`K6&%F*{A2M(rL6tH$Vt%3&`Hn{ z-y`Uuw^}e7m}%fxyvWe0aGuVp5}l)rWZmfFrw`*31P23r0~UudS@TXsN1H}RMs&v> z+jgv=fR9>7sVzVIO}BHq?yBFxI-5V-XY2#-1E}IwraU?tNA+u=7`)<|*hh zV}oG4-CBXO=^D{V==~eM+U^5iCqvA710m&@tDkmtlWjCV7vbh_AFq} zim*~iW--pCd!K5{zpqAq@DNjg14T9Rqyl;J7JJfe<2#sJv2URtZ2do(og8FV!T!_^ zMoz*XV1Mt8eL1;s8{3bfyjMq{?NG|3`VaKkpG0*Iyl>x074n4gxP)@G0QI6fZ1q1X zFHE8HY3qfZVJrW$g{zPWeLsO-tEi5Z^xW9FQu%36{}OpVNL|G_>PZR8P%`$(F2=s; z&e&)0K^)B71S&Rb1)Zm^6HY-MBpEsh>9-$fS&_>7x#Xv13Mj^&XD;@BO$qV!>CEy! z(qazNHw(Hh@)j+$_7HOQ9EGKjy`_8lT3UXT%NDI0rP#B~MII~;3-syUyp~bs%gnn_ z<>!r}3ASsc^_1>As#iunm;US2?_$WGjQy6soZ$qtYc7W=TZ>zxystyMPWKBnr>-j3 zTgCau=wFc+*f)8&gdGyZJ9pyPxP-8M&00&Ev7=aP$_C*=^iwC$zSF&5Lg<_Fs44sZ zA^lfjzppSXB1^$vJAC57{2#5oiw#X&1#7S`Ee`E` z2IQyxQw;}POBB})oPSXJBP~C&I$VnVi%&Tr0cX!f1Z}t%b8y^?2#+3*7%LlH+cEUZ zX$SiwTYM`zST8iw%Pc6z(tL0J560_?O-3GP|4g9d3w$C}M%*)tQovOp8FDeL~*Q=p=U=)z8 zqQ{i(FJ-~b;4P33+so?~;hBf6LUIhI>@65J%}X#HdkUH8!|p-G0zg`(sP2JE^lJqu zZ-3(4Pk*&wg|0)f4ug|4=2Udlfv}Lk1oTgTLB0a;sH9w!K--%t>>VsYS-EvGoOzhX z*)!#J=rY?fmfa>X!}uI*L|(&Q z(;Ux-t^L?(o!H^=!JcVAN7 zx&NfP-%(b_5I^4^Fy8S-8OcRoTM4;~Fz$>!#`Lql9`>u@+t8WT6-@Kruy>CyW*8Pz zxnZj%#_xpzhHoVd)6g=eb>Bkfl$t)xAT(1Q*doiAwaWX@VLb9z4 z_rCes&bxTzoL_}@cAJa8G~JY66K6wZl-^?>@llBkI@;wphwT|1&N_bnIP3Sj$9CEl zvFFYZGfnnFR_vuRp!+NvvO|WgrQucBnT{)GSk|vSK?HS z`z6>H6locfJ24#FbzQz9%Wrf=M%F9VDnU%S~?va)$ zV=r-tQ71)wkc--O?E|Q7qg3~B-?!gM4Er~sDJRp%f{{JI=wM#6b+1U1y4j4GUx^t8 zo{(E%kEm>q{=V}g2v=jP3;llyefm(DslJtUu6(ZayxM^M`lWS5)@qB8tQOnAC^%#@ zW@%M2jIB{l{sg4LmmX@DNl(|1qf33B{vp;yQ`ZQv)Rt4ME8vT;I{OC8-<|xXHv~E*= z$fH{2hsqCmT2%gF$CwNId{3RIoEFV36uPJGljHNdiX-MZidp9WqC7+Yw2zWOE~m20 z%ICG@M_bYf_S0T)i%}+;+G9eWmjL(RfAy$ix$@8RDofV9bN-3BZHvQajgzpfcEA=m z2{Kdra9WS0I;R}!0Qa%SmT7zl?X6Pzf87TCsvTr{fV`+wZgZ5+@f>|uW-iLjWgSk| z>hEIS{?PMmaW~kKwzv+jzOYckHGY2AgJ(6Q!{%)HhVG4A`$t4 zzSy8{Urg)x?P`Xxv5;xnN)fNrMjy7hkUtclV`tijQBZx;GR4O}h8?3Lb4>@IDH^1i zTxo#!Z|i}30Da$hp76zEHImEPc1Ub|3}lq#rDB-m)OG@Q#aMlw{dv5PrSIJZcn5pW zlJ9h6X4<+bG3On=%?_VBToh`x0yg)jA@5T_nja`TrP!l$rJQX$GB?b!mcGVfZy@A! zg`TBj2%HNHF`lsGWS%vQ%AVaXw(y6Jm&ztU&JDmhfbOFxgIfhq+X4n$+g9AtKJ9rq zTAg_hYueR8T!#8c?oKTou4^A{uDvb3pC2NXox5CSSIor+S9mM)VK0$tleBz+`}qaK z8L_jzeHCV@Tf#DN7c-3$Fdi)iUcpv=e=f)N>nGt8YmF60M&_#Nurnt^?km7+jQP*u z`wyO`F?lB6Ul4rXhFkSBWQ+vpJ8#9iZpHh5Y7;^20+NBeIU)X3*LcQDrd8kfv;ZmFY zcd}EtYs;_9r5gU<0{#Pe{Yr3sKvy61q(sU&L+59NFE^D5Mlx8T9GOkTczMS}gn zy>SaQB2Ue%Rc;h@SmE|QQ>?0)STPK;Q5%UYfZ9;WWTo;pAJp!MIf&;!MTfVHmKnMy zLb<#&=bZ8r>0-Z$Id9eEwHFuH+aIKmTjBORSFF+|vEpl_9R~ds0y4YUy85nrT|X~q zSz}1$=PpfxPNniw-74#va;kez@mznHf_)P9RYv^Pxsy`e{1>Ec z(wWS6e($`)_NM1wXp|$ zG37wZ(gNTTK=*YuX1k``KDD^~z=o?5`?ao5PV?C0d}Ei61>fm|=N9$o@Wrq>688s} zt-x)7@}T`yV`Zti?GNqG-lE*xLtSM}aF4m;R@?ks{5Devo-S5U5J+3HjoD zoXhHWZ7xm8UkRBDU_1C1ZE$gkh_RLsz-Q~>J|1|GCfnx%YM(N4}uy3HFjDxE4#S) z5eI&YMRm64L$$@5ZmGI#=eJtF^KzRlzn@myu`lMcm3sq6fr_DHv4*iz!B<931*6Se z@{BE9GDjQ?ykZy_eA3?6mu13aMvY-H!rBM<1vYCu+Z+{`uMxDh@em9)TO(Xy=qU8Z zdnrDU0ld*(RT{f%U!*(UJ7v)KXLtwooEhYQ65k&5I(_nl5xyr~@4Io$NmJnm@4Ymq ztQRb@a1})2ebNj3UR^QLmD<%%SKC2!Y5Q)DhyUUInez9K)W)F{?~n3egO!5cIPiqs z$rt!eYK!v4%vGRn?JgXH?@;c54HC6Ks(H7obWYR1Ow$iId_a-D)P_gtU8o4ZGjIkr zFB2JlKF!J#)3wFwlhz7`!G`M;IA`u-3OH(gCU|$Fd11Wcttxo`hHvKQHj#Eq z)2Huoi}AhR_;`+QPeu7sb`AICsoLy)+sS5g@nYjOf+(aL0xEooAnaqC*bvO%L;4_%?j$j2zaYLAAL1WvlA3UN6TQ+do+6$u$mp zonR4|GsAXIfti`R;CGb6G^AGoR8gBe*o<8=aw=MCu_pT`R`?|YPH5O~cyD_d@0)An zK)NEl!_A0g`}tqzY+GE!n(=ED!}Jo?$}*~1HeSy|=GBbJ%$Zr8Ou}AA(X~{7z5^_U z9M=pOS$iiQdSh&{xzGk_hoU|{LE1Yk+=|9e-SDjK!e8&HdF@Nm{QbbmFN6Go#=|aR z2g;cMx-LaoI~&K`>+&*e**qa@(&1`+`xEP?rGN|{tverGW=Z@V)1=`$Yd2==4;gntk>g_*2@Ocr!vrW^DI+V<{Ha`c{OY6 z%K4{!el=`c*F4VRX;m!CKd|17cbYW4ckdtM=@(RmnAizJEY)>cuUjMjWq|bkEL>&& z(sR5MDKUo)gRxIelXJ$qLH4ah3=12ilUFC*ns*@b`ztF$j9Vk0HIU}YhSHVatA?NF z#;mOIdVV=IWk#8^^7#$sGSvcx_4i2Q2~d~2vJ5M$LkuYQCew!>e8V~G`_Z9If1`~T zF;DePC{5qslcf*-c?O&;n;(zmHMl;j%>PpK+*U;qv&`}C>~&N8D;S2Y>357!#_f;> zwdJ67uU7tJ&AI?c8WovqG~iTzlj|M+rxN6+q;A8NH0`aO^L(M3R=d@v}3d<#pM z#;viwuYzv?e=pT>?J`K;CFYrMGX1op^K3g@Dl^x*Qakjr>{?0hJc;wy4$tI-?6 zx(_hVGo@v0n)pJw99~MK)MdA3`pcV4A8UV)XQr)RVSjl^gWMIeV2xfK-*6Zv zm!bGQGBk@n>O&dQemX7HW5E=jbEEHQ6zNk}m3~KqFP;dT0Yr_+&?JA9%W8bjCUySR z&8`#q&YdliTd)_BCsswebe-7~NCAof0U^&u~v%M4{Lf<4!W*KWufml<>gOW{)I@h5c}Kz!kS$$V4};l@BXRQ>{|1y+o

zdtg1tNQGB6Nu5`)SA&*dM_2Qmt-JcuUZV30V#t+;b>Z5p@8|@z&ids^Jy?Dv8B^oRx7+^i3 zH(go)G%|o>EH_YiV;O;hXk^HqQXh4JXWlCK2Y<=(aPX}`L470cj#%d~!19EbG|fVd zI=}DUhtR{Y$yu7z8=2((T-DC)MVIMopY+;x;L`A22Tu0hb>MiDp$(i%R42L%>@c1_ zhjDeL&MM*k0|x@5sl6y{F!}f$oMp^L=Bp;_i`v7c(+A;d_AKZ)2%qfV7Z5||8*)@( zEg&k=cXz$@ZtOXsYY4UGGYJ28o$xfCYS`T#PYnK5L&g?A$9y=qzuC5eReFwsbi|?9 z?@C<^n$%)_t5s%rf!=*Ysnyrp;Y&?*OIo3wAjYaFQo`Cs;z;E)pe~0+^ zpBW$Md&G~{SNP@n%teuw8E*M&?)=P9C1dQDPL7IaI+-;a&?~)*E38 ztd!K~-u*4`LuTm5v(+oyZ@kb)|y7d(QzB z{TQ{=xHgKrHWcj_Z95hHcbQGH{fW@nIbSPe>v6VNjqs|&;h&B{6yd4+WE9sUMk%Z` z4)i+-zsAk0DL*uxc9+ZA!~ZdWrmKjfZun{ozB7M1*RhWxZDm(Ixv~|)EN`E%B^_?ZQAf&4{FQ%+jJl|VEl0It{=wpw$#`kDW_S6oX!A~ gWV*JC7S3DV%F)I~+CU}CTpETxqo96i7#jBf0r<{^uK)l5 literal 0 HcmV?d00001 diff --git a/SunnyUI.sln b/SunnyUI.sln new file mode 100644 index 00000000..00447970 --- /dev/null +++ b/SunnyUI.sln @@ -0,0 +1,34 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29201.188 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SunnyUI", "SunnyUI\SunnyUI.csproj", "{AB1CB247-E20B-4CBE-B269-570ADDD96C53}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SunnyUI.Demo", "SunnyUI.Demo\SunnyUI.Demo.csproj", "{17F96B36-7CAE-4692-8B1F-B802482ECD09}" + ProjectSection(ProjectDependencies) = postProject + {AB1CB247-E20B-4CBE-B269-570ADDD96C53} = {AB1CB247-E20B-4CBE-B269-570ADDD96C53} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {AB1CB247-E20B-4CBE-B269-570ADDD96C53}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AB1CB247-E20B-4CBE-B269-570ADDD96C53}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AB1CB247-E20B-4CBE-B269-570ADDD96C53}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AB1CB247-E20B-4CBE-B269-570ADDD96C53}.Release|Any CPU.Build.0 = Release|Any CPU + {17F96B36-7CAE-4692-8B1F-B802482ECD09}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {17F96B36-7CAE-4692-8B1F-B802482ECD09}.Debug|Any CPU.Build.0 = Debug|Any CPU + {17F96B36-7CAE-4692-8B1F-B802482ECD09}.Release|Any CPU.ActiveCfg = Release|Any CPU + {17F96B36-7CAE-4692-8B1F-B802482ECD09}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {F0698DDC-7858-40F2-8BCA-9DA655EBF385} + EndGlobalSection +EndGlobal diff --git a/SunnyUI/Controls/DropItem/UIComboBoxItem.Designer.cs b/SunnyUI/Controls/DropItem/UIComboBoxItem.Designer.cs new file mode 100644 index 00000000..3219bdd0 --- /dev/null +++ b/SunnyUI/Controls/DropItem/UIComboBoxItem.Designer.cs @@ -0,0 +1,70 @@ +namespace Sunny.UI +{ + partial class UIComboBoxItem + { + ///

+ /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.listBox = new Sunny.UI.UIListBox(); + this.SuspendLayout(); + // + // listBox + // + this.listBox.BackColor = System.Drawing.Color.Transparent; + this.listBox.Dock = System.Windows.Forms.DockStyle.Fill; + this.listBox.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.listBox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(32)))), ((int)(((byte)(32)))), ((int)(((byte)(32))))); + this.listBox.ItemSelectBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(158)))), ((int)(((byte)(255))))); + this.listBox.ItemSelectForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.listBox.Location = new System.Drawing.Point(0, 0); + this.listBox.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.listBox.Name = "listBox"; + this.listBox.Padding = new System.Windows.Forms.Padding(2); + this.listBox.Radius = 0; + this.listBox.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(158)))), ((int)(((byte)(255))))); + this.listBox.Size = new System.Drawing.Size(184, 210); + this.listBox.Style = Sunny.UI.UIStyle.Custom; + this.listBox.TabIndex = 3; + this.listBox.Text = null; + this.listBox.ItemClick += new System.EventHandler(this.ListBox_Click); + this.listBox.SelectedIndexChanged += new System.EventHandler(this.listBox_SelectedIndexChanged); + // + // UIComboBoxItem + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.listBox); + this.Name = "UIComboBoxItem"; + this.Size = new System.Drawing.Size(184, 210); + this.ResumeLayout(false); + + } + + #endregion + + private UIListBox listBox; + } +} diff --git a/SunnyUI/Controls/DropItem/UIComboBoxItem.cs b/SunnyUI/Controls/DropItem/UIComboBoxItem.cs new file mode 100644 index 00000000..382507a2 --- /dev/null +++ b/SunnyUI/Controls/DropItem/UIComboBoxItem.cs @@ -0,0 +1,73 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UIComboBoxItem.cs + * 文件说明: 组合框弹出窗体 + * 当前版本: V2.2 + * 创建日期: 2020-01-01 + * + * 2020-01-01: V2.2.0 增加文件说明 +******************************************************************************/ + +using System; +using System.Drawing; + +namespace Sunny.UI +{ + /// + /// 组合框弹出窗体 + /// + public partial class UIComboBoxItem : UIDropDownItem + { + /// + /// 构造函数 + /// + public UIComboBoxItem() + { + InitializeComponent(); + } + + /// + /// 列表框 + /// + public UIListBox ListBox => listBox; + + private void ListBox_Click(object sender, EventArgs e) + { + CloseParent(); + } + + /// + /// 设置边框颜色 + /// + /// 颜色 + public override void SetRectColor(Color color) + { + listBox.ItemSelectBackColor = color; + } + + /// + /// 设置填充颜色 + /// + /// 颜色 + public override void SetFillColor(Color color) + { + ListBox.ItemSelectForeColor = color; + } + + private void listBox_SelectedIndexChanged(object sender, EventArgs e) + { + DoValueChanged(this, ListBox.SelectedValue); + } + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/DropItem/UIComboBoxItem.resx b/SunnyUI/Controls/DropItem/UIComboBoxItem.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/SunnyUI/Controls/DropItem/UIComboBoxItem.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SunnyUI/Controls/DropItem/UIDateTimeItem.Designer.cs b/SunnyUI/Controls/DropItem/UIDateTimeItem.Designer.cs new file mode 100644 index 00000000..9cbd45be --- /dev/null +++ b/SunnyUI/Controls/DropItem/UIDateTimeItem.Designer.cs @@ -0,0 +1,61 @@ +namespace Sunny.UI +{ + partial class UIDateTimeControl + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.monthCalendar = new System.Windows.Forms.MonthCalendar(); + this.SuspendLayout(); + // + // monthCalendar + // + this.monthCalendar.ForeColor = System.Drawing.SystemColors.WindowText; + this.monthCalendar.Location = new System.Drawing.Point(0, 0); + this.monthCalendar.Margin = new System.Windows.Forms.Padding(15, 16, 15, 16); + this.monthCalendar.MaxSelectionCount = 1; + this.monthCalendar.Name = "monthCalendar"; + this.monthCalendar.TabIndex = 2; + this.monthCalendar.DateChanged += new System.Windows.Forms.DateRangeEventHandler(this.monthCalendar_DateChanged); + this.monthCalendar.DateSelected += new System.Windows.Forms.DateRangeEventHandler(this.monthCalendar_DateSelected); + // + // UIDateTimeControl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.monthCalendar); + this.Margin = new System.Windows.Forms.Padding(7, 9, 7, 9); + this.Name = "UIDateTimeControl"; + this.Size = new System.Drawing.Size(220, 180); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.MonthCalendar monthCalendar; + } +} diff --git a/SunnyUI/Controls/DropItem/UIDateTimeItem.cs b/SunnyUI/Controls/DropItem/UIDateTimeItem.cs new file mode 100644 index 00000000..9929a5af --- /dev/null +++ b/SunnyUI/Controls/DropItem/UIDateTimeItem.cs @@ -0,0 +1,54 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UIDateTimeItem.cs + * 文件说明: 日期选择框弹出窗体 + * 当前版本: V2.2 + * 创建日期: 2020-01-01 + * + * 2020-01-01: V2.2.0 增加文件说明 +******************************************************************************/ + +using System.Windows.Forms; + +namespace Sunny.UI +{ + /// + /// 日期选择框弹出窗体 + /// + public partial class UIDateTimeControl : UIDropDownItem + { + /// + /// 构造函数 + /// + public UIDateTimeControl() + { + InitializeComponent(); + } + + private void monthCalendar_DateChanged(object sender, DateRangeEventArgs e) + { + } + + private void monthCalendar_DateSelected(object sender, DateRangeEventArgs e) + { + DoValueChanged(this, monthCalendar.SelectionStart); + CloseParent(); + } + + /// + /// 日期选择控件 + /// + public MonthCalendar MonthCalendar => monthCalendar; + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/DropItem/UIDropControl.Designer.cs b/SunnyUI/Controls/DropItem/UIDropControl.Designer.cs new file mode 100644 index 00000000..45a9fd3b --- /dev/null +++ b/SunnyUI/Controls/DropItem/UIDropControl.Designer.cs @@ -0,0 +1,46 @@ +namespace Sunny.UI +{ + partial class UIDropControl + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + SuspendLayout(); + // + // UIDropControl + // + AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + MinimumSize = new System.Drawing.Size(63, 0); + Name = "UIDropControl"; + Size = new System.Drawing.Size(150, 29); + ResumeLayout(false); + + } + + #endregion + } +} diff --git a/SunnyUI/Controls/DropItem/UIDropControl.cs b/SunnyUI/Controls/DropItem/UIDropControl.cs new file mode 100644 index 00000000..512356d9 --- /dev/null +++ b/SunnyUI/Controls/DropItem/UIDropControl.cs @@ -0,0 +1,305 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UIDropControl.cs + * 文件说明: 下拉框基类 + * 当前版本: V2.2 + * 创建日期: 2020-01-01 + * + * 2020-01-01: V2.2.0 增加文件说明 + * 2020-04-25: V2.2.4 更新主题配置类 +******************************************************************************/ + +using System; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms; + +namespace Sunny.UI +{ + public enum UIDropDownStyle + { + DropDown, + DropDownList + } + + public enum UIDropItemPos + { + Top, + Bottom + } + + [ToolboxItem(false)] + public partial class UIDropControl : UIPanel + { + public UIDropControl() + { + InitializeComponent(); + + edit.Font = UIFontColor.Font; + edit.Left = 3; + edit.Top = 3; + edit.Text = String.Empty; + edit.ForeColor = UIFontColor.Primary; + edit.BorderStyle = BorderStyle.None; + edit.KeyDown += EditOnKeyDown; + edit.TextChanged += EditTextChanged; + edit.Invalidate(); + Controls.Add(edit); + + TextAlignment = ContentAlignment.MiddleLeft; + fillColor = Color.White; + edit.BackColor = Color.White; + } + + private UIDropDown itemForm; + + protected UIDropDown ItemForm + { + get + { + if (itemForm == null) + { + CreateInstance(); + + if (itemForm != null) + { + itemForm.ValueChanged += ItemForm_ValueChanged; + itemForm.VisibleChanged += ItemForm_VisibleChanged; + } + } + + return itemForm; + } + set => itemForm = value; + } + + private void ItemForm_VisibleChanged(object sender, EventArgs e) + { + dropSymbol = 61703; + + if (itemForm != null && itemForm.Visible) + { + dropSymbol = 61702; + } + + Invalidate(); + } + + protected virtual void CreateInstance() + { + } + + protected virtual void ItemForm_ValueChanged(object sender, object value) + { + } + + protected virtual int CalcItemFormHeight() + { + return 200; + } + + private UIDropDownStyle _dropDownStyle = UIDropDownStyle.DropDown; + + [DefaultValue(UIDropDownStyle.DropDown)] + public UIDropDownStyle DropDownStyle + { + get => _dropDownStyle; + set + { + if (_dropDownStyle != value) + { + _dropDownStyle = value; + edit.Visible = value == UIDropDownStyle.DropDown; + Invalidate(); + } + } + } + + [DefaultValue(UIDropItemPos.Bottom)] + public UIDropItemPos DropItemPos { get; set; } = UIDropItemPos.Bottom; + + public event EventHandler ButtonClick; + + private readonly TextBox edit = new TextBox(); + + protected override void OnTextChanged(EventArgs e) + { + base.OnTextChanged(e); + edit.Text = Text; + Invalidate(); + } + + private void EditTextChanged(object s, EventArgs e) + { + Text = edit.Text; + } + + protected override void OnFontChanged(EventArgs e) + { + base.OnFontChanged(e); + edit.Font = Font; + Invalidate(); + } + + protected override void OnSizeChanged(EventArgs e) + { + SizeChange(); + } + + private void SizeChange() + { + TextBox edt = new TextBox(); + edt.Font = edit.Font; + edt.Invalidate(); + Height = edt.Height; + edt.Dispose(); + + edit.Top = (Height - edit.Height) / 2; + edit.Left = 3; + edit.Width = Width - 30; + } + + protected override void OnPaintFore(Graphics g, GraphicsPath path) + { + SizeChange(); + + if (!edit.Visible) + { + base.OnPaintFore(g, path); + } + } + + private int dropSymbol = 61703; + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + Padding = new Padding(0, 0, 30, 0); + e.Graphics.FillRoundRectangle(GetFillColor(), new Rectangle(Width - 27, edit.Top, 25, edit.Height), Radius); + Color color = GetRectColor(); + SizeF sf = e.Graphics.GetFontImageSize(dropSymbol, 24); + e.Graphics.DrawFontImage(dropSymbol, 24, color, Width - 28 + (12 - sf.Width / 2.0f), (Height - sf.Height) / 2.0f); + } + + private void EditOnKeyDown(object Obj, KeyEventArgs e) + { + if (e.Control && e.KeyCode == Keys.A) + { + edit.SelectAll(); + e.SuppressKeyPress = true; + } + + if (e.Control && e.KeyCode == Keys.C) + { + edit.Copy(); + e.SuppressKeyPress = true; + } + + if (e.Control && e.KeyCode == Keys.V) + { + edit.Paste(); + e.SuppressKeyPress = true; + } + } + + protected override void OnGotFocus(EventArgs e) + { + base.OnGotFocus(e); + edit.Focus(); + } + + public void Clear() + { + edit.Clear(); + } + + [DefaultValue('\0')] + public char PasswordChar + { + get => edit.PasswordChar; + set => edit.PasswordChar = value; + } + + [DefaultValue(false)] + public bool ReadOnly + { + get => edit.ReadOnly; + set + { + edit.ReadOnly = value; + edit.BackColor = Color.White; + } + } + + [CategoryAttribute("文字"), Browsable(true)] + [DefaultValue("")] + public override string Text + { + get => edit.Text; + set => edit.Text = value; + } + + public bool IsEmpty => edit.Text == ""; + + protected override void OnMouseDown(MouseEventArgs e) + { + ActiveControl = edit; + } + + [DefaultValue(32767)] + public int MaxLength + { + get => edit.MaxLength; + set => edit.MaxLength = Math.Max(value, 1); + } + + public override void SetStyleColor(UIBaseStyle uiColor) + { + base.SetStyleColor(uiColor); + if (uiColor.IsCustom()) return; + + foreColor = uiColor.DropDownControlColor; + edit.BackColor = fillColor = Color.White; + Invalidate(); + } + + protected override void AfterSetFillColor(Color color) + { + base.AfterSetFillColor(color); + edit.BackColor = fillColor; + } + + protected override void AfterSetForeColor(Color color) + { + base.AfterSetForeColor(color); + edit.ForeColor = foreColor; + } + + protected override void OnClick(EventArgs e) + { + if (!ReadOnly) + { + if (ItemForm != null) + { + ItemForm.SetRectColor(rectColor); + ItemForm.SetFillColor(fillColor); + ItemForm.SetForeColor(foreColor); + } + + ButtonClick?.Invoke(this, e); + } + } + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/DropItem/UIDropControl.resx b/SunnyUI/Controls/DropItem/UIDropControl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/SunnyUI/Controls/DropItem/UIDropControl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SunnyUI/Controls/DropItem/UIDropDown.cs b/SunnyUI/Controls/DropItem/UIDropDown.cs new file mode 100644 index 00000000..137d2e18 --- /dev/null +++ b/SunnyUI/Controls/DropItem/UIDropDown.cs @@ -0,0 +1,324 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UIDropDown.cs + * 文件说明: 下拉框弹出窗体控制类 + * 当前版本: V2.2 + * 创建日期: 2020-01-01 + * + * 2020-01-01: V2.2.0 增加文件说明 +******************************************************************************/ + +using System; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace Sunny.UI +{ + /// + /// 下拉框弹出窗体控制类 + /// + [ToolboxItem(false)] + public sealed class UIDropDown : ToolStripDropDown + { + private IContainer components; + + /// + /// 析构函数 + /// + /// disposing + protected override void Dispose(bool disposing) + { + if (disposing) + { + components?.Dispose(); + + if (Item != null) + { + UIDropDownItem _content = Item; + Item = null; + _content.Dispose(); + } + } + + base.Dispose(disposing); + } + + private void InitializeComponent() + { + components = new Container(); + } + + private UIDropDownItem Item; + private Control OpenItem; + + /// + /// 数值切换事件 + /// + /// sender + /// 数值 + public delegate void OnValueChanged(object sender, object value); + + /// + /// 数值切换事件 + /// + public event OnValueChanged ValueChanged; + + private void DoValueChanged(object sender, object value) + { + ValueChanged?.Invoke(sender, value); + } + + /// + /// 构造函数 + /// + /// 下拉框弹出窗体基类 + public UIDropDown(UIDropDownItem item) + { + Item = item ?? throw new ArgumentNullException(nameof(item)); + Item.ValueChanged += DoValueChanged; + + InitializeComponent(); + AutoSize = false; + DoubleBuffered = true; + ResizeRedraw = true; + ToolStripControlHost _host = new ToolStripControlHost(item); + Padding = Margin = _host.Padding = _host.Margin = Padding.Empty; + item.MinimumSize = item.Size; + item.MaximumSize = item.Size; + Size = item.Size; + TabStop = item.TabStop = true; + item.Location = Point.Empty; + Items.Add(_host); + item.Disposed += (sender, e) => + { + item = null; + Dispose(true); + }; + + item.RegionChanged += (sender, e) => UpdateRegion(); + UpdateRegion(); + } + + private void UpdateRegion() + { + if (Region != null) + { + Region.Dispose(); + Region = null; + } + + if (Item.Region != null) + { + Region = Item.Region.Clone(); + } + } + + /// + /// 显示 + /// + /// Control + public void Show(Control control) + { + if (control == null) + { + throw new ArgumentNullException(nameof(control)); + } + + Show(control, control.ClientRectangle); + } + + /// + /// 显示 + /// + /// Control + /// 大小 + public void Show(Control control, Size size) + { + Size = size; + Show(control); + } + + /// + /// 显示 + /// + /// 区域 + public void Show(Rectangle area) + { + Point location = new Point(area.Left, area.Top + area.Height); + Rectangle screen = Screen.FromControl(this).WorkingArea; + if (location.X + Size.Width > (screen.Left + screen.Width)) + { + location.X = (screen.Left + screen.Width) - Size.Width; + } + + if (location.Y + Size.Height > (screen.Top + screen.Height)) + { + location.Y -= Size.Height + area.Height; + } + + Show(location, ToolStripDropDownDirection.BelowRight); + } + + /// + /// 显示 + /// + /// Control + /// 区域 + public void Show(Control control, Rectangle area) + { + if (control == null) + { + throw new ArgumentNullException(nameof(control)); + } + + SetOwnerItem(control); + + Point location = control.PointToScreen(new Point(area.Left, area.Top + area.Height)); + Rectangle screen = Screen.FromControl(control).WorkingArea; + if (location.X + Size.Width > (screen.Left + screen.Width)) + { + location.X = (screen.Left + screen.Width) - Size.Width; + } + + if (location.Y + Size.Height > (screen.Top + screen.Height)) + { + location.Y -= Size.Height + area.Height; + } + + location = control.PointToClient(location); + Show(control, location, ToolStripDropDownDirection.BelowRight); + } + + private void SetOwnerItem(Control control) + { + if (control == null) + { + return; + } + + if (control is UIDropDown ctrl) + { + OwnerItem = ctrl.Items[0]; + return; + } + else if (OpenItem == null) + { + OpenItem = control; + } + + if (control.Parent != null) + { + SetOwnerItem(control.Parent); + } + } + + /// + /// OnSizeChanged + /// + /// e + protected override void OnSizeChanged(EventArgs e) + { + if (Item != null) + { + Item.MinimumSize = Size; + Item.MaximumSize = Size; + Item.Size = Size; + Item.Location = Point.Empty; + } + + base.OnSizeChanged(e); + } + + /// + /// OnLayout + /// + /// e + protected override void OnLayout(LayoutEventArgs e) + { + Size suggestedSize = GetPreferredSize(Size.Empty); + if (AutoSize && suggestedSize != Size) + { + Size = suggestedSize; + } + + SetDisplayedItems(); + OnLayoutCompleted(EventArgs.Empty); + Invalidate(); + } + + /// + /// OnOpening + /// + /// e + protected override void OnOpening(CancelEventArgs e) + { + if (Item.IsDisposed || Item.Disposing) + { + e.Cancel = true; + return; + } + + UpdateRegion(); + base.OnOpening(e); + } + + /// + /// OnOpened + /// + /// e + protected override void OnOpened(EventArgs e) + { + Item.Focus(); + base.OnOpened(e); + } + + /// + /// OnClosed + /// + /// e + protected override void OnClosed(ToolStripDropDownClosedEventArgs e) + { + OpenItem = null; + base.OnClosed(e); + } + + /// + /// 设置边框颜色 + /// + /// 颜色 + public void SetRectColor(Color color) + { + Item?.SetRectColor(color); + } + + /// + /// 设置填充颜色 + /// + /// 颜色 + public void SetFillColor(Color color) + { + Item?.SetFillColor(color); + } + + /// + /// 设置字体颜色 + /// + /// 颜色 + public void SetForeColor(Color color) + { + Item?.SetForeColor(color); + } + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/DropItem/UIDropDownItem.Designer.cs b/SunnyUI/Controls/DropItem/UIDropDownItem.Designer.cs new file mode 100644 index 00000000..8b0ba6f6 --- /dev/null +++ b/SunnyUI/Controls/DropItem/UIDropDownItem.Designer.cs @@ -0,0 +1,43 @@ +namespace Sunny.UI +{ + partial class UIDropDownItem + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // UIDropDownItem + // + this.Name = "UIDropDownItem"; + this.RadiusSides = Sunny.UI.UICornerRadiusSides.None; + this.ResumeLayout(false); + + } + + #endregion + } +} diff --git a/SunnyUI/Controls/DropItem/UIDropDownItem.cs b/SunnyUI/Controls/DropItem/UIDropDownItem.cs new file mode 100644 index 00000000..145fd18d --- /dev/null +++ b/SunnyUI/Controls/DropItem/UIDropDownItem.cs @@ -0,0 +1,96 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UIDropDownItem.cs + * 文件说明: 下拉框弹出窗体基类 + * 当前版本: V2.2 + * 创建日期: 2020-01-01 + * + * 2020-01-01: V2.2.0 增加文件说明 +******************************************************************************/ + +using System.ComponentModel; +using System.Drawing; + +namespace Sunny.UI +{ + /// + /// 下拉框弹出窗体基类 + /// + [ToolboxItem(false)] + public partial class UIDropDownItem : UIPanel + { + /// + /// 构造函数 + /// + public UIDropDownItem() + { + InitializeComponent(); + } + + /// + /// 数值切换事件定义 + /// + /// sender + /// 数值 + public delegate void OnValueChanged(object sender, object value); + + /// + /// 数值切换事件 + /// + public event OnValueChanged ValueChanged; + + /// + /// 数值切换事件 + /// + /// sender + /// 数值 + protected void DoValueChanged(object sender, object value) + { + ValueChanged?.Invoke(sender, value); + } + + /// + /// 设置边框颜色 + /// + /// 颜色 + public virtual void SetRectColor(Color color) + { + } + + /// + /// 设置填充颜色 + /// + /// 颜色 + public virtual void SetFillColor(Color color) + { + } + + /// + /// 设置字体颜色 + /// + /// 颜色 + public virtual void SetForeColor(Color color) + { + } + + /// + /// 关闭弹出窗口 + /// + protected void CloseParent() + { + UIDropDown parent = (UIDropDown)Parent; + parent?.Close(); + } + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/TypeEditor/UIDropEditor.cs b/SunnyUI/Controls/TypeEditor/UIDropEditor.cs new file mode 100644 index 00000000..7a72bf17 --- /dev/null +++ b/SunnyUI/Controls/TypeEditor/UIDropEditor.cs @@ -0,0 +1,104 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UIDropEditor.cs + * 文件说明: 控件属性编辑面板基类 + * 当前版本: V2.2 + * 创建日期: 2020-01-01 + * + * 2020-01-01: V2.2.0 增加文件说明 +******************************************************************************/ + +using System; +using System.ComponentModel; +using System.Drawing.Design; +using System.Security.Permissions; +using System.Windows.Forms; +using System.Windows.Forms.Design; + +namespace Sunny.UI +{ + /// + /// 提供设置的编辑器 属性。 + /// + [SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode)] + public abstract class UIDropEditor : UITypeEditor + { + protected UIDropEditorUI EditorUI; + + public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) + { + if (provider != null) + { + IWindowsFormsEditorService service = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService)); + if (service != null) + { + if (EditorUI == null) + { + EditorUI = CreateUI(); + } + + EditorUI.Start(service, value); + service.DropDownControl(EditorUI); + if (EditorUI.Value != null) + { + value = EditorUI.Value; + } + + EditorUI.End(); + } + } + + return value; + } + + protected abstract UIDropEditorUI CreateUI(); + + public override UITypeEditorEditStyle GetEditStyle( + ITypeDescriptorContext context) + { + return UITypeEditorEditStyle.DropDown; + } + } + + public abstract class UIDropEditorUI : UserControl + { + private IWindowsFormsEditorService edSvc; + + protected object currentValue; + protected bool updateCurrentValue; + + public object Value => currentValue; + + public IWindowsFormsEditorService EditorService => edSvc; + + public void Start(IWindowsFormsEditorService editorService, object value) + { + edSvc = editorService; + currentValue = value; + InitValue(value); + updateCurrentValue = true; + } + + protected abstract void InitValue(object value); + + protected abstract void UpdateCurrentValue(); + + public void End() + { + edSvc = null; + currentValue = null; + updateCurrentValue = false; + } + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/TypeEditor/UIRadiusSidesEditor.cs b/SunnyUI/Controls/TypeEditor/UIRadiusSidesEditor.cs new file mode 100644 index 00000000..280346e6 --- /dev/null +++ b/SunnyUI/Controls/TypeEditor/UIRadiusSidesEditor.cs @@ -0,0 +1,402 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UIRadiusSidesEditor.cs + * 文件说明: 边框属性类 + * 当前版本: V2.2 + * 创建日期: 2020-01-01 + * + * 2020-01-01: V2.2.0 增加文件说明 +******************************************************************************/ + +using System; +using System.ComponentModel; +using System.Drawing; +using System.Runtime.InteropServices; +using System.Security.Permissions; +using System.Windows.Forms; +using System.Windows.Forms.Design; + +namespace Sunny.UI +{ + /// + /// 圆角位置 + /// + [ComVisible(true)] + [Editor(typeof(UIRadiusSidesEditor), typeof(System.Drawing.Design.UITypeEditor))] + [Flags] + public enum UICornerRadiusSides + { + /// + /// 四个角都有圆角。 + /// + All = 15, // 0x0000000F + + /// + /// 左下角有圆角 + /// + LeftBottom = 8, + + /// + /// 左上角有圆角 + /// + LeftTop = 1, + + /// + /// 右下角有圆角 + /// + RightBottom = 4, + + /// + /// 右上角有圆角 + /// + RightTop = 2, + + /// + /// 没有圆角 + /// + None = 0, + } + + /// + /// 提供设置的编辑器 属性。 + /// + [SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode)] + public class UIRadiusSidesEditor : UIDropEditor + { + /// + /// 创建窗体 + /// + /// 窗体 + protected override UIDropEditorUI CreateUI() + { + return new UICornerRadiusSidesUI(); + } + + /// + /// 属性窗体 + /// + public class UICornerRadiusSidesUI : UIDropEditorUI + { + private TableLayoutPanel tableLayoutPanel1; + private CheckBox allCheckBox; + private CheckBox noneCheckBox; + private CheckBox leftTopCheckBox; + private CheckBox rightTopCheckBox; + private CheckBox rightBottomCheckBox; + private CheckBox leftBottomCheckBox; + private Label splitterLabel; + private bool allChecked; + private bool noneChecked; + + /// + /// 构造函数 + /// + public UICornerRadiusSidesUI() + { + End(); + InitializeComponent(); + Size = PreferredSize; + } + + /// + /// 初始化数值 + /// + /// 数值 + protected override void InitValue(object value) + { + Console.WriteLine(value.ToString()); + UICornerRadiusSides sides = (UICornerRadiusSides)value; + ResetCheckBoxState(); + if ((sides & UICornerRadiusSides.All) == UICornerRadiusSides.All) + { + allCheckBox.Checked = true; + leftTopCheckBox.Checked = true; + rightTopCheckBox.Checked = true; + rightBottomCheckBox.Checked = true; + leftBottomCheckBox.Checked = true; + allCheckBox.Checked = true; + } + else + { + noneCheckBox.Checked = sides == UICornerRadiusSides.None; + leftTopCheckBox.Checked = (sides & UICornerRadiusSides.LeftTop) == UICornerRadiusSides.LeftTop; + rightTopCheckBox.Checked = (sides & UICornerRadiusSides.RightTop) == UICornerRadiusSides.RightTop; + rightBottomCheckBox.Checked = (sides & UICornerRadiusSides.RightBottom) == UICornerRadiusSides.RightBottom; + leftBottomCheckBox.Checked = (sides & UICornerRadiusSides.LeftBottom) == UICornerRadiusSides.LeftBottom; + } + } + + /// + /// 更新当前值 + /// + protected override void UpdateCurrentValue() + { + if (!updateCurrentValue) + return; + UICornerRadiusSides labelBorderSides = UICornerRadiusSides.None; + if (allCheckBox.Checked) + { + currentValue = labelBorderSides | UICornerRadiusSides.All; + allChecked = true; + noneChecked = false; + } + else + { + if (noneCheckBox.Checked) + labelBorderSides |= UICornerRadiusSides.None; + + if (leftTopCheckBox.Checked) + labelBorderSides |= UICornerRadiusSides.LeftTop; + + if (rightTopCheckBox.Checked) + labelBorderSides |= UICornerRadiusSides.RightTop; + + if (rightBottomCheckBox.Checked) + labelBorderSides |= UICornerRadiusSides.RightBottom; + + if (leftBottomCheckBox.Checked) + labelBorderSides |= UICornerRadiusSides.LeftBottom; + + if (labelBorderSides == UICornerRadiusSides.None) + { + allChecked = false; + noneChecked = true; + noneCheckBox.Checked = true; + } + + if (labelBorderSides == UICornerRadiusSides.All) + { + allChecked = true; + noneChecked = false; + allCheckBox.Checked = true; + } + + currentValue = labelBorderSides; + } + } + + /// + /// 激活 + /// + /// + protected override void OnGotFocus(EventArgs e) + { + base.OnGotFocus(e); + noneCheckBox.Focus(); + } + + private void InitializeComponent() + { + ComponentResourceManager componentResourceManager = new ComponentResourceManager(typeof(BorderSidesEditor)); + Height = 163; + tableLayoutPanel1 = new TableLayoutPanel(); + noneCheckBox = new CheckBox(); + allCheckBox = new CheckBox(); + leftTopCheckBox = new CheckBox(); + rightTopCheckBox = new CheckBox(); + leftBottomCheckBox = new CheckBox(); + rightBottomCheckBox = new CheckBox(); + splitterLabel = new Label(); + tableLayoutPanel1.SuspendLayout(); + SuspendLayout(); + componentResourceManager.ApplyResources(tableLayoutPanel1, "tableLayoutPanel1"); + tableLayoutPanel1.AutoSizeMode = AutoSizeMode.GrowAndShrink; + tableLayoutPanel1.BackColor = SystemColors.Window; + tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle()); + tableLayoutPanel1.Controls.Add(noneCheckBox, 0, 0); + tableLayoutPanel1.Controls.Add(allCheckBox, 0, 2); + tableLayoutPanel1.Controls.Add(leftTopCheckBox, 0, 3); + tableLayoutPanel1.Controls.Add(rightTopCheckBox, 0, 4); + tableLayoutPanel1.Controls.Add(leftBottomCheckBox, 0, 5); + tableLayoutPanel1.Controls.Add(rightBottomCheckBox, 0, 6); + tableLayoutPanel1.Controls.Add(splitterLabel, 0, 1); + tableLayoutPanel1.Name = "tableLayoutPanel1"; + tableLayoutPanel1.RowStyles.Add(new RowStyle()); + tableLayoutPanel1.RowStyles.Add(new RowStyle()); + tableLayoutPanel1.RowStyles.Add(new RowStyle()); + tableLayoutPanel1.RowStyles.Add(new RowStyle()); + tableLayoutPanel1.RowStyles.Add(new RowStyle()); + tableLayoutPanel1.RowStyles.Add(new RowStyle()); + tableLayoutPanel1.RowStyles.Add(new RowStyle()); + tableLayoutPanel1.Margin = new Padding(0); + + noneCheckBox.Name = "noneCheckBox"; + noneCheckBox.Margin = new Padding(3, 3, 3, 1); + noneCheckBox.Text = "无(&N)"; + noneCheckBox.Height = 16; + + allCheckBox.Name = "allCheckBox"; + allCheckBox.Margin = new Padding(3, 3, 3, 1); + allCheckBox.Text = "全部(&A)"; + allCheckBox.Height = 16; + + leftTopCheckBox.Margin = new Padding(20, 1, 3, 1); + leftTopCheckBox.Name = "leftTopCheckBox"; + leftTopCheckBox.Text = "左上角(<)"; + leftTopCheckBox.Height = 16; + + rightTopCheckBox.Margin = new Padding(20, 1, 3, 1); + rightTopCheckBox.Name = "rightTopCheckBox"; + rightTopCheckBox.Text = "右上角(&RT)"; + rightTopCheckBox.Height = 16; + + leftBottomCheckBox.Margin = new Padding(20, 1, 3, 1); + leftBottomCheckBox.Name = "leftBottomCheckBox"; + leftBottomCheckBox.Text = "左下角(&LB)"; + leftBottomCheckBox.Height = 16; + + rightBottomCheckBox.Margin = new Padding(20, 1, 3, 1); + rightBottomCheckBox.Name = "rightBottomCheckBox"; + rightBottomCheckBox.Text = "右下角(&RB)"; + rightBottomCheckBox.Height = 16; + + splitterLabel.BackColor = SystemColors.ControlDark; + splitterLabel.Name = "splitterLabel"; + splitterLabel.Height = 1; + + Controls.Add(tableLayoutPanel1); + Padding = new Padding(1, 1, 1, 1); + AutoSizeMode = AutoSizeMode.GrowAndShrink; + AutoScaleMode = AutoScaleMode.Font; + AutoScaleDimensions = new SizeF(6f, 13f); + tableLayoutPanel1.ResumeLayout(false); + tableLayoutPanel1.PerformLayout(); + ResumeLayout(false); + PerformLayout(); + leftBottomCheckBox.CheckedChanged += leftBottomCheckBox_CheckedChanged; + rightBottomCheckBox.CheckedChanged += rightBottomCheckBox_CheckedChanged; + rightTopCheckBox.CheckedChanged += rightTopCheckBox_CheckedChanged; + leftTopCheckBox.CheckedChanged += leftTopBox_CheckedChanged; + noneCheckBox.CheckedChanged += noneCheckBox_CheckedChanged; + allCheckBox.CheckedChanged += allCheckBox_CheckedChanged; + noneCheckBox.Click += noneCheckBoxClicked; + allCheckBox.Click += allCheckBoxClicked; + } + + private void leftBottomCheckBox_CheckedChanged(object sender, EventArgs e) + { + if (((CheckBox)sender).Checked) + noneCheckBox.Checked = false; + else if (allCheckBox.Checked) + allCheckBox.Checked = false; + UpdateCurrentValue(); + } + + private void rightBottomCheckBox_CheckedChanged(object sender, EventArgs e) + { + if (((CheckBox)sender).Checked) + noneCheckBox.Checked = false; + else if (allCheckBox.Checked) + allCheckBox.Checked = false; + UpdateCurrentValue(); + } + + private void rightTopCheckBox_CheckedChanged(object sender, EventArgs e) + { + if (((CheckBox)sender).Checked) + noneCheckBox.Checked = false; + else if (allCheckBox.Checked) + allCheckBox.Checked = false; + UpdateCurrentValue(); + } + + private void leftTopBox_CheckedChanged(object sender, EventArgs e) + { + if (((CheckBox)sender).Checked) + noneCheckBox.Checked = false; + else if (allCheckBox.Checked) + allCheckBox.Checked = false; + UpdateCurrentValue(); + } + + private void noneCheckBox_CheckedChanged(object sender, EventArgs e) + { + if (((CheckBox)sender).Checked) + { + allCheckBox.Checked = false; + leftTopCheckBox.Checked = false; + rightTopCheckBox.Checked = false; + rightBottomCheckBox.Checked = false; + leftBottomCheckBox.Checked = false; + } + UpdateCurrentValue(); + } + + private void allCheckBox_CheckedChanged(object sender, EventArgs e) + { + if (((CheckBox)sender).Checked) + { + noneCheckBox.Checked = false; + leftTopCheckBox.Checked = true; + rightTopCheckBox.Checked = true; + rightBottomCheckBox.Checked = true; + leftBottomCheckBox.Checked = true; + } + UpdateCurrentValue(); + } + + private void noneCheckBoxClicked(object sender, EventArgs e) + { + if (!noneChecked) + return; + noneCheckBox.Checked = true; + } + + private void allCheckBoxClicked(object sender, EventArgs e) + { + if (!allChecked) + return; + allCheckBox.Checked = true; + } + + private void ResetCheckBoxState() + { + allCheckBox.Checked = false; + noneCheckBox.Checked = false; + leftTopCheckBox.Checked = false; + rightTopCheckBox.Checked = false; + rightBottomCheckBox.Checked = false; + leftBottomCheckBox.Checked = false; + } + } + } + + /// + /// 圆角位置属性编辑器帮助类 + /// + public static class UICornerRadiusSidesHelper + { + /// + /// 获取圆角是否设置 + /// + /// 所有圆角 + /// 当前圆角 + /// 是否有当前圆角 + public static bool GetValue(this UICornerRadiusSides sides, UICornerRadiusSides side) + { + return (sides & side) == side; + } + + /// + /// 获取边框是否设置 + /// + /// 所有边框 + /// 当前边框 + /// 是否有当前边框 + public static bool GetValue(this ToolStripStatusLabelBorderSides sides, ToolStripStatusLabelBorderSides side) + { + return (sides & side) == side; + } + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/UIAnalogMeter.cs b/SunnyUI/Controls/UIAnalogMeter.cs new file mode 100644 index 00000000..ea680ab9 --- /dev/null +++ b/SunnyUI/Controls/UIAnalogMeter.cs @@ -0,0 +1,421 @@ +/****************************************************************************** + * SunnyUI Դؼ⡢⡢չ⡢ҳ濪ܡ + * CopyRight (C) 2012-2020 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 can be used for free under the GPL-3.0 license. + * If you use this code, please keep this note. + * ʹô˴룬뱣˵ + ****************************************************************************** + * ļ: UIAnalogMeter.cs + * ļ˵: DZ + * ļ: Luca Bonotto + * ԴЭ: CPOL + * õַ: https://www.codeproject.com/Articles/24945/Analog-Meter +******************************************************************************/ + +/* + * Creato da SharpDevelop. + * Utente: lucabonotto + * Data: 03/04/2008 + * Ora: 14.34 + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ + +using System; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +#pragma warning disable 1591 + +namespace Sunny.UI +{ + /// + /// Class for the analog meter control + /// + [ToolboxItem(true)] + public class UIAnalogMeter : UIControl + { + #region Enumerator + + public enum AnalogMeterStyle + { + Circular = 0, + }; + + #endregion Enumerator + + #region Properties variables + + private AnalogMeterStyle meterStyle; + private Color needleColor; + private Color scaleColor; + private bool viewGlass; + private double currValue; + private double minValue; + private double maxValue; + private int scaleDivisions; + private int scaleSubDivisions; + private LBAnalogMeterRenderer renderer; + + #endregion Properties variables + + #region Class variables + + protected PointF needleCenter; + protected RectangleF drawRect; + protected RectangleF glossyRect; + protected RectangleF needleCoverRect; + protected float startAngle; + protected float endAngle; + protected float drawRatio; + protected LBAnalogMeterRenderer defaultRenderer; + + #endregion Class variables + + #region Costructors + + public UIAnalogMeter() + { + SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.SupportsTransparentBackColor | ControlStyles.UserPaint | ControlStyles.ResizeRedraw | ControlStyles.OptimizedDoubleBuffer | ControlStyles.DoubleBuffer, true); + base.DoubleBuffered = true; + + // Properties initialization + needleColor = Color.Yellow; + scaleColor = Color.White; + meterStyle = AnalogMeterStyle.Circular; + viewGlass = false; + startAngle = 135; + endAngle = 405; + minValue = 0; + maxValue = 100; + currValue = 0; + scaleDivisions = 11; + scaleSubDivisions = 4; + renderer = null; + + // Set the styles for drawing + SetStyle(ControlStyles.DoubleBuffer, true); + SetStyle(ControlStyles.AllPaintingInWmPaint, true); + SetStyle(ControlStyles.UserPaint, true); + + // Create the default renderer + defaultRenderer = new LBDefaultAnalogMeterRenderer(); + defaultRenderer.AnalogMeter = this; + + Width = Height = 180; + } + + #endregion Costructors + + #region Properties + + [ + Category("Appearance"), + Description("Style of the control"), + DefaultValue(AnalogMeterStyle.Circular) + ] + public AnalogMeterStyle MeterStyle + { + get { return meterStyle; } + set + { + meterStyle = value; + Invalidate(); + } + } + + [ + Category("Appearance"), + Description("Color of the body of the control"), + DefaultValue(typeof(Color), "80, 160, 255") + ] + public Color BodyColor + { + get => fillColor; + set => SetFillColor(value); + } + + [ + Category("Appearance"), + Description("Color of the needle"), + DefaultValue(typeof(Color), "Yellow") + ] + public Color NeedleColor + { + get { return needleColor; } + set + { + needleColor = value; + Invalidate(); + } + } + + [ + Category("Appearance"), + Description("Show or hide the glass effect"), + DefaultValue(false) + ] + public bool ViewGlass + { + get { return viewGlass; } + set + { + viewGlass = value; + Invalidate(); + } + } + + [ + Category("Appearance"), + Description("Color of the scale of the control"), + DefaultValue(typeof(Color), "White") + ] + public Color ScaleColor + { + get { return scaleColor; } + set + { + scaleColor = value; + Invalidate(); + } + } + + [ + Category("Behavior"), + Description("Value of the data"), + DefaultValue(0) + ] + public double Value + { + get { return currValue; } + set + { + double val = value; + if (val > maxValue) + val = maxValue; + + if (val < minValue) + val = minValue; + + currValue = val; + Invalidate(); + } + } + + [ + Category("Behavior"), + Description("Minimum value of the data"), + DefaultValue(0) + ] + public double MinValue + { + get { return minValue; } + set + { + minValue = value; + Invalidate(); + } + } + + [ + Category("Behavior"), + Description("Maximum value of the data"), + DefaultValue(100) + ] + public double MaxValue + { + get { return maxValue; } + set + { + maxValue = value; + Invalidate(); + } + } + + [ + Category("Appearance"), + Description("Number of the scale divisions"), + DefaultValue(11) + ] + public int ScaleDivisions + { + get { return scaleDivisions; } + set + { + scaleDivisions = value; + CalculateDimensions(); + Invalidate(); + } + } + + [ + Category("Appearance"), + Description("Number of the scale subdivisions"), + DefaultValue(4) + ] + public int ScaleSubDivisions + { + get { return scaleSubDivisions; } + set + { + scaleSubDivisions = value; + CalculateDimensions(); + Invalidate(); + } + } + + [Browsable(false)] + public LBAnalogMeterRenderer Renderer + { + get { return renderer; } + set + { + renderer = value; + if (renderer != null) + renderer.AnalogMeter = this; + Invalidate(); + } + } + + #endregion Properties + + #region Public methods + + public float GetDrawRatio() + { + return drawRatio; + } + + public float GetStartAngle() + { + return startAngle; + } + + public float GetEndAngle() + { + return endAngle; + } + + public PointF GetNeedleCenter() + { + return needleCenter; + } + + #endregion Public methods + + #region Events delegates + + protected override void OnSizeChanged(EventArgs e) + { + base.OnSizeChanged(e); + + // Calculate dimensions + CalculateDimensions(); + Invalidate(); + } + + protected override void OnPaintBackground(PaintEventArgs e) + { + } + + protected override void OnPaint(PaintEventArgs e) + { + if (Width <= 0 || Height <= 0) return; + RectangleF _rc = new RectangleF(0, 0, Width, Height); + e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; + + if (renderer == null) + { + defaultRenderer.DrawBackground(e.Graphics, _rc); + defaultRenderer.DrawBody(e.Graphics, drawRect); + defaultRenderer.DrawThresholds(e.Graphics, drawRect); + defaultRenderer.DrawDivisions(e.Graphics, drawRect); + defaultRenderer.DrawUM(e.Graphics, drawRect); + defaultRenderer.DrawValue(e.Graphics, drawRect); + defaultRenderer.DrawNeedle(e.Graphics, drawRect); + defaultRenderer.DrawNeedleCover(e.Graphics, needleCoverRect); + defaultRenderer.DrawGlass(e.Graphics, glossyRect); + } + else + { + if (Renderer.DrawBackground(e.Graphics, _rc) == false) + defaultRenderer.DrawBackground(e.Graphics, _rc); + if (Renderer.DrawBody(e.Graphics, drawRect) == false) + defaultRenderer.DrawBody(e.Graphics, drawRect); + if (Renderer.DrawThresholds(e.Graphics, drawRect) == false) + defaultRenderer.DrawThresholds(e.Graphics, drawRect); + if (Renderer.DrawDivisions(e.Graphics, drawRect) == false) + defaultRenderer.DrawDivisions(e.Graphics, drawRect); + if (Renderer.DrawUM(e.Graphics, drawRect) == false) + defaultRenderer.DrawUM(e.Graphics, drawRect); + if (Renderer.DrawValue(e.Graphics, drawRect) == false) + defaultRenderer.DrawValue(e.Graphics, drawRect); + if (Renderer.DrawNeedle(e.Graphics, drawRect) == false) + defaultRenderer.DrawNeedle(e.Graphics, drawRect); + if (Renderer.DrawNeedleCover(e.Graphics, needleCoverRect) == false) + defaultRenderer.DrawNeedleCover(e.Graphics, needleCoverRect); + if (Renderer.DrawGlass(e.Graphics, glossyRect) == false) + defaultRenderer.DrawGlass(e.Graphics, glossyRect); + } + } + + #endregion Events delegates + + #region Virtual functions + + protected virtual void CalculateDimensions() + { + // Rectangle + float x = 0; + float y = 0; + float w = Width; + float h = Height; + + // Calculate ratio + drawRatio = (Math.Min(w, h)) / 200; + if (drawRatio < 0.00000001) + drawRatio = 1; + + // Draw rectangle + drawRect.X = x; + drawRect.Y = y; + drawRect.Width = w - 2; + drawRect.Height = h - 2; + + if (w < h) + drawRect.Height = w; + else if (w > h) + drawRect.Width = h; + + if (drawRect.Width < 10) + drawRect.Width = 10; + if (drawRect.Height < 10) + drawRect.Height = 10; + + // Calculate needle center + needleCenter.X = drawRect.X + (drawRect.Width / 2); + needleCenter.Y = drawRect.Y + (drawRect.Height / 2); + + // Needle cover rect + needleCoverRect.X = needleCenter.X - (20 * drawRatio); + needleCoverRect.Y = needleCenter.Y - (20 * drawRatio); + needleCoverRect.Width = 40 * drawRatio; + needleCoverRect.Height = 40 * drawRatio; + + // Glass effect rect + glossyRect.X = drawRect.X + (20 * drawRatio); + glossyRect.Y = drawRect.Y + (10 * drawRatio); + glossyRect.Width = drawRect.Width - (40 * drawRatio); + glossyRect.Height = needleCenter.Y + (30 * drawRatio); + } + + #endregion Virtual functions + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/UIAnalogMeterRender.cs b/SunnyUI/Controls/UIAnalogMeterRender.cs new file mode 100644 index 00000000..68fe02c1 --- /dev/null +++ b/SunnyUI/Controls/UIAnalogMeterRender.cs @@ -0,0 +1,482 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@qq.com + * + * Blog: https://www.cnblogs.com/yhuse + * Gitee: https://gitee.com/yhuse/SunnyUI + * GitHub: https://github.com/yhuse/SunnyUI + * + * SunnyUI can be used for free under the GPL-3.0 license. + * If you use this code, please keep this note. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UIAnalogMeterRender.cs + * 文件说明: 仪表渲染类 + * 文件作者: Luca Bonotto + * 开源协议: CPOL + * 引用地址: https://www.codeproject.com/Articles/24945/Analog-Meter +******************************************************************************/ + +/* + * Creato da SharpDevelop. + * Utente: lucabonotto + * Data: 03/04/2008 + * Ora: 14.34 + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ + +using System; +using System.Drawing; +using System.Drawing.Drawing2D; + +#pragma warning disable 1591 + +namespace Sunny.UI +{ + /// + /// Base class for the renderers of the analog meter + /// + public class LBAnalogMeterRenderer + { + #region Variables + + /// + /// Control to render + /// + private UIAnalogMeter meter; + + #endregion Variables + + #region Properies + + public UIAnalogMeter AnalogMeter + { + set { this.meter = value; } + get { return this.meter; } + } + + #endregion Properies + + #region Virtual method + + /// + /// Draw the background of the control + /// + /// + /// + /// + public virtual bool DrawBackground(Graphics gr, RectangleF rc) + { + return false; + } + + /// + /// Draw the body of the control + /// + /// + /// + /// + public virtual bool DrawBody(Graphics Gr, RectangleF rc) + { + return false; + } + + /// + /// Draw the scale of the control + /// + /// + /// + /// + public virtual bool DrawDivisions(Graphics Gr, RectangleF rc) + { + return false; + } + + /// + /// Draw the thresholds + /// + /// + /// + /// + public virtual bool DrawThresholds(Graphics gr, RectangleF rc) + { + return false; + } + + /// + /// Drawt the unit measure of the control + /// + /// + /// + /// + public virtual bool DrawUM(Graphics gr, RectangleF rc) + { + return false; + } + + /// + /// Draw the current value in numerical form + /// + /// + /// + /// + public virtual bool DrawValue(Graphics gr, RectangleF rc) + { + return false; + } + + /// + /// Draw the needle + /// + /// + /// + /// + public virtual bool DrawNeedle(Graphics Gr, RectangleF rc) + { + return false; + } + + /// + /// Draw the needle cover at the center + /// + /// + /// + /// + public virtual bool DrawNeedleCover(Graphics Gr, RectangleF rc) + { + return false; + } + + /// + /// Draw the glass effect + /// + /// + /// + /// + public virtual bool DrawGlass(Graphics Gr, RectangleF rc) + { + return false; + } + + #endregion Virtual method + } + + /// + /// Default renderer class for the analog meter + /// + public class LBDefaultAnalogMeterRenderer : LBAnalogMeterRenderer + { + public override bool DrawBackground(Graphics gr, RectangleF rc) + { + if (this.AnalogMeter == null) + return false; + + Color c = this.AnalogMeter.Parent.BackColor; + SolidBrush br = new SolidBrush(c); + Pen pen = new Pen(c); + + Rectangle _rcTmp = new Rectangle(0, 0, this.AnalogMeter.Width, this.AnalogMeter.Height); + gr.DrawRectangle(pen, _rcTmp); + gr.FillRectangle(br, rc); + + return true; + } + + public override bool DrawBody(Graphics Gr, RectangleF rc) + { + if (this.AnalogMeter == null) + return false; + + Color bodyColor = this.AnalogMeter.BodyColor; + Color cDark = LBColorManager.StepColor(bodyColor, 20); + + LinearGradientBrush br1 = new LinearGradientBrush(rc, + bodyColor, + cDark, + 45); + Gr.FillEllipse(br1, rc); + + float drawRatio = this.AnalogMeter.GetDrawRatio(); + + RectangleF _rc = rc; + _rc.X += 3 * drawRatio; + _rc.Y += 3 * drawRatio; + _rc.Width -= 6 * drawRatio; + _rc.Height -= 6 * drawRatio; + + LinearGradientBrush br2 = new LinearGradientBrush(_rc, + cDark, + bodyColor, + 45); + Gr.FillEllipse(br2, _rc); + + return true; + } + + public override bool DrawThresholds(Graphics gr, RectangleF rc) + { + return false; + } + + public override bool DrawDivisions(Graphics Gr, RectangleF rc) + { + if (this.AnalogMeter == null) + return false; + + PointF needleCenter = this.AnalogMeter.GetNeedleCenter(); + float startAngle = this.AnalogMeter.GetStartAngle(); + float endAngle = this.AnalogMeter.GetEndAngle(); + float scaleDivisions = this.AnalogMeter.ScaleDivisions; + float scaleSubDivisions = this.AnalogMeter.ScaleSubDivisions; + float drawRatio = this.AnalogMeter.GetDrawRatio(); + double minValue = this.AnalogMeter.MinValue; + double maxValue = this.AnalogMeter.MaxValue; + Color scaleColor = this.AnalogMeter.ScaleColor; + + float cx = needleCenter.X; + float cy = needleCenter.Y; + float w = rc.Width; + float h = rc.Height; + + float incr = LBMath.GetRadian((endAngle - startAngle) / ((scaleDivisions - 1) * (scaleSubDivisions + 1))); + float currentAngle = LBMath.GetRadian(startAngle); + float radius = (float)(w / 2 - (w * 0.08)); + float rulerValue = (float)minValue; + + Pen pen = new Pen(scaleColor, (2 * drawRatio)); + SolidBrush br = new SolidBrush(scaleColor); + + PointF ptStart = new PointF(0, 0); + PointF ptEnd = new PointF(0, 0); + int n = 0; + for (; n < scaleDivisions; n++) + { + //Draw Thick Line + ptStart.X = (float)(cx + radius * Math.Cos(currentAngle)); + ptStart.Y = (float)(cy + radius * Math.Sin(currentAngle)); + ptEnd.X = (float)(cx + (radius - w / 20) * Math.Cos(currentAngle)); + ptEnd.Y = (float)(cy + (radius - w / 20) * Math.Sin(currentAngle)); + Gr.DrawLine(pen, ptStart, ptEnd); + + //Draw Strings + Font font = new Font(this.AnalogMeter.Font.FontFamily, (float)(6F * drawRatio)); + + float tx = (float)(cx + (radius - (20 * drawRatio)) * Math.Cos(currentAngle)); + float ty = (float)(cy + (radius - (20 * drawRatio)) * Math.Sin(currentAngle)); + double val = Math.Round(rulerValue); + String str = String.Format("{0,0:D}", (int)val); + + SizeF size = Gr.MeasureString(str, font); + Gr.DrawString(str, + font, + br, + tx - (float)(size.Width * 0.5), + ty - (float)(size.Height * 0.5)); + + rulerValue += (float)((maxValue - minValue) / (scaleDivisions - 1)); + + if (n == scaleDivisions - 1) + break; + + if (scaleDivisions <= 0) + currentAngle += incr; + else + { + for (int j = 0; j <= scaleSubDivisions; j++) + { + currentAngle += incr; + ptStart.X = (float)(cx + radius * Math.Cos(currentAngle)); + ptStart.Y = (float)(cy + radius * Math.Sin(currentAngle)); + ptEnd.X = (float)(cx + (radius - w / 50) * Math.Cos(currentAngle)); + ptEnd.Y = (float)(cy + (radius - w / 50) * Math.Sin(currentAngle)); + Gr.DrawLine(pen, ptStart, ptEnd); + } + } + } + + return true; + } + + public override bool DrawUM(Graphics gr, RectangleF rc) + { + return false; + } + + public override bool DrawValue(Graphics gr, RectangleF rc) + { + return false; + } + + public override bool DrawNeedle(Graphics Gr, RectangleF rc) + { + if (this.AnalogMeter == null) + return false; + + float w, h; + w = rc.Width; + h = rc.Height; + + double minValue = this.AnalogMeter.MinValue; + double maxValue = this.AnalogMeter.MaxValue; + double currValue = this.AnalogMeter.Value; + float startAngle = this.AnalogMeter.GetStartAngle(); + float endAngle = this.AnalogMeter.GetEndAngle(); + PointF needleCenter = this.AnalogMeter.GetNeedleCenter(); + + float radius = (float)(w / 2 - (w * 0.12)); + float val = (float)(maxValue - minValue); + + val = (float)((100 * (currValue - minValue)) / val); + val = ((endAngle - startAngle) * val) / 100; + val += startAngle; + + float angle = LBMath.GetRadian(val); + + float cx = needleCenter.X; + float cy = needleCenter.Y; + + PointF ptStart = new PointF(0, 0); + PointF ptEnd = new PointF(0, 0); + + GraphicsPath pth1 = new GraphicsPath(); + + ptStart.X = cx; + ptStart.Y = cy; + angle = LBMath.GetRadian(val + 10); + ptEnd.X = (float)(cx + (w * .09F) * Math.Cos(angle)); + ptEnd.Y = (float)(cy + (w * .09F) * Math.Sin(angle)); + pth1.AddLine(ptStart, ptEnd); + + ptStart = ptEnd; + angle = LBMath.GetRadian(val); + ptEnd.X = (float)(cx + radius * Math.Cos(angle)); + ptEnd.Y = (float)(cy + radius * Math.Sin(angle)); + pth1.AddLine(ptStart, ptEnd); + + ptStart = ptEnd; + angle = LBMath.GetRadian(val - 10); + ptEnd.X = (float)(cx + (w * .09F) * Math.Cos(angle)); + ptEnd.Y = (float)(cy + (w * .09F) * Math.Sin(angle)); + pth1.AddLine(ptStart, ptEnd); + + pth1.CloseFigure(); + + SolidBrush br = new SolidBrush(this.AnalogMeter.NeedleColor); + Pen pen = new Pen(this.AnalogMeter.NeedleColor); + Gr.DrawPath(pen, pth1); + Gr.FillPath(br, pth1); + + return true; + } + + public override bool DrawNeedleCover(Graphics Gr, RectangleF rc) + { + if (this.AnalogMeter == null) + return false; + + Color clr = this.AnalogMeter.NeedleColor; + RectangleF _rc = rc; + float drawRatio = this.AnalogMeter.GetDrawRatio(); + + Color clr1 = Color.FromArgb(70, clr); + + _rc.Inflate(5 * drawRatio, 5 * drawRatio); + + SolidBrush brTransp = new SolidBrush(clr1); + Gr.FillEllipse(brTransp, _rc); + + clr1 = clr; + Color clr2 = LBColorManager.StepColor(clr, 75); + LinearGradientBrush br1 = new LinearGradientBrush(rc, + clr1, + clr2, + 45); + Gr.FillEllipse(br1, rc); + return true; + } + + public override bool DrawGlass(Graphics Gr, RectangleF rc) + { + if (this.AnalogMeter == null) + return false; + + if (this.AnalogMeter.ViewGlass == false) + return true; + + Color clr1 = Color.FromArgb(40, 200, 200, 200); + + Color clr2 = Color.FromArgb(0, 200, 200, 200); + LinearGradientBrush br1 = new LinearGradientBrush(rc, + clr1, + clr2, + 45); + Gr.FillEllipse(br1, rc); + + return true; + } + } + + /// + /// Manager for color + /// + public class LBColorManager : Object + { + public static double BlendColour(double fg, double bg, double alpha) + { + double result = bg + (alpha * (fg - bg)); + if (result < 0.0) + result = 0.0; + if (result > 255) + result = 255; + return result; + } + + public static Color StepColor(Color clr, int alpha) + { + if (alpha == 100) + return clr; + + byte a = clr.A; + byte r = clr.R; + byte g = clr.G; + byte b = clr.B; + float bg = 0; + + int _alpha = Math.Min(alpha, 200); + _alpha = Math.Max(alpha, 0); + double ialpha = ((double)(_alpha - 100.0)) / 100.0; + + if (ialpha > 100) + { + // blend with white + bg = 255.0F; + ialpha = 1.0F - ialpha; // 0 = transparent fg; 1 = opaque fg + } + else + { + // blend with black + bg = 0.0F; + ialpha = 1.0F + ialpha; // 0 = transparent fg; 1 = opaque fg + } + + r = (byte)(LBColorManager.BlendColour(r, bg, ialpha)); + g = (byte)(LBColorManager.BlendColour(g, bg, ialpha)); + b = (byte)(LBColorManager.BlendColour(b, bg, ialpha)); + + return Color.FromArgb(a, r, g, b); + } + } + + /// + /// Mathematic Functions + /// + public class LBMath : Object + { + public static float GetRadian(float val) + { + return (float)(val * Math.PI / 180); + } + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/UIAvatar.cs b/SunnyUI/Controls/UIAvatar.cs new file mode 100644 index 00000000..368c78aa --- /dev/null +++ b/SunnyUI/Controls/UIAvatar.cs @@ -0,0 +1,284 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UIAvatar.cs + * 文件说明: 头像 + * 当前版本: V2.2 + * 创建日期: 2020-01-01 + * + * 2020-01-01: V2.2.0 增加文件说明 +******************************************************************************/ + +using System; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Design; +using System.Drawing.Drawing2D; +using System.Windows.Forms; + +namespace Sunny.UI +{ + /// + /// 头像 + /// + [ToolboxItem(true)] + public sealed class UIAvatar : UIControl + { + /// + /// 头像图标类型 + /// + public enum UIIcon + { + /// + /// 图像 + /// + Image, + + /// + /// 符号 + /// + Symbol, + + /// + /// 文字 + /// + Text + } + + /// + /// 构造函数 + /// + public UIAvatar() + { + Width = Height = 60; + ShowText = false; + ShowRect = false; + + fillColor = UIStyles.Blue.AvatarFillColor; + foreColor = UIStyles.Blue.AvatarForeColor; + } + + /// + /// 填充颜色,当值为背景色或透明色或空值则不填充 + /// + [Description("填充颜色"), Category("自定义")] + [DefaultValue(typeof(Color), "Silver")] + public Color FillColor + { + get => fillColor; + set => SetFillColor(value); + } + + /// + /// 字体颜色 + /// + [Description("前景颜色"), Category("自定义")] + [DefaultValue(typeof(Color), "80, 160, 255")] + public override Color ForeColor + { + get => foreColor; + set => SetForeColor(value); + } + + /// + /// 设置主题样式 + /// + /// 主题样式 + public override void SetStyleColor(UIBaseStyle uiColor) + { + base.SetStyleColor(uiColor); + if (uiColor.IsCustom()) return; + + fillColor = uiColor.AvatarFillColor; + foreColor = uiColor.AvatarForeColor; + Invalidate(); + } + + private UIIcon icon = UIIcon.Symbol; + + /// + /// 显示方式:图像(Image)、符号(Symbol)、文字(Text) + /// + [DefaultValue(UIIcon.Symbol), Description("显示方式:图像(Image)、符号(Symbol)、文字(Text)")] + public UIIcon Icon + { + get => icon; + set + { + if (icon != value) + { + icon = value; + Invalidate(); + } + } + } + + private UIShape sharpType = UIShape.Circle; + + /// + /// 显示形状:圆形,正方形 + /// + [DefaultValue(UIShape.Circle), Description("显示形状:圆形,正方形")] + public UIShape Shape + { + get => sharpType; + set + { + if (sharpType != value) + { + sharpType = value; + Invalidate(); + } + } + } + + private Image image; + + /// + /// 图片 + /// + [DefaultValue(typeof(Image), "null")] + public Image Image + { + get => image; + set + { + if (image != value) + { + image = value; + Invalidate(); + } + } + } + + private int symbolSize = 45; + + /// + /// 图标大小 + /// + [DefaultValue(45)] + public int SymbolSize + { + get => symbolSize; + set + { + if (symbolSize != value) + { + symbolSize = Math.Max(value, 16); + symbolSize = Math.Min(value, 64); + Invalidate(); + } + } + } + + private int symbol = 61447; + + /// + /// 图标字符 + /// + [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] + [Editor(typeof(UIImagePropertyEditor), typeof(UITypeEditor))] + [DefaultValue(61447)] + public int Symbol + { + get => symbol; + set + { + if (symbol != value) + { + symbol = value; + Invalidate(); + } + } + } + + /// + /// OnPaintFill + /// + /// g + /// path + protected override void OnPaintFill(Graphics g, GraphicsPath path) + { + int size = Math.Min(Width, Height) - 3; + Rectangle rect = new Rectangle(2, 2, size - 2, size - 2); + + switch (Shape) + { + case UIShape.Circle: + g.FillEllipse(fillColor, rect); + break; + + case UIShape.Square: + g.FillRoundRectangle(fillColor, rect, 5); + break; + } + } + + /// + /// OnPaint + /// + /// e + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + + int size = Math.Min(Width, Height) - 3; + if (Icon == UIIcon.Image) + { + if (Image == null) + { + return; + } + + float sc1 = Image.Width * 1.0f / size; + float sc2 = Image.Height * 1.0f / size; + + Bitmap scaleImage = ((Bitmap)Image).ResizeImage((int)(Image.Width * 1.0 / Math.Min(sc1, sc2) + 0.5), + (int)(Image.Height * 1.0 / Math.Min(sc1, sc2) + 0.5)); + + Bitmap bmp = scaleImage.Split(size, Shape); + e.Graphics.DrawImage(bmp, 1, 1); + bmp.Dispose(); + scaleImage.Dispose(); + e.Graphics.SetHighQuality(); + + using (Pen pn = new Pen(BackColor, 2)) + { + if (Shape == UIShape.Circle) + { + e.Graphics.DrawEllipse(pn, 1, 1, size, size); + } + + if (Shape == UIShape.Square) + { + e.Graphics.DrawRoundRectangle(pn, 1, 1, size, size, 5); + } + } + + e.Graphics.SetDefaultQuality(); + } + + if (Icon == UIIcon.Symbol) + { + SizeF sf = e.Graphics.GetFontImageSize(Symbol, SymbolSize); + e.Graphics.DrawFontImage(Symbol, SymbolSize, foreColor, 2 + (size - 4 - sf.Width + 7) / 2.0f, 2 + (size - 4 - sf.Height + 2) / 2.0f); + } + + if (Icon == UIIcon.Text) + { + SizeF sf = e.Graphics.MeasureString(Text, Font); + e.Graphics.DrawString(Text, Font, foreColor, 2 + (size - 4 - sf.Width + 7) / 2.0f, 2 + (size - 4 - sf.Height + 2) / 2.0f); + } + } + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/UIButton.cs b/SunnyUI/Controls/UIButton.cs new file mode 100644 index 00000000..bad61f3a --- /dev/null +++ b/SunnyUI/Controls/UIButton.cs @@ -0,0 +1,295 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UIButton.cs + * 文件说明: 按钮 + * 当前版本: V2.2 + * 创建日期: 2020-01-01 + * + * 2020-01-01: V2.2.0 增加文件说明 + * 2020-04-25: V2.2.4 更新主题配置类 +******************************************************************************/ + +using System; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +// ReSharper disable All +#pragma warning disable 1591 + +namespace Sunny.UI +{ + [DefaultEvent("Click")] + [DefaultProperty("Text")] + [ToolboxItem(true)] + public class UIButton : UIControl + { + public UIButton() + { + TabStop = true; + Width = 100; + Height = 35; + Cursor = Cursors.Hand; + + foreHoverColor = UIStyles.Blue.ButtonForeHoverColor; + forePressColor = UIStyles.Blue.ButtonForePressColor; + + rectHoverColor = UIStyles.Blue.RectHoverColor; + rectPressColor = UIStyles.Blue.RectPressColor; + + fillHoverColor = UIStyles.Blue.ButtonFillHoverColor; + fillPressColor = UIStyles.Blue.ButtonFillPressColor; + } + + private bool showTips = false; + + [Description("是否显示角标"), Category("自定义")] + [DefaultValue(false)] + public bool ShowTips + { + get + { + return showTips; + } + set + { + if (showTips != value) + { + showTips = value; + Invalidate(); + } + } + } + + private string tipsText = ""; + + [Description("角标文字"), Category("自定义")] + [DefaultValue("")] + public string TipsText + { + get { return tipsText; } + set + { + if (tipsText != value) + { + tipsText = value; + if (ShowTips) + { + Invalidate(); + } + } + } + } + + private Font tipsFont = new Font("Microsoft Sans Serif", 9); + + [Description("角标文字字体"), Category("自定义")] + [DefaultValue(typeof(Font), "Microsoft Sans Serif, 9pt")] + public Font TipsFont + { + get { return tipsFont; } + set + { + if (!tipsFont.Equals(value)) + { + tipsFont = value; + Invalidate(); + } + } + } + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + + if (Enabled && ShowTips && !string.IsNullOrEmpty(TipsText)) + { + e.Graphics.SetHighQuality(); + SizeF sf = e.Graphics.MeasureString(TipsText, TipsFont); + float sfMax = Math.Max(sf.Width, sf.Height); + float x = Width - 1 - 2 - sfMax; + float y = 1 + 1; + e.Graphics.FillEllipse(Brushes.Red, x, y, sfMax, sfMax); + e.Graphics.DrawString(TipsText, TipsFont, Brushes.White, x + sfMax / 2.0f - sf.Width / 2.0f, y + sfMax / 2.0f - sf.Height / 2.0f); + } + } + + private bool selected; + + /// + /// 是否选中 + /// + [DefaultValue(false)] + public bool Selected + { + get => selected; + set + { + if (selected != value) + { + selected = value; + Invalidate(); + } + } + } + + public override void SetStyleColor(UIBaseStyle uiColor) + { + base.SetStyleColor(uiColor); + if (uiColor.IsCustom()) return; + + fillHoverColor = uiColor.ButtonFillHoverColor; + rectHoverColor = uiColor.RectHoverColor; + foreHoverColor = uiColor.ButtonForeHoverColor; + + fillPressColor = uiColor.ButtonFillPressColor; + rectPressColor = uiColor.RectPressColor; + forePressColor = uiColor.ButtonForePressColor; + + Invalidate(); + } + + /// + /// 填充颜色,当值为背景色或透明色或空值则不填充 + /// + [Description("填充颜色"), Category("自定义")] + [DefaultValue(typeof(Color), "80, 160, 255")] + public Color FillColor + { + get => fillColor; + set => SetFillColor(value); + } + + /// + /// 边框颜色 + /// + [Description("边框颜色"), Category("自定义")] + [DefaultValue(typeof(Color), "80, 160, 255")] + public Color RectColor + { + get => rectColor; + set => SetRectColor(value); + } + + /// + /// 字体颜色 + /// + [Description("字体颜色"), Category("自定义")] + [DefaultValue(typeof(Color), "White")] + public override Color ForeColor + { + get => foreColor; + set => SetForeColor(value); + } + + [DefaultValue(typeof(Color), "244, 244, 244")] + public Color FillDisableColor + { + get => fillDisableColor; + set => SetFillDisableColor(value); + } + + [DefaultValue(typeof(Color), "173, 178, 181")] + public Color RectDisableColor + { + get => rectDisableColor; + set => SetRectDisableColor(value); + } + + [DefaultValue(typeof(Color), "109, 109, 103")] + public Color ForeDisableColor + { + get => foreDisableColor; + set => SetForeDisableColor(value); + } + + [DefaultValue(typeof(Color), "111, 168, 255")] + public Color FillHoverColor + { + get => fillHoverColor; + set => SetFillHoveColor(value); + } + + [DefaultValue(typeof(Color), "74, 131, 229")] + public Color FillPressColor + { + get => fillPressColor; + set => SetFillPressColor(value); + } + + [DefaultValue(typeof(Color), "White")] + public Color ForeHoverColor + { + get => foreHoverColor; + set => SetForeHoveColor(value); + } + + [DefaultValue(typeof(Color), "White")] + public Color ForePressColor + { + get => forePressColor; + set => SetForePressColor(value); + } + + [DefaultValue(typeof(Color), "111, 168, 255")] + public Color RectHoverColor + { + get => rectHoverColor; + set => SetRectHoveColor(value); + } + + [DefaultValue(typeof(Color), "74, 131, 229")] + public Color RectPressColor + { + get => rectPressColor; + set => SetRectPressColor(value); + } + + [DefaultValue(typeof(Color), "64, 105, 225")] + public Color SelectedColor + { + get => selectedColor; + set => SetSelectedColor(value); + } + + protected override void OnMouseDown(MouseEventArgs e) + { + base.OnMouseDown(e); + IsPress = true; + Invalidate(); + } + + protected override void OnMouseUp(MouseEventArgs e) + { + base.OnMouseUp(e); + IsPress = false; + Invalidate(); + } + + protected override void OnMouseLeave(EventArgs e) + { + base.OnMouseLeave(e); + IsPress = false; + IsHover = false; + Invalidate(); + } + + protected override void OnMouseEnter(EventArgs e) + { + base.OnMouseEnter(e); + IsHover = true; + Invalidate(); + } + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/UICheckBox.cs b/SunnyUI/Controls/UICheckBox.cs new file mode 100644 index 00000000..132ac909 --- /dev/null +++ b/SunnyUI/Controls/UICheckBox.cs @@ -0,0 +1,183 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UICheckBox.cs + * 文件说明: 复选框 + * 当前版本: V2.2 + * 创建日期: 2020-01-01 + * + * 2020-01-01: V2.2.0 增加文件说明 + * 2020-04-16: V2.2.1 增加ReadOnly属性 + * 2020-04-25: V2.2.4 更新主题配置类 +******************************************************************************/ + +using System; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms; + +namespace Sunny.UI +{ + [DefaultEvent("ValueChanged")] + [DefaultProperty("Text")] + [ToolboxItem(true)] + public sealed class UICheckBox : UIControl + { + public UICheckBox() + { + Cursor = Cursors.Hand; + ShowRect = false; + Size = new Size(150, 29); + foreColor = UIStyles.Blue.CheckBoxForeColor; + fillColor = UIStyles.Blue.CheckBoxColor; + } + + public delegate void OnValueChanged(object sender, bool value); + + public event OnValueChanged ValueChanged; + + private int _imageSize = 16; + private int _imageInterval = 3; + + [DefaultValue(16)] + [Description("图标大小"), Category("自定义")] + public int ImageSize + { + get => _imageSize; + set + { + _imageSize = Math.Max(value, 16); + _imageSize = Math.Min(value, 64); + Invalidate(); + } + } + + [DefaultValue(false)] + public bool ReadOnly { get; set; } + + /// + /// 字体颜色 + /// + [Description("字体颜色"), Category("自定义")] + [DefaultValue(typeof(Color), "48, 48, 48")] + public override Color ForeColor + { + get => foreColor; + set => SetForeColor(value); + } + + [DefaultValue(3)] + [Description("图标与文字之间间隔"), Category("自定义")] + public int ImageInterval + { + get => _imageInterval; + set + { + _imageInterval = Math.Max(1, value); + Invalidate(); + } + } + + private bool _checked; + + [Description("是否选中"), Category("自定义")] + [DefaultValue(false)] + public bool Checked + { + get => _checked; + set + { + _checked = value; + ValueChanged?.Invoke(this, _checked); + Invalidate(); + } + } + + protected override void OnPaintFore(Graphics g, GraphicsPath path) + { + //设置按钮标题位置 + Padding = new Padding(_imageSize + _imageInterval * 2, Padding.Top, Padding.Right, Padding.Bottom); + + //填充文字 + Color color = foreColor; + color = Enabled ? color : UIDisableColor.Fore; + + g.DrawString(Text, Font, color, Size, Padding, ContentAlignment.MiddleLeft); + } + + protected override void OnPaintFill(Graphics g, GraphicsPath path) + { + //图标 + float top = Padding.Top - 1 + (Height - Padding.Top - Padding.Bottom - ImageSize) / 2.0f; + float left = Text.IsValid() ? ImageInterval : (Width - ImageSize) / 2.0f; + + Color color = Enabled ? fillColor : foreDisableColor; + + if (Checked) + { + g.FillRoundRectangle(color, new Rectangle((int)left, (int)top, ImageSize, ImageSize), 1); + + color = BackColor.IsValid() ? BackColor : Color.White; + Point pt2 = new Point((int)(left + ImageSize * 2 / 5.0f), (int)(top + ImageSize * 3 / 4.0f) - (ImageSize.Div(10))); + Point pt1 = new Point((int)left + 2 + ImageSize.Div(10), pt2.Y - (pt2.X - 2 - ImageSize.Div(10) - (int)left)); + Point pt3 = new Point((int)left + ImageSize - 2 - ImageSize.Div(10), pt2.Y - (ImageSize - pt2.X - 2 - ImageSize.Div(10)) - (int)left); + + PointF[] CheckMarkLine = { pt1, pt2, pt3 }; + using (Pen pn = new Pen(color, 2)) + { + g.SetHighQuality(); + g.DrawLines(pn, CheckMarkLine); + g.SetDefaultQuality(); + } + } + else + { + using (Pen pn = new Pen(color, 2)) + { + g.DrawRoundRectangle(pn, new Rectangle((int)left + 1, (int)top + 1, ImageSize - 2, ImageSize - 2), 1); + } + } + } + + protected override void OnClick(EventArgs e) + { + base.OnClick(e); + if (!ReadOnly) + { + Checked = !Checked; + } + } + + public override void SetStyleColor(UIBaseStyle uiColor) + { + base.SetStyleColor(uiColor); + if (uiColor.IsCustom()) return; + + fillColor = uiColor.CheckBoxColor; + foreColor = uiColor.CheckBoxForeColor; + Invalidate(); + } + + /// + /// 填充颜色,当值为背景色或透明色或空值则不填充 + /// + [Description("填充颜色"), Category("自定义")] + [DefaultValue(typeof(Color), "80, 160, 255")] + public Color CheckBoxColor + { + get => fillColor; + set => SetFillColor(value); + } + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/UICheckBoxGroup.cs b/SunnyUI/Controls/UICheckBoxGroup.cs new file mode 100644 index 00000000..ddc18afc --- /dev/null +++ b/SunnyUI/Controls/UICheckBoxGroup.cs @@ -0,0 +1,255 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UICheckBoxGroup.cs + * 文件说明: 多选框组 + * 当前版本: V2.2 + * 创建日期: 2020-01-01 + * + * 2020-04-19: V2.2.3 增加单元 + * 2020-04-25: V2.2.4 更新主题配置类 +******************************************************************************/ + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Design; +using System.Windows.Forms; + +namespace Sunny.UI +{ + /// + /// 多选框组 + /// + [DefaultProperty("Items")] + [DefaultEvent("ValueChanged")] + public class UICheckBoxGroup : UIGroupBox + { + /// + /// 值切换事件 + /// + /// sender + /// 索引 + /// 文字 + /// 是否选中 + public delegate void OnValueChanged(object sender, int index, string text, bool isChecked); + + /// + /// 值切换事件 + /// + public event OnValueChanged ValueChanged; + + /// + /// 析构事件 + /// + ~UICheckBoxGroup() + { + listbox?.Dispose(); + ClearBoxes(); + } + + private void ClearBoxes() + { + foreach (var box in boxes) + { + box.Hide(); + box.Dispose(); + } + + boxes.Clear(); + } + + private void Listbox_DrawItemEx(object sender, ListBox.ObjectCollection items, DrawItemEventArgs e) + { + Invalidate(); + } + + [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] + [Localizable(true)] + [Editor("System.Windows.Forms.Design.ListControlStringCollectionEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))] + [MergableProperty(false)] + public ListBox.ObjectCollection Items => ListBox.Items; + + private ListBoxEx listbox; + + private ListBoxEx ListBox + { + get + { + if (listbox == null) + { + listbox = new ListBoxEx(); + listbox.BeforeDrawItem += Listbox_DrawItemEx; + } + + return listbox; + } + } + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + + if (Items.Count == 0) return; + if (Items.Count != boxes.Count) + { + ClearBoxes(); + + for (int i = 0; i < Items.Count; i++) + { + UICheckBox box = new UICheckBox + { + Font = Font, + Parent = this, + Tag = i, + Style = Style + }; + + box.ValueChanged += Box_ValueChanged; + boxes.Add(box); + } + } + + int startX = StartPos.X; + int startY = TitleTop + StartPos.Y; + for (int i = 0; i < Items.Count; i++) + { + boxes[i].Text = Items[i].ToString(); + + int rowIndex = i / ColumnCount; + int columnIndex = i % ColumnCount; + + boxes[i].Left = startX + ItemSize.Width * columnIndex + ColumnInterval * columnIndex; + boxes[i].Top = startY + ItemSize.Height * rowIndex + RowInterval * rowIndex; + boxes[i].Show(); + } + } + + private void Box_ValueChanged(object sender, bool value) + { + UICheckBox checkBox = (UICheckBox)sender; + ValueChanged?.Invoke(this, checkBox.Tag.ToString().ToInt(), checkBox.Text, checkBox.Checked); + } + + [Browsable(false)] + public List SelectedIndexes + { + get + { + List indexes = new List(); + + for (int i = 0; i < boxes.Count; i++) + { + if (boxes[i].Checked) + indexes.Add(i); + } + + return indexes; + } + } + + [Browsable(false)] + public List SelectedItems + { + get + { + List items = new List(); + + foreach (var checkBox in boxes) + { + if (checkBox.Checked) + items.Add(checkBox.Text); + } + + return items; + } + } + + private readonly List boxes = new List(); + + private int columnCount = 1; + + [DefaultValue(1)] + public int ColumnCount + { + get => columnCount; + set + { + columnCount = value; + Invalidate(); + } + } + + private Size _itemSize = new Size(150, 35); + + [DefaultValue(typeof(Size), "150, 35")] + public Size ItemSize + { + get => _itemSize; + set + { + _itemSize = value; + Invalidate(); + } + } + + private Point startPos = new Point(12, 12); + + [DefaultValue(typeof(Point), "12, 12")] + public Point StartPos + { + get => startPos; + set + { + startPos = value; + Invalidate(); + } + } + + public int columnInterval; + + [DefaultValue(0)] + public int ColumnInterval + { + get => columnInterval; + set + { + columnInterval = value; + Invalidate(); + } + } + + private int rowInterval; + + [DefaultValue(0)] + public int RowInterval + { + get => rowInterval; + set + { + rowInterval = value; + Invalidate(); + } + } + + protected override void OnFontChanged(EventArgs e) + { + base.OnFontChanged(e); + foreach (var box in boxes) + { + box.Font = Font; + } + } + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/UIComboBox.Designer.cs b/SunnyUI/Controls/UIComboBox.Designer.cs new file mode 100644 index 00000000..583f8faa --- /dev/null +++ b/SunnyUI/Controls/UIComboBox.Designer.cs @@ -0,0 +1,47 @@ +namespace Sunny.UI +{ + partial class UIComboBox + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // UIComboBox + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Name = "UIComboBox"; + this.ButtonClick += new System.EventHandler(this.UIComboBox_ButtonClick); + this.FontChanged += new System.EventHandler(this.UIComboBox_FontChanged); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + } +} diff --git a/SunnyUI/Controls/UIComboBox.cs b/SunnyUI/Controls/UIComboBox.cs new file mode 100644 index 00000000..5892944e --- /dev/null +++ b/SunnyUI/Controls/UIComboBox.cs @@ -0,0 +1,151 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UIComboBox.cs + * 文件说明: 组合框 + * 当前版本: V2.2 + * 创建日期: 2020-01-01 + * + * 2020-01-01: V2.2.0 增加文件说明 +******************************************************************************/ + +using System; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Design; +using System.Windows.Forms; + +namespace Sunny.UI +{ + [DefaultProperty("Items")] + [DefaultEvent("SelectedIndexChanged")] + [ToolboxItem(true)] + public sealed partial class UIComboBox : UIDropControl + { + public UIComboBox() + { + InitializeComponent(); + } + + public event EventHandler SelectedIndexChanged; + + protected override void ItemForm_ValueChanged(object sender, object value) + { + selectedItem = ListBox.SelectedItem; + selectedIndex = ListBox.SelectedIndex; + Text = ListBox.Text; + Invalidate(); + SelectedIndexChanged?.Invoke(this, null); + } + + private readonly UIComboBoxItem item = new UIComboBoxItem(); + + protected override void CreateInstance() + { + ItemForm = new UIDropDown(item); + } + + protected override int CalcItemFormHeight() + { + int interval = ItemForm.Height - ItemForm.ClientRectangle.Height; + return 4 + Math.Min(Items.Count, MaxDropDownItems) * ItemHeight + interval; + } + + private UIListBox ListBox + { + get => item.ListBox; + } + + [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] + [Localizable(true)] + [Editor("System.Windows.Forms.Design.ListControlStringCollectionEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))] + [MergableProperty(false)] + public ListBox.ObjectCollection Items => ListBox?.Items; + + [DefaultValue(25)] + public int ItemHeight + { + get => ListBox.ItemHeight; + set => ListBox.ItemHeight = value; + } + + [DefaultValue(8)] + public int MaxDropDownItems { get; set; } = 8; + + private int selectedIndex = -1; + + [Browsable(false)] + [DefaultValue(-1)] + public int SelectedIndex + { + get => selectedIndex; + set + { + if (value.InRange(-1, ListBox.Items.Count - 1)) + { + ListBox.SelectedIndex = value; + selectedIndex = value; + + if (value >= 0) + { + Text = ListBox.Items[value].ToString(); + } + } + } + } + + private object selectedItem; + + [Browsable(false)] + [DefaultValue(null)] + public object SelectedItem + { + get => selectedItem; + set + { + if (value != null) + { + int idx = ListBox.Items.IndexOf(value); + SelectedIndex = idx; + selectedItem = idx >= 0 ? value : null; + } + } + } + + private void UIComboBox_ButtonClick(object sender, EventArgs e) + { + if (Items.Count == 0 || ItemForm.Visible) + { + return; + } + + ItemForm.Show(this, new Size(Width, CalcItemFormHeight())); + } + + private void UIComboBox_FontChanged(object sender, EventArgs e) + { + if (ItemForm != null) + { + ListBox.Font = Font; + } + } + + public override void SetStyleColor(UIBaseStyle uiColor) + { + base.SetStyleColor(uiColor); + if (uiColor.IsCustom()) return; + + ListBox.SetStyleColor(uiColor); + } + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/UIComboBox.resx b/SunnyUI/Controls/UIComboBox.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/SunnyUI/Controls/UIComboBox.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SunnyUI/Controls/UIContextMenuStrip.cs b/SunnyUI/Controls/UIContextMenuStrip.cs new file mode 100644 index 00000000..fe75b4ca --- /dev/null +++ b/SunnyUI/Controls/UIContextMenuStrip.cs @@ -0,0 +1,115 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UIContextMenuStrip.cs + * 文件说明: 上下文菜单 + * 当前版本: V2.2 + * 创建日期: 2020-01-01 + * + * 2020-01-01: V2.2.0 增加文件说明 + * 2020-04-25: V2.2.4 更新主题配置类 +******************************************************************************/ + +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace Sunny.UI +{ + public sealed class UIContextMenuStrip : ContextMenuStrip, IStyleInterface + { + public ContextMenuColorTable ColorTable = new ContextMenuColorTable(); + + public UIContextMenuStrip() + { + Font = UIFontColor.Font; + RenderMode = ToolStripRenderMode.Professional; + Renderer = new ToolStripProfessionalRenderer(ColorTable); + Version = UIGlobal.Version; + } + + [DefaultValue(false)] + public bool StyleCustomMode { get; set; } + + [DefaultValue(null)] + public string TagString { get; set; } + + public void SetStyle(UIStyle style) + { + SetStyleColor(UIStyles.GetStyleColor(style)); + _style = style; + } + + public void SetStyleColor(UIBaseStyle uiColor) + { + if (uiColor.IsCustom()) return; + + ColorTable.SetStyleColor(uiColor); + BackColor = uiColor.ContextMenuColor; + Invalidate(); + } + + public string Version { get; } + + private UIStyle _style = UIStyle.Blue; + + [DefaultValue(UIStyle.Blue)] + public UIStyle Style + { + get => _style; + set => SetStyle(value); + } + + public void CalcHeight() + { + if (Items.Count > 0 && !AutoSize) + { + int height = 0; + foreach (ToolStripItem item in Items) + { + height += item.Height; + } + + Height = height + 4; + } + } + } + + public class ContextMenuColorTable : ProfessionalColorTable + { + private UIBaseStyle StyleColor = UIStyles.Blue; + + public void SetStyleColor(UIBaseStyle color) + { + StyleColor = color; + } + + public override Color MenuItemSelected => StyleColor.MenuSelectedColor; + + public override Color MenuItemPressedGradientBegin => StyleColor.ButtonFillPressColor; + + public override Color MenuItemPressedGradientMiddle => StyleColor.ButtonFillPressColor; + + public override Color MenuItemPressedGradientEnd => StyleColor.ButtonFillPressColor; + + public override Color MenuBorder => StyleColor.RectColor; + + public override Color MenuItemBorder => StyleColor.PrimaryColor; + + public override Color ImageMarginGradientBegin => StyleColor.ContextMenuColor; + + public override Color ImageMarginGradientEnd => StyleColor.ContextMenuColor; + + public override Color ImageMarginGradientMiddle => StyleColor.ContextMenuColor; + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/UIControl.cs b/SunnyUI/Controls/UIControl.cs new file mode 100644 index 00000000..99e5abd8 --- /dev/null +++ b/SunnyUI/Controls/UIControl.cs @@ -0,0 +1,692 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UIControl.cs + * 文件说明: 控件基类 + * 当前版本: V2.2 + * 创建日期: 2020-01-01 + * + * 2020-01-01: V2.2.0 增加文件说明 + * 2020-04-25: V2.2.4 更新主题配置类 +******************************************************************************/ + +using System; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms; + +namespace Sunny.UI +{ + /// + /// 控件基类 + /// + [ToolboxItem(false)] + public class UIControl : Control, IStyleInterface + { + /// + /// 构造函数 + /// + public UIControl() + { + SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.SupportsTransparentBackColor | ControlStyles.UserPaint | ControlStyles.ResizeRedraw | ControlStyles.OptimizedDoubleBuffer | ControlStyles.DoubleBuffer, true); + base.DoubleBuffered = true; + UpdateStyles(); + + Version = UIGlobal.Version; + base.Font = UIFontColor.Font; + Size = new Size(100, 35); + } + + /// + /// Tag字符串 + /// + [DefaultValue(null)] + public string TagString { get; set; } + + /// + /// 自定义主题样式 + /// + [DefaultValue(false)] + public bool StyleCustomMode { get; set; } + + /// + /// 是否在设计期 + /// + protected bool IsDesignMode + { + get + { + if (LicenseManager.UsageMode == LicenseUsageMode.Designtime) + { + return true; + } + else if (System.Diagnostics.Process.GetCurrentProcess().ProcessName == "devenv") + { + return true; + } + + return false; + } + } + + private ToolStripStatusLabelBorderSides _rectSides = ToolStripStatusLabelBorderSides.All; + + /// + /// 边框显示位置 + /// + [DefaultValue(ToolStripStatusLabelBorderSides.All), Description("边框显示位置")] + public ToolStripStatusLabelBorderSides RectSides + { + get => _rectSides; + set + { + _rectSides = value; + OnRectSidesChange(); + Invalidate(); + } + } + + protected virtual void OnRadiusSidesChange() + { + } + + protected virtual void OnRectSidesChange() + { + } + + private UICornerRadiusSides _radiusSides = UICornerRadiusSides.All; + + /// + /// 圆角显示位置 + /// + [DefaultValue(UICornerRadiusSides.All), Description("圆角显示位置")] + public UICornerRadiusSides RadiusSides + { + get => _radiusSides; + set + { + _radiusSides = value; + OnRadiusSidesChange(); + Invalidate(); + } + } + + private int radius = 5; + + /// + /// 圆角角度 + /// + [Description("圆角角度"), Category("自定义")] + [DefaultValue(5)] + public int Radius + { + get => radius; + set + { + if (radius != value) + { + radius = Math.Max(0, value); + Invalidate(); + } + } + } + + private bool showText = true; + + /// + /// 是否显示文字 + /// + [Description("是否显示文字")] + [DefaultValue(true)] + protected bool ShowText + { + get => showText; + set + { + if (showText != value) + { + showText = value; + Invalidate(); + } + } + } + + private bool showRect = true; + + /// + /// 是否显示边框 + /// + protected bool ShowRect + { + get => showRect; + set + { + if (showRect != value) + { + showRect = value; + Invalidate(); + } + } + } + + /// + /// 版本 + /// + public string Version { get; } + + /// + /// 设置主题样式 + /// + /// 主题样式 + public void SetStyle(UIStyle style) + { + SetStyleColor(UIStyles.GetStyleColor(style)); + _style = style; + } + + /// + /// 设置主题样式颜色 + /// + /// + public virtual void SetStyleColor(UIBaseStyle uiColor) + { + if (uiColor.IsCustom()) return; + + fillColor = uiColor.ButtonFillColor; + rectColor = uiColor.RectColor; + foreColor = uiColor.ButtonForeColor; + + fillDisableColor = uiColor.FillDisableColor; + rectDisableColor = uiColor.RectDisableColor; + foreDisableColor = uiColor.ForeDisableColor; + + fillPressColor = fillHoverColor = fillColor; + rectPressColor = rectHoverColor = rectColor; + forePressColor = foreHoverColor = foreColor; + + selectedColor = uiColor.ButtonSelectedColor; + + Invalidate(); + } + + private UIStyle _style = UIStyle.Blue; + + /// + /// 主题样式 + /// + [DefaultValue(UIStyle.Blue)] + public UIStyle Style + { + get => _style; + set => SetStyle(value); + } + + /// + /// 是否鼠标移上 + /// + [Browsable(false)] + public bool IsHover; + + /// + /// 是否鼠标按下 + /// + [Browsable(false)] + public bool IsPress; + + private ContentAlignment textAlign = ContentAlignment.MiddleCenter; + + /// + /// 文字对齐方向 + /// + [Description("文字对齐方向")] + [DefaultValue(ContentAlignment.MiddleCenter)] + public ContentAlignment TextAlign + { + get => textAlign; + set + { + if (textAlign != value) + { + textAlign = value; + Invalidate(); + } + } + } + + /// + /// OnPaint + /// + /// e + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + + if (!Visible || Width <= 0 || Height <= 0) return; + + Rectangle rect = new Rectangle(0, 0, Width - 1, Height - 1); + GraphicsPath path = rect.CreateRoundedRectanglePath(radius, RadiusSides); + + //填充背景色 + if (fillColor.IsValid()) + { + OnPaintFill(e.Graphics, path); + } + + //填充边框色 + if (ShowRect) + { + OnPaintRect(e.Graphics, path); + } + + //填充文字 + if (ShowText) + { + OnPaintFore(e.Graphics, path); + } + + path.Dispose(); + } + + /// + /// 获取边框颜色 + /// + /// 颜色 + protected Color GetRectColor() + { + //边框 + Color color = rectColor; + if (IsHover) + color = rectHoverColor; + if (IsPress) + color = rectPressColor; + return Enabled ? color : rectDisableColor; + } + + /// + /// 获取字体颜色 + /// + /// 颜色 + protected Color GetForeColor() + { + //文字 + Color color = foreColor; + if (IsHover) + color = foreHoverColor; + if (IsPress) + color = forePressColor; + return Enabled ? color : foreDisableColor; + } + + /// + /// 获取填充颜色 + /// + /// 颜色 + protected Color GetFillColor() + { + //填充 + Color color = fillColor; + if (IsHover) + color = fillHoverColor; + if (IsPress) + color = fillPressColor; + return Enabled ? color : fillDisableColor; + } + + /// + /// 绘制填充 + /// + /// GDI绘图图面 + /// 路径 + protected virtual void OnPaintFill(Graphics g, GraphicsPath path) + { + Color color = GetFillColor(); + g.FillPath(color, path); + } + + private void PaintRectDisableSides(Graphics g) + { + //IsRadius为False时,显示左侧边线 + bool ShowRectLeft = RectSides.GetValue(ToolStripStatusLabelBorderSides.Left); + //IsRadius为False时,显示上侧边线 + bool ShowRectTop = RectSides.GetValue(ToolStripStatusLabelBorderSides.Top); + //IsRadius为False时,显示右侧边线 + bool ShowRectRight = RectSides.GetValue(ToolStripStatusLabelBorderSides.Right); + //IsRadius为False时,显示下侧边线 + bool ShowRectBottom = RectSides.GetValue(ToolStripStatusLabelBorderSides.Bottom); + + //IsRadius为True时,显示左上圆角 + bool RadiusLeftTop = RadiusSides.GetValue(UICornerRadiusSides.LeftTop); + //IsRadius为True时,显示左下圆角 + bool RadiusLeftBottom = RadiusSides.GetValue(UICornerRadiusSides.LeftBottom); + //IsRadius为True时,显示右上圆角 + bool RadiusRightTop = RadiusSides.GetValue(UICornerRadiusSides.RightTop); + //IsRadius为True时,显示右下圆角 + bool RadiusRightBottom = RadiusSides.GetValue(UICornerRadiusSides.RightBottom); + + var ShowRadius = RadiusSides > 0; + using (Pen pen = new Pen(GetFillColor())) + using (Pen penR = new Pen(GetRectColor())) + { + if (!ShowRadius || (!RadiusLeftBottom && !RadiusLeftTop)) + { + g.DrawLine(penR, 0, 0, 0, Height - 1); + } + + if (!ShowRadius || (!RadiusRightTop && !RadiusLeftTop)) + { + g.DrawLine(penR, 0, 0, Width - 1, 0); + } + + if (!ShowRadius || (!RadiusRightTop && !RadiusRightBottom)) + { + g.DrawLine(penR, Width - 1, 0, Width - 1, Height - 1); + } + + if (!ShowRadius || (!RadiusLeftBottom && !RadiusRightBottom)) + { + g.DrawLine(penR, 0, Height - 1, Width - 1, Height - 1); + } + + if (!ShowRectLeft) + { + if (!ShowRadius || (!RadiusLeftBottom && !RadiusLeftTop)) + { + g.DrawLine(pen, 0, 1, 0, Height - 2); + } + } + + if (!ShowRectTop) + { + if (!ShowRadius || (!RadiusRightTop && !RadiusLeftTop)) + { + g.DrawLine(pen, 1, 0, Width - 2, 0); + } + } + + if (!ShowRectRight) + { + if (!ShowRadius || (!RadiusRightTop && !RadiusRightBottom)) + { + g.DrawLine(pen, Width - 1, 1, Width - 1, Height - 2); + } + } + + if (!ShowRectBottom) + { + if (!ShowRadius || (!RadiusLeftBottom && !RadiusRightBottom)) + { + g.DrawLine(pen, 1, Height - 1, Width - 2, Height - 1); + } + } + + if (!ShowRectLeft && !ShowRectTop) + { + if (!ShowRadius || (!RadiusLeftBottom && !RadiusLeftTop)) + g.DrawLine(pen, 0, 0, 0, 1); + } + + if (!ShowRectRight && !ShowRectTop) + { + if (!ShowRadius || (!RadiusLeftBottom && !RadiusLeftTop)) + g.DrawLine(pen, Width - 1, 0, Width - 1, 1); + } + + if (!ShowRectLeft && !ShowRectBottom) + { + if (!ShowRadius || (!RadiusLeftBottom && !RadiusLeftTop)) + g.DrawLine(pen, 0, Height - 1, 0, Height - 2); + } + + if (!ShowRectRight && !ShowRectBottom) + { + if (!ShowRadius || (!RadiusLeftBottom && !RadiusLeftTop)) + g.DrawLine(pen, Width - 1, Height - 1, Width - 1, Height - 2); + } + } + } + + /// + /// 绘制边框 + /// + /// GDI绘图图面 + /// 路径 + protected virtual void OnPaintRect(Graphics g, GraphicsPath path) + { + Color color = GetRectColor(); + g.DrawPath(color, path); + PaintRectDisableSides(g); + } + + /// + /// 绘制字体 + /// + /// GDI绘图图面 + /// 路径 + protected virtual void OnPaintFore(Graphics g, GraphicsPath path) + { + Color color = GetForeColor(); + g.DrawString(Text, Font, color, Size, Padding, TextAlign); + } + + /// + /// 选中颜色 + /// + protected Color selectedColor = UIStyles.Blue.ButtonSelectedColor; + + /// + /// 边框颜色 + /// + protected Color rectColor = UIStyles.Blue.RectColor; + + /// + /// 填充颜色 + /// + protected Color fillColor = UIStyles.Blue.ButtonFillColor; + + /// + /// 字体颜色 + /// + protected Color foreColor = UIStyles.Blue.ButtonForeColor; + + /// + /// 字体鼠标移上颜色 + /// + protected Color foreHoverColor; + + /// + /// 字体鼠标按下颜色 + /// + protected Color forePressColor; + + /// + /// 字体不可用颜色 + /// + protected Color foreDisableColor = UIStyles.Blue.ForeDisableColor; + + /// + /// 边框鼠标移上颜色 + /// + protected Color rectHoverColor; + + /// + /// 边框鼠标按下颜色 + /// + protected Color rectPressColor; + + /// + /// 边框不可用颜色 + /// + protected Color rectDisableColor = UIStyles.Blue.RectDisableColor; + + /// + /// 填充鼠标移上颜色 + /// + protected Color fillHoverColor; + + /// + /// 填充鼠标按下颜色 + /// + protected Color fillPressColor; + + /// + /// 填充不可用颜色 + /// + protected Color fillDisableColor = UIStyles.Blue.FillDisableColor; + + /// + /// 设置选中颜色 + /// + /// 颜色 + protected void SetSelectedColor(Color value) + { + if (selectedColor != value) + { + selectedColor = value; + Invalidate(); + } + } + + /// + /// 设置填充鼠标移上颜色 + /// + /// 颜色 + protected void SetFillHoveColor(Color color) + { + fillHoverColor = color; + _style = UIStyle.Custom; + } + + /// + /// 设置填充鼠标按下颜色 + /// + /// 颜色 + protected void SetFillPressColor(Color color) + { + fillPressColor = color; + _style = UIStyle.Custom; + } + + /// + /// 设置填充不可用颜色 + /// + /// 颜色 + protected void SetFillDisableColor(Color color) + { + fillDisableColor = color; + _style = UIStyle.Custom; + } + + /// + /// 设备边框鼠标移上颜色 + /// + /// 颜色 + protected void SetRectHoveColor(Color color) + { + rectHoverColor = color; + _style = UIStyle.Custom; + } + + /// + /// 设置边框鼠标按下颜色 + /// + /// 颜色 + protected void SetRectPressColor(Color color) + { + rectPressColor = color; + _style = UIStyle.Custom; + } + + /// + /// 设置边框不可用颜色 + /// + /// 颜色 + protected void SetRectDisableColor(Color color) + { + rectDisableColor = color; + _style = UIStyle.Custom; + } + + /// + /// 设置字体鼠标移上颜色 + /// + /// 颜色 + protected void SetForeHoveColor(Color color) + { + foreHoverColor = color; + _style = UIStyle.Custom; + } + + /// + /// 设置字体鼠标按下颜色 + /// + /// 颜色 + protected void SetForePressColor(Color color) + { + forePressColor = color; + _style = UIStyle.Custom; + } + + /// + /// 设置字体不可用颜色 + /// + /// 颜色 + protected void SetForeDisableColor(Color color) + { + foreDisableColor = color; + _style = UIStyle.Custom; + } + + /// + /// 设置边框颜色 + /// + /// 颜色 + protected void SetRectColor(Color value) + { + if (rectColor != value) + { + rectColor = value; + _style = UIStyle.Custom; + Invalidate(); + } + } + + /// + /// 设置填充颜色 + /// + /// 颜色 + protected void SetFillColor(Color value) + { + if (fillColor != value) + { + fillColor = value; + _style = UIStyle.Custom; + Invalidate(); + } + } + + /// + /// 设置字体颜色 + /// + /// 颜色 + protected void SetForeColor(Color value) + { + if (foreColor != value) + { + foreColor = value; + _style = UIStyle.Custom; + Invalidate(); + } + } + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/UIDataGridView.cs b/SunnyUI/Controls/UIDataGridView.cs new file mode 100644 index 00000000..24ff2a10 --- /dev/null +++ b/SunnyUI/Controls/UIDataGridView.cs @@ -0,0 +1,445 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@qq.com + * + * Blog: https://www.cnblogs.com/yhuse + * Gitee: https://gitee.com/yhuse/SunnyUI + * GitHub: https://github.com/yhuse/SunnyUI + * + * SunnyUI can be used for free under the GPL-3.0 license. + * If you use this code, please keep this note. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UIGrid.cs + * 文件说明: 表格 + * 当前版本: V2.2 + * 创建日期: 2020-01-01 + * + * 2020-01-01: V2.2.0 增加文件说明 + * 2020-04-25: V2.2.4 功能增强、美化 +******************************************************************************/ + +using System; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace Sunny.UI +{ + public sealed class UIDataGridView : DataGridView, IStyleInterface + { + private readonly UIScrollBar Bar = new UIScrollBar(); + + public UIDataGridView() + { + BackgroundColor = UIColor.White; + GridColor = UIColor.Blue; + Font = UIFontColor.Font; + ScrollBars = ScrollBars.Vertical; + DoubleBuffered = true; + Bar.Parent = this; + Bar.Visible = false; + Bar.FillColor = UIColor.LightBlue; + Bar.ForeColor = UIColor.Blue; + Bar.StyleCustomMode = true; + Bar.ValueChanged += Bar_ValueChanged; + SetBarPosition(); + + //列占满行 + AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + + //支持自定义标题行风格 + EnableHeadersVisualStyles = false; + + //标题行风格 + ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single; + ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; + ColumnHeadersDefaultCellStyle.BackColor = UIColor.Blue; + ColumnHeadersDefaultCellStyle.ForeColor = UIColor.White; + ColumnHeadersDefaultCellStyle.WrapMode = DataGridViewTriState.True; + + //标题行行高,与OnColumnAdded事件配合 + ColumnHeadersHeight = 32; + + //数据行行高 + RowTemplate.Height = 29; + RowTemplate.MinimumHeight = 29; + AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None; + + //行选 + SelectionMode = DataGridViewSelectionMode.FullRowSelect; + + //禁止调整数据行行高 + AllowUserToResizeRows = false; + + //允许调整标题行行宽 + AllowUserToResizeColumns = true; + + //不显示数据行标题 + RowHeadersVisible = false; + + //禁止行多选 + MultiSelect = false; + + //自动生成行 + AutoGenerateColumns = true; + + //禁用最后一行空白,自动新增行 + AllowUserToAddRows = false; + + //禁止只读 + ReadOnly = false; + + //不显示表格线 + CellBorderStyle = DataGridViewCellBorderStyle.None; + + StripeEvenColor = UIColor.White; + StripeOddColor = UIColor.LightBlue; + + VerticalScrollBar.ValueChanged += VerticalScrollBar_ValueChanged; + } + + private void VerticalScrollBar_ValueChanged(object sender, EventArgs e) + { + Bar.Value = FirstDisplayedScrollingRowIndex; + } + + private void Bar_ValueChanged(object sender, EventArgs e) + { + FirstDisplayedScrollingRowIndex = Bar.Value; + } + + public void SetScrollInfo() + { + if (Bar == null) + { + return; + } + + if (VerticalScrollBar.Visible) + { + SetBarPosition(); + Bar.Maximum = RowCount - 1; + Bar.Value = FirstDisplayedScrollingRowIndex; + Bar.Visible = true; + } + else + { + Bar.Visible = false; + } + } + + protected override void OnMouseWheel(MouseEventArgs e) + { + base.OnMouseWheel(e); + if (Bar.Visible) + { + if (e.Delta > 10) + { + Bar.SetValue(Bar.Value - Bar.Maximum / 20); + } + else if (e.Delta < -10) + { + Bar.SetValue(Bar.Value + Bar.Maximum / 20); + } + } + } + + protected override void OnSizeChanged(EventArgs e) + { + base.OnSizeChanged(e); + SetScrollInfo(); + SetBarPosition(); + } + + private void SetBarPosition() + { + Bar.Left = Width - ScrollBarInfo.VerticalScrollBarWidth() - 2; + Bar.Top = 0; + Bar.Width = ScrollBarInfo.VerticalScrollBarWidth() + 1; + Bar.Height = Height; + Bar.BringToFront(); + } + + protected override void OnColumnAdded(DataGridViewColumnEventArgs e) + { + base.OnColumnAdded(e); + + //设置可调整标题行行高 + if (ColumnHeadersHeightSizeMode == DataGridViewColumnHeadersHeightSizeMode.AutoSize) + { + ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing; + } + } + + private UIStyle _style = UIStyle.Blue; + + [DefaultValue(UIStyle.Blue)] + public UIStyle Style + { + get => _style; + set => SetStyle(value); + } + + [DefaultValue(typeof(Color), "White")] + public Color StripeEvenColor + { + get => RowsDefaultCellStyle.BackColor; + set + { + RowsDefaultCellStyle.BackColor = value; + Invalidate(); + } + } + + [DefaultValue(typeof(Color), "235, 243, 255")] + public Color StripeOddColor + { + get => AlternatingRowsDefaultCellStyle.BackColor; + set + { + AlternatingRowsDefaultCellStyle.BackColor = value; + Invalidate(); + } + } + + public void SetStyle(UIStyle style) + { + if (!style.Equals(UIStyle.Custom)) + { + SetStyleColor(UIStyles.GetStyleColor(style)); + } + + _style = style; + } + + public void SetStyleColor(UIBaseStyle uiColor) + { + //标题行颜色 + ColumnHeadersDefaultCellStyle.BackColor = uiColor.TitleColor; + ColumnHeadersDefaultCellStyle.ForeColor = uiColor.TitleForeColor; + + //数据行选中颜色 + DefaultCellStyle.SelectionBackColor = uiColor.GridSelectedColor; + DefaultCellStyle.SelectionForeColor = uiColor.GridSelectedForeColor; + + GridColor = RectColor = uiColor.RectColor; + RowsDefaultCellStyle.BackColor = UIColor.White; + AlternatingRowsDefaultCellStyle.BackColor = UIColor.LightBlue; + + StripeEvenColor = uiColor.GridStripeEvenColor; + StripeOddColor = uiColor.GridStripeOddColor; + + Bar.FillColor = uiColor.GridStripeOddColor; + Bar.ForeColor = uiColor.PrimaryColor; + + Invalidate(); + } + + [DefaultValue(false)] + public bool StyleCustomMode { get; set; } + + public string Version => UIGlobal.Version; + + public string TagString { get; set; } + + /// + /// 重新设置边框 + /// + /// 当前的Windows消息 + protected override void WndProc(ref Message m) + { + base.WndProc(ref m); + + if (ShowRect) + { + if (m.Msg == 0xf || m.Msg == 0x133) + { + Color color = RectColor; + color = Enabled ? color : UIDisableColor.Fill; + ControlEx.ResetBorderColor(m, this, 1, color); + } + } + } + + /// + /// 是否显示边框 + /// + [Description("是否显示边框"), Category("自定义")] + [DefaultValue(true)] + public bool ShowRect + { + get => BorderStyle == BorderStyle.FixedSingle; + set + { + BorderStyle = value ? BorderStyle.FixedSingle : BorderStyle.None; + Invalidate(); + } + } + + /// + /// 是否显示表格线 + /// + [Description("是否显示表格线"), Category("自定义")] + [DefaultValue(false)] + public bool ShowGridLine + { + get => CellBorderStyle == DataGridViewCellBorderStyle.Single; + set => CellBorderStyle = value ? DataGridViewCellBorderStyle.Single : DataGridViewCellBorderStyle.None; + } + + private Color _rectColor = UIColor.Blue; + + [Category("Appearance"), Description("The border color used to paint the control.")] + public Color RectColor + { + get => _rectColor; + set + { + if (_rectColor != value) + { + _rectColor = value; + Invalidate(); + } + } + } + + private int selectedIndex = -1; + + [Browsable(false)] + public int SelectedIndex + { + get => selectedIndex; + set + { + if (Rows.Count == 0) + { + selectedIndex = -1; + return; + } + + if (value >= 0 && value < Rows.Count) + { + Rows[value].Selected = true; + selectedIndex = value; + FirstDisplayedScrollingRowIndex = value; + SelectIndexChange?.Invoke(this, value); + } + else + { + selectedIndex = -1; + } + } + } + + protected override void OnDataSourceChanged(EventArgs e) + { + base.OnDataSourceChanged(e); + SetScrollInfo(); + selectedIndex = -1; + } + + public delegate void OnSelectIndexChange(object sender, int index); + + public event OnSelectIndexChange SelectIndexChange; + + protected override void OnCellClick(DataGridViewCellEventArgs e) + { + base.OnCellClick(e); + + if (e.RowIndex >= 0 && selectedIndex != e.RowIndex) + { + selectedIndex = e.RowIndex; + SelectIndexChange?.Invoke(this, e.RowIndex); + } + } + + protected override void OnAllowUserToAddRowsChanged(EventArgs e) + { + base.OnAllowUserToAddRowsChanged(e); + SetScrollInfo(); + } + + protected override void OnGridColorChanged(EventArgs e) + { + base.OnGridColorChanged(e); + _style = UIStyle.Custom; + } + + protected override void OnDefaultCellStyleChanged(EventArgs e) + { + base.OnDefaultCellStyleChanged(e); + _style = UIStyle.Custom; + } + + protected override void OnColumnDefaultCellStyleChanged(DataGridViewColumnEventArgs e) + { + base.OnColumnDefaultCellStyleChanged(e); + _style = UIStyle.Custom; + } + + public DataGridViewColumn AddColumn(string columnName, string dataPropertyName, int fillWeight = 100, DataGridViewContentAlignment alignment = DataGridViewContentAlignment.MiddleCenter, bool readOnly = true) + { + DataGridViewColumn column = new DataGridViewTextBoxColumn(); + column.HeaderText = columnName; + column.DataPropertyName = dataPropertyName; + column.Name = columnName; + column.ReadOnly = readOnly; + column.FillWeight = fillWeight; + column.SortMode = DataGridViewColumnSortMode.NotSortable; + column.DefaultCellStyle.Alignment = alignment; + Columns.Add(column); + return column; + } + + public DataGridViewColumn AddCheckBoxColumn(string columnName, string dataPropertyName, int fillWeight = 100, bool readOnly = true) + { + DataGridViewColumn column = new DataGridViewCheckBoxColumn(); + column.HeaderText = columnName; + column.DataPropertyName = dataPropertyName; + column.Name = columnName; + column.ReadOnly = readOnly; + column.FillWeight = fillWeight; + column.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; + Columns.Add(column); + return column; + } + + public void ClearRows() + { + if (DataSource != null) + { + DataSource = null; + } + + Rows.Clear(); + } + + public void ClearColumns() + { + Columns.Clear(); + } + + public void ClearAll() + { + ClearRows(); + ClearColumns(); + } + + public void AddRow(params object[] values) + { + Rows.Add(values); + } + } + + public static class UIDataGridViewHelper + { + public static DataGridViewColumn SetFixedMode(this DataGridViewColumn column, int width) + { + column.AutoSizeMode = DataGridViewAutoSizeColumnMode.None; + column.Width = width; + return column; + } + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/UIDatePicker.Designer.cs b/SunnyUI/Controls/UIDatePicker.Designer.cs new file mode 100644 index 00000000..4d269cee --- /dev/null +++ b/SunnyUI/Controls/UIDatePicker.Designer.cs @@ -0,0 +1,48 @@ +namespace Sunny.UI +{ + partial class UIDatePicker + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + SuspendLayout(); + // + // UIDatePicker + // + AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + DropDownStyle = Sunny.UI.UIDropDownStyle.DropDownList; + Name = "UIDatePicker"; + Padding = new System.Windows.Forms.Padding(0, 0, 30, 0); + ButtonClick += new System.EventHandler(UIDatetimePicker_ButtonClick); + ResumeLayout(false); + PerformLayout(); + + } + + #endregion + } +} diff --git a/SunnyUI/Controls/UIDatePicker.cs b/SunnyUI/Controls/UIDatePicker.cs new file mode 100644 index 00000000..4727ec6b --- /dev/null +++ b/SunnyUI/Controls/UIDatePicker.cs @@ -0,0 +1,93 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UIDatePicker.cs + * 文件说明: 日期选择框 + * 当前版本: V2.2 + * 创建日期: 2020-01-01 + * + * 2020-01-01: V2.2.0 增加文件说明 +******************************************************************************/ + +using System; +using System.ComponentModel; +using System.Windows.Forms; + +namespace Sunny.UI +{ + [ToolboxItem(true)] + public sealed partial class UIDatePicker : UIDropControl + { + public delegate void OnDateTimeChanged(object sender, DateTime value); + + public UIDatePicker() + { + InitializeComponent(); + Value = DateTime.Now; + } + + public event OnDateTimeChanged ValueChanged; + + protected override void ItemForm_ValueChanged(object sender, object value) + { + Value = (DateTime)value; + Text = Value.ToString(dateFormat); + Invalidate(); + ValueChanged?.Invoke(this, Value); + } + + private readonly UIDateTimeControl item = new UIDateTimeControl(); + + protected override void CreateInstance() + { + ItemForm = new UIDropDown(item); + } + + private MonthCalendar MonthCalendar + { + get + { + return item.MonthCalendar; + } + } + + public DateTime Value + { + get => MonthCalendar.SelectionStart.Date; + set + { + Text = value.ToString(dateFormat); + MonthCalendar.SelectionStart = value; + } + } + + private void UIDatetimePicker_ButtonClick(object sender, EventArgs e) + { + ItemForm.Show(this); + } + + private string dateFormat = "yyyy-MM-dd"; + + [Description("日期格式化掩码"), Category("自定义")] + [DefaultValue("yyyy-MM-dd")] + public string DateFormat + { + get => dateFormat; + set + { + dateFormat = value; + Text = Value.ToString(dateFormat); + } + } + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/UIDatePicker.resx b/SunnyUI/Controls/UIDatePicker.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/SunnyUI/Controls/UIDatePicker.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SunnyUI/Controls/UIDoubleUpDown.cs b/SunnyUI/Controls/UIDoubleUpDown.cs new file mode 100644 index 00000000..49bcf2bb --- /dev/null +++ b/SunnyUI/Controls/UIDoubleUpDown.cs @@ -0,0 +1,165 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UIDoubleUpDown.cs + * 文件说明: 数字上下选择框 + * 当前版本: V2.2 + * 创建日期: 2020-01-01 + * + * 2020-01-01: V2.2.0 增加文件说明 + * 2020-04-25: V2.2.4 更新主题配置类 +******************************************************************************/ + +using System; +using System.ComponentModel; + +namespace Sunny.UI +{ + [DefaultEvent("ValueChanged")] + [DefaultProperty("Value")] + public sealed partial class UIDoubleUpDown : UIPanel + { + public delegate void OnValueChanged(object sender, double value); + + public UIDoubleUpDown() + { + InitializeComponent(); + ShowText = false; + } + + public event OnValueChanged ValueChanged; + + private double _value = 0; + + [DefaultValue(0)] + public double Value + { + get => _value; + set + { + value = CheckMaxMin(value); + _value = value; + pnlValue.Text = _value.ToString("F" + Decimal); + ValueChanged?.Invoke(this, _value); + } + } + + [DefaultValue(1)] + public int Decimal { get; set; } = 1; + + private double step = 0.1; + + [DefaultValue(0.1)] + public double Step + { + get => step; + set + { + step = Math.Abs(value); + } + } + + private void btnAdd_Click(object sender, EventArgs e) + { + Value += Step; + } + + private void btnDec_Click(object sender, EventArgs e) + { + Value -= Step; + } + + private double _maximum = double.MaxValue; + private double _minimum = double.MinValue; + + [DefaultValue(double.MaxValue)] + public double Maximum + { + get => _maximum; + set + { + _maximum = value; + if (_maximum < _minimum) + _minimum = _maximum; + + Value = CheckMaxMin(Value); + Invalidate(); + } + } + + [DefaultValue(double.MinValue)] + public double Minimum + { + get => _minimum; + set + { + _minimum = value; + if (_minimum > _maximum) + _maximum = _minimum; + + Value = CheckMaxMin(Value); + Invalidate(); + } + } + + private double CheckMaxMin(double value) + { + if (hasMaximum) + { + if (value > _maximum) + value = _maximum; + } + + if (hasMinimum) + { + if (value < _minimum) + value = _minimum; + } + + return value; + } + + private bool hasMaximum; + private bool hasMinimum; + + [DefaultValue(false)] + public bool HasMaximum + { + get => hasMaximum; + set + { + if (hasMaximum != value) + { + hasMaximum = value; + Value = CheckMaxMin(Value); + Invalidate(); + } + } + } + + [DefaultValue(false)] + public bool HasMinimum + { + get => hasMinimum; + set + { + if (hasMinimum != value) + { + hasMinimum = value; + Value = CheckMaxMin(Value); + Invalidate(); + } + } + } + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/UIDoubleUpDown.designer.cs b/SunnyUI/Controls/UIDoubleUpDown.designer.cs new file mode 100644 index 00000000..8ec47a58 --- /dev/null +++ b/SunnyUI/Controls/UIDoubleUpDown.designer.cs @@ -0,0 +1,140 @@ +namespace Sunny.UI +{ + partial class UIDoubleUpDown + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.btnDec = new Sunny.UI.UISymbolButton(); + this.btnAdd = new Sunny.UI.UISymbolButton(); + this.pnlValue = new Sunny.UI.UIPanel(); + this.SuspendLayout(); + // + // btnDec + // + this.btnDec.Cursor = System.Windows.Forms.Cursors.Hand; + this.btnDec.Dock = System.Windows.Forms.DockStyle.Left; + this.btnDec.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(158)))), ((int)(((byte)(255))))); + this.btnDec.FillDisableColor = System.Drawing.Color.FromArgb(((int)(((byte)(244)))), ((int)(((byte)(244)))), ((int)(((byte)(244))))); + this.btnDec.FillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(111)))), ((int)(((byte)(168)))), ((int)(((byte)(255))))); + this.btnDec.FillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(131)))), ((int)(((byte)(229))))); + this.btnDec.Font = new System.Drawing.Font("微软雅黑", 12F); + this.btnDec.ForeColor = System.Drawing.Color.White; + this.btnDec.ForeDisableColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(109)))), ((int)(((byte)(103))))); + this.btnDec.ForeHoverColor = System.Drawing.Color.White; + this.btnDec.ForePressColor = System.Drawing.Color.White; + this.btnDec.ImageInterval = 1; + this.btnDec.Location = new System.Drawing.Point(0, 0); + this.btnDec.Margin = new System.Windows.Forms.Padding(0); + this.btnDec.Name = "btnDec"; + this.btnDec.Padding = new System.Windows.Forms.Padding(26, 0, 0, 0); + this.btnDec.RadiusSides = ((Sunny.UI.UICornerRadiusSides)((Sunny.UI.UICornerRadiusSides.LeftTop | Sunny.UI.UICornerRadiusSides.LeftBottom))); + this.btnDec.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(158)))), ((int)(((byte)(255))))); + this.btnDec.RectDisableColor = System.Drawing.Color.FromArgb(((int)(((byte)(173)))), ((int)(((byte)(178)))), ((int)(((byte)(181))))); + this.btnDec.RectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(111)))), ((int)(((byte)(168)))), ((int)(((byte)(255))))); + this.btnDec.RectPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(131)))), ((int)(((byte)(229))))); + this.btnDec.Size = new System.Drawing.Size(29, 29); + this.btnDec.Style = Sunny.UI.UIStyle.Blue; + this.btnDec.Symbol = 61544; + this.btnDec.TabIndex = 0; + this.btnDec.Text = null; + this.btnDec.TipsFont = new System.Drawing.Font("Microsoft Sans Serif", 9F); + this.btnDec.TipsText = null; + this.btnDec.Click += new System.EventHandler(this.btnDec_Click); + // + // btnAdd + // + this.btnAdd.Cursor = System.Windows.Forms.Cursors.Hand; + this.btnAdd.Dock = System.Windows.Forms.DockStyle.Right; + this.btnAdd.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(158)))), ((int)(((byte)(255))))); + this.btnAdd.FillDisableColor = System.Drawing.Color.FromArgb(((int)(((byte)(244)))), ((int)(((byte)(244)))), ((int)(((byte)(244))))); + this.btnAdd.FillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(111)))), ((int)(((byte)(168)))), ((int)(((byte)(255))))); + this.btnAdd.FillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(131)))), ((int)(((byte)(229))))); + this.btnAdd.Font = new System.Drawing.Font("微软雅黑", 12F); + this.btnAdd.ForeColor = System.Drawing.Color.White; + this.btnAdd.ForeDisableColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(109)))), ((int)(((byte)(103))))); + this.btnAdd.ForeHoverColor = System.Drawing.Color.White; + this.btnAdd.ForePressColor = System.Drawing.Color.White; + this.btnAdd.ImageInterval = 1; + this.btnAdd.Location = new System.Drawing.Point(87, 0); + this.btnAdd.Margin = new System.Windows.Forms.Padding(0); + this.btnAdd.Name = "btnAdd"; + this.btnAdd.Padding = new System.Windows.Forms.Padding(26, 0, 0, 0); + this.btnAdd.RadiusSides = ((Sunny.UI.UICornerRadiusSides)((Sunny.UI.UICornerRadiusSides.RightTop | Sunny.UI.UICornerRadiusSides.RightBottom))); + this.btnAdd.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(158)))), ((int)(((byte)(255))))); + this.btnAdd.RectDisableColor = System.Drawing.Color.FromArgb(((int)(((byte)(173)))), ((int)(((byte)(178)))), ((int)(((byte)(181))))); + this.btnAdd.RectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(111)))), ((int)(((byte)(168)))), ((int)(((byte)(255))))); + this.btnAdd.RectPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(131)))), ((int)(((byte)(229))))); + this.btnAdd.Size = new System.Drawing.Size(29, 29); + this.btnAdd.Style = Sunny.UI.UIStyle.Blue; + this.btnAdd.Symbol = 61543; + this.btnAdd.TabIndex = 1; + this.btnAdd.Text = null; + this.btnAdd.TipsFont = new System.Drawing.Font("Microsoft Sans Serif", 9F); + this.btnAdd.TipsText = null; + this.btnAdd.Click += new System.EventHandler(this.btnAdd_Click); + // + // pnlValue + // + this.pnlValue.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlValue.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.pnlValue.FillDisableColor = System.Drawing.Color.FromArgb(((int)(((byte)(244)))), ((int)(((byte)(244)))), ((int)(((byte)(244))))); + this.pnlValue.Font = new System.Drawing.Font("微软雅黑", 12F); + this.pnlValue.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(32)))), ((int)(((byte)(32)))), ((int)(((byte)(32))))); + this.pnlValue.ForeDisableColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(109)))), ((int)(((byte)(103))))); + this.pnlValue.Location = new System.Drawing.Point(29, 0); + this.pnlValue.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.pnlValue.Name = "pnlValue"; + this.pnlValue.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(158)))), ((int)(((byte)(255))))); + this.pnlValue.RectDisableColor = System.Drawing.Color.FromArgb(((int)(((byte)(173)))), ((int)(((byte)(178)))), ((int)(((byte)(181))))); + this.pnlValue.RectSides = ((System.Windows.Forms.ToolStripStatusLabelBorderSides)((System.Windows.Forms.ToolStripStatusLabelBorderSides.Top | System.Windows.Forms.ToolStripStatusLabelBorderSides.Bottom))); + this.pnlValue.RadiusSides = UICornerRadiusSides.None; + this.pnlValue.Size = new System.Drawing.Size(58, 29); + this.pnlValue.Style = Sunny.UI.UIStyle.Blue; + this.pnlValue.TabIndex = 2; + this.pnlValue.Text = "0"; + // + // UIIntegerUpDown + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.pnlValue); + this.Controls.Add(this.btnAdd); + this.Controls.Add(this.btnDec); + this.MinimumSize = new System.Drawing.Size(100, 0); + this.Name = "UIIntegerUpDown"; + this.Size = new System.Drawing.Size(116, 29); + this.ResumeLayout(false); + + } + + #endregion + + private UISymbolButton btnDec; + private UISymbolButton btnAdd; + private UIPanel pnlValue; + } +} diff --git a/SunnyUI/Controls/UIDoubleUpDown.resx b/SunnyUI/Controls/UIDoubleUpDown.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/SunnyUI/Controls/UIDoubleUpDown.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SunnyUI/Controls/UIEdit.cs b/SunnyUI/Controls/UIEdit.cs new file mode 100644 index 00000000..d571d254 --- /dev/null +++ b/SunnyUI/Controls/UIEdit.cs @@ -0,0 +1,496 @@ +using System; +using System.ComponentModel; +using System.Globalization; +using System.Windows.Forms; + +namespace Sunny.UI +{ + [ToolboxItem(false)] + public sealed class UIEdit : TextBox + { + private bool canEmpty; + private int decLength = 2; + private bool hasMaxValue; + private bool hasMinValue; + private string mask = "0.00"; + private double maxValue = double.MaxValue; + private double minValue = double.MinValue; + private UITextBox.UIEditType _uiEditType = UITextBox.UIEditType.String; + + public UIEdit() + { + //设置为单选边框 + BorderStyle = BorderStyle.FixedSingle; + Font = UIFontColor.Font; + ForeColor = UIFontColor.Primary; + Width = 150; + MaxLength = 255; + } + + protected override void OnKeyDown(KeyEventArgs e) + { + if (e.KeyData == Keys.Enter || e.KeyData == Keys.Down) + { + if (e.KeyData == Keys.Enter) + { + EnterKeyPress?.Invoke(this, e); + } + + if (EnterAsTab) + { + SendKeys.Send("{tab}"); + } + + e.Handled = true; + } + + if (e.KeyData == Keys.Up) + { + if (EnterAsTab) + { + SendKeys.Send("+{TAB}"); + } + + e.Handled = true; + } + + base.OnKeyDown(e); + + EditOnKeyDown(e); + } + + public bool EnterAsTab { get; set; } + + public event EventHandler EnterKeyPress; + + private void EditOnKeyDown(KeyEventArgs e) + { + if (e.Control && e.KeyCode == Keys.A) + { + SelectAll(); + e.SuppressKeyPress = true; + } + + if (e.Control && e.KeyCode == Keys.C) + { + Copy(); + e.SuppressKeyPress = true; + } + + if (e.Control && e.KeyCode == Keys.V) + { + Paste(); + e.SuppressKeyPress = true; + } + } + + [ + DefaultValue(typeof(bool), "false"), + Category("Appearance"), + Description("整型、浮点型可以为空") + ] + public bool CanEmpty + { + get => canEmpty; + set + { + if (canEmpty != value) + { + canEmpty = value; + Invalidate(); + } + } + } + + [ + DefaultValue(UITextBox.UIEditType.String), + Category("Appearance"), + Description("设置编辑框输入内容属性") + ] + public UITextBox.UIEditType Type + { + get => _uiEditType; + set + { + if (_uiEditType == value) return; + _uiEditType = value; + + switch (_uiEditType) + { + case UITextBox.UIEditType.Double: + Text = mask; + break; + + case UITextBox.UIEditType.Integer: + Text = @"0"; + break; + + case UITextBox.UIEditType.String: + Text = ""; + break; + } + + CheckMaxMin(); + if (DesignMode) + Invalidate(); + } + } + + [DefaultValue(2)] + public int DecLength + { + get => decLength; + set + { + if (decLength != value) + { + decLength = value; + if (decLength < 0) + { + decLength = 0; + } + + if (_uiEditType == UITextBox.UIEditType.Double) + { + mask = DecimalToMask(decLength); + Text = mask; + Invalidate(); + } + } + } + } + + [DefaultValue(false)] + public bool HasMaxValue + { + get => hasMaxValue; + set + { + if (hasMaxValue != value) + { + hasMaxValue = value; + CheckMaxMin(); + Invalidate(); + } + } + } + + [DefaultValue(false)] + public bool HasMinValue + { + get => hasMinValue; + set + { + if (hasMinValue != value) + { + hasMinValue = value; + CheckMaxMin(); + Invalidate(); + } + } + } + + [DefaultValue(0)] + public double DoubleValue + { + get + { + if (Text == "" && CanEmpty) return 0; + return Text.ToDouble(); + } + set + { + if (_uiEditType == UITextBox.UIEditType.Double) + { + if (Text != value.ToString(CultureInfo.InvariantCulture)) + { + CheckMaxMin(); + Text = value.ToString("f" + decLength); + } + } + } + } + + [DefaultValue(0)] + public int IntValue + { + get + { + if (Text == "" && CanEmpty) return 0; + return Text.ToInt(); + } + set + { + if (_uiEditType != UITextBox.UIEditType.Integer) return; + if (Text == value.ToString()) return; + CheckMaxMin(); + Text = value.ToString(); + } + } + + [DefaultValue(int.MaxValue)] + public double MaxValue + { + get => maxValue; + set + { + maxValue = value; + if (maxValue < minValue) + minValue = maxValue; + CheckMaxMin(); + Invalidate(); + } + } + + [DefaultValue(int.MinValue)] + public double MinValue + { + get => minValue; + set + { + minValue = value; + if (minValue > maxValue) + maxValue = minValue; + CheckMaxMin(); + Invalidate(); + } + } + + private string DecimalToMask(int iDecimal) + { + if (iDecimal == 0) + return "0"; + var str = "0."; + for (int i = 1; i <= iDecimal; i++) + str = str + "0"; + return str; + } + + private int SubCharCount(string str, char subChar) + { + string[] IDList = str.Split(subChar); + return IDList.Length - 1; + } + + private bool StringIndexIsChar(string str, int idx, char inChar) + { + if (str == "") + return false; + if (idx >= str.Length) + return false; + char[] cl = str.ToCharArray(); + return cl[idx] == inChar; + } + + private bool IsValidChar(string str, char KeyChar, int pos) + { + bool b; + if (_uiEditType == UITextBox.UIEditType.Integer) + { + b = char.IsDigit(KeyChar); + if (b) + { + if ((str.IndexOf('+') >= 0) | (str.IndexOf('-') >= 0)) + { + if ((pos == 1) & (SelectionLength > 0)) + return true; + + b = pos > 1; + } + return b; + } + + b = KeyChar.Equals('+'); + if (b) + { + if (str == "") return true; + if (pos != 1) return false; + b = ((str.IndexOf('+') == -1) & (str.IndexOf('-') == -1)) | (SelectionLength > 0); + return b; + } + + b = KeyChar.Equals('-'); + if (b) + { + if (str == "") return true; + if (pos != 1) return false; + b = ((str.IndexOf('+') == -1) & (str.IndexOf('-') == -1)) | (SelectionLength > 0); + return b; + } + + return false; + } + + if (_uiEditType == UITextBox.UIEditType.Double) + { + b = char.IsDigit(KeyChar); + if (b) + { + if ((str.IndexOf('+') >= 0) | (str.IndexOf('-') >= 0)) + { + if ((pos == 1) & (SelectionLength > 0)) + return true; + + b = pos > 1; + } + return b; + } + + b = KeyChar.Equals('.'); + if (b) + { + if (str == "") return true; + if (SubCharCount(str, KeyChar) != 0) return false; + if ((str.IndexOf('+') >= 0) | (str.IndexOf('-') >= 0)) + { + if ((pos == 1) & (SelectionLength > 0)) + return true; + + b = pos > 1; + } + return b; + } + + b = KeyChar.Equals('+'); + if (b) + { + if (str == "") return true; + if (pos != 1) return false; + b = ((str.IndexOf('+') == -1) & (str.IndexOf('-') == -1)) | (SelectionLength > 0); + return b; + } + + b = KeyChar.Equals('-'); + if (b) + { + if (str == "") return true; + if (pos != 1) return false; + b = ((str.IndexOf('+') == -1) & (str.IndexOf('-') == -1)) | (SelectionLength > 0); + return b; + } + + return false; + } + + return true; + } + + public void CheckMaxMin() + { + if (_uiEditType == UITextBox.UIEditType.Integer) + { + if (Text == "" && CanEmpty) return; + + if (!int.TryParse(Text, out var a)) + Text = @"0"; + + if (hasMaxValue) + { + var m = (int)Math.Floor(maxValue); + if (a > m) + a = m; + } + if (hasMinValue) + { + var m = (int)Math.Ceiling(minValue); + if (a < m) + a = m; + } + + Text = a.ToString(); + } + + if (_uiEditType == UITextBox.UIEditType.Double) + { + if (Text == "" && CanEmpty) return; + + if (!double.TryParse(Text, out var a)) + Text = a.ToString("f" + decLength); + + if (hasMaxValue) + { + if (a > maxValue) + a = maxValue; + } + + if (hasMinValue) + { + if (a < minValue) + a = minValue; + } + + Text = a.ToString("f" + decLength); + } + } + + protected override void OnKeyPress(KeyPressEventArgs e) + { + //以下代码 取消按下回车或esc的“叮”声 + if (e.KeyChar == Convert.ToChar(13) || e.KeyChar == Convert.ToChar(27)) + { + e.Handled = true; + } + else if (e.KeyChar == 8) + { + } + else if (!(IsValidChar(Text, e.KeyChar, SelectionStart + 1) & (e.KeyChar >= 32))) + { + e.Handled = true; + } + + base.OnKeyPress(e); + } + + /// + /// 在得到焦点时修改文体框的背景色 + /// + /// + protected override void OnGotFocus(EventArgs e) + { + base.OnGotFocus(e); + SelectionStart = Text.Length; + SelectionLength = 0; + } + + protected override void OnLeave(EventArgs e) + { + base.OnLeave(e); + + //如果为整形,为空时自动为0 + if (_uiEditType == UITextBox.UIEditType.Integer) + { + if (Text == "" && CanEmpty) return; + + if (Text == "") + Text = "0"; + + if (!Text.IsInt()) + Text = "0"; + } + + //如果为浮点,检查.前后是否为空,为空加0 + if (_uiEditType == UITextBox.UIEditType.Double) + { + if (Text == "" && CanEmpty) return; + + if (StringIndexIsChar(Text, 0, '.')) + Text = @"0" + Text; + + if (StringIndexIsChar(Text, Text.Length - 1, '.')) + Text = Text + @"0"; + + if (StringIndexIsChar(Text, 0, '+') || StringIndexIsChar(Text, 0, '+')) + if (StringIndexIsChar(Text, 1, '.')) + Text = Text.Insert(1, @"0"); + + if (!double.TryParse(Text, out var doubleValue)) + Text = mask; + + Text = doubleValue.ToString("f" + decLength); + } + + CheckMaxMin(); + Invalidate(); + } + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/UIGlobal.cs b/SunnyUI/Controls/UIGlobal.cs new file mode 100644 index 00000000..bd5d0542 --- /dev/null +++ b/SunnyUI/Controls/UIGlobal.cs @@ -0,0 +1,122 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UIGlobal.cs + * 文件说明: 全局参数类 + * 当前版本: V2.2 + * 创建日期: 2020-01-01 + * + * 2020-01-01: V2.2.0 增加文件说明 +******************************************************************************/ + +using Sunny.UI.Properties; +using System.Collections.Generic; +using System.Reflection; +using System.Windows.Forms; + +namespace Sunny.UI +{ + /// + /// 全局参数类 + /// + public static class UIGlobal + { + /// + /// 版本 + /// + public static string Version = Resources.Name + " " + Resources.Version; + + public static bool IsCustom(this UIStyle style) + { + return style.Equals(UIStyle.Custom); + } + + public static bool IsValid(this UIStyle style) + { + return !style.IsCustom(); + } + + public static bool IsCustom(this UIBaseStyle style) + { + return style.Name.IsCustom(); + } + + public static bool IsValid(this UIBaseStyle style) + { + return !style.IsCustom(); + } + + public static void SetChildUIStyle(Control ctrl, UIStyle style) + { + List controls = ctrl.GetUIStyleControls("IStyleInterface"); + foreach (var control in controls) + { + if (control is IStyleInterface item) + { + if (!item.StyleCustomMode) + { + item.Style = style; + } + } + } + + FieldInfo[] fieldInfo = ctrl.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance); + foreach (var info in fieldInfo) + { + if (info.FieldType.Name == "UIContextMenuStrip") + { + UIContextMenuStrip context = (UIContextMenuStrip)info.GetValue(ctrl); + if (context != null && !context.StyleCustomMode) + { + context.SetStyle(style); + } + } + } + } + + /// + /// 查找包含接口名称的控件列表 + /// + /// 容器 + /// 接口名称 + /// 控件列表 + private static List GetUIStyleControls(this Control ctrl, string interfaceName) + { + List values = new List(); + + foreach (Control obj in ctrl.Controls) + { + if (obj.GetType().GetInterface(interfaceName) != null) + { + values.Add(obj); + } + + if (obj is UIPage) continue; + if (obj is UIPanel) continue; + + if (obj.Controls.Count > 0) + { + values.AddRange(obj.GetUIStyleControls(interfaceName)); + } + } + + return values; + } + + public static void ReStart(this Timer timer) + { + timer.Stop(); + timer.Start(); + } + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/UIGrid.cs b/SunnyUI/Controls/UIGrid.cs new file mode 100644 index 00000000..40174041 --- /dev/null +++ b/SunnyUI/Controls/UIGrid.cs @@ -0,0 +1,1062 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UIGrid.cs + * 文件说明: 表格 + * 当前版本: V2.2 + * 创建日期: 2020-04-15 + * + * 2020-04-11: V2.2.2 增加UIGrid + * 2020-04-25: V2.2.4 更新主题配置类 +******************************************************************************/ + +using System; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Runtime.InteropServices; +using System.Windows.Forms; + +#pragma warning disable 1591 +// ReSharper disable All + +namespace Sunny.UI +{ + [DefaultEvent("CellValueChanged")] + [DefaultProperty("Columns")] + [ToolboxItem(false)] + public sealed class UIGrid : UIPanel + { + private UIRowsLayout RowsLayout; + private UIPanel Header; + private UIPanel Footer; + private UIScrollBar ScrollBar; + private UIPanel Cover; + + public UIGrid() + { + InitializeComponent(); + RowsLayout.DoubleBuffered(); + Header.DoubleBuffered(); + Footer.DoubleBuffered(); + ScrollBar.DoubleBuffered(); + + ShowFooter = false; + RowsLayout.AutoScroll = true; + RowsLayout.MouseWheel += RowContainer_MouseWheel; + + StripeEvenColor = UIColor.White; + StripeOddColor = UIStyles.Blue.PlainColor; + RowSelectedColor = UIStyles.Blue.GridSelectedColor; + + HeaderFillColor = UIStyles.Blue.TitleColor; + HeaderForeColor = UIStyles.Blue.TitleForeColor; + + columns.OnAppend += Columns_Changed; + columns.OnDelete += Columns_Changed; + RowsLayout.HorizontalScroll.Visible = false;//水平的显示 + RowsLayout.HorizontalScroll.Enabled = false; + + showWidth = Width; + } + + private bool showLine; + + [DefaultValue(false)] + public bool ShowLine + { + get => showLine; + set + { + if (showLine != value) + { + showLine = value; + foreach (var row in Rows) + { + row.RectSides = showLine + ? ToolStripStatusLabelBorderSides.Bottom + : ToolStripStatusLabelBorderSides.None; + } + } + } + } + + private Color lineColor = Color.FromArgb(233, 236, 244); + + [DefaultValue(typeof(Color), "233, 236, 244")] + public Color LineColor + { + get => lineColor; + set + { + lineColor = value; + foreach (var row in Rows) + { + row.Invalidate(); + } + } + } + + private void Columns_Changed(object sender, UIGridColumn item, int index) + { + if (!columnAdding) + { + ClearRows(); + InitHeaderFooter(); + } + } + + private int showWidth; + + private int ShowWidth + { + get => showWidth; + set + { + showWidth = value; + InitHeaderFooter(); + } + } + + private void CalcCellBounds() + { + if (ColumnCount == 0) return; + int fixedWidth = 0; + int fillWeight = 0; + foreach (var column in Columns) + { + if (column.SizeMode == UIGridColumnSizeMode.Fixed) + fixedWidth += column.Width; + if (column.SizeMode == UIGridColumnSizeMode.Fill) + fillWeight += column.FillWeight; + } + + int existWidth = ShowWidth - fixedWidth; + int left = 0; + foreach (var column in Columns) + { + int width = 0; + if (column.SizeMode == UIGridColumnSizeMode.Fixed) + width = column.Width; + if (column.SizeMode == UIGridColumnSizeMode.Fill) + width += column.FillWeight * existWidth / fillWeight; + + if (width <= 0) + column.Bounds = new Rectangle(left + 1, 1, 10, RowHeight - 3); + else + column.Bounds = new Rectangle(left + 1, 1, width - 2, RowHeight - 3); + + left += width; + } + } + + public delegate void UIGridCellValueChanged(object sender, UIGridColumn column, UIGridRow row, object data, object value); + + public event UIGridCellValueChanged CellValueChanged; + + public event UIGridCellValueChanged CellButtonClick; + + public event UIGridCellValueChanged CellLinkClick; + + public event UIGridCellValueChanged CellDoubleClick; + + public void GridCellValueChange(object sender, UIGridColumn column, UIGridRow row, object data, object value) + { + CellValueChanged?.Invoke(this, column, row, data, value); + } + + public void GridCellButtonClick(object sender, UIGridColumn column, UIGridRow row, object data, object value) + { + CellButtonClick?.Invoke(this, column, row, data, value); + } + + public void GridCellLinkClick(object sender, UIGridColumn column, UIGridRow row, object data, object value) + { + CellLinkClick?.Invoke(this, column, row, data, value); + } + + public void GridCellDoubleClick(object sender, UIGridColumn column, UIGridRow row, object data, object value) + { + CellDoubleClick?.Invoke(sender, column, row, data, value); + } + + private void RowsLayout_SizeChanged(object sender, EventArgs e) + { + CalcCellBounds(); + ScrollBar.Top = RowsLayout.Top; + ScrollBar.Height = RowsLayout.Height; + Cover.Location = RowsLayout.Location; + Cover.Size = RowsLayout.Size; + + int height = Rows.Count * RowHeight; + ShowWidth = height > RowsLayout.Height ? Width - ScrollBarInfo.VerticalScrollBarWidth() - 2 : Width - 2; + if (Rows.Count > 0) + { + flicker.FreezePainting(RowsLayout, true); + + foreach (var row in Rows) + { + if (row.Width != ShowWidth) + { + row.Width = ShowWidth; + } + } + + flicker.FreezePainting(RowsLayout, false); + } + } + + /// + /// 显示斑马条纹 + /// + [Description("显示斑马条纹")] + [DefaultValue(true)] + public bool Stripe { get; set; } = true; + + [DefaultValue(typeof(Color), "White")] + public Color StripeEvenColor { get; set; } + + [DefaultValue(typeof(Color), "235, 243, 255")] + public Color StripeOddColor { get; set; } + + [DefaultValue(typeof(Color), "155, 200, 255")] + public Color RowSelectedColor { get; set; } + + public override void SetStyleColor(UIBaseStyle uiColor) + { + base.SetStyleColor(uiColor); + if (uiColor.IsCustom()) return; + + StripeEvenColor = uiColor.GridStripeEvenColor; + StripeOddColor = uiColor.GridStripeOddColor; + RowSelectedColor = uiColor.GridSelectedColor; + + HeaderFillColor = uiColor.TitleColor; + HeaderForeColor = uiColor.TitleForeColor; + Header.RectColor = uiColor.RectColor; + + RowsLayout.RectColor = uiColor.RectColor; + Footer.RectColor = uiColor.RectColor; + + LineColor = uiColor.GridLineColor; + + ScrollBar.SetStyleColor(uiColor); + + flicker.FreezePainting(RowsLayout, true); + + foreach (var row in Rows) + { + row.SetStyleColor(uiColor); + } + + flicker.FreezePainting(RowsLayout, false); + } + + private ListEx columns = new ListEx(); + + [TypeConverter(typeof(System.ComponentModel.CollectionConverter))]//指定编辑器特性 + [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]//设定序列化特性 + public ListEx Columns + { + get { return columns; } + set + { + ClearRows(); + columns = value; + columns.OnAppend += Columns_Changed; + columns.OnDelete += Columns_Changed; + InitHeaderFooter(); + } + } + + public UIGridColumn GetColumnByGuid(string guid) + { + if (columns == null) return null; + foreach (var column in Columns) + { + if (column.Guid.Equals(guid)) + return column; + } + + return null; + } + + public UIGridColumn GetColumnByName(string name) + { + if (columns == null) return null; + foreach (var column in Columns) + { + if (column.Name.Equals(name)) + return column; + } + + return null; + } + + public UIGridColumn GetColumnByHeaderText(string headerText) + { + if (columns == null) return null; + foreach (var column in Columns) + { + if (column.HeaderText.Equals(headerText)) + return column; + } + + return null; + } + + public UIGridColumn GetColumnByDataPropertyName(string dataPropertyName) + { + if (columns == null) return null; + foreach (var column in Columns) + { + if (column.DataPropertyName.Equals(dataPropertyName)) + return column; + } + + return null; + } + + public UIGridColumn this[int index] + { + get + { + if (columns == null || columns.Count == 0) return null; + if (index < 0 || index >= ColumnCount) return null; + return columns[index]; + } + } + + protected override void OnSizeChanged(EventArgs e) + { + base.OnSizeChanged(e); + SetScrollInfo(); + } + + [Browsable(false)] + public int ColumnCount => Columns == null ? 0 : Columns.Count; + + private void SetScrollInfo() + { + if (ScrollBar == null) + { + return; + } + + var si = ScrollBarInfo.GetInfo(RowsLayout.Handle); + + if (si.ScrollMax > 0) + { + ScrollBar.Maximum = si.ScrollMax; + ShowScrollBar = si.ScrollMax > 0 && si.nMax > 0 && si.nPage > 0; + ScrollBar.Value = si.nPos; + } + else + { + ShowScrollBar = false; + } + + ScrollBar.Top = RowsLayout.Top; + ScrollBar.Height = RowsLayout.Height; + ScrollBar.Width = ScrollBarInfo.VerticalScrollBarWidth() + 1; + ScrollBar.Left = Width - ScrollBar.Width; + } + + private void RowContainer_MouseWheel(object sender, MouseEventArgs e) + { + base.OnMouseWheel(e); + if (ShowScrollBar) + { + var si = ScrollBarInfo.GetInfo(Handle); + if (e.Delta > 10) + { + if (si.nPos > 0) + { + ScrollBarInfo.ScrollUp(Handle); + } + } + else if (e.Delta < -10) + { + if (si.nPos < si.ScrollMax) + { + ScrollBarInfo.ScrollDown(Handle); + } + } + } + + SetScrollInfo(); + } + + [DefaultValue(false)] + [Browsable(false)] + public bool ShowScrollBar + { + get => ScrollBar.Visible; + set + { + ScrollBar.Visible = value; + ScrollBar.BringToFront(); + } + } + + [DefaultValue(false)] + public bool ShowFooter + { + get => Footer.Visible; + set => Footer.Visible = value; + } + + [DefaultValue(true)] + public bool ShowHeader + { + get => Header.Visible; + set => Header.Visible = value; + } + + [DefaultValue(typeof(Color), "64, 158, 255")] + public Color HeaderFillColor + { + get => Header.FillColor; + set + { + Header.FillColor = value; + Header.Invalidate(); + } + } + + [DefaultValue(typeof(Color), "White")] + public Color HeaderForeColor + { + get => Header.ForeColor; + set + { + Header.ForeColor = value; + Header.Invalidate(); + } + } + + [DefaultValue(typeof(Color), "32, 32, 32")] + public Color FooterForeColor + { + get => Footer.ForeColor; + set + { + Footer.ForeColor = value; + Footer.Invalidate(); + } + } + + [DefaultValue(typeof(Color), "White")] + public Color FooterFillColor + { + get => Footer.FillColor; + set + { + Footer.FillColor = value; + Footer.Invalidate(); + } + } + + [DefaultValue(35)] + public int HeaderHeight + { + get => Header.Height; + set + { + Header.Height = value; + } + } + + /// + /// 类型为Image时图片列表 + /// + [DefaultValue(null)] + public ImageList ImageList { get; set; } + + public UIGridColumn AddColumn(UIGridColumn column) + { + Columns.Add(column); + if (!columnAdding) + { + InitHeaderFooter(); + } + + return column; + } + + public void BeginAddColumn() + { + columnAdding = true; + } + + private bool columnAdding; + + public void EndAddColumn() + { + columnAdding = false; + InitHeaderFooter(); + } + + public void InitHeaderFooter() + { + CalcCellBounds(); + Header.Invalidate(); + Footer.Invalidate(); + } + + public UIGridColumn AddColumn(string name, string headerText, string dataPropertyName, UIGridColumnType columnType = UIGridColumnType.Label, UIGridColumnSizeMode sizeMode = UIGridColumnSizeMode.Fill, int fillWeight = 100) + { + return AddColumn(new UIGridColumn(name, headerText, dataPropertyName, columnType, sizeMode, fillWeight)); + } + + private AvoidControlFlicker flicker = new AvoidControlFlicker(); + + private string noData = UILocalize.GridNoData; + + public string NoData + { + get => noData; + set + { + noData = value; + if (dataSource == null) + { + Cover.Text = value; + } + } + } + + public string DataLoading { get; set; } = UILocalize.GridDataLoading; + + public void BeginUpdate() + { + flicker.FreezePainting(RowsLayout, true); + Cover.Text = DataLoading; + Application.DoEvents(); + } + + public void EndUpdate() + { + flicker.FreezePainting(RowsLayout, false); + Application.DoEvents(); + SetScrollInfo(); + Cover.Visible = false; + Cover.SendToBack(); + } + + private void InitLayoutPanel(TableLayoutPanel layout) + { + layout.ColumnCount = ColumnCount; + layout.ColumnStyles.Clear(); + foreach (var column in Columns) + { + SizeType sizeType = column.SizeMode == UIGridColumnSizeMode.Fixed + ? SizeType.Absolute + : SizeType.Percent; + int width = column.SizeMode == UIGridColumnSizeMode.Fixed ? column.Width : column.FillWeight; + layout.ColumnStyles.Add(new ColumnStyle(sizeType, width)); + } + } + + private void HeaderCell_Click(object sender, EventArgs e) + { + if (!RowsLayout.Focused) + RowsLayout.Focus(); + } + + public void UpdateFooterText(UIGridColumn column, string footerText) + { + Footer.Invalidate(); + } + + [DefaultValue(32)] + public int RowHeight { get; set; } = 32; + + private object dataSource; + + [Browsable(false)] + [DefaultValue(null)] + public object DataSource + { + get { return dataSource; } + set + { + if (value != null) + { + if (!(value is DataTable || value.GetType().IsList())) + { + throw new Exception(UILocalize.GridDataSourceException); + } + } + + dataSource = value; + if (dataSource != null) + { + LoadDataSource(); + SelectedFirst(); + } + } + } + + public void ClearRows() + { + DataSource = null; + foreach (var row in Rows) + { + row.Dispose(); + } + + Rows.Clear(); + + Cover.Location = RowsLayout.Location; + Cover.Size = RowsLayout.Size; + Cover.BringToFront(); + Cover.Visible = true; + } + + public void ClearColumns() + { + Columns.Clear(); + ClearRows(); + } + + public void SelectedFirst() + { + if (Rows.Count > 0) + { + SelectedRow = Rows[0]; + } + } + + private UIGridRow selectedRow; + + [Browsable(false)] + [DefaultValue(null)] + public UIGridRow SelectedRow + { + get => selectedRow; + set + { + if (Rows.Count == 0) + { + selectedRow = null; + return; + } + + if (value == null) + { + selectedRow = null; + return; + } + + if (selectedRow == value) + { + return; + } + + if (selectedRow != null) + { + selectedRow.Selected = false; + } + + selectedRow = value; + selectedRow.Selected = true; + flicker.FreezePainting(RowsLayout, true); + RowsLayout.ScrollControlIntoView(value); + flicker.FreezePainting(RowsLayout, false); + } + } + + [Browsable(false)] + [DefaultValue(-1)] + public int SelectedRowIndex + { + get => selectedRow == null ? -1 : selectedRow.RowIndex; + set + { + if (Rows.Count > 0 && value >= 0 && value < Rows.Count) + { + SelectedRow = Rows[value]; + } + } + } + + public List SelectedRows => GetSelectedRows(); + + private List GetSelectedRows() + { + return null; + } + + [Browsable(false)] + private int DataCount + { + get + { + int count = 0; + if (dataSource == null) + { + return count; + } + + if (dataSource is DataTable) + { + count = (dataSource as DataTable).Rows.Count; + } + + if (dataSource.GetType().IsList()) + { + count = (dataSource as IList).Count; + } + + return count; + } + } + + private void LoadDataSource() + { + if (IsDesignMode) + { + return; + } + + if (DataCount == 0) + { + return; + } + + BeginUpdate(); + + if (Rows.Count > DataCount) + { + for (int i = DataCount; i < Rows.Count; i++) + { + Rows[i].Dispose(); + } + + Rows.RemoveRange(DataCount, Rows.Count - DataCount); + } + + int height = DataCount * RowHeight; + ShowWidth = height > RowsLayout.Height ? Width - ScrollBarInfo.VerticalScrollBarWidth() - 2 : Width - 2; + + for (int dataIndex = 0; dataIndex < DataCount; dataIndex++) + { + object data = null; + + if (dataSource is DataTable) + { + data = (dataSource as DataTable).Rows[dataIndex]; + } + if (dataSource.GetType().IsList()) + { + data = (dataSource as IList)[dataIndex]; + } + + if (dataIndex < Rows.Count) + { + Rows[dataIndex].RowIndex = dataIndex; + Rows[dataIndex].Data = data; + Rows[dataIndex].Width = ShowWidth; + } + else + { + UIGridRow row = new UIGridRow(this); + row.Data = data; + row.RowIndex = dataIndex; + row.Left = 1; + row.Top = dataIndex * RowHeight; + row.Height = RowHeight; + RowsLayout.Controls.Add(row); + row.Width = ShowWidth; + Rows.Add(row); + } + } + + EndUpdate(); + } + + private void ScrollBar_ValueChanged(object sender, EventArgs e) + { + if (RowsLayout != null) + { + flicker.FreezePainting(RowsLayout, true); + ScrollBarInfo.SetScrollValue(RowsLayout.Handle, ScrollBar.Value); + flicker.FreezePainting(RowsLayout, false); + } + } + + public readonly List Rows = new List(); + + protected override bool ProcessCmdKey(ref Message msg, Keys keyData) + { + if (keyData == Keys.Up) + { + Prev(); + } + else if (keyData == Keys.Down) + { + Next(); + } + else if (keyData == Keys.Home) + { + First(); + } + else if (keyData == Keys.End) + { + Last(); + } + + return base.ProcessCmdKey(ref msg, keyData); + } + + private void Last() + { + if (Rows.Count > 0) + { + SelectedRow = Rows[Rows.Count - 1]; + } + } + + private void First() + { + if (Rows.Count > 0) + { + SelectedRow = Rows[0]; + } + } + + private void Next() + { + if (Rows.Count > 0) + { + if (SelectedRow != null && SelectedRow.RowIndex < Rows.Count - 1) + SelectedRow = Rows[SelectedRow.RowIndex + 1]; + } + } + + private void Prev() + { + if (Rows.Count > 0) + { + if (SelectedRow != null && SelectedRow.RowIndex > 0) + SelectedRow = Rows[SelectedRow.RowIndex - 1]; + } + } + + #region InitializeComponent + + private void InitializeComponent() + { + this.ScrollBar = new Sunny.UI.UIScrollBar(); + this.RowsLayout = new Sunny.UI.UIRowsLayout(); + this.Footer = new Sunny.UI.UIPanel(); + this.Header = new Sunny.UI.UIPanel(); + this.Cover = new Sunny.UI.UIPanel(); + this.SuspendLayout(); + // + // ScrollBar + // + this.ScrollBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Right))); + this.ScrollBar.BackColor = System.Drawing.Color.Transparent; + this.ScrollBar.Font = new System.Drawing.Font("微软雅黑", 12F); + this.ScrollBar.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(158)))), ((int)(((byte)(255))))); + this.ScrollBar.Location = new System.Drawing.Point(780, 37); + this.ScrollBar.Name = "ScrollBar"; + this.ScrollBar.Size = new System.Drawing.Size(19, 406); + this.ScrollBar.Style = Sunny.UI.UIStyle.Custom; + this.ScrollBar.StyleCustomMode = true; + this.ScrollBar.TabIndex = 18; + this.ScrollBar.ValueChanged += new System.EventHandler(this.ScrollBar_ValueChanged); + this.ScrollBar.Click += new System.EventHandler(this.HeaderCell_Click); + // + // RowsLayout + // + this.RowsLayout.BackColor = System.Drawing.Color.Transparent; + this.RowsLayout.Dock = System.Windows.Forms.DockStyle.Fill; + this.RowsLayout.FillColor = System.Drawing.Color.White; + this.RowsLayout.Font = new System.Drawing.Font("微软雅黑", 12F); + this.RowsLayout.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(32)))), ((int)(((byte)(32)))), ((int)(((byte)(32))))); + this.RowsLayout.Location = new System.Drawing.Point(0, 35); + this.RowsLayout.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.RowsLayout.Name = "RowsLayout"; + this.RowsLayout.RadiusSides = Sunny.UI.UICornerRadiusSides.None; + this.RowsLayout.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(158)))), ((int)(((byte)(255))))); + this.RowsLayout.Size = new System.Drawing.Size(800, 410); + this.RowsLayout.Style = Sunny.UI.UIStyle.Custom; + this.RowsLayout.StyleCustomMode = true; + this.RowsLayout.TabIndex = 13; + this.RowsLayout.Text = null; + this.RowsLayout.SizeChanged += new System.EventHandler(this.RowsLayout_SizeChanged); + // + // Footer + // + this.Footer.BackColor = System.Drawing.Color.Transparent; + this.Footer.Dock = System.Windows.Forms.DockStyle.Bottom; + this.Footer.FillColor = System.Drawing.Color.White; + this.Footer.Font = new System.Drawing.Font("微软雅黑", 12F); + this.Footer.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(32)))), ((int)(((byte)(32)))), ((int)(((byte)(32))))); + this.Footer.Location = new System.Drawing.Point(0, 445); + this.Footer.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.Footer.Name = "Footer"; + this.Footer.RadiusSides = Sunny.UI.UICornerRadiusSides.None; + this.Footer.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(158)))), ((int)(((byte)(255))))); + this.Footer.RectSides = ((System.Windows.Forms.ToolStripStatusLabelBorderSides)(((System.Windows.Forms.ToolStripStatusLabelBorderSides.Left | System.Windows.Forms.ToolStripStatusLabelBorderSides.Right) + | System.Windows.Forms.ToolStripStatusLabelBorderSides.Bottom))); + this.Footer.Size = new System.Drawing.Size(800, 35); + this.Footer.Style = Sunny.UI.UIStyle.Custom; + this.Footer.StyleCustomMode = true; + this.Footer.TabIndex = 11; + this.Footer.Text = null; + this.Footer.PaintOther += new System.Windows.Forms.PaintEventHandler(this.Footer_Paint); + this.Footer.Click += new System.EventHandler(this.HeaderCell_Click); + // + // Header + // + this.Header.BackColor = System.Drawing.Color.Transparent; + this.Header.Dock = System.Windows.Forms.DockStyle.Top; + this.Header.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(158)))), ((int)(((byte)(255))))); + this.Header.Font = new System.Drawing.Font("微软雅黑", 12F); + this.Header.ForeColor = System.Drawing.Color.White; + this.Header.Location = new System.Drawing.Point(0, 0); + this.Header.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.Header.Name = "Header"; + this.Header.RadiusSides = Sunny.UI.UICornerRadiusSides.None; + this.Header.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(158)))), ((int)(((byte)(255))))); + this.Header.RectSides = ((System.Windows.Forms.ToolStripStatusLabelBorderSides)(((System.Windows.Forms.ToolStripStatusLabelBorderSides.Left | System.Windows.Forms.ToolStripStatusLabelBorderSides.Top) + | System.Windows.Forms.ToolStripStatusLabelBorderSides.Right))); + this.Header.Size = new System.Drawing.Size(800, 35); + this.Header.Style = Sunny.UI.UIStyle.Custom; + this.Header.StyleCustomMode = true; + this.Header.TabIndex = 12; + this.Header.Text = null; + this.Header.PaintOther += new System.Windows.Forms.PaintEventHandler(this.Header_Paint); + this.Header.Click += new System.EventHandler(this.HeaderCell_Click); + // + // Cover + // + this.Cover.FillColor = System.Drawing.Color.White; + this.Cover.Font = new System.Drawing.Font("微软雅黑", 12F); + this.Cover.Location = new System.Drawing.Point(0, 35); + this.Cover.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.Cover.Name = "Cover"; + this.Cover.RadiusSides = Sunny.UI.UICornerRadiusSides.None; + this.Cover.Size = new System.Drawing.Size(800, 410); + this.Cover.Style = Sunny.UI.UIStyle.Custom; + this.Cover.StyleCustomMode = true; + this.Cover.TabIndex = 20; + this.Cover.Text = "[ 无数据 ]"; + // + // UIGrid + // + this.Controls.Add(this.Cover); + this.Controls.Add(this.ScrollBar); + this.Controls.Add(this.RowsLayout); + this.Controls.Add(this.Footer); + this.Controls.Add(this.Header); + this.Name = "UIGrid"; + this.RadiusSides = Sunny.UI.UICornerRadiusSides.None; + this.Size = new System.Drawing.Size(800, 480); + this.ResumeLayout(false); + } + + #endregion InitializeComponent + + private void Header_Paint(object sender, PaintEventArgs e) + { + if (ColumnCount == 0) return; + + foreach (var column in Columns) + { + if (column.HeaderText.IsNullOrEmpty()) continue; + + SizeF sf = e.Graphics.MeasureString(column.HeaderText, Font); + if (column.HeaderTextAlignment == StringAlignment.Near) + e.Graphics.DrawString(column.HeaderText, Font, HeaderForeColor, column.Bounds.X, (HeaderHeight - sf.Height) / 2.0f); + if (column.HeaderTextAlignment == StringAlignment.Center) + e.Graphics.DrawString(column.HeaderText, Font, HeaderForeColor, column.Bounds.X + (column.Bounds.Width - sf.Width) / 2.0f, (HeaderHeight - sf.Height) / 2.0f); + if (column.HeaderTextAlignment == StringAlignment.Far) + e.Graphics.DrawString(column.HeaderText, Font, HeaderForeColor, column.Bounds.Right - sf.Width - 1, (HeaderHeight - sf.Height) / 2.0f); + } + } + + private void Footer_Paint(object sender, PaintEventArgs e) + { + if (ColumnCount == 0) return; + + foreach (var column in Columns) + { + if (column.FooterText.IsNullOrEmpty()) continue; + + SizeF sf = e.Graphics.MeasureString(column.FooterText, Font); + if (column.FooterTextAlignment == StringAlignment.Near) + e.Graphics.DrawString(column.FooterText, Font, FooterForeColor, column.Bounds.X, (HeaderHeight - sf.Height) / 2.0f); + if (column.FooterTextAlignment == StringAlignment.Center) + e.Graphics.DrawString(column.FooterText, Font, FooterForeColor, column.Bounds.X + (column.Bounds.Width - sf.Width) / 2.0f, (HeaderHeight - sf.Height) / 2.0f); + if (column.FooterTextAlignment == StringAlignment.Far) + e.Graphics.DrawString(column.FooterText, Font, FooterForeColor, column.Bounds.Right - sf.Width - 1, (HeaderHeight - sf.Height) / 2.0f); + } + } + } + + [ToolboxItem(false)] + public sealed class UIRowsLayout : UIPanel + { + protected override void WndProc(ref Message m) + { + base.WndProc(ref m); + ScrollBarInfo.ShowScrollBar(Handle, 0, false);//0:horizontal,1:vertical,3:both + } + } + + public class AvoidControlFlicker + { + [DllImport("User32.dll", CharSet = CharSet.Auto, EntryPoint = "SendMessageA")] + public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam); + + private int _paintFrozen; + + public void FreezePainting(Control control, bool isToFreeze) + { + if (control == null) + { + return; + } + + if (isToFreeze && control.IsHandleCreated && control.Visible) + { + if (0 == _paintFrozen++) + { + SendMessage(control.Handle, 0x000B, 0, 0); + } + } + + if (!isToFreeze) + { + if (0 == _paintFrozen) + { + return; + } + + if (0 == --_paintFrozen) + { + SendMessage(control.Handle, 0x000B, 1, 0); + control.Invalidate(true); + } + } + } + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/UIGrid.resx b/SunnyUI/Controls/UIGrid.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/SunnyUI/Controls/UIGrid.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SunnyUI/Controls/UIGridColumn.cs b/SunnyUI/Controls/UIGridColumn.cs new file mode 100644 index 00000000..4760e46d --- /dev/null +++ b/SunnyUI/Controls/UIGridColumn.cs @@ -0,0 +1,203 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UIGridColumn.cs + * 文件说明: 表格列定义类 + * 当前版本: V2.2 + * 创建日期: 2020-04-15 + * + * 2020-04-11: V2.2.2 增加UIGrid +******************************************************************************/ + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; + +#pragma warning disable 1591 + +namespace Sunny.UI +{ + public enum UIGridColumnType + { + Label, + Button, + CheckBox, + Combobox, + Image, + LinkLabel, + TextBox, + IntTextBox, + DoubleTextBox + } + + public enum UIGridColumnSizeMode + { + Fill, + Fixed + } + + public delegate string UIGridColumnFormat(object obj); + + [Serializable] + public sealed class UIGridColumn : IStyleInterface + { + /// + /// 名称 + /// + public string Name { get; set; } + + /// + /// 标题名称 + /// + public string HeaderText { get; set; } + + /// + /// 标题名称 + /// + public string FooterText { get; set; } + + /// + /// 标题对齐方式 + /// + [DefaultValue(StringAlignment.Center)] + public StringAlignment HeaderTextAlignment { get; set; } = StringAlignment.Center; + + /// + /// 页脚对齐方式 + /// + [DefaultValue(StringAlignment.Center)] + public StringAlignment FooterTextAlignment { get; set; } = StringAlignment.Center; + + /// + /// Fill模式,自动填充时所占比率 + /// + [DefaultValue(100)] + public int FillWeight { get; set; } + + /// + /// 列类型 + /// + [DefaultValue(UIGridColumnType.Label)] + public UIGridColumnType ColumnType { get; set; } + + /// + /// 列宽度类型 + /// + [DefaultValue(UIGridColumnSizeMode.Fill)] + public UIGridColumnSizeMode SizeMode { get; set; } = UIGridColumnSizeMode.Fill; + + /// + /// 绑定数据名称 + /// + public string DataPropertyName { get; set; } + + /// + /// Fixed模式,固定宽度 + /// + [DefaultValue(100)] + public int Width { get; set; } = 100; + + /// + /// 文字对齐方式 + /// + [DefaultValue(StringAlignment.Center)] + public StringAlignment TextAlignment { get; set; } = StringAlignment.Center; + + public event UIGridColumnFormat OnDataFormat; + + /// + /// 类型为按钮时按钮标题 + /// + public string ButtonText { get; set; } = "Edit"; + + [DefaultValue(true)] + public bool ReadOnly { get; set; } = true; + + private List ComboboxItems = new List(); + + public List GetComboboxItems() + { + return ComboboxItems; + } + + public UIGridColumn() + { + } + + public UIGridColumn(string name, string headerText, string dataPropertyName, + UIGridColumnType columnType = UIGridColumnType.Label, + UIGridColumnSizeMode sizeMode = UIGridColumnSizeMode.Fill, int size = 100) + { + Name = name; + HeaderText = headerText; + DataPropertyName = dataPropertyName; + ColumnType = columnType; + SizeMode = sizeMode; + if (sizeMode == UIGridColumnSizeMode.Fill) + FillWeight = size; + else + Width = size; + } + + public UIGridColumn SetComboboxItems(List objects) + { + ComboboxItems.Clear(); + foreach (object obj in objects) + { + ComboboxItems.Add(obj); + } + + return this; + } + + public string DoFormat(object obj) + { + if (obj == null) + { + return string.Empty; + } + + if (OnDataFormat == null) + { + return obj.ToString(); + } + + try + { + return OnDataFormat?.Invoke(obj); + } + catch + { + return obj.ToString(); + } + } + + [DefaultValue(UIStyle.Blue)] + public UIStyle Style { get; set; } = UIStyle.Blue; + + [DefaultValue(false)] + public bool StyleCustomMode { get; set; } + + public string Version { get; } = UIGlobal.Version; + + public string TagString { get; set; } + + public Rectangle Bounds { get; set; } + + [DefaultValue(2)] + public int TextBoxDecimals { get; set; } = 2; + + public string Guid { get; private set; } = RandomEx.RandomLong().ToString(); + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/UIGridRow.cs b/SunnyUI/Controls/UIGridRow.cs new file mode 100644 index 00000000..f1180751 --- /dev/null +++ b/SunnyUI/Controls/UIGridRow.cs @@ -0,0 +1,604 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UIGridColumn.cs + * 文件说明: 表格行定义类 + * 当前版本: V2.2 + * 创建日期: 2020-04-15 + * + * 2020-04-11: V2.2.2 增加UIGrid + * 2020-04-25: V2.2.4 更新主题配置类 +******************************************************************************/ + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Windows.Forms; + +#pragma warning disable 1591 + +// ReSharper disable All + +namespace Sunny.UI +{ + [ToolboxItem(false)] + public sealed partial class UIGridRow : UIPanel + { + public UIGrid Grid { get; } + + private object data; + public readonly List Cells = new List(); + + private bool selected; + + public UIGridRow(UIGrid grid) + { + InitializeComponent(); + this.DoubleBuffered(); + + Grid = grid; + AddCells(); + Height = grid.RowHeight; + RadiusSides = UICornerRadiusSides.None; + RectSides = ToolStripStatusLabelBorderSides.None; + MouseEnter += Control_MouseEnter; + MouseLeave += Control_MouseLeave; + } + + private UIGridRowState state = UIGridRowState.None; + + public UIGridRowState State + { + get => state; + set + { + state = value; + FillColor = GetRowColor(); + } + } + + public bool Selected + { + get => selected; + set + { + selected = value; + if (State == UIGridRowState.None) + { + FillColor = GetRowColor(); + } + } + } + + public override void SetStyleColor(UIBaseStyle uiColor) + { + base.SetStyleColor(uiColor); + if (uiColor.IsCustom()) return; + + FillColor = GetRowColor(); + + foreach (var cell in Cells) + { + if (cell is IStyleInterface inCell) + { + inCell.Style = uiColor.Name; + } + } + } + + public object Data + { + get => data; + set + { + data = value; + UpdateData(); + } + } + + private void ClearCells() + { + foreach (Control control in Cells) + { + control.Visible = false; + control.Dispose(); + } + + Cells.Clear(); + } + + protected override void OnSizeChanged(EventArgs e) + { + base.OnSizeChanged(e); + foreach (var cell in Cells) + { + UIGridColumn column = Grid.GetColumnByGuid(cell.Tag.ToString()); + cell.Bounds = column.Bounds; + } + } + + private Point MousePoint; + + protected override void OnMouseMove(MouseEventArgs e) + { + base.OnMouseMove(e); + MousePoint = e.Location; + } + + protected override void OnDoubleClick(EventArgs e) + { + base.OnDoubleClick(e); + + UIGridColumn SelectedColumn = null; + foreach (var column in Grid.Columns) + { + if (MousePoint.X >= column.Bounds.Left && MousePoint.Y <= column.Bounds.Right) + { + SelectedColumn = column; + break; + } + } + + if (SelectedColumn != null) + { + if (!ExistDataPropertyName(SelectedColumn.DataPropertyName)) + { + return; + } + + object value = GetValue(SelectedColumn); + if (value != null) + { + Grid.GridCellDoubleClick(Grid, SelectedColumn, this, data, value); + } + } + } + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + + foreach (var column in Grid.Columns) + { + if (column.ColumnType == UIGridColumnType.Label) + { + if (!ExistDataPropertyName(column.DataPropertyName)) + { + continue; + } + + object value = GetValue(column); + string showText = column.DoFormat(value); + + Color color = UIStyles.GetStyleColor(column.Style).PanelForeColor; + SizeF sf = e.Graphics.MeasureString(showText, Font); + if (column.TextAlignment == StringAlignment.Near) + e.Graphics.DrawString(showText, Font, color, column.Bounds.X, 1 + (column.Bounds.Height - sf.Height) / 2.0f); + if (column.TextAlignment == StringAlignment.Center) + e.Graphics.DrawString(showText, Font, color, column.Bounds.X + (column.Bounds.Width - sf.Width) / 2.0f, 1 + (column.Bounds.Height - sf.Height) / 2.0f); + if (column.TextAlignment == StringAlignment.Far) + e.Graphics.DrawString(showText, Font, color, column.Bounds.Right - sf.Width - 1, 1 + (column.Bounds.Height - sf.Height) / 2.0f); + } + } + + if (Grid.ShowLine) + { + e.Graphics.DrawLine(Grid.LineColor, 0, Height - 1, Width, Height - 1); + } + } + + private object GetValue(UIGridColumn column) + { + object value = null; + if (data is DataRow) + { + DataRow row = data as DataRow; + value = row[column.DataPropertyName]; + } + else + { + var cell = data.GetType().GetProperty(column.DataPropertyName); + if (cell != null) + { + value = cell.GetValue(data, null); + } + } + + return value; + } + + private bool ExistDataPropertyName(string dataPropertyName) + { + if (dataPropertyName.IsNullOrEmpty()) return false; + + if (data is DataRow) + { + DataRow row = data as DataRow; + return row.Table.Columns.Contains(dataPropertyName) && row[dataPropertyName] != null && + row[dataPropertyName].ToString() != ""; + } + else + { + var cell = data.GetType().GetProperty(dataPropertyName); + return cell != null; + } + } + + private bool IsUpdateData; + + private void UpdateData() + { + IsUpdateData = true; + foreach (var cell in Cells) + { + UIGridColumn column = Grid.GetColumnByGuid(cell.Tag.ToString()); + + if (!ExistDataPropertyName(column.DataPropertyName) || column.ColumnType == UIGridColumnType.Label) + { + continue; + } + + object value = GetValue(column); + string showText = column.DoFormat(value); + + switch (column.ColumnType) + { + case UIGridColumnType.CheckBox: + UICheckBox checkBox = (UICheckBox)cell; + if (value is int intValue) + { + checkBox.Checked = intValue == 1; + } + + if (value is bool boolValue) + { + checkBox.Checked = boolValue; + } + + break; + + case UIGridColumnType.Combobox: + UIComboBox comboBox = (UIComboBox)cell; + List items = column.GetComboboxItems(); + for (int itemIndex = 0; itemIndex < items.Count; itemIndex++) + { + if (value.ToString().Equals(items[itemIndex].ToString())) + { + comboBox.SelectedIndex = itemIndex; + } + } + + break; + + case UIGridColumnType.Image: + PictureBox picture = (PictureBox)cell; + if (value is int imageIndex) + { + if (Grid.ImageList != null && imageIndex >= 0 && + imageIndex < Grid.ImageList.Images.Count) + { + picture.Image = Grid.ImageList.Images[imageIndex]; + } + } + + break; + + case UIGridColumnType.LinkLabel: + UILinkLabel linkLabel = (UILinkLabel)cell; + linkLabel.Text = showText; + + break; + + case UIGridColumnType.TextBox: + UITextBox textBox = (UITextBox)cell; + cell.Text = showText; + break; + + case UIGridColumnType.IntTextBox: + UITextBox intTextBox = (UITextBox)cell; + intTextBox.IntValue = showText.ToInt(); + + break; + + case UIGridColumnType.DoubleTextBox: + UITextBox doubleTextBox = (UITextBox)cell; + doubleTextBox.DoubleValue = showText.ToDouble(); + + break; + } + } + + IsUpdateData = false; + } + + private void AddCells() + { + if (Grid.ColumnCount == 0) + { + return; + } + + foreach (var column in Grid.Columns) + { + switch (column.ColumnType) + { + case UIGridColumnType.Button: + UIButton button = new UIButton(); + button.Style = column.Style; + button.StyleCustomMode = column.StyleCustomMode; + button.Text = column.ButtonText; + button.BackColor = Color.Transparent; + button.Click += Button_Click; + AddControl(button, column); + break; + + case UIGridColumnType.CheckBox: + UICheckBox checkBox = new UICheckBox(); + checkBox.Style = column.Style; + checkBox.StyleCustomMode = column.StyleCustomMode; + checkBox.BackColor = Color.Transparent; + checkBox.ReadOnly = column.ReadOnly; + checkBox.ValueChanged += CheckBox_ValueChanged; + AddControl(checkBox, column); + break; + + case UIGridColumnType.Combobox: + UIComboBox comboBox = new UIComboBox(); + comboBox.Style = column.Style; + comboBox.StyleCustomMode = column.StyleCustomMode; + comboBox.BackColor = Color.Transparent; + comboBox.DropDownStyle = UIDropDownStyle.DropDownList; + + List items = column.GetComboboxItems(); + foreach (object item in items) + { + comboBox.Items.Add(item); + } + + comboBox.SelectedIndexChanged += ComboBox_SelectedIndexChanged; + AddControl(comboBox, column); + break; + + case UIGridColumnType.Image: + PictureBox picture = new PictureBox(); + picture.BackColor = Color.Transparent; + picture.SizeMode = PictureBoxSizeMode.CenterImage; + AddControl(picture, column); + break; + + case UIGridColumnType.LinkLabel: + UILinkLabel linkLabel = new UILinkLabel(); + linkLabel.Style = column.Style; + linkLabel.StyleCustomMode = column.StyleCustomMode; + linkLabel.BackColor = Color.Transparent; + if (column.TextAlignment == StringAlignment.Near) + linkLabel.TextAlign = ContentAlignment.MiddleLeft; + if (column.TextAlignment == StringAlignment.Center) + linkLabel.TextAlign = ContentAlignment.MiddleCenter; + if (column.TextAlignment == StringAlignment.Far) + linkLabel.TextAlign = ContentAlignment.MiddleRight; + + linkLabel.LinkClicked += LinkLabel_LinkClicked; + AddControl(linkLabel, column); + break; + + case UIGridColumnType.TextBox: + UITextBox textBox = new UITextBox(); + textBox.Style = column.Style; + textBox.StyleCustomMode = column.StyleCustomMode; + textBox.BackColor = Color.Transparent; + textBox.ReadOnly = column.ReadOnly; + textBox.MouseLeave += TextBox_MouseLeave; + AddControl(textBox, column); + break; + + case UIGridColumnType.IntTextBox: + UITextBox intTextBox = new UITextBox(); + intTextBox.Style = column.Style; + intTextBox.StyleCustomMode = column.StyleCustomMode; + intTextBox.Type = UITextBox.UIEditType.Integer; + intTextBox.BackColor = Color.Transparent; + intTextBox.ReadOnly = column.ReadOnly; + intTextBox.MouseLeave += IntTextBox_MouseLeave; + AddControl(intTextBox, column); + break; + + case UIGridColumnType.DoubleTextBox: + UITextBox doubleTextBox = new UITextBox(); + doubleTextBox.Style = column.Style; + doubleTextBox.StyleCustomMode = column.StyleCustomMode; + doubleTextBox.Type = UITextBox.UIEditType.Double; + doubleTextBox.BackColor = Color.Transparent; + doubleTextBox.ReadOnly = column.ReadOnly; + doubleTextBox.MouseLeave += DoubleTextBox_MouseLeave; + doubleTextBox.DecLength = column.TextBoxDecimals; + AddControl(doubleTextBox, column); + break; + } + } + } + + private void CheckBox_ValueChanged(object sender, bool value) + { + if (IsUpdateData) return; + + UICheckBox cell = (UICheckBox)sender; + UIGridColumn column = Grid.GetColumnByGuid(cell.Tag.ToString()); + Grid.GridCellValueChange(Grid, column, this, data, cell.Checked); + } + + private void ComboBox_SelectedIndexChanged(object sender, System.EventArgs e) + { + if (IsUpdateData) return; + + UIComboBox cell = (UIComboBox)sender; + UIGridColumn column = Grid.GetColumnByGuid(cell.Tag.ToString()); + Grid.GridCellValueChange(Grid, column, this, data, cell.SelectedItem); + } + + private void TextBox_MouseLeave(object sender, System.EventArgs e) + { + if (IsUpdateData) return; + + UITextBox cell = (UITextBox)sender; + UIGridColumn column = Grid.GetColumnByGuid(cell.Tag.ToString()); + Grid.GridCellValueChange(Grid, column, this, data, cell.Text); + } + + private void IntTextBox_MouseLeave(object sender, System.EventArgs e) + { + if (IsUpdateData) return; + + UITextBox cell = (UITextBox)sender; + UIGridColumn column = Grid.GetColumnByGuid(cell.Tag.ToString()); + Grid.GridCellValueChange(Grid, column, this, data, cell.IntValue); + } + + private void DoubleTextBox_MouseLeave(object sender, System.EventArgs e) + { + if (IsUpdateData) return; + + UITextBox cell = (UITextBox)sender; + UIGridColumn column = Grid.GetColumnByGuid(cell.Tag.ToString()); + Grid.GridCellValueChange(Grid, column, this, data, cell.DoubleValue); + } + + private void LinkLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + UILinkLabel cell = (UILinkLabel)sender; + UIGridColumn column = Grid.GetColumnByGuid(cell.Tag.ToString()); + Grid.GridCellLinkClick(Grid, column, this, data, cell.Text); + } + + private void Button_Click(object sender, System.EventArgs e) + { + UIButton cell = (UIButton)sender; + UIGridColumn column = Grid.GetColumnByGuid(cell.Tag.ToString()); + Grid.GridCellButtonClick(Grid, column, this, data, cell.Text); + } + + private void Label_Click(object sender, System.EventArgs e) + { + Control ctrl = ((Control)sender).Parent; + while (ctrl != null) + { + if (ctrl is UIRowsLayout panel) + { + if (!panel.Focused) + panel.Focus(); + break; + } + + ctrl = ctrl.Parent; + } + + Grid.SelectedRow = this; + } + + private void AddControl(Control control, UIGridColumn column) + { + Cells.Add(control); + control.Parent = this; + control.Bounds = column.Bounds; + control.Margin = new Padding(1); + control.Tag = column.Guid; + control.Click += Label_Click; + control.MouseEnter += Control_MouseEnter; + control.MouseLeave += Control_MouseLeave; + } + + private void Control_MouseLeave(object sender, System.EventArgs e) + { + FillColor = GetRowColor(); + } + + private void Control_MouseEnter(object sender, System.EventArgs e) + { + if (State == UIGridRowState.None) + { + FillColor = Grid.RowSelectedColor; + } + } + + private int rowIndex; + + public int RowIndex + { + get => rowIndex; + set + { + rowIndex = value; + FillColor = GetRowColor(); + } + } + + private Color GetRowColor() + { + switch (State) + { + case UIGridRowState.Info: + return UIStyles.Gray.GridSelectedColor; + + case UIGridRowState.Success: + return UIStyles.Green.GridSelectedColor; + + case UIGridRowState.Warning: + return UIStyles.Orange.GridSelectedColor; + + case UIGridRowState.Error: + return UIStyles.Red.GridSelectedColor; + + case UIGridRowState.None: + default: + if (Selected) + { + return Grid.RowSelectedColor; + } + + if (Grid.Stripe) + { + return rowIndex.IsEven() ? Grid.StripeEvenColor : Grid.StripeOddColor; + } + else + { + return Color.White; + } + } + } + + private void InitializeComponent() + { + this.SuspendLayout(); + // + // UIGridRow + // + this.Name = "UIGridRow"; + this.RadiusSides = Sunny.UI.UICornerRadiusSides.None; + this.RectSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.None; + this.Size = new System.Drawing.Size(543, 32); + this.Click += new System.EventHandler(this.Label_Click); + this.ResumeLayout(false); + } + } + + public enum UIGridRowState + { + None, + Info, + Success, + Warning, + Error + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/UIGridRow.resx b/SunnyUI/Controls/UIGridRow.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/SunnyUI/Controls/UIGridRow.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SunnyUI/Controls/UIGroupBox.Designer.cs b/SunnyUI/Controls/UIGroupBox.Designer.cs new file mode 100644 index 00000000..a8d31c3c --- /dev/null +++ b/SunnyUI/Controls/UIGroupBox.Designer.cs @@ -0,0 +1,42 @@ +namespace Sunny.UI +{ + partial class UIGroupBox + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + SuspendLayout(); + // + // UIGroupBox + // + Name = "UIGroupBox"; + ResumeLayout(false); + + } + + #endregion + } +} diff --git a/SunnyUI/Controls/UIGroupBox.cs b/SunnyUI/Controls/UIGroupBox.cs new file mode 100644 index 00000000..41b60f2d --- /dev/null +++ b/SunnyUI/Controls/UIGroupBox.cs @@ -0,0 +1,119 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UIGroupBox.cs + * 文件说明: 组框 + * 当前版本: V2.2 + * 创建日期: 2020-01-01 + * + * 2020-01-01: V2.2.0 增加文件说明 + * 2020-04-25: V2.2.4 更新主题配置类 +******************************************************************************/ + +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms; + +namespace Sunny.UI +{ + public partial class UIGroupBox : UIPanel + { + public UIGroupBox() + { + InitializeComponent(); + } + + protected override void OnPaintFill(Graphics g, GraphicsPath path) + { + g.Clear(FillColor); + } + + protected override void OnPaintRect(Graphics g, GraphicsPath path) + { + //IsRadius为True时,显示左上圆角 + bool RadiusLeftTop = RadiusSides.GetValue(UICornerRadiusSides.LeftTop); + //IsRadius为True时,显示左下圆角 + bool RadiusLeftBottom = RadiusSides.GetValue(UICornerRadiusSides.LeftBottom); + //IsRadius为True时,显示右上圆角 + bool RadiusRightTop = RadiusSides.GetValue(UICornerRadiusSides.RightTop); + //IsRadius为True时,显示右下圆角 + bool RadiusRightBottom = RadiusSides.GetValue(UICornerRadiusSides.RightBottom); + path = new Rectangle(0, TitleTop, Width - 1, Height - _titleTop - 1).CreateRoundedRectanglePath(Radius, RadiusLeftTop, RadiusRightTop, RadiusRightBottom, RadiusLeftBottom); + base.OnPaintRect(g, path); + } + + protected override void OnPaintFore(Graphics g, GraphicsPath path) + { + SizeF sf = g.MeasureString(Text, Font); + + float left = TitleInterval; + if (TitleAlignment == HorizontalAlignment.Right) + left = Width - TitleInterval - sf.Width; + if (TitleAlignment == HorizontalAlignment.Center) + left = (Width - sf.Width) / 2.0f; + + float top = TitleTop - sf.Height / 2.0f; + g.FillRectangle(FillColor, left - 2, top, sf.Width + 2, sf.Height); + g.DrawString(Text, Font, ForeColor, left, top); + } + + private int _titleTop = 16; + + [DefaultValue(16)] + public int TitleTop + { + get => _titleTop; + set + { + if (_titleTop != value) + { + _titleTop = value; + Invalidate(); + } + } + } + + private int _titleInterval = 10; + + [DefaultValue(10)] + public int TitleInterval + { + get => _titleInterval; + set + { + if (_titleInterval != value) + { + _titleInterval = value; + Invalidate(); + } + } + } + + public HorizontalAlignment titleAlignment = HorizontalAlignment.Left; + + [DefaultValue(HorizontalAlignment.Left)] + public HorizontalAlignment TitleAlignment + { + get => titleAlignment; + set + { + if (titleAlignment != value) + { + titleAlignment = value; + Invalidate(); + } + } + } + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/UIImageButton.cs b/SunnyUI/Controls/UIImageButton.cs new file mode 100644 index 00000000..0f5dfc62 --- /dev/null +++ b/SunnyUI/Controls/UIImageButton.cs @@ -0,0 +1,399 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UIImageButton.cs + * 文件说明: 图像按钮 + * 当前版本: V2.2 + * 创建日期: 2020-01-01 + * + * 2020-01-01: V2.2.0 增加文件说明 +******************************************************************************/ + +using System; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace Sunny.UI +{ + /// + /// 图像按钮 + /// + public sealed class UIImageButton : PictureBox + { + /// + /// 必需的设计器变量。 + /// + private IContainer components; + + private bool IsPress; + private bool IsHover; + + private Image imageDisabled; + private Image imagePress; + private Image imageHover; + private Image imageSelected; + private bool selected; + private string text; + private ContentAlignment textAlign = ContentAlignment.MiddleCenter; + private Font font = UIFontColor.Font; + private Color foreColor = UIFontColor.Primary; + + [Category("外观")] + [Description("按钮文字")] + [Browsable(true)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] + public override string Text + { + get => text; + set + { + if (text != value) + { + text = value; + Invalidate(); + } + } + } + + [DefaultValue(ContentAlignment.MiddleCenter)] + public ContentAlignment TextAlign + { + get => textAlign; + set + { + textAlign = value; + Invalidate(); + } + } + + [Category("外观")] + [Description("文字字体")] + [Browsable(true)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] + public override Font Font + { + get => font; + set + { + font = value; + Invalidate(); + } + } + + [Category("外观")] + [Description("文字颜色")] + [Browsable(true)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] + [DefaultValue(typeof(Color), "48, 48, 48")] + public override Color ForeColor + { + get => foreColor; + set + { + foreColor = value; + Invalidate(); + } + } + + [Browsable(false)] + [DefaultValue(typeof(Image), "null")] + public new Image InitialImage { get; set; } + + [Browsable(false)] + [DefaultValue(typeof(Image), "null")] + public new Image ErrorImage { get; set; } + + /// + /// 构造函数 + /// + public UIImageButton() + { + InitializeComponent(); + SetDefaultControlStyles(); + SuspendLayout(); + BorderStyle = BorderStyle.None; + ResumeLayout(false); + Width = 100; + Height = 35; + Version = UIGlobal.Version; + Cursor = Cursors.Hand; + } + + public string Version { get; } + + /// + /// 鼠标移上图片 + /// + [DefaultValue(typeof(Image), "null")] + public Image ImageHover + { + get => imageHover; + + set + { + imageHover = value; + Invalidate(); + } + } + + /// + /// 鼠标按下图片 + /// + [DefaultValue(typeof(Image), "null")] + public Image ImagePress + { + get => imagePress; + + set + { + imagePress = value; + Invalidate(); + } + } + + /// + /// 不可用时图片 + /// + [DefaultValue(typeof(Image), "null")] + public Image ImageDisabled + { + get => imageDisabled; + set + { + imageDisabled = value; + Invalidate(); + } + } + + /// + /// 不可用时图片 + /// + [DefaultValue(typeof(Image), "null")] + public Image ImageSelected + { + get => imageSelected; + set + { + imageSelected = value; + Invalidate(); + } + } + + /// + /// 是否选中 + /// + [DefaultValue(typeof(bool), "false")] + public bool Selected + { + get => selected; + + set + { + if (selected != value) + { + selected = value; + Invalidate(); + } + } + } + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing) + { + components?.Dispose(); + } + + base.Dispose(disposing); + } + + private void SetDefaultControlStyles() + { + SetStyle(ControlStyles.UserPaint, true); + SetStyle(ControlStyles.AllPaintingInWmPaint, true); + SetStyle(ControlStyles.DoubleBuffer, true); + + UpdateStyles(); + } + + /// + /// 鼠标按下 + /// + /// e + protected override void OnMouseDown(MouseEventArgs e) + { + base.OnMouseDown(e); + IsPress = true; + Invalidate(); + } + + /// + /// 鼠标弹起 + /// + /// e + protected override void OnMouseUp(MouseEventArgs e) + { + base.OnMouseUp(e); + IsPress = false; + Invalidate(); + } + + /// + /// 鼠标进入 + /// + /// e + protected override void OnMouseEnter(EventArgs e) + { + base.OnMouseEnter(e); + + if (!DesignMode) + { + Cursor = Cursors.Hand; + } + + IsHover = true; + Invalidate(); + } + + /// + /// 鼠标离开 + /// + /// e + protected override void OnMouseLeave(EventArgs e) + { + base.OnMouseLeave(e); + IsHover = false; + IsPress = false; + Invalidate(); + } + + /// + /// 绘制按钮 + /// + /// pe + protected override void OnPaint(PaintEventArgs pe) + { + Image img = Image; + + if (!Enabled) + { + img = imageDisabled; + } + else + { + if (IsPress) + { + img = imagePress; + } + else if (IsHover) + { + img = imageHover; + } + + if (Selected) + { + img = imageSelected; + } + } + + if (img == null) + { + img = Image; + } + + if (img != null) + { + if (SizeMode == PictureBoxSizeMode.Normal) + pe.Graphics.DrawImage(img, new Rectangle(0, 0, img.Width, img.Height)); + + if (SizeMode == PictureBoxSizeMode.StretchImage) + pe.Graphics.DrawImage(img, new Rectangle(0, 0, Width, Height)); + + if (SizeMode == PictureBoxSizeMode.AutoSize) + { + Width = img.Width; + Height = img.Height; + pe.Graphics.DrawImage(img, new Rectangle(0, 0, img.Width, img.Height)); + } + + if (SizeMode == PictureBoxSizeMode.Zoom) + pe.Graphics.DrawImage(img, new Rectangle(0, 0, img.Width, img.Height)); + + if (SizeMode == PictureBoxSizeMode.CenterImage) + pe.Graphics.DrawImage(img, new Rectangle((Width - img.Width) / 2, (Height - img.Height) / 2, img.Width, img.Height)); + } + else + { + base.OnPaint(pe); + } + + SizeF sf = pe.Graphics.MeasureString(Text, Font); + switch (TextAlign) + { + case ContentAlignment.TopLeft: + pe.Graphics.DrawString(text, Font, ForeColor, Padding.Left, Padding.Top); + break; + + case ContentAlignment.TopCenter: + pe.Graphics.DrawString(text, Font, ForeColor, (Width - sf.Width) / 2, Padding.Top); + break; + + case ContentAlignment.TopRight: + pe.Graphics.DrawString(text, Font, ForeColor, Width - Padding.Right - sf.Width, Padding.Top); + break; + + case ContentAlignment.MiddleLeft: + pe.Graphics.DrawString(text, Font, ForeColor, Padding.Left, (Height - sf.Height) / 2); + break; + + case ContentAlignment.MiddleCenter: + pe.Graphics.DrawString(text, Font, ForeColor, (Width - sf.Width) / 2, (Height - sf.Height) / 2); + break; + + case ContentAlignment.MiddleRight: + pe.Graphics.DrawString(text, Font, ForeColor, Width - Padding.Right - sf.Width, (Height - sf.Height) / 2); + break; + + case ContentAlignment.BottomLeft: + pe.Graphics.DrawString(text, Font, ForeColor, Padding.Left, Height - Padding.Bottom - sf.Height); + break; + + case ContentAlignment.BottomCenter: + pe.Graphics.DrawString(text, Font, ForeColor, (Width - sf.Width) / 2, Height - Padding.Bottom - sf.Height); + break; + + case ContentAlignment.BottomRight: + pe.Graphics.DrawString(text, Font, ForeColor, Width - Padding.Right - sf.Width, Height - Padding.Bottom - sf.Height); + break; + } + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + components = new Container(); + } + + #endregion 组件设计器生成的代码 + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/UIImageListBox.Designer.cs b/SunnyUI/Controls/UIImageListBox.Designer.cs new file mode 100644 index 00000000..661e49fa --- /dev/null +++ b/SunnyUI/Controls/UIImageListBox.Designer.cs @@ -0,0 +1,37 @@ +namespace Sunny.UI +{ + partial class UIImageListBox + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + } + + #endregion + } +} diff --git a/SunnyUI/Controls/UIImageListBox.cs b/SunnyUI/Controls/UIImageListBox.cs new file mode 100644 index 00000000..f8ac9901 --- /dev/null +++ b/SunnyUI/Controls/UIImageListBox.cs @@ -0,0 +1,563 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UIImageListBox.cs + * 文件说明: 图片列表框 + * 当前版本: V2.2 + * 创建日期: 2020-01-01 + * + * 2020-01-01: V2.2.0 增加文件说明 + * 2020-04-25: V2.2.4 更新主题配置类 +******************************************************************************/ + +using System; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Design; +using System.Drawing.Drawing2D; +using System.IO; +using System.Windows.Forms; + +namespace Sunny.UI +{ + [DefaultEvent("ItemClick")] + public sealed partial class UIImageListBox : UIPanel + { + private readonly ImageListBox listbox = new ImageListBox(); + private readonly UIPanel panel = new UIPanel(); + private readonly UIScrollBar bar = new UIScrollBar(); + + public UIImageListBox() + { + InitializeComponent(); + ShowText = false; + + Padding = new Padding(2); + + panel.Radius = 0; + panel.RadiusSides = UICornerRadiusSides.None; + panel.RectSides = ToolStripStatusLabelBorderSides.None; + panel.Parent = this; + panel.Width = 0; + panel.Dock = DockStyle.Right; + panel.Show(); + + bar.ValueChanged += Bar_ValueChanged; + bar.Parent = panel; + bar.Dock = DockStyle.Fill; + bar.Style = UIStyle.Custom; + bar.Show(); + + listbox.Parent = this; + listbox.Dock = DockStyle.Fill; + listbox.Show(); + listbox.panel = panel; + listbox.Bar = bar; + + panel.SendToBack(); + + listbox.SelectedIndexChanged += Listbox_SelectedIndexChanged; + listbox.SelectedValueChanged += Listbox_SelectedValueChanged; + listbox.Click += Listbox_Click; + listbox.DoubleClick += Listbox_DoubleClick; + listbox.BeforeDrawItem += Listbox_BeforeDrawItem; + } + + private void Listbox_BeforeDrawItem(object sender, ListBox.ObjectCollection items, DrawItemEventArgs e) + { + if (Items.Count != LastCount) + { + listbox.SetScrollInfo(); + LastCount = Items.Count; + ItemsCountChange?.Invoke(this, null); + } + } + + private void Listbox_DoubleClick(object sender, EventArgs e) + { + if (SelectedItem != null) + ItemDoubleClick?.Invoke(sender, e); + } + + private void Listbox_Click(object sender, EventArgs e) + { + if (SelectedItem != null) + ItemClick?.Invoke(sender, e); + } + + [Browsable(false)] + public int Count => Items.Count; + + public event EventHandler ItemClick; + + public event EventHandler ItemDoubleClick; + + public event EventHandler ItemsCountChange; + + public event EventHandler SelectedIndexChanged; + + public event EventHandler SelectedValueChanged; + + private void Listbox_SelectedValueChanged(object sender, EventArgs e) + { + SelectedValueChanged?.Invoke(sender, e); + Text = listbox.SelectedItem?.ToString(); + } + + private void Listbox_SelectedIndexChanged(object sender, EventArgs e) + { + SelectedIndexChanged?.Invoke(sender, e); + } + + [DefaultValue(100)] + public int ItemHeight + { + get => listbox.ItemHeight; + set => listbox.ItemHeight = value; + } + + [DefaultValue(4)] + public int ImageInterval + { + get => listbox.ImageInterval; + set => listbox.ImageInterval = value; + } + + [DefaultValue(true)] + public bool ShowDescription + { + get => listbox.ShowDescription; + set => listbox.ShowDescription = value; + } + + public override void SetStyleColor(UIBaseStyle uiColor) + { + base.SetStyleColor(uiColor); + if (uiColor.IsCustom()) return; + + if (panel != null) + { + panel.FillColor = Color.White; + } + + if (bar != null) + { + bar.ForeColor = uiColor.PrimaryColor; + bar.HoverColor = uiColor.ButtonFillHoverColor; + bar.PressColor = uiColor.ButtonFillPressColor; + bar.FillColor = Color.White; + } + + listbox?.SetStyleColor(uiColor); + } + + private int LastCount; + + private void Bar_ValueChanged(object sender, EventArgs e) + { + if (listbox != null) + { + ScrollBarInfo.SetScrollValue(listbox.Handle, bar.Value); + } + } + + protected override void OnRadiusChanged(int value) + { + base.OnRadiusChanged(value); + Padding = new Padding(Math.Max(2, value / 2)); + } + + protected override void OnPaintFill(Graphics g, GraphicsPath path) + { + g.Clear(Color.White); + } + + [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] + [Localizable(true)] + [Editor("System.Windows.Forms.Design.ListControlStringCollectionEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))] + [MergableProperty(false)] + [Browsable(false)] + public ListBox.ObjectCollection Items => listbox.Items; + + /// + /// 增加图片 + /// + /// 图片对象 + public void AddImage(ImageListItem record) + { + Items.Add(record); + } + + /// + /// 增加图片 + /// + /// 图片路径 + /// 图片描述 + public void AddImage(string imagePath, string description = "") + { + AddImage(new ImageListItem(imagePath, description)); + } + + public void SelectedFirst() + { + listbox.SelectedFirst(); + } + + [DefaultValue(typeof(Color), "80, 160, 255")] + public Color ItemSelectBackColor + { + get => listbox.ItemSelectBackColor; + set => listbox.ItemSelectBackColor = value; + } + + [DefaultValue(typeof(Color), "White")] + public Color ItemSelectForeColor + { + get => listbox.ItemSelectForeColor; + set => listbox.ItemSelectForeColor = value; + } + + [Browsable(false)] + [DefaultValue(-1)] + public int SelectedIndex + { + get => listbox.SelectedIndex; + set => listbox.SelectedIndex = value; + } + + [Browsable(false)] + [DefaultValue(null)] + public ImageListItem SelectedItem + { + get => listbox.SelectedItem as ImageListItem; + set => listbox.SelectedItem = value; + } + + [Browsable(false)] + [DefaultValue(null)] + public object SelectedValue + { + get => listbox.SelectedValue; + set => listbox.SelectedValue = value; + } + + private sealed class ImageListBox : ListBox, IStyleInterface + { + private UIScrollBar bar; + + [DefaultValue(null)] + public string TagString { get; set; } + + public UIPanel panel { get; set; } + + public UIScrollBar Bar + { + get => bar; + set + { + bar = value; + SetScrollInfo(); + } + } + + public ImageListBox() + { + SetStyle(ControlStyles.AllPaintingInWmPaint, true); + SetStyle(ControlStyles.DoubleBuffer, true); + UpdateStyles(); + + BorderStyle = BorderStyle.None; + ForeColor = UIFontColor.Primary; + IntegralHeight = false; + ItemHeight = 100; + DrawMode = DrawMode.OwnerDrawFixed; + Version = UIGlobal.Version; + SetScrollInfo(); + } + + protected override void OnSizeChanged(EventArgs e) + { + if (!PanelVisible) + { + SetScrollInfo(); + } + } + + public void SetScrollInfo() + { + if (Bar == null || panel == null) + { + return; + } + + PanelVisible = true; + var si = ScrollBarInfo.GetInfo(Handle); + if (si.ScrollMax > 0) + { + Bar.Maximum = si.ScrollMax; + panel.Width = (si.ScrollMax > 0 && si.nMax > 0 && si.nPage > 0) ? SystemInformation.VerticalScrollBarWidth + 2 : 0; + panel.SendToBack(); + Bar.Value = si.nPos; + } + else + { + panel.Width = 0; + } + + PanelVisible = false; + } + + private bool PanelVisible; + + protected override void OnMeasureItem(MeasureItemEventArgs e) + { + e.ItemHeight = e.ItemHeight + ItemHeight; + } + + [DefaultValue(false)] + public bool StyleCustomMode { get; set; } + + public string Version { get; } + + private UIStyle _style = UIStyle.Blue; + private Color _itemSelectBackColor = UIColor.Blue; + private Color _itemSelectForeColor = Color.White; + private int imageInterval = 4; + private bool showDescription = true; + + [Browsable(false)] + public int Count => Items.Count; + + protected override void WndProc(ref Message m) + { + base.WndProc(ref m); + //隐藏滚动条 + ScrollBarInfo.ShowScrollBar(Handle, 3, false);//0:horizontal,1:vertical,3:both + } + + public void SelectedFirst() + { + if (Count > 0 && SelectedIndex < 0) + { + SelectedIndex = 0; + } + } + + protected override void OnMouseWheel(MouseEventArgs e) + { + base.OnMouseWheel(e); + + if (panel.Width > 0) + { + var si = ScrollBarInfo.GetInfo(Handle); + if (e.Delta > 10) + { + if (si.nPos > 0) + { + ScrollBarInfo.ScrollUp(Handle); + } + } + else if (e.Delta < -10) + { + if (si.nPos < si.ScrollMax) + { + ScrollBarInfo.ScrollDown(Handle); + } + } + } + + SetScrollInfo(); + } + + [DefaultValue(4)] + public int ImageInterval + { + get => imageInterval; + set + { + if (imageInterval != value) + { + imageInterval = value; + Invalidate(); + } + } + } + + [DefaultValue(true)] + public bool ShowDescription + { + get => showDescription; + set + { + if (showDescription != value) + { + showDescription = value; + Invalidate(); + } + } + } + + [DefaultValue(UIStyle.Blue)] + public UIStyle Style + { + get => _style; + set => SetStyle(value); + } + + public void SetStyle(UIStyle style) + { + SetStyleColor(UIStyles.GetStyleColor(style)); + _style = style; + } + + public void SetStyleColor(UIBaseStyle uiColor) + { + if (uiColor.IsCustom()) return; + + ItemSelectBackColor = uiColor.ListItemSelectBackColor; + ItemSelectForeColor = uiColor.ListItemSelectForeColor; + + Invalidate(); + } + + [Category("Appearance"), Description("The border color used to paint the control.")] + public Color ItemSelectBackColor + { + get => _itemSelectBackColor; + set + { + if (_itemSelectBackColor != value) + { + _itemSelectBackColor = value; + _style = UIStyle.Custom; + if (DesignMode) + Invalidate(); + } + } + } + + [Category("Appearance"), Description("The border color used to paint the control.")] + public Color ItemSelectForeColor + { + get => _itemSelectForeColor; + set + { + if (_itemSelectForeColor != value) + { + _itemSelectForeColor = value; + _style = UIStyle.Custom; + if (DesignMode) + Invalidate(); + } + } + } + + /// + /// 增加图片 + /// + /// 图片对象 + public void AddImage(ImageListItem record) + { + Items.Add(record); + } + + /// + /// 增加图片 + /// + /// 图片路径 + /// 图片描述 + public void AddImage(string imagePath, string description = "") + { + AddImage(new ImageListItem(imagePath, description)); + } + + public delegate void OnBeforeDrawItem(object sender, ObjectCollection items, DrawItemEventArgs e); + + public event OnBeforeDrawItem BeforeDrawItem; + + protected override void OnDrawItem(DrawItemEventArgs e) + { + base.OnDrawItem(e); + BeforeDrawItem?.Invoke(this, Items, e); + if (Items.Count == 0) + { + return; + } + + e.DrawBackground(); + if (e.Index < 0 || e.Index >= Items.Count) + { + return; + } + + Color backColor = (e.State & DrawItemState.Selected) == DrawItemState.Selected ? ItemSelectBackColor : BackColor; + Color foreColor = (e.State & DrawItemState.Selected) == DrawItemState.Selected ? ItemSelectForeColor : ForeColor; + Rectangle rect = new Rectangle(e.Bounds.X, e.Bounds.Y, e.Bounds.Width - 1, e.Bounds.Height - 1); + + e.Graphics.FillRectangle(BackColor, e.Bounds); + e.Graphics.FillRoundRectangle(backColor, rect, 5); + + Graphics g = e.Graphics; + Matrix oldTransform = g.Transform; + Matrix newTransform = oldTransform.Clone(); + newTransform.Translate(e.Bounds.X, e.Bounds.Y); + g.Transform = newTransform; + ImageListItem item = (ImageListItem)Items[e.Index]; + SizeF sf = g.MeasureString("ImageListBox", Font); + int thumbnailSize = ShowDescription ? ((int)(ItemHeight - ImageInterval - sf.Height)) : (ItemHeight - ImageInterval * 2); + + if (File.Exists(item.ImagePath)) + { + Image image = new Bitmap(item.ImagePath); + + if (image.Width <= thumbnailSize && image.Height <= thumbnailSize) + { + g.DrawImage(image, new Rectangle(ImageInterval, ImageInterval, image.Width, image.Height)); + } + else + { + float scale = thumbnailSize * 1.0f / image.Height; + g.DrawImage(image, new Rectangle(ImageInterval, ImageInterval, (int)(image.Width * scale), (int)(image.Height * scale))); + } + + image.Dispose(); + } + + if (ShowDescription && !string.IsNullOrEmpty(item.Description)) + { + g.DrawString(item.Description, e.Font, foreColor, new Point(ImageInterval, thumbnailSize + ImageInterval)); + } + + g.Transform = oldTransform; + } + } + + public class ImageListItem + { + public string ImagePath { get; set; } + + public string Description { get; set; } + + public ImageListItem(string imagePath, string description = "") + { + ImagePath = imagePath; + Description = description; + } + + public override string ToString() + { + return ImagePath; + } + } + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/UIIntegerUpDown.cs b/SunnyUI/Controls/UIIntegerUpDown.cs new file mode 100644 index 00000000..e921cbc3 --- /dev/null +++ b/SunnyUI/Controls/UIIntegerUpDown.cs @@ -0,0 +1,159 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UIIntegerUpDown.cs + * 文件说明: 数字上下选择框 + * 当前版本: V2.2 + * 创建日期: 2020-01-01 + * + * 2020-01-01: V2.2.0 增加文件说明 + * 2020-04-25: V2.2.4 更新主题配置类 +******************************************************************************/ + +using System; +using System.ComponentModel; + +namespace Sunny.UI +{ + [DefaultEvent("ValueChanged")] + [DefaultProperty("Value")] + public sealed partial class UIIntegerUpDown : UIPanel + { + public delegate void OnValueChanged(object sender, int value); + + public UIIntegerUpDown() + { + InitializeComponent(); + ShowText = false; + } + + public event OnValueChanged ValueChanged; + + private int _value; + + [DefaultValue(0)] + public int Value + { + get => _value; + set + { + value = CheckMaxMin(value); + _value = value; + pnlValue.Text = _value.ToString(); + ValueChanged?.Invoke(this, _value); + } + } + + private int step = 1; + + [DefaultValue(1)] + public int Step + { + get => step; + set { step = Math.Max(1, value); } + } + + private void btnAdd_Click(object sender, EventArgs e) + { + Value += Step; + } + + private void btnDec_Click(object sender, EventArgs e) + { + Value -= Step; + } + + private int _maximum = int.MaxValue; + private int _minimum = int.MinValue; + + [DefaultValue(int.MaxValue)] + public int Maximum + { + get => _maximum; + set + { + _maximum = value; + if (_maximum < _minimum) + _minimum = _maximum; + + Value = CheckMaxMin(Value); + Invalidate(); + } + } + + [DefaultValue(int.MinValue)] + public int Minimum + { + get => _minimum; + set + { + _minimum = value; + if (_minimum > _maximum) + _maximum = _minimum; + + Value = CheckMaxMin(Value); + Invalidate(); + } + } + + private int CheckMaxMin(int value) + { + if (hasMaximum) + { + if (value > _maximum) + value = _maximum; + } + + if (hasMinimum) + { + if (value < _minimum) + value = _minimum; + } + + return value; + } + + private bool hasMaximum; + private bool hasMinimum; + + [DefaultValue(false)] + public bool HasMaximum + { + get => hasMaximum; + set + { + if (hasMaximum != value) + { + hasMaximum = value; + Value = CheckMaxMin(Value); + Invalidate(); + } + } + } + + [DefaultValue(false)] + public bool HasMinimum + { + get => hasMinimum; + set + { + if (hasMinimum != value) + { + hasMinimum = value; + Value = CheckMaxMin(Value); + Invalidate(); + } + } + } + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/UIIntegerUpDown.designer.cs b/SunnyUI/Controls/UIIntegerUpDown.designer.cs new file mode 100644 index 00000000..87b4b819 --- /dev/null +++ b/SunnyUI/Controls/UIIntegerUpDown.designer.cs @@ -0,0 +1,140 @@ +namespace Sunny.UI +{ + partial class UIIntegerUpDown + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.btnDec = new Sunny.UI.UISymbolButton(); + this.btnAdd = new Sunny.UI.UISymbolButton(); + this.pnlValue = new Sunny.UI.UIPanel(); + this.SuspendLayout(); + // + // btnDec + // + this.btnDec.Cursor = System.Windows.Forms.Cursors.Hand; + this.btnDec.Dock = System.Windows.Forms.DockStyle.Left; + this.btnDec.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(158)))), ((int)(((byte)(255))))); + this.btnDec.FillDisableColor = System.Drawing.Color.FromArgb(((int)(((byte)(244)))), ((int)(((byte)(244)))), ((int)(((byte)(244))))); + this.btnDec.FillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(111)))), ((int)(((byte)(168)))), ((int)(((byte)(255))))); + this.btnDec.FillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(131)))), ((int)(((byte)(229))))); + this.btnDec.Font = new System.Drawing.Font("微软雅黑", 12F); + this.btnDec.ForeColor = System.Drawing.Color.White; + this.btnDec.ForeDisableColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(109)))), ((int)(((byte)(103))))); + this.btnDec.ForeHoverColor = System.Drawing.Color.White; + this.btnDec.ForePressColor = System.Drawing.Color.White; + this.btnDec.ImageInterval = 1; + this.btnDec.Location = new System.Drawing.Point(0, 0); + this.btnDec.Margin = new System.Windows.Forms.Padding(0); + this.btnDec.Name = "btnDec"; + this.btnDec.Padding = new System.Windows.Forms.Padding(26, 0, 0, 0); + this.btnDec.RadiusSides = ((Sunny.UI.UICornerRadiusSides)((Sunny.UI.UICornerRadiusSides.LeftTop | Sunny.UI.UICornerRadiusSides.LeftBottom))); + this.btnDec.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(158)))), ((int)(((byte)(255))))); + this.btnDec.RectDisableColor = System.Drawing.Color.FromArgb(((int)(((byte)(173)))), ((int)(((byte)(178)))), ((int)(((byte)(181))))); + this.btnDec.RectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(111)))), ((int)(((byte)(168)))), ((int)(((byte)(255))))); + this.btnDec.RectPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(131)))), ((int)(((byte)(229))))); + this.btnDec.Size = new System.Drawing.Size(29, 29); + this.btnDec.Style = Sunny.UI.UIStyle.Blue; + this.btnDec.Symbol = 61544; + this.btnDec.TabIndex = 0; + this.btnDec.Text = null; + this.btnDec.TipsFont = new System.Drawing.Font("Microsoft Sans Serif", 9F); + this.btnDec.TipsText = null; + this.btnDec.Click += new System.EventHandler(this.btnDec_Click); + // + // btnAdd + // + this.btnAdd.Cursor = System.Windows.Forms.Cursors.Hand; + this.btnAdd.Dock = System.Windows.Forms.DockStyle.Right; + this.btnAdd.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(158)))), ((int)(((byte)(255))))); + this.btnAdd.FillDisableColor = System.Drawing.Color.FromArgb(((int)(((byte)(244)))), ((int)(((byte)(244)))), ((int)(((byte)(244))))); + this.btnAdd.FillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(111)))), ((int)(((byte)(168)))), ((int)(((byte)(255))))); + this.btnAdd.FillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(131)))), ((int)(((byte)(229))))); + this.btnAdd.Font = new System.Drawing.Font("微软雅黑", 12F); + this.btnAdd.ForeColor = System.Drawing.Color.White; + this.btnAdd.ForeDisableColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(109)))), ((int)(((byte)(103))))); + this.btnAdd.ForeHoverColor = System.Drawing.Color.White; + this.btnAdd.ForePressColor = System.Drawing.Color.White; + this.btnAdd.ImageInterval = 1; + this.btnAdd.Location = new System.Drawing.Point(87, 0); + this.btnAdd.Margin = new System.Windows.Forms.Padding(0); + this.btnAdd.Name = "btnAdd"; + this.btnAdd.Padding = new System.Windows.Forms.Padding(26, 0, 0, 0); + this.btnAdd.RadiusSides = ((Sunny.UI.UICornerRadiusSides)((Sunny.UI.UICornerRadiusSides.RightTop | Sunny.UI.UICornerRadiusSides.RightBottom))); + this.btnAdd.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(158)))), ((int)(((byte)(255))))); + this.btnAdd.RectDisableColor = System.Drawing.Color.FromArgb(((int)(((byte)(173)))), ((int)(((byte)(178)))), ((int)(((byte)(181))))); + this.btnAdd.RectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(111)))), ((int)(((byte)(168)))), ((int)(((byte)(255))))); + this.btnAdd.RectPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(131)))), ((int)(((byte)(229))))); + this.btnAdd.Size = new System.Drawing.Size(29, 29); + this.btnAdd.Style = Sunny.UI.UIStyle.Blue; + this.btnAdd.Symbol = 61543; + this.btnAdd.TabIndex = 1; + this.btnAdd.Text = null; + this.btnAdd.TipsFont = new System.Drawing.Font("Microsoft Sans Serif", 9F); + this.btnAdd.TipsText = null; + this.btnAdd.Click += new System.EventHandler(this.btnAdd_Click); + // + // pnlValue + // + this.pnlValue.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlValue.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.pnlValue.FillDisableColor = System.Drawing.Color.FromArgb(((int)(((byte)(244)))), ((int)(((byte)(244)))), ((int)(((byte)(244))))); + this.pnlValue.Font = new System.Drawing.Font("微软雅黑", 12F); + this.pnlValue.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(32)))), ((int)(((byte)(32)))), ((int)(((byte)(32))))); + this.pnlValue.ForeDisableColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(109)))), ((int)(((byte)(103))))); + this.pnlValue.Location = new System.Drawing.Point(29, 0); + this.pnlValue.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.pnlValue.Name = "pnlValue"; + this.pnlValue.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(158)))), ((int)(((byte)(255))))); + this.pnlValue.RectDisableColor = System.Drawing.Color.FromArgb(((int)(((byte)(173)))), ((int)(((byte)(178)))), ((int)(((byte)(181))))); + this.pnlValue.RectSides = ((System.Windows.Forms.ToolStripStatusLabelBorderSides)((System.Windows.Forms.ToolStripStatusLabelBorderSides.Top | System.Windows.Forms.ToolStripStatusLabelBorderSides.Bottom))); + this.pnlValue.RadiusSides = UICornerRadiusSides.None; + this.pnlValue.Size = new System.Drawing.Size(58, 29); + this.pnlValue.Style = Sunny.UI.UIStyle.Blue; + this.pnlValue.TabIndex = 2; + this.pnlValue.Text = "0"; + // + // UIIntegerUpDown + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.pnlValue); + this.Controls.Add(this.btnAdd); + this.Controls.Add(this.btnDec); + this.MinimumSize = new System.Drawing.Size(100, 0); + this.Name = "UIIntegerUpDown"; + this.Size = new System.Drawing.Size(116, 29); + this.ResumeLayout(false); + + } + + #endregion + + private UISymbolButton btnDec; + private UISymbolButton btnAdd; + private UIPanel pnlValue; + } +} diff --git a/SunnyUI/Controls/UIIntegerUpDown.resx b/SunnyUI/Controls/UIIntegerUpDown.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/SunnyUI/Controls/UIIntegerUpDown.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SunnyUI/Controls/UILabel.cs b/SunnyUI/Controls/UILabel.cs new file mode 100644 index 00000000..30730e75 --- /dev/null +++ b/SunnyUI/Controls/UILabel.cs @@ -0,0 +1,383 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UILabel.cs + * 文件说明: 标签 + * 当前版本: V2.2 + * 创建日期: 2020-01-01 + * + * 2020-01-01: V2.2.0 增加文件说明 + * 2020-04-23: V2.2.4 增加UISymbolLabel + * 2020-04-25: V2.2.4 更新主题配置类 +******************************************************************************/ + +using System; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Design; +using System.Drawing.Drawing2D; +using System.Windows.Forms; + +namespace Sunny.UI +{ + public class UILabel : Label, IStyleInterface + { + public UILabel() + { + base.Font = UIFontColor.Font; + Version = UIGlobal.Version; + base.TextAlign = ContentAlignment.MiddleLeft; + ForeColorChanged += UILabel_ForeColorChanged; + } + + private void UILabel_ForeColorChanged(object sender, EventArgs e) + { + _style = UIStyle.Custom; + } + + private Color foreColor = UIStyles.Blue.LabelForeColor; + + [DefaultValue(null)] + public string TagString { get; set; } + + /// + /// 字体颜色 + /// + [Description("字体颜色"), Category("自定义")] + [DefaultValue(typeof(Color), "48, 48, 48")] + public override Color ForeColor + { + get => foreColor; + set + { + foreColor = value; + Invalidate(); + } + } + + public string Version { get; } + + public void SetStyle(UIStyle style) + { + SetStyleColor(UIStyles.GetStyleColor(style)); + _style = style; + } + + [DefaultValue(false)] + public bool StyleCustomMode { get; set; } + + public void SetStyleColor(UIBaseStyle uiColor) + { + if (uiColor.IsCustom()) return; + + ForeColor = uiColor.LabelForeColor; + Invalidate(); + } + + private UIStyle _style = UIStyle.Blue; + + [DefaultValue(UIStyle.Blue)] + public UIStyle Style + { + get => _style; + set => SetStyle(value); + } + + protected override void OnForeColorChanged(EventArgs e) + { + base.OnForeColorChanged(e); + _style = UIStyle.Custom; + } + } + + [ToolboxItem(true)] + [DefaultEvent("Click")] + [DefaultProperty("Text")] + public sealed class UISymbolLabel : UIControl + { + private int _symbolSize = 24; + private int _imageInterval = 2; + + private Color symbolColor = UIFontColor.Primary; + + public UISymbolLabel() + { + ShowRect = false; + foreColor = UIFontColor.Primary; + symbolColor = UIFontColor.Primary; + Width = 170; + Height = 35; + } + + private bool autoSize; + + [Browsable(true)] + public override bool AutoSize + { + get => autoSize; + set + { + autoSize = value; + Invalidate(); + } + } + + [Description("图标颜色"), Category("自定义")] + [DefaultValue(typeof(Color), "48, 48, 48")] + public Color SymbolColor + { + get => symbolColor; + set + { + symbolColor = value; + Invalidate(); + } + } + + /// + /// 字体颜色 + /// + [Description("字体颜色"), Category("自定义")] + [DefaultValue(typeof(Color), "48, 48, 48")] + public override Color ForeColor + { + get => foreColor; + set => SetForeColor(value); + } + + [DefaultValue(24)] + public int SymbolSize + { + get => _symbolSize; + set + { + _symbolSize = Math.Max(value, 16); + _symbolSize = Math.Min(value, 64); + Invalidate(); + } + } + + [DefaultValue(2)] + public int ImageInterval + { + get => _imageInterval; + set + { + _imageInterval = Math.Max(0, value); + Invalidate(); + } + } + + private bool _isCircle; + + [DefaultValue(false)] + public bool IsCircle + { + get => _isCircle; + set + { + _isCircle = value; + if (value) + { + Text = ""; + } + else + { + Invalidate(); + } + } + } + + private int _symbol = FontAwesomeIcons.fa_check; + + [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] + [Editor(typeof(UIImagePropertyEditor), typeof(UITypeEditor))] + [DefaultValue(61452)] + public int Symbol + { + get => _symbol; + set + { + _symbol = value; + Invalidate(); + } + } + + protected override void OnPaintFill(Graphics g, GraphicsPath path) + { + g.FillRectangle(BackColor, Bounds); + } + + private int circleRectWidth = 1; + + [DefaultValue(1)] + public int CircleRectWidth + { + get => circleRectWidth; + set + { + circleRectWidth = value; + Invalidate(); + } + } + + protected override void OnPaintRect(Graphics g, GraphicsPath path) + { + if (IsCircle) + { + int size = Math.Min(Width, Height) - 2 - CircleRectWidth; + using (Pen pn = new Pen(GetRectColor(), CircleRectWidth)) + { + g.SetHighQuality(); + g.DrawEllipse(pn, (Width - size) / 2.0f, (Height - size) / 2.0f, size, size); + g.SetDefaultQuality(); + } + } + else + { + base.OnPaintRect(g, path); + } + } + + protected override void OnPaintFore(Graphics g, GraphicsPath path) + { + Padding = new Padding(_symbolSize + _imageInterval * 2, Padding.Top, Padding.Right, Padding.Bottom); + //填充文字 + g.DrawString(Text, Font, foreColor, Size, Padding, TextAlign); + } + + public override void SetStyleColor(UIBaseStyle uiColor) + { + base.SetStyleColor(uiColor); + if (uiColor.IsCustom()) return; + symbolColor = foreColor = uiColor.LabelForeColor; + } + + protected override void OnPaint(PaintEventArgs e) + { + //重绘父类 + base.OnPaint(e); + + //字体图标 + Font font = FontImageHelper.GetFont(Symbol, SymbolSize); + if (font == null) + { + return; + } + + float left = 0; + float top = 0; + SizeF ImageSize = e.Graphics.GetFontImageSize(Symbol, SymbolSize); + SizeF TextSize = e.Graphics.MeasureString(Text, Font); + + if (autoSize) + { + Width = (int)(SymbolSize + ImageInterval * 3 + TextSize.Width); + Height = (int)Math.Max(SymbolSize, TextSize.Height); + } + + if (TextAlign == ContentAlignment.TopCenter || TextAlign == ContentAlignment.TopLeft || TextAlign == ContentAlignment.TopRight) + { + top = Padding.Top; + } + + if (TextAlign == ContentAlignment.MiddleCenter || TextAlign == ContentAlignment.MiddleLeft || TextAlign == ContentAlignment.MiddleRight) + { + top = Padding.Top + (Height - Padding.Top - Padding.Bottom - ImageSize.Height) / 2.0f; + } + + if (TextAlign == ContentAlignment.BottomCenter || TextAlign == ContentAlignment.BottomLeft || TextAlign == ContentAlignment.BottomRight) + { + top = Height - Padding.Bottom - ImageSize.Height; + } + + if (TextAlign == ContentAlignment.TopCenter || TextAlign == ContentAlignment.MiddleCenter || TextAlign == ContentAlignment.BottomCenter) + { + left = Padding.Left + (Width - TextSize.Width - Padding.Left - Padding.Right) / 2.0f; + left = left - ImageInterval - ImageSize.Width; + } + + if (TextAlign == ContentAlignment.TopLeft || TextAlign == ContentAlignment.MiddleLeft || TextAlign == ContentAlignment.BottomLeft) + { + left = ImageInterval; + } + + if (TextAlign == ContentAlignment.TopRight || TextAlign == ContentAlignment.MiddleRight || TextAlign == ContentAlignment.BottomRight) + { + left = Width - Padding.Right - TextSize.Width - ImageInterval - ImageSize.Width; + } + + if (Text.IsNullOrEmpty()) + e.Graphics.DrawString(char.ConvertFromUtf32(Symbol), font, symbolColor, ImageInterval + (Width - ImageSize.Width) / 2.0f, (Height - ImageSize.Height) / 2.0f); + else + e.Graphics.DrawString(char.ConvertFromUtf32(Symbol), font, symbolColor, left, top); + } + } + + public sealed class UILinkLabel : LinkLabel, IStyleInterface + { + public UILinkLabel() + { + Font = UIFontColor.Font; + LinkBehavior = LinkBehavior.AlwaysUnderline; + Version = UIGlobal.Version; + + ActiveLinkColor = UIColor.Orange; + VisitedLinkColor = UIColor.Red; + LinkColor = UIColor.Blue; + } + + private void UILabel_ForeColorChanged(object sender, EventArgs e) + { + _style = UIStyle.Custom; + } + + [DefaultValue(null)] + public string TagString { get; set; } + + public string Version { get; } + + [DefaultValue(false)] + public bool StyleCustomMode { get; set; } + + public void SetStyle(UIStyle style) + { + SetStyleColor(UIStyles.GetStyleColor(style)); + _style = style; + } + + public void SetStyleColor(UIBaseStyle uiColor) + { + if (uiColor.IsCustom()) return; + + ForeColor = uiColor.LabelForeColor; + LinkColor = uiColor.LabelForeColor; + Invalidate(); + } + + private UIStyle _style = UIStyle.Blue; + + [DefaultValue(UIStyle.Blue)] + public UIStyle Style + { + get => _style; + set => SetStyle(value); + } + + protected override void OnForeColorChanged(EventArgs e) + { + base.OnForeColorChanged(e); + _style = UIStyle.Custom; + } + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/UILedBulb.cs b/SunnyUI/Controls/UILedBulb.cs new file mode 100644 index 00000000..dff1507f --- /dev/null +++ b/SunnyUI/Controls/UILedBulb.cs @@ -0,0 +1,203 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@qq.com + * + * Blog: https://www.cnblogs.com/yhuse + * Gitee: https://gitee.com/yhuse/SunnyUI + * GitHub: https://github.com/yhuse/SunnyUI + * + * SunnyUI can be used for free under the GPL-3.0 license. + * If you use this code, please keep this note. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UILedBulb.cs + * 文件说明: LED灯 + * 文件作者: Steve Marsh + * 开源协议: CPOL + * 引用地址: https://www.codeproject.com/Articles/114122/A-Simple-Vector-Based-LED-User-Control +******************************************************************************/ + +using System; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms; + +#pragma warning disable 1591 + +namespace Sunny.UI +{ + /// + /// The LEDBulb is a .Net control for Windows Forms that emulates an + /// LED light with two states On and Off. The purpose of the control is to + /// provide a sleek looking representation of an LED light that is sizable, + /// has a transparent background and can be set to different colors. + /// + public class UILedBulb : Control + { + #region Public and Private Members + + private Color _color; + private bool _on = true; + private readonly Color _reflectionColor = Color.FromArgb(180, 255, 255, 255); + private readonly Color[] _surroundColor = new Color[] { Color.FromArgb(0, 255, 255, 255) }; + private readonly Timer _timer = new Timer(); + + /// + /// Gets or Sets the color of the LED light + /// + [DefaultValue(typeof(Color), "192, 255, 192")] + public Color Color + { + get { return _color; } + set + { + _color = value; + DarkColor = ControlPaint.Dark(_color); + DarkDarkColor = ControlPaint.DarkDark(_color); + Invalidate(); // Redraw the control + } + } + + /// + /// Dark shade of the LED color used for gradient + /// + [Browsable(false)] + public Color DarkColor { get; protected set; } + + /// + /// Very dark shade of the LED color used for gradient + /// + [Browsable(false)] + public Color DarkDarkColor { get; protected set; } + + /// + /// Gets or Sets whether the light is turned on + /// + [DefaultValue(true)] + public bool On + { + get { return _on; } + set + { + _on = value; + Invalidate(); + } + } + + #endregion Public and Private Members + + #region Constructor + + public UILedBulb() + { + SetStyle(ControlStyles.DoubleBuffer + | ControlStyles.AllPaintingInWmPaint + | ControlStyles.ResizeRedraw + | ControlStyles.UserPaint + | ControlStyles.SupportsTransparentBackColor, true); + + Width = Height = 32; + Color = Color.FromArgb(192, 255, 192); + _timer.Tick += (sender, e) => { On = !On; }; + } + + #endregion Constructor + + #region Methods + + /// + /// Handles the Paint event for this UserControl + /// + protected override void OnPaint(PaintEventArgs e) + { + // Create an offscreen graphics object for double buffering + Bitmap offScreenBmp = new Bitmap(ClientRectangle.Width, ClientRectangle.Height); + using (var g = Graphics.FromImage(offScreenBmp)) + { + g.SmoothingMode = SmoothingMode.HighQuality; + // Draw the control + drawControl(g, On); + // Draw the image to the screen + e.Graphics.DrawImageUnscaled(offScreenBmp, 0, 0); + } + } + + /// + /// Renders the control to an image + /// + private void drawControl(Graphics g, bool on) + { + // Is the bulb on or off + Color lightColor = (on) ? Color : Color.FromArgb(150, DarkColor); + Color darkColor = (on) ? DarkColor : DarkDarkColor; + + // Calculate the dimensions of the bulb + int width = Width - (Padding.Left + Padding.Right); + int height = Height - (Padding.Top + Padding.Bottom); + // Diameter is the lesser of width and height + int diameter = Math.Min(width, height); + // Subtract 1 pixel so ellipse doesn't get cut off + diameter = Math.Max(diameter - 1, 1); + + // Draw the background ellipse + var rectangle = new Rectangle(Padding.Left, Padding.Top, diameter, diameter); + g.FillEllipse(new SolidBrush(darkColor), rectangle); + + // Draw the glow gradient + var path = new GraphicsPath(); + path.AddEllipse(rectangle); + var pathBrush = new PathGradientBrush(path); + pathBrush.CenterColor = lightColor; + pathBrush.SurroundColors = new[] { Color.FromArgb(0, lightColor) }; + g.FillEllipse(pathBrush, rectangle); + + // Draw the white reflection gradient + var offset = Convert.ToInt32(diameter * .15F); + var diameter1 = Convert.ToInt32(rectangle.Width * .8F); + var whiteRect = new Rectangle(rectangle.X - offset, rectangle.Y - offset, diameter1, diameter1); + var path1 = new GraphicsPath(); + path1.AddEllipse(whiteRect); + var pathBrush1 = new PathGradientBrush(path); + pathBrush1.CenterColor = _reflectionColor; + pathBrush1.SurroundColors = _surroundColor; + g.FillEllipse(pathBrush1, whiteRect); + + // Draw the border + g.SetClip(ClientRectangle); + if (On) g.DrawEllipse(new Pen(Color.FromArgb(85, Color.Black), 1F), rectangle); + } + + private int blinkInterval = 1000; + + [DefaultValue(1000)] + public int BlinkInterval + { + get => blinkInterval; + set + { + blinkInterval = Math.Max(100, value); + bool isBlink = Blink; + if (isBlink) _timer.Stop(); + _timer.Interval = blinkInterval; + _timer.Enabled = isBlink; + } + } + + [DefaultValue(false)] + public bool Blink + { + get => _timer.Enabled; + set + { + On = true; + _timer.Stop(); + _timer.Interval = BlinkInterval; + _timer.Enabled = value; + } + } + + #endregion Methods + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/UILedDisplay.cs b/SunnyUI/Controls/UILedDisplay.cs new file mode 100644 index 00000000..4edd509b --- /dev/null +++ b/SunnyUI/Controls/UILedDisplay.cs @@ -0,0 +1,519 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UILedDisplay.cs + * 文件说明: LED 显示器 + * 当前版本: V2.2 + * 创建日期: 2020-01-01 + * + * 2020-01-01: V2.2.0 增加文件说明 +******************************************************************************/ + +using System; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace Sunny.UI +{ + /// + /// LED显示屏 + /// + public class UILedDisplay : Control + { + #region 组件设计器生成的代码 + + /// + /// 必需的设计器变量。 + /// + private readonly IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing) + { + components?.Dispose(); + } + + base.Dispose(disposing); + } + + /// + /// 设计器支持所需的方法 - 不要 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + SuspendLayout(); + ResumeLayout(false); + } + + #endregion 组件设计器生成的代码 + + /// + /// 构造函数 + /// + public UILedDisplay() + { + InitializeComponent(); + SetStyle(ControlStyles.UserPaint, true); + SetStyle(ControlStyles.AllPaintingInWmPaint, true); + SetStyle(ControlStyles.OptimizedDoubleBuffer, true);// 双缓冲 + SetStyle(ControlStyles.DoubleBuffer, true); + SetStyle(ControlStyles.SupportsTransparentBackColor, true); + UpdateStyles(); + + base.BackColor = Color.Black; + base.ForeColor = Color.Lime; + CalcSize(); + Version = UIGlobal.Version; + } + + public string Version { get; } + + private Color borderColor = Color.Black; + private Color borderInColor = Color.Silver; + private Color ledBackColor = Color.FromArgb(0, 0x33, 0); + + /// + /// 边框颜色 + /// + [Description("边框颜色")] + [DefaultValue(typeof(Color), "0, 0, 0")] + public Color BorderColor + { + get => borderColor; + set + { + borderColor = value; + Invalidate(); + } + } + + /// + /// 内线颜色 + /// + [Description("内线颜色")] + [DefaultValue(typeof(Color), "0xC0, 0xC0, 0xC0")] + public Color BorderInColor + { + get => borderInColor; + set + { + borderInColor = value; + Invalidate(); + } + } + + /// + /// LED背景色 + /// + [Description("LED背景色")] + [DefaultValue(typeof(Color), "0, 0x33, 0")] + public Color LedBackColor + { + get => ledBackColor; + set + { + ledBackColor = value; + Invalidate(); + } + } + + private int borderWidth = 1; + private int borderInWidth = 1; + private int intervalH = 2; + private int intervalV = 5; + private int intervalIn = 1; + private int intervalOn = 2; + private int charCount = 10; + + /// + /// 边框宽度 + /// + [DefaultValue(1), Description("边框宽度")] + public int BorderWidth + { + get => borderWidth; + set + { + if (borderWidth != value) + { + borderWidth = value; + CalcSize(); + Invalidate(); + } + } + } + + /// + /// 内线宽度 + /// + [DefaultValue(1), Description("内线宽度")] + public int BorderInWidth + { + get => borderInWidth; + set + { + if (borderInWidth != value) + { + borderInWidth = value; + CalcSize(); + Invalidate(); + } + } + } + + /// + /// 左右边距 + /// + [DefaultValue(2), Description("左右边距")] + public int IntervalH + { + get => intervalH; + set + { + if (intervalH != value) + { + intervalH = value; + CalcSize(); + Invalidate(); + } + } + } + + /// + /// 上下边距 + /// + [DefaultValue(5), Description("上下边距")] + public int IntervalV + { + get => intervalV; + set + { + if (intervalV != value) + { + intervalV = value; + CalcSize(); + Invalidate(); + } + } + } + + /// + /// LED亮块间距 + /// + [DefaultValue(1), Description("LED亮块间距")] + public int IntervalIn + { + get => intervalIn; + set + { + if (intervalIn != value) + { + intervalIn = value; + CalcSize(); + Invalidate(); + } + } + } + + /// + /// LED亮块大小 + /// + [DefaultValue(2), Description("LED亮块大小")] + public int IntervalOn + { + get => intervalOn; + set + { + if (intervalOn != value) + { + intervalOn = value; + CalcSize(); + Invalidate(); + } + } + } + + /// + /// 显示字符个数 + /// + [DefaultValue(10), Description("显示字符个数")] + public int CharCount + { + get => charCount; + set + { + if (charCount != value) + { + charCount = value; + CalcSize(); + Invalidate(); + } + } + } + + /// + /// 计算大小 + /// + public void CalcSize() + { + Width = BorderWidth * 2 + BorderInWidth * 2 + IntervalH * 2 + CharCount * IntervalOn * 5 + + CharCount * IntervalIn * 4 + (CharCount + 1) * IntervalOn + CharCount * 2 * IntervalIn; + Height = BorderWidth * 2 + BorderInWidth * 2 + IntervalV * 2 + IntervalOn * 7 + IntervalIn * 6; + } + + /// + /// 重绘 + /// + /// e + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + int w = Width; + int h = Height; + + //背景 + e.Graphics.FillRectangle(BackColor, 0, 0, w, h); + //外边框 + e.Graphics.FillRectangle(BorderColor, 0, 0, w, BorderWidth); + e.Graphics.FillRectangle(BorderColor, 0, h - BorderWidth, w, BorderWidth); + e.Graphics.FillRectangle(BorderColor, 0, 0, BorderWidth, h); + e.Graphics.FillRectangle(BorderColor, w - BorderWidth, 0, BorderWidth, h); + //内边框 + e.Graphics.FillRectangle(BorderInColor, BorderWidth, BorderWidth, w - BorderWidth * 2, BorderInWidth); + e.Graphics.FillRectangle(BorderInColor, BorderWidth, BorderWidth, BorderInWidth, h - BorderWidth * 2); + e.Graphics.FillRectangle(BorderInColor, BorderWidth, h - BorderWidth - BorderInWidth, w - BorderWidth * 2, BorderInWidth); + e.Graphics.FillRectangle(BorderInColor, w - BorderWidth - BorderInWidth, BorderWidth, BorderInWidth, h - BorderWidth * 2); + + int wc = CharCount * 5 + CharCount + 1; + int hc = 7; + for (int i = 0; i < wc; i++) + { + for (int j = 0; j < hc; j++) + { + e.Graphics.FillRectangle( + LedBackColor, + BorderWidth + BorderInWidth + IntervalH + (IntervalOn + IntervalIn) * i, + BorderWidth + BorderInWidth + IntervalV + (IntervalOn + IntervalIn) * j, + IntervalOn, + IntervalOn); + } + } + + string str = Text.PadLeft(CharCount, ' '); + str = str.Substring(0, CharCount); + int idx = 0; + foreach (char c in str) + { + int charStart = BorderWidth + BorderInWidth + IntervalH + IntervalOn + IntervalIn + + (IntervalOn + IntervalIn) * 6 * idx; + byte[] bts = DotMasks.ContainsKey(c) ? DotMasks[c] : DotMasks[' ']; + for (int i = 0; i < 5; i++) + { + byte bt = bts[i]; + int btStart = charStart + (IntervalOn + IntervalIn) * i; + BitArray array = new BitArray(new[] { bt }); + for (int j = 0; j < 7; j++) + { + bool bon = array[7 - j]; + if (bon) + { + e.Graphics.FillRectangle( + ForeColor, + btStart, + BorderWidth + BorderInWidth + IntervalV + (IntervalOn + IntervalIn) * j, + IntervalOn, + IntervalOn); + } + } + } + + idx++; + } + } + + /// + /// 文字改变 + /// + /// e + protected override void OnTextChanged(EventArgs e) + { + base.OnTextChanged(e); + CalcSize(); + Invalidate(); + } + + /// + /// 增加LED字符 + /// + /// 字符 + /// 显示 + public void Add(char key, byte[] bytes) + { + if (!DotMasks.ContainsKey(key)) + { + DotMasks.Add(key, bytes); + } + } + + private readonly Dictionary DotMasks = new Dictionary + { + [' '] = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00 }, + ['!'] = new byte[] { 0x00, 0x00, 0xFA, 0x00, 0x00 }, + ['\"'] = new byte[] { 0x00, 0xC0, 0x00, 0xC0, 0x00 }, + ['#'] = new byte[] { 0x28, 0x7C, 0x28, 0x7C, 0x28 }, + ['$'] = new byte[] { 0x24, 0x54, 0xFE, 0x54, 0x48 }, + ['%'] = new byte[] { 0x64, 0x68, 0x10, 0x2C, 0x4C }, + ['&'] = new byte[] { 0x6C, 0x92, 0xAA, 0x44, 0x0A }, + ['\''] = new byte[] { 0x00, 0x20, 0xC0, 0x00, 0x00 }, + ['('] = new byte[] { 0x00, 0x00, 0x7C, 0x82, 0x00 }, + [')'] = new byte[] { 0x00, 0x82, 0x7C, 0x00, 0x00 }, + ['*'] = new byte[] { 0x54, 0x38, 0xFE, 0x38, 0x54 }, + ['+'] = new byte[] { 0x10, 0x10, 0x7C, 0x10, 0x10 }, + [','] = new byte[] { 0x00, 0x02, 0x04, 0x00, 0x00 }, + ['-'] = new byte[] { 0x10, 0x10, 0x10, 0x10, 0x10 }, + ['.'] = new byte[] { 0x00, 0x00, 0x02, 0x00, 0x00 }, + ['/'] = new byte[] { 0x04, 0x08, 0x10, 0x20, 0x40 }, + ['0'] = new byte[] { 0x7C, 0x8A, 0x92, 0xA2, 0x7C }, + ['1'] = new byte[] { 0x00, 0x42, 0xFE, 0x02, 0x00 }, + ['2'] = new byte[] { 0x46, 0x8A, 0x92, 0x92, 0x62 }, + ['3'] = new byte[] { 0x44, 0x92, 0x92, 0x92, 0x6C }, + ['4'] = new byte[] { 0xF0, 0x10, 0x10, 0x10, 0xFE }, + ['5'] = new byte[] { 0xF4, 0x92, 0x92, 0x92, 0x8C }, + ['6'] = new byte[] { 0x7C, 0x92, 0x92, 0x92, 0x4C }, + ['7'] = new byte[] { 0xC0, 0x80, 0x8E, 0x90, 0xE0 }, + ['8'] = new byte[] { 0x6C, 0x92, 0x92, 0x92, 0x6C }, + ['9'] = new byte[] { 0x64, 0x92, 0x92, 0x92, 0x7C }, + [':'] = new byte[] { 0x00, 0x00, 0x24, 0x00, 0x00 }, + [';'] = new byte[] { 0x00, 0x02, 0x24, 0x00, 0x00 }, + ['<'] = new byte[] { 0x10, 0x28, 0x44, 0x82, 0x00 }, + ['='] = new byte[] { 0x28, 0x28, 0x28, 0x28, 0x28 }, + ['>'] = new byte[] { 0x00, 0x82, 0x44, 0x28, 0x10 }, + ['?'] = new byte[] { 0x40, 0x80, 0x9A, 0x90, 0x60 }, + ['@'] = new byte[] { 0x7C, 0x92, 0xAA, 0xBA, 0x70 }, + ['A'] = new byte[] { 0x7E, 0x90, 0x90, 0x90, 0x7E }, + ['B'] = new byte[] { 0xFE, 0x92, 0x92, 0x92, 0x6C }, + ['C'] = new byte[] { 0x7C, 0x82, 0x82, 0x82, 0x44 }, + ['D'] = new byte[] { 0xFE, 0x82, 0x82, 0x82, 0x7C }, + ['E'] = new byte[] { 0xFE, 0x92, 0x92, 0x92, 0x82 }, + ['F'] = new byte[] { 0xFE, 0x90, 0x90, 0x90, 0x80 }, + ['G'] = new byte[] { 0x7C, 0x82, 0x92, 0x92, 0x5C }, + ['H'] = new byte[] { 0xFE, 0x10, 0x10, 0x10, 0xFE }, + ['I'] = new byte[] { 0x82, 0x82, 0xFE, 0x82, 0x82 }, + ['J'] = new byte[] { 0x04, 0x02, 0x02, 0x02, 0xFC }, + ['K'] = new byte[] { 0xFE, 0x10, 0x28, 0x44, 0x82 }, + ['L'] = new byte[] { 0xFE, 0x02, 0x02, 0x02, 0x02 }, + ['M'] = new byte[] { 0xFE, 0x40, 0x20, 0x40, 0xFE }, + ['N'] = new byte[] { 0xFE, 0x20, 0x10, 0x08, 0xFE }, + ['O'] = new byte[] { 0x7C, 0x82, 0x82, 0x82, 0x7C }, + ['P'] = new byte[] { 0xFE, 0x90, 0x90, 0x90, 0x60 }, + ['Q'] = new byte[] { 0x7C, 0x82, 0x82, 0x86, 0x7E }, + ['R'] = new byte[] { 0xFE, 0x90, 0x90, 0x90, 0x6E }, + ['S'] = new byte[] { 0x64, 0x92, 0x92, 0x92, 0x4C }, + ['T'] = new byte[] { 0x80, 0x80, 0xFE, 0x80, 0x80 }, + ['U'] = new byte[] { 0xFC, 0x02, 0x02, 0x02, 0xFC }, + ['V'] = new byte[] { 0xE0, 0x18, 0x06, 0x18, 0xE0 }, + ['W'] = new byte[] { 0xFC, 0x02, 0x0C, 0x02, 0xFC }, + ['X'] = new byte[] { 0xC6, 0x28, 0x10, 0x28, 0xC6 }, + ['Y'] = new byte[] { 0xC0, 0x20, 0x1E, 0x20, 0xC0 }, + ['Z'] = new byte[] { 0x86, 0x8A, 0x92, 0xA2, 0xC2 }, + ['['] = new byte[] { 0x00, 0xFE, 0x82, 0x82, 0x00 }, + ['\\'] = new byte[] { 0x40, 0x20, 0x10, 0x08, 0x04 }, + [']'] = new byte[] { 0x00, 0x82, 0x82, 0xFE, 0x00 }, + ['^'] = new byte[] { 0x20, 0x40, 0x80, 0x40, 0x20 }, + ['_'] = new byte[] { 0x02, 0x02, 0x02, 0x02, 0x02 }, + ['`'] = new byte[] { 0x00, 0x00, 0xC0, 0x20, 0x00 }, + ['°'] = new byte[] { 0x00, 0x00, 0x40, 0xA0, 0x40 }, + ['a'] = new byte[] { 0x04, 0x2A, 0x2A, 0x2A, 0x1E }, + ['b'] = new byte[] { 0xFE, 0x22, 0x22, 0x22, 0x1C }, + ['c'] = new byte[] { 0x1C, 0x22, 0x22, 0x22, 0x14 }, + ['d'] = new byte[] { 0x1C, 0x22, 0x22, 0x22, 0xFE }, + ['e'] = new byte[] { 0x1C, 0x2A, 0x2A, 0x2A, 0x18 }, + ['f'] = new byte[] { 0x10, 0x7E, 0x90, 0x90, 0x40 }, + ['g'] = new byte[] { 0x10, 0x2A, 0x2A, 0x2A, 0x1C }, + ['h'] = new byte[] { 0xFE, 0x20, 0x20, 0x20, 0x1E }, + ['i'] = new byte[] { 0x00, 0x22, 0xBE, 0x02, 0x00 }, + ['j'] = new byte[] { 0x00, 0x02, 0xBC, 0x00, 0x00 }, + ['k'] = new byte[] { 0xFE, 0x08, 0x08, 0x14, 0x22 }, + ['l'] = new byte[] { 0x00, 0x82, 0xFE, 0x02, 0x00 }, + ['m'] = new byte[] { 0x3E, 0x20, 0x3E, 0x20, 0x1E }, + ['n'] = new byte[] { 0x3E, 0x20, 0x20, 0x20, 0x1E }, + ['o'] = new byte[] { 0x1C, 0x22, 0x22, 0x22, 0x1C }, + ['p'] = new byte[] { 0x3E, 0x28, 0x28, 0x28, 0x10 }, + ['q'] = new byte[] { 0x10, 0x28, 0x28, 0x28, 0x3E }, + ['r'] = new byte[] { 0x3E, 0x20, 0x20, 0x20, 0x10 }, + ['s'] = new byte[] { 0x12, 0x2A, 0x2A, 0x2A, 0x24 }, + ['t'] = new byte[] { 0x20, 0xFC, 0x22, 0x22, 0x00 }, + ['u'] = new byte[] { 0x3C, 0x02, 0x02, 0x02, 0x3E }, + ['v'] = new byte[] { 0x38, 0x04, 0x02, 0x04, 0x38 }, + ['w'] = new byte[] { 0x3C, 0x02, 0x0C, 0x02, 0x3C }, + ['x'] = new byte[] { 0x22, 0x14, 0x08, 0x14, 0x22 }, + ['y'] = new byte[] { 0x22, 0x14, 0x08, 0x10, 0x20 }, + ['z'] = new byte[] { 0x22, 0x26, 0x2A, 0x32, 0x22 }, + ['{'] = new byte[] { 0x00, 0x10, 0x6C, 0x82, 0x00 }, + ['|'] = new byte[] { 0x00, 0x00, 0xFE, 0x00, 0x00 }, + ['}'] = new byte[] { 0x00, 0x82, 0x6C, 0x10, 0x00 }, + ['~'] = new byte[] { 0x40, 0x80, 0x40, 0x20, 0x40 }, + ['Κ'] = new byte[] { 0xFE, 0x10, 0x28, 0x44, 0x82 }, + ['Χ'] = new byte[] { 0xC6, 0x28, 0x10, 0x28, 0xC6 }, + ['Υ'] = new byte[] { 0xC0, 0x20, 0x1E, 0x20, 0xC0 }, + ['Μ'] = new byte[] { 0xFE, 0x40, 0x20, 0x40, 0xFE }, + ['Γ'] = new byte[] { 0xFE, 0x80, 0x80, 0x80, 0x80 }, + ['Ν'] = new byte[] { 0xFE, 0x20, 0x10, 0x08, 0xFE }, + ['Ξ'] = new byte[] { 0x82, 0x92, 0x92, 0x92, 0x82 }, + ['Ο'] = new byte[] { 0x7C, 0x82, 0x82, 0x82, 0x7C }, + ['Θ'] = new byte[] { 0x7C, 0x92, 0x92, 0x92, 0x7C }, + ['Π'] = new byte[] { 0xFE, 0x80, 0x80, 0x80, 0xFE }, + ['Ρ'] = new byte[] { 0xFE, 0x90, 0x90, 0x90, 0x60 }, + ['Ω'] = new byte[] { 0x7A, 0x8E, 0x80, 0x8E, 0x7A }, + ['Ψ'] = new byte[] { 0xF0, 0x08, 0xFE, 0x08, 0xF0 }, + ['Ι'] = new byte[] { 0x82, 0x82, 0xFE, 0x82, 0x82 }, + ['∞'] = new byte[] { 0x38, 0x44, 0x38, 0x44, 0x38 }, + ['Α'] = new byte[] { 0x7E, 0x90, 0x90, 0x90, 0x7E }, + ['Δ'] = new byte[] { 0x0E, 0x32, 0xC2, 0x32, 0x0E }, + ['Λ'] = new byte[] { 0x0E, 0x30, 0xC0, 0x30, 0x0E }, + ['Ε'] = new byte[] { 0xFE, 0x92, 0x92, 0x92, 0x82 }, + ['Η'] = new byte[] { 0xFE, 0x10, 0x10, 0x10, 0xFE }, + ['Φ'] = new byte[] { 0x38, 0x44, 0xFE, 0x44, 0x38 }, + ['Β'] = new byte[] { 0xFE, 0x92, 0x92, 0x92, 0x6C }, + ['Τ'] = new byte[] { 0x80, 0x80, 0xFE, 0x80, 0x80 }, + ['Ζ'] = new byte[] { 0x86, 0x8A, 0x92, 0xA2, 0xC2 }, + ['Σ'] = new byte[] { 0xC6, 0xAA, 0x92, 0x82, 0x82 }, + [':'] = new byte[] { 0x00, 0x00, 0x24, 0x00, 0x00 }, + }; + + /// + /// 禁用该属性 + /// + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + [Obsolete("禁用该属性!", true)] + [DefaultValue(typeof(Image), "null")] + public new Image BackgroundImage => null; + + /// + /// 禁用该属性 + /// + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + [Obsolete("禁用该属性!", true)] + [DefaultValue(ImageLayout.Tile)] + public new ImageLayout BackgroundImageLayout => ImageLayout.Tile; + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/UILedStopwatch.cs b/SunnyUI/Controls/UILedStopwatch.cs new file mode 100644 index 00000000..6f3741f2 --- /dev/null +++ b/SunnyUI/Controls/UILedStopwatch.cs @@ -0,0 +1,140 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UILedStopwatch.cs + * 文件说明: LED 时钟 + * 当前版本: V2.2 + * 创建日期: 2020-01-01 + * + * 2020-01-01: V2.2.0 增加文件说明 +******************************************************************************/ + +using System; +using System.ComponentModel; + +namespace Sunny.UI +{ + /// + /// LED计时器 + /// + [DefaultEvent("Click")] + [DefaultProperty("TimerTick")] + public sealed class UILedStopwatch : UILedDisplay + { + private readonly System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer(); + + /// + /// 当定时器启动后,每隔1秒触发一次 + /// + public event EventHandler TimerTick; + + /// + /// 构造函数 + /// + public UILedStopwatch() + { + timer.Interval = 50; + timer.Tick += Timer_Tick; + } + + public enum TimeShowType + { + mmss, + mmssfff, + hhmmss + } + + [DefaultValue(TimeShowType.mmss)] + public TimeShowType ShowType { get; set; } = TimeShowType.mmss; + + private void Timer_Tick(object sender, EventArgs e) + { + TimeSpan = DateTime.Now - StartTime; + string text = ""; + switch (ShowType) + { + case TimeShowType.mmss: + text = TimeSpan.Minutes.ToString("D2") + ":" + TimeSpan.Seconds.ToString("D2"); + break; + + case TimeShowType.mmssfff: + text = TimeSpan.Minutes.ToString("D2") + ":" + TimeSpan.Seconds.ToString("D2") + "." + TimeSpan.Milliseconds.ToString("D3"); + break; + + case TimeShowType.hhmmss: + text = TimeSpan.Hours.ToString("D2") + ":" + TimeSpan.Minutes.ToString("D2") + ":" + TimeSpan.Seconds.ToString("D2"); + break; + } + + if (text != Text) + { + Text = text; + TimerTick?.Invoke(this, null); + } + } + + /// + /// OnCreateControl + /// + protected override void OnCreateControl() + { + Text = "00:00"; + } + + /// + /// 计时 + /// + public TimeSpan TimeSpan { get; private set; } + + private DateTime StartTime; + + /// + /// 开始 + /// + public void Start() + { + Text = "00:00"; + StartTime = DateTime.Now; + timer.Start(); + } + + /// + /// 停止 + /// + public void Stop() + { + timer.Stop(); + } + + /// + /// 是否开始工作 + /// + public bool IsWorking => timer.Enabled; + + private bool _active; + + [DefaultValue(false)] + public bool Active + { + get => _active; + set + { + _active = value; + if (_active) + Start(); + else + Stop(); + } + } + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/UILight.cs b/SunnyUI/Controls/UILight.cs new file mode 100644 index 00000000..2fb8e743 --- /dev/null +++ b/SunnyUI/Controls/UILight.cs @@ -0,0 +1,227 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UILight.cs + * 文件说明: 提示灯 + * 当前版本: V2.2 + * 创建日期: 2020-01-01 + * + * 2020-01-01: V2.2.0 增加文件说明 +******************************************************************************/ + +using System; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms; + +namespace Sunny.UI +{ + public enum UILightState + { + On, + Off, + Blink + } + + [ToolboxItem(true)] + public sealed class UILight : UIControl + { + private Timer timer; + + public UILight() + { + ShowRect = false; + ShowText = false; + Radius = Width = Height = 35; + } + + private int interval = 500; + + [DefaultValue(500)] + public int Interval + { + get => interval; + set + { + interval = Math.Max(100, value); + interval = Math.Min(interval, 10000); + if (timer != null) + { + bool isRun = timer.Enabled; + timer.Stop(); + timer.Interval = interval; + if (isRun) + { + timer.Start(); + } + } + } + } + + private UILightState state = UILightState.On; + + [DefaultValue(UILightState.On)] + public UILightState State + { + get => state; + set + { + state = value; + timer?.Stop(); + + if (state == UILightState.On) + { + showColor = onColor; + } + + if (state == UILightState.Off) + { + showColor = offColor; + } + + if (state == UILightState.Blink) + { + if (timer == null) + { + timer = new Timer { Interval = interval }; + timer.Tick += Timer_Tick; + } + + blinkState = true; + showColor = onColor; + timer.Start(); + } + + Invalidate(); + } + } + + private Color showColor = UIColor.Green; + private bool blinkState; + + private void Timer_Tick(object sender, EventArgs e) + { + blinkState = !blinkState; + showColor = blinkState ? onColor : offColor; + Invalidate(); + } + + protected override void OnPaintFill(Graphics g, GraphicsPath path) + { + if (Width != Height) + { + Width = Height; + } + + Color color; + if (State == UILightState.On) + color = OnColor; + else if (State == UILightState.Off) + color = OffColor; + else + color = showColor; + + GraphicsPath CirclePath = new GraphicsPath(); + CirclePath.AddEllipse(2, 2, Width - 4, Height - 4); + g.Smooth(); + + if (ShowCenterColor) + { + Color[] surroundColor = new Color[] { color }; + PathGradientBrush gradientBrush = new PathGradientBrush(path); + gradientBrush.CenterColor = centerColor; + gradientBrush.SurroundColors = surroundColor; + g.FillPath(gradientBrush, CirclePath); + gradientBrush.Dispose(); + } + else + { + g.FillPath(color, CirclePath); + } + + CirclePath.Dispose(); + + if (ShowLightLine) + { + int size = (Width - 4) / 5; + g.DrawArc(centerColor, size, size, Width - size * 2, Height - size * 2, 45, -155); + } + } + + private bool showCenterColor = true; + + [DefaultValue(true)] + public bool ShowCenterColor + { + get => showCenterColor; + set + { + showCenterColor = value; + Invalidate(); + } + } + + private bool showLightLine = true; + + [DefaultValue(true)] + public bool ShowLightLine + { + get => showLightLine; + set + { + showLightLine = value; + Invalidate(); + } + } + + private Color onColor = UIColor.Green; + + [DefaultValue(typeof(Color), "110, 190, 40")] + public Color OnColor + { + get => onColor; + set + { + onColor = value; + Invalidate(); + } + } + + private Color centerColor = UIColor.LightGreen; + + [DefaultValue(typeof(Color), "110, 190, 40")] + public Color CenterColor + { + get => centerColor; + set + { + centerColor = value; + Invalidate(); + } + } + + private Color offColor = UIColor.Gray; + + [DefaultValue(typeof(Color), "140, 140, 140")] + public Color OffColor + { + get => offColor; + set + { + offColor = value; + Invalidate(); + } + } + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/UILine.cs b/SunnyUI/Controls/UILine.cs new file mode 100644 index 00000000..2d85743d --- /dev/null +++ b/SunnyUI/Controls/UILine.cs @@ -0,0 +1,212 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UILine.cs + * 文件说明: 分割线 + * 当前版本: V2.2 + * 创建日期: 2020-01-01 + * + * 2020-01-01: V2.2.0 增加文件说明 +******************************************************************************/ + +using System; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Drawing2D; + +namespace Sunny.UI +{ + [ToolboxItem(true)] + public sealed class UILine : UIControl + { + public UILine() + { + Size = new Size(360, 29); + MinimumSize = new Size(16, 16); + ShowRect = false; + foreColor = UIStyles.Blue.LineForeColor; + fillColor = UIStyles.Blue.PlainColor; + } + + public enum LineDirection + { + /// + /// 水平的 + /// + Horizontal, + + /// + /// 竖直的 + /// + Vertical + } + + private LineDirection direction = LineDirection.Horizontal; + + [DefaultValue(LineDirection.Horizontal)] + public LineDirection Direction + { + get => direction; + set + { + direction = value; + Invalidate(); + } + } + + private int lineSize = 1; + + [Description("线宽")] + [DefaultValue(1)] + public int LineSize + { + get => lineSize; + set + { + lineSize = Math.Max(1, value); + Invalidate(); + } + } + + public override void SetStyleColor(UIBaseStyle uiColor) + { + base.SetStyleColor(uiColor); + if (uiColor.IsCustom()) return; + + fillColor = uiColor.PlainColor; + rectColor = uiColor.RectColor; + foreColor = uiColor.LineForeColor; + Invalidate(); + } + + /// + /// 字体颜色 + /// + [Description("字体颜色"), Category("自定义")] + [DefaultValue(typeof(Color), "48, 48, 48")] + public override Color ForeColor + { + get => foreColor; + set => SetForeColor(value); + } + + protected override void OnPaintFill(Graphics g, GraphicsPath path) + { + g.Clear(fillColor); + if (Direction == LineDirection.Horizontal) + { + int top = (Height - lineSize) / 2; + g.FillRectangle(rectColor, Padding.Left, top, Width - Padding.Left - Padding.Right, lineSize); + g.DrawLine(Color.FromArgb(50, fillColor), Padding.Left, top + lineSize, Width - Padding.Right - 1, top + lineSize); + } + else + { + int left = (Width - lineSize) / 2; + g.FillRectangle(rectColor, left, Padding.Top, lineSize, Height - Padding.Top - Padding.Bottom); + g.DrawLine(Color.FromArgb(50, fillColor), left + lineSize, Padding.Top, left + lineSize, Height - Padding.Bottom - 1); + } + } + + private int textInterval = 10; + + [DefaultValue(10)] + public int TextInterval + { + get => textInterval; + set + { + textInterval = value; + Invalidate(); + } + } + + protected override void OnPaintFore(Graphics g, GraphicsPath path) + { + SizeF sf = g.MeasureString(Text, Font); + + if (Direction == LineDirection.Horizontal) + { + switch (TextAlign) + { + case ContentAlignment.BottomLeft: + g.DrawString(Text, Font, foreColor, TextInterval + 2, (Height + lineSize) / 2.0f); + break; + + case ContentAlignment.MiddleLeft: + g.FillRectangle(fillColor, TextInterval, 0, sf.Width + 3, Height); + g.DrawString(Text, Font, foreColor, TextInterval + 2, (Height - sf.Height) / 2); + break; + + case ContentAlignment.TopLeft: + g.DrawString(Text, Font, foreColor, TextInterval + 2, (Height - lineSize) / 2.0f - sf.Height); + break; + + case ContentAlignment.BottomCenter: + g.DrawString(Text, Font, foreColor, (Width - sf.Width) / 2, (Height + lineSize) / 2.0f); + break; + + case ContentAlignment.MiddleCenter: + g.FillRectangle(fillColor, (Width - sf.Width) / 2 - 2, 0, sf.Width + 3, Height); + g.DrawString(Text, Font, foreColor, (Width - sf.Width) / 2, (Height - sf.Height) / 2); + break; + + case ContentAlignment.TopCenter: + g.DrawString(Text, Font, foreColor, (Width - sf.Width) / 2, (Height - lineSize) / 2.0f - sf.Height); + break; + + case ContentAlignment.BottomRight: + g.DrawString(Text, Font, foreColor, Width - sf.Width - TextInterval - 2, (Height + lineSize) / 2.0f); + break; + + case ContentAlignment.MiddleRight: + g.FillRectangle(fillColor, Width - sf.Width - TextInterval - 4, 0, sf.Width + 3, Height); + g.DrawString(Text, Font, foreColor, Width - sf.Width - TextInterval - 2, (Height - sf.Height) / 2); + break; + + case ContentAlignment.TopRight: + g.DrawString(Text, Font, foreColor, Width - sf.Width - TextInterval - 2, (Height - lineSize) / 2.0f - sf.Height); + break; + } + } + + // if (Direction == LineDirection.Vertical) + // { + // StringFormat format = new StringFormat(); + // format.FormatFlags = StringFormatFlags.DirectionVertical; + // g.DrawString(Text, Font, Brushes.Black, 15, 5, format); + // } + } + + /// + /// 填充颜色,当值为背景色或透明色或空值则不填充 + /// + [Description("填充颜色"), Category("自定义")] + [DefaultValue(typeof(Color), "235, 243, 255")] + public Color FillColor + { + get => fillColor; + set => SetFillColor(value); + } + + /// + /// 边框颜色 + /// + [Description("边框颜色"), Category("自定义")] + [DefaultValue(typeof(Color), "80, 160, 255")] + public Color LineColor + { + get => rectColor; + set => SetRectColor(value); + } + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/UIListBox.Designer.cs b/SunnyUI/Controls/UIListBox.Designer.cs new file mode 100644 index 00000000..d5f95a57 --- /dev/null +++ b/SunnyUI/Controls/UIListBox.Designer.cs @@ -0,0 +1,38 @@ +namespace Sunny.UI +{ + partial class UIListBox + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + + } + + #endregion + } +} diff --git a/SunnyUI/Controls/UIListBox.cs b/SunnyUI/Controls/UIListBox.cs new file mode 100644 index 00000000..f0dcf99f --- /dev/null +++ b/SunnyUI/Controls/UIListBox.cs @@ -0,0 +1,458 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UIListBox.cs + * 文件说明: 列表框 + * 当前版本: V2.2 + * 创建日期: 2020-01-01 + * + * 2020-01-01: V2.2.0 增加文件说明 + * 2020-04-25: V2.2.4 更新主题配置类 +******************************************************************************/ + +using System; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Design; +using System.Drawing.Drawing2D; +using System.Windows.Forms; + +namespace Sunny.UI +{ + [DefaultEvent("ItemClick")] + [DefaultProperty("Items")] + public sealed partial class UIListBox : UIPanel + { + private readonly ListBoxEx listbox = new ListBoxEx(); + private readonly UIPanel panel = new UIPanel(); + private readonly UIScrollBar bar = new UIScrollBar(); + + public UIListBox() + { + InitializeComponent(); + ShowText = false; + Padding = new Padding(2); + + panel.Radius = 0; + panel.RadiusSides = UICornerRadiusSides.None; + panel.RectSides = ToolStripStatusLabelBorderSides.None; + panel.Parent = this; + panel.Width = 0; + panel.Dock = DockStyle.Right; + panel.Show(); + + bar.ValueChanged += Bar_ValueChanged; + bar.Parent = panel; + bar.Dock = DockStyle.Fill; + bar.Style = UIStyle.Custom; + bar.Show(); + + listbox.Parent = this; + listbox.Dock = DockStyle.Fill; + listbox.Show(); + listbox.panel = panel; + listbox.Bar = bar; + + panel.SendToBack(); + + listbox.SelectedIndexChanged += Listbox_SelectedIndexChanged; + listbox.SelectedValueChanged += Listbox_SelectedValueChanged; + listbox.Click += Listbox_Click; + listbox.DoubleClick += Listbox_DoubleClick; + listbox.BeforeDrawItem += Listbox_BeforeDrawItem; + } + + private void Listbox_BeforeDrawItem(object sender, ListBox.ObjectCollection items, DrawItemEventArgs e) + { + if (Items.Count != LastCount) + { + listbox.SetScrollInfo(); + LastCount = Items.Count; + ItemsCountChange?.Invoke(this, null); + } + } + + private void Listbox_DoubleClick(object sender, EventArgs e) + { + if (SelectedItem != null) + ItemDoubleClick?.Invoke(sender, e); + } + + private void Listbox_Click(object sender, EventArgs e) + { + if (SelectedItem != null) + ItemClick?.Invoke(sender, e); + } + + public event EventHandler ItemClick; + + public event EventHandler ItemDoubleClick; + + public event EventHandler ItemsCountChange; + + public event EventHandler SelectedIndexChanged; + + public event EventHandler SelectedValueChanged; + + private void Listbox_SelectedValueChanged(object sender, EventArgs e) + { + SelectedValueChanged?.Invoke(sender, e); + Text = listbox.SelectedItem?.ToString(); + } + + private void Listbox_SelectedIndexChanged(object sender, EventArgs e) + { + SelectedIndexChanged?.Invoke(sender, e); + } + + [DefaultValue(25)] + public int ItemHeight + { + get => listbox.ItemHeight; + set => listbox.ItemHeight = value; + } + + public override void SetStyleColor(UIBaseStyle uiColor) + { + base.SetStyleColor(uiColor); + if (uiColor.IsCustom()) return; + + if (bar != null) + { + bar.ForeColor = uiColor.PrimaryColor; + bar.HoverColor = uiColor.ButtonFillHoverColor; + bar.PressColor = uiColor.ButtonFillPressColor; + bar.FillColor = Color.White; + } + + if (panel != null) + { + panel.FillColor = Color.White; + } + + listbox?.SetStyleColor(uiColor); + } + + private int LastCount; + + private void Bar_ValueChanged(object sender, EventArgs e) + { + if (listbox != null) + { + ScrollBarInfo.SetScrollValue(listbox.Handle, bar.Value); + } + } + + protected override void OnRadiusChanged(int value) + { + base.OnRadiusChanged(value); + Padding = new Padding(Math.Max(2, value / 2)); + } + + protected override void OnPaintFill(Graphics g, GraphicsPath path) + { + g.Clear(Color.White); + } + + [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] + [Localizable(true)] + [Editor("System.Windows.Forms.Design.ListControlStringCollectionEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))] + [MergableProperty(false)] + public ListBox.ObjectCollection Items => listbox.Items; + + [Browsable(false)] + public int Count => Items.Count; + + public void SelectedFirst() + { + listbox.SelectedFirst(); + } + + [DefaultValue(typeof(Color), "80, 160, 255")] + public Color ItemSelectBackColor + { + get => listbox.ItemSelectBackColor; + set => listbox.ItemSelectBackColor = value; + } + + [DefaultValue(typeof(Color), "White")] + public Color ItemSelectForeColor + { + get => listbox.ItemSelectForeColor; + set => listbox.ItemSelectForeColor = value; + } + + [Browsable(false)] + [DefaultValue(-1)] + public int SelectedIndex + { + get => listbox.SelectedIndex; + set => listbox.SelectedIndex = value; + } + + [Browsable(false)] + [DefaultValue(null)] + public object SelectedItem + { + get => listbox.SelectedItem; + set => listbox.SelectedItem = value; + } + + [Browsable(false)] + [DefaultValue(null)] + public object SelectedValue + { + get => listbox.SelectedValue; + set => listbox.SelectedValue = value; + } + } + + /// + /// ListBox + /// + [ToolboxItem(false)] + public sealed class ListBoxEx : ListBox, IStyleInterface + { + private UIScrollBar bar; + + public UIPanel panel { get; set; } + + [DefaultValue(null)] + public string TagString { get; set; } + + public UIScrollBar Bar + { + get => bar; + set + { + bar = value; + SetScrollInfo(); + } + } + + public int Count => Items.Count; + + public ListBoxEx() + { + InitializeComponent(); + + SetStyle(ControlStyles.AllPaintingInWmPaint, true); + SetStyle(ControlStyles.DoubleBuffer, true); + UpdateStyles(); + + BorderStyle = BorderStyle.None; + ForeColor = UIFontColor.Primary; + IntegralHeight = false; + Version = UIGlobal.Version; + SetScrollInfo(); + } + + protected override void OnSizeChanged(EventArgs e) + { + if (!PanelVisible) + { + SetScrollInfo(); + } + } + + public void SetScrollInfo() + { + if (Bar == null || panel == null) + { + return; + } + + PanelVisible = true; + var si = ScrollBarInfo.GetInfo(Handle); + if (si.ScrollMax > 0) + { + Bar.Maximum = si.ScrollMax; + panel.Width = (si.ScrollMax > 0 && si.nMax > 0 && si.nPage > 0) ? SystemInformation.VerticalScrollBarWidth + 2 : 0; + panel.SendToBack(); + Bar.Value = si.nPos; + } + else + { + panel.Width = 0; + } + + PanelVisible = false; + } + + private bool PanelVisible; + + public string Version { get; } + + [DefaultValue(false)] + public bool StyleCustomMode { get; set; } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + SuspendLayout(); + // + // UIListBox + // + BorderStyle = BorderStyle.FixedSingle; + DrawMode = DrawMode.OwnerDrawFixed; + Font = UIFontColor.Font; + IntegralHeight = false; + ItemHeight = 25; + Size = new Size(150, 200); + ResumeLayout(false); + } + + #endregion 组件设计器生成的代码 + + private UIStyle _style = UIStyle.Blue; + private Color _itemSelectBackColor = UIColor.Blue; + private Color _itemSelectForeColor = Color.White; + + [DefaultValue(UIStyle.Blue)] + public UIStyle Style + { + get => _style; + set => SetStyle(value); + } + + protected override void WndProc(ref Message m) + { + base.WndProc(ref m); + //隐藏滚动条 + ScrollBarInfo.ShowScrollBar(Handle, 3, false);//0:horizontal,1:vertical,3:both + } + + protected override void OnMouseWheel(MouseEventArgs e) + { + base.OnMouseWheel(e); + if (panel.Width > 0) + { + var si = ScrollBarInfo.GetInfo(Handle); + if (e.Delta > 10) + { + if (si.nPos > 0) + { + ScrollBarInfo.ScrollUp(Handle); + } + } + else if (e.Delta < -10) + { + if (si.nPos < si.ScrollMax) + { + ScrollBarInfo.ScrollDown(Handle); + } + } + } + + SetScrollInfo(); + } + + public void SetStyle(UIStyle style) + { + SetStyleColor(UIStyles.GetStyleColor(style)); + _style = style; + } + + public void SetStyleColor(UIBaseStyle uiColor) + { + if (uiColor.IsCustom()) return; + + ItemSelectBackColor = uiColor.ListItemSelectBackColor; + ItemSelectForeColor = uiColor.ListItemSelectForeColor; + Invalidate(); + } + + [Category("Appearance"), Description("The border color used to paint the control.")] + public Color ItemSelectBackColor + { + get => _itemSelectBackColor; + set + { + if (_itemSelectBackColor != value) + { + _itemSelectBackColor = value; + _style = UIStyle.Custom; + if (DesignMode) + Invalidate(); + } + } + } + + [Category("Appearance"), Description("The border color used to paint the control.")] + public Color ItemSelectForeColor + { + get => _itemSelectForeColor; + set + { + if (_itemSelectForeColor != value) + { + _itemSelectForeColor = value; + _style = UIStyle.Custom; + if (DesignMode) + Invalidate(); + } + } + } + + public delegate void OnBeforeDrawItem(object sender, ListBox.ObjectCollection items, DrawItemEventArgs e); + + public event OnBeforeDrawItem BeforeDrawItem; + + protected override void OnDrawItem(DrawItemEventArgs e) + { + base.OnDrawItem(e); + BeforeDrawItem?.Invoke(this, Items, e); + if (Items.Count == 0) + { + return; + } + + e.DrawBackground(); + + if (e.Index < 0 || e.Index >= Items.Count) + { + return; + } + + StringFormat sStringFormat = new StringFormat(); + sStringFormat.LineAlignment = StringAlignment.Center; + + Color backColor = (e.State & DrawItemState.Selected) == DrawItemState.Selected ? ItemSelectBackColor : BackColor; + Color foreColor = (e.State & DrawItemState.Selected) == DrawItemState.Selected ? ItemSelectForeColor : ForeColor; + + Rectangle rect = new Rectangle(e.Bounds.X, e.Bounds.Y, e.Bounds.Width - 1, e.Bounds.Height - 1); + e.Graphics.FillRectangle(BackColor, e.Bounds); + e.Graphics.FillRoundRectangle(backColor, rect, 5); + e.Graphics.DrawString(Items[e.Index].ToString(), e.Font, foreColor, e.Bounds, sStringFormat); + } + + protected override void OnMeasureItem(MeasureItemEventArgs e) + { + base.OnMeasureItem(e); + e.ItemHeight = e.ItemHeight + ItemHeight; + } + + public void SelectedFirst() + { + if (Items.Count > 0 && SelectedIndex < 0) + { + SelectedIndex = 0; + } + } + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/UIListBox.resx b/SunnyUI/Controls/UIListBox.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/SunnyUI/Controls/UIListBox.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SunnyUI/Controls/UILogo.cs b/SunnyUI/Controls/UILogo.cs new file mode 100644 index 00000000..db69ef81 --- /dev/null +++ b/SunnyUI/Controls/UILogo.cs @@ -0,0 +1,179 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UILogo.cs + * 文件说明: SunnyUI LOGO + * 当前版本: V2.2 + * 创建日期: 2020-01-01 + * + * 2020-01-01: V2.2.0 增加文件说明 +******************************************************************************/ + +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Imaging; +using System.Windows.Forms; + +#pragma warning disable 1591 + +namespace Sunny.UI +{ + [ToolboxItem(false)] + public sealed class UILogo : UIControl + { + [ToolboxItem(true)] + public UILogo() + { + ShowText = ShowRect = false; + Width = 300; + Height = 80; + + MinimumSize = MaximumSize = new Size(300, 80); + + ForeColor = UIFontColor.Primary; + } + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + + Graphics g = e.Graphics; + g.Clear(BackColor); + g.SetHighQuality(); + int x = 9; + int y = 9; + int n1 = 66; + int n3 = -20; + + g.FillPie(new SolidBrush(UIColor.Blue), x, y, n1, n1, -30, 60); + g.FillPie(new SolidBrush(UIColor.Gray), x, y, n1, n1, 30, 60); + g.FillPie(new SolidBrush(UIColor.Red), x, y, n1, n1, 90, 60); + g.FillPie(new SolidBrush(UIColor.Orange), x, y, n1, n1, 150, 60); + g.FillPie(new SolidBrush(Color.FromArgb(255, 196, 0)), x, y, n1, n1, 210, 60); + g.FillPie(new SolidBrush(UIColor.Green), x, y, n1, n1, 270, 60); + + g.FillEllipse(BackColor, x - n3, y - n3, n1 + n3 * 2, n1 + n3 * 2); + g.SetHighQuality(); + int len = 60; + x = x + 34; + y = y + 34; + g.DrawLine(new Pen(BackColor, 2), x, y, x - len, y - len / 2 - 4); + g.DrawLine(new Pen(BackColor, 2), x, y, x - len, y + len / 2 + 4); + + g.DrawLine(new Pen(BackColor, 2), x, y, x + len, y - len / 2 - 4); + g.DrawLine(new Pen(BackColor, 2), x, y, x + len, y + len / 2 + 4); + g.SetDefaultQuality(); + + g.DrawLine(new Pen(BackColor, 2), x, y, x, y - 60); + g.DrawLine(new Pen(BackColor, 2), x, y, x, y + 60); + + //S + DrawVerticalLine(g, ForeColor, 88, 22, 6, 17, true); + DrawVerticalLine(g, ForeColor, 109, 22, 6, 10, true); + DrawVerticalLine(g, ForeColor, 109, 37, 6, 22); + DrawVerticalLine(g, ForeColor, 88, 46, 6, 13); + DarwHorizontalLine(g, ForeColor, 94, 22, 15, 2, -3, true); + DarwHorizontalLine(g, ForeColor, 94, 37, 15, 2, -3, true); + DarwHorizontalLine(g, ForeColor, 94, 57, 15, 2, -2); + //u + DrawVerticalLine(g, ForeColor, 123, 33, 6, 26); + DrawVerticalLine(g, ForeColor, 142, 33, 6, 26); + DarwHorizontalLine(g, ForeColor, 129, 57, 13, 2, -2); + //n + DrawVerticalLine(g, ForeColor, 156, 33, 6, 26); + DrawVerticalLine(g, ForeColor, 175, 33, 6, 26); + DarwHorizontalLine(g, ForeColor, 162, 33, 13, 2, -3, true); + //n + DrawVerticalLine(g, ForeColor, 189, 33, 6, 26); + DrawVerticalLine(g, ForeColor, 208, 33, 6, 26); + DarwHorizontalLine(g, ForeColor, 195, 33, 13, 2, -3, true); + //y + DrawVerticalLine(g, ForeColor, 222, 33, 6, 26, true); + DrawVerticalLine(g, ForeColor, 241, 33, 6, 41); + DarwHorizontalLine(g, ForeColor, 228, 57, 13, 2, -2, true); + DrawVerticalLine(g, ForeColor, 222, 64, 6, 10); + DarwHorizontalLine(g, ForeColor, 228, 72, 13, 2, -2); + //U + DrawVerticalLine(g, FillColor, 255, 22, 6, 37); + DrawVerticalLine(g, FillColor, 274, 22, 6, 37); + DarwHorizontalLine(g, FillColor, 261, 57, 13, 2, -2); + //I + DrawVerticalLine(g, FillColor, 288, 22, 6, 37); + } + + public void SaveLogo(string fileName) + { + this.SaveToImage(fileName, ImageFormat.Png); + } + + public override void SetStyleColor(UIBaseStyle uiColor) + { + base.SetStyleColor(uiColor); + if (uiColor.IsCustom()) return; + + foreColor = UIFontColor.Primary; + fillColor = uiColor.MenuSelectedColor; + Invalidate(); + } + + /// + /// 画垂直线 + /// + private void DrawVerticalLine(Graphics g, Color color, int left, int top, int width, int height, bool showBottomShadow = false) + { + g.FillRectangle(color, left, top, width, height); + g.DrawLine(Color.FromArgb(60, color), left - 1, top - 1, left - 1 + width, top - 1); + g.DrawLine(color, left - 1, top, left + 1, top); + g.DrawLine(Color.FromArgb(60, color), left - 2, top - 1, left - 2, top); + g.DrawLine(Color.FromArgb(60, color), left - 1, top + 1, left - 1, top + height - 1); + g.DrawLine(Color.FromArgb(130, color), left + width, top, left + width, top + height - 1); + if (showBottomShadow) + { + g.DrawLine(Color.FromArgb(130, color), left, top + height, left + width, top + height); + } + } + + /// + /// 画水平线 + /// + private void DarwHorizontalLine(Graphics g, Color color, int left, int top, int width, int height, int interval = 0, bool showBottomShadow = false) + { + g.FillRectangle(color, left, top, width, height); + g.DrawLine(Color.FromArgb(60, color), left, top - 1, left + width + interval, top - 1); + if (showBottomShadow) + g.DrawLine(Color.FromArgb(130, color), left + 1, top + height, left + width, top + height); + } + + /// + /// 字体颜色 + /// + [Description("字体颜色"), Category("自定义")] + [DefaultValue(typeof(Color), "48, 48, 48")] + public override Color ForeColor + { + get => foreColor; + set => SetForeColor(value); + } + + /// + /// 填充颜色,当值为背景色或透明色或空值则不填充 + /// + [Description("填充颜色"), Category("自定义")] + [DefaultValue(typeof(Color), "80, 160, 255")] + public Color FillColor + { + get => fillColor; + set => SetFillColor(value); + } + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/UINavBar.Designer.cs b/SunnyUI/Controls/UINavBar.Designer.cs new file mode 100644 index 00000000..251254ce --- /dev/null +++ b/SunnyUI/Controls/UINavBar.Designer.cs @@ -0,0 +1,36 @@ +namespace Sunny.UI +{ + partial class UINavBar + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/SunnyUI/Controls/UINavBar.cs b/SunnyUI/Controls/UINavBar.cs new file mode 100644 index 00000000..2cd79786 --- /dev/null +++ b/SunnyUI/Controls/UINavBar.cs @@ -0,0 +1,481 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UINavBar.cs + * 文件说明: 导航栏 + * 当前版本: V2.2 + * 创建日期: 2020-01-01 + * + * 2020-01-01: V2.2.0 增加文件说明 +******************************************************************************/ + +using System; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace Sunny.UI +{ + [DefaultEvent("MenuItemClick")] + [DefaultProperty("Nodes")] + public sealed partial class UINavBar : ScrollableControl, IStyleInterface + { + public readonly UINavMenu Menu = new UINavMenu(); + + private readonly UIContextMenuStrip NavBarMenu = new UIContextMenuStrip(); + + public UINavBar() + { + InitializeComponent(); + + SetStyle(ControlStyles.AllPaintingInWmPaint, true); + SetStyle(ControlStyles.DoubleBuffer, true); + SetStyle(ControlStyles.ResizeRedraw, true); + SetStyle(ControlStyles.Selectable, true); + SetStyle(ControlStyles.SupportsTransparentBackColor, true); + SetStyle(ControlStyles.UserPaint, true); + SetStyle(ControlStyles.OptimizedDoubleBuffer, true); + DoubleBuffered = true; + UpdateStyles(); + Font = UIFontColor.Font; + + NavBarMenu.VisibleChanged += NavBarMenu_VisibleChanged; + Dock = DockStyle.Top; + Width = 500; + Height = 110; + Version = UIGlobal.Version; + } + + [DefaultValue(null)] + public TabControl TabControl { get; set; } + + public void SetNodeItem(TreeNode node, NavMenuItem item) + { + MenuHelper.Add(node, item); + } + + public void SetNodePageIndex(TreeNode node, int pageIndex) + { + MenuHelper.SetPageIndex(node, pageIndex); + } + + [DefaultValue(null)] + public string TagString { get; set; } + + private UIMenuStyle _menuStyle = UIMenuStyle.Black; + + [DefaultValue(UIMenuStyle.Black)] + public UIMenuStyle MenuStyle + { + get => _menuStyle; + set + { + if (value != UIMenuStyle.Custom) + { + SetMenuStyle(UIStyles.MenuColors[value]); + } + + _menuStyle = value; + } + } + + private Color foreColor = Color.Silver; + + /// + /// 字体颜色 + /// + [Description("字体颜色"), Category("自定义")] + [DefaultValue(typeof(Color), "Silver")] + public override Color ForeColor + { + get => foreColor; + set + { + foreColor = value; + _menuStyle = UIMenuStyle.Custom; + Invalidate(); + } + } + + protected override void OnBackColorChanged(EventArgs e) + { + base.OnBackColorChanged(e); + _menuStyle = UIMenuStyle.Custom; + } + + private Color backColor = Color.FromArgb(56, 56, 56); + + public override Color BackColor + { + get => backColor; + set + { + backColor = value; + _menuStyle = UIMenuStyle.Custom; + Invalidate(); + } + } + + private void SetMenuStyle(UIMenuColor uiColor) + { + foreColor = uiColor.UnSelectedForeColor; + backColor = uiColor.BackColor; + menuHoverColor = uiColor.HoverColor; + Invalidate(); + } + + private Color menuHoverColor = Color.FromArgb(76, 76, 76); + + [DefaultValue(typeof(Color), "76, 76, 76")] + public Color MenuHoverColor + { + get => menuHoverColor; + set + { + menuHoverColor = value; + _menuStyle = UIMenuStyle.Custom; + } + } + + private Color selectedHighColor = UIColor.Blue; + + /// + /// 边框颜色 + /// + [Description("选中Tab页高亮"), Category("自定义")] + [DefaultValue(typeof(Color), "80, 160, 255")] + public Color SelectedHighColor + + { + get => selectedHighColor; + set + { + selectedHighColor = value; + _style = UIStyle.Custom; + Invalidate(); + } + } + + private UIStyle _style = UIStyle.Blue; + + [DefaultValue(UIStyle.Blue)] + public UIStyle Style + { + get => _style; + set => SetStyle(value); + } + + private void NavBarMenu_VisibleChanged(object sender, EventArgs e) + { + Invalidate(); + } + + [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] + [Localizable(true)] + [MergableProperty(false)] + public TreeNodeCollection Nodes => Menu.Nodes; + + [DefaultValue(null)] + public ImageList ImageList + { + get => Menu.ImageList; + set => Menu.ImageList = value; + } + + [DefaultValue(null)] + public ImageList DropMenuImageList + { + get => NavBarMenu.ImageList; + set => NavBarMenu.ImageList = value; + } + + private StringAlignment nodeAlignment = StringAlignment.Far; + + [DefaultValue(StringAlignment.Far)] + public StringAlignment NodeAlignment + { + get => nodeAlignment; + set + { + nodeAlignment = value; + Invalidate(); + } + } + + private int NodeX; + private int NodeY; + private int ActiveIndex = -1; + + private int selectedIndex = -1; + + private readonly NavMenuHelper MenuHelper = new NavMenuHelper(); + + [DefaultValue(-1)] + public int SelectedIndex + { + get => selectedIndex; + set + { + if (Nodes.Count > 0 && value >= 0 && value < Nodes.Count) + { + selectedIndex = value; + + if (Nodes[value].Nodes.Count == 0) + { + MenuItemClick?.Invoke(Nodes[SelectedIndex].Text, selectedIndex, MenuHelper.GetPageIndex(Nodes[SelectedIndex])); + TabControl?.SelectPage(MenuHelper.GetPageIndex(Nodes[SelectedIndex])); + } + + Invalidate(); + } + } + } + + private Color selectedForeColor = UIColor.Blue; + + [DefaultValue(typeof(Color), "80, 160, 255")] + public Color SelectedForeColor + { + get => selectedForeColor; + set + { + if (selectedForeColor != value) + { + selectedForeColor = value; + _style = UIStyle.Custom; + Invalidate(); + } + } + } + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + + e.Graphics.Clear(BackColor); + NodeX = 0; + NodeY = Height - NodeSize.Height; + + switch (NodeAlignment) + { + case StringAlignment.Near: + NodeX = NodeInterval; + break; + + case StringAlignment.Center: + NodeX = (Width - Nodes.Count * NodeSize.Width) * 2; + break; + + case StringAlignment.Far: + NodeX = Width - Nodes.Count * NodeSize.Width - NodeInterval; + break; + } + + for (int i = 0; i < Nodes.Count; i++) + { + Rectangle rect = new Rectangle(NodeX + i * NodeSize.Width, NodeY, NodeSize.Width, NodeSize.Height); + + SizeF sf = e.Graphics.MeasureString(Nodes[i].Text, Font); + Color textColor = ForeColor; + + if (i == ActiveIndex) + { + e.Graphics.FillRectangle(MenuHoverColor, rect); + textColor = SelectedForeColor; + } + + if (i == SelectedIndex) + { + if (!NavBarMenu.Visible) + { + e.Graphics.FillRectangle(new SolidBrush(SelectedHighColor), rect.X, Height - 4, rect.Width, 4); + } + + textColor = SelectedForeColor; + } + + e.Graphics.DrawString(Nodes[i].Text, Font, new SolidBrush(textColor), NodeX + i * NodeSize.Width + (NodeSize.Width - sf.Width) / 2.0f, NodeY + (NodeSize.Height - sf.Height) / 2); + if (Nodes[i].Nodes.Count > 0) + { + SizeF imageSize = e.Graphics.GetFontImageSize(61703, 24); + if (i != SelectedIndex) + { + e.Graphics.DrawFontImage(61703, 24, textColor, NodeX + i * NodeSize.Width + rect.Width - 24, rect.Top + (rect.Height - imageSize.Height) / 2); + } + else + { + e.Graphics.DrawFontImage(NavBarMenu.Visible ? 61702 : 61703, 24, textColor, NodeX + i * NodeSize.Width + rect.Width - 24, rect.Top + (rect.Height - imageSize.Height) / 2); + } + } + } + } + + private int _nodeInterval = 100; + + [DefaultValue(100)] + public int NodeInterval + { + get => _nodeInterval; + set + { + if (_nodeInterval != value) + { + _nodeInterval = value; + Invalidate(); + } + } + } + + private Size nodeSize = new Size(130, 45); + + [DefaultValue(typeof(Size), "130, 45")] + public Size NodeSize + { + get => nodeSize; + set + { + if (nodeSize != value) + { + nodeSize = value; + Invalidate(); + } + } + } + + protected override void OnMouseLeave(EventArgs e) + { + base.OnMouseLeave(e); + ActiveIndex = -1; + Invalidate(); + } + + protected override void OnMouseMove(MouseEventArgs e) + { + base.OnMouseMove(e); + + if (e.X < NodeX || e.X > NodeX + Nodes.Count * NodeSize.Width || e.Y < NodeY) + { + if (ActiveIndex != -1) + { + ActiveIndex = -1; + Invalidate(); + } + + return; + } + + int index = (e.X - NodeX) / NodeSize.Width; + if (ActiveIndex != index) + { + ActiveIndex = index; + Invalidate(); + } + } + + private int NodeMenuLeft(int index) + { + return NodeX + index * NodeSize.Width; + } + + protected override void OnMouseClick(MouseEventArgs e) + { + base.OnMouseClick(e); + + if (ActiveIndex == -1) return; + SelectedIndex = ActiveIndex; + Invalidate(); + + if (Nodes[selectedIndex].Nodes.Count == 0) + { + return; + } + + NavBarMenu.Style = Style; + NavBarMenu.Items.Clear(); + foreach (TreeNode node in Nodes[SelectedIndex].Nodes) + { + ToolStripMenuItem item = new ToolStripMenuItem(node.Text) { Tag = node.Tag }; + item.Click += Item_Click; + NavBarMenu.Items.Add(item); + + if (node.Nodes.Count > 0) + { + AddMenu(item, node); + } + } + + if (NavBarMenu.Width < NodeSize.Width) + { + NavBarMenu.AutoSize = false; + NavBarMenu.Width = NodeSize.Width; + } + + foreach (ToolStripItem item in NavBarMenu.Items) + { + item.AutoSize = false; + item.Width = NavBarMenu.Width - 1; + item.Height = 30; + } + + NavBarMenu.CalcHeight(); + NavBarMenu.Show(this, NodeMenuLeft(SelectedIndex), Height); + } + + private void Item_Click(object sender, EventArgs e) + { + ToolStripMenuItem item = (ToolStripMenuItem)sender; + if (item.Tag != null && item.Tag is NavMenuItem mi) + { + TabControl?.SelectPage(mi.PageIndex); + MenuItemClick?.Invoke(item.Text, selectedIndex, mi.PageIndex); + } + } + + public delegate void OnMenuItemClick(string text, int menuIndex, int pageIndex); + + public event OnMenuItemClick MenuItemClick; + + private void AddMenu(ToolStripMenuItem item, TreeNode node) + { + foreach (TreeNode childNode in node.Nodes) + { + ToolStripMenuItem childItem = new ToolStripMenuItem(childNode.Text) { Tag = childNode.Tag }; + item.DropDownItems.Add(childItem); + + if (childNode.Nodes.Count > 0) + { + AddMenu(childItem, childNode); + } + } + } + + public void SetStyle(UIStyle style) + { + SetStyleColor(UIStyles.GetStyleColor(style)); + _style = style; + } + + public void SetStyleColor(UIBaseStyle uiColor) + { + if (uiColor.IsCustom()) return; + + selectedForeColor = selectedHighColor = uiColor.MenuSelectedColor; + Invalidate(); + } + + [DefaultValue(false)] + public bool StyleCustomMode { get; set; } + + public string Version { get; } + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/UINavMenu.cs b/SunnyUI/Controls/UINavMenu.cs new file mode 100644 index 00000000..d964baad --- /dev/null +++ b/SunnyUI/Controls/UINavMenu.cs @@ -0,0 +1,822 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UINavMenu.cs + * 文件说明: 导航菜单 + * 当前版本: V2.2 + * 创建日期: 2020-01-01 + * + * 2020-01-01: V2.2.0 增加文件说明 +******************************************************************************/ + +using System; +using System.Collections.Concurrent; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace Sunny.UI +{ + [DefaultEvent("MenuItemClick")] + [DefaultProperty("Nodes")] + public sealed class UINavMenu : TreeView, IStyleInterface + { + public delegate void OnMenuItemClick(TreeNode node, NavMenuItem item, int pageIndex); + + public event OnMenuItemClick MenuItemClick; + + private readonly UIScrollBar Bar = new UIScrollBar(); + + public UINavMenu() + { + SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.SupportsTransparentBackColor | ControlStyles.ResizeRedraw | ControlStyles.OptimizedDoubleBuffer, true); + BorderStyle = BorderStyle.None; + //HideSelection = false; + DrawMode = TreeViewDrawMode.OwnerDrawAll; + //FullRowSelect = true; + //ShowLines = false; + //ShowPlusMinus = false; + //ShowRootLines = false; + + DoubleBuffered = true; + Font = UIFontColor.Font; + //CheckBoxes = false; + ItemHeight = 50; + BackColor = Color.FromArgb(56, 56, 56); + + Bar.ValueChanged += Bar_ValueChanged; + Bar.Dock = DockStyle.Right; + Bar.Visible = false; + Bar.Style = UIStyle.Custom; + Bar.StyleCustomMode = true; + Bar.FillColor = fillColor; + + Bar.ForeColor = Color.Silver; + Bar.HoverColor = Color.Silver; + Bar.PressColor = Color.Silver; + + Controls.Add(Bar); + Version = UIGlobal.Version; + SetScrollInfo(); + } + + [DefaultValue(null)] + public string TagString { get; set; } + + private Color fillColor = Color.FromArgb(56, 56, 56); + + /// + /// 填充颜色,当值为背景色或透明色或空值则不填充 + /// + [Description("背景颜色"), Category("自定义")] + [DefaultValue(typeof(Color), "56, 56, 56")] + public Color FillColor + { + get => fillColor; + set + { + if (fillColor != value) + { + fillColor = value; + menuStyle = UIMenuStyle.Custom; + Invalidate(); + } + } + } + + private Color foreColor = Color.Silver; + + /// + /// 填充颜色,当值为背景色或透明色或空值则不填充 + /// + [Description("背景颜色"), Category("自定义")] + [DefaultValue(typeof(Color), "Silver")] + public override Color ForeColor + { + get => foreColor; + set + { + if (foreColor != value) + { + foreColor = value; + menuStyle = UIMenuStyle.Custom; + Invalidate(); + } + } + } + + protected override void OnSizeChanged(EventArgs e) + { + base.OnSizeChanged(e); + SetScrollInfo(); + } + + private void Bar_ValueChanged(object sender, EventArgs e) + { + ScrollBarInfo.SetScrollValue(Handle, Bar.Value); + } + + [DefaultValue(false)] + public bool StyleCustomMode { get; set; } + + [DefaultValue(null)] + public TabControl TabControl { get; set; } + + private Color selectedColor = Color.FromArgb(36, 36, 36); + + private bool showTips; + + [Description("是否显示角标"), Category("自定义")] + [DefaultValue(false)] + public bool ShowTips + { + get => showTips; + set + { + if (showTips != value) + { + showTips = value; + Invalidate(); + } + } + } + + private Font tipsFont = new Font("Microsoft Sans Serif", 9); + + [Description("角标文字字体"), Category("自定义")] + [DefaultValue(typeof(Font), "Microsoft Sans Serif, 9pt")] + public Font TipsFont + { + get => tipsFont; + set + { + if (!tipsFont.Equals(value)) + { + tipsFont = value; + Invalidate(); + } + } + } + + [DefaultValue(typeof(Color), "36, 36, 36")] + public Color SelectedColor + { + get => selectedColor; + set + { + if (selectedColor != value) + { + selectedColor = value; + menuStyle = UIMenuStyle.Custom; + Invalidate(); + } + } + } + + private Color selectedHighColor = UIColor.Blue; + + /// + /// 边框颜色 + /// + [Description("选中Tab页高亮"), Category("自定义")] + [DefaultValue(typeof(Color), "80, 160, 255")] + public Color SelectedHighColor + + { + get => selectedHighColor; + set + { + selectedHighColor = value; + _style = UIStyle.Custom; + Invalidate(); + } + } + + private Color hoverColor = Color.FromArgb(76, 76, 76); + + [DefaultValue(typeof(Color), "76, 76, 76")] + public Color HoverColor + { + get => hoverColor; + set + { + hoverColor = value; + menuStyle = UIMenuStyle.Custom; + } + } + + private UIStyle _style = UIStyle.Blue; + + [DefaultValue(UIStyle.Blue)] + public UIStyle Style + { + get => _style; + set => SetStyle(value); + } + + public void SetStyle(UIStyle style) + { + SetStyleColor(UIStyles.GetStyleColor(style)); + _style = style; + } + + public void SetStyleColor(UIBaseStyle uiColor) + { + if (uiColor.IsCustom()) return; + + selectedForeColor = selectedHighColor = uiColor.MenuSelectedColor; + Invalidate(); + } + + private UIMenuStyle menuStyle = UIMenuStyle.Black; + + [DefaultValue(UIMenuStyle.Black)] + public UIMenuStyle MenuStyle + { + get => menuStyle; + set + { + if (value != UIMenuStyle.Custom) + { + SetMenuStyle(UIStyles.MenuColors[value]); + } + + menuStyle = value; + } + } + + private void SetMenuStyle(UIMenuColor uiColor) + { + BackColor = uiColor.BackColor; + fillColor = uiColor.BackColor; + selectedColor = uiColor.SelectedColor; + foreColor = uiColor.UnSelectedForeColor; + hoverColor = uiColor.HoverColor; + + if (Bar != null) + { + Bar.FillColor = uiColor.BackColor; + Bar.ForeColor = uiColor.UnSelectedForeColor; + Bar.HoverColor = uiColor.UnSelectedForeColor; + Bar.PressColor = uiColor.UnSelectedForeColor; + } + + Invalidate(); + } + + private Color selectedForeColor = UIColor.Blue; + + [DefaultValue(typeof(Color), "80, 160, 255")] + public Color SelectedForeColor + { + get => selectedForeColor; + set + { + if (selectedForeColor != value) + { + selectedForeColor = value; + _style = UIStyle.Custom; + Invalidate(); + } + } + } + + private bool ScrollBarVisible; + + private TreeNode CurrentNode; + + protected override void OnMouseMove(MouseEventArgs e) + { + base.OnMouseMove(e); + TreeNode node = GetNodeAt(e.Location); + if (node == null || CurrentNode == node) + { + return; + } + + Graphics g = CreateGraphics(); + if (CurrentNode != null) + { + OnDrawNode(new DrawTreeNodeEventArgs(g, CurrentNode, new Rectangle(0, CurrentNode.Bounds.Y, Width, CurrentNode.Bounds.Height), TreeNodeStates.Default)); + } + + CurrentNode = node; + OnDrawNode(new DrawTreeNodeEventArgs(g, CurrentNode, new Rectangle(0, CurrentNode.Bounds.Y, Width, CurrentNode.Bounds.Height), TreeNodeStates.Hot)); + g.Dispose(); + } + + protected override void OnMouseLeave(EventArgs e) + { + Graphics g = CreateGraphics(); + if (CurrentNode != null) + { + OnDrawNode(new DrawTreeNodeEventArgs(g, CurrentNode, new Rectangle(0, CurrentNode.Bounds.Y, Width, CurrentNode.Bounds.Height), TreeNodeStates.Default)); + CurrentNode = null; + } + + g.Dispose(); + } + + private bool checkBoxes; + + [Browsable(false)] + public new bool CheckBoxes + { + get => checkBoxes; + set => checkBoxes = false; + } + + private readonly NavMenuHelper MenuHelper = new NavMenuHelper(); + + public void SetNodeItem(TreeNode node, NavMenuItem item) + { + MenuHelper.Add(node, item); + } + + public void SetNodePageIndex(TreeNode node, int pageIndex) + { + MenuHelper.SetPageIndex(node, pageIndex); + } + + protected override void OnDrawNode(DrawTreeNodeEventArgs e) + { + if (BorderStyle != BorderStyle.None) + { + BorderStyle = BorderStyle.None; + } + + SetScrollInfo(); + CheckBoxes = false; + + if (e.Node == null || (e.Node.Bounds.Width <= 0 && e.Node.Bounds.Height <= 0 && e.Node.Bounds.X <= 0 && e.Node.Bounds.Y <= 0)) + { + e.DrawDefault = true; + } + else + { + int drawLeft = e.Node.Level * 16 + 16 + 4; + int imageLeft = drawLeft; + bool haveImage = false; + + if (MenuHelper.GetSymbol(e.Node) > 0) + { + haveImage = true; + drawLeft += MenuHelper.GetSymbolSize(e.Node) + 6; + } + else + { + if (ImageList != null && ImageList.Images.Count > 0 && e.Node.ImageIndex >= 0 && e.Node.ImageIndex < ImageList.Images.Count) + { + haveImage = true; + drawLeft += ImageList.ImageSize.Width + 6; + } + } + + SizeF sf = e.Graphics.MeasureString(e.Node.Text, Font); + if (e.Node == SelectedNode) + { + e.Graphics.FillRectangle((e.State & TreeNodeStates.Hot) != 0 ? HoverColor : SelectedColor, + new Rectangle(new Point(0, e.Node.Bounds.Y), new Size(Width, e.Node.Bounds.Height))); + + e.Graphics.DrawString(e.Node.Text, Font, SelectedForeColor, drawLeft, e.Bounds.Y + (ItemHeight - sf.Height) / 2.0f); + e.Graphics.FillRectangle(SelectedHighColor, new Rectangle(0, e.Bounds.Y, 4, e.Bounds.Height)); + } + else if (e.Node == CurrentNode && (e.State & TreeNodeStates.Hot) != 0) + { + e.Graphics.FillRectangle(HoverColor, new Rectangle(new Point(0, e.Node.Bounds.Y), new Size(Width, e.Node.Bounds.Height))); + e.Graphics.DrawString(e.Node.Text, Font, ForeColor, drawLeft, e.Bounds.Y + (ItemHeight - sf.Height) / 2.0f); + } + else + { + e.Graphics.FillRectangle(fillColor, new Rectangle(new Point(0, e.Node.Bounds.Y), new Size(Width, e.Node.Bounds.Height))); + e.Graphics.DrawString(e.Node.Text, Font, ForeColor, drawLeft, e.Bounds.Y + (ItemHeight - sf.Height) / 2.0f); + } + + if (haveImage) + { + if (MenuHelper.GetSymbol(e.Node) > 0) + { + SizeF fiSize = e.Graphics.GetFontImageSize(MenuHelper.GetSymbol(e.Node), MenuHelper.GetSymbolSize(e.Node)); + e.Graphics.DrawFontImage(MenuHelper.GetSymbol(e.Node), MenuHelper.GetSymbolSize(e.Node), Color.White, imageLeft + (MenuHelper.GetSymbolSize(e.Node) - fiSize.Width) / 2.0f, e.Bounds.Y + (e.Bounds.Height - fiSize.Height) / 2); + } + else + { + if (e.Selected() && e.Node.SelectedImageIndex >= 0 && e.Node.SelectedImageIndex < ImageList.Images.Count) + e.Graphics.DrawImage(ImageList.Images[e.Node.SelectedImageIndex], imageLeft, e.Bounds.Y + (e.Bounds.Height - ImageList.ImageSize.Height) / 2); + else + e.Graphics.DrawImage(ImageList.Images[e.Node.ImageIndex], imageLeft, e.Bounds.Y + (e.Bounds.Height - ImageList.ImageSize.Height) / 2); + } + } + + if (e.Node.Nodes.Count > 0) + { + e.Graphics.DrawFontImage(e.Node.IsExpanded ? 61702 : 61703, 24, ForeColor, Width - (Bar.Visible ? 50 : 30), e.Bounds.Y + (ItemHeight - 24) / 2); + } + + if (ShowTips && MenuHelper.GetTipsText(e.Node).IsValid()) + { + SizeF tipsSize = e.Graphics.MeasureString(MenuHelper.GetTipsText(e.Node), TipsFont); + float sfMax = Math.Max(tipsSize.Width, tipsSize.Height) + 1; + float tipsLeft = Width - (ScrollBarVisible ? 50 : 30) - 6 - sfMax; + float tipsTop = e.Bounds.Y + (ItemHeight - sfMax) / 2; + + e.Graphics.FillEllipse(Brushes.Red, tipsLeft, tipsTop, sfMax, sfMax); + e.Graphics.DrawString(MenuHelper.GetTipsText(e.Node), TipsFont, Brushes.White, tipsLeft + sfMax / 2.0f - tipsSize.Width / 2.0f, tipsTop + sfMax / 2.0f - tipsSize.Height / 2.0f); + } + } + } + + [Description("展开节点后选中第一个子节点"), DefaultValue(true)] + public bool ExpandSelectFirst { get; set; } = true; + + public string Version { get; } + + protected override void OnNodeMouseClick(TreeNodeMouseClickEventArgs e) + { + base.OnNodeMouseClick(e); + + if (e.Node != null && e.Node.Nodes.Count > 0) + { + if (e.Node.IsExpanded) + { + e.Node.Collapse(); + } + else + { + e.Node.Expand(); + } + + if (SelectedNode != null && SelectedNode == e.Node && e.Node.IsExpanded && ExpandSelectFirst && e.Node.Nodes.Count > 0) + { + SelectedNode = e.Node.Nodes[0]; + } + else + { + SelectedNode = e.Node; + } + } + else + { + SelectedNode = e.Node; + } + + ShowSelectedNode(); + } + + public void SelectFirst() + { + if (Nodes.Count > 0) + { + if (Nodes[0].Nodes.Count > 0 && ExpandSelectFirst) + { + Nodes[0].Expand(); + SelectedNode = Nodes[0].Nodes[0]; + } + else + { + SelectedNode = Nodes[0]; + } + + Nodes[0].EnsureVisible(); + } + + ShowSelectedNode(); + } + + public void SelectPage(int pageIndex) + { + AllNodes.Clear(); + GetAllNodes(Nodes); + if (AllNodes.ContainsKey(pageIndex)) + { + SelectedNode = AllNodes[pageIndex]; + ShowSelectedNode(); + } + } + + private readonly ConcurrentDictionary AllNodes = new ConcurrentDictionary(); + + private void GetAllNodes(TreeNodeCollection nodes) + { + foreach (TreeNode node in nodes) + { + if (MenuHelper.GetPageIndex(node) >= 0) + { + AllNodes.AddOrUpdate(MenuHelper.GetPageIndex(node), node); + } + + GetAllNodes(node.Nodes); + } + } + + private void ShowSelectedNode() + { + int index = MenuHelper.GetPageIndex(SelectedNode); + TabControl?.SelectPage(index); + MenuItemClick?.Invoke(SelectedNode, MenuHelper[SelectedNode], index); + } + + protected override void OnMouseWheel(MouseEventArgs e) + { + base.OnMouseWheel(e); + + if (e.Delta > 10) + { + ScrollBarInfo.ScrollUp(Handle); + } + else if (e.Delta < -10) + { + ScrollBarInfo.ScrollDown(Handle); + } + + SetScrollInfo(); + } + + public void SetScrollInfo() + { + if (Nodes.Count == 0) + { + Bar.Visible = false; + return; + } + + var si = ScrollBarInfo.GetInfo(Handle); + Bar.Maximum = si.ScrollMax; + Bar.Visible = si.ScrollMax > 0 && si.nMax > 0 && si.nPage > 0; + Bar.Value = si.nPos; + Bar.BringToFront(); + + if (ScrollBarVisible != Bar.Visible) + { + ScrollBarVisible = Bar.Visible; + Invalidate(); + } + } + + protected override void OnAfterSelect(TreeViewEventArgs e) + { + base.OnAfterSelect(e); + + if (e.Node != null && ExpandSelectFirst && e.Node.Nodes.Count > 0) + { + e.Node.Expand(); + SelectedNode = e.Node.Nodes[0]; + } + else + { + SelectedNode = e.Node; + } + } + + protected override void OnAfterExpand(TreeViewEventArgs e) + { + base.OnAfterExpand(e); + SetScrollInfo(); + } + + protected override void OnAfterCollapse(TreeViewEventArgs e) + { + base.OnAfterCollapse(e); + SetScrollInfo(); + } + + protected override void WndProc(ref Message m) + { + base.WndProc(ref m); + //隐藏滚动条 + ScrollBarInfo.ShowScrollBar(Handle, 3, false);//0:horizontal,1:vertical,3:both + } + } + + public static class TreeViewHelper + { + public static bool Selected(this DrawTreeNodeEventArgs e) + { + return e.State == TreeNodeStates.Selected || e.State == TreeNodeStates.Focused || + e.State == (TreeNodeStates.Focused | TreeNodeStates.Selected); + } + + public static TreeNode CreateNode(this UINavMenu navMenu, string text, int pageIndex) + { + return navMenu.CreateNode(new NavMenuItem(text, pageIndex)); + } + + public static TreeNode CreateNode(this UINavMenu navMenu, UIPage page) + { + return navMenu.CreateNode(new NavMenuItem(page.Text, page.PageIndex)); + } + + public static TreeNode CreateNode(this UINavMenu navMenu, NavMenuItem item) + { + TreeNode node = new TreeNode(item.Text); + navMenu.Nodes.Add(node); + navMenu.SetNodeItem(node, item); + return node; + } + + public static TreeNode CreateNode(this UINavBar navBar, string text, int pageIndex) + { + return navBar.CreateNode(new NavMenuItem(text, pageIndex)); + } + + public static TreeNode CreateNode(this UINavBar navBar, UIPage page) + { + return navBar.CreateNode(new NavMenuItem(page.Text, page.PageIndex)); + } + + public static TreeNode CreateNode(this UINavBar navBar, NavMenuItem item) + { + TreeNode node = new TreeNode(item.Text); + navBar.Nodes.Add(node); + navBar.SetNodeItem(node, item); + return node; + } + + public static TreeNode CreateChildNode(this UINavMenu navMenu, TreeNode parent, string text, int pageIndex) + { + return navMenu.CreateChildNode(parent, new NavMenuItem(text, pageIndex)); + } + + public static TreeNode CreateChildNode(this UINavMenu navMenu, TreeNode parent, UIPage page) + { + return navMenu.CreateChildNode(parent, new NavMenuItem(page.Text, page.PageIndex)); + } + + public static TreeNode CreateChildNode(this UINavMenu navMenu, TreeNode parent, NavMenuItem item) + { + TreeNode childNode = new TreeNode(item.Text); + parent.Nodes.Add(childNode); + navMenu.SetNodeItem(childNode, item); + return childNode; + } + + public static TreeNode CreateChildNode(this UINavBar navBar, TreeNode parent, string text, int pageIndex) + { + return navBar.CreateChildNode(parent, new NavMenuItem(text, pageIndex)); + } + + public static TreeNode CreateChildNode(this UINavBar navBar, TreeNode parent, UIPage page) + { + return navBar.CreateChildNode(parent, new NavMenuItem(page.Text, page.PageIndex)); + } + + public static TreeNode CreateChildNode(this UINavBar navBar, TreeNode parent, NavMenuItem item) + { + TreeNode childNode = new TreeNode(item.Text); + parent.Nodes.Add(childNode); + navBar.SetNodeItem(childNode, item); + return childNode; + } + } + + public class NavMenuHelper + { + public NavMenuItem this[TreeNode node] + { + get + { + if (node == null) return null; + + if (Items.ContainsKey(node)) + return Items[node]; + else + return null; + } + } + + private readonly ConcurrentDictionary Items = new ConcurrentDictionary(); + + public string GetTipsText(TreeNode node) + { + return this[node] == null ? string.Empty : Items[node].TipsText; + } + + public int GetSymbol(TreeNode node) + { + return this[node] == null ? 0 : Items[node].Symbol; + } + + public int GetSymbolSize(TreeNode node) + { + return this[node] == null ? 0 : Items[node].SymbolSize; + } + + public int GetPageIndex(TreeNode node) + { + return this[node] == null ? -1 : Items[node].PageIndex; + } + + public object GetTag(TreeNode node) + { + return this[node] == null ? null : Items[node].Tag; + } + + public void SetTipsText(TreeNode node, string tips) + { + if (node == null) return; + + CreateIfNotExist(node); + Items[node].TipsText = tips; + node.TreeView.Invalidate(); + } + + public void SetPageIndex(TreeNode node, int index) + { + if (node == null) return; + + CreateIfNotExist(node); + Items[node].PageIndex = index; + } + + public void SetSymbol(TreeNode node, int symbol, int symbolSize = 32) + { + if (node == null) return; + + CreateIfNotExist(node); + Items[node].Symbol = symbol; + Items[node].SymbolSize = symbolSize; + node.TreeView.Invalidate(); + } + + private void CreateIfNotExist(TreeNode node) + { + if (node == null) return; + + if (!Items.ContainsKey(node)) + { + NavMenuItem menuItem = new NavMenuItem(); + Items.TryAdd(node, menuItem); + } + } + + public void Add(TreeNode node, NavMenuItem item) + { + if (node == null || item == null) return; + + if (this[node] == null) + { + Items.TryAdd(node, item); + } + else + { + Items[node] = item; + } + + node.ImageIndex = item.ImageIndex; + node.SelectedImageIndex = item.SelectedImageIndex; + node.Tag = item; + } + } + + public class NavMenuItem + { + public string Text { get; set; } + + public int ImageIndex { get; set; } = -1; + + public int SelectedImageIndex { get; set; } = -1; + + public int Symbol { get; set; } + + public int SymbolSize { get; set; } = 24; + + public int PageIndex { get; set; } + + public string TipsText { get; set; } + + public bool Enabled { get; set; } = true; + + public object Tag { get; set; } + + public NavMenuItem() + { + } + + public NavMenuItem(UIPage page) + { + Text = page.Text; + PageIndex = page.PageIndex; + } + + public NavMenuItem(string text, int pageIndex) + { + PageIndex = pageIndex; + Text = text; + } + + public NavMenuItem(int pageIndex) + { + PageIndex = pageIndex; + } + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/UIPanel.Designer.cs b/SunnyUI/Controls/UIPanel.Designer.cs new file mode 100644 index 00000000..81beb7be --- /dev/null +++ b/SunnyUI/Controls/UIPanel.Designer.cs @@ -0,0 +1,44 @@ +namespace Sunny.UI +{ + partial class UIPanel + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + SuspendLayout(); + // + // UIControlBase + // + Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + Name = "UIPanel"; + Size = new System.Drawing.Size(270, 180); + ResumeLayout(false); + + } + + #endregion + } +} diff --git a/SunnyUI/Controls/UIPanel.cs b/SunnyUI/Controls/UIPanel.cs new file mode 100644 index 00000000..6d904c0f --- /dev/null +++ b/SunnyUI/Controls/UIPanel.cs @@ -0,0 +1,560 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UIPanel.cs + * 文件说明: 面板 + * 当前版本: V2.2 + * 创建日期: 2020-01-01 + * + * 2020-01-01: V2.2.0 增加文件说明 + * 2020-04-25: V2.2.4 更新主题配置类 +******************************************************************************/ + +using System; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms; + +// ReSharper disable All +#pragma warning disable 1591 + +namespace Sunny.UI +{ + [Designer("System.Windows.Forms.Design.ParentControlDesigner, System.Design", typeof(System.ComponentModel.Design.IDesigner))] + [DefaultEvent("Click"), DefaultProperty("Text")] + public partial class UIPanel : UserControl, IStyleInterface + { + private int radius = 5; + protected Color rectColor = UIStyles.Blue.RectColor; + protected Color fillColor = UIStyles.Blue.PlainColor; + protected Color foreColor = UIStyles.Blue.PanelForeColor; + + public UIPanel() + { + InitializeComponent(); + SetStyle(ControlStyles.AllPaintingInWmPaint, true); + SetStyle(ControlStyles.DoubleBuffer, true); + SetStyle(ControlStyles.ResizeRedraw, true); + SetStyle(ControlStyles.Selectable, true); + SetStyle(ControlStyles.SupportsTransparentBackColor, true); + SetStyle(ControlStyles.UserPaint, true); + SetStyle(ControlStyles.OptimizedDoubleBuffer, true); + base.DoubleBuffered = true; + UpdateStyles(); + + Version = UIGlobal.Version; + base.Font = UIFontColor.Font; + } + + [DefaultValue(null)] + public string TagString { get; set; } + + private string text; + + [Category("外观")] + [Description("按钮文字")] + [Browsable(true)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] + [DefaultValue("")] + public override string Text + { + get + { + return text; + } + set + { + if (text != value) + { + text = value; + Invalidate(); + } + } + } + + protected bool IsDesignMode + { + get + { + if (LicenseManager.UsageMode == LicenseUsageMode.Designtime) + { + return true; + } + else if (System.Diagnostics.Process.GetCurrentProcess().ProcessName == "devenv") + { + return true; + } + + return false; + } + } + + private ToolStripStatusLabelBorderSides _rectSides = ToolStripStatusLabelBorderSides.All; + + [DefaultValue(ToolStripStatusLabelBorderSides.All), Description("边框显示位置")] + public ToolStripStatusLabelBorderSides RectSides + { + get => _rectSides; + set + { + _rectSides = value; + OnRectSidesChange(); + Invalidate(); + } + } + + protected virtual void OnRadiusSidesChange() + { + } + + protected virtual void OnRectSidesChange() + { + } + + private UICornerRadiusSides _radiusSides = UICornerRadiusSides.All; + + [DefaultValue(UICornerRadiusSides.All), Description("圆角显示位置")] + public UICornerRadiusSides RadiusSides + { + get => _radiusSides; + set + { + _radiusSides = value; + OnRadiusSidesChange(); + Invalidate(); + } + } + + /// + /// 是否显示圆角 + /// + [Description("是否显示圆角"), Category("自定义")] + protected bool ShowRadius => (int)RadiusSides > 0; + + //圆角角度 + [Description("圆角角度"), Category("自定义")] + [DefaultValue(5)] + public int Radius + { + get + { + return radius; + } + set + { + if (radius != value) + { + radius = Math.Max(0, value); + OnRadiusChanged(radius); + Invalidate(); + } + } + } + + /// + /// 是否显示边框 + /// + [Description("是否显示边框"), Category("自定义")] + [DefaultValue(true)] + protected bool ShowRect => (int)RectSides > 0; + + /// + /// 边框颜色 + /// + [Description("边框颜色"), Category("自定义")] + [DefaultValue(typeof(Color), "80, 160, 255")] + public Color RectColor + { + get + { + return rectColor; + } + set + { + if (rectColor != value) + { + rectColor = value; + AfterSetRectColor(value); + RectColorChanged?.Invoke(this, null); + _style = UIStyle.Custom; + Invalidate(); + } + } + } + + /// + /// 填充颜色,当值为背景色或透明色或空值则不填充 + /// + [Description("填充颜色,当值为背景色或透明色或空值则不填充"), Category("自定义")] + [DefaultValue(typeof(Color), "235, 243, 255")] + public Color FillColor + { + get + { + return fillColor; + } + set + { + if (fillColor != value) + { + fillColor = value; + AfterSetFillColor(value); + FillColorChanged?.Invoke(this, null); + _style = UIStyle.Custom; + Invalidate(); + } + } + } + + protected void SetFillDisableColor(Color color) + { + fillDisableColor = color; + _style = UIStyle.Custom; + } + + protected void SetRectDisableColor(Color color) + { + rectDisableColor = color; + _style = UIStyle.Custom; + } + + protected void SetForeDisableColor(Color color) + { + foreDisableColor = color; + _style = UIStyle.Custom; + } + + private bool showText = true; + + [Description("是否显示文字")] + [Browsable(false)] + protected bool ShowText + { + get => showText; + set + { + if (showText != value) + { + showText = value; + Invalidate(); + } + } + } + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + if (!Visible || Width <= 0 || Height <= 0) return; + + Rectangle rect = new Rectangle(0, 0, Width - 1, Height - 1); + GraphicsPath path = GDIEx.CreateRoundedRectanglePath(rect, radius, RadiusSides); + + //填充背景色 + if (fillColor.IsValid()) + { + OnPaintFill(e.Graphics, path); + } + + //填充边框色 + if (ShowRect) + { + OnPaintRect(e.Graphics, path); + } + + //填充文字 + if (ShowText) + { + OnPaintFore(e.Graphics, path); + } + + PaintOther?.Invoke(this, e); + + path.Dispose(); + } + + public event PaintEventHandler PaintOther; + + protected virtual void OnPaintFore(Graphics g, GraphicsPath path) + { + g.DrawString(Text, Font, Enabled ? foreColor : foreDisableColor, Size, Padding, TextAlignment); + } + + protected virtual void OnPaintRect(Graphics g, GraphicsPath path) + { + Color color = GetRectColor(); + + //IsRadius为False时,显示左侧边线 + bool ShowRectLeft = RectSides.GetValue(ToolStripStatusLabelBorderSides.Left); + //IsRadius为False时,显示上侧边线 + bool ShowRectTop = RectSides.GetValue(ToolStripStatusLabelBorderSides.Top); + //IsRadius为False时,显示右侧边线 + bool ShowRectRight = RectSides.GetValue(ToolStripStatusLabelBorderSides.Right); + //IsRadius为False时,显示下侧边线 + bool ShowRectBottom = RectSides.GetValue(ToolStripStatusLabelBorderSides.Bottom); + + //IsRadius为True时,显示左上圆角 + bool RadiusLeftTop = RadiusSides.GetValue(UICornerRadiusSides.LeftTop); + //IsRadius为True时,显示左下圆角 + bool RadiusLeftBottom = RadiusSides.GetValue(UICornerRadiusSides.LeftBottom); + //IsRadius为True时,显示右上圆角 + bool RadiusRightTop = RadiusSides.GetValue(UICornerRadiusSides.RightTop); + //IsRadius为True时,显示右下圆角 + bool RadiusRightBottom = RadiusSides.GetValue(UICornerRadiusSides.RightBottom); + + if (RadiusSides == UICornerRadiusSides.None) + g.DrawRectangle(new Pen(color), 0, 0, Width - 1, Height - 1); + else + g.DrawPath(color, path); + + using (Pen pen = new Pen(fillColor)) + using (Pen penR = new Pen(rectColor)) + { + if (!ShowRadius || (ShowRadius && !RadiusLeftBottom && !RadiusLeftTop)) + { + g.DrawLine(penR, 0, 0, 0, Height - 1); + } + + if (!ShowRadius || (ShowRadius && !RadiusRightTop && !RadiusLeftTop)) + { + g.DrawLine(penR, 0, 0, Width - 1, 0); + } + + if (!ShowRadius || (ShowRadius && !RadiusRightTop && !RadiusRightBottom)) + { + g.DrawLine(penR, Width - 1, 0, Width - 1, Height - 1); + } + + if (!ShowRectLeft) + { + if (!ShowRadius || (ShowRadius && !RadiusLeftBottom && !RadiusLeftTop)) + { + g.DrawLine(pen, 0, 1, 0, Height - 2); + } + } + + if (!ShowRadius || (ShowRadius && !RadiusLeftBottom && !RadiusRightBottom)) + { + g.DrawLine(penR, 0, Height - 1, Width - 1, Height - 1); + } + + if (!ShowRectTop) + { + if (!ShowRadius || (ShowRadius && !RadiusRightTop && !RadiusLeftTop)) + { + g.DrawLine(pen, 1, 0, Width - 2, 0); + } + } + + if (!ShowRectRight) + { + if (!ShowRadius || (ShowRadius && !RadiusRightTop && !RadiusRightBottom)) + { + g.DrawLine(pen, Width - 1, 1, Width - 1, Height - 2); + } + } + + if (!ShowRectBottom) + { + if (!ShowRadius || (ShowRadius && !RadiusLeftBottom && !RadiusRightBottom)) + { + g.DrawLine(pen, 1, Height - 1, Width - 2, Height - 1); + } + } + + if (!ShowRectLeft && !ShowRectTop) + { + if (!ShowRadius || (ShowRadius && !RadiusLeftBottom && !RadiusLeftTop)) + g.DrawLine(pen, 0, 0, 0, 1); + } + + if (!ShowRectRight && !ShowRectTop) + { + if (!ShowRadius || (ShowRadius && !RadiusLeftBottom && !RadiusLeftTop)) + g.DrawLine(pen, Width - 1, 0, Width - 1, 1); + } + + if (!ShowRectLeft && !ShowRectBottom) + { + if (!ShowRadius || (ShowRadius && !RadiusLeftBottom && !RadiusLeftTop)) + g.DrawLine(pen, 0, Height - 1, 0, Height - 2); + } + + if (!ShowRectRight && !ShowRectBottom) + { + if (!ShowRadius || (ShowRadius && !RadiusLeftBottom && !RadiusLeftTop)) + g.DrawLine(pen, Width - 1, Height - 1, Width - 1, Height - 2); + } + } + } + + protected virtual void OnPaintFill(Graphics g, GraphicsPath path) + { + Color color = GetFillColor(); + + if (RadiusSides == UICornerRadiusSides.None) + g.Clear(color); + else + g.FillPath(color, path); + } + + protected override void WndProc(ref Message m) + { + if (m.Msg != 20) + { + base.WndProc(ref m); + } + } + + protected virtual void AfterSetFillColor(Color color) + { + } + + protected virtual void AfterSetRectColor(Color color) + { + } + + protected virtual void AfterSetForeColor(Color color) + { + } + + [DefaultValue(false)] + public bool StyleCustomMode { get; set; } + + protected UIStyle _style = UIStyle.Blue; + + [DefaultValue(UIStyle.Blue)] + public UIStyle Style + { + get => _style; + set => SetStyle(value); + } + + public void SetStyle(UIStyle style) + { + UIGlobal.SetChildUIStyle(this, style); + + SetStyleColor(UIStyles.GetStyleColor(style)); + _style = style; + } + + public virtual void SetStyleColor(UIBaseStyle uiColor) + { + if (uiColor.IsCustom()) return; + + fillColor = uiColor.PlainColor; + rectColor = uiColor.RectColor; + foreColor = uiColor.PanelForeColor; + + fillDisableColor = uiColor.FillDisableColor; + rectDisableColor = uiColor.RectDisableColor; + foreDisableColor = uiColor.ForeDisableColor; + Invalidate(); + } + + /// + /// 字体颜色 + /// + [Description("字体颜色"), Category("自定义")] + [DefaultValue(typeof(Color), "48, 48, 48")] + public override Color ForeColor + { + get => foreColor; + set + { + foreColor = value; + AfterSetForeColor(value); + _style = UIStyle.Custom; + Invalidate(); + } + } + + [DefaultValue(typeof(Color), "244, 244, 244")] + public Color FillDisableColor + { + get => fillDisableColor; + set => SetFillDisableColor(value); + } + + [DefaultValue(typeof(Color), "173, 178, 181")] + public Color RectDisableColor + { + get => rectDisableColor; + set => SetRectDisableColor(value); + } + + [DefaultValue(typeof(Color), "109, 109, 103")] + public Color ForeDisableColor + { + get => foreDisableColor; + set => SetForeDisableColor(value); + } + + protected virtual void OnRadiusChanged(int value) + { + } + + protected Color foreDisableColor = Color.FromArgb(109, 109, 103); + protected Color rectDisableColor = Color.FromArgb(173, 178, 181); + protected Color fillDisableColor = Color.FromArgb(244, 244, 244); + + protected Color GetRectColor() + { + return Enabled ? rectColor : rectDisableColor; + } + + protected Color GetForeColor() + { + return Enabled ? foreColor : foreDisableColor; + } + + protected Color GetFillColor() + { + return Enabled ? fillColor : fillDisableColor; + } + + /// + /// 屏蔽原属性,获取或设置一个值,该值指示是否在 Windows 任务栏中显示窗体。 + /// + /// true if [show in taskbar]; otherwise, false. + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + [Obsolete("禁用该属性!", true)] + public new BorderStyle BorderStyle => BorderStyle.None; + + public event EventHandler FillColorChanged; + + public event EventHandler RectColorChanged; + + public string Version { get; } + + private ContentAlignment _textAlignment = ContentAlignment.MiddleCenter; + + /// + /// 文字对齐方向 + /// + [Description("文字对齐方向")] + [DefaultValue(ContentAlignment.MiddleCenter)] + public ContentAlignment TextAlignment + { + get => _textAlignment; + set + { + if (_textAlignment != value) + { + _textAlignment = value; + Invalidate(); + } + } + } + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/UIProcessBar.cs b/SunnyUI/Controls/UIProcessBar.cs new file mode 100644 index 00000000..67afb1fc --- /dev/null +++ b/SunnyUI/Controls/UIProcessBar.cs @@ -0,0 +1,199 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UIProcessBar.cs + * 文件说明: 进度条 + * 当前版本: V2.2 + * 创建日期: 2020-01-01 + * + * 2020-01-01: V2.2.0 增加文件说明 + * 2020-04-19: V2.2 增加数值变化事件 +******************************************************************************/ + +using System; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms; + +namespace Sunny.UI +{ + [ToolboxItem(true)] + [DefaultEvent("ValueChanged")] + [DefaultProperty("Value")] + public sealed class UIProcessBar : UIControl + { + private int maximum = 100; + + public delegate void OnValueChanged(object sender, int value); + + public event OnValueChanged ValueChanged; + + public UIProcessBar() + { + MinimumSize = new Size(70, 23); + Size = new Size(300, 29); + ShowText = false; + + fillColor = UIColor.LightBlue; + foreColor = UIColor.Blue; + } + + [DefaultValue(100)] + public int Maximum + { + get => maximum; + set + { + maximum = value; + Invalidate(); + } + } + + private int posValue; + + [DefaultValue(0)] + public int Value + { + get => posValue; + set + { + posValue = Math.Max(value, 0); + posValue = Math.Min(posValue, maximum); + processWidth = (int)(posValue * Width * 1.0 / Maximum); + processText = (posValue * 100.0 / maximum).ToString("F1") + "%"; + ValueChanged?.Invoke(this, posValue); + Invalidate(); + } + } + + private int processWidth; + + private string processText = "0.0%"; + + private bool showValue = true; + + [DefaultValue(true)] + public bool ShowValue + { + get => showValue; + set + { + showValue = value; + Invalidate(); + } + } + + [DefaultValue(1)] + public int Step { get; set; } = 1; + + public void StepIt() + { + Value = Math.Min(Value + Step, Maximum); + } + + private Bitmap image; + private int imageRadius; + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + + if (ShowValue) + { + e.Graphics.DrawString(processText, Font, foreColor, Size, Padding, TextAlign); + } + + if (image == null || image.Width != Width + 2 || image.Height != Height + 2 || imageRadius != Radius) + { + image?.Dispose(); + image = new Bitmap(Width + 2, Height + 2); + imageRadius = Radius; + } + + Graphics g = image.Graphics(); + g.Clear(Color.Transparent); + Rectangle rect = new Rectangle(0, 0, Width - 1, Height - 1); + + g.SetHighQuality(); + g.FillRoundRectangle(rectColor, rect, Radius); + g.DrawRoundRectangle(rectColor, rect, Radius); + if (ShowValue) + { + g.DrawString(processText, Font, fillColor, Size, Padding, TextAlign); + } + + g.Dispose(); + + rect = new Rectangle(0, 0, processWidth, image.Height - 1); + GraphicsPath path = rect.CreateRoundedRectanglePath(0, UICornerRadiusSides.None); + using (Bitmap img = image.Split(path)) + { + e.Graphics.DrawImage(img, 0, 0); + } + } + + protected override void OnSizeChanged(EventArgs e) + { + base.OnSizeChanged(e); + image?.Dispose(); + image = null; + processWidth = (int)(posValue * Width * 1.0 / Maximum); + Text = (posValue * 100.0 / maximum).ToString("F1") + "%"; + Invalidate(); + } + + public override void SetStyleColor(UIBaseStyle uiColor) + { + base.SetStyleColor(uiColor); + if (uiColor.IsCustom()) return; + + fillColor = uiColor.ProcessBarFillColor; + foreColor = uiColor.ProcessBarForeColor; + Invalidate(); + } + + /// + /// 填充颜色,当值为背景色或透明色或空值则不填充 + /// + [Description("填充颜色"), Category("自定义")] + [DefaultValue(typeof(Color), "235, 243, 255")] + public Color FillColor + { + get => fillColor; + set => SetFillColor(value); + } + + /// + /// 字体颜色 + /// + [Description("字体颜色"), Category("自定义")] + [DefaultValue(typeof(Color), "80, 160, 255")] + public override Color ForeColor + { + get => foreColor; + set => SetForeColor(value); + } + + /// + /// 边框颜色 + /// + [Description("边框颜色"), Category("自定义")] + [DefaultValue(typeof(Color), "80, 160, 255")] + public Color RectColor + { + get => rectColor; + set => SetRectColor(value); + } + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/UIProgressIndicator.cs b/SunnyUI/Controls/UIProgressIndicator.cs new file mode 100644 index 00000000..c390c852 --- /dev/null +++ b/SunnyUI/Controls/UIProgressIndicator.cs @@ -0,0 +1,150 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UIProgressIndicator.cs + * 文件说明: 进度指示器 + * 当前版本: V2.2 + * 创建日期: 2020-01-01 + * + * 2020-01-01: V2.2.0 增加文件说明 + * 2020-04-25: V2.2.4 更新主题配置类 +******************************************************************************/ + +using System; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms; + +namespace Sunny.UI +{ + [ToolboxItem(true)] + public sealed class UIProgressIndicator : UIControl + { + private readonly Timer timer = new Timer(); + + public UIProgressIndicator() + { + Width = Height = 100; + + timer.Interval = 200; + timer.Tick += timer_Tick; + timer.Start(); + + ShowText = false; + ShowRect = false; + + foreColor = UIColor.Blue; + } + + ~UIProgressIndicator() + { + timer.Stop(); + } + + public override void SetStyleColor(UIBaseStyle uiColor) + { + base.SetStyleColor(uiColor); + if (uiColor.IsCustom()) return; + + foreColor = uiColor.ProgressIndicatorColor; + ClearImage(); + Invalidate(); + } + + private int Index; + + private Image image; + + protected override void OnPaintFill(Graphics g, GraphicsPath path) + { + int circleSize = Math.Min(Width, Height).Div(6); + + if (image == null) + { + image = new Bitmap(Width, Height); + Graphics ig = image.Graphics(); + for (int i = 0; i < 8; i++) + { + Point pt = GetPoint(i, circleSize); + ig.FillEllipse(Color.FromArgb(192, foreColor), pt.X, pt.Y, circleSize, circleSize); + } + + ig.Dispose(); + } + + g.DrawImage(image, 0, 0); + + int idx = Index.Mod(8); + g.FillEllipse(foreColor, GetPoint(idx, circleSize).X, GetPoint(idx, circleSize).Y, circleSize, circleSize); + + idx = (Index + 8 - 1).Mod(8); + g.FillEllipse(Color.FromArgb(224, foreColor), GetPoint(idx, circleSize).X, GetPoint(idx, circleSize).Y, circleSize, circleSize); + } + + private Point GetPoint(int index, int circleSize) + { + int len = Math.Min(Width, Height) / 2 - 2 - circleSize; + int lenX = (int)(len * 0.707); + int centerX = Width / 2 - circleSize / 2; + int centerY = Height / 2 - circleSize / 2; + + switch (index) + { + case 0: return new Point(centerX, centerY - len); + case 1: return new Point(centerX + lenX, centerY - lenX); + case 2: return new Point(centerX + len, centerY); + case 3: return new Point(centerX + lenX, centerY + lenX); + case 4: return new Point(centerX, centerY + len); + case 5: return new Point(centerX - lenX, centerY + lenX); + case 6: return new Point(centerX - len, centerY); + case 7: return new Point(centerX - lenX, centerY - lenX); + } + + return new Point(centerX, centerY); + } + + private void timer_Tick(object sender, EventArgs e) + { + Invalidate(); + Index++; + } + + private void ClearImage() + { + if (image != null) + { + image.Dispose(); + image = null; + } + } + + protected override void OnSizeChanged(EventArgs e) + { + base.OnSizeChanged(e); + ClearImage(); + Invalidate(); + } + + /// + /// 字体颜色 + /// + [Description("字体颜色"), Category("自定义")] + [DefaultValue(typeof(Color), "80, 160, 255")] + public override Color ForeColor + { + get => foreColor; + set => SetForeColor(value); + } + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/UIRadioButton.cs b/SunnyUI/Controls/UIRadioButton.cs new file mode 100644 index 00000000..1a5660fe --- /dev/null +++ b/SunnyUI/Controls/UIRadioButton.cs @@ -0,0 +1,208 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UIRadioButton.cs + * 文件说明: 单选框 + * 当前版本: V2.2 + * 创建日期: 2020-01-01 + * + * 2020-01-01: V2.2.0 增加文件说明 + * 2020-04-16: V2.2.1 增加ReadOnly属性 + * 2020-04-25: V2.2.4 更新主题配置类 +******************************************************************************/ + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms; + +namespace Sunny.UI +{ + [DefaultEvent("ValueChanged")] + [DefaultProperty("Text")] + [ToolboxItem(true)] + public sealed class UIRadioButton : UIControl + { + public delegate void OnValueChanged(object sender, bool value); + + public event OnValueChanged ValueChanged; + + public UIRadioButton() + { + Cursor = Cursors.Hand; + ShowRect = false; + Size = new Size(150, 29); + foreColor = UIStyles.Blue.CheckBoxForeColor; + fillColor = UIStyles.Blue.CheckBoxColor; + } + + [DefaultValue(false)] + public bool ReadOnly { get; set; } + + /// + /// 字体颜色 + /// + [Description("字体颜色"), Category("自定义")] + [DefaultValue(typeof(Color), "48, 48, 48")] + public override Color ForeColor + { + get => foreColor; + set => SetForeColor(value); + } + + private int _imageSize = 16; + private int _imageInterval = 3; + + [DefaultValue(16)] + public int ImageSize + { + get => _imageSize; + set + { + _imageSize = Math.Max(value, 16); + _imageSize = Math.Min(value, 64); + Invalidate(); + } + } + + [DefaultValue(3)] + public int ImageInterval + { + get => _imageInterval; + set + { + _imageInterval = Math.Max(1, value); + Invalidate(); + } + } + + private bool _checked; + + [DefaultValue(false)] + public bool Checked + { + get => _checked; + set + { + _checked = value; + + if (value) + { + try + { + if (Parent == null) return; + List buttons = Parent.GetControls(); + foreach (var box in buttons) + { + if (box == this) continue; + if (box.GroupIndex != GroupIndex) continue; + if (box.Checked) box.Checked = false; + } + } + catch (Exception ex) + { + Console.WriteLine(@"UIRadioBox click error." + ex.Message); + } + } + + ValueChanged?.Invoke(this, _checked); + Invalidate(); + } + } + + protected override void OnPaintFore(Graphics g, GraphicsPath path) + { + //设置按钮标题位置 + Padding = new Padding(_imageSize + _imageInterval * 2, Padding.Top, Padding.Right, Padding.Bottom); + + //填充文字 + Color color = ForeColor; + color = Enabled ? color : UIDisableColor.Fore; + + g.DrawString(Text, Font, color, Size, Padding, ContentAlignment.MiddleLeft); + } + + protected override void OnPaintFill(Graphics g, GraphicsPath path) + { + //图标 + float top = Padding.Top - 1 + (Height - Padding.Top - Padding.Bottom - ImageSize) / 2.0f; + float left = Text.IsValid() ? ImageInterval : (Width - ImageSize) / 2.0f; + + Color color = Enabled ? fillColor : foreDisableColor; + if (Checked) + { + g.FillEllipse(color, left, top, ImageSize, ImageSize); + float pointSize = ImageSize - 4; + g.FillEllipse(BackColor.IsValid() ? BackColor : Color.White, + left + ImageSize / 2.0f - pointSize / 2.0f, + top + ImageSize / 2.0f - pointSize / 2.0f, + pointSize, pointSize); + + pointSize = ImageSize - 8; + g.FillEllipse(color, + left + ImageSize / 2.0f - pointSize / 2.0f, + top + ImageSize / 2.0f - pointSize / 2.0f, + pointSize, pointSize); + } + else + { + using (Pen pn = new Pen(color, 2)) + { + g.SetHighQuality(); + g.DrawEllipse(pn, left + 1, top + 1, ImageSize - 2, ImageSize - 2); + g.SetDefaultQuality(); + } + } + } + + protected override void OnEnabledChanged(EventArgs e) + { + base.OnEnabledChanged(e); + Invalidate(); + } + + protected override void OnClick(EventArgs e) + { + if (!ReadOnly) + { + Checked = true; + } + } + + public override void SetStyleColor(UIBaseStyle uiColor) + { + base.SetStyleColor(uiColor); + if (uiColor.IsCustom()) return; + + fillColor = uiColor.CheckBoxColor; + foreColor = uiColor.CheckBoxForeColor; + Invalidate(); + } + + [DefaultValue(0)] + public int GroupIndex { get; set; } + + /// + /// 填充颜色,当值为背景色或透明色或空值则不填充 + /// + [Description("填充颜色"), Category("自定义")] + [DefaultValue(typeof(Color), "80, 160, 255")] + public Color RadioButtonColor + { + get => fillColor; + set => SetFillColor(value); + } + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/UIRadioButtonGroup.cs b/SunnyUI/Controls/UIRadioButtonGroup.cs new file mode 100644 index 00000000..131db953 --- /dev/null +++ b/SunnyUI/Controls/UIRadioButtonGroup.cs @@ -0,0 +1,233 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UICheckBoxGroup.cs + * 文件说明: 单选框组 + * 当前版本: V2.2 + * 创建日期: 2020-01-01 + * + * 2020-04-19: V2.2.3 增加单元 + * 2020-04-25: V2.2.4 更新主题配置类 +******************************************************************************/ + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Design; +using System.Windows.Forms; + +namespace Sunny.UI +{ + [DefaultProperty("Items")] + [DefaultEvent("ValueChanged")] + public class UIRadioButtonGroup : UIGroupBox + { + public delegate void OnValueChanged(object sender, int index, string text); + + public event OnValueChanged ValueChanged; + + ~UIRadioButtonGroup() + { + listbox?.Dispose(); + ClearButtons(); + } + + private void ClearButtons() + { + foreach (var button in buttons) + { + button.Hide(); + button.Dispose(); + } + + buttons.Clear(); + } + + private void Listbox_DrawItemEx(object sender, ListBox.ObjectCollection items, DrawItemEventArgs e) + { + Invalidate(); + } + + [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] + [Localizable(true)] + [Editor("System.Windows.Forms.Design.ListControlStringCollectionEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))] + [MergableProperty(false)] + public ListBox.ObjectCollection Items => ListBox.Items; + + private ListBoxEx listbox; + + private ListBoxEx ListBox + { + get + { + if (listbox == null) + { + listbox = new ListBoxEx(); + listbox.BeforeDrawItem += Listbox_DrawItemEx; + } + + return listbox; + } + } + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + + if (Items.Count == 0) return; + if (Items.Count != buttons.Count) + { + ClearButtons(); + + for (int i = 0; i < Items.Count; i++) + { + UIRadioButton button = new UIRadioButton + { + Font = Font, + Parent = this, + Tag = i, + Style = Style + }; + + button.ValueChanged += Button_ValueChanged; + buttons.Add(button); + } + } + + int startX = StartPos.X; + int startY = TitleTop + StartPos.Y; + for (int i = 0; i < Items.Count; i++) + { + buttons[i].Text = Items[i].ToString(); + + int rowIndex = i / ColumnCount; + int columnIndex = i % ColumnCount; + + buttons[i].Left = startX + ItemSize.Width * columnIndex + ColumnInterval * columnIndex; + buttons[i].Top = startY + ItemSize.Height * rowIndex + RowInterval * rowIndex; + buttons[i].Show(); + } + } + + private void Button_ValueChanged(object sender, bool value) + { + UIRadioButton button = (UIRadioButton)sender; + if (value) + { + SelectedIndex = button.Tag.ToString().ToInt(); + } + } + + [Browsable(false)] + [DefaultValue(-1)] + public int SelectedIndex + { + get => ListBox.SelectedIndex; + set + { + if (ListBox.Count == 0) + { + ListBox.SelectedIndex = -1; + return; + } + + if (SelectedIndex != value) + { + if (value >= 0 && value < buttons.Count) + { + ListBox.SelectedIndex = value; + buttons[value].Checked = true; + ValueChanged?.Invoke(this, value, buttons[value].Text); + } + } + } + } + + private readonly List buttons = new List(); + + private int columnCount = 1; + + [DefaultValue(1)] + public int ColumnCount + { + get => columnCount; + set + { + columnCount = value; + Invalidate(); + } + } + + private Size itemSize = new Size(150, 35); + + [DefaultValue(typeof(Size), "150, 35")] + public Size ItemSize + { + get => itemSize; + set + { + itemSize = value; + Invalidate(); + } + } + + private Point startPos = new Point(12, 12); + + [DefaultValue(typeof(Point), "12, 12")] + public Point StartPos + { + get => startPos; + set + { + startPos = value; + Invalidate(); + } + } + + public int columnInterval; + + [DefaultValue(0)] + public int ColumnInterval + { + get => columnInterval; + set + { + columnInterval = value; + Invalidate(); + } + } + + private int rowInterval; + + [DefaultValue(0)] + public int RowInterval + { + get => rowInterval; + set + { + rowInterval = value; + Invalidate(); + } + } + + protected override void OnFontChanged(EventArgs e) + { + base.OnFontChanged(e); + foreach (var button in buttons) + { + button.Font = Font; + } + } + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/UIRoundMeter.cs b/SunnyUI/Controls/UIRoundMeter.cs new file mode 100644 index 00000000..438198dd --- /dev/null +++ b/SunnyUI/Controls/UIRoundMeter.cs @@ -0,0 +1,271 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UIRoundMeter.cs + * 文件说明: 圆形图表 + * 当前版本: V2.2 + * 创建日期: 2020-01-01 + * + * 2020-01-01: V2.2.0 增加文件说明 +******************************************************************************/ + +using Sunny.UI.Properties; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace Sunny.UI +{ + /// + /// UIRoundMeter + /// + [ToolboxItem(true)] + [DefaultProperty("Angle")] + public sealed class UIRoundMeter : UIControl + { + /// + /// Enum TMeterType + /// + public enum TMeterType + { + /// + /// The custom + /// + Custom, + + /// + /// The GPS + /// + Gps, + + /// + /// The wind + /// + Wind + } + + /// + /// Enum TRunType + /// + public enum TRunType + { + /// + /// The clock wise + /// + ClockWise, + + /// + /// The anti clock wise + /// + AntiClockWise + } + + private double _angle; + private Image _angleImage; + private Image _backImage; + + /// + /// 必需的设计器变量。 + /// + private IContainer components; + + private TMeterType _meterType; + private TRunType _runType; + + /// + /// 构造函数 + /// + public UIRoundMeter() + { + InitializeComponent(); + + MeterType = TMeterType.Gps; + _runType = TRunType.ClockWise; + + Width = 150; + Height = 150; + } + + /// + /// 旋转方式 + /// + [DefaultValue(TRunType.ClockWise)] + public TRunType RunType + { + get => _runType; + set + { + if (_runType == value) + { + return; + } + + _runType = value; + Invalidate(); + } + } + + [DefaultValue(TMeterType.Gps)] + public TMeterType MeterType + { + get => _meterType; + set + { + if (_meterType == value) + { + return; + } + + _meterType = value; + + if (value == TMeterType.Gps) + { + BackgroundImage = Resources.gps1; + AngleImage = Resources.gps_postion; + } + + if (value == TMeterType.Wind) + { + BackgroundImage = Resources.wind; + AngleImage = Resources.wind_postion; + } + + Invalidate(); + } + } + + /// + /// 背景图片 + /// + public new Image BackgroundImage + { + get => _backImage; + set + { + if (value == null) + { + _backImage = null; + Width = 150; + Height = 150; + } + else + { + _backImage = new Bitmap(value); + Width = _backImage.Width; + Height = _backImage.Height; + } + + Invalidate(); + } + } + + /// + /// 箭头图片 + /// + public Image AngleImage + { + get => _angleImage; + set + { + _angleImage = value == null ? null : new Bitmap(value); + Invalidate(); + } + } + + /// + /// 角度 + /// + [DefaultValue(0)] + public double Angle + { + get => _angle; + set + { + if (_angle.EqualsDouble(value)) + { + return; + } + + _angle = value; + Invalidate(); + } + } + + /// + /// BackgroundImageLayout + /// + [Browsable(false)] + public new ImageLayout BackgroundImageLayout { get; set; } + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing) + { + components?.Dispose(); + } + + base.Dispose(disposing); + } + + /// + /// 重绘 + /// + /// e + protected override void OnPaint(PaintEventArgs e) + { + if (_backImage != null) + { + e.Graphics.DrawImage(_backImage, Width / 2.0f - _backImage.Width / 2.0f, Height / 2.0f - _backImage.Height / 2.0f); + } + + if (_angleImage == null) + { + return; + } + + var rawImage = new Bitmap(_angleImage); + if (_runType == TRunType.ClockWise) + { + var bmp = rawImage.Rotate((float)_angle, Color.Transparent); + e.Graphics.DrawImage(bmp, Width / 2.0f - bmp.Width / 2.0f, Height / 2.0f - bmp.Height / 2.0f); + bmp.Dispose(); + } + + if (_runType == TRunType.AntiClockWise) + { + var bmp = rawImage.Rotate((float)(360 - _angle), Color.Transparent); + e.Graphics.DrawImage(bmp, Width / 2.0f - bmp.Width / 2.0f, Height / 2.0f - bmp.Height / 2.0f); + bmp.Dispose(); + } + + rawImage.Dispose(); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + components = new Container(); + } + + #endregion 组件设计器生成的代码 + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/UIScrollBar.cs b/SunnyUI/Controls/UIScrollBar.cs new file mode 100644 index 00000000..b26e2d91 --- /dev/null +++ b/SunnyUI/Controls/UIScrollBar.cs @@ -0,0 +1,469 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UIScrollBar.cs + * 文件说明: 滚动条 + * 当前版本: V2.2 + * 创建日期: 2020-01-01 + * + * 2020-01-01: V2.2.0 增加文件说明 + * 2020-04-25: V2.2.4 更新主题配置类 +******************************************************************************/ + +using System; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace Sunny.UI +{ + [DefaultEvent("ValueChanged")] + [DefaultProperty("Value")] + [ToolboxItem(true)] + public sealed class UIScrollBar : UIControl + { + public UIScrollBar() + { + Maximum = 100; + up_state = value_state = down_state = DrawItemState.None; + timer.Interval = 150; + timer.Tick += TimerTick; + Width = SystemInformation.VerticalScrollBarWidth + 2; + Height = 300; + ShowText = false; + + fillColor = UIColor.LightBlue; + foreColor = UIColor.Blue; + fillHoverColor = Color.FromArgb(111, 168, 255); + fillPressColor = Color.FromArgb(74, 131, 229); + } + + private int scrollValue; + private int SmallChange = 1; + private int LargeChange = 10; + private int maximum; + private DrawItemState up_state, value_state, down_state; + private DrawItemState up_state1, value_state1, down_state1; + private bool dragMove; + private int dragOffset; + private int barHeight; + private double percentValue; + private readonly Timer timer = new Timer(); + private bool isScrollUp = true; + private bool largeChange = true; + + public event EventHandler ValueChanged; + + [DefaultValue(0)] + public int Value + { + get => scrollValue; + set + { + scrollValue = Math.Min(maximum, value); + scrollValue = Math.Max(scrollValue, 0); + Invalidate(); + } + } + + [DefaultValue(100)] + public int Maximum + { + get => maximum; + set + { + maximum = Math.Max(value, 1); + SmallChange = value / 50; + SmallChange = Math.Max(1, SmallChange); + + LargeChange = value / 10; + LargeChange = Math.Max(1, LargeChange); + CalcValueArea(); + Invalidate(); + } + } + + protected override void OnSizeChanged(EventArgs e) + { + base.OnSizeChanged(e); + CalcValueArea(); + } + + private void TimerTick(object sender, EventArgs e) + { + if (isScrollUp) + ScrollUp(largeChange); + else + ScrollDown(largeChange); + } + + private Rectangle GetUpRect() + { + var rect = new Rectangle(1, 1, Width - 2, 16); + return rect; + } + + private void CalcValueArea() + { + var centerHeight = GetValueClipRect().Height; + + barHeight = centerHeight / (maximum + 1); + barHeight = Math.Max(30, barHeight); + percentValue = ((double)centerHeight - barHeight) / maximum; + } + + private Rectangle GetValueRect() + { + return new Rectangle(Width / 2 - 3, ValueToPos(scrollValue), 6, barHeight); + } + + private int ValueToPos(int value) + { + return (int)(value * percentValue) + 17; + } + + private int PosToValue(int pos) + { + var value = (int)((pos - 17) / percentValue); + if (value < 0) + value = 0; + if (value > maximum) + value = maximum; + return value; + } + + private Rectangle GetDownRect() + { + var rect = new Rectangle(1, Height - 17, Width - 2, 16); + return rect; + } + + private Rectangle GetValueClipRect() + { + var clip = new Rectangle(1, 17, Width - 2, Height - 17 * 2); + return clip; + } + + protected override void OnPaint(PaintEventArgs e) + { + e.Graphics.Clear(fillColor); + DrawUpDownArrow(e.Graphics, up_state, GetUpRect(), true); + DrawUpDownArrow(e.Graphics, down_state, GetDownRect(), false); + DrawValueBar(e.Graphics, value_state); + } + + private void DrawValueBar(Graphics g, DrawItemState state) + { + var rect = GetValueRect(); + + Color clr = foreColor; + if ((state & DrawItemState.HotLight) == DrawItemState.HotLight) + { + clr = fillHoverColor; + } + + if ((state & DrawItemState.Selected) == DrawItemState.Selected) + { + clr = fillPressColor; + } + + if (dragMove) + { + rect = new Rectangle(rect.Left, MousePos - barHeight / 2, rect.Width, barHeight); + if (rect.Top < 17) + { + rect = new Rectangle(rect.Left, 17, rect.Width, barHeight); + } + + if (rect.Bottom > Height - 17) + { + rect = new Rectangle(rect.Left, Height - 17 - barHeight, rect.Width, barHeight); + } + } + + g.SetHighQuality(); + g.FillRoundRectangle(clr, rect, 5); + g.SetDefaultQuality(); + } + + private void DrawUpDownArrow(Graphics g, DrawItemState state, Rectangle rect, bool isUp) + { + Color clr_arrow = foreColor; + + if ((state & DrawItemState.HotLight) == DrawItemState.HotLight) + { + clr_arrow = fillHoverColor; + } + + if ((state & DrawItemState.Selected) == DrawItemState.Selected) + { + clr_arrow = fillPressColor; + } + + g.FillRectangle(fillColor, rect); + g.SetHighQuality(); + using (var pen = new Pen(clr_arrow, 2)) + { + Point pt1, pt2, pt3; + if (!isUp) + { + pt1 = new Point(Width / 2 - 4, Height - 16 / 2 - 4); + pt2 = new Point(Width / 2, Height - 16 / 2); + pt3 = new Point(Width / 2 + 4, Height - 16 / 2 - 4); + } + else + { + pt1 = new Point(Width / 2 - 4, 16 / 2 + 4 - 1); + pt2 = new Point(Width / 2, 16 / 2 - 1); + pt3 = new Point(Width / 2 + 4, 16 / 2 + 4 - 1); + } + + g.DrawLines(pen, new[] { pt1, pt2, pt3 }); + } + + g.SetDefaultQuality(); + } + + public void SetValue(int value) + { + if (value < 0) + { + value = 0; + } + + if (value > maximum) + { + value = maximum; + } + + scrollValue = value; + ValueChanged?.Invoke(this, null); + Invalidate(); + } + + public void ScrollUp(bool large) + { + SetValue(scrollValue - (large ? LargeChange : SmallChange)); + } + + public void ScrollDown(bool large) + { + SetValue(scrollValue + (large ? LargeChange : SmallChange)); + } + + private void StartScroll(bool up, bool large) + { + isScrollUp = up; + largeChange = large; + timer.Start(); + } + + private void StopScroll() + { + timer.Stop(); + } + + protected override void OnMouseDown(MouseEventArgs e) + { + if (e.Button != MouseButtons.Left) + { + return; + } + + up_state = value_state = down_state = DrawItemState.None; + IsPress = true; + var hit = HitState(e.X, e.Y); + switch (hit) + { + case 1: + if (Value > 0) + { + up_state = DrawItemState.Selected; + ScrollUp(false); + StartScroll(true, false); + } + break; + + case 2: + value_state = DrawItemState.Selected; + dragMove = true; + dragOffset = GetValueRect().Y - e.Y; + break; + + case 3: + if (Value < Maximum) + { + down_state = DrawItemState.Selected; + ScrollDown(false); + StartScroll(false, false); + } + break; + + case 4: + if (Value > 0) + { + ScrollUp(true); + if (IsPress) + { + StartScroll(true, true); + } + } + break; + + case 5: + if (Value < Maximum) + { + ScrollDown(false); + if (IsPress) + { + StartScroll(false, true); + } + } + break; + } + + if (StateChange()) + { + Invalidate(); + } + } + + protected override void OnMouseUp(MouseEventArgs e) + { + IsPress = false; + dragMove = false; + StopScroll(); + Invalidate(); + } + + private int MousePos; + + protected override void OnMouseMove(MouseEventArgs e) + { + MousePos = e.Y; + var hit = HitState(e.X, e.Y); + up_state = value_state = down_state = DrawItemState.None; + switch (hit) + { + case 1: + up_state = IsPress ? DrawItemState.Selected : DrawItemState.HotLight; + break; + + case 2: + value_state = IsPress ? DrawItemState.Selected : DrawItemState.HotLight; + break; + + case 3: + down_state = IsPress ? DrawItemState.Selected : DrawItemState.HotLight; + break; + } + + if (dragMove) + { + var value = PosToValue(e.Y + dragOffset); + SetValue(value); + return; + } + + if (StateChange()) + { + Invalidate(); + } + } + + protected override void OnMouseLeave(EventArgs e) + { + base.OnMouseLeave(e); + up_state = down_state = value_state = DrawItemState.None; + Invalidate(); + } + + private bool StateChange() + { + var change = up_state != up_state1 || down_state != down_state1 || value_state != value_state1; + up_state1 = up_state; + value_state1 = value_state; + down_state1 = down_state; + return change; + } + + private int HitState(int x, int y) + { + var rect_up = GetUpRect(); + var rect_down = GetDownRect(); + var rect_value = GetValueRect(); + var rect_value_up = new Rectangle(rect_up.Left, rect_up.Bottom, rect_up.Width, rect_value.Top - rect_up.Bottom); + var rect_value_down = new Rectangle(rect_value.Left, rect_value.Bottom, rect_value.Width, rect_down.Top - rect_value.Bottom); + if (rect_up.Contains(x, y)) + return 1; + else if (rect_down.Contains(x, y)) + return 3; + else if (rect_value.Contains(x, y)) + return 2; + else if (rect_value_up.Contains(x, y)) + return 4; + else if (rect_value_down.Contains(x, y)) + return 5; + else + return -1; + } + + public override void SetStyleColor(UIBaseStyle uiColor) + { + base.SetStyleColor(uiColor); + if (uiColor.IsCustom()) return; + + fillColor = uiColor.PlainColor; + foreColor = uiColor.ScrollBarForeColor; + fillHoverColor = uiColor.ButtonFillHoverColor; + fillPressColor = uiColor.ButtonFillPressColor; + Invalidate(); + } + + /// + /// 字体颜色 + /// + [Description("字体颜色"), Category("自定义")] + [DefaultValue(typeof(Color), "80, 160, 255")] + public override Color ForeColor + { + get => foreColor; + set => SetForeColor(value); + } + + /// + /// 填充颜色,当值为背景色或透明色或空值则不填充 + /// + [Description("填充颜色"), Category("自定义")] + [DefaultValue(typeof(Color), "235, 243, 255")] + public Color FillColor + { + get => fillColor; + set => SetFillColor(value); + } + + [DefaultValue(typeof(Color), "111, 168, 255")] + public Color HoverColor + { + get => fillHoverColor; + set => SetFillHoveColor(value); + } + + [DefaultValue(typeof(Color), "74, 131, 229")] + public Color PressColor + { + get => fillPressColor; + set => SetFillPressColor(value); + } + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/UISwitch.cs b/SunnyUI/Controls/UISwitch.cs new file mode 100644 index 00000000..47365b0a --- /dev/null +++ b/SunnyUI/Controls/UISwitch.cs @@ -0,0 +1,174 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UISwitch.cs + * 文件说明: 开关 + * 当前版本: V2.2 + * 创建日期: 2020-01-01 + * + * 2020-01-01: V2.2.0 增加文件说明 + * 2020-04-25: V2.2.4 更新主题配置类 +******************************************************************************/ + +using System; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Drawing2D; + +namespace Sunny.UI +{ + [DefaultEvent("ValueChanged")] + [DefaultProperty("ActiveValue")] + [ToolboxItem(true)] + public sealed class UISwitch : UIControl + { + public delegate void OnValueChanged(object sender, bool value); + + public UISwitch() + { + Height = 29; + Width = 75; + ShowText = false; + ShowRect = false; + foreColor = Color.White; + inActiveColor = Color.Silver; + fillColor = Color.White; + } + + public event OnValueChanged ValueChanged; + + /// + /// 字体颜色 + /// + [Description("字体颜色"), Category("自定义")] + [DefaultValue(typeof(Color), "White")] + public override Color ForeColor + { + get => foreColor; + set => SetForeColor(value); + } + + private bool activeValue; + + [DefaultValue(false)] + public bool Active + { + get => activeValue; + set + { + activeValue = value; + ValueChanged?.Invoke(this, value); + Invalidate(); + } + } + + private string activeText = "开"; + + [DefaultValue("开")] + public string ActiveText + { + get => activeText; + set + { + activeText = value; + Invalidate(); + } + } + + private string inActiveText = "关"; + + [DefaultValue("关")] + public string InActiveText + { + get => inActiveText; + set + { + inActiveText = value; + Invalidate(); + } + } + + private Color inActiveColor; + + [DefaultValue(typeof(Color), "Silver")] + public Color InActiveColor + { + get => inActiveColor; + set + { + inActiveColor = value; + Invalidate(); + } + } + + /// + /// 填充颜色,当值为背景色或透明色或空值则不填充 + /// + [Description("填充颜色"), Category("自定义")] + [DefaultValue(typeof(Color), "White")] + public Color ButtonColor + { + get => fillColor; + set => SetFillColor(value); + } + + /// + /// 边框颜色 + /// + [Description("选中颜色"), Category("自定义")] + [DefaultValue(typeof(Color), "80, 160, 255")] + public Color ActiveColor + { + get => rectColor; + set => SetRectColor(value); + } + + protected override void OnClick(EventArgs e) + { + base.OnClick(e); + Active = !Active; + } + + public override void SetStyleColor(UIBaseStyle uiColor) + { + base.SetStyleColor(uiColor); + if (uiColor.IsCustom()) return; + + rectColor = uiColor.SwitchActiveColor; + fillColor = uiColor.SwitchFillColor; + inActiveColor = uiColor.SwitchInActiveColor; + Invalidate(); + } + + protected override void OnPaintFill(Graphics g, GraphicsPath path) + { + Width = (int)(Height * 2.6); + Rectangle rect = new Rectangle(0, 0, Width - 1, Height - 1); + g.FillRoundRectangle(Active ? ActiveColor : InActiveColor, rect, rect.Height); + + int width = Width - 3 - 1 - 3 - (rect.Height - 6); + if (!Active) + { + g.FillEllipse(fillColor.IsValid() ? fillColor : Color.White, 3, 3, rect.Height - 6, rect.Height - 6); + SizeF sf = g.MeasureString(InActiveText, Font); + g.DrawString(InActiveText, Font, fillColor.IsValid() ? fillColor : Color.White, 3 + rect.Height - 6 + (width - sf.Width) / 2, 3 + (rect.Height - 6 - sf.Height) / 2); + } + else + { + g.FillEllipse(fillColor.IsValid() ? fillColor : Color.White, Width - 3 - 1 - (rect.Height - 6), 3, rect.Height - 6, rect.Height - 6); + SizeF sf = g.MeasureString(ActiveText, Font); + g.DrawString(ActiveText, Font, fillColor.IsValid() ? fillColor : Color.White, 3 + (width - sf.Width) / 2, 3 + (rect.Height - 6 - sf.Height) / 2); + } + } + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/UISymbolButton.cs b/SunnyUI/Controls/UISymbolButton.cs new file mode 100644 index 00000000..68b5ca05 --- /dev/null +++ b/SunnyUI/Controls/UISymbolButton.cs @@ -0,0 +1,203 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UISymbolButton.cs + * 文件说明: 字体图标按钮 + * 当前版本: V2.2 + * 创建日期: 2020-01-01 + * + * 2020-01-01: V2.2.0 增加文件说明 +******************************************************************************/ + +using System; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Design; +using System.Drawing.Drawing2D; +using System.Windows.Forms; + +namespace Sunny.UI +{ + [DefaultEvent("Click")] + [DefaultProperty("Text")] + public sealed class UISymbolButton : UIButton + { + private int _symbolSize = 24; + private int _imageInterval = 2; + + [DefaultValue(24)] + public int SymbolSize + { + get => _symbolSize; + set + { + _symbolSize = Math.Max(value, 16); + _symbolSize = Math.Min(value, 64); + Invalidate(); + } + } + + [DefaultValue(2)] + public int ImageInterval + { + get => _imageInterval; + set + { + _imageInterval = Math.Max(0, value); + Invalidate(); + } + } + + private bool _isCircle; + + [DefaultValue(false)] + public bool IsCircle + { + get => _isCircle; + set + { + _isCircle = value; + if (value) + { + Text = ""; + } + else + { + Invalidate(); + } + } + } + + private int _symbol = FontAwesomeIcons.fa_check; + + [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] + [Editor(typeof(UIImagePropertyEditor), typeof(UITypeEditor))] + [DefaultValue(61452)] + public int Symbol + { + get => _symbol; + set + { + _symbol = value; + Invalidate(); + } + } + + protected override void OnPaintFill(Graphics g, GraphicsPath path) + { + if (IsCircle) + { + int size = Math.Min(Width, Height) - 2 - CircleRectWidth; + g.FillEllipse(GetFillColor(), (Width - size) / 2.0f, (Height - size) / 2.0f, size, size); + } + else + { + base.OnPaintFill(g, path); + } + } + + private int circleRectWidth = 1; + + [DefaultValue(1)] + public int CircleRectWidth + { + get => circleRectWidth; + set + { + circleRectWidth = value; + Invalidate(); + } + } + + protected override void OnPaintRect(Graphics g, GraphicsPath path) + { + if (IsCircle) + { + int size = Math.Min(Width, Height) - 2 - CircleRectWidth; + using (Pen pn = new Pen(GetRectColor(), CircleRectWidth)) + { + g.SetHighQuality(); + g.DrawEllipse(pn, (Width - size) / 2.0f, (Height - size) / 2.0f, size, size); + g.SetDefaultQuality(); + } + } + else + { + base.OnPaintRect(g, path); + } + } + + protected override void OnPaintFore(Graphics g, GraphicsPath path) + { + Padding = new Padding(_symbolSize + _imageInterval * 2, Padding.Top, Padding.Right, Padding.Bottom); + //填充文字 + Color color = GetForeColor(); + g.DrawString(Text, Font, color, Size, Padding, TextAlign); + } + + protected override void OnPaint(PaintEventArgs e) + { + //重绘父类 + base.OnPaint(e); + + //字体图标 + Color color = GetForeColor(); + Font font = FontImageHelper.GetFont(Symbol, SymbolSize); + if (font == null) + { + return; + } + + float left = 0; + float top = 0; + SizeF ImageSize = e.Graphics.GetFontImageSize(Symbol, SymbolSize); + SizeF TextSize = e.Graphics.MeasureString(Text, Font); + + if (TextAlign == ContentAlignment.TopCenter || TextAlign == ContentAlignment.TopLeft || TextAlign == ContentAlignment.TopRight) + { + top = Padding.Top; + } + + if (TextAlign == ContentAlignment.MiddleCenter || TextAlign == ContentAlignment.MiddleLeft || TextAlign == ContentAlignment.MiddleRight) + { + top = Padding.Top + (Height - Padding.Top - Padding.Bottom - ImageSize.Height) / 2.0f; + } + + if (TextAlign == ContentAlignment.BottomCenter || TextAlign == ContentAlignment.BottomLeft || TextAlign == ContentAlignment.BottomRight) + { + top = Height - Padding.Bottom - ImageSize.Height; + } + + if (TextAlign == ContentAlignment.TopCenter || TextAlign == ContentAlignment.MiddleCenter || TextAlign == ContentAlignment.BottomCenter) + { + left = Padding.Left + (Width - TextSize.Width - Padding.Left - Padding.Right) / 2.0f; + left = left - ImageInterval - ImageSize.Width; + } + + if (TextAlign == ContentAlignment.TopLeft || TextAlign == ContentAlignment.MiddleLeft || TextAlign == ContentAlignment.BottomLeft) + { + left = ImageInterval; + } + + if (TextAlign == ContentAlignment.TopRight || TextAlign == ContentAlignment.MiddleRight || TextAlign == ContentAlignment.BottomRight) + { + left = Width - Padding.Right - TextSize.Width - ImageInterval - ImageSize.Width; + } + + if (Text.IsNullOrEmpty()) + e.Graphics.DrawString(char.ConvertFromUtf32(Symbol), font, color, ImageInterval + (Width - ImageSize.Width) / 2.0f, (Height - ImageSize.Height) / 2.0f); + else + e.Graphics.DrawString(char.ConvertFromUtf32(Symbol), font, color, left, top); + } + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/UITabControl.cs b/SunnyUI/Controls/UITabControl.cs new file mode 100644 index 00000000..9d5b2bc9 --- /dev/null +++ b/SunnyUI/Controls/UITabControl.cs @@ -0,0 +1,402 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UITabControl.cs + * 文件说明: 标签控件 + * 当前版本: V2.2 + * 创建日期: 2020-01-01 + * + * 2020-01-01: V2.2.0 增加文件说明 +******************************************************************************/ + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace Sunny.UI +{ + public sealed class UITabControl : TabControl, IStyleInterface + { + public UITabControl() + { + SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.ResizeRedraw | ControlStyles.DoubleBuffer, true); + + ItemSize = new Size(150, 40); + DrawMode = TabDrawMode.OwnerDrawFixed; + Font = UIFontColor.Font; + AfterSetFillColor(FillColor); + Size = new Size(450, 270); + Version = UIGlobal.Version; + } + + public string Version { get; } + + private Color _fillColor = UIColor.LightBlue; + private Color tabBackColor = Color.FromArgb(56, 56, 56); + + [DefaultValue(null)] + public string TagString { get; set; } + + [DefaultValue(false)] + public bool StyleCustomMode { get; set; } + + private HorizontalAlignment textAlignment = HorizontalAlignment.Center; + + [DefaultValue(HorizontalAlignment.Center)] + public HorizontalAlignment TextAlignment + { + get => textAlignment; + set + { + textAlignment = value; + Invalidate(); + } + } + + private bool tabVisible = true; + + [DefaultValue(true)] + public bool TabVisible + { + get => tabVisible; + set + { + tabVisible = value; + if (!tabVisible) + { + ItemSize = new Size(0, 1); + } + else + { + if (ItemSize == new Size(0, 1)) + { + ItemSize = new Size(150, 40); + } + } + + Invalidate(); + } + } + + /// + /// 当使用边框时填充颜色,当值为背景色或透明色或空值则不填充 + /// + [Description("当使用边框时填充颜色,当值为背景色或透明色或空值则不填充"), Category("自定义")] + [DefaultValue(typeof(Color), "235, 243, 255")] + public Color FillColor + { + get => _fillColor; + set + { + _fillColor = value; + AfterSetFillColor(value); + _style = UIStyle.Custom; + Invalidate(); + } + } + + /// + /// 边框颜色 + /// + [Description("边框颜色"), Category("自定义")] + [DefaultValue(typeof(Color), "56, 56, 56")] + public Color TabBackColor + { + get => tabBackColor; + set + { + tabBackColor = value; + _menuStyle = UIMenuStyle.Custom; + Invalidate(); + } + } + + private Color tabSelectedColor = Color.FromArgb(36, 36, 36); + + /// + /// 边框颜色 + /// + [Description("选中Tab页背景色"), Category("自定义")] + [DefaultValue(typeof(Color), "36, 36, 36")] + public Color TabSelectedColor + { + get => tabSelectedColor; + set + { + tabSelectedColor = value; + _menuStyle = UIMenuStyle.Custom; + Invalidate(); + } + } + + private Color tabSelectedForeColor = UIColor.Blue; + + /// + /// 边框颜色 + /// + [Description("选中Tab页字体色"), Category("自定义")] + [DefaultValue(typeof(Color), "80, 160, 255")] + public Color TabSelectedForeColor + { + get => tabSelectedForeColor; + set + { + tabSelectedForeColor = value; + _style = UIStyle.Custom; + Invalidate(); + } + } + + private Color tabUnSelectedForeColor = Color.Silver; + + /// + /// 边框颜色 + /// + [Description("未选中Tab页字体色"), Category("自定义")] + [DefaultValue(typeof(Color), "Silver")] + public Color TabUnSelectedForeColor + { + get => tabUnSelectedForeColor; + set + { + tabUnSelectedForeColor = value; + _menuStyle = UIMenuStyle.Custom; + Invalidate(); + } + } + + private Color tabSelectedHighColor = UIColor.Blue; + + /// + /// 边框颜色 + /// + [Description("选中Tab页高亮"), Category("自定义")] + [DefaultValue(typeof(Color), "80, 160, 255")] + public Color TabSelectedHighColor + + { + get => tabSelectedHighColor; + set + { + tabSelectedHighColor = value; + _style = UIStyle.Custom; + Invalidate(); + } + } + + private UIStyle _style = UIStyle.Blue; + + [DefaultValue(UIStyle.Blue)] + public UIStyle Style + { + get => _style; + set => SetStyle(value); + } + + public override Rectangle DisplayRectangle + { + get + { + Rectangle rect = base.DisplayRectangle; + if (tabVisible) + { + return new Rectangle(rect.Left - 4, rect.Top - 4, rect.Width + 8, rect.Height + 8); + } + else + { + return new Rectangle(rect.Left - 4, rect.Top - 5, rect.Width + 8, rect.Height + 9); + } + } + } + + private void AfterSetFillColor(Color color) + { + foreach (TabPage page in TabPages) + { + page.BackColor = color; + } + } + + public void SetStyle(UIStyle style) + { + SetStyleColor(UIStyles.GetStyleColor(style)); + _style = style; + } + + public void SetStyleColor(UIBaseStyle uiColor) + { + if (uiColor.IsCustom()) return; + + tabSelectedForeColor = tabSelectedHighColor = uiColor.MenuSelectedColor; + _fillColor = uiColor.PlainColor; + Invalidate(); + } + + private UIMenuStyle _menuStyle = UIMenuStyle.Black; + + [DefaultValue(UIMenuStyle.Black)] + public UIMenuStyle MenuStyle + { + get => _menuStyle; + set + { + if (value != UIMenuStyle.Custom) + { + SetMenuStyle(UIStyles.MenuColors[value]); + } + + _menuStyle = value; + } + } + + private void SetMenuStyle(UIMenuColor uiColor) + { + tabBackColor = uiColor.BackColor; + tabSelectedColor = uiColor.SelectedColor; + tabUnSelectedForeColor = uiColor.UnSelectedForeColor; + Invalidate(); + } + + protected override void CreateHandle() + { + base.CreateHandle(); + DoubleBuffered = true; + SizeMode = TabSizeMode.Fixed; + Appearance = TabAppearance.Normal; + Alignment = TabAlignment.Top; + } + + protected override void OnControlAdded(ControlEventArgs e) + { + base.OnControlAdded(e); + if (e.Control is TabPage) + { + e.Control.BackColor = FillColor; + e.Control.Padding = new Padding(0); + } + } + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + + // 绘制背景色 + e.Graphics.Clear(TabBackColor); + + if (!TabVisible) + { + return; + } + + for (int index = 0; index <= TabCount - 1; index++) + { + Rectangle TabRect = new Rectangle(GetTabRect(index).Location.X - 2, GetTabRect(index).Location.Y - 2, ItemSize.Width, ItemSize.Height); + + Bitmap bmp = new Bitmap(TabRect.Width, TabRect.Height); + Graphics g = Graphics.FromImage(bmp); + + SizeF sf = e.Graphics.MeasureString(TabPages[index].Text, Font); + int textLeft = ImageList?.ImageSize.Width ?? 0; + if (ImageList != null) textLeft += 4 + 4 + 6; + if (TextAlignment == HorizontalAlignment.Right) + textLeft = (int)(TabRect.Width - 4 - sf.Width); + if (TextAlignment == HorizontalAlignment.Center) + textLeft = textLeft + (int)((TabRect.Width - textLeft - sf.Width) / 2.0f); + + // 绘制标题 + g.Clear(TabBackColor); + if (index == SelectedIndex) + { + g.Clear(TabSelectedColor); + g.FillRectangle(TabSelectedHighColor, 0, bmp.Height - 4, bmp.Width, 4); + } + + g.DrawString(TabPages[index].Text, Font, index == SelectedIndex ? tabSelectedForeColor : TabUnSelectedForeColor, textLeft, TabRect.Top + 2 + (TabRect.Height - sf.Height) / 2.0f); + + // 绘制图标 + if (ImageList != null) + { + int imageIndex = TabPages[index].ImageIndex; + if (imageIndex >= 0 && imageIndex < ImageList.Images.Count) + { + g.DrawImage(ImageList.Images[imageIndex], 4 + 6, TabRect.Y + (TabRect.Height - ImageList.ImageSize.Height) / 2.0f, ImageList.ImageSize.Width, ImageList.ImageSize.Height); + } + } + + if (RightToLeftLayout && RightToLeft == RightToLeft.Yes) + { + bmp = bmp.HorizontalFlip(); + } + + e.Graphics.DrawImage(bmp, TabRect.Left, TabRect.Top); + bmp.Dispose(); + } + } + + public enum UITabPosition + { + Left, + Right + } + + [DefaultValue(UITabPosition.Left)] + public UITabPosition TabPosition + { + get => (RightToLeftLayout && RightToLeft == RightToLeft.Yes) + ? UITabPosition.Right + : UITabPosition.Left; + set + { + RightToLeftLayout = value == UITabPosition.Right; + RightToLeft = (value == UITabPosition.Right) ? RightToLeft.Yes : RightToLeft.No; + } + } + + protected override void OnSelectedIndexChanged(EventArgs e) + { + base.OnSelectedIndexChanged(e); + Init(SelectedIndex); + } + + public void Init(int index = 0) + { + if (index < 0 || index >= TabPages.Count) + { + return; + } + + if (SelectedIndex != index) + SelectedIndex = index; + + List pages = TabPages[SelectedIndex].GetControls(); + foreach (var page in pages) + { + page.Init(); + } + + List leftTabControls = TabPages[SelectedIndex].GetControls(); + foreach (var tabControl in leftTabControls) + { + tabControl.Init(); + } + + List topTabControls = TabPages[SelectedIndex].GetControls(); + foreach (var tabControl in topTabControls) + { + tabControl.Init(); + } + } + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/UITabControlMenu.cs b/SunnyUI/Controls/UITabControlMenu.cs new file mode 100644 index 00000000..8f81ed6e --- /dev/null +++ b/SunnyUI/Controls/UITabControlMenu.cs @@ -0,0 +1,405 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UITabControlMenu.cs + * 文件说明: 标签菜单控件 + * 当前版本: V2.2 + * 创建日期: 2020-01-01 + * + * 2020-01-01: V2.2.0 增加文件说明 +******************************************************************************/ + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace Sunny.UI +{ + public sealed class UITabControlMenu : TabControl, IStyleInterface + { + public UITabControlMenu() + { + SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.ResizeRedraw | ControlStyles.DoubleBuffer, true); + + ItemSize = new Size(40, 200); + DrawMode = TabDrawMode.OwnerDrawFixed; + Font = UIFontColor.Font; + AfterSetFillColor(FillColor); + Size = new Size(450, 270); + Version = UIGlobal.Version; + } + + [DefaultValue(false)] + public bool StyleCustomMode { get; set; } + + [DefaultValue(null)] + public string TagString { get; set; } + + public string Version { get; } + + private HorizontalAlignment textAlignment = HorizontalAlignment.Center; + + public HorizontalAlignment TextAlignment + { + get => textAlignment; + set + { + textAlignment = value; + Invalidate(); + } + } + + private Color _fillColor = UIColor.LightBlue; + private Color tabBackColor = Color.FromArgb(56, 56, 56); + + /// + /// 当使用边框时填充颜色,当值为背景色或透明色或空值则不填充 + /// + [Description("当使用边框时填充颜色,当值为背景色或透明色或空值则不填充"), Category("自定义")] + [DefaultValue(typeof(Color), "235, 243, 255")] + public Color FillColor + { + get => _fillColor; + set + { + _fillColor = value; + AfterSetFillColor(value); + _style = UIStyle.Custom; + Invalidate(); + } + } + + /// + /// 边框颜色 + /// + [Description("边框颜色"), Category("自定义")] + [DefaultValue(typeof(Color), "56, 56, 56")] + public Color TabBackColor + { + get => tabBackColor; + set + { + tabBackColor = value; + _menuStyle = UIMenuStyle.Custom; + Invalidate(); + } + } + + private Color tabSelectedColor = Color.FromArgb(36, 36, 36); + + /// + /// 边框颜色 + /// + [Description("选中Tab页背景色"), Category("自定义")] + [DefaultValue(typeof(Color), "36, 36, 36")] + public Color TabSelectedColor + { + get => tabSelectedColor; + set + { + tabSelectedColor = value; + _menuStyle = UIMenuStyle.Custom; + Invalidate(); + } + } + + private Color tabSelectedForeColor = UIColor.Blue; + + /// + /// 边框颜色 + /// + [Description("选中Tab页字体色"), Category("自定义")] + [DefaultValue(typeof(Color), "80, 160, 255")] + public Color TabSelectedForeColor + { + get => tabSelectedForeColor; + set + { + tabSelectedForeColor = value; + _style = UIStyle.Custom; + Invalidate(); + } + } + + private Color tabUnSelectedForeColor = Color.Silver; + + /// + /// 边框颜色 + /// + [Description("未选中Tab页字体色"), Category("自定义")] + [DefaultValue(typeof(Color), "Silver")] + public Color TabUnSelectedForeColor + { + get => tabUnSelectedForeColor; + set + { + tabUnSelectedForeColor = value; + _menuStyle = UIMenuStyle.Custom; + Invalidate(); + } + } + + private Color tabSelectedHighColor = UIColor.Blue; + + /// + /// 边框颜色 + /// + [Description("选中Tab页高亮"), Category("自定义")] + [DefaultValue(typeof(Color), "80, 160, 255")] + public Color TabSelectedHighColor + + { + get => tabSelectedHighColor; + set + { + tabSelectedHighColor = value; + _style = UIStyle.Custom; + Invalidate(); + } + } + + private UIStyle _style = UIStyle.Blue; + + [DefaultValue(UIStyle.Blue)] + public UIStyle Style + { + get => _style; + set => SetStyle(value); + } + + public override Rectangle DisplayRectangle + { + get + { + Rectangle rect = base.DisplayRectangle; + return new Rectangle(rect.Left - 3, rect.Top - 4, rect.Width + 7, rect.Height + 8); + } + } + + private void AfterSetFillColor(Color color) + { + foreach (TabPage page in TabPages) + { + page.BackColor = color; + } + } + + public void SetStyle(UIStyle style) + { + SetStyleColor(UIStyles.GetStyleColor(style)); + _style = style; + } + + public void SetStyleColor(UIBaseStyle uiColor) + { + if (uiColor.IsCustom()) return; + + tabSelectedForeColor = tabSelectedHighColor = uiColor.MenuSelectedColor; + _fillColor = uiColor.PlainColor; + Invalidate(); + } + + private UIMenuStyle _menuStyle = UIMenuStyle.Black; + + [DefaultValue(UIMenuStyle.Black)] + public UIMenuStyle MenuStyle + { + get => _menuStyle; + set + { + if (value != UIMenuStyle.Custom) + { + SetMenuStyle(UIStyles.MenuColors[value]); + } + + _menuStyle = value; + } + } + + private void SetMenuStyle(UIMenuColor uiColor) + { + TabBackColor = uiColor.BackColor; + TabSelectedColor = uiColor.SelectedColor; + TabUnSelectedForeColor = uiColor.UnSelectedForeColor; + } + + protected override void CreateHandle() + { + base.CreateHandle(); + DoubleBuffered = true; + SizeMode = TabSizeMode.Fixed; + Appearance = TabAppearance.Normal; + Alignment = TabAlignment.Left; + } + + protected override void OnControlAdded(ControlEventArgs e) + { + base.OnControlAdded(e); + if (e.Control is TabPage) + { + e.Control.BackColor = FillColor; + e.Control.Padding = new Padding(0); + } + } + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + + // 绘制背景色 + e.Graphics.Clear(TabBackColor); + for (int index = 0; index <= TabCount - 1; index++) + { + Rectangle TabRect = new Rectangle(GetTabRect(index).Location.X - 2, GetTabRect(index).Location.Y - 2, ItemSize.Height + 4, ItemSize.Width); + SizeF sf = e.Graphics.MeasureString(TabPages[index].Text, Font); + int textLeft = 4 + 6 + 4 + (ImageList?.ImageSize.Width ?? 0); + if (TextAlignment == HorizontalAlignment.Right) + textLeft = (int)(TabRect.Width - 4 - sf.Width); + if (TextAlignment == HorizontalAlignment.Center) + textLeft = textLeft + (int)((TabRect.Width - textLeft - sf.Width) / 2.0f); + + if (index == SelectedIndex) + { + // 绘制Tab选中背景色 + e.Graphics.FillRectangle(TabSelectedColor, TabRect.X, TabRect.Y, TabRect.Width, TabRect.Height + 4); + + // 绘制Tab选中高亮 + e.Graphics.FillRectangle(TabSelectedHighColor, TabRect.X, TabRect.Y, 4, TabRect.Height + 3); + } + + // 绘制标题 + Color textColor = index == SelectedIndex ? tabSelectedForeColor : TabUnSelectedForeColor; + e.Graphics.DrawString(TabPages[index].Text, Font, textColor, textLeft, TabRect.Top + 2 + (TabRect.Height - sf.Height) / 2.0f); + + // 绘制图标 + if (ImageList != null) + { + int imageIndex = TabPages[index].ImageIndex; + if (imageIndex >= 0 && imageIndex < ImageList.Images.Count) + { + e.Graphics.DrawImage(ImageList.Images[imageIndex], TabRect.X + 4 + 6, TabRect.Y + 2 + (TabRect.Height - ImageList.ImageSize.Height) / 2.0f, ImageList.ImageSize.Width, ImageList.ImageSize.Height); + } + } + } + } + + protected override void OnSelectedIndexChanged(EventArgs e) + { + base.OnSelectedIndexChanged(e); + Init(SelectedIndex); + } + + public void Init(int index = 0) + { + if (index < 0 || index >= TabPages.Count) + { + return; + } + + if (SelectedIndex != index) + SelectedIndex = index; + + List pages = TabPages[SelectedIndex].GetControls(); + foreach (var page in pages) + { + page.Init(); + } + + List leftTabControls = TabPages[SelectedIndex].GetControls(); + foreach (var tabControl in leftTabControls) + { + tabControl.Init(); + } + + List topTabControls = TabPages[SelectedIndex].GetControls(); + foreach (var tabControl in topTabControls) + { + tabControl.Init(); + } + } + } + + public static class UITabControlHelper + { + public static void AddPage(this TabControl tabControl, UIPage page) + { + if (page.PageIndex < 0) return; + TabPage tagPage = tabControl.CreateTabIfNotExists(page.PageIndex); + tagPage.Controls.Add(page); + tagPage.Text = page.Text; + page.Show(); + } + + public static void AddPages(this TabControl tabControl, params UIPage[] pages) + { + foreach (var page in pages) + { + tabControl.AddPage(page); + } + } + + public static void AddPage(this TabControl tabControl, int index, UITabControlMenu page) + { + tabControl.CreateTabIfNotExists(index); + tabControl.TabPages[index].Controls.Add(page); + page.Dock = DockStyle.Fill; + } + + public static void AddPage(this TabControl tabControl, int index, UITabControl page) + { + tabControl.CreateTabIfNotExists(index); + tabControl.TabPages[index].Controls.Add(page); + page.Dock = DockStyle.Fill; + } + + private static TabPage CreateTabIfNotExists(this TabControl tabControl, int index) + { + if (index < 0) return null; + for (int i = 0; i < tabControl.TabPages.Count; i++) + { + if (tabControl.TabPages[i].Tag == null) + { + continue; + } + + if (tabControl.TabPages[i].Tag.ToString() == i.ToString()) + { + return tabControl.TabPages[i]; + } + } + + TabPage page = new TabPage(); + page.SuspendLayout(); + page.Tag = index; + page.Text = "TabPage" + tabControl.TabPages.Count; + tabControl.Controls.Add(page); + page.ResumeLayout(); + return page; + } + + public static void SelectPage(this TabControl tabControl, int pageIndex) + { + if (pageIndex < 0) return; + + for (int i = 0; i < tabControl.TabPages.Count; i++) + { + if (tabControl.TabPages[i].Tag != null && tabControl.TabPages[i].Tag.ToString() == pageIndex.ToString()) + { + tabControl.SelectedIndex = i; + } + } + } + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/UITextBox.Designer.cs b/SunnyUI/Controls/UITextBox.Designer.cs new file mode 100644 index 00000000..d168a771 --- /dev/null +++ b/SunnyUI/Controls/UITextBox.Designer.cs @@ -0,0 +1,46 @@ +namespace Sunny.UI +{ + sealed partial class UITextBox + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + SuspendLayout(); + // + // UITextBox + // + AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + Cursor = System.Windows.Forms.Cursors.IBeam; + Name = "UITextBox"; + Padding = new System.Windows.Forms.Padding(5); + Size = new System.Drawing.Size(250, 29); + ResumeLayout(false); + + } + + #endregion + } +} diff --git a/SunnyUI/Controls/UITextBox.cs b/SunnyUI/Controls/UITextBox.cs new file mode 100644 index 00000000..5aee0f11 --- /dev/null +++ b/SunnyUI/Controls/UITextBox.cs @@ -0,0 +1,300 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UITextBox.cs + * 文件说明: 输入框 + * 当前版本: V2.2 + * 创建日期: 2020-01-01 + * + * 2020-01-01: V2.2.0 增加文件说明 +******************************************************************************/ + +using System; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms; + +namespace Sunny.UI +{ + [DefaultEvent("TextChanged")] + [DefaultProperty("Text")] + public sealed partial class UITextBox : UIPanel + { + private readonly UIEdit edit = new UIEdit(); + + public UITextBox() + { + InitializeComponent(); + + Font = UIFontColor.Font; + + edit.Left = 3; + edit.Top = 3; + edit.Text = String.Empty; + edit.BorderStyle = BorderStyle.None; + edit.KeyDown += EditOnKeyDown; + edit.TextChanged += EditTextChanged; + edit.Invalidate(); + Controls.Add(edit); + fillColor = Color.White; + Width = 150; + } + + public void SelectAll() + { + edit.SelectAll(); + } + + protected override void OnTextChanged(EventArgs e) + { + base.OnTextChanged(e); + edit.Text = Text; + Invalidate(); + } + + public void CheckMaxMin() + { + edit.CheckMaxMin(); + } + + private void EditTextChanged(object s, EventArgs e) + { + Text = edit.Text; + } + + protected override void OnFontChanged(EventArgs e) + { + base.OnFontChanged(e); + edit.Font = Font; + Invalidate(); + } + + protected override void OnPaintFore(Graphics g, GraphicsPath path) + { + SizeChange(); + } + + protected override void OnSizeChanged(EventArgs e) + { + SizeChange(); + } + + private void SizeChange() + { + UIEdit edt = new UIEdit(); + edt.Font = edit.Font; + edt.Invalidate(); + Height = edt.Height; + edt.Dispose(); + + edit.Top = (Height - edit.Height) / 2; + edit.Left = 3; + edit.Width = Width - 6; + } + + private void EditOnKeyDown(object Obj, KeyEventArgs e) + { + if (e.Control && e.KeyCode == Keys.A) + { + edit.SelectAll(); + e.SuppressKeyPress = true; + } + + if (e.Control && e.KeyCode == Keys.C) + { + edit.Copy(); + e.SuppressKeyPress = true; + } + + if (e.Control && e.KeyCode == Keys.V) + { + edit.Paste(); + e.SuppressKeyPress = true; + } + } + + protected override void OnGotFocus(EventArgs e) + { + base.OnGotFocus(e); + edit.Focus(); + } + + public void Clear() + { + edit.Clear(); + } + + [DefaultValue('\0')] + public char PasswordChar + { + get => edit.PasswordChar; + set => edit.PasswordChar = value; + } + + [DefaultValue(false)] + public bool ReadOnly + { + get => edit.ReadOnly; + set + { + edit.ReadOnly = value; + edit.BackColor = Color.White; + } + } + + [Description("输入类型"), Category("自定义")] + [DefaultValue(UIEditType.String)] + public UIEditType Type + { + get => edit.Type; + set => edit.Type = value; + } + + /// + /// 当InputType为数字类型时,能输入的最大值 + /// + [Description("当InputType为数字类型时,能输入的最大值。")] + [DefaultValue(double.MaxValue)] + public double Maximum + { + get => edit.MaxValue; + set => edit.MaxValue = value; + } + + /// + /// 当InputType为数字类型时,能输入的最小值 + /// + [Description("当InputType为数字类型时,能输入的最小值。")] + [DefaultValue(double.MinValue)] + public double Minimum + { + get => edit.MinValue; + set => edit.MinValue = value; + } + + [DefaultValue(false)] + public bool HasMaximum + { + get => edit.HasMaxValue; + set => edit.HasMaxValue = value; + } + + [DefaultValue(false)] + public bool HasMinimum + { + get => edit.HasMinValue; + set => edit.HasMinValue = value; + } + + [DefaultValue(0.00)] + public double DoubleValue + { + get => edit.DoubleValue; + set => edit.DoubleValue = value; + } + + [DefaultValue(0)] + public int IntValue + { + get => edit.IntValue; + set => edit.IntValue = value; + } + + [CategoryAttribute("文字"), Browsable(true)] + [DefaultValue("")] + public override string Text + { + get => edit.Text; + set => edit.Text = value; + } + + /// + /// 当InputType为数字类型时,小数位数。 + /// + [Description("当InputType为数字类型时,小数位数。")] + [DefaultValue(2)] + public int DecLength + { + get => edit.DecLength; + set => edit.DecLength = Math.Max(value, 0); + } + + [DefaultValue(false)] + public bool CanEmpty + { + get => edit.CanEmpty; + set => edit.CanEmpty = value; + } + + public void Empty() + { + if (edit.CanEmpty) + edit.Text = ""; + } + + public bool IsEmpty => edit.Text == ""; + + protected override void OnMouseDown(MouseEventArgs e) + { + ActiveControl = edit; + } + + [DefaultValue(255)] + public int MaxLength + { + get => edit.MaxLength; + set => edit.MaxLength = Math.Max(value, 1); + } + + public override void SetStyleColor(UIBaseStyle uiColor) + { + base.SetStyleColor(uiColor); + if (uiColor.IsCustom()) return; + + edit.BackColor = fillColor = Color.White; + edit.ForeColor = foreColor = UIFontColor.Primary; + Invalidate(); + } + + protected override void AfterSetForeColor(Color color) + { + base.AfterSetForeColor(color); + edit.ForeColor = color; + } + + protected override void AfterSetFillColor(Color color) + { + base.AfterSetFillColor(color); + edit.BackColor = color; + } + + public enum UIEditType + { + /// + /// 字符串 + /// + String, + + /// + /// 整数 + /// + Integer, + + /// + /// 浮点数 + /// + Double + } + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/UITextBox.resx b/SunnyUI/Controls/UITextBox.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/SunnyUI/Controls/UITextBox.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SunnyUI/Controls/UITitlePanel.Designer.cs b/SunnyUI/Controls/UITitlePanel.Designer.cs new file mode 100644 index 00000000..412201da --- /dev/null +++ b/SunnyUI/Controls/UITitlePanel.Designer.cs @@ -0,0 +1,43 @@ +namespace Sunny.UI +{ + partial class UITitlePanel + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + SuspendLayout(); + // + // UITitlePanel + // + Name = "UITitlePanel"; + Padding = new System.Windows.Forms.Padding(1, 35, 1, 1); + ResumeLayout(false); + + } + + #endregion + } +} diff --git a/SunnyUI/Controls/UITitlePanel.cs b/SunnyUI/Controls/UITitlePanel.cs new file mode 100644 index 00000000..8d42b327 --- /dev/null +++ b/SunnyUI/Controls/UITitlePanel.cs @@ -0,0 +1,167 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UITitlePanel.cs + * 文件说明: 带标题面板 + * 当前版本: V2.2 + * 创建日期: 2020-01-01 + * + * 2020-01-01: V2.2.0 增加文件说明 + * 2020-04-25: V2.2.4 更新主题配置类 +******************************************************************************/ + +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms; + +namespace Sunny.UI +{ + public partial class UITitlePanel : UIPanel + { + private int _titleHeight = 35; + + [Description("面板高度"), Category("自定义")] + [DefaultValue(35)] + public int TitleHeight + { + get => _titleHeight; + set + { + _titleHeight = value; + Padding = new Padding(1, value, 1, 1); + Invalidate(); + } + } + + public UITitlePanel() + { + InitializeComponent(); + ShowText = false; + foreColor = Color.White; + } + + public override void SetStyleColor(UIBaseStyle uiColor) + { + base.SetStyleColor(uiColor); + if (uiColor.IsCustom()) return; + + titleColor = uiColor.TitleColor; + foreColor = uiColor.TitleForeColor; + Invalidate(); + } + + private HorizontalAlignment textAlign = HorizontalAlignment.Center; + + /// + /// 文字对齐方向 + /// + [DefaultValue(HorizontalAlignment.Center)] + public HorizontalAlignment TextAlign + { + get => textAlign; + set + { + textAlign = value; + Invalidate(); + } + } + + private Color titleColor = UIColor.Blue; + + [DefaultValue(typeof(Color), "80, 160, 255")] + public Color TitleColor + { + get => titleColor; + set + { + titleColor = value; + _style = UIStyle.Custom; + Invalidate(); + } + } + + protected override void OnPaintFill(Graphics g, GraphicsPath path) + { + base.OnPaintFill(g, path); + //IsRadius为True时,显示左上圆角 + bool RadiusLeftTop = RadiusSides.GetValue(UICornerRadiusSides.LeftTop); + //IsRadius为True时,显示右上圆角 + bool RadiusRightTop = RadiusSides.GetValue(UICornerRadiusSides.RightTop); + path = GetTitleFillPath(Radius, TitleHeight, RadiusLeftTop, RadiusRightTop); + + Color color = Enabled ? TitleColor : UIDisableColor.Fill; + g.FillPath(color, path); + + color = Enabled ? ForeColor : UIFontColor.Regular; + SizeF sf = g.MeasureString(Text, Font); + switch (TextAlign) + { + case HorizontalAlignment.Left: + g.DrawString(Text, Font, color, _titleInterval, (TitleHeight - sf.Height) / 2.0f); + break; + + case HorizontalAlignment.Center: + g.DrawString(Text, Font, color, (Width - sf.Width) / 2.0f, (TitleHeight - sf.Height) / 2.0f); + break; + + case HorizontalAlignment.Right: + g.DrawString(Text, Font, color, Width - _titleInterval - sf.Width, (TitleHeight - sf.Height) / 2.0f); + break; + } + } + + private int _titleInterval = 10; + + [DefaultValue(10)] + public int TitleInterval + { + get => _titleInterval; + set + { + _titleInterval = value; + Invalidate(); + } + } + + protected GraphicsPath GetTitleFillPath(int radius, int height, bool cornerLeftTop = true, bool cornerRightTop = true) + { + Rectangle rect = ClientRectangle; + GraphicsPath graphicsPath = new GraphicsPath(); + if (radius > 0 && ShowRadius) + { + if (cornerLeftTop) + graphicsPath.AddArc(0, 0, radius, radius, 180f, 90f); + else + graphicsPath.AddLine(new Point(0, 1), new Point(0, 0)); + + if (cornerRightTop) + graphicsPath.AddArc(rect.Width - radius - 1, 0, radius, radius, 270f, 90f); + else + graphicsPath.AddLine(new Point(rect.Width - 1 - 1, 0), new Point(rect.Width - 1, 0)); + + graphicsPath.AddLine(new Point(rect.Width - 1, radius), new Point(rect.Width - 1, height)); + graphicsPath.AddLine(new Point(radius, height), new Point(0, height)); + + graphicsPath.CloseFigure(); + } + else + { + Point[] points = new Point[] { new Point(0, 0), new Point(rect.Width - 1, 0), new Point(rect.Width - 1, height), new Point(0, height), new Point(0, 0), }; + graphicsPath = points.Path(); + } + + return graphicsPath; + } + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/UITrackBar.cs b/SunnyUI/Controls/UITrackBar.cs new file mode 100644 index 00000000..223f2196 --- /dev/null +++ b/SunnyUI/Controls/UITrackBar.cs @@ -0,0 +1,211 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UITrackBar.cs + * 文件说明: 进度指示条 + * 当前版本: V2.2 + * 创建日期: 2020-01-01 + * + * 2020-01-01: V2.2.0 增加文件说明 + * +******************************************************************************/ + +using System; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms; + +namespace Sunny.UI +{ + [DefaultEvent("ValueChanged")] + [DefaultProperty("Value")] + [ToolboxItem(true)] + public sealed class UITrackBar : UIControl + { + public event EventHandler ValueChanged; + + public UITrackBar() + { + Width = 150; + Height = 29; + + ShowText = false; + ShowRect = false; + fillColor = UIColor.LightBlue; + foreColor = UIColor.Blue; + rectColor = UIColor.Blue; + } + + private int _maximum = 100; + private int _minimum; + private int trackBarValue; + + [DefaultValue(false)] + public bool ReadOnly { get; set; } + + [DefaultValue(100)] + public int Maximum + { + get => _maximum; + set + { + _maximum = value; + if (_maximum <= _minimum) + _minimum = _maximum - 1; + + Invalidate(); + } + } + + [DefaultValue(0)] + public int Minimum + { + get => _minimum; + set + { + _minimum = value; + if (_minimum >= _maximum) + _maximum = _minimum + 1; + + Invalidate(); + } + } + + [DefaultValue(0)] + public int Value + { + get => trackBarValue; + set + { + int v = Math.Min(Math.Max(Minimum, value), Maximum); + if (trackBarValue != v) + { + trackBarValue = v; + Invalidate(); + } + + ValueChanged?.Invoke(this, null); + } + } + + public override void SetStyleColor(UIBaseStyle uiColor) + { + base.SetStyleColor(uiColor); + if (uiColor.IsCustom()) return; + + rectDisableColor = uiColor.TrackDisableColor; + rectColor = uiColor.TrackBarRectColor; + fillColor = uiColor.TrackBarFillColor; + foreColor = uiColor.TrackBarForeColor; + Invalidate(); + } + + protected override void OnPaintFill(Graphics g, GraphicsPath path) + { + g.Clear(fillColor); + g.FillRoundRectangle(rectDisableColor, new Rectangle(5, Height / 2 - 3, Width - 1 - 10, 6), 6); + + int len = (int)((Value - Minimum) * 1.0 * (Width - 1 - 10) / (Maximum - Minimum)); + if (len > 0) + { + g.FillRoundRectangle(foreColor, new Rectangle(5, Height / 2 - 3, len, 6), 6); + } + + g.FillRoundRectangle(fillColor.IsValid() ? fillColor : Color.White, new Rectangle(len, Height / 2 - 10, 10, 20), 5); + + using (Pen pen = new Pen(rectColor, 2)) + { + g.SetHighQuality(); + g.DrawRoundRectangle(pen, new Rectangle(len + 1, Height / 2 - 9, 8, 18), 5); + g.SetDefaultQuality(); + } + } + + protected override void OnMouseClick(MouseEventArgs e) + { + base.OnMouseClick(e); + if (!ReadOnly) + { + int len = e.X - 5; + int value = (len * 1.0 * (Maximum - Minimum) / (Width - 1 - 10)).RoundEx() + Minimum; + Value = Math.Min(Math.Max(Minimum, value), Maximum); + } + } + + protected override void OnMouseMove(MouseEventArgs e) + { + base.OnMouseMove(e); + if (IsPress && !ReadOnly) + { + int len = e.X - 5; + int value = (len * 1.0 * (Maximum - Minimum) / (Width - 1 - 10)).RoundEx() + Minimum; + Value = Math.Min(Math.Max(Minimum, value), Maximum); + } + } + + protected override void OnMouseDown(MouseEventArgs e) + { + base.OnMouseDown(e); + IsPress = true; + Invalidate(); + } + + protected override void OnMouseUp(MouseEventArgs e) + { + base.OnMouseUp(e); + IsPress = false; + Invalidate(); + } + + /// + /// 填充颜色,当值为背景色或透明色或空值则不填充 + /// + [Description("填充颜色"), Category("自定义")] + [DefaultValue(typeof(Color), "235, 243, 255")] + public Color FillColor + { + get => fillColor; + set => SetFillColor(value); + } + + /// + /// 字体颜色 + /// + [Description("字体颜色"), Category("自定义")] + [DefaultValue(typeof(Color), "80, 160, 255")] + public override Color ForeColor + { + get => foreColor; + set => SetForeColor(value); + } + + /// + /// 边框颜色 + /// + [Description("边框颜色"), Category("自定义")] + [DefaultValue(typeof(Color), "80, 160, 255")] + public Color RectColor + { + get => rectColor; + set => SetRectColor(value); + } + + [DefaultValue(typeof(Color), "173, 178, 181")] + public Color DisableColor + { + get => rectDisableColor; + set => SetRectDisableColor(value); + } + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/UITransfer.Designer.cs b/SunnyUI/Controls/UITransfer.Designer.cs new file mode 100644 index 00000000..39d31327 --- /dev/null +++ b/SunnyUI/Controls/UITransfer.Designer.cs @@ -0,0 +1,163 @@ +using System.Windows.Forms; + +namespace Sunny.UI +{ + partial class UITransfer + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.b1 = new Sunny.UI.UISymbolButton(); + this.b2 = new Sunny.UI.UISymbolButton(); + this.b3 = new Sunny.UI.UISymbolButton(); + this.b4 = new Sunny.UI.UISymbolButton(); + this.l1 = new Sunny.UI.UIListBox(); + this.l2 = new Sunny.UI.UIListBox(); + this.SuspendLayout(); + // + // b1 + // + this.b1.BackColor = System.Drawing.Color.Transparent; + this.b1.Cursor = System.Windows.Forms.Cursors.Hand; + this.b1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.b1.Location = new System.Drawing.Point(228, 85); + this.b1.Margin = new System.Windows.Forms.Padding(0); + this.b1.Name = "b1"; + this.b1.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0); + this.b1.SelectedColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(158)))), ((int)(((byte)(255))))); + this.b1.Size = new System.Drawing.Size(44, 32); + this.b1.Symbol = 61697; + this.b1.TabIndex = 3; + this.b1.TipsText = null; + this.b1.Click += new System.EventHandler(this.b1_Click); + // + // b2 + // + this.b2.BackColor = System.Drawing.Color.Transparent; + this.b2.Cursor = System.Windows.Forms.Cursors.Hand; + this.b2.Font = new System.Drawing.Font("微软雅黑", 12F); + this.b2.Location = new System.Drawing.Point(228, 135); + this.b2.Margin = new System.Windows.Forms.Padding(0); + this.b2.Name = "b2"; + this.b2.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0); + this.b2.SelectedColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(158)))), ((int)(((byte)(255))))); + this.b2.Size = new System.Drawing.Size(44, 32); + this.b2.Symbol = 61701; + this.b2.TabIndex = 4; + this.b2.TipsText = null; + this.b2.Click += new System.EventHandler(this.b2_Click); + // + // b3 + // + this.b3.BackColor = System.Drawing.Color.Transparent; + this.b3.Cursor = System.Windows.Forms.Cursors.Hand; + this.b3.Font = new System.Drawing.Font("微软雅黑", 12F); + this.b3.Location = new System.Drawing.Point(228, 183); + this.b3.Margin = new System.Windows.Forms.Padding(0); + this.b3.Name = "b3"; + this.b3.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0); + this.b3.SelectedColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(158)))), ((int)(((byte)(255))))); + this.b3.Size = new System.Drawing.Size(44, 32); + this.b3.Symbol = 61700; + this.b3.TabIndex = 5; + this.b3.TipsText = null; + this.b3.Click += new System.EventHandler(this.b3_Click); + // + // b4 + // + this.b4.BackColor = System.Drawing.Color.Transparent; + this.b4.Cursor = System.Windows.Forms.Cursors.Hand; + this.b4.Font = new System.Drawing.Font("微软雅黑", 12F); + this.b4.Location = new System.Drawing.Point(228, 233); + this.b4.Margin = new System.Windows.Forms.Padding(0); + this.b4.Name = "b4"; + this.b4.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0); + this.b4.SelectedColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(158)))), ((int)(((byte)(255))))); + this.b4.Size = new System.Drawing.Size(44, 32); + this.b4.Symbol = 61696; + this.b4.TabIndex = 6; + this.b4.TipsText = null; + this.b4.Click += new System.EventHandler(this.b4_Click); + // + // l1 + // + this.l1.BackColor = System.Drawing.Color.Transparent; + this.l1.Dock = System.Windows.Forms.DockStyle.Left; + this.l1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.l1.ItemSelectForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.l1.Location = new System.Drawing.Point(1, 1); + this.l1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.l1.Name = "l1"; + this.l1.Padding = new System.Windows.Forms.Padding(2); + this.l1.Size = new System.Drawing.Size(210, 348); + this.l1.TabIndex = 7; + this.l1.Text = null; + this.l1.ItemDoubleClick += new System.EventHandler(this.l1_DoubleClick); + // + // l2 + // + this.l2.BackColor = System.Drawing.Color.Transparent; + this.l2.Dock = System.Windows.Forms.DockStyle.Right; + this.l2.Font = new System.Drawing.Font("微软雅黑", 12F); + this.l2.ItemSelectForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.l2.Location = new System.Drawing.Point(289, 1); + this.l2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.l2.Name = "l2"; + this.l2.Padding = new System.Windows.Forms.Padding(2); + this.l2.Size = new System.Drawing.Size(210, 348); + this.l2.TabIndex = 8; + this.l2.Text = null; + this.l2.ItemDoubleClick += new System.EventHandler(this.l2_DoubleClick); + // + // UITransfer + // + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.l2); + this.Controls.Add(this.l1); + this.Controls.Add(this.b4); + this.Controls.Add(this.b3); + this.Controls.Add(this.b2); + this.Controls.Add(this.b1); + this.Margin = new System.Windows.Forms.Padding(7, 9, 7, 9); + this.Name = "UITransfer"; + this.Padding = new System.Windows.Forms.Padding(1); + this.RadiusSides = Sunny.UI.UICornerRadiusSides.None; + this.RectSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.None; + this.Size = new System.Drawing.Size(500, 350); + this.ResumeLayout(false); + + } + + #endregion + private UISymbolButton b1; + private UISymbolButton b2; + private UISymbolButton b3; + private UISymbolButton b4; + private UIListBox l1; + private UIListBox l2; + } +} diff --git a/SunnyUI/Controls/UITransfer.cs b/SunnyUI/Controls/UITransfer.cs new file mode 100644 index 00000000..05de2e10 --- /dev/null +++ b/SunnyUI/Controls/UITransfer.cs @@ -0,0 +1,224 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UITransfer.cs + * 文件说明: 穿梭框 + * 当前版本: V2.2 + * 创建日期: 2020-01-01 + * + * 2020-01-01: V2.2.0 增加文件说明 +******************************************************************************/ + +using System; +using System.ComponentModel; +using System.Drawing.Design; +using System.Windows.Forms; + +namespace Sunny.UI +{ + /// + /// 穿梭框 + /// + [DefaultProperty("ItemsLeft")] + public sealed partial class UITransfer : UIPanel + { + /// + /// 构造函数 + /// + public UITransfer() + { + InitializeComponent(); + ShowText = false; + } + + /// + /// 左侧列表 + /// + [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] + [Localizable(true)] + [Editor("System.Windows.Forms.Design.ListControlStringCollectionEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))] + [MergableProperty(false)] + [Description("左侧列表")] + public ListBox.ObjectCollection ItemsLeft => l1.Items; + + /// + /// 右侧列表 + /// + [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] + [Localizable(true)] + [Editor("System.Windows.Forms.Design.ListControlStringCollectionEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))] + [MergableProperty(false)] + [Description("右侧列表")] + public ListBox.ObjectCollection ItemsRight => l2.Items; + + private void b1_Click(object sender, EventArgs e) + { + foreach (object item in l1.Items) + { + l2.Items.Add(item); + } + + l1.Items.Clear(); + if (l2.Items.Count > 0) + { + l2.SelectedIndex = l2.Items.Count - 1; + } + } + + private void b2_Click(object sender, EventArgs e) + { + if (l1.Items.Count > 0 && l1.SelectedItem != null) + { + int idx = l1.SelectedIndex; + object item = l1.SelectedItem; + l2.Items.Add(item); + l1.Items.Remove(item); + + if (l2.Items.Count > 0) + { + l2.SelectedIndex = l2.Items.Count - 1; + } + + if (idx - 1 >= 0) + { + idx = idx - 1; + } + + if (l1.Items.Count > 0) + { + l1.SelectedIndex = idx; + } + } + } + + private void b3_Click(object sender, EventArgs e) + { + if (l2.Items.Count > 0 && l2.SelectedItem != null) + { + int idx = l2.SelectedIndex; + object item = l2.SelectedItem; + l1.Items.Add(item); + l2.Items.Remove(item); + + if (l1.Items.Count > 0) + { + l1.SelectedIndex = l1.Items.Count - 1; + } + + if (idx - 1 >= 0) + { + idx = idx - 1; + } + + if (l2.Items.Count > 0) + { + l2.SelectedIndex = idx; + } + } + } + + private void b4_Click(object sender, EventArgs e) + { + foreach (object item in l2.Items) + { + l1.Items.Add(item); + } + + l2.Items.Clear(); + if (l1.Items.Count > 0) + { + l1.SelectedIndex = l1.Items.Count - 1; + } + } + + private void l1_DoubleClick(object sender, EventArgs e) + { + b2_Click(null, null); + } + + private void l2_DoubleClick(object sender, EventArgs e) + { + b3_Click(null, null); + } + + /// + /// OnSizeChanged + /// + /// e + protected override void OnSizeChanged(EventArgs e) + { + base.OnSizeChanged(e); + if (b1 == null || b2 == null) return; + if (b3 == null || b4 == null) return; + if (l1 == null || l2 == null) return; + + l1.Width = l2.Width = Width / 2 - 40; + b1.Left = b2.Left = b3.Left = b4.Left = (Width - b1.Width) / 2; + b2.Top = Height / 2 - 8 - b2.Height; + b1.Top = b2.Top - 16 - b1.Height; + b3.Top = b2.Bottom + 16; + b4.Top = b3.Bottom + 16; + } + + /// + /// 设置主题样式 + /// + /// + public override void SetStyleColor(UIBaseStyle uiColor) + { + base.SetStyleColor(uiColor); + if (uiColor.IsCustom()) return; + + if (l1 == null || l2 == null) return; + if (b1 == null || b2 == null || b3 == null || b4 == null) return; + + b1.SetStyleColor(uiColor); + b2.SetStyleColor(uiColor); + b3.SetStyleColor(uiColor); + b4.SetStyleColor(uiColor); + l1.SetStyleColor(uiColor); + l2.SetStyleColor(uiColor); + + l1.BackColor = fillColor; + l2.BackColor = fillColor; + + Invalidate(); + } + + /// + /// 圆角切换事件 + /// + /// 圆角值 + protected override void OnRadiusChanged(int value) + { + base.OnRadiusChanged(value); + if (l1 == null || l2 == null) return; + + l1.Radius = value; + l2.Radius = value; + } + + /// + /// OnPaint + /// + /// e + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + if (RadiusSides != UICornerRadiusSides.None) + RadiusSides = UICornerRadiusSides.None; + if (RectSides != ToolStripStatusLabelBorderSides.None) + RectSides = ToolStripStatusLabelBorderSides.None; + } + } +} \ No newline at end of file diff --git a/SunnyUI/Controls/UITransfer.resx b/SunnyUI/Controls/UITransfer.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/SunnyUI/Controls/UITransfer.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SunnyUI/Controls/UITreeView.cs b/SunnyUI/Controls/UITreeView.cs new file mode 100644 index 00000000..882516f4 --- /dev/null +++ b/SunnyUI/Controls/UITreeView.cs @@ -0,0 +1,574 @@ +/****************************************************************************** + * SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。 + * CopyRight (C) 2012-2020 ShenYongHua(沈永华). + * QQ群:56829229 QQ:17612584 EMail:SunnyUI@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. + * 如果您使用此代码,请保留此说明。 + ****************************************************************************** + * 文件名称: UITreeView.cs + * 文件说明: 树形列表 + * 当前版本: V2.2 + * 创建日期: 2020-05-05 + * + * 2020-05-05: V2.2.5 增加文件 +******************************************************************************/ + +using System; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms; + +namespace Sunny.UI +{ + public sealed class UITreeView : TreeView, IStyleInterface + { + private readonly UIScrollBar Bar = new UIScrollBar(); + + public UITreeView() + { + SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.SupportsTransparentBackColor | ControlStyles.ResizeRedraw | ControlStyles.OptimizedDoubleBuffer, true); + DrawMode = TreeViewDrawMode.OwnerDrawAll; + DoubleBuffered = true; + Font = UIFontColor.Font; + + ItemHeight = 28; + BackColor = Color.White; + + Bar.ValueChanged += Bar_ValueChanged; + Bar.Dock = DockStyle.Right; + Bar.Visible = false; + Bar.Style = UIStyle.Custom; + Bar.StyleCustomMode = true; + Bar.FillColor = fillColor; + + Bar.ForeColor = Color.Silver; + Bar.HoverColor = Color.Silver; + Bar.PressColor = Color.Silver; + + Controls.Add(Bar); + Version = UIGlobal.Version; + SetScrollInfo(); + } + + [DefaultValue(null)] + public string TagString { get; set; } + + private Color fillColor = Color.White; + + /// + /// 填充颜色,当值为背景色或透明色或空值则不填充 + /// + [Description("背景颜色"), Category("自定义")] + [DefaultValue(typeof(Color), "White")] + public Color FillColor + { + get => fillColor; + set + { + if (fillColor != value) + { + fillColor = value; + _style = UIStyle.Custom; + Invalidate(); + } + } + } + + private Color foreColor = UIFontColor.Primary; + + /// + /// 填充颜色,当值为背景色或透明色或空值则不填充 + /// + [Description("背景颜色"), Category("自定义")] + [DefaultValue(typeof(Color), "48, 48, 48")] + public override Color ForeColor + { + get => foreColor; + set + { + if (foreColor != value) + { + foreColor = value; + _style = UIStyle.Custom; + Invalidate(); + } + } + } + + protected override void OnSizeChanged(EventArgs e) + { + base.OnSizeChanged(e); + SetScrollInfo(); + } + + private void Bar_ValueChanged(object sender, EventArgs e) + { + ScrollBarInfo.SetScrollValue(Handle, Bar.Value); + } + + [DefaultValue(false)] + public bool StyleCustomMode { get; set; } + + private Color selectedColor = Color.FromArgb(80, 160, 255); + + private bool showTips; + + [Description("是否显示角标"), Category("自定义")] + [DefaultValue(false)] + public bool ShowTips + { + get => showTips; + set + { + if (showTips != value) + { + showTips = value; + Invalidate(); + } + } + } + + private Font tipsFont = new Font("Microsoft Sans Serif", 9); + + [Description("角标文字字体"), Category("自定义")] + [DefaultValue(typeof(Font), "Microsoft Sans Serif, 9pt")] + public Font TipsFont + { + get => tipsFont; + set + { + if (!tipsFont.Equals(value)) + { + tipsFont = value; + Invalidate(); + } + } + } + + [DefaultValue(typeof(Color), "80, 160, 255")] + public Color SelectedColor + { + get => selectedColor; + set + { + if (selectedColor != value) + { + selectedColor = value; + _style = UIStyle.Custom; + Invalidate(); + } + } + } + + private Color selectedHighColor = UIColor.White; + + /// + /// 边框颜色 + /// + [Description("选中Tab页高亮"), Category("自定义")] + [DefaultValue(typeof(Color), "White")] + public Color SelectedHighColor + + { + get => selectedHighColor; + set + { + selectedHighColor = value; + _style = UIStyle.Custom; + Invalidate(); + } + } + + private Color hoverColor = Color.FromArgb(155, 200, 255); + + [DefaultValue(typeof(Color), "155, 200, 255")] + public Color HoverColor + { + get => hoverColor; + set + { + hoverColor = value; + _style = UIStyle.Custom; + } + } + + private UIStyle _style = UIStyle.Blue; + + [DefaultValue(UIStyle.Blue)] + public UIStyle Style + { + get => _style; + set => SetStyle(value); + } + + private Color rectColor = UIStyles.Blue.RectColor; + + /// + /// 边框颜色 + /// + [Description("边框颜色"), Category("自定义")] + [DefaultValue(typeof(Color), "80, 160, 255")] + public Color RectColor + { + get => rectColor; + set => SetRectColor(value); + } + + /// + /// 设置边框颜色 + /// + /// 颜色 + private void SetRectColor(Color value) + { + if (rectColor != value) + { + rectColor = value; + _style = UIStyle.Custom; + Invalidate(); + } + } + + public void SetStyle(UIStyle style) + { + SetStyleColor(UIStyles.GetStyleColor(style)); + _style = style; + } + + public void SetStyleColor(UIBaseStyle uiColor) + { + if (uiColor.IsCustom()) return; + + selectedForeColor = selectedHighColor = UIColor.White; + + rectColor = uiColor.RectColor; + fillColor = UIColor.White; + selectedColor = uiColor.TreeViewSelectedColor; + foreColor = UIFontColor.Primary; + hoverColor = uiColor.TreeViewHoverColor; + + if (Bar != null) + { + Bar.FillColor = UIColor.White; + Bar.ForeColor = uiColor.PrimaryColor; + Bar.HoverColor = uiColor.ButtonFillHoverColor; + Bar.PressColor = uiColor.ButtonFillPressColor; + } + + Invalidate(); + + Invalidate(); + } + + private Color selectedForeColor = UIColor.White; + + [DefaultValue(typeof(Color), "White")] + public Color SelectedForeColor + { + get => selectedForeColor; + set + { + if (selectedForeColor != value) + { + selectedForeColor = value; + _style = UIStyle.Custom; + Invalidate(); + } + } + } + + private bool ScrollBarVisible; + + private TreeNode CurrentNode; + + protected override void OnMouseMove(MouseEventArgs e) + { + base.OnMouseMove(e); + TreeNode node = GetNodeAt(e.Location); + if (node == null || CurrentNode == node) + { + return; + } + + Graphics g = CreateGraphics(); + if (CurrentNode != null) + { + OnDrawNode(new DrawTreeNodeEventArgs(g, CurrentNode, new Rectangle(0, CurrentNode.Bounds.Y, Width, CurrentNode.Bounds.Height), TreeNodeStates.Default)); + } + + CurrentNode = node; + OnDrawNode(new DrawTreeNodeEventArgs(g, CurrentNode, new Rectangle(0, CurrentNode.Bounds.Y, Width, CurrentNode.Bounds.Height), TreeNodeStates.Hot)); + g.Dispose(); + } + + protected override void OnMouseLeave(EventArgs e) + { + Graphics g = CreateGraphics(); + if (CurrentNode != null) + { + OnDrawNode(new DrawTreeNodeEventArgs(g, CurrentNode, new Rectangle(0, CurrentNode.Bounds.Y, Width, CurrentNode.Bounds.Height), TreeNodeStates.Default)); + CurrentNode = null; + } + + g.Dispose(); + } + + private bool checkBoxes; + + [Browsable(false)] + public new bool CheckBoxes + { + get => checkBoxes; + set => checkBoxes = false; + } + + private readonly NavMenuHelper MenuHelper = new NavMenuHelper(); + + protected override void OnDrawNode(DrawTreeNodeEventArgs e) + { + if (BorderStyle == BorderStyle.Fixed3D) + { + BorderStyle = BorderStyle.FixedSingle; + } + + SetScrollInfo(); + CheckBoxes = false; + + if (e.Node == null || (e.Node.Bounds.Width <= 0 && e.Node.Bounds.Height <= 0 && e.Node.Bounds.X <= 0 && e.Node.Bounds.Y <= 0)) + { + e.DrawDefault = true; + } + else + { + int drawLeft = (e.Node.Level + 1) * 19 + 3; + int imageLeft = drawLeft; + bool haveImage = false; + + if (MenuHelper.GetSymbol(e.Node) > 0) + { + haveImage = true; + drawLeft += MenuHelper.GetSymbolSize(e.Node) + 6; + } + else + { + if (ImageList != null && ImageList.Images.Count > 0 && e.Node.ImageIndex >= 0 && e.Node.ImageIndex < ImageList.Images.Count) + { + haveImage = true; + drawLeft += ImageList.ImageSize.Width + 6; + } + } + + SizeF sf = e.Graphics.MeasureString(e.Node.Text, Font); + if (e.Node == SelectedNode) + { + e.Graphics.FillRectangle((e.State & TreeNodeStates.Hot) != 0 ? HoverColor : SelectedColor, + new Rectangle(new Point(0, e.Node.Bounds.Y), new Size(Width, e.Node.Bounds.Height))); + + e.Graphics.DrawString(e.Node.Text, Font, SelectedForeColor, drawLeft, e.Bounds.Y + (ItemHeight - sf.Height) / 2.0f); + } + else if (e.Node == CurrentNode && (e.State & TreeNodeStates.Hot) != 0) + { + e.Graphics.FillRectangle(HoverColor, new Rectangle(new Point(0, e.Node.Bounds.Y), new Size(Width, e.Node.Bounds.Height))); + e.Graphics.DrawString(e.Node.Text, Font, ForeColor, drawLeft, e.Bounds.Y + (ItemHeight - sf.Height) / 2.0f); + } + else + { + e.Graphics.FillRectangle(fillColor, new Rectangle(new Point(0, e.Node.Bounds.Y), new Size(Width, e.Node.Bounds.Height))); + e.Graphics.DrawString(e.Node.Text, Font, ForeColor, drawLeft, e.Bounds.Y + (ItemHeight - sf.Height) / 2.0f); + } + + if (haveImage) + { + if (MenuHelper.GetSymbol(e.Node) > 0) + { + SizeF fiSize = e.Graphics.GetFontImageSize(MenuHelper.GetSymbol(e.Node), MenuHelper.GetSymbolSize(e.Node)); + e.Graphics.DrawFontImage(MenuHelper.GetSymbol(e.Node), MenuHelper.GetSymbolSize(e.Node), Color.White, + imageLeft + (MenuHelper.GetSymbolSize(e.Node) - fiSize.Width) / 2.0f, e.Bounds.Y + (e.Bounds.Height - fiSize.Height) / 2); + } + else + { + if (e.Selected() && e.Node.SelectedImageIndex >= 0 && e.Node.SelectedImageIndex < ImageList.Images.Count) + e.Graphics.DrawImage(ImageList.Images[e.Node.SelectedImageIndex], imageLeft, e.Bounds.Y + (e.Bounds.Height - ImageList.ImageSize.Height) / 2); + else + e.Graphics.DrawImage(ImageList.Images[e.Node.ImageIndex], imageLeft, e.Bounds.Y + (e.Bounds.Height - ImageList.ImageSize.Height) / 2); + } + } + + int lineY = e.Bounds.Y + e.Node.Bounds.Height / 2 - 1; + int lineX = 3 + e.Node.Level * 19 + 9; + + try + { + //绘制虚线 + Pen pn = new Pen(UIFontColor.Primary); + pn.DashStyle = DashStyle.Dot; + e.Graphics.DrawLine(pn, lineX, lineY, lineX + 10, lineY); + + if (e.Node.Level >= 1) + { + e.Graphics.DrawLine(pn, lineX, lineY, lineX, e.Bounds.Top); + if (e.Node.NextNode != null) + { + e.Graphics.DrawLine(pn, lineX, lineY, lineX, e.Node.Bounds.Bottom); + } + + TreeNode pNode = e.Node.Parent; + while (pNode != null) + { + lineX -= 19; + + if (pNode.Level == 0 && pNode.NextNode != null) + { + e.Graphics.DrawLine(pn, lineX, lineY, lineX, e.Node.Bounds.Top); + } + + if (pNode.NextNode != null) + { + e.Graphics.DrawLine(pn, lineX, lineY, lineX, e.Node.Bounds.Bottom); + } + + pNode = pNode.Parent; + } + } + else + { + if (e.Node.PrevNode != null) + { + e.Graphics.DrawLine(pn, lineX, lineY, lineX, e.Node.Bounds.Top); + } + + if (e.Node.NextNode != null) + { + e.Graphics.DrawLine(pn, lineX, lineY, lineX, e.Node.Bounds.Bottom); + } + } + + pn.Dispose(); + } + catch (Exception exception) + { + Console.WriteLine(exception); + } + + lineX = 3 + e.Node.Level * 19 + 9; + //绘制左侧+号 + if (e.Node.Nodes.Count > 0) + { + e.Graphics.FillRectangle(Color.White, new Rectangle(lineX - 4, lineY - 4, 8, 8)); + e.Graphics.DrawRectangle(UIFontColor.Primary, new Rectangle(lineX - 4, lineY - 4, 8, 8)); + e.Graphics.DrawLine(UIFontColor.Primary, lineX - 2, lineY, lineX + 2, lineY); + if (!e.Node.IsExpanded) + { + e.Graphics.DrawLine(UIFontColor.Primary, lineX, lineY - 2, lineX, lineY + 2); + } + } + + if (ShowTips && MenuHelper.GetTipsText(e.Node).IsValid()) + { + SizeF tipsSize = e.Graphics.MeasureString(MenuHelper.GetTipsText(e.Node), TipsFont); + float sfMax = Math.Max(tipsSize.Width, tipsSize.Height) + 1; + float tipsLeft = Width - (ScrollBarVisible ? 50 : 30) - 6 - sfMax; + float tipsTop = e.Bounds.Y + (ItemHeight - sfMax) / 2; + + e.Graphics.FillEllipse(Brushes.Red, tipsLeft, tipsTop, sfMax, sfMax); + e.Graphics.DrawString(MenuHelper.GetTipsText(e.Node), TipsFont, Brushes.White, tipsLeft + sfMax / 2.0f - tipsSize.Width / 2.0f, tipsTop + sfMax / 2.0f - tipsSize.Height / 2.0f); + } + } + } + + public string Version { get; } + + protected override void OnNodeMouseClick(TreeNodeMouseClickEventArgs e) + { + base.OnNodeMouseClick(e); + + if (e.Node != null && e.Node.Nodes.Count > 0) + { + if (e.X >= (e.Node.Level + 1) * 19 + 3) + { + if (e.Node.IsExpanded) + { + e.Node.Collapse(); + } + else + { + e.Node.Expand(); + } + } + } + + SelectedNode = e.Node; + } + + protected override void OnMouseWheel(MouseEventArgs e) + { + base.OnMouseWheel(e); + + if (e.Delta > 10) + { + ScrollBarInfo.ScrollUp(Handle); + } + else if (e.Delta < -10) + { + ScrollBarInfo.ScrollDown(Handle); + } + + SetScrollInfo(); + } + + public void SetScrollInfo() + { + if (Nodes.Count == 0) + { + Bar.Visible = false; + return; + } + + var si = ScrollBarInfo.GetInfo(Handle); + Bar.Maximum = si.ScrollMax; + Bar.Visible = si.ScrollMax > 0 && si.nMax > 0 && si.nPage > 0; + Bar.Value = si.nPos; + Bar.BringToFront(); + + if (ScrollBarVisible != Bar.Visible) + { + ScrollBarVisible = Bar.Visible; + Invalidate(); + } + } + + protected override void OnAfterExpand(TreeViewEventArgs e) + { + base.OnAfterExpand(e); + SetScrollInfo(); + } + + protected override void OnAfterCollapse(TreeViewEventArgs e) + { + base.OnAfterCollapse(e); + SetScrollInfo(); + } + + protected override void WndProc(ref Message m) + { + base.WndProc(ref m); + + //隐藏滚动条 + ScrollBarInfo.ShowScrollBar(Handle, 3, false);//0:horizontal,1:vertical,3:both + + if (m.Msg == 0xf || m.Msg == 0x133) + { + if (BorderStyle == BorderStyle.FixedSingle) + { + ControlEx.ResetBorderColor(m, this, 1, Enabled ? RectColor : UIStyles.Blue.RectDisableColor); + } + } + } + } +} \ No newline at end of file diff --git a/SunnyUI/Font/ElegantIcons.png b/SunnyUI/Font/ElegantIcons.png new file mode 100644 index 0000000000000000000000000000000000000000..80a9dfabb0ee63ed26baa27f41b940364e509482 GIT binary patch literal 526030 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