commit 754cd7ccdb26fa3ea2a2cf4468684ae8ad36e7e1 Author: alex_q <914269@qq.com> Date: Sat Jun 13 00:05:19 2026 +0800 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..50ef781 --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +#排除所有的编译目录 +**/Win32/ + +#排除历史和恢复目录 +__history/ +__recovery/ + +#排除本地设置 +*.~dsk +*.cbpr +*.local \ No newline at end of file diff --git a/ACProPCH.h b/ACProPCH.h new file mode 100644 index 0000000..94492a3 --- /dev/null +++ b/ACProPCH.h @@ -0,0 +1,3 @@ +#include +#include + diff --git a/AC_Pro.cbproj b/AC_Pro.cbproj new file mode 100644 index 0000000..a2d404c --- /dev/null +++ b/AC_Pro.cbproj @@ -0,0 +1,2343 @@ + + + {DF8B3824-8E2D-4B64-96CF-98FE2D46AE8E} + 20.4 + VCL + Application + AC_Pro.cpp + True + Debug + Win32 + 1 + AC_Pro + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + $(BDS)\bin\cbuilder_PROJECTICON.ico + AC_Pro + true + CompanyName=唱作网;FileDescription=;FileVersion=3.2.2.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=3.2;Comments= + $(BDS)\bin\default_app.manifest + 2052 + rtl.lib;vcl.lib;vclimg.lib;xmlrtl.lib;vclx.lib;vclactnband.lib;TPNGButton.lib;TCapButton.lib;TComboBoxComponent.lib;TGeneralDialogPanel.lib;TLineEdit.lib;TTextButton.lib;TSkinTrackBar.lib;TCKBox.lib;DbxCommonDriver.lib;dbrtl.lib;IndySystem.lib;IndyProtocols.lib;IndyCore.lib;TRadioBtn.lib;vclwinx.lib;bindengine.lib;bindcomp.lib;RESTComponents.lib;CustomIPTransport.lib + System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) + CppVCLApplication + true + <_TCHARMapping>wchar_t + JPHNE + .\$(Platform)\$(Config) + ..\..\Deploy\$(Config)\Pro + false + true + true + $(BDSLIB)\$(PLATFORM)\release\$(LANGDIR);$(ILINK_TranslatedLibraryPath) + false + false + false + false + false + false + false + 3 + 2 + $(BDS)\bin\Artwork\Windows\UWP\cppreg_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\cppreg_UwpDefault_150.png + true + 5.1 + 5.1 + 2 + + + bcbie;bcbsmp;$(PackageImports) + false + false + $(BDSINCLUDE)\windows\vcl;$(IncludePath) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + CompanyName=;FileVersion=3.2.2.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=3.1;Comments=;ProgramID=;FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) + 1033 + AC_Pro_Icon.ico + AC_Pro_Icon.ico + AC_Pro_Icon.ico + PerMonitorV2 + requireAdministrator + + + 1033 + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) + $(BDSINCLUDE)\windows\vcl;$(IncludePath) + bindcomp;bindcompdbx;bindcompfmx;bindcompvcl;bindengine;CustomIPTransport;DataSnapCommon;dbexpress;dbrtl;dbxcds;DbxCommonDriver;DBXInterBaseDriver;dsnap;FireDAC;FireDACADSDriver;FireDACASADriver;FireDACCommon;FireDACCommonDriver;FireDACDataSnapDriver;FireDACDb2Driver;FireDACDBXDriver;FireDACIBDriver;FireDACMSAccDriver;FireDACMSSQLDriver;FireDACMySQLDriver;FireDACODBCDriver;FireDACOracleDriver;FireDACPgDriver;FireDACSqliteDriver;fmx;fmxase;fmxdae;fmxFireDAC;fmxobj;FMXTee;FmxTeeUI;IndyCore;IndyIPClient;IndyIPCommon;IndyIPServer;IndyProtocols;IndySystem;inet;inetdbxpress;MetropolisUILiveTile;RESTComponents;rtl;soaprtl;Tee;TeeDB;TeeUI;vcl;vclactnband;vcldb;vcldsnap;vclFireDAC;vclie;vclimg;VCLRESTComponents;vclribbon;VclSmp;vcltouch;vclx;xmlrtl;$(PackageImports) + $(BDS)\bin\Artwork\Windows\UWP\cppreg_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\cppreg_UwpDefault_150.png + 0 + 0 + + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + true + + + false + false + false + true + false + true + _DEBUG;$(Defines) + false + None + DEBUG + true + true + true + true + Full + true + true + true + true + true + $(BDSLIB)\$(PLATFORM)\debug;$(ILINK_LibraryPath) + $(BDSLIB)\$(PLATFORM)\debug\$(LANGDIR);$(ILINK_TranslatedLibraryPath) + + + CompanyName=;FileVersion=3.2.2.1219;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=3.1;Comments=;ProgramID=;FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) + true + false + rtl.lib;vcl.lib;vclimg.lib;xmlrtl.lib;vclx.lib;vclactnband.lib;TPNGButton.lib;TCapButton.lib;TComboBoxComponent.lib;TGeneralDialogPanel.lib;TLineEdit.lib;TTextButton.lib;TSkinTrackBar.lib;TCKBox.lib;DbxCommonDriver.lib;dbrtl.lib;IndySystem.lib;IndyProtocols.lib;IndyCore.lib;TRadioBtn.lib;vclwinx.lib;bindengine.lib;bindcomp.lib;RESTComponents.lib;CustomIPTransport.lib + ..\..\Deploy\debug\pro + 1033 + Debug + $(BDSLIB)\$(PLATFORM)$(CC_SUFFIX)\debug;$(ILINK_LibraryPath) + AC_Pro_Icon.ico + requireAdministrator + 5.1 + 5.1 + E:\Ac_Project\module-exports\JNI\ClientService\;$(Debugger_DebugSourcePath) + 1219 + + + AC_Pro_Icon.ico + rtl.lib;vcl.lib;vclimg.lib;xmlrtl.lib;vclx.lib;vclactnband.lib;TPNGButton.lib;TCapButton.lib;TComboBoxComponent.lib;TGeneralDialogPanel.lib;TLineEdit.lib;TTextButton.lib;TSkinTrackBar.lib;TCKBox.lib;DbxCommonDriver.lib;dbrtl.lib;IndySystem.lib;IndyProtocols.lib;IndyCore.lib;TRadioBtn.lib + 1033 + ..\..\Deploy\debug\Pro + Debug + + + PerMonitorV2 + + + CompanyName=唱作网;FileDescription=唱作魔方专业版;FileVersion=3.2.2.0;InternalName=AC_Pro;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=唱作魔方专业版;ProductVersion=3.2;Comments= + false + NDEBUG;$(Defines) + None + + + $(BDSLIB)\$(PLATFORM)$(CC_SUFFIX)\release;$(ILINK_LibraryPath) + ..\..\Deploy\Release\Pro + 1033 + CompanyName=唱作网;FileDescription=唱作魔方专业版;FileVersion=3.2.2.1219;InternalName=AC_Pro.exe;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=唱作魔方专业版;ProductVersion=3.2;Comments=;ProgramID= + false + rtl.lib;vcl.lib;vclimg.lib;xmlrtl.lib;vclx.lib;vclactnband.lib;TPNGButton.lib;TCapButton.lib;TComboBoxComponent.lib;TGeneralDialogPanel.lib;TLineEdit.lib;TTextButton.lib;TSkinTrackBar.lib;TCKBox.lib;DbxCommonDriver.lib;dbrtl.lib;IndySystem.lib;IndyProtocols.lib;IndyCore.lib;TRadioBtn.lib;vclwinx.lib;bindengine.lib;bindcomp.lib;RESTComponents.lib;CustomIPTransport.lib + AC_Pro_Icon.ico + requireAdministrator + true + 1219 + + + PerMonitorV2 + + + +
AboutForm
+ dfm + AboutFormUnit.h + 70 +
+ + 0 + + +
AudioFxForm
+ dfm + AudioFxFormUnit.h + 148 +
+ + AudioTrack.h + 122 + + + AudStylePanel.h + 33 + + + 164 + + + BKGMemoUnit.h + 48 + + + BtnPanelUnit.h + 130 + + + ChordPanel.h + 161 + + + Compose.h + 56 + + + ContentPanelUnit.h + 11 + + +
CustomerSettingForm
+ dfm + CustomerSettingFormUnit.h + 105 +
+ + CustomerSettingPanelUnit.h + 106 + + + FavorTextureUnit.h + 138 + + + FxDef.h + 52 + + + GlobalUnit.h + 3 + + +
HelpForm
+ dfm + HelpFormUnit.h + 78 +
+ + HelpPanelUnit.h + 82 + + + ImgCopperExUnit.h + 126 + + +
ImgCopperForm
+ dfm + ImgCopperFormUnit.h + 127 +
+ +
ImportForm
+ dfm + ImportFormUnit.h + 46 +
+ +
ImportSegmentForm
+ dfm + ImportSegmentFormUnit.h + 108 +
+ + Instruments.h + 91 + + + KeyBoard.h + 62 + + + ListPanel.h + 87 + + + ListViewBase.h + 143 + + + ListViewMove.h + 162 + + + ListViewPattern.h + 142 + + + ListViewText.h + 141 + + +
LoginForm
+ dfm + LoginFormUnit.h + 182 +
+ +
MainForm
+ dfm + MainFormUnit.h + 2 +
+ +
ManageSongForm
+ dfm + ManageSongFormUnit.h + 72 +
+ + MenuBar.h + 9 + + + MenuUnit.h + 136 + + +
MessageForm
+ dfm + MessageFormUnit.h + 5 +
+ +
MicSetForm
+ dfm + MicSetFormUnit.h + 44 +
+ + MidiTrack.h + 161 + + +
MultiSwitchProgForm
+ dfm + MultiSwitchProgFormUnit.h + 98 +
+ + NotificationADPanelUnit.h + 92 + + + NotificationContentPanelUnit.h + 93 + + + NotificationExUnit.h + 94 + + +
NotificationForm
+ dfm + NotificationFormUnit.h + 95 +
+ + NotificationThreadUnit.h + 96 + + + PanelDB.h + 139 + + +
PayMentForm
+ dfm + PayMentFormUnit.h + 102 +
+ + PayMentPanelUnit.h + 103 + + + PlayTimePanel.h + 170 + + +
PredefineProjectForm
+ dfm + PredefineProjectFormUnit.h + 104 +
+ + PredefineProjectSetUnit.h + 104 + + + PreStylePanel.h + 32 + + + ProgHandlePanel.h + 99 + + +
ProgressForm
+ dfm + ProgressFormUnit.h + 20 +
+ + ProgressThreadUnit.h + 21 + + + Project.h + 125 + + + QRcodePanel.h + 38 + + + RCDATA + chordUp + + + RCDATA + chord2 + + + RCDATA + chord4 + + + RCDATA + chord6 + + + RCDATA + chord7 + + + RCDATA + chordDown + + + RCDATA + chordI + + + RCDATA + chordMaj + + + RCDATA + chordMin + + + RCDATA + chordSus + + + RCDATA + chordV + + + BITMAP + imgWaveIcon + + + BITMAP + imgMidiIcon + + + BITMAP + imgPlayCursor + + + BITMAP + music_cover_default + + + RCDATA + round + + + RCDATA + imgEffectAdd + + + RCDATA + imgEffectOff + + + RCDATA + imgEffectOn + + + RCDATA + HelpPNG + + + BITMAP + KBBlackDown + + + CURSOR + CursorBrush + + + CURSOR + CursorBrushAdd + + + CURSOR + CursorBrushNo + + + RCDATA + KeyBoard + + + RCDATA + imgMIButton + + + RCDATA + NoticeBk + + + RCDATA + btnViewChordLeft + + + RCDATA + btnViewChordRight + + + RCDATA + btnViewStyleLeft + + + RCDATA + btnViewStyleRight + + + RCDATA + btnViewTrackLeft + + + RCDATA + btnViewTrackRight + + + BITMAP + KBWhiteDDown + + + BITMAP + KBWhiteLDown + + + BITMAP + KBWhiteRDown + + + RCDATA + imgInfo + + + BITMAP + imgProgressLeft + + + BITMAP + imgProgressRight + + + RCDATA + imgBeatHint1 + + + RCDATA + imgBeatHint2 + + + RCDATA + imgBeatHint3 + + + RCDATA + imgBeatHint4 + + + BITMAP + SBLineDown + + + BITMAP + SBLineLeft + + + BITMAP + SBLineRight + + + BITMAP + SBLineUp + + + RCDATA + TapDown + + + RCDATA + TapNor + + + RCDATA + imgAddChannel + + + RCDATA + imgAddSegment + + + RCDATA + imgAlphaChord + + + RCDATA + imgChannel + + + RCDATA + imgCollect + + + RCDATA + imgDownload + + + RCDATA + imgEffWav + + + RCDATA + imgItemChecked + + + RCDATA + imgItemUnchecked + + + RCDATA + imgNewStyle + + + RCDATA + imgPylon + + + RCDATA + imgStar + + + RCDATA + imgScore + + + RCDATA + imgUnScore + + + RCDATA + imgStyleCharge + + + RCDATA + imgStyleSave + + + RCDATA + imgStyleUpload + + + RCDATA + imgFold + + + RCDATA + imgUnfold + + + RCDATA + imgBrush + + + RCDATA + imgDelete + + + RCDATA + imgProg + + + RCDATA + imgTabCollect + + + RCDATA + imgTabLocal + + + RCDATA + imgTabRecom + + + RCDATA + imgTabRelease + + + RCDATA + imgTabSelect + + + RCDATA + imgTabShare + + + RCDATA + imgTexture + + + RCDATA + imgTrackOff + + + RCDATA + imgTrackOn + + + RCDATA + imgUnCollect + + + RCDATA + imgVolume + + + RCDATA + imgWave + + + RCDATA + imgWavEff + + + RCDATA + imgClose + + + RCDATA + ImgSubMenu + + + RCDATA + ImgDownMenu + + + RCDATA + ImgUpMenu + + + RCDATA + UserInfo_Icon + + + RCDATA + UserInfo_Coin + + + RCDATA + UserInfo_Fans + + + RCDATA + UserInfo_Music + + + RCDATA + UserInfo_Pops + + + RCDATA + UserInfo_Zone + + + RCDATA + vipNone + + + RCDATA + vipTimer + + + RCDATA + vipForever + + +
SaveForm
+ dfm + SaveFormUnit.h + 52 +
+ +
SaveLocalStyleForm
+ dfm + SaveLocalStyleFormUnit.h + 107 +
+ +
ScoreForm
+ dfm + ScoreFormUnit.h + 88 +
+ + ScrollViewUnit.h + 146 + + +
SetUpForm
+ dfm + SetUpFormUnit.h + 40 +
+ + ShowUserInfoPanel.h + 56 + + + SkinHintWindow.h + 19 + + + SkinScrollBarUnit.h + 12 + + +
SplashForm
+ dfm + SplashFormUnit.h + 4 +
+ + StateBtn.h + 144 + + + StyleItem.h + 40 + + + StylePanel.h + 15 + + + StyleSelPanel.h + 54 + + +
StyleSpecsForm
+ dfm + StyleSpecsFormUnit.h + 119 +
+ +
StyleUploadForm
+ dfm + StyleUploadFormUnit.h + 116 +
+ +
SwitchProgForm
+ dfm + SwitchProgFormUnit.h + 84 +
+ +
SwitchPartternForm
+ dfm + SwitchTextureForm.h + 137 +
+ + TableViewUnit.h + 145 + + + ToolpalPanel.h + 14 + + + TrackPanel.h + 81 + + + TransSkinScrollBar.h + 129 + + + Undo.h + 124 + + +
UpdateForm
+ dfm + UpdateFormUnit.h + 78 +
+ + UpDownUnit.h + 41 + + +
UploadForm
+ dfm + UploadFormUnit.h + 47 +
+ + UseStylePanel.h + 31 + + +
VerifyCodeForm
+ dfm + VerifyCodeFormUnit.h + 182 +
+ +
VolumeForm
+ dfm + VolumeFormUnit.h + 53 +
+ +
VSTiForm
+ dfm + VSTiFormUnit.h + 149 +
+ +
VSTPathForm
+ dfm + VSTPathFormUnit.h + 163 +
+ +
VSTPluginForm
+ dfm + VSTPluginFormUnit.h + 150 +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Base + + + Cfg_1 + Base + + + Cfg_2 + Base + +
+ + CPlusPlusBuilder.Personality.12 + CppVCLApplication + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2052 + 936 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + False + True + False + False + + + AC_Pro.cpp + + + Embarcadero C++Builder Office 2000 Servers Package + Embarcadero C++Builder Office XP Servers Package + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + + + + + + true + + + + + true + + + + + + + true + + + + + + + + + + + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + + + + + + + + + + + true + + + + + true + + + + + true + + + + + true + + + + + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + res\xml + 1 + + + res\xml + 1 + + + + + library\lib\armeabi + 1 + + + library\lib\armeabi + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\mips + 1 + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-anydpi-v21 + 1 + + + res\drawable-anydpi-v21 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-v21 + 1 + + + res\values-v21 + 1 + + + + + res\values-v31 + 1 + + + res\values-v31 + 1 + + + + + res\values-v35 + 1 + + + res\values-v35 + 1 + + + + + res\drawable-anydpi-v26 + 1 + + + res\drawable-anydpi-v26 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-anydpi-v33 + 1 + + + res\drawable-anydpi-v33 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-night-v21 + 1 + + + res\values-night-v21 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-small + 1 + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + res\drawable-xlarge + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\drawable-anydpi-v24 + 1 + + + res\drawable-anydpi-v24 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-night-anydpi-v21 + 1 + + + res\drawable-night-anydpi-v21 + 1 + + + + + res\drawable-anydpi-v31 + 1 + + + res\drawable-anydpi-v31 + 1 + + + + + res\drawable-night-anydpi-v31 + 1 + + + res\drawable-night-anydpi-v31 + 1 + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + Contents\MacOS + 1 + .framework + + + Contents\MacOS + 1 + .framework + + + Contents\MacOS + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + 0 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + ..\ + 1 + + + + + Contents + 1 + + + Contents + 1 + + + Contents + 1 + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + Contents\MacOS + 1 + + + Contents\MacOS + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + ..\ + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen + 64 + + + ..\$(PROJECTNAME).launchscreen + 64 + + + + + 1 + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + Assets + 1 + + + Assets + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + + + + + + + + + + + + + + + True + False + False + + False + + 12 + + + + +
diff --git a/AC_Pro.cpp b/AC_Pro.cpp new file mode 100644 index 0000000..3f87c11 --- /dev/null +++ b/AC_Pro.cpp @@ -0,0 +1,410 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop +#include +#include + +#include "GlobalUnit.h" +#include "SplashFormUnit.h" +#include "MessageFormUnit.h" +//--------------------------------------------------------------------------- + +USEFORM("SplashFormUnit.cpp", SplashForm); +USEFORM("MainFormUnit.cpp", MainForm); +USEFORM("MessageFormUnit.cpp", MessageForm); +//--------------------------------------------------------------------------- +HWND hWnd = NULL; +HINSTANCE u_hMMDll = NULL, + u_hCMDll = NULL, + u_hCSDll = NULL, + u_hQRDll = NULL; + +void InitUserPath() +{ + SplashForm->ShowProgress( "û·..." ); + + String strAppPath = TPath::GetFullPath(ExtractFilePath(Application->ExeName)); + g_strExecutePath = strAppPath.c_str(); + + TCHAR filePath[MAX_PATH]; + SHGetSpecialFolderPath(NULL, filePath, CSIDL_LOCAL_APPDATA, TRUE); + + String strLocPath = filePath; + strLocPath += L"\\iChangzuo"; + + if(!DirectoryExists( strLocPath, false)){ + ForceDirectories( strLocPath ); + } + +#ifdef _LITE_ + strLocPath += L"\\Ac_ProLite\\"; +#else + strLocPath += L"\\Ac_Pro\\"; +#endif + g_strUserPath = strLocPath.c_str(); + + if(!DirectoryExists( strLocPath, false)){ + ForceDirectories( strLocPath ); + } + + if(!DirectoryExists( strLocPath + L"Help", false)){ + ForceDirectories( strLocPath + L"Help" ); + } + + if(!DirectoryExists( strLocPath + L"header", false)){ + ForceDirectories( strLocPath + L"header" ); + String strSrc = strAppPath + L"Header\\default.jpg", + strDest = strLocPath + L"Header\\default.jpg"; + + if( FileExists( strSrc, false ) ) + CopyFile( strSrc.c_str(), strDest.c_str(), FALSE ); + } + + strLocPath += L"Profile\\"; + strAppPath += L"Profile\\"; + + bool bCover = false; + + if( DirectoryExists( strAppPath, false ) ){ + if( !DirectoryExists( strLocPath, false) ){ + ForceDirectories( strLocPath ); + bCover = true; + } + } + else{ + return; + } + + String strSubPathShort[3] = { "dt_eerp", "ml_bursa", "sf_lyres" }, + strDefaultFile[3][2] = { {"uflid.jst","lidshr.lux"}, + {"frm0000.lmd","shr0000.lmd"}, + {"Lcyh00000.dhy","Lcyh00001.dhy"} }; + + for( int i=0; i<3; i++ ){ + String strOriPath = strAppPath + strSubPathShort[i], + strSubPath = strLocPath + strSubPathShort[i]; + + if( DirectoryExists( strOriPath, false ) ){ + if( !DirectoryExists( strSubPath, false ) ){ + ForceDirectories( strSubPath ); + bCover = true; + } + else{ + for( int j=0; j<2; j++ ){ + String strExistFile = strOriPath + L"\\" + strDefaultFile[i][j], + strNewFile = strSubPath + L"\\" + strDefaultFile[i][j]; + + HANDLE hOriFile = CreateFile( strExistFile.c_str(), GENERIC_READ, FILE_SHARE_READ, + NULL, OPEN_EXISTING, 0, NULL ); + + if( hOriFile && hOriFile!=INVALID_HANDLE_VALUE ){ + HANDLE hNewFile = CreateFile( strNewFile.c_str(), GENERIC_READ, FILE_SHARE_READ, + NULL, OPEN_EXISTING, 0, NULL); + + if( hNewFile && hNewFile!=INVALID_HANDLE_VALUE ){ + DWORD dwSizeOri = GetFileSize( hOriFile, NULL ), + dwSizeNew = GetFileSize( hNewFile, NULL ); + FILETIME ftModifyOri, ftModifyNew; + GetFileTime( hOriFile, NULL, NULL, &ftModifyOri ); + GetFileTime( hNewFile, NULL, NULL, &ftModifyNew ); + + if( dwSizeOri>dwSizeNew || CompareFileTime( &ftModifyOri, &ftModifyNew )>0 ) + bCover = true; + + CloseHandle( hNewFile ); + } + else{ + bCover = true; + } + + CloseHandle( hOriFile ); + } + else if( j==0 ){ + return; + } + } + } + } + else{ + return; + } + } + + TSearchRec sr; + int iAttr = 0; + + for( int i=0; i<3; i++ ){ + String strOriPath = strAppPath + strSubPathShort[i], + strSubPath = strLocPath + strSubPathShort[i]; + + if (FindFirst(strOriPath + L"\\*.*", iAttr, sr) == 0) { + do { + String strExistFile = strOriPath + L"\\" + sr.Name, + strNewFile = strSubPath + L"\\" + sr.Name; + bool bCopy = true; + + if( !sr.Name.Compare(strDefaultFile[i][0]) || !sr.Name.Compare(strDefaultFile[i][1]) ){ + bCopy = bCover; + } + else if( FileExists( strNewFile, false ) ){ + HANDLE hOriFile = CreateFile( strExistFile.c_str(), GENERIC_READ, FILE_SHARE_READ, + NULL, OPEN_EXISTING, 0, NULL ); + if( hOriFile && hOriFile!=INVALID_HANDLE_VALUE ){ + HANDLE hNewFile = CreateFile( strNewFile.c_str(), GENERIC_READ, FILE_SHARE_READ, + NULL, OPEN_EXISTING, 0, NULL); + if( hNewFile && hNewFile!=INVALID_HANDLE_VALUE ){ + FILETIME ftModifyOri, ftModifyNew; + GetFileTime( hOriFile, NULL, NULL, &ftModifyOri ); + GetFileTime( hNewFile, NULL, NULL, &ftModifyNew ); + CloseHandle( hNewFile ); + + if( CompareFileTime( &ftModifyNew, &ftModifyOri )>=0 ){ + bCopy = false; + } + } + + CloseHandle( hOriFile ); + } + else{ + bCopy = false; + } + } + + if( bCopy ){ + CopyFile( strExistFile.c_str(), strNewFile.c_str(), FALSE ); + + if( !sr.Name.Compare(L"smtd.dhy") ){ //ط账ʱ + HANDLE hOriFile = CreateFile( strExistFile.c_str(), GENERIC_READ, FILE_SHARE_READ, + NULL, OPEN_EXISTING, 0, NULL ); + + if( hOriFile && hOriFile!=INVALID_HANDLE_VALUE ){ + HANDLE hNewFile = CreateFile( strNewFile.c_str(), GENERIC_WRITE, FILE_SHARE_WRITE, + NULL, OPEN_EXISTING, 0, NULL); + if( hNewFile && hNewFile!=INVALID_HANDLE_VALUE ){ + FILETIME ftCreate; + GetFileTime( hOriFile, &ftCreate, NULL, NULL ); + SetFileTime( hNewFile, &ftCreate, NULL, NULL ); + CloseHandle( hNewFile ); + } + + CloseHandle( hOriFile ); + } + } + } + } + while( FindNext(sr)==0 ); + + FindClose(sr); + } + } +} + +int LoadDlls() +{ + SplashForm->ShowProgress( "ýģ..." ); + u_hMMDll = LoadLibrary(L"MediaModule.dll"); + if( u_hMMDll==NULL ){ + return 1; + } + else if( GetMMFunctions(u_hMMDll)==S_FALSE ) { + return 2; + } + + SplashForm->ShowProgress( "رģ..." ); + u_hCMDll = LoadLibrary(L"CompModule.dll"); + if( u_hCMDll==NULL ){ + int err = GetLastError(); + return 3; + } + else if( GetCMFunctions(u_hCMDll)==S_FALSE ) { + return 4; + } + + SplashForm->ShowProgress( "ģ..." ); + u_hCSDll = LoadLibrary(L"ClientService.dll"); + if( u_hCSDll==NULL ){ + return 5; + } + else if( GetCSFunctions(u_hCSDll)==S_FALSE ) { + return 6; + } + + u_hQRDll = LoadLibrary(L"QRcode.dll"); + if( u_hQRDll ){ + GetQRFunctions(u_hQRDll); + } + + return 0; +} + +void FreeDlls() +{ + if( u_hCMDll ){ + FreeLibrary( u_hCMDll ); + u_hCMDll = NULL; + } + + if( u_hMMDll ){ + FreeLibrary( u_hMMDll ); + u_hMMDll = NULL; + } + + if( u_hCSDll ){ + FreeLibrary( u_hCSDll ); + u_hCSDll = NULL; + } + + if( u_hQRDll ){ + FreeLibrary( u_hQRDll ); + u_hQRDll = NULL; + } +} + +int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) +{ + hWnd = FindWindow( (LPCTSTR)APPNAME, NULL ); + if( hWnd ){ + SendMessage( hWnd, UM_RESTORE, 0, 0 ); + + if( !ParamStr(1).IsEmpty() ){ + int BUF_SIZE = 256; + TCHAR szName[]=TEXT("MyFileMappingObject"); + LPTSTR pBuf; + HANDLE hMapFile = CreateFileMapping( + INVALID_HANDLE_VALUE, // use paging file + NULL, // default security + PAGE_READWRITE, // read/write access + 0, // max. object size + BUF_SIZE, // buffer size + szName); // name of mapping object + + if( hMapFile ){ + pBuf = (LPTSTR) MapViewOfFile(hMapFile, // handle to map object + FILE_MAP_ALL_ACCESS, // read/write permission + 0, + 0, + BUF_SIZE); + + if( pBuf ){ + wcscpy( pBuf, ParamStr(1).c_str() ); + SendMessage( hWnd, UM_LOADPROJECT, 0, wcslen(pBuf) ); + UnmapViewOfFile(pBuf); + } + + CloseHandle(hMapFile); + } + } + + return 0; + } + + try + { + Application->Initialize(); + Application->MainFormOnTaskBar = true; + Application->Title = APPNAME; + + // ȡDPI + HDC hdc = GetDC(NULL); + if (hdc != NULL) { + g_xDpi = GetDeviceCaps(hdc, LOGPIXELSX); + g_yDpi = GetDeviceCaps(hdc, LOGPIXELSY); + ReleaseDC(NULL, hdc); + } + + g_szFont7 = int(7 * 96.0 / g_yDpi + 0.5); + g_szFont8 = int(8 * 96.0 / g_yDpi + 0.5); + g_szFont9 = int(9 * 96.0 / g_yDpi + 0.5); + g_szFont10 = int(10 * 96.0 / g_yDpi + 0.5); + g_szFont11 = int(11 * 96.0 / g_yDpi + 0.5); + g_szFont12 = int(12 * 96.0 / g_yDpi + 0.5); + g_szFont16 = int(16 * 96.0 / g_yDpi + 0.5); + + //ʾͼƬ + SplashForm = new TSplashForm(Application); + SplashForm->Show(); + + InitUserPath(); + + String strErr; + switch(LoadDlls()){ + case 1: + strErr = "ýģʧܣ"; + break; + + case 2: + strErr = "ȡýģ麯ʧܣ"; + break; + + case 3: + strErr = "رģʧܣ"; + break; + + case 4: + strErr = "ȡģ麯ʧܣ"; + break; + + case 5: + strErr = "ģʧܣ"; + break; + + case 6: + strErr = "ȡʧܣ"; + break; + + default: + break; + } + + MessageForm = new TMessageForm(Application); + MessageForm->Position = poDesktopCenter; + + if( !strErr.IsEmpty() ){ + delete SplashForm; + FreeDlls(); + + MessageForm->ShowMessage( strErr, MB_ICONERROR|MB_OK ); + delete MessageForm; + return 0; + } + + Word Saved8087CW = Default8087CW; + System::Set8087CW(0x133f); + + Application->CreateForm(__classid(TMainForm), &MainForm); + Application->MainForm->Visible = false; + + delete SplashForm; + SplashForm = NULL; + + if( !g_lstFonts.empty() ){ + Application->MainForm->Visible = true; + MessageForm->Position = poMainFormCenter; + + Application->Run(); + } + + delete MessageForm; + FreeDlls(); + + System::Set8087CW(Saved8087CW); + } + catch (Exception &exception) + { + Application->ShowException(&exception); + } +// catch (...) +// { +// try +// { +// throw Exception(""); +// } +// catch (Exception &exception) +// { +// Application->ShowException(&exception); +// } +// } + return 0; +} +//--------------------------------------------------------------------------- diff --git a/AC_Pro.dsk b/AC_Pro.dsk new file mode 100644 index 0000000..b0a9ad8 --- /dev/null +++ b/AC_Pro.dsk @@ -0,0 +1,761 @@ +[Closed Files] +File_0=TSourceModule,'E:\Ac_Project\Ac_Windows\AC_Pro\VSTiFormUnit.cpp',0,1,1,1,1,0,0,, +File_1=TSourceModule,'E:\Ac_Project\Ac_Windows\AC_Pro\CustomerSettingFormUnit.cpp',0,1,1,1,1,0,0,, +File_2=TSourceModule,'E:\Ac_Project\Ac_Windows\AC_Pro\CustomerSettingPanelUnit.cpp',0,1,28,36,64,0,0,, +File_3=TSourceModule,'E:\Ac_Project\Ac_Windows\AC_Pro\StyleSelPanel.cpp',0,1,515,1,548,0,0,, +File_4=TSourceModule,'d:\program files\embarcadero\studio\23.0\SOURCE\VCL\Vcl.Controls.pas',0,1,3698,1,3731,0,0,, +File_5=TSourceModule,'E:\Ac_Project\Ac_Windows\AC_Pro\MessageFormUnit.cpp',0,1,1,1,1,0,0,, +File_6=TSourceModule,'E:\Ac_Project\Ac_Windows\AC_Pro\SplashFormUnit.cpp',0,1,1,1,1,0,0,, +File_7=TSourceModule,'E:\Ac_Project\Ac_Windows\AC_Pro\StylePanel.cpp',0,1,2319,1,2352,0,0,, +File_8=TSourceModule,'E:\Ac_Project\Ac_Windows\AC_Pro\SetUpFormUnit.cpp',0,1,1,1,1,0,0,, +File_9=TSourceModule,'E:\Ac_Project\Ac_Windows\AC_Pro\MessageDef.h',0,1,1,1,1,0,0,, +File_10=TSourceModule,'E:\Ac_Project\Ac_Windows\AC_Pro\ProCommon.h',0,1,1,21,5,0,0,, +File_11=TSourceModule,'E:\Ac_Project\Ac_Windows\AC_Pro\commonstruct.h',0,1,1,1,1,0,0,, +File_12=TSourceModule,'E:\Ac_Project\Ac_Windows\AC_Pro\SaveFormUnit.cpp',0,1,1,105,24,0,0,, +File_13=TSourceModule,'E:\BCB_Project\Apps\UKeyApps\SLPChecker\SLPChecker.cpp',0,1,1,99,594,0,0,, +File_14=TSourceModule,'E:\BCB_Project\Apps\UKeyApps\SLPrint\PrintThread.cpp',0,1,1,1,1,0,0,, + +[Modules] +Module0=E:\Ac_Project\Ac_Windows\AC_Pro\GlobalUnit.cpp +Module1=E:\Ac_Project\Ac_Windows\AC_Pro\AC_Pro.cbproj +Module2=E:\Ac_Project\Ac_Windows\AC_Pro\MainFormUnit.cpp +Module3=E:\Ac_Project\Ac_Windows\AC_Pro\VSTPathFormUnit.cpp +Count=4 +EditWindowCount=1 + +[E:\Ac_Project\Ac_Windows\AC_Pro\GlobalUnit.cpp] +ModuleType=TSourceModule + +[E:\Ac_Project\Ac_Windows\AC_Pro\AC_Pro.cbproj] +ModuleType=TBaseProject + +[E:\Ac_Project\Ac_Windows\AC_Pro\MainFormUnit.cpp] +ModuleType=TSourceModule + +[E:\Ac_Project\Ac_Windows\AC_Pro\VSTPathFormUnit.cpp] +ModuleType=TSourceModule + +[EditWindow0] +ViewCount=4 +CurrentEditView=E:\Ac_Project\Ac_Windows\AC_Pro\GlobalUnit.cpp +View0=0 +View1=1 +View2=2 +View3=3 +PercentageSizes=1 +Create=1 +Visible=1 +Docked=1 +State=0 +Left=0 +Top=0 +Width=9938 +Height=9253 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=9938 +ClientHeight=9253 +TBDockHeight=4476 +LRDockWidth=3621 +Dockable=1 +StayOnTop=0 +DockedToMainForm=1 +BorlandEditorCodeExplorer=BorlandEditorCodeExplorer@EditWindow0 +TopPanelSize=0 +LeftPanelSize=1895 +LeftPanelClients=PropertyInspector,DockSite3 +LeftPanelData=00000800010100000000251000000000000001670700000000000001000000005A0E000009000000446F636B53697465330100000000B31C00001100000050726F7065727479496E73706563746F72FFFFFFFF +RightPanelSize=1996 +RightPanelClients=DockSite2,DockSite4 +RightPanelData=00000800010100000000251000000000000001CC0700000000000001000000004912000009000000446F636B53697465320100000000B31C000009000000446F636B5369746534FFFFFFFF +BottomPanelSize=1542 +BottomPanelClients=DockSite1,MessageView +BottomPanelData=0000080001020100000009000000446F636B536974653103450000000000000206060000000000000100000000034500000F0000004D65737361676556696577466F726DFFFFFFFF +BottomMiddlePanelSize=0 +BottomMiddlePanelClients=DockSite0,GraphDrawingModel +BottomMiddelPanelData=0000080001020200000009000000446F636B536974653010000000477261706844726177696E67566965779F1D00000000000002F206000000000000FFFFFFFF + +[View0] +CustomEditViewType=TEditView +Module=E:\Ac_Project\Ac_Windows\AC_Pro\AC_Pro.cpp +CursorX=106 +CursorY=236 +TopLine=182 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\AC_Pro.cpp + +[View1] +CustomEditViewType=TEditView +Module=E:\Ac_Project\Ac_Windows\AC_Pro\VSTPathFormUnit.cpp +CursorX=99 +CursorY=108 +TopLine=80 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\VSTPathFormUnit.cpp + +[View2] +CustomEditViewType=TEditView +Module=E:\Ac_Project\Ac_Windows\AC_Pro\MainFormUnit.cpp +CursorX=1 +CursorY=5918 +TopLine=5879 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\MainFormUnit.cpp + +[View3] +CustomEditViewType=TEditView +Module=E:\Ac_Project\Ac_Windows\AC_Pro\GlobalUnit.cpp +CursorX=87 +CursorY=851 +TopLine=838 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\GlobalUnit.cpp + +[Watches] +Count=0 + +[WatchWindow] +WatchColumnWidth=120 +WatchShowColumnHeaders=1 +PercentageSizes=1 +Create=1 +Visible=1 +Docked=1 +State=0 +Left=0 +Top=0 +Width=3824 +Height=1221 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=3824 +ClientHeight=1221 +TBDockHeight=216 +LRDockWidth=13602 +Dockable=1 +StayOnTop=0 + +[Breakpoints] +Count=1 +Breakpoint0='E:\Ac_Project\Ac_Windows\AC_Pro\MainFormUnit.cpp',5918,'',0,1,'',1,0,0,'',1,'','','',0,'' + +[EmbarcaderoWin32Debugger_AddressBreakpoints] +Count=0 + +[EmbarcaderoWin64Debugger_AddressBreakpoints] +Count=0 + +[EmbarcaderoWin64LLDBDebugger_AddressBreakpoints] +Count=0 + +[Main Window] +PercentageSizes=1 +Create=1 +Visible=1 +Docked=0 +State=2 +Left=145 +Top=273 +Width=8930 +Height=8520 +MaxLeft=-4 +MaxTop=-7 +MaxWidth=8930 +MaxHeight=8520 +ClientWidth=10000 +ClientHeight=10057 +BottomPanelSize=8944 +BottomPanelClients=EditWindow0 +BottomPanelData=0000080000000000000000000000000000000000000000000000000100000000000000000C0000004564697457696E646F775F30FFFFFFFF + +[ProjectManager] +PercentageSizes=1 +Create=1 +Visible=1 +Docked=1 +State=0 +Left=0 +Top=0 +Width=1996 +Height=4382 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=1996 +ClientHeight=4382 +TBDockHeight=5898 +LRDockWidth=2348 +Dockable=1 +StayOnTop=0 + +[MessageView] +PercentageSizes=1 +Create=1 +Visible=1 +Docked=1 +State=0 +Left=0 +Top=28 +Width=9938 +Height=1394 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=9938 +ClientHeight=1394 +TBDockHeight=1394 +LRDockWidth=2770 +Dockable=1 +StayOnTop=0 + +[ToolForm] +PercentageSizes=1 +Create=1 +Visible=1 +Docked=1 +State=0 +Left=0 +Top=0 +Width=1996 +Height=2557 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=1996 +ClientHeight=2557 +TBDockHeight=7155 +LRDockWidth=1996 +Dockable=1 +StayOnTop=0 + +[PropertyInspector] +PercentageSizes=1 +Create=1 +Visible=1 +Docked=1 +State=0 +Left=0 +Top=557 +Width=1895 +Height=3599 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=1895 +ClientHeight=3599 +TBDockHeight=7004 +LRDockWidth=1895 +Dockable=1 +StayOnTop=0 +SplitPos=111 + +[frmDesignPreview] +PercentageSizes=1 +Create=1 +Visible=1 +Docked=1 +State=0 +Left=0 +Top=0 +Width=1996 +Height=6803 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=1996 +ClientHeight=6803 +TBDockHeight=5955 +LRDockWidth=2512 +Dockable=1 +StayOnTop=0 + +[TemplateView] +PercentageSizes=1 +Create=1 +Visible=0 +Docked=1 +State=0 +Left=-2296 +Top=370 +Width=273 +Height=359 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=273 +ClientHeight=359 +TBDockHeight=359 +LRDockWidth=273 +Dockable=1 +StayOnTop=0 +Name=120 +Description=334 +filter=1 + +[DebugLogView] +PercentageSizes=1 +Create=1 +Visible=1 +Docked=1 +State=0 +Left=0 +Top=0 +Width=3824 +Height=1221 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=3824 +ClientHeight=1221 +TBDockHeight=409 +LRDockWidth=4949 +Dockable=1 +StayOnTop=0 + +[ThreadStatusWindow] +PercentageSizes=1 +Create=1 +Visible=1 +Docked=1 +State=0 +Left=0 +Top=0 +Width=3824 +Height=1221 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=3824 +ClientHeight=1221 +TBDockHeight=216 +LRDockWidth=7406 +Dockable=1 +StayOnTop=0 +Column0Width=145 +Column1Width=100 +Column2Width=115 +Column3Width=619 + +[LocalVarsWindow] +PercentageSizes=1 +Create=1 +Visible=1 +Docked=1 +State=0 +Left=0 +Top=0 +Width=3824 +Height=1221 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=3824 +ClientHeight=1221 +TBDockHeight=1537 +LRDockWidth=3484 +Dockable=1 +StayOnTop=0 + +[CallStackWindow] +PercentageSizes=1 +Create=1 +Visible=1 +Docked=1 +State=0 +Left=0 +Top=0 +Width=3824 +Height=1221 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=3824 +ClientHeight=1221 +TBDockHeight=2062 +LRDockWidth=3484 +Dockable=1 +StayOnTop=0 + +[PatchForm] +PercentageSizes=1 +Create=1 +Visible=1 +Docked=1 +State=0 +Left=0 +Top=0 +Width=2340 +Height=1279 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=2340 +ClientHeight=1279 +TBDockHeight=2500 +LRDockWidth=3398 +Dockable=1 +StayOnTop=0 + +[FindReferencsForm] +PercentageSizes=1 +Create=1 +Visible=1 +Docked=1 +State=0 +Left=0 +Top=0 +Width=2340 +Height=1042 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=2340 +ClientHeight=1042 +TBDockHeight=2320 +LRDockWidth=2824 +Dockable=1 +StayOnTop=0 + +[RefactoringForm] +PercentageSizes=1 +Create=1 +Visible=1 +Docked=1 +State=0 +Left=0 +Top=0 +Width=2340 +Height=1279 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=2340 +ClientHeight=1279 +TBDockHeight=3211 +LRDockWidth=2824 +Dockable=1 +StayOnTop=0 + +[ToDo List] +PercentageSizes=1 +Create=1 +Visible=1 +Docked=1 +State=0 +Left=0 +Top=0 +Width=2340 +Height=1279 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=2340 +ClientHeight=1279 +TBDockHeight=1157 +LRDockWidth=3676 +Dockable=1 +StayOnTop=0 +Column0Width=314 +Column1Width=30 +Column2Width=150 +Column3Width=172 +Column4Width=129 +SortOrder=4 +ShowHints=1 +ShowChecked=1 + +[DataExplorerContainer] +PercentageSizes=1 +Create=1 +Visible=1 +Docked=1 +State=0 +Left=0 +Top=0 +Width=1996 +Height=6803 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=1996 +ClientHeight=6803 +TBDockHeight=4885 +LRDockWidth=7148 +Dockable=1 +StayOnTop=0 + +[GraphDrawingModel] +PercentageSizes=1 +Create=1 +Visible=0 +Docked=1 +State=0 +Left=501 +Top=1099 +Width=2855 +Height=3211 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=2855 +ClientHeight=3211 +TBDockHeight=3211 +LRDockWidth=2855 +Dockable=1 +StayOnTop=0 + +[ClassBrowserTool] +PercentageSizes=1 +Create=1 +Visible=0 +Docked=1 +State=0 +Left=-250 +Top=-124 +Width=1848 +Height=3139 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=1848 +ClientHeight=3139 +TBDockHeight=3139 +LRDockWidth=1848 +Dockable=1 +StayOnTop=0 + +[MetricsView] +PercentageSizes=1 +Create=1 +Visible=1 +Docked=1 +State=0 +Left=0 +Top=0 +Width=2340 +Height=1279 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=2340 +ClientHeight=1279 +TBDockHeight=4835 +LRDockWidth=3562 +Dockable=1 +StayOnTop=0 + +[QAView] +PercentageSizes=1 +Create=1 +Visible=1 +Docked=1 +State=0 +Left=0 +Top=0 +Width=2340 +Height=1279 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=2340 +ClientHeight=1279 +TBDockHeight=4835 +LRDockWidth=3562 +Dockable=1 +StayOnTop=0 + +[BreakpointWindow] +PercentageSizes=1 +Create=1 +Visible=1 +Docked=1 +State=0 +Left=0 +Top=0 +Width=3824 +Height=1221 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=3824 +ClientHeight=1221 +TBDockHeight=1545 +LRDockWidth=8742 +Dockable=1 +StayOnTop=0 +Column0Width=200 +Column1Width=75 +Column2Width=200 +Column3Width=200 +Column4Width=200 +Column5Width=75 +Column6Width=75 + +[StructureView] +PercentageSizes=1 +Create=1 +Visible=1 +Docked=1 +State=0 +Left=0 +Top=0 +Width=1895 +Height=3542 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=1895 +ClientHeight=3542 +TBDockHeight=3678 +LRDockWidth=1895 +Dockable=1 +StayOnTop=0 + +[ModelViewTool] +PercentageSizes=1 +Create=1 +Visible=1 +Docked=1 +State=0 +Left=0 +Top=0 +Width=1996 +Height=6803 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=1996 +ClientHeight=6803 +TBDockHeight=4885 +LRDockWidth=5309 +Dockable=1 +StayOnTop=0 + +[BorlandEditorCodeExplorer@EditWindow0] +PercentageSizes=1 +Create=1 +Visible=0 +Docked=0 +State=0 +Left=0 +Top=0 +Width=1824 +Height=6171 +MaxLeft=-4 +MaxTop=-7 +ClientWidth=1762 +ClientHeight=5891 +TBDockHeight=6171 +LRDockWidth=1824 +Dockable=1 +StayOnTop=0 + +[DockHosts] +DockHostCount=5 + +[DockSite0] +HostDockSite=DockBottomCenterPanel +DockSiteType=1 +PercentageSizes=1 +Create=1 +Visible=0 +Docked=1 +State=0 +Left=8 +Top=8 +Width=2340 +Height=1480 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=2340 +ClientHeight=1480 +TBDockHeight=1480 +LRDockWidth=2340 +Dockable=1 +StayOnTop=0 +TabPosition=1 +ActiveTabID=RefactoringForm +TabDockClients=RefactoringForm,PatchForm,FindReferencsForm,ToDo List,MetricsView,QAView + +[DockSite1] +HostDockSite=DockBottomPanel +DockSiteType=1 +PercentageSizes=1 +Create=1 +Visible=0 +Docked=1 +State=0 +Left=0 +Top=28 +Width=3824 +Height=1422 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=3824 +ClientHeight=1422 +TBDockHeight=1422 +LRDockWidth=3824 +Dockable=1 +StayOnTop=0 +TabPosition=1 +ActiveTabID=DebugLogView +TabDockClients=DebugLogView,BreakpointWindow,ThreadStatusWindow,CallStackWindow,WatchWindow,LocalVarsWindow + +[DockSite2] +HostDockSite=DockRightPanel +DockSiteType=1 +PercentageSizes=1 +Create=1 +Visible=1 +Docked=1 +State=0 +Left=0 +Top=28 +Width=1996 +Height=4583 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=1996 +ClientHeight=4583 +TBDockHeight=7004 +LRDockWidth=1996 +Dockable=1 +StayOnTop=0 +TabPosition=1 +ActiveTabID=ProjectManager +TabDockClients=ProjectManager,ModelViewTool,DataExplorerContainer,frmDesignPreview + +[DockSite3] +HostDockSite=DockLeftPanel +DockSiteType=1 +PercentageSizes=1 +Create=1 +Visible=1 +Docked=1 +State=0 +Left=0 +Top=28 +Width=1895 +Height=3542 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=1895 +ClientHeight=3542 +TBDockHeight=7004 +LRDockWidth=1895 +Dockable=1 +StayOnTop=0 +TabPosition=1 +ActiveTabID=StructureView +TabDockClients=StructureView,ClassBrowserTool + +[DockSite4] +HostDockSite=DockRightPanel +DockSiteType=1 +PercentageSizes=1 +Create=1 +Visible=1 +Docked=1 +State=0 +Left=0 +Top=702 +Width=1996 +Height=2557 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=1996 +ClientHeight=2557 +TBDockHeight=7004 +LRDockWidth=1996 +Dockable=1 +StayOnTop=0 +TabPosition=1 +ActiveTabID=ToolForm +TabDockClients=ToolForm,TemplateView + diff --git a/AC_Pro.dsv b/AC_Pro.dsv new file mode 100644 index 0000000..f9d7ac4 --- /dev/null +++ b/AC_Pro.dsv @@ -0,0 +1,1730 @@ +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xNYWluRm9ybVVuaXQuY3Bw] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\MainFormUnit.cpp +CursorX=35 +CursorY=174 +TopLine=152 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\MainFormUnit.cpp + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xTYXZlRm9ybVVuaXQuY3Bw] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\SaveFormUnit.cpp +CursorX=105 +CursorY=24 +TopLine=250 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\SaveFormUnit.cpp + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xBQ19Qcm8uY3Bw] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\AC_Pro.cpp +CursorX=1 +CursorY=308 +TopLine=272 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName= + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xjb21tb25zdHJ1Y3QuaA==] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\commonstruct.h +CursorX=25 +CursorY=144 +TopLine=62 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\commonstruct.h + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xQcm9Db21tb24uaA==] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\ProCommon.h +CursorX=21 +CursorY=5 +TopLine=1 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\ProCommon.h + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xHbG9iYWxVbml0LmNwcA==] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\GlobalUnit.cpp +CursorX=89 +CursorY=803 +TopLine=767 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\GlobalUnit.cpp + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xNZXNzYWdlRGVmLmg=] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\MessageDef.h +CursorX=20 +CursorY=9 +TopLine=1 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\MessageDef.h + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xNZXNzYWdlRm9ybVVuaXQuY3Bw] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\MessageFormUnit.cpp +CursorX=136 +CursorY=66 +TopLine=37 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\MessageFormUnit.cpp + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xTZXRVcEZvcm1Vbml0LmNwcA==] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\SetUpFormUnit.cpp +CursorX=1 +CursorY=1 +TopLine=1 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName= +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xDdXN0b21lclNldHRpbmdQYW5lbFVuaXQu +Y3Bw] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\CustomerSettingPanelUnit.cpp +CursorX=33 +CursorY=45 +TopLine=28 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\CustomerSettingPanelUnit.cpp + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xTdHlsZVBhbmVsLmNwcA==] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\StylePanel.cpp +CursorX=1 +CursorY=2352 +TopLine=2319 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\StylePanel.cpp +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxTT1VSQ0VcVkNMXFZjbC5D +b250cm9scy5wYXM=] +Module=d:\program files\embarcadero\studio\23.0\SOURCE\VCL\Vcl.Controls.pas +CursorX=1 +CursorY=3731 +TopLine=3698 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=d:\program files\embarcadero\studio\23.0\SOURCE\VCL\Vcl.Controls.pas +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xDdXN0b21lclNldHRpbmdGb3JtVW5pdC5j +cHA=] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\CustomerSettingFormUnit.cpp +CursorX=1 +CursorY=1 +TopLine=1 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\CustomerSettingFormUnit.cpp + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xTcGxhc2hGb3JtVW5pdC5jcHA=] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\SplashFormUnit.cpp +CursorX=1 +CursorY=1 +TopLine=1 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=Borland.FormDesignerView +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xDdXN0b21lclNldHRpbmdQYW5lbFVuaXQu +Y3Bw] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\CustomerSettingPanelUnit.cpp +CursorX=33 +CursorY=45 +TopLine=28 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\CustomerSettingPanelUnit.cpp + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xTdHlsZVNlbFBhbmVsLmNwcA==] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\StyleSelPanel.cpp +CursorX=18 +CursorY=129 +TopLine=94 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\StyleSelPanel.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xDdXN0b21lclNldHRpbmdQYW5lbFVuaXQu +Y3Bw] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\CustomerSettingPanelUnit.cpp +CursorX=36 +CursorY=64 +TopLine=28 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\CustomerSettingPanelUnit.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xDdXN0b21lclNldHRpbmdQYW5lbFVuaXQu +Y3Bw] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\CustomerSettingPanelUnit.cpp +CursorX=36 +CursorY=64 +TopLine=28 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\CustomerSettingPanelUnit.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xDdXN0b21lclNldHRpbmdGb3JtVW5pdC5j +cHA=] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\CustomerSettingFormUnit.cpp +CursorX=1 +CursorY=1 +TopLine=1 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\CustomerSettingFormUnit.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xDdXN0b21lclNldHRpbmdGb3JtVW5pdC5j +cHA=] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\CustomerSettingFormUnit.cpp +CursorX=1 +CursorY=1 +TopLine=1 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\CustomerSettingFormUnit.cpp + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xWU1RQYXRoRm9ybVVuaXQuY3Bw] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\VSTPathFormUnit.cpp +CursorX=99 +CursorY=108 +TopLine=80 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\VSTPathFormUnit.cpp + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xWU1RpRm9ybVVuaXQuY3Bw] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\VSTiFormUnit.cpp +CursorX=1 +CursorY=1 +TopLine=1 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName= + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFjY29tcGFueUN1YmVcTWFpbkZvcm1Vbml0LmNwcA==] +Module=E:\Ac_Project\Ac_Windows\AccompanyCube\MainFormUnit.cpp +CursorX=18 +CursorY=2733 +TopLine=2701 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AccompanyCube\MainFormUnit.cpp + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xQcm9ncmVzc0Zvcm1Vbml0LmNwcA==] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\ProgressFormUnit.cpp +CursorX=133 +CursorY=329 +TopLine=444 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\ProgressFormUnit.cpp + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xNYW5hZ2VTb25nRm9ybVVuaXQuY3Bw] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\ManageSongFormUnit.cpp +CursorX=94 +CursorY=64 +TopLine=43 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\ManageSongFormUnit.cpp + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xIZWxwRm9ybVVuaXQuY3Bw] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\HelpFormUnit.cpp +CursorX=109 +CursorY=271 +TopLine=226 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\HelpFormUnit.cpp + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xIZWxwUGFuZWxVbml0LmNwcA==] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\HelpPanelUnit.cpp +CursorX=9 +CursorY=129 +TopLine=67 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\HelpPanelUnit.cpp + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xTaG93VXNlckluZm9QYW5lbC5jcHA=] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\ShowUserInfoPanel.cpp +CursorX=12 +CursorY=115 +TopLine=98 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\ShowUserInfoPanel.cpp + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFjY29tcGFueUN1YmVcSGVscFBhbmVsVW5pdC5jcHA=] +Module=E:\Ac_Project\Ac_Windows\AccompanyCube\HelpPanelUnit.cpp +CursorX=38 +CursorY=222 +TopLine=283 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AccompanyCube\HelpPanelUnit.cpp + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFjY29tcGFueUN1YmVcSGVscEZvcm1Vbml0LmNwcA==] +Module=E:\Ac_Project\Ac_Windows\AccompanyCube\HelpFormUnit.cpp +CursorX=104 +CursorY=260 +TopLine=156 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AccompanyCube\HelpFormUnit.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFjY29tcGFueUN1YmVcU29mdHdhcmVzRm9ybVVuaXQu +Y3Bw] +Module=E:\Ac_Project\Ac_Windows\AccompanyCube\SoftwaresFormUnit.cpp +CursorX=29 +CursorY=106 +TopLine=88 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AccompanyCube\SoftwaresFormUnit.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFjY29tcGFueUN1YmVcU29mdHdhcmVzRm9ybVVuaXQu +Y3Bw] +Module=E:\Ac_Project\Ac_Windows\AccompanyCube\SoftwaresFormUnit.cpp +CursorX=37 +CursorY=106 +TopLine=88 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AccompanyCube\SoftwaresFormUnit.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFjY29tcGFueUN1YmVcU29mdHdhcmVzRm9ybVVuaXQu +Y3Bw] +Module=E:\Ac_Project\Ac_Windows\AccompanyCube\SoftwaresFormUnit.cpp +CursorX=58 +CursorY=121 +TopLine=1 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AccompanyCube\SoftwaresFormUnit.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFjY29tcGFueUN1YmVcU29mdHdhcmVzRm9ybVVuaXQu +Y3Bw] +Module=E:\Ac_Project\Ac_Windows\AccompanyCube\SoftwaresFormUnit.cpp +CursorX=58 +CursorY=121 +TopLine=1 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AccompanyCube\SoftwaresFormUnit.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFjY29tcGFueUN1YmVcUHJvZ3Jlc3NGb3JtVW5pdC5j +cHA=] +Module=E:\Ac_Project\Ac_Windows\AccompanyCube\ProgressFormUnit.cpp +CursorX=48 +CursorY=550 +TopLine=502 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AccompanyCube\ProgressFormUnit.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFjY29tcGFueUN1YmVcUHJvZ3Jlc3NUaHJlYWRVbml0 +LmNwcA==] +Module=E:\Ac_Project\Ac_Windows\AccompanyCube\ProgressThreadUnit.cpp +CursorX=1 +CursorY=1 +TopLine=1 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AccompanyCube\ProgressThreadUnit.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFjY29tcGFueUN1YmVcUHJvZ3Jlc3NUaHJlYWRVbml0 +LmNwcA==] +Module=E:\Ac_Project\Ac_Windows\AccompanyCube\ProgressThreadUnit.cpp +CursorX=1 +CursorY=1 +TopLine=1 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AccompanyCube\ProgressThreadUnit.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFjY29tcGFueUN1YmVcTm90aWZpY2F0aW9uRm9ybVVu +aXQuY3Bw] +Module=E:\Ac_Project\Ac_Windows\AccompanyCube\NotificationFormUnit.cpp +CursorX=17 +CursorY=203 +TopLine=176 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AccompanyCube\NotificationFormUnit.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxtb2R1bGUtZXhwb3J0c1xKTklcQ2xpZW50U2VydmljZVxOZXRTZXJ2aWNl +LmNwcA==] +Module=E:\Ac_Project\module-exports\JNI\ClientService\NetService.cpp +CursorX=5 +CursorY=378 +TopLine=461 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName= +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFjY29tcGFueUN1YmVcUHJvZ3Jlc3NGb3JtVW5pdC5j +cHA=] +Module=E:\Ac_Project\Ac_Windows\AccompanyCube\ProgressFormUnit.cpp +CursorX=17 +CursorY=465 +TopLine=499 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AccompanyCube\ProgressFormUnit.cpp + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xMb2dpbkZvcm1Vbml0LmNwcA==] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\LoginFormUnit.cpp +CursorX=38 +CursorY=52 +TopLine=28 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\LoginFormUnit.cpp + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xVcGRhdGVGb3JtVW5pdC5jcHA=] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\UpdateFormUnit.cpp +CursorX=27 +CursorY=146 +TopLine=104 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\UpdateFormUnit.cpp + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xQYXlNZW50Rm9ybVVuaXQuY3Bw] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\PayMentFormUnit.cpp +CursorX=31 +CursorY=155 +TopLine=15 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\PayMentFormUnit.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFjY29tcGFueUN1YmVcVXBkYXRlRm9ybVVuaXQuY3Bw +] +Module=E:\Ac_Project\Ac_Windows\AccompanyCube\UpdateFormUnit.cpp +CursorX=5 +CursorY=125 +TopLine=98 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AccompanyCube\UpdateFormUnit.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFjY29tcGFueUN1YmVcVXBkYXRlRm9ybVVuaXQuY3Bw +] +Module=E:\Ac_Project\Ac_Windows\AccompanyCube\UpdateFormUnit.cpp +CursorX=1 +CursorY=124 +TopLine=98 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AccompanyCube\UpdateFormUnit.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFjY29tcGFueUN1YmVcVXBkYXRlRm9ybVVuaXQuY3Bw +] +Module=E:\Ac_Project\Ac_Windows\AccompanyCube\UpdateFormUnit.cpp +CursorX=1 +CursorY=124 +TopLine=98 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AccompanyCube\UpdateFormUnit.cpp +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxpbmNsdWRlXHdpbmRvd3Nc +cnRsXFN5c3RlbS5DbGFzc2VzLmhwcA==] +Module=d:\program files\embarcadero\studio\23.0\include\windows\rtl\System.Classes.hpp +CursorX=1 +CursorY=998 +TopLine=975 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName= +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxpbmNsdWRlXHdpbmRvd3Nc +dmNsXFZjbC5Db250cm9scy5ocHA=] +Module=d:\program files\embarcadero\studio\23.0\include\windows\vcl\Vcl.Controls.hpp +CursorX=66 +CursorY=1576 +TopLine=1556 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=d:\program files\embarcadero\studio\23.0\include\windows\vcl\Vcl.Controls.hpp +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxpbmNsdWRlXHdpbmRvd3Nc +dmNsXFZjbC5Db250cm9scy5ocHA=] +Module=d:\program files\embarcadero\studio\23.0\include\windows\vcl\Vcl.Controls.hpp +CursorX=66 +CursorY=1576 +TopLine=1556 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=d:\program files\embarcadero\studio\23.0\include\windows\vcl\Vcl.Controls.hpp + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xQTkdCdXR0b24uaHBw] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\PNGButton.hpp +CursorX=70 +CursorY=33 +TopLine=22 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\PNGButton.hpp +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxpbmNsdWRlXHdpbmRvd3Nc +dmNsXFZjbC5Db250cm9scy5ocHA=] +Module=d:\program files\embarcadero\studio\23.0\include\windows\vcl\Vcl.Controls.hpp +CursorX=47 +CursorY=2580 +TopLine=2549 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName= + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xSZWdpc3RlckZvcm1Vbml0LmNwcA==] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\RegisterFormUnit.cpp +CursorX=153 +CursorY=32 +TopLine=1 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\RegisterFormUnit.cpp +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxpbmNsdWRlXHdpbmRvd3Nc +cnRsXFN5c3RlbS5VSVR5cGVzLmhwcA==] +Module=d:\program files\embarcadero\studio\23.0\include\windows\rtl\System.UITypes.hpp +CursorX=107 +CursorY=1065 +TopLine=1038 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=d:\program files\embarcadero\studio\23.0\include\windows\rtl\System.UITypes.hpp + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xHZW5lcmFsRGlhbG9nUGFuZWwuaA==] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\GeneralDialogPanel.h +CursorX=1 +CursorY=22 +TopLine=1 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\GeneralDialogPanel.h + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xMaW5lRWRpdC5o] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\LineEdit.h +CursorX=24 +CursorY=108 +TopLine=76 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\LineEdit.h +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxTT1VSQ0VcVkNMXFZjbC5G +b3Jtcy5wYXM=] +Module=d:\program files\embarcadero\studio\23.0\SOURCE\VCL\Vcl.Forms.pas +CursorX=1 +CursorY=8023 +TopLine=7993 +LeftCol=1 +Elisions={{2051,4},{2067,15},{'TScrollWindow'}}{{2161,4},{2265,15},{'TMainMenuBarStyleHook'}} +Bookmarks= +EditViewName= + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xQcm9ncmVzc1RocmVhZFVuaXQuY3Bw] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\ProgressThreadUnit.cpp +CursorX=1 +CursorY=1 +TopLine=1 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName= + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xOb3RpZmljYXRpb25FeFVuaXQuY3Bw] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\NotificationExUnit.cpp +CursorX=31 +CursorY=285 +TopLine=256 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\NotificationExUnit.cpp + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xOb3RpZmljYXRpb25Gb3JtVW5pdC5jcHA=] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\NotificationFormUnit.cpp +CursorX=1 +CursorY=1 +TopLine=331 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\NotificationFormUnit.cpp +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxpbmNsdWRlXHdpbmRvd3Nc +c2RrXHVybG1vbi5o] +Module=d:\program files\embarcadero\studio\23.0\include\windows\sdk\urlmon.h +CursorX=26 +CursorY=5028 +TopLine=4997 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=d:\program files\embarcadero\studio\23.0\include\windows\sdk\urlmon.h +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxpbmNsdWRlXHdpbmRvd3Nc +cnRsXFN5c3RlbS5KU09OLmhwcA==] +Module=d:\program files\embarcadero\studio\23.0\include\windows\rtl\System.JSON.hpp +CursorX=1 +CursorY=326 +TopLine=309 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=d:\program files\embarcadero\studio\23.0\include\windows\rtl\System.JSON.hpp +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxpbmNsdWRlXHdpbmRvd3Nc +cnRsXFN5c3RlbS5KU09OLmhwcA==] +Module=d:\program files\embarcadero\studio\23.0\include\windows\rtl\System.JSON.hpp +CursorX=1 +CursorY=323 +TopLine=309 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=d:\program files\embarcadero\studio\23.0\include\windows\rtl\System.JSON.hpp +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxzb3VyY2VccnRsXG5ldFxT +eXN0ZW0uTmV0Lkh0dHBDbGllbnQuV2luLnBhcw==] +Module=d:\program files\embarcadero\studio\23.0\source\rtl\net\System.Net.HttpClient.Win.pas +CursorX=1 +CursorY=1569 +TopLine=1537 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=d:\program files\embarcadero\studio\23.0\source\rtl\net\System.Net.HttpClient.Win.pas +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxpbmNsdWRlXHdpbmRvd3Nc +cnRsXFN5c3RlbS5KU09OLmhwcA==] +Module=d:\program files\embarcadero\studio\23.0\include\windows\rtl\System.JSON.hpp +CursorX=1 +CursorY=323 +TopLine=309 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=d:\program files\embarcadero\studio\23.0\include\windows\rtl\System.JSON.hpp +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxpbmNsdWRlXHdpbmRvd3Nc +cnRsXFN5c3RlbS5KU09OLmhwcA==] +Module=d:\program files\embarcadero\studio\23.0\include\windows\rtl\System.JSON.hpp +CursorX=55 +CursorY=212 +TopLine=180 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=d:\program files\embarcadero\studio\23.0\include\windows\rtl\System.JSON.hpp + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xNaWNTZXRGb3JtVW5pdC5jcHA=] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\MicSetFormUnit.cpp +CursorX=6 +CursorY=501 +TopLine=452 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\MicSetFormUnit.cpp + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xDb250ZW50UGFuZWxVbml0LmNwcA==] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\ContentPanelUnit.cpp +CursorX=30 +CursorY=669 +TopLine=630 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\ContentPanelUnit.cpp +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxpbmNsdWRlXHdpbmRvd3Nc +dmNsXFZjbC5FeHRDdHJscy5ocHA=] +Module=d:\program files\embarcadero\studio\23.0\include\windows\vcl\Vcl.ExtCtrls.hpp +CursorX=45 +CursorY=358 +TopLine=327 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=d:\program files\embarcadero\studio\23.0\include\windows\vcl\Vcl.ExtCtrls.hpp +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxpbmNsdWRlXHdpbmRvd3Nc +dmNsXFZjbC5FeHRDdHJscy5ocHA=] +Module=d:\program files\embarcadero\studio\23.0\include\windows\vcl\Vcl.ExtCtrls.hpp +CursorX=70 +CursorY=358 +TopLine=327 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=d:\program files\embarcadero\studio\23.0\include\windows\vcl\Vcl.ExtCtrls.hpp +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxpbmNsdWRlXHdpbmRvd3Nc +dmNsXFZjbC5FeHRDdHJscy5ocHA=] +Module=d:\program files\embarcadero\studio\23.0\include\windows\vcl\Vcl.ExtCtrls.hpp +CursorX=29 +CursorY=335 +TopLine=327 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=d:\program files\embarcadero\studio\23.0\include\windows\vcl\Vcl.ExtCtrls.hpp +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxpbmNsdWRlXHdpbmRvd3Nc +cnRsXFN5c3RlbS5DbGFzc2VzLmhwcA==] +Module=d:\program files\embarcadero\studio\23.0\include\windows\rtl\System.Classes.hpp +CursorX=50 +CursorY=203 +TopLine=172 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=d:\program files\embarcadero\studio\23.0\include\windows\rtl\System.Classes.hpp +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxpbmNsdWRlXHdpbmRvd3Nc +dmNsXFZjbC5FeHRDdHJscy5ocHA=] +Module=d:\program files\embarcadero\studio\23.0\include\windows\vcl\Vcl.ExtCtrls.hpp +CursorX=29 +CursorY=335 +TopLine=327 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=d:\program files\embarcadero\studio\23.0\include\windows\vcl\Vcl.ExtCtrls.hpp +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxpbmNsdWRlXHdpbmRvd3Nc +dmNsXFZjbC5FeHRDdHJscy5ocHA=] +Module=d:\program files\embarcadero\studio\23.0\include\windows\vcl\Vcl.ExtCtrls.hpp +CursorX=29 +CursorY=335 +TopLine=327 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=d:\program files\embarcadero\studio\23.0\include\windows\vcl\Vcl.ExtCtrls.hpp +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxpbmNsdWRlXHdpbmRvd3Nc +cnRsXFN5c3RlbS5DbGFzc2VzLmhwcA==] +Module=d:\program files\embarcadero\studio\23.0\include\windows\rtl\System.Classes.hpp +CursorX=50 +CursorY=203 +TopLine=172 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=d:\program files\embarcadero\studio\23.0\include\windows\rtl\System.Classes.hpp +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxpbmNsdWRlXHdpbmRvd3Nc +cnRsXFN5c3RlbS5DbGFzc2VzLmhwcA==] +Module=d:\program files\embarcadero\studio\23.0\include\windows\rtl\System.Classes.hpp +CursorX=50 +CursorY=203 +TopLine=172 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=d:\program files\embarcadero\studio\23.0\include\windows\rtl\System.Classes.hpp +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxpbmNsdWRlXHdpbmRvd3Nc +dmNsXFZjbC5FeHRDdHJscy5ocHA=] +Module=d:\program files\embarcadero\studio\23.0\include\windows\vcl\Vcl.ExtCtrls.hpp +CursorX=29 +CursorY=335 +TopLine=327 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=d:\program files\embarcadero\studio\23.0\include\windows\vcl\Vcl.ExtCtrls.hpp +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxpbmNsdWRlXHdpbmRvd3Nc +cnRsXFN5c3RlbS5DbGFzc2VzLmhwcA==] +Module=d:\program files\embarcadero\studio\23.0\include\windows\rtl\System.Classes.hpp +CursorX=50 +CursorY=203 +TopLine=172 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=d:\program files\embarcadero\studio\23.0\include\windows\rtl\System.Classes.hpp + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFjY29tcGFueUN1YmVcTWVudUhvb2tVbml0LmNwcA==] +Module=E:\Ac_Project\Ac_Windows\AccompanyCube\MenuHookUnit.cpp +CursorX=1 +CursorY=79 +TopLine=1 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName= + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xNZW51VW5pdC5jcHA=] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\MenuUnit.cpp +CursorX=37 +CursorY=194 +TopLine=163 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\MenuUnit.cpp +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxpbmNsdWRlXHdpbmRvd3Nc +cnRsXFN5c3RlbS5DbGFzc2VzLmhwcA==] +Module=d:\program files\embarcadero\studio\23.0\include\windows\rtl\System.Classes.hpp +CursorX=50 +CursorY=4674 +TopLine=4644 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=d:\program files\embarcadero\studio\23.0\include\windows\rtl\System.Classes.hpp +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxpbmNsdWRlXHdpbmRvd3Nc +dmNsXFZjbC5FeHRDdHJscy5ocHA=] +Module=d:\program files\embarcadero\studio\23.0\include\windows\vcl\Vcl.ExtCtrls.hpp +CursorX=1 +CursorY=358 +TopLine=327 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=d:\program files\embarcadero\studio\23.0\include\windows\vcl\Vcl.ExtCtrls.hpp +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxpbmNsdWRlXHdpbmRvd3Nc +cnRsXFN5c3RlbS5DbGFzc2VzLmhwcA==] +Module=d:\program files\embarcadero\studio\23.0\include\windows\rtl\System.Classes.hpp +CursorX=50 +CursorY=4674 +TopLine=4644 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=d:\program files\embarcadero\studio\23.0\include\windows\rtl\System.Classes.hpp +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxpbmNsdWRlXHdpbmRvd3Nc +cnRsXFN5c3RlbS5DbGFzc2VzLmhwcA==] +Module=d:\program files\embarcadero\studio\23.0\include\windows\rtl\System.Classes.hpp +CursorX=35 +CursorY=203 +TopLine=172 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=d:\program files\embarcadero\studio\23.0\include\windows\rtl\System.Classes.hpp +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxpbmNsdWRlXHdpbmRvd3Nc +dmNsXFZjbC5FeHRDdHJscy5ocHA=] +Module=d:\program files\embarcadero\studio\23.0\include\windows\vcl\Vcl.ExtCtrls.hpp +CursorX=40 +CursorY=358 +TopLine=324 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=d:\program files\embarcadero\studio\23.0\include\windows\vcl\Vcl.ExtCtrls.hpp +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxpbmNsdWRlXHdpbmRvd3Nc +c2RrXG1taXNjYXBpMi5o] +Module=d:\program files\embarcadero\studio\23.0\include\windows\sdk\mmiscapi2.h +CursorX=1 +CursorY=30 +TopLine=1 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName= +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxpbmNsdWRlXHdpbmRvd3Nc +cnRsXFN5c3RlbS5TeXNVdGlscy5ocHA=] +Module=d:\program files\embarcadero\studio\23.0\include\windows\rtl\System.SysUtils.hpp +CursorX=1 +CursorY=431 +TopLine=400 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName= +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxpbmNsdWRlXHdpbmRvd3Nc +c2RrXHdpbm50Lmg=] +Module=d:\program files\embarcadero\studio\23.0\include\windows\sdk\winnt.h +CursorX=39 +CursorY=2489 +TopLine=2458 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName= + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFjY29tcGFueUN1YmVcTG9naW5Gb3JtVW5pdC5jcHA=] +Module=E:\Ac_Project\Ac_Windows\AccompanyCube\LoginFormUnit.cpp +CursorX=44 +CursorY=488 +TopLine=456 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AccompanyCube\LoginFormUnit.cpp + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xBYm91dEZvcm1Vbml0LmNwcA==] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\AboutFormUnit.cpp +CursorX=1 +CursorY=1 +TopLine=10 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\AboutFormUnit.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xDdXN0b21lclNldHRpbmdGb3JtVW5pdC5j +cHA=] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\CustomerSettingFormUnit.cpp +CursorX=1 +CursorY=1 +TopLine=1 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\CustomerSettingFormUnit.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xDdXN0b21lclNldHRpbmdQYW5lbFVuaXQu +Y3Bw] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\CustomerSettingPanelUnit.cpp +CursorX=1 +CursorY=93 +TopLine=48 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\CustomerSettingPanelUnit.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xDdXN0b21lclNldHRpbmdQYW5lbFVuaXQu +Y3Bw] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\CustomerSettingPanelUnit.cpp +CursorX=1 +CursorY=94 +TopLine=48 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\CustomerSettingPanelUnit.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xDdXN0b21lclNldHRpbmdQYW5lbFVuaXQu +Y3Bw] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\CustomerSettingPanelUnit.cpp +CursorX=26 +CursorY=93 +TopLine=48 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\CustomerSettingPanelUnit.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xDdXN0b21lclNldHRpbmdQYW5lbFVuaXQu +Y3Bw] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\CustomerSettingPanelUnit.cpp +CursorX=119 +CursorY=90 +TopLine=48 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\CustomerSettingPanelUnit.cpp + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xVbml0MS5jcHA=] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\Unit1.cpp +CursorX=1 +CursorY=1 +TopLine=1 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=Borland.FormDesignerView + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xWZXJpZnlDb2RlRm9ybVVuaXQuY3Bw] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\VerifyCodeFormUnit.cpp +CursorX=96 +CursorY=48 +TopLine=11 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\VerifyCodeFormUnit.cpp +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxpbmNsdWRlXHdpbmRvd3Nc +dmNsXFZjbC5JbWFnaW5nLnBuZ2ltYWdlLmhwcA==] +Module=d:\program files\embarcadero\studio\23.0\include\windows\vcl\Vcl.Imaging.pngimage.hpp +CursorX=37 +CursorY=868 +TopLine=907 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=d:\program files\embarcadero\studio\23.0\include\windows\vcl\Vcl.Imaging.pngimage.hpp +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxzb3VyY2VccnRsXGNvbW1v +blxTeXN0ZW0uTmV0RW5jb2RpbmcucGFz] +Module=d:\program files\embarcadero\studio\23.0\source\rtl\common\System.NetEncoding.pas +CursorX=1 +CursorY=300 +TopLine=270 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=d:\program files\embarcadero\studio\23.0\source\rtl\common\System.NetEncoding.pas +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxTT1VSQ0VcUlRMXFNZU1xT +eXN0ZW0uU3lzVXRpbHMucGFz] +Module=d:\program files\embarcadero\studio\23.0\SOURCE\RTL\SYS\System.SysUtils.pas +CursorX=1 +CursorY=35052 +TopLine=35022 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=d:\program files\embarcadero\studio\23.0\SOURCE\RTL\SYS\System.SysUtils.pas +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxpbmNsdWRlXHdpbmRvd3Nc +cnRsXFN5c3RlbS5OZXRFbmNvZGluZy5ocHA=] +Module=d:\program files\embarcadero\studio\23.0\include\windows\rtl\System.NetEncoding.hpp +CursorX=60 +CursorY=77 +TopLine=39 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=d:\program files\embarcadero\studio\23.0\include\windows\rtl\System.NetEncoding.hpp +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxTT1VSQ0VcUlRMXFNZU1xT +eXN0ZW0uU3lzVXRpbHMucGFz] +Module=d:\program files\embarcadero\studio\23.0\SOURCE\RTL\SYS\System.SysUtils.pas +CursorX=1 +CursorY=35052 +TopLine=35022 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=d:\program files\embarcadero\studio\23.0\SOURCE\RTL\SYS\System.SysUtils.pas +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxTT1VSQ0VcUlRMXFNZU1xT +eXN0ZW0uU3lzVXRpbHMucGFz] +Module=d:\program files\embarcadero\studio\23.0\SOURCE\RTL\SYS\System.SysUtils.pas +CursorX=41 +CursorY=35037 +TopLine=35022 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=d:\program files\embarcadero\studio\23.0\SOURCE\RTL\SYS\System.SysUtils.pas +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxTT1VSQ0VcVkNMXFZjbC5J +bWFnaW5nLnBuZ2ltYWdlLnBhcw==] +Module=d:\program files\embarcadero\studio\23.0\SOURCE\VCL\Vcl.Imaging.pngimage.pas +CursorX=17 +CursorY=4910 +TopLine=4886 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=d:\program files\embarcadero\studio\23.0\SOURCE\VCL\Vcl.Imaging.pngimage.pas +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxpbmNsdWRlXHdpbmRvd3Nc +cnRsXFN5c3RlbS5OZXRFbmNvZGluZy5ocHA=] +Module=d:\program files\embarcadero\studio\23.0\include\windows\rtl\System.NetEncoding.hpp +CursorX=27 +CursorY=77 +TopLine=39 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=d:\program files\embarcadero\studio\23.0\include\windows\rtl\System.NetEncoding.hpp +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxTT1VSQ0VcVkNMXFZjbC5J +bWFnaW5nLnBuZ2ltYWdlLnBhcw==] +Module=d:\program files\embarcadero\studio\23.0\SOURCE\VCL\Vcl.Imaging.pngimage.pas +CursorX=17 +CursorY=4910 +TopLine=4886 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=d:\program files\embarcadero\studio\23.0\SOURCE\VCL\Vcl.Imaging.pngimage.pas +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxTT1VSQ0VcVkNMXFZjbC5J +bWFnaW5nLnBuZ2ltYWdlLnBhcw==] +Module=d:\program files\embarcadero\studio\23.0\SOURCE\VCL\Vcl.Imaging.pngimage.pas +CursorX=17 +CursorY=4910 +TopLine=4886 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=d:\program files\embarcadero\studio\23.0\SOURCE\VCL\Vcl.Imaging.pngimage.pas +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxpbmNsdWRlXHdpbmRvd3Nc +cnRsXFN5c3RlbS5OZXRFbmNvZGluZy5ocHA=] +Module=d:\program files\embarcadero\studio\23.0\include\windows\rtl\System.NetEncoding.hpp +CursorX=27 +CursorY=77 +TopLine=39 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=d:\program files\embarcadero\studio\23.0\include\windows\rtl\System.NetEncoding.hpp +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxpbmNsdWRlXHdpbmRvd3Nc +cnRsXFN5c3RlbS5OZXRFbmNvZGluZy5ocHA=] +Module=d:\program files\embarcadero\studio\23.0\include\windows\rtl\System.NetEncoding.hpp +CursorX=27 +CursorY=77 +TopLine=39 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=d:\program files\embarcadero\studio\23.0\include\windows\rtl\System.NetEncoding.hpp +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxpbmNsdWRlXHdpbmRvd3Nc +cnRsXFN5c3RlbS5DbGFzc2VzLmhwcA==] +Module=d:\program files\embarcadero\studio\23.0\include\windows\rtl\System.Classes.hpp +CursorX=1 +CursorY=2009 +TopLine=1977 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=d:\program files\embarcadero\studio\23.0\include\windows\rtl\System.Classes.hpp +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxpbmNsdWRlXHdpbmRvd3Nc +dmNsXFZjbC5JbWFnaW5nLnBuZ2ltYWdlLmhwcA==] +Module=d:\program files\embarcadero\studio\23.0\include\windows\vcl\Vcl.Imaging.pngimage.hpp +CursorX=1 +CursorY=788 +TopLine=756 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName= +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxpbmNsdWRlXHdpbmRvd3Nc +cnRsXFN5c3RlbS5OZXRFbmNvZGluZy5ocHA=] +Module=d:\program files\embarcadero\studio\23.0\include\windows\rtl\System.NetEncoding.hpp +CursorX=29 +CursorY=77 +TopLine=39 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=d:\program files\embarcadero\studio\23.0\include\windows\rtl\System.NetEncoding.hpp +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxpbmNsdWRlXHdpbmRvd3Nc +cnRsXFN5c3RlbS5OZXRFbmNvZGluZy5ocHA=] +Module=d:\program files\embarcadero\studio\23.0\include\windows\rtl\System.NetEncoding.hpp +CursorX=60 +CursorY=77 +TopLine=39 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=d:\program files\embarcadero\studio\23.0\include\windows\rtl\System.NetEncoding.hpp +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFjY29tcGFueUN1YmVcVmVyaWZ5Q29kZUZvcm1Vbml0 +LmNwcA==] +Module=E:\Ac_Project\Ac_Windows\AccompanyCube\VerifyCodeFormUnit.cpp +CursorX=28 +CursorY=137 +TopLine=78 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AccompanyCube\VerifyCodeFormUnit.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFjY29tcGFueUN1YmVcUmVjb3JkRm9ybVVuaXQuY3Bw +] +Module=E:\Ac_Project\Ac_Windows\AccompanyCube\RecordFormUnit.cpp +CursorX=17 +CursorY=1208 +TopLine=996 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AccompanyCube\RecordFormUnit.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFjY29tcGFueUN1YmVcQ29tcGxldGVGb3JtVW5pdC5j +cHA=] +Module=E:\Ac_Project\Ac_Windows\AccompanyCube\CompleteFormUnit.cpp +CursorX=9 +CursorY=698 +TopLine=666 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AccompanyCube\CompleteFormUnit.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFjY29tcGFueUN1YmVcVmVyaWZ5Q29kZUZvcm1Vbml0 +LmNwcA==] +Module=E:\Ac_Project\Ac_Windows\AccompanyCube\VerifyCodeFormUnit.cpp +CursorX=76 +CursorY=116 +TopLine=78 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AccompanyCube\VerifyCodeFormUnit.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxtb2R1bGUtZXhwb3J0c1xKTklcQ2xpZW50U2VydmljZVxOZXRTZXJ2aWNl +LmNwcA==] +Module=E:\Ac_Project\module-exports\JNI\ClientService\NetService.cpp +CursorX=45 +CursorY=676 +TopLine=648 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\module-exports\JNI\ClientService\NetService.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxtb2R1bGUtZXhwb3J0c1xKTklcQ2xpZW50U2VydmljZVxOZXRTZXJ2aWNl +LmNwcA==] +Module=E:\Ac_Project\module-exports\JNI\ClientService\NetService.cpp +CursorX=25 +CursorY=559 +TopLine=542 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\module-exports\JNI\ClientService\NetService.cpp + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xQcm9qZWN0LmNwcA==] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\Project.cpp +CursorX=1 +CursorY=605 +TopLine=575 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\Project.cpp + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFjY29tcGFueUN1YmVcR2xvYmFsVW5pdC5jcHA=] +Module=E:\Ac_Project\Ac_Windows\AccompanyCube\GlobalUnit.cpp +CursorX=6 +CursorY=1199 +TopLine=1206 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AccompanyCube\GlobalUnit.cpp + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xDb21wb3NlLmNwcA==] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\Compose.cpp +CursorX=1 +CursorY=235 +TopLine=221 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\Compose.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxtb2R1bGUtZXhwb3J0c1xKTklcQ2xpZW50U2VydmljZVxOZXRTZXJ2aWNl +LmNwcA==] +Module=E:\Ac_Project\module-exports\JNI\ClientService\NetService.cpp +CursorX=61 +CursorY=1431 +TopLine=1416 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\module-exports\JNI\ClientService\NetService.cpp + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXFN0eWxlVG9vbHNcUHJvZ3Jlc3NGb3JtVW5pdC5jcHA=] +Module=E:\Ac_Project\Ac_Windows\StyleTools\ProgressFormUnit.cpp +CursorX=25 +CursorY=156 +TopLine=108 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\StyleTools\ProgressFormUnit.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxtb2R1bGUtZXhwb3J0c1xKTklcQ2xpZW50U2VydmljZVxDbGllbnRTZXJ2 +aWNlLmNwcA==] +Module=E:\Ac_Project\module-exports\JNI\ClientService\ClientService.cpp +CursorX=30 +CursorY=385 +TopLine=26 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\module-exports\JNI\ClientService\ClientService.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxtb2R1bGUtZXhwb3J0c1xKTklcQ2xpZW50U2VydmljZVxOZXRTZXJ2aWNl +Lmg=] +Module=E:\Ac_Project\module-exports\JNI\ClientService\NetService.h +CursorX=80 +CursorY=34 +TopLine=1 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\module-exports\JNI\ClientService\NetService.h +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFjY29tcGFueUN1YmVcU3R5bGVTZWxGb3JtVW5pdC5j +cHA=] +Module=E:\Ac_Project\Ac_Windows\AccompanyCube\StyleSelFormUnit.cpp +CursorX=1 +CursorY=1128 +TopLine=286 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AccompanyCube\StyleSelFormUnit.cpp + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xTdHlsZVNwZWNzRm9ybVVuaXQuY3Bw] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\StyleSpecsFormUnit.cpp +CursorX=1 +CursorY=1 +TopLine=1 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName= +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFjY29tcGFueUN1YmVcU3R5bGVTZWxMaXN0Qm94VW5p +dC5jcHA=] +Module=E:\Ac_Project\Ac_Windows\AccompanyCube\StyleSelListBoxUnit.cpp +CursorX=1 +CursorY=1 +TopLine=307 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AccompanyCube\StyleSelListBoxUnit.cpp + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xJbnN0cnVtZW50cy5jcHA=] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\Instruments.cpp +CursorX=8 +CursorY=201 +TopLine=169 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\Instruments.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFjY29tcGFueUN1YmVcU3R5bGVTZWxMaXN0Qm94VW5p +dC5jcHA=] +Module=E:\Ac_Project\Ac_Windows\AccompanyCube\StyleSelListBoxUnit.cpp +CursorX=1 +CursorY=1 +TopLine=307 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AccompanyCube\StyleSelListBoxUnit.cpp + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xVc2VTdHlsZVBhbmVsLmNwcA==] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\UseStylePanel.cpp +CursorX=1 +CursorY=2493 +TopLine=2442 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\UseStylePanel.cpp + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFjY29tcGFueUN1YmVcQWNjb21wYW55Q3ViZS5jcHA=] +Module=E:\Ac_Project\Ac_Windows\AccompanyCube\AccompanyCube.cpp +CursorX=103 +CursorY=118 +TopLine=64 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AccompanyCube\AccompanyCube.cpp + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFjY29tcGFueUN1YmVcQWJvdXRGb3JtVW5pdC5jcHA=] +Module=E:\Ac_Project\Ac_Windows\AccompanyCube\AboutFormUnit.cpp +CursorX=69 +CursorY=54 +TopLine=1 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AccompanyCube\AboutFormUnit.cpp + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xMaXN0UGFuZWwuY3Bw] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\ListPanel.cpp +CursorX=1 +CursorY=1 +TopLine=22 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName= +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxpbmNsdWRlXHdpbmRvd3Nc +Y3J0bFxzdGRpby5o] +Module=d:\program files\embarcadero\studio\23.0\include\windows\crtl\stdio.h +CursorX=1 +CursorY=274 +TopLine=242 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName= + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xTY29yZUZvcm1Vbml0LmNwcA==] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\ScoreFormUnit.cpp +CursorX=6 +CursorY=69 +TopLine=49 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\ScoreFormUnit.cpp + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xQYXlNZW50UGFuZWxVbml0LmNwcA==] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\PayMentPanelUnit.cpp +CursorX=13 +CursorY=142 +TopLine=117 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName= +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMzcuMFxTT1VSQ0VcVkNMXFZjbC5F +eHRDdHJscy5wYXM=] +Module=d:\program files\embarcadero\studio\37.0\SOURCE\VCL\Vcl.ExtCtrls.pas +CursorX=1 +CursorY=3240 +TopLine=3210 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=d:\program files\embarcadero\studio\37.0\SOURCE\VCL\Vcl.ExtCtrls.pas +[ClosedView_RTpcQWNfUHJvamVjdFxtb2R1bGUtZXhwb3J0c1xKTklcQ2xpZW50U2VydmljZVxOZXRTZXJ2aWNl +LmNwcA==] +Module=E:\Ac_Project\module-exports\JNI\ClientService\NetService.cpp +CursorX=128 +CursorY=1389 +TopLine=1372 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\module-exports\JNI\ClientService\NetService.cpp + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXFN0eWxlVG9vbHNcR2xvYmFsVW5pdC5jcHA=] +Module=E:\Ac_Project\Ac_Windows\StyleTools\GlobalUnit.cpp +CursorX=1 +CursorY=135 +TopLine=100 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\StyleTools\GlobalUnit.cpp + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXFN0eWxlVG9vbHNcTWFpbkZvcm1Vbml0LmNwcA==] +Module=E:\Ac_Project\Ac_Windows\StyleTools\MainFormUnit.cpp +CursorX=44 +CursorY=277 +TopLine=244 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\StyleTools\MainFormUnit.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxtb2R1bGUtZXhwb3J0c1xKTklcQ2xpZW50U2VydmljZVxOZXRTZXJ2aWNl +LmNwcA==] +Module=E:\Ac_Project\module-exports\JNI\ClientService\NetService.cpp +CursorX=58 +CursorY=936 +TopLine=898 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\module-exports\JNI\ClientService\NetService.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxtb2R1bGUtZXhwb3J0c1xKTklcQ2xpZW50U2VydmljZVxOZXRTZXJ2aWNl +LmNwcA==] +Module=E:\Ac_Project\module-exports\JNI\ClientService\NetService.cpp +CursorX=5 +CursorY=963 +TopLine=1237 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\module-exports\JNI\ClientService\NetService.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFjY29tcGFueUN1YmVcU3R5bGVTZWxGb3JtVW5pdC5j +cHA=] +Module=E:\Ac_Project\Ac_Windows\AccompanyCube\StyleSelFormUnit.cpp +CursorX=52 +CursorY=929 +TopLine=877 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AccompanyCube\StyleSelFormUnit.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxtb2R1bGUtZXhwb3J0c1xKTklcQ2xpZW50U2VydmljZVxOZXRTZXJ2aWNl +LmNwcA==] +Module=E:\Ac_Project\module-exports\JNI\ClientService\NetService.cpp +CursorX=5 +CursorY=963 +TopLine=1237 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\module-exports\JNI\ClientService\NetService.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxtb2R1bGUtZXhwb3J0c1xKTklcQ2xpZW50U2VydmljZVxOZXRTZXJ2aWNl +LmNwcA==] +Module=E:\Ac_Project\module-exports\JNI\ClientService\NetService.cpp +CursorX=5 +CursorY=963 +TopLine=1237 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\module-exports\JNI\ClientService\NetService.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxtb2R1bGUtZXhwb3J0c1xKTklcQ2xpZW50U2VydmljZVxDbGllbnRTZXJ2 +aWNlX2puaS5jcHA=] +Module=E:\Ac_Project\module-exports\JNI\ClientService\ClientService_jni.cpp +CursorX=50 +CursorY=661 +TopLine=614 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\module-exports\JNI\ClientService\ClientService_jni.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxtb2R1bGUtZXhwb3J0c1xKTklcQ2xpZW50U2VydmljZVxOZXRTZXJ2aWNl +LmNwcA==] +Module=E:\Ac_Project\module-exports\JNI\ClientService\NetService.cpp +CursorX=55 +CursorY=1285 +TopLine=1238 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\module-exports\JNI\ClientService\NetService.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxtb2R1bGUtZXhwb3J0c1xKTklcQ2xpZW50U2VydmljZVxDbGllbnRTZXJ2 +aWNlX2puaS5jcHA=] +Module=E:\Ac_Project\module-exports\JNI\ClientService\ClientService_jni.cpp +CursorX=71 +CursorY=307 +TopLine=252 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\module-exports\JNI\ClientService\ClientService_jni.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxtb2R1bGUtZXhwb3J0c1xKTklcQ2xpZW50U2VydmljZVxOZXRTZXJ2aWNl +LmNwcA==] +Module=E:\Ac_Project\module-exports\JNI\ClientService\NetService.cpp +CursorX=55 +CursorY=1285 +TopLine=1238 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\module-exports\JNI\ClientService\NetService.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxtb2R1bGUtZXhwb3J0c1xKTklcQ2xpZW50U2VydmljZVxDbGllbnRTZXJ2 +aWNlX2puaS5jcHA=] +Module=E:\Ac_Project\module-exports\JNI\ClientService\ClientService_jni.cpp +CursorX=89 +CursorY=298 +TopLine=189 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\module-exports\JNI\ClientService\ClientService_jni.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxtb2R1bGUtZXhwb3J0c1xKTklcQ2xpZW50U2VydmljZVxOZXRTZXJ2aWNl +LmNwcA==] +Module=E:\Ac_Project\module-exports\JNI\ClientService\NetService.cpp +CursorX=55 +CursorY=1285 +TopLine=1238 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\module-exports\JNI\ClientService\NetService.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxtb2R1bGUtZXhwb3J0c1xKTklcQ2xpZW50U2VydmljZVxDbGllbnRTZXJ2 +aWNlX2puaS5jcHA=] +Module=E:\Ac_Project\module-exports\JNI\ClientService\ClientService_jni.cpp +CursorX=25 +CursorY=200 +TopLine=189 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\module-exports\JNI\ClientService\ClientService_jni.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxtb2R1bGUtZXhwb3J0c1xKTklcQ2xpZW50U2VydmljZVxDbGllbnRTZXJ2 +aWNlX2puaS5jcHA=] +Module=E:\Ac_Project\module-exports\JNI\ClientService\ClientService_jni.cpp +CursorX=25 +CursorY=200 +TopLine=189 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\module-exports\JNI\ClientService\ClientService_jni.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxtb2R1bGUtZXhwb3J0c1xKTklcQ2xpZW50U2VydmljZVxDbGllbnRTZXJ2 +aWNlX2puaS5jcHA=] +Module=E:\Ac_Project\module-exports\JNI\ClientService\ClientService_jni.cpp +CursorX=25 +CursorY=200 +TopLine=189 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\module-exports\JNI\ClientService\ClientService_jni.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxtb2R1bGUtZXhwb3J0c1xKTklcQ2xpZW50U2VydmljZVxDbGllbnRTZXJ2 +aWNlX2puaS5jcHA=] +Module=E:\Ac_Project\module-exports\JNI\ClientService\ClientService_jni.cpp +CursorX=25 +CursorY=200 +TopLine=189 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\module-exports\JNI\ClientService\ClientService_jni.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxtb2R1bGUtZXhwb3J0c1xKTklcQ2xpZW50U2VydmljZVxDbGllbnRTZXJ2 +aWNlX2puaS5jcHA=] +Module=E:\Ac_Project\module-exports\JNI\ClientService\ClientService_jni.cpp +CursorX=25 +CursorY=200 +TopLine=192 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\module-exports\JNI\ClientService\ClientService_jni.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxtb2R1bGUtZXhwb3J0c1xKTklcQ2xpZW50U2VydmljZVxOZXRTZXJ2aWNl +LmNwcA==] +Module=E:\Ac_Project\module-exports\JNI\ClientService\NetService.cpp +CursorX=55 +CursorY=1285 +TopLine=1238 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\module-exports\JNI\ClientService\NetService.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxtb2R1bGUtZXhwb3J0c1xKTklcQ2xpZW50U2VydmljZVxDbGllbnRTZXJ2 +aWNlX2puaS5jcHA=] +Module=E:\Ac_Project\module-exports\JNI\ClientService\ClientService_jni.cpp +CursorX=38 +CursorY=307 +TopLine=260 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\module-exports\JNI\ClientService\ClientService_jni.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxtb2R1bGUtZXhwb3J0c1xKTklcQ2xpZW50U2VydmljZVxDbGllbnRTZXJ2 +aWNlX2puaS5jcHA=] +Module=E:\Ac_Project\module-exports\JNI\ClientService\ClientService_jni.cpp +CursorX=38 +CursorY=307 +TopLine=260 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\module-exports\JNI\ClientService\ClientService_jni.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxtb2R1bGUtZXhwb3J0c1xKTklcQ2xpZW50U2VydmljZVxOZXRTZXJ2aWNl +LmNwcA==] +Module=E:\Ac_Project\module-exports\JNI\ClientService\NetService.cpp +CursorX=15 +CursorY=22 +TopLine=1 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\module-exports\JNI\ClientService\NetService.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFjY29tcGFueUN1YmVcUmVjb3JkRm9ybVVuaXQuY3Bw +] +Module=E:\Ac_Project\Ac_Windows\AccompanyCube\RecordFormUnit.cpp +CursorX=118 +CursorY=733 +TopLine=699 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AccompanyCube\RecordFormUnit.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFjY29tcGFueUN1YmVcUmVjb3JkRm9ybVVuaXQuY3Bw +] +Module=E:\Ac_Project\Ac_Windows\AccompanyCube\RecordFormUnit.cpp +CursorX=118 +CursorY=733 +TopLine=699 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AccompanyCube\RecordFormUnit.cpp + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFjY29tcGFueUN1YmVcQmFzZUZvcm1Vbml0LmNwcA==] +Module=E:\Ac_Project\Ac_Windows\AccompanyCube\BaseFormUnit.cpp +CursorX=46 +CursorY=56 +TopLine=32 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AccompanyCube\BaseFormUnit.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxtb2R1bGUtZXhwb3J0c1xKTklcQ2xpZW50U2VydmljZVxOZXRTZXJ2aWNl +LmNwcA==] +Module=E:\Ac_Project\module-exports\JNI\ClientService\NetService.cpp +CursorX=15 +CursorY=22 +TopLine=1 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\module-exports\JNI\ClientService\NetService.cpp + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXFN0eWxlVG9vbHNcU3R5bGVUb29scy5jcHA=] +Module=E:\Ac_Project\Ac_Windows\StyleTools\StyleTools.cpp +CursorX=22 +CursorY=30 +TopLine=22 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\StyleTools\StyleTools.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxtb2R1bGUtZXhwb3J0c1xKTklcQ2xpZW50U2VydmljZVxDbGllbnRTZXJ2 +aWNlX2puaS5jcHA=] +Module=E:\Ac_Project\module-exports\JNI\ClientService\ClientService_jni.cpp +CursorX=125 +CursorY=365 +TopLine=323 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\module-exports\JNI\ClientService\ClientService_jni.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxtb2R1bGUtZXhwb3J0c1xKTklcQ2xpZW50U2VydmljZVxDbGllbnRTZXJ2 +aWNlX2puaS5jcHA=] +Module=E:\Ac_Project\module-exports\JNI\ClientService\ClientService_jni.cpp +CursorX=84 +CursorY=325 +TopLine=323 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\module-exports\JNI\ClientService\ClientService_jni.cpp + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFjY29tcGFueUN1YmVcU2V0dXBGb3JtVW5pdC5jcHA=] +Module=E:\Ac_Project\Ac_Windows\AccompanyCube\SetupFormUnit.cpp +CursorX=1 +CursorY=69 +TopLine=43 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AccompanyCube\SetupFormUnit.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFjY29tcGFueUN1YmVcQ29tcG9zZUZvcm1Vbml0LmNw +cA==] +Module=E:\Ac_Project\Ac_Windows\AccompanyCube\ComposeFormUnit.cpp +CursorX=21 +CursorY=1283 +TopLine=1251 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AccompanyCube\ComposeFormUnit.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxtb2R1bGUtZXhwb3J0c1xKTklcQ2xpZW50U2VydmljZVxOZXRTZXJ2aWNl +LmNwcA==] +Module=E:\Ac_Project\module-exports\JNI\ClientService\NetService.cpp +CursorX=15 +CursorY=22 +TopLine=1 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\module-exports\JNI\ClientService\NetService.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFjY29tcGFueUN1YmVcQ29tcGxldGVGb3JtVW5pdC5j +cHA=] +Module=E:\Ac_Project\Ac_Windows\AccompanyCube\CompleteFormUnit.cpp +CursorX=1 +CursorY=1 +TopLine=1 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=Borland.FormDesignerView +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFjY29tcGFueUN1YmVcQ29tcGxldGVGb3JtVW5pdC5j +cHA=] +Module=E:\Ac_Project\Ac_Windows\AccompanyCube\CompleteFormUnit.cpp +CursorX=1 +CursorY=1 +TopLine=1 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=Borland.FormDesignerView + diff --git a/AC_ProLite.cbproj b/AC_ProLite.cbproj new file mode 100644 index 0000000..0ff7dd2 --- /dev/null +++ b/AC_ProLite.cbproj @@ -0,0 +1,2200 @@ + + + {E3B7A94D-BFFC-4049-B2F8-943A1835C955} + 20.3 + VCL + Application + AC_Pro.cpp + True + Debug + Win32 + 1 + AC_ProLite + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + $(BDS)\bin\cbuilder_PROJECTICON.ico + _LITE_;$(Defines) + AC_ProLite + true + 1030 + 1 + CompanyName=唱作网;FileDescription=;FileVersion=1.0.1.1030;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.1.1030;Comments= + $(BDS)\bin\default_app.manifest + 2052 + rtl.lib;vcl.lib;vclimg.lib;xmlrtl.lib;vclx.lib;vclactnband.lib;TPNGButton.lib;TCapButton.lib;TComboBoxComponent.lib;TGeneralDialogPanel.lib;TLineEdit.lib;TTextButton.lib;TSkinTrackBar.lib;TCKBox.lib;DbxCommonDriver.lib;dbrtl.lib;IndySystem.lib;IndyProtocols.lib;IndyCore.lib;TRadioBtn.lib;vclwinx.lib;bindengine.lib;soaprtl.lib;inet.lib;vcldb.lib;vclie.lib;vcledge.lib;Skia.Package.VCL.lib;Skia.Package.RTL.lib + System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) + CppVCLApplication + true + <_TCHARMapping>wchar_t + JPHNE + .\$(Platform)\$(Config) + .\$(Platform)\$(Config) + false + true + true + $(BDSLIB)\$(PLATFORM)\release\$(LANGDIR);$(ILINK_TranslatedLibraryPath) + $(BDS)\bin\Artwork\Windows\UWP\cppreg_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\cppreg_UwpDefault_150.png + + + bcbie;bcbsmp;$(PackageImports) + 0 + 0 + false + false + $(BDSINCLUDE)\windows\vcl;$(IncludePath) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) + 1033 + $(BDS)\bin\Artwork\Windows\UWP\cppreg_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\cppreg_UwpDefault_150.png + AC_Pro_Icon.ico + + + 1033 + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) + $(BDSINCLUDE)\windows\vcl;$(IncludePath) + bindcomp;bindcompdbx;bindcompfmx;bindcompvcl;bindengine;CustomIPTransport;DataSnapCommon;dbexpress;dbrtl;dbxcds;DbxCommonDriver;DBXInterBaseDriver;dsnap;FireDAC;FireDACADSDriver;FireDACASADriver;FireDACCommon;FireDACCommonDriver;FireDACDataSnapDriver;FireDACDb2Driver;FireDACDBXDriver;FireDACIBDriver;FireDACMSAccDriver;FireDACMSSQLDriver;FireDACMySQLDriver;FireDACODBCDriver;FireDACOracleDriver;FireDACPgDriver;FireDACSqliteDriver;fmx;fmxase;fmxdae;fmxFireDAC;fmxobj;FMXTee;FmxTeeUI;IndyCore;IndyIPClient;IndyIPCommon;IndyIPServer;IndyProtocols;IndySystem;inet;inetdbxpress;MetropolisUILiveTile;RESTComponents;rtl;soaprtl;Tee;TeeDB;TeeUI;vcl;vclactnband;vcldb;vcldsnap;vclFireDAC;vclie;vclimg;VCLRESTComponents;vclribbon;VclSmp;vcltouch;vclx;xmlrtl;$(PackageImports) + $(BDS)\bin\Artwork\Windows\UWP\cppreg_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\cppreg_UwpDefault_150.png + + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + true + + + 0 + 7 + CompanyName=唱作网;FileDescription=;FileVersion=1.7.0.523;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.6.2.430;Comments= + 523 + false + false + false + true + false + true + _DEBUG;$(Defines) + false + None + DEBUG + true + true + true + true + Full + true + true + true + true + true + $(BDSLIB)\$(PLATFORM)\debug;$(ILINK_LibraryPath) + $(BDSLIB)\$(PLATFORM)\debug\$(LANGDIR);$(ILINK_TranslatedLibraryPath) + + + 1 + 818 + 3 + CompanyName=;FileVersion=3.1.0.818;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=3.1;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) + true + false + rtl.lib;vcl.lib;vclimg.lib;xmlrtl.lib;vclx.lib;vclactnband.lib;TPNGButton.lib;TCapButton.lib;TComboBoxComponent.lib;TGeneralDialogPanel.lib;TLineEdit.lib;TTextButton.lib;TSkinTrackBar.lib;TCKBox.lib;DbxCommonDriver.lib;dbrtl.lib;IndySystem.lib;IndyProtocols.lib;IndyCore.lib;TRadioBtn.lib;vclwinx.lib;bindengine.lib;soaprtl.lib;inet.lib;vcldb.lib;vclie.lib;vcledge.lib;Skia.Package.VCL.lib;Skia.Package.RTL.lib + ..\..\Deploy\debug\ProLite + ..\..\Deploy\debug\ProLite + 1033 + Debug + AC_Pro_Icon.ico + $(BDSLIB)\$(PLATFORM)$(CC_SUFFIX)\debug;$(ILINK_LibraryPath) + + + AC_Pro_Icon.ico + rtl.lib;vcl.lib;vclimg.lib;xmlrtl.lib;vclx.lib;vclactnband.lib;TPNGButton.lib;TCapButton.lib;TComboBoxComponent.lib;TGeneralDialogPanel.lib;TLineEdit.lib;TTextButton.lib;TSkinTrackBar.lib;TCKBox.lib;DbxCommonDriver.lib;dbrtl.lib;IndySystem.lib;IndyProtocols.lib;IndyCore.lib;TRadioBtn.lib + 1033 + ..\..\Deploy\debug\ProLite + Debug + + + PerMonitorV2 + + + ..\..\Deploy\Release\Pro\AccompanyCube.ico + 0 + 7 + 523 + CompanyName=唱作网;FileDescription=唱作魔方专业版;FileVersion=1.7.0.523;InternalName=AC_ProLite;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=唱作魔方专业版;ProductVersion=1.7;Comments= + false + NDEBUG;$(Defines) + None + + + 3 + 1 + $(BDSLIB)\$(PLATFORM)$(CC_SUFFIX)\release;$(ILINK_LibraryPath) + true + 818 + ..\..\Deploy\Release\ProLite + 1033 + CompanyName=唱作网;FileDescription=唱作魔方教学版;FileVersion=3.1.0.818;InternalName=AC_ProLite.exe;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=唱作魔方教学版;ProductVersion=3.1;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) + false + ..\..\Deploy\Release\ProLite + rtl.lib;vcl.lib;vclimg.lib;xmlrtl.lib;vclx.lib;vclactnband.lib;TPNGButton.lib;TCapButton.lib;TComboBoxComponent.lib;TGeneralDialogPanel.lib;TLineEdit.lib;TTextButton.lib;TSkinTrackBar.lib;TCKBox.lib;DbxCommonDriver.lib;dbrtl.lib;IndySystem.lib;IndyProtocols.lib;IndyCore.lib;TRadioBtn.lib + AC_Pro_Icon.ico + + + PerMonitorV2 + + + +
AboutForm
+ dfm + AboutFormUnit.h + 70 +
+ + 0 + + +
AudioFxForm
+ dfm + AudioFxFormUnit.h + 148 +
+ + AudioTrack.h + 122 + + + AudStylePanel.h + 33 + + + 164 + + + BKGMemoUnit.h + 48 + + + BtnPanelUnit.h + 130 + + + ChordPanel.h + 161 + + + Compose.h + 56 + + + ContentPanelUnit.h + 11 + + +
CustomerSettingForm
+ dfm + CustomerSettingFormUnit.h + 105 +
+ + CustomerSettingPanelUnit.h + 106 + + + FavorTextureUnit.h + 138 + + + FxDef.h + 52 + + + GlobalUnit.h + 3 + + +
HelpForm
+ dfm + HelpFormUnit.h + 78 +
+ + HelpPanelUnit.h + 82 + + + ImgCopperExUnit.h + 126 + + +
ImgCopperForm
+ dfm + ImgCopperFormUnit.h + 127 +
+ +
ImportForm
+ dfm + ImportFormUnit.h + 46 +
+ +
ImportSegmentForm
+ dfm + ImportSegmentFormUnit.h + 108 +
+ + Instruments.h + 91 + + + KeyBoard.h + 62 + + + ListPanel.h + 87 + + + ListViewBase.h + 143 + + + ListViewMove.h + 162 + + + ListViewPattern.h + 142 + + + ListViewText.h + 141 + + +
MainForm
+ dfm + MainFormUnit.h + 2 +
+ +
ManageSongForm
+ dfm + ManageSongFormUnit.h + 72 +
+ + MenuBar.h + 9 + + + MenuUnit.h + 136 + + +
MessageForm
+ dfm + MessageFormUnit.h + 5 +
+ +
MicSetForm
+ dfm + MicSetFormUnit.h + 44 +
+ + MidiTrack.h + 161 + + +
MultiSwitchProgForm
+ dfm + MultiSwitchProgFormUnit.h + 98 +
+ + NotificationADPanelUnit.h + 92 + + + NotificationContentPanelUnit.h + 93 + + + NotificationExUnit.h + 94 + + +
NotificationForm
+ dfm + NotificationFormUnit.h + 95 +
+ + NotificationThreadUnit.h + 96 + + + PanelDB.h + 139 + + +
PayMentForm
+ dfm + PayMentFormUnit.h + 102 +
+ + PayMentPanelUnit.h + 103 + + + PlayTimePanel.h + 170 + + +
PredefineProjectForm
+ dfm + PredefineProjectFormUnit.h + 104 +
+ + PredefineProjectSetUnit.h + 104 + + + PreStylePanel.h + 32 + + + ProgHandlePanel.h + 99 + + +
ProgressForm
+ dfm + ProgressFormUnit.h + 20 +
+ + ProgressThreadUnit.h + 21 + + + Project.h + 125 + + + QRcodePanel.h + 38 + + + BITMAP + imgWaveIcon + + + BITMAP + imgMidiIcon + + + BITMAP + imgPlayCursor + + + BITMAP + music_cover_default + + + RCDATA + round + + + RCDATA + imgEffectAdd + + + RCDATA + imgEffectOff + + + RCDATA + imgEffectOn + + + RCDATA + HelpPNG + + + BITMAP + KBBlackDown + + + CURSOR + CursorBrush + + + CURSOR + CursorBrushAdd + + + CURSOR + CursorBrushNo + + + RCDATA + KeyBoard + + + RCDATA + imgMIButton + + + RCDATA + NoticeBk + + + RCDATA + btnViewChordLeft + + + RCDATA + btnViewChordRight + + + RCDATA + btnViewStyleLeft + + + RCDATA + btnViewStyleRight + + + RCDATA + btnViewTrackLeft + + + RCDATA + btnViewTrackRight + + + BITMAP + KBWhiteDDown + + + BITMAP + KBWhiteLDown + + + BITMAP + KBWhiteRDown + + + RCDATA + imgInfo + + + BITMAP + imgProgressLeft + + + BITMAP + imgProgressRight + + + RCDATA + imgBeatHint1 + + + RCDATA + imgBeatHint2 + + + RCDATA + imgBeatHint3 + + + RCDATA + imgBeatHint4 + + + BITMAP + SBLineDown + + + BITMAP + SBLineLeft + + + BITMAP + SBLineRight + + + BITMAP + SBLineUp + + + RCDATA + TapDown + + + RCDATA + TapNor + + + RCDATA + imgAddChannel + + + RCDATA + imgAddSegment + + + RCDATA + imgAlphaChord + + + RCDATA + imgChannel + + + RCDATA + imgCollect + + + RCDATA + imgDownload + + + RCDATA + imgEffWav + + + RCDATA + imgItemChecked + + + RCDATA + imgItemUnchecked + + + RCDATA + imgNewStyle + + + RCDATA + imgPylon + + + RCDATA + imgStar + + + RCDATA + imgScore + + + RCDATA + imgUnScore + + + RCDATA + imgStyleCharge + + + RCDATA + imgStyleSave + + + RCDATA + imgStyleUpload + + + RCDATA + imgFold + + + RCDATA + imgUnfold + + + RCDATA + imgBrush + + + RCDATA + imgDelete + + + RCDATA + imgProg + + + RCDATA + imgTabCollect + + + RCDATA + imgTabLocal + + + RCDATA + imgTabRecom + + + RCDATA + imgTabRelease + + + RCDATA + imgTabSelect + + + RCDATA + imgTabShare + + + RCDATA + imgTexture + + + RCDATA + imgTrackOff + + + RCDATA + imgTrackOn + + + RCDATA + imgUnCollect + + + RCDATA + imgVolume + + + RCDATA + imgWave + + + RCDATA + imgWavEff + + + RCDATA + imgClose + + + RCDATA + ImgSubMenu + + + RCDATA + ImgDownMenu + + + RCDATA + ImgUpMenu + + + RCDATA + UserInfo_Icon + + + RCDATA + UserInfo_Coin + + + RCDATA + UserInfo_Fans + + + RCDATA + UserInfo_Music + + + RCDATA + UserInfo_Pops + + + RCDATA + UserInfo_Zone + + + RCDATA + vipNone + + + RCDATA + vipTimer + + + RCDATA + vipForever + + +
SaveForm
+ dfm + SaveFormUnit.h + 52 +
+ +
SaveLocalStyleForm
+ dfm + SaveLocalStyleFormUnit.h + 107 +
+ +
ScoreForm
+ dfm + ScoreFormUnit.h + 88 +
+ + ScrollViewUnit.h + 146 + + +
SetUpForm
+ dfm + SetUpFormUnit.h + 40 +
+ + ShowUserInfoPanel.h + 56 + + + SkinHintWindow.h + 19 + + + SkinScrollBarUnit.h + 12 + + +
SplashForm
+ dfm + SplashFormUnit.h + 4 +
+ + StateBtn.h + 144 + + + StyleItem.h + 40 + + + StylePanel.h + 15 + + + StyleSelPanel.h + 54 + + +
StyleSpecsForm
+ dfm + StyleSpecsFormUnit.h + 119 +
+ +
StyleUploadForm
+ dfm + StyleUploadFormUnit.h + 116 +
+ +
SwitchProgForm
+ dfm + SwitchProgFormUnit.h + 84 +
+ +
SwitchPartternForm
+ dfm + SwitchTextureForm.h + 137 +
+ + TableViewUnit.h + 145 + + + ToolpalPanel.h + 14 + + + TrackPanel.h + 81 + + + TransSkinScrollBar.h + 129 + + + Undo.h + 124 + + +
UpdateForm
+ dfm + UpdateFormUnit.h + 78 +
+ + UpDownUnit.h + 41 + + +
UploadForm
+ dfm + UploadFormUnit.h + 47 +
+ + UseStylePanel.h + 31 + + +
VolumeForm
+ dfm + VolumeFormUnit.h + 53 +
+ +
VSTiForm
+ dfm + VSTiFormUnit.h + 149 +
+ +
VSTPathForm
+ dfm + VSTPathFormUnit.h + 163 +
+ +
VSTPluginForm
+ dfm + VSTPluginFormUnit.h + 150 +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Base + + + Cfg_1 + Base + + + Cfg_2 + Base + +
+ + CPlusPlusBuilder.Personality.12 + CppVCLApplication + + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2052 + 936 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + False + True + False + False + + + AC_Pro.cpp + + + Embarcadero C++Builder Office 2000 Servers Package + Embarcadero C++Builder Office XP Servers Package + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + + + + + + true + + + + + true + + + + + + + true + + + + + + + + + + + + + + + true + + + + + true + + + + + true + + + + + + + + + + + + + + + true + + + + + true + + + + + + + + + true + + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + res\xml + 1 + + + res\xml + 1 + + + + + library\lib\armeabi + 1 + + + library\lib\armeabi + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\mips + 1 + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-anydpi-v21 + 1 + + + res\drawable-anydpi-v21 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-v21 + 1 + + + res\values-v21 + 1 + + + + + res\values-v31 + 1 + + + res\values-v31 + 1 + + + + + res\values-v35 + 1 + + + res\values-v35 + 1 + + + + + res\drawable-anydpi-v26 + 1 + + + res\drawable-anydpi-v26 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-anydpi-v33 + 1 + + + res\drawable-anydpi-v33 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-night-v21 + 1 + + + res\values-night-v21 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-small + 1 + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + res\drawable-xlarge + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\drawable-anydpi-v24 + 1 + + + res\drawable-anydpi-v24 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-night-anydpi-v21 + 1 + + + res\drawable-night-anydpi-v21 + 1 + + + + + res\drawable-anydpi-v31 + 1 + + + res\drawable-anydpi-v31 + 1 + + + + + res\drawable-night-anydpi-v31 + 1 + + + res\drawable-night-anydpi-v31 + 1 + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + Contents\MacOS + 1 + .framework + + + Contents\MacOS + 1 + .framework + + + Contents\MacOS + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + 0 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + ..\ + 1 + + + + + Contents + 1 + + + Contents + 1 + + + Contents + 1 + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + Contents\MacOS + 1 + + + Contents\MacOS + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + ..\ + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen + 64 + + + ..\$(PROJECTNAME).launchscreen + 64 + + + + + 1 + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + Assets + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + + + + + + + + + + + + + + True + False + False + + False + + 12 + + + + +
diff --git a/AC_ProLite.dsv b/AC_ProLite.dsv new file mode 100644 index 0000000..5ac83d7 --- /dev/null +++ b/AC_ProLite.dsv @@ -0,0 +1,90 @@ +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFjY29tcGFueUN1YmVcUE5HQnV0dG9uLmhwcA==] +Module=E:\Ac_Project\Ac_Windows\AccompanyCube\PNGButton.hpp +CursorX=85 +CursorY=67 +TopLine=34 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AccompanyCube\PNGButton.hpp +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFjY29tcGFueUN1YmVcTm90aWZpY2F0aW9uRXhVbml0 +LmNwcA==] +Module=E:\Ac_Project\Ac_Windows\AccompanyCube\NotificationExUnit.cpp +CursorX=10 +CursorY=145 +TopLine=98 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AccompanyCube\NotificationExUnit.cpp +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxpbmNsdWRlXHdpbmRvd3Nc +dmNsXFZjbC5TdGRDdHJscy5ocHA=] +Module=d:\program files\embarcadero\studio\23.0\include\windows\vcl\Vcl.StdCtrls.hpp +CursorX=1 +CursorY=474 +TopLine=35 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=d:\program files\embarcadero\studio\23.0\include\windows\vcl\Vcl.StdCtrls.hpp +[ClosedView_ZDpccHJvZ3JhbSBmaWxlc1xlbWJhcmNhZGVyb1xzdHVkaW9cMjMuMFxpbmNsdWRlXHdpbmRvd3Nc +dmNsXFZjbC5TdGRDdHJscy5ocHA=] +Module=d:\program files\embarcadero\studio\23.0\include\windows\vcl\Vcl.StdCtrls.hpp +CursorX=1 +CursorY=474 +TopLine=35 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=d:\program files\embarcadero\studio\23.0\include\windows\vcl\Vcl.StdCtrls.hpp +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFjY29tcGFueUN1YmVcTm90aWZpY2F0aW9uRXhVbml0 +LmNwcA==] +Module=E:\Ac_Project\Ac_Windows\AccompanyCube\NotificationExUnit.cpp +CursorX=10 +CursorY=145 +TopLine=98 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AccompanyCube\NotificationExUnit.cpp +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFjY29tcGFueUN1YmVcTm90aWZpY2F0aW9uRXhVbml0 +LmNwcA==] +Module=E:\Ac_Project\Ac_Windows\AccompanyCube\NotificationExUnit.cpp +CursorX=10 +CursorY=145 +TopLine=98 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AccompanyCube\NotificationExUnit.cpp + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFjY29tcGFueUN1YmVcQnRuUGFuZWxVbml0LmNwcA==] +Module=E:\Ac_Project\Ac_Windows\AccompanyCube\BtnPanelUnit.cpp +CursorX=1 +CursorY=1 +TopLine=70 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AccompanyCube\BtnPanelUnit.cpp + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xDb21wb3NlLmNwcA==] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\Compose.cpp +CursorX=1 +CursorY=320 +TopLine=293 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\Compose.cpp + +[ClosedView_RTpcQWNfUHJvamVjdFxBY19XaW5kb3dzXEFDX1Byb1xTdHlsZVNlbFBhbmVsLmNwcA==] +Module=E:\Ac_Project\Ac_Windows\AC_Pro\StyleSelPanel.cpp +CursorX=65 +CursorY=312 +TopLine=269 +LeftCol=1 +Elisions= +Bookmarks= +EditViewName=E:\Ac_Project\Ac_Windows\AC_Pro\StyleSelPanel.cpp + diff --git a/AC_ProLite_resources.rc b/AC_ProLite_resources.rc new file mode 100644 index 0000000..1ebc6a9 --- /dev/null +++ b/AC_ProLite_resources.rc @@ -0,0 +1,86 @@ +imgWaveIcon BITMAP "Res\\Content\\AudioIcon.bmp" +imgMidiIcon BITMAP "Res\\Content\\MidiIcon.bmp" +imgPlayCursor BITMAP "Res\\Content\\PlayCursor.bmp" +music_cover_default BITMAP "Res\\Copper\\music_cover_default.bmp" +round RCDATA "Res\\Copper\\round.png" +imgEffectAdd RCDATA "Res\\Effect\\add.png" +imgEffectOff RCDATA "Res\\Effect\\power_off.png" +imgEffectOn RCDATA "Res\\Effect\\power_on.png" +HelpPNG RCDATA "Res\\Help\\help_btn.png" +KBBlackDown BITMAP "Res\\Main\\BlackPress.bmp" +CursorBrush CURSOR "Res\\Main\\brush.cur" +CursorBrushAdd CURSOR "Res\\Main\\brushadd.cur" +CursorBrushNo CURSOR "Res\\Main\\brushno.cur" +KeyBoard RCDATA "Res\\Main\\keyboard.png" +imgMIButton RCDATA "Res\\Main\\mibutton.png" +NoticeBk RCDATA "Res\\Main\\notice.png" +btnViewChordLeft RCDATA "Res\\Main\\view_chord_l.png" +btnViewChordRight RCDATA "Res\\Main\\view_chord_r.png" +btnViewStyleLeft RCDATA "Res\\Main\\view_style_l.png" +btnViewStyleRight RCDATA "Res\\Main\\view_style_r.png" +btnViewTrackLeft RCDATA "Res\\Main\\view_track_l.png" +btnViewTrackRight RCDATA "Res\\Main\\view_track_r.png" +KBWhiteDDown BITMAP "Res\\Main\\WhiteDualPress.bmp" +KBWhiteLDown BITMAP "Res\\Main\\WhiteLeftPress.bmp" +KBWhiteRDown BITMAP "Res\\Main\\WhiteRightPress.bmp" +imgInfo RCDATA "Res\\MessageBox\\info.png" +imgProgressLeft BITMAP "Res\\Progress\\ProgressLeft.bmp" +imgProgressRight BITMAP "Res\\Progress\\ProgressRight.bmp" +imgBeatHint1 RCDATA "Res\\Record\\BeatHint1.png" +imgBeatHint2 RCDATA "Res\\Record\\BeatHint2.png" +imgBeatHint3 RCDATA "Res\\Record\\BeatHint3.png" +imgBeatHint4 RCDATA "Res\\Record\\BeatHint4.png" +SBLineDown BITMAP "Res\\Scrollbar\\LineDown.bmp" +SBLineLeft BITMAP "Res\\Scrollbar\\LineLeft.bmp" +SBLineRight BITMAP "Res\\Scrollbar\\LineRight.bmp" +SBLineUp BITMAP "Res\\Scrollbar\\LineUp.bmp" +TapDown RCDATA "Res\\Setup\\tapHover.png" +TapNor RCDATA "Res\\Setup\\tapNor.png" +imgAddChannel RCDATA "Res\\Style\\addchan.png" +imgAddSegment RCDATA "Res\\Style\\addsegment.png" +imgAlphaChord RCDATA "Res\\Style\\alpha_chord.png" +imgChannel RCDATA "Res\\Style\\channel.png" +imgCollect RCDATA "Res\\Style\\collect.png" +imgDownload RCDATA "Res\\Style\\download.png" +imgEffWav RCDATA "Res\\Style\\eff_wav.png" +imgItemChecked RCDATA "Res\\Style\\item_checked.png" +imgItemUnchecked RCDATA "Res\\Style\\item_unchecked.png" +imgNewStyle RCDATA "Res\\Style\\newstyle.png" +imgPylon RCDATA "Res\\Style\\pylon.png" +imgStar RCDATA "Res\\Style\\star1.png" +imgScore RCDATA "Res\\Style\\star2.png" +imgUnScore RCDATA "Res\\Style\\star3.png" +imgStyleCharge RCDATA "Res\\Style\\stylecharge.png" +imgStyleSave RCDATA "Res\\Style\\stylesave.png" +imgStyleUpload RCDATA "Res\\Style\\styleupload.png" +imgFold RCDATA "Res\\Style\\style_arrows_close.png" +imgUnfold RCDATA "Res\\Style\\style_arrows_open.png" +imgBrush RCDATA "Res\\Style\\style_brush.png" +imgDelete RCDATA "Res\\Style\\style_delete.png" +imgProg RCDATA "Res\\Style\\style_prog.png" +imgTabCollect RCDATA "Res\\Style\\tab_collect.png" +imgTabLocal RCDATA "Res\\Style\\tab_local.png" +imgTabRecom RCDATA "Res\\Style\\tab_recom.png" +imgTabRelease RCDATA "Res\\Style\\tab_release.png" +imgTabSelect RCDATA "Res\\Style\\tab_select.png" +imgTabShare RCDATA "Res\\Style\\tab_share.png" +imgTexture RCDATA "Res\\Style\\texture.png" +imgTrackOff RCDATA "Res\\Style\\trackoff.png" +imgTrackOn RCDATA "Res\\Style\\trackon.png" +imgUnCollect RCDATA "Res\\Style\\uncollect.png" +imgVolume RCDATA "Res\\Style\\volume.png" +imgWave RCDATA "Res\\Style\\wave.png" +imgWavEff RCDATA "Res\\Style\\wav_eff.png" +imgClose RCDATA "Res\\System\\close.png" +ImgSubMenu RCDATA "Res\\System\\menu_arrows.png" +ImgDownMenu RCDATA "Res\\System\\menu_down.png" +ImgUpMenu RCDATA "Res\\System\\menu_up.png" +UserInfo_Icon RCDATA "Res\\UserInfo\\UserIcon.png" +UserInfo_Coin RCDATA "Res\\UserInfo\\user_coin.png" +UserInfo_Fans RCDATA "Res\\UserInfo\\user_fans.png" +UserInfo_Music RCDATA "Res\\UserInfo\\user_music.png" +UserInfo_Pops RCDATA "Res\\UserInfo\\user_pops.png" +UserInfo_Zone RCDATA "Res\\UserInfo\\user_zone.png" +vipNone RCDATA "Res\\Vip\\icon_vip_off.png" +vipTimer RCDATA "Res\\Vip\\icon_vip_on.PNG" +vipForever RCDATA "Res\\Vip\\icon_vip_on5.png" diff --git a/AC_Pro_Icon.ico b/AC_Pro_Icon.ico new file mode 100644 index 0000000..cb9c17e Binary files /dev/null and b/AC_Pro_Icon.ico differ diff --git a/AC_Pro_resources.rc b/AC_Pro_resources.rc new file mode 100644 index 0000000..431fca8 --- /dev/null +++ b/AC_Pro_resources.rc @@ -0,0 +1,97 @@ +chordUp RCDATA "Res\\chords\\#.png" +chord2 RCDATA "Res\\chords\\2.png" +chord4 RCDATA "Res\\chords\\4.png" +chord6 RCDATA "Res\\chords\\6.png" +chord7 RCDATA "Res\\chords\\7.png" +chordDown RCDATA "Res\\chords\\b.png" +chordI RCDATA "Res\\chords\\I.png" +chordMaj RCDATA "Res\\chords\\Maj.png" +chordMin RCDATA "Res\\chords\\min.png" +chordSus RCDATA "Res\\chords\\s.png" +chordV RCDATA "Res\\chords\\V.png" +imgWaveIcon BITMAP "Res\\Content\\AudioIcon.bmp" +imgMidiIcon BITMAP "Res\\Content\\MidiIcon.bmp" +imgPlayCursor BITMAP "Res\\Content\\PlayCursor.bmp" +music_cover_default BITMAP "Res\\Copper\\music_cover_default.bmp" +round RCDATA "Res\\Copper\\round.png" +imgEffectAdd RCDATA "Res\\Effect\\add.png" +imgEffectOff RCDATA "Res\\Effect\\power_off.png" +imgEffectOn RCDATA "Res\\Effect\\power_on.png" +HelpPNG RCDATA "Res\\Help\\help_btn.png" +KBBlackDown BITMAP "Res\\Main\\BlackPress.bmp" +CursorBrush CURSOR "Res\\Main\\brush.cur" +CursorBrushAdd CURSOR "Res\\Main\\brushadd.cur" +CursorBrushNo CURSOR "Res\\Main\\brushno.cur" +KeyBoard RCDATA "Res\\Main\\keyboard.png" +imgMIButton RCDATA "Res\\Main\\mibutton.png" +NoticeBk RCDATA "Res\\Main\\notice.png" +btnViewChordLeft RCDATA "Res\\Main\\view_chord_l.png" +btnViewChordRight RCDATA "Res\\Main\\view_chord_r.png" +btnViewStyleLeft RCDATA "Res\\Main\\view_style_l.png" +btnViewStyleRight RCDATA "Res\\Main\\view_style_r.png" +btnViewTrackLeft RCDATA "Res\\Main\\view_track_l.png" +btnViewTrackRight RCDATA "Res\\Main\\view_track_r.png" +KBWhiteDDown BITMAP "Res\\Main\\WhiteDualPress.bmp" +KBWhiteLDown BITMAP "Res\\Main\\WhiteLeftPress.bmp" +KBWhiteRDown BITMAP "Res\\Main\\WhiteRightPress.bmp" +imgInfo RCDATA "Res\\MessageBox\\info.png" +imgProgressLeft BITMAP "Res\\Progress\\ProgressLeft.bmp" +imgProgressRight BITMAP "Res\\Progress\\ProgressRight.bmp" +imgBeatHint1 RCDATA "Res\\Record\\BeatHint1.png" +imgBeatHint2 RCDATA "Res\\Record\\BeatHint2.png" +imgBeatHint3 RCDATA "Res\\Record\\BeatHint3.png" +imgBeatHint4 RCDATA "Res\\Record\\BeatHint4.png" +SBLineDown BITMAP "Res\\Scrollbar\\LineDown.bmp" +SBLineLeft BITMAP "Res\\Scrollbar\\LineLeft.bmp" +SBLineRight BITMAP "Res\\Scrollbar\\LineRight.bmp" +SBLineUp BITMAP "Res\\Scrollbar\\LineUp.bmp" +TapDown RCDATA "Res\\Setup\\tapHover.png" +TapNor RCDATA "Res\\Setup\\tapNor.png" +imgAddChannel RCDATA "Res\\Style\\addchan.png" +imgAddSegment RCDATA "Res\\Style\\addsegment.png" +imgAlphaChord RCDATA "Res\\Style\\alpha_chord.png" +imgChannel RCDATA "Res\\Style\\channel.png" +imgCollect RCDATA "Res\\Style\\collect.png" +imgDownload RCDATA "Res\\Style\\download.png" +imgEffWav RCDATA "Res\\Style\\eff_wav.png" +imgItemChecked RCDATA "Res\\Style\\item_checked.png" +imgItemUnchecked RCDATA "Res\\Style\\item_unchecked.png" +imgNewStyle RCDATA "Res\\Style\\newstyle.png" +imgPylon RCDATA "Res\\Style\\pylon.png" +imgStar RCDATA "Res\\Style\\star1.png" +imgScore RCDATA "Res\\Style\\star2.png" +imgUnScore RCDATA "Res\\Style\\star3.png" +imgStyleCharge RCDATA "Res\\Style\\stylecharge.png" +imgStyleSave RCDATA "Res\\Style\\stylesave.png" +imgStyleUpload RCDATA "Res\\Style\\styleupload.png" +imgFold RCDATA "Res\\Style\\style_arrows_close.png" +imgUnfold RCDATA "Res\\Style\\style_arrows_open.png" +imgBrush RCDATA "Res\\Style\\style_brush.png" +imgDelete RCDATA "Res\\Style\\style_delete.png" +imgProg RCDATA "Res\\Style\\style_prog.png" +imgTabCollect RCDATA "Res\\Style\\tab_collect.png" +imgTabLocal RCDATA "Res\\Style\\tab_local.png" +imgTabRecom RCDATA "Res\\Style\\tab_recom.png" +imgTabRelease RCDATA "Res\\Style\\tab_release.png" +imgTabSelect RCDATA "Res\\Style\\tab_select.png" +imgTabShare RCDATA "Res\\Style\\tab_share.png" +imgTexture RCDATA "Res\\Style\\texture.png" +imgTrackOff RCDATA "Res\\Style\\trackoff.png" +imgTrackOn RCDATA "Res\\Style\\trackon.png" +imgUnCollect RCDATA "Res\\Style\\uncollect.png" +imgVolume RCDATA "Res\\Style\\volume.png" +imgWave RCDATA "Res\\Style\\wave.png" +imgWavEff RCDATA "Res\\Style\\wav_eff.png" +imgClose RCDATA "Res\\System\\close.png" +ImgSubMenu RCDATA "Res\\System\\menu_arrows.png" +ImgDownMenu RCDATA "Res\\System\\menu_down.png" +ImgUpMenu RCDATA "Res\\System\\menu_up.png" +UserInfo_Icon RCDATA "Res\\UserInfo\\UserIcon.png" +UserInfo_Coin RCDATA "Res\\UserInfo\\user_coin.png" +UserInfo_Fans RCDATA "Res\\UserInfo\\user_fans.png" +UserInfo_Music RCDATA "Res\\UserInfo\\user_music.png" +UserInfo_Pops RCDATA "Res\\UserInfo\\user_pops.png" +UserInfo_Zone RCDATA "Res\\UserInfo\\user_zone.png" +vipNone RCDATA "Res\\Vip\\icon_vip_off.png" +vipTimer RCDATA "Res\\Vip\\icon_vip_on.PNG" +vipForever RCDATA "Res\\Vip\\icon_vip_on5.png" diff --git a/AboutFormUnit.cpp b/AboutFormUnit.cpp new file mode 100644 index 0000000..6052341 --- /dev/null +++ b/AboutFormUnit.cpp @@ -0,0 +1,75 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop + +#include "AboutFormUnit.h" +#include "GlobalUnit.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma link "PNGButton" +#pragma link "GeneralDialogPanel" +#pragma resource "*.dfm" +TAboutForm *AboutForm; +//--------------------------------------------------------------------------- +__fastcall TAboutForm::TAboutForm(TComponent* Owner) + : TForm(Owner) +{ + Font->Color = RGB(60,43,23); +} +//--------------------------------------------------------------------------- +void __fastcall TAboutForm::FormCreate(TObject *Sender) +{ + m_lblVersion->Caption = g_strCurrentVersion; + + int wMaj, wMin, wMod, wBld; + sscanf( g_strCurrentVersion, "%d.%d.%d.%d", &wMaj, &wMin, &wMod, &wBld ); + + if( SOFTWARE_ID==e_Pro_Lite ) + m_lblType->Caption = L"ѧ"; + else if( wMaj==0 ) + m_lblType->Caption = L"԰"; + else + m_lblType->Caption = L"ʽ"; + + m_lblType->Left = m_lblVersion->Left + m_lblVersion->Width + 3; + + int nOrigin, nDownload, nShare, nLocal; + f_CS_GetStyleNumsEx( nOrigin, nDownload, nShare, nLocal ); + char strNums[64]; + sprintf( strNums, "/ط%d/%d", nOrigin, nDownload ); + m_lblStyleNums->Caption = strNums; + + m_lblURL->Caption = g_strServerURL; + + SetTransparent( this ); +} +//--------------------------------------------------------------------------- +void __fastcall TAboutForm::WMNCHitTest(TWMNCHitTest &Msg) +{ + TForm::Dispatch(&Msg); + + if( Msg.Result==HTCLIENT && Msg.YPosCaption.Length()>0 ){ + ShellExecute(Handle,NULL, m_lblURL->Caption.c_str(), NULL,NULL,SW_SHOWNORMAL); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TAboutForm::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) +{ + switch( Key ){ + case VK_RETURN: + case VK_ESCAPE: + ModalResult = mrCancel; + break; + } +} +//--------------------------------------------------------------------------- + + diff --git a/AboutFormUnit.dfm b/AboutFormUnit.dfm new file mode 100644 index 0000000..d1fb579 --- /dev/null +++ b/AboutFormUnit.dfm @@ -0,0 +1,1091 @@ +object AboutForm: TAboutForm + Left = 0 + Top = 0 + BorderStyle = bsNone + Caption = 'AboutForm' + ClientHeight = 176 + ClientWidth = 325 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + KeyPreview = True + Position = poMainFormCenter + Scaled = False + OnCreate = FormCreate + OnKeyDown = FormKeyDown + TextHeight = 13 + object GeneralDialogPanel1: TGeneralDialogPanel + Left = 0 + Top = 0 + Width = 325 + Height = 176 + Caption = #20851#20110 + Color = 5064257 + ParentBackground = False + TabOrder = 0 + object m_lblStyleNums: TLabel + Left = 32 + Top = 124 + Width = 100 + Height = 13 + Caption = #26412#22320'/'#22312#32447#39118#26684#25968#65306 + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object m_lblType: TLabel + Left = 103 + Top = 91 + Width = 42 + Height = 18 + Alignment = taCenter + AutoSize = False + Caption = #20869#27979#29256 + Color = clPurple + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentColor = False + ParentFont = False + Transparent = True + Layout = tlCenter + end + object m_lblURL: TLabel + Left = 32 + Top = 148 + Width = 145 + Height = 13 + Cursor = crHandPoint + Caption = 'http://ComposeMusic.xicp.net' + Font.Charset = GB2312_CHARSET + Font.Color = 16762508 + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [fsUnderline] + ParentFont = False + OnClick = URLClick + end + object m_lblVersion: TLabel + Left = 32 + Top = 94 + Width = 57 + Height = 13 + Caption = ' 1.0.0.0611' + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + Layout = tlCenter + end + object PNGLogo: TImage + Left = 202 + Top = 49 + Width = 97 + Height = 93 + AutoSize = True + Picture.Data = { + 0954506E67496D61676589504E470D0A1A0A0000000D49484452000000610000 + 005D0806000000B5BE0875000000097048597300000B1300000B1301009A9C18 + 00000A4D6943435050686F746F73686F70204943432070726F66696C65000078 + DA9D53775893F7163EDFF7650F5642D8F0B1976C81002223AC08C81059A21092 + 006184101240C585880A561415119C4855C482D50A489D88E2A028B867418A88 + 5A8B555C38EE1FDCA7B57D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691 + E6A26A003952853C3AD81F8F4F48C4C9BD80021548E0042010E6CBC26705C500 + 00F00379787E74B03FFC01AF6F00020070D52E2412C7E1FF83BA502657002091 + 00E02212E70B01905200C82E54C81400C81800B053B3640A009400006C797C42 + 2200AA0D00ECF4493E0500D8A993DC1700D8A21CA908008D0100992847240240 + BB00605581522C02C0C200A0AC40222E04C0AE018059B632470280BD0500768E + 58900F4060008099422CCC0020380200431E13CD03204C03A030D2BFE0A95F70 + 85B8480100C0CB95CD974BD23314B895D01A77F2F0E0E221E2C26CB142611729 + 106609E4229C979B231348E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666 + E76CEFF4C5A2FE6BF06F223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370 + C701B075BF6BA95B00DA560068DFF95D33DB09A05A0AD07AF98B7938FC401E9E + A150C83C1D1C0A0B0BED2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7A + F000719A4099ADC0A383FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD + 8E29D1E234B15C2C158AF15889B850224DC779B952914421C995E212E97F32F1 + 1F96FD0993770D00AC864FC04EB607B5CB6CC07EEE01028B0E58D27600407EF3 + 2D8C1A0B91001067343279F7000093BFF98F402B0100CD97A4E30000BCE8185C + A894174CC608000044A0812AB041070CC114ACC00E9CC11DBCC0170261064440 + 0C24C03C104206E4801C0AA11896411954C03AD804B5B0031AA0119AE110B4C1 + 31380DE7E0125C81EB70170660189EC218BC86090441C8081361213A8811628E + D822CE0817998E04226148349280A420E988145122C5C872A402A9426A915D48 + 23F22D7214398D5C40FA90DBC820328AFC8ABC47319481B25103D4027540B9A8 + 1F1A8AC6A073D174340F5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A + 8E6380D1310E668CD9615C8C87456089581A26C71663E55835568F35631D5837 + 76151BC09E61EF0824028B8013EC085E8410C26C82909047584C5843A825EC23 + B412BA085709838431C2272293A84FB4257A12F9C478623AB1905846AC26EE21 + 1E219E255E270E135F9348240EC992E44E0A21259032490B496B48DB482DA453 + A43ED210699C4C26EB906DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7 + 143AC588E24C09A22452A494124A35653FE504A59F324299A0AA51CDA99ED408 + AA883A9F5A496DA076502F5387A91334759A25CD9B1643CBA42DA3D5D09A6967 + 69F7682FE974BA09DD831E4597D097D26BE807E9E7E983F4770C0D860D83C748 + 6228196B197B19A718B7192F994CA605D39799C85430D7321B9967980F986F55 + 582AF62A7C1591CA12953A9556957E95E7AA545573553FD579AA0B54AB550FAB + 5E567DA64655B350E3A909D416ABD5A91D55BBA936AECE5277528F50CF515FA3 + BE5FFD82FA630DB2868546A08648A35463B7C6198D2116C63265F15842D67256 + 03EB2C6B984D625BB2F9EC4C7605FB1B762F7B4C534373AA66AC6691669DE671 + CD010EC6B1E0F039D99C4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA + 7ADABEDA62ED72ED16EDEBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA + 85BADB75CFEA3ED363EB79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD1 + 1F373034083690196C313863F0CC9063E86B9869B8D1F084E1A811CB68BA91C4 + 68A3D149A327B826EE8767E33578173E66AC6F1C62AC34DE65DC6B3C61626932 + DBA4C4A4C5E4BE29CD946B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C + 6B9E61BED9BCDBFC8D85A5459CC54A8B368BC796DA967CCB05964D96F7AC9856 + 3E567956F556D7AC49D65CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BAD + C4769B6DDF14E2148F29D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F6 + 6DF6CF1DCC1C121DD63B743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957 + 671B67A1739DF33517A64B90CB1297769717536DA78AA76E9F7ACB95E51AEEBA + D2B5D3F5A39BBB9BDCADD96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0 + F758E271CCE39DA79BA7C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8 + DBC45BE0BDCB7B603A3E3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE23 + 7ED67E997E07FC9EFB3BFACBFD8FF8BFE179F216F14E056001C101E501BD811A + 81B3036B031F049904A50735058D05BB062F0C3E15420C090D591F72936FC017 + F21BF96333DC672C9AD115CA089D155A1BFA30CC264C1ED6118E86CF08DF107E + 6FA6F94CE9CCB60888E0476C88B81F69199917F97D14292A32AA2EEA51B45374 + 7174F72CD6ACE459FB67BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9B + B880B8AAB8817887F845F1971274132409ED89E4C4D8C43D89E37302E76C9A33 + 9CE49A54967463AEE5DCA2B917E6E9CECB9E773C593559907C3885981297B23F + E5832042502F184FE5A76E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E6 + 9D5695F638DD3B7D43FA68864F4675C633094F522B79911992B923F34D5644D6 + DEACCFD971D92D39949C949CA3520D6996B42BD730B728B74F662B2B930DE479 + E66DCA1B9387CAF7E423F973F3DB156C854CD1A3B452AE500E164C2FA82B785B + 185B78B848BD485AD433DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1 + E022BF45BB16238B5317772E315D52BA647869F0D27DCB68CBB296FD50E25852 + 55F26A79DCF28E5283D2A5A5432B82573495A994C9CB6EAEF45AB96315619564 + 55EF6A97D55B567F2A17955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDA + DADE4AB7CAEDEB48EBA4EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B + 5F6D4ADE74A17A6AF58ECDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D + 7F5DCB56FDADABB7BED926DAD6BFDD777BF30E831D153BDEEF94ECBCB52B7857 + 6BBD457DF56ED2EE82DD8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645 + EFEB6A746F6CDCAFBFBFB2096D52368D1E483A70E59B806FDA9BED9A77B5705A + 2A0EC241E5C127DFA67C7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23A + BF75AC2DA36DA03DA1BDEFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F57 + 9EA09D283DF1F9E48293E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD + 6743CF9E3F1774EE4CB75FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE + 3D477E70FDE148AF5B6FEB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573 + D7F8D72E5D9F79BDEFC6EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D + 7A8F78AFFCBEDAFDEA07FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09 + 879EFE94FFD387E1D247CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2 + A713CFCA7E56FF79EB73ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372 + EFABA9AF3AC723C71FBCCE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40 + FE50F3D1FA63C7A7D04FF73EE77CFEFC2FF784F3FB25D29F3300004BC8494441 + 5478DADDBD07789CD5B535BCA6F7AADEBB2DCB72376ED814D37B4D202401424B + 48801452EF4D420201722F5F126E48F8484820011282E9C50D6CDC2DDBB22DCB + 922559B27A9746D37BFDF73EEF8C2C1C0890C0FDEEFDED672C5965E67DCF3A7B + EDB5F6D9E78C0C9FFE1F19FF93955F295F7DD99D172B14EA8BE572D994DF35B9 + E3F0AE178E8583DE31AF732C39E36765E9CF53339E23F5715EF07FDB1FD9BFFE + 141FFAFC32A54A933CEBAAAFDF583DF7B4C7A626C6CD8140103AAD3A108F459B + 9389D8EEAE961DBB82BEA9A36EC7F00001F277BF8FFF9F03F269829019C0A44C + 26ABAE5F71E58E2B6EBAB7D0E518C3D1232DD0EB74B0988D482693502AD5A950 + 38D23B3539D2120D4E6DF5B986F7F4B5379C482513DE70D097793E053E188CFF + D5C07C5A209C9CC18480C992F3E780CFF5852B6EBD1FABD65E8A86EDDB303038 + 8AFC3C3BF47A1D12F1047C8108FC1421290645218FC965A96619223BC7FA9A1B + A2216FE370F791FE4838F061D7FEBF128C4F0384CC73CAE99130DB0BAE597DF1 + 57D6EDDFF267792291C02DDF7D1C46A31EDBDFDD89503084C2825C68342A44A3 + 0928357A0C0CF421118BD193484FA352ABA156AB0643BE89230A797CBB776A78 + F7D089432708106738E0CDBCE6CC28391588FFF1C07C1A20C8D3CF9BA428C85A + 7EEE17DFADA83B7D9E451DC41F7EF96DD4AFBC1697DFF0150CF6F5A2A5E538CF + 7A1416E541411F8D4613CC361B76EFDC83649C694A0E068E294B2653D0CFC808 + 10654CA3511F49467D0726068FED48A5E2FB874E340D50A49D7A0DA702F03F16 + 8C4F1A04D98C47A2BC76E94FEB975DF5E308CDEC0B2F3A173B373C8B37D63D8D + CB6EBE1FF6EC428C8D8F636C741C3A9D1685857948241358B0A00E06AD1A7F5B + B71EF1785C80944AA5044D25E9FBFC47A3D50970544A6552A7534F20113A2C97 + 25DFE969DBDDE0734F7407BC4E07A9AE53AFE97F2C289F1608499DC1B4E0BCCF + DEBBA3ED6087C560B5E0CC8B2F44DDEC0ADC77F7D5506AAD587BD5D76990A318 + 1A1C86CBE5869992746151019289386EF8EC45888643F8E56F9E4720108096E8 + 2A95201052094E31A8AA9D07B94209AFDB85A0DF8B48288848D80FB54A19B3DA + 6C479108364C0C77EE26A5B577F0C4A1E11421C8D194FE239F71BDFF23A8EB93 + 0461E68C539E79D9975E50280BAE6CDA778028C68E2567AEC1EAB56BD1DBBA1F + BF79E076ACBEE4CBA8AC5B05BFCF8B81FE310489DFAD361372F37261B39AF09D + AF7D06BDBD8378F8D1BF6262D2012DE50666B8782C0E6B560E66D52F1414E59E + 9A447747338114433412A1514CA1A4B41415B366636ACA3DD177BCF9B04A81AD + A37D4D7B28C1773A46BBA7E2F1D8A9D7FCFF148C4F0A84F724E3D2AAB937ACB9 + F4CE67B76F785B9E92C949A32A5054568E35E79D83F2CA6ABCF0C48FD1B46723 + AEBAFD57C8CEAF80CF1F425747373CCE3ED86C06D8B2B3B16C712DEEFED27968 + 6B1FC003BF7C1E9D5DFDE42D142CB7108F4650505281FAA52BD1D5DA84FECE63 + A85B30172343A3989A9C849CAE66FEE285C82DAEC0FEDDBBE1A388D1683461AD + 56D3EE730EEC53C8E2DB039EF17DC33D47461284EA0C503E284A3E55503E4910 + C48C52289459D7DFF9B31D5D1D4375BD274E40633042A3D3432E5763EEA28558 + 78DA521AA4147EF1DD1B50BBF80A7CF53BF722D70A6CDCDA8DBDBBF621E01B42 + 764E16B2F372F0856BCFC12567D7A2AFDF81877FFD1276351CA18850520480E8 + 2A8C9AB90B50525985BDEF6C40457599505B3D9DDD14116164E566E1F473CE81 + C7E5C391838D229FC4E8EBCC4A94DF4975C926B46AC55EA4C2BBC6FA5B1BC893 + B48C0F1DF727FE1E900F525DFFA340984943C9D5E75DFB50D5FC737FB0F1D5D7 + A0546BA1379969962E402C9684D3E1C682A58B515D578B63070F60EBABAFE357 + 8FFF0C6B57D5E0B9F55D78EDD59D181D6E13A364A63C32677635EEBCF952D457 + 65C1E309E1D13FBC81D7D7EFA25721392B9793AC0D61D1AA33042DF511259555 + 94E158732B7C1E378D581275F3EAB168C5E9D8DFD000B7D349949510511409D3 + 2314A0CF8350C893D01B0D3EBD41DF914A441AE4F2D4A6C1AE437BA7C67A3D24 + 08DECF207EE2607C5220081AB265E79F76C7F77FF3F6E637375A4787C7A0D268 + 899B67A184A88813E9C4B80B4A9506B3E7D6123D9560F38B2F22410379DD6DB7 + 6264DC4B03D88CEEA3CD908748F94492C892EB51BFA61E9FBFF72A94E618E9F6 + 93F8D30BEFE2774FBF2166BB928628114BE0B433D722E07523EC77898B696F69 + 21F5148786A266EDA59741AD35A2B161AFB8D43829B5782C4A5111118F48C84F + 51E5A5CFFD14AD29E8F45A8AA2A27D48467ED27E68D3E66838A84046727F4A51 + F1AF82305392E2A6BB1F78456928B87CFD2BAFD0606B6130D16CA6D9A8D31BA1 + 50AAA0A0C8F0FA82B053F2CDCBB6434D33FAB95FFC1CB3AB4EC3DCCA79F0F60D + C03FE982D7E5828278234E03C9A0D55DB51257DC7931CA88B7D4AA14D66F3988 + FFFABF2FC231392549D8640ACB4F5F41B37D0A6A8D1A03BDBD181D1CA0A18AA1 + B0B40CE75D792D8EB51CC3D8C888C817310622CA603010511151F14890C0F021 + 1A72D3D702C8CD2F099AACD61F741CDAF058341252CD002123B33E3120FE1510 + DE938C172E5DF5F99BBFFEF3679E7BE62FF289D1098A023DF17A3ECAABAB0900 + 3571B006EA848266780ACA40128A7014C6A402AEDE13683DB20B25F397406B31 + C21D70C11970C24BB333294F4013D52027918FB24B4FC3B99F3F9BC02A82CDA2 + C49E7DC7F19FFFF51CFA48412989BE542A258A8B0B1025F5945B9087E6FDFB10 + F4B989B922587DFEA598356F11766EDB26F109C95D76E59C9063518A8AA81415 + 34D8044680C0F020E29FA268AD482AD5CA9B8E1F7AFB3992D39A340089F47D27 + FF9941FB34401061AAD1680B7FFD8797B6341D1B9A73A0F13071728028408FE2 + B2526417164235118166C82B4A11E470851748AAE34868E390EBE438DEBE0F2E + E2F1590B5790618B23E0F693A2F12141662D45AF600CEB91857CE857D760CE99 + F3B174FE2C545714A0B76F148F3DFE171C696AA51C91BE1532763575B369C627 + 09885D88917F305BACB8F6D6BB85D46D6B6D13A510CE0F6CF8180C293222020C + F62791900FF58B96A28C94DC91FDDB86BB8F6EB9D43539D042CFCE3A399E06E0 + 138B887F1684F738E35BEEB8FBE7E75D76E3F71E7AE4711496146392B81F942C + CB2B2B60B45AA18ACA10ECEE262A1A21C408089EB94A39540A05F1B60A321A8C + A6867761CBADA0C8A92313E62695E42765E31183CA7FCD6113ACF25C249715C3 + 525E809AF2622C5E5427686EDD0B6F62C7D61D220FF098A894322C5CBE02237D + C7D17984E89DF246FDF23371C1B5D761F78E46048351BA708E841051990404E7 + 0A06214CC62F3BBF98A2A0065CC19D1AEF836F6A70EB40C78ECF78A646C3E941 + 4FE0243DFDCBC9FA5F0141D0507169E5F257DF7C7BD383BF7CD6DA7CB4835C6F + 31628914E9721D4A2A4A89A37550528296D14C75F5B5C333D44303AF25FA206A + 223E575276D569B5981A1B42476B336AE6AD84D56A23BD3F45D1E081DF1BA059 + 4D2F47B2D612344327B720B1A410FAE25CE888E64A4A0BE95182F6D6766CDDBC + 85BCC6240D499CBC4616EA172F436BC3760C761EA7D731E073F7DC8BE28A72B4 + B674C2EF0FC3ED1AA7680B0AA0B944C21256A952C39E95274C6428181026304C + 14998A391FE838F8D683E4BC1569104E05E2BF1584999254FDE453CFBC6CCBAF + B9F89BDFFB3FE4786D62D035444526A280FCC27C0A7D2DE4345BD50404E706D7 + C071387B5AB8C4400F15F1B9422457935E87D6A6FD70F92298BF6495A08BC9F1 + 0938295173F2947048C116B2D1ADABE0A935A3A8B6065ACA3D0A92ABD934E811 + 1AC4C63DBB31D47F82E8258CCAD975A4CEEAB1F7CDD730D13F8945675E8C7FFB + F99D8812DFBFB5AD1343036324579DE2B9B936C5352A83D14C5F0B2114F00907 + 1EA79CC1099CF24E28E4EEBCBEBB75D74648B414C3495AFA9780F8B820BC2719 + 9F71F6F95F7CF595579FB9F9EE87304A1464B567211C8E89C1D6EA0D4215D9B3 + 6CD0190C82364472D668E01B3981F1F6C342A9A84946AA6810ED5693488EDBB7 + BE83BC9239A8AAA986CFEBC3E8D018A6262621639745D1C0F32F3B644784A2AD + 3F278CFCAA2A1497549221340860F94F57DB5174B61EA4410C60E18AB360B1E6 + 63FBF3AF134DE5E2CBF7DD8A73CF5B80A7FEB21BC3432334C099421F01409E86 + F350C84FB23516267A8A91848EA4A92A46B9C5D0DE7BF4CD4B9CE3FDA3E93188 + A523E2BF1D847481CE52B465EBD62D53DE44ED83BFFA2B8A8A0B852F0804D895 + 6A855A91D10CB7DA2C30D343C91295238292A2C9A4837FB40F0347F7519A8BD1 + 6CD6C0A8D3D0EFA830D8DF838E8E6ECC5BBC02568B89682188FEDE0151335213 + 553035C52334202E235CB120DA14C390A9E4C82B2841018161CF2D849600191B + ECC5917D5B899EC6B0FAC26B910829B1F3E5F528AB9B876FDC7F374686C7B16D + C73E76CE34F049610E7918837E9F70D72C8F79F045BEE068A0EBA4408156117A + A6EDC0CB778583FE8C52CA24EA7F1A888F03C27B92F15DDFFCFE2F1EFDC5C3DF + BAF37BFF85A15137CD2213140AA2178D19AB572E4357F720FAFAFB91939B0D9D + 512F4050528468344AE8B52A1A6023463B8EA0EFC80168B51A68284730ADB082 + DA41D1905B5489B973E7C04D4A29E00FC1E7631D1F450EF175CAAFA5994A7E23 + AA4750AFC0903D8C898921781CA35CDE26B35580E2AAB904AA16C70E910BEFEF + C019977E11E304E6BE2DAFE0A2CFDD81732E3C0B9BDE694088A82ECB6E15B4E9 + 74380400998AABF87C0618ACA238BA83CE8E2FB736BCF614FD88764634FCD340 + 7C5C10040D9557CD59B9AF61D796811197FE87FFF90CCD6C331931F2020A7A50 + 3EC8CE2AA4C1F3204CBC6CCFB60949A8A459AE629A4A8360366AE966C6D0B26D + 131432564B94A0C9687948AAEED9B11DD6AC021495D6C0EBF50B33160A86891A + 88EA127A989DB9709906E9F58002F2108AEA7C44AB6DE212033E271C63FD704E + 0C0B50B3F24A855F0805BD58B2FA321CDAF626DC53E338E7DADBE00F0611A6A8 + 2A2E29246A9A1025F1442A215E8FC7322586334940244424F047FE9A5EAF19E9 + 3AF0F255A3036DCD9056F5E23380C0C705E2A3823063CD58A17DF2A9675FB9ED + E6CF5DF8D0632F62E78176582C1631C84AA54638569F3F4AB4A1A41C61819EA2 + 80694802412500D0EB9404820E618F0387DF7E93F83E259492967EB7E5680BFA + 7ABA6916AB69D659C8F09551842960A0BCC253C01ACA8532A5C440A48B127108 + 723F6070AA31AAF262CC90A4883213FD65C1946B26459620501C3493C362604B + 6B16D0F5E9D176602B4AE72CA1E7372137C782A109AFA03D4EC02C5991946471 + 6ABA489114D1914A254512D76A4DF433FE6DFB373DF1599F6B3C941EFC0C101F + 3B1A3E0A08EF49C6E75FF2995BD7BFFEC2931EAF5FF6ADFB9F869772809E9230 + 4B3B053D542A0D22BC5E4CD464B29A797D580241A9164958A75512FFAB60B711 + 1D75B6E1D89EED62C6725EE0B2426767374A0AF330BBBA0C4D4D47E1F6C79057 + 5845895E0BA3D68079DA5A84D53EF405872959A6A44109EBA0F7EB102852C16B + 9263E4C400C646872912FDD01828DFD8CCD09BCD942F4AA03798C5CD70B55426 + 9363D9A24AB4740E6360C8816834ADC2F8A6C5949380102B7B29696C39A77139 + C6488F13CD6F3FD8F8CE9F7F962EF4CD8C868F05C447054124637B767ED1FA8D + 9BF7AC583ABFEC504B0F1E7CEC25213D59F1708D87136B2229A7D0054C662325 + 3B93E8A60847E22212B404884E23879912B349AF41F3D68D18EDEB163E818DD2 + BEDD7B60B3DBB1F68C95D0E9749824AFB065CB7658EC453067E520579D8F3959 + 35687235D32049F7283C045D9E354151A3B4A3E482F930CC2F21A68EC3E77251 + 54F56170A08F12F110141A132CD9453449A2E4B0156260B3ED66CA3366383D41 + 389C3E78C824864261D10122023F75322AF8A39C80B3E7E4A2B2663626470703 + 0D1BFF784357F3BB1BE88735FF2C101F06C20C4F204B9D76FA85BF7C77F32BDF + 301AB4D8B1BF038F3EF596A009969E4C1F32BAB14858AA449A28F19694E4C3EB + 8F88C8D0080094222764675930D6750C6D7BDF859C7E474D91D27AF408C9D111 + AC3D7B0DF2F3F348AEC6E97955686FEB447B4717CAAAEB9193A84441B619FDF1 + 13942865F4BB3291C8E5D270C11CA101D5D850FB99A5285E56455A3F01070DAE + CDAC133731E17053820F10202338D6DE4FFE458168C04BCF436052E4B2AC5650 + 328F44E3E4AAC92B84090C02934B29BC10C120241349418F397979704D4DD190 + 87DB8E6C7BFA72C758EF687AD04F554B1F0A84EC237C4FD0504E61CD1A5376D9 + A607EEFB9EFE86ABCF45C3E113F8DD5FB7D2ABC9A1A6992C24A8C20CA55A4F91 + 01E4641B280AB41823BED568D462400D7A0A655242DE916E74EEDB49B33921E8 + 6B7C74144D071B317F5E3DEAE7D689A29A42AE14A5688EA21DDB7742A3B06341 + CE3970EA8620D74668B62644144820487385E9C5103022476FC7E25B4E877156 + 211C933EA1DE6C161D0A72AD142049F225496CD8B897724A04AE895EF2133151 + 04ECEEE9A27BA05C46C2C260CE22C96D404AA620B99A1454C55E21168B0A2A8B + 113872428F45872C32F5977D9B9FBC3314F064646B261A3E52A2FE3010C4F7D5 + 1A832ABF74CEFA703872CEC2156BF1FC930FA3B56310AFBC738814465438629D + DE8682C26254955BE17433B72631C2268B6E424AB2E49CE3218C751EC544771B + 7D4D0E3DD1583814C5FEFD0D048E0E6B56AF122FCCB38D9D34D79628BC304220 + F5EE1BC7BCB9ABD0173A4103A415039EA4042A89DACC5F962A0AE80988FCBC02 + 945CB514C6F21C72DE1E0C0F4FA1BC3C8F84819A246F90927B140DFB8F62616D + 211A9B3A715A7D118E779EC0FA0D6FC1E79E20836916C2406FB2516ECBA58F76 + 010A850A12747D9148544C962801A3D5EBE1E86DFCEAE11DCF3F8993B235FE51 + A341F66100F09854D4ADBA9DF2C1EF9BF7BE09634E351E78F011AC5CB600CFBE + B69B66B9162E5F98DC64014E5B5481F397E5A2E9841F1DBD2E8A8249324E52CE + F08EF661E85823223E1745844EA8242569FAD69663181D1EC5990480D96C1233 + 6C7A40B9A4A1A4404CA830D118C04470029A3215C281A4A0BB6422351D095232 + 95DA63342495F35239D0916AB35F381F6ECA1F6AB90AB32AB269D2C4D03DE040 + 5E968E22701C5EA2946C9B81247510AB1695A0F148075E7AE945B8260789A2A4 + B50AEEF010C2426784C1688391403198ED62B148468A309592B1FB1F6BDCF2F4 + 55039D078FA4D9E354B594FA67401034A437E7949F7FF5D7B69555D5953FF7D8 + B731353180C5675C8B9F3FFC20DED9DB8A2C5240439344395A2BAA2A4A505260 + 423092C4E0881381708828458DE18E432202E424F1D898E958A66A5470BB7C68 + 3CD088B97366D3EF568890970A393211C8FCA99C40B026B3609315E1F9ED7F86 + 2DD742C05B40AC22E88E6F2D4347020CFA54C7E64FA685D6AB0748221BCF998B + ECB202D4971810892571A8DD417C1F40697116F6351C416DA9159D3D13A4CAB2 + B1784E01F61CECC0CB0444C03D22C631254924215145231A0F0E4D1096BB3AA3 + 9540C92150725805EED8B3E1F7D7791CC3995AC84C203E9096641FF0B56967BC + EAFC2FFCE6E26BBEFCB51D6FBF88AEB646F4B537D08CB0E18E7B1F4249E51CE2 + ECB0A09B716788548F55AC2318F52AF17519F1EB00CDFEE18EC3020C36641A95 + 92062B09357DAFEB442F19B028962C9E2FA8E5E4A5CAA62F85EE1B45A884C968 + C4CE135BD0DFD38FCAAA1AB83C11929B7AF17CFCF3B274FAE27505F623716E0E + 4BA845095C956783FECCB9C82BC9160B3AAC82A2E409B4444D0692CB470FB760 + C1AC026CDC76146B56D66356590E366C6F42C3AEED8806A7E81A796D2372720C + 53D23F1C2552439AD421A82637ADD11A1E397660C37DE4B4E5F888658D0F0241 + 2A53572F3EE35B3F7868E39B2F3EADDFB6E905D42C381B93235D704F0EA17AFE + D9B8F12BDF873F9CC0ACF25C740DBA85CA604FC07D43290A7FE7F830DA766D10 + 9652AD96383E41894DAFD3C0E7F1637C620AB5D5E534983AB1562CE674663557 + 12EA5026742849CE82DFEC803B328E96A6364A13E484B3F230E50AC06EB78A08 + 900B7DAF906E8840E1B64ABE1E554C0B5D40072501A05F330732BA8E643CDDEB + 4A08E7645B313E3E01452C2864F2F686762C3F6D9EA8061F3CD884F1E17EFA79 + 3272613762610F19BA90F8BD53878EA3859FB7B0AA3EEC758E7F8180780327AB + ADFF909664EFF37F71F72A8DD178D7771F7E7DA4B7E5EC179EFB3D3334ECF9A5 + 2828AD435BE306A2090D2EB9E1DB98B7EC1CE257336A2A0B70A06540CC8C2C9B + 0949998AA2E630BA0FEE149A5F4DFC1F2387CB9D432C6B7B7B87505C90478348 + D41297560C6534782999F411223092B0C78A6033E4A13FD401AD4106A7C343B2 + B51DC585254214A45272588812C5C0CB6442C767BC033F077FA64B50C484B450 + 956543BDAA5A7818A34E4D92D5277EAE20CF8C63AD9DA8A39CB16567131C531E + 02395B28A1C9F17102877D4314F16880EEC123C048448362957066E472399C99 + 20A7A8EAF8D186B7AEF43A47FAD3E3796AD9FB0341780F0DADBDE48B77565596 + 3FFED4EF7F2BB890CBC4D5F5AB60CD2921DBBF1ECE893EE497D5E38BF73C88BC + 8232AC985F8C03AD43F0F84328C8B12021406846E7FE2D04829E0628259AB0F2 + F372303A3645B357417980D78413D3372140C8CC02364694908B933588AAA218 + 8E7743CFAE9CA46B6F770F25522F8A488D0D0D8D5342B7527ED04BD190064184 + 337D2E00A5FFE9E23A68A33AC86BF29073563D09091D09075EB9331055464503 + 817BD241E068F1F6BBFB842FE084CC4BA05151CE8E8B953B062331038C38B9F2 + 54223E3D824C513A83851ED6751D4D5B6E0F781D193AFA40D9FA7E20248B2BE7 + 95AFBDE0EA6D6FBDFE4AB9DFE7269ED3A076C16A5C70F9F5A4BBC7B17DE33A1C + 3FB44184E059577C15D7DCF815D1506523E978BCDF85D2421B254E399C532EB4 + EE781DF1901F91805F2465D6E1E3E34ED454149372E2DC91985643A9A44C3CA7 + 588BE6880967A1D85049E6AC0BE1A44700C70B412C0B3BDB8FC362368BAF8D11 + A8D9393990F32A1E38296BC4F528449A482096224F1157439F324291A0BC4409 + 58596C83CA4EC93B9FE4A74145771E45D027F5BD1E3ED44A662D2C18D1E7F18A + 19CE2B6F52793B9E2EE671899B1B03180CA22A01466C3A89ABE85AE8E33D9DCD + DB9EC0C9B5E9F775D3B25300E0F243EAA26BBFF69BAEAEEEAFF69CE814EB0125 + 15B3B074D5D938E7FC8B918C05F0EC537FC4CEF57FA6993D44CAA010777CEF51 + 2C3C6D39CC9A14263D214AC80A3123C37119DC4327D0BCFD2D02C1078BCD4E03 + E6441649C7A2021B19A784304FC2F30AF521131D7210554C398A1335A21ED597 + E8A49F21EF9192C428D7A3A6269D246D89D20A8B3032344683908029379F2030 + C390E2C85322A20E8B8F25B925A2E178ACD381007C0829FD525F1279133D299B + 05672E41D4447294A2DDE970A18704035F3F2F52B191F4B9DDC21B24C47AB404 + 0253A82871331894273879C7426E0285927822224AE014112E8F73F4F291BED6 + 8390EA4BEF9B1F66FA01918CEB979EB7D69E3F674373D3618DD16C4065CD2C4A + 704ACCA99F87ABAEB91A05760DB66CDD85DFFEEA57E869DD42CF1D43FD8A2BF0 + CDFB1E1195D11CAB06217AA9B1A90082E138A91A2D5A77BD83D1AE161A388FE0 + CCB2A22C411D7C63C270C9A4C14F48054C91577431AB50454E8D1393B1219AE1 + 2989B6D2DCCF83343CD02FE695D96444776737992B32586CAC92F491FEFA945E + D8F26D5858B410326D8A666E027EA71F1428D018359051B48EF58DC3119BC019 + 4B97419E6F41D8A246C39163A2CD524B34CA8E9857F84201BFD49D114FA46929 + 2E269158F4111112150A2A11E5663206C32BDA67F446EBBEFECE0357FB3D5399 + 0D147F474B33F340CA9255689C7FFA356F4D8C39CEE0502C282E11B32E4A2FA0 + A359F3952FDF8C05B565A4EFA7F0DD1FFE12DBDF780E91F0B808BDCFDEF920AE + BDE13AE8483116E69A498B8FD1C5A56876F868D012182169B967F346CCA9B0C2 + 44D2321C4B4945B29454844BD0CF12CB108D49839D152A86DD948313A14E2415 + 7EC1EDC298A5F307D79C783974646010365B16FC946F46868661B0E5D2E0E5C0 + 92B020A9A2E737CBB1B87221F4940334063522FE28DCA4E4F266E72216880B7A + 6BE86FC01C5B05EA17CE46DCA446070D7A737B97A84D29E40A414BBCA0132660 + 92E94D2B4C4F0C4442AC359CA429F1B57844E48A38E58C1881E1778F3C4A02E7 + DFF0DEB587E988C8C851918C979D7BE35D2A7DF663DC6268A750644322EAEBF4 + 5DAF37804B2E3C0B77DC7819C86BE13B3F79027FFDCD1FE0F70F12A41E14D72C + C13DF7FD0AF3EA6789FECE5107252F4ABA218F031672B71BDEDC851A92A3B539 + 41B4341E1220A4451181C4955702811E0C822AA643A9BC0601590863E8852295 + 1097C840C867A4311E20F79493E8C22B3A3406BBBBE97A88D7ED0530CAB28998 + 8C701B3C5854BB8800B589C14C500EF23BFCC82ECF16AD30EC297A49C4F8935E + 5C7BD90564CE93705184340D3B888AC6885AE3D3E4CDE5949818E884F83C998C + 8B689E06244353D360C484A24A10DA1303476E1A1F687D899E46756A7E90A5D1 + 214FB0A8B27EF9153BA39168919674BC500649C921B2CA604EBDE6F2B371D5F9 + 8BC95D8EE0873F7F063B5F7D0701E7383D1BA9047871DE67BF8A3BBEF175D1AC + CB5D13DC5AA851C9D07AB4951EC7F1A5DBBE48EA288B28A013ED07F660B07740 + D01097C093192A22256609E5A150578A41D0E0241C0482E41B32D1309DC86492 + B31E1F1E11CD058CEA60F70970E143A32B842D9585902E82F2BC0A54569742A1 + 56121D2AE1E89E12208872844A4114A6C5B6235B71F1D28B503C3B0B83834E78 + 4D6674748EC2E59F845C154F4B6649D4C4630931C04CA55C61654004B58A4994 + 100A8AE5AD00832244A1646F12EA6F6B78E10AAF73B8E39488480A2A5293005F + 7EC12DBFB76615DD2AA4995C4A17BC56C0F5FDB2D22294128FABE529F4F50FE1 + 4053078E3577C0393A8EA82780A8CF47CFE840DDCA35B8E4733761F9F245707B + 494753587A3D1E8A82CD58B27219E6CD9F2F06B3BC248B423580C3FB0EE2F8E1 + C30812BDF180B0B090279442962A48A5F4463BE90B112892520E90A532C509CA + 2329F97434840241B828A1EA3446D2F5C3989818A0EBD1C292CCA328231A2A35 + 60D59295521E2020A77A9CB0E69B054571F9DD623763F7A13DA89A558E15CB4E + C304E58991091F0C734AD137388AC18921F245120AC282B0E7A73CC0053CC19E + A93499A464225F483D4C11A2D790F0186C608D24A3C9E46E3CBAEBCF5FF04C8D + 8467C8D6046FF496CD5B79C50555F56BDE88C7C22A512AA0D1E0E29AD85740AF + CA8B201EB7073E9F5F947393F422BCA8A2D168C45A80926427FFBC8EA285CBBB + E75E7C3E49461B025E3FB66FDD29D69F172C5D82B08B7C4296115A995406763A + 4318A668700C7413286131D0CA941ABAA401296502E14490063B3DEB53D3056B + 488B2D122848BB65A7C349B30E08A482181D1F40C2198522A2E19E60A4B26458 + 306F31CC744D268B0DCE412FE53A9A60F97618AC06E417E5C0131A446F4F1F96 + 2E3C1BAE093FFA0EF5C0506645DDE573B0734F17469D1390AB79E141962EE829 + C5E6C668982BB9A9F4C485600EA6A268342EFA96A234D9B8E138AFA898B7D563 + F0F8FE07F66E7CFC61CA2D99225F5C3677D9C5F5E575AB9E5028F5A7339F4DAF + 22112D480BDE10094AD4CEE98539B4F873B92833633A4C45B5913E7203564959 + 19CE39EF4C343735E348E3119C7EE6E9708C8C23D8739CDC6B58ACB2F1CFF25A + 742C9612E56A919CF87979445352E5529ECE03A9B4919BD6D4299CA425564BF4 + 3B5C0609FAC3882993244283B006AC5086790285A67B4C391FA4883212B2A458 + 09D41B4CB0E6E5A3A0241F25253A72CA6E1A382DF905BA2E9278348CA85E528A + 045D4F6BFB10921A9ABC5CD595C9441E5398B48818E93A4D76A9534426994CA6 + 2B4ED45CEE8ED0E4E226039D5E839ABA7914A963A1A677FF74FD91868DD34D64 + B26BBEF25F3FA4DFFE5122495310E9D52A99548D94C9D2E503AE8B24A5171008 + C964D3C070B95914E668B6F32ECD20514382C2D0CEAD286D6DE49EF3A153A811 + 9820B9986B25EEA31C40929723CCE50E88CD23DC0AC93721DD88B452C6CF8D99 + 83FF4120A409CAE574937A2149ACD58A0A6D3CCEEA29BD0537B346CCF7C1CDC8 + AC647891462CEC2BA0D51B450B0E2F3CF1220E17F97866F31C542464C8CFD6C3 + E50A62C2E911F528A1D2783D837C51BC10C83BF32C044810980C4A312EFE408C + 26187779471126D3170CFAC01BE1E72D598CDCC242F41F6FEBD8FAC27F5ED1D1 + 7A6040DCC167EF7A7C13DDF00569B29B4E783CB8D200ABA4457692955C3A3692 + 17B098F43010B2BC62A64EB7B310887867EB3E8C8C4E6262A00D61C718B2F506 + D491221AE81A839A06C5969F85982229D6770508AE80B8518E3051FCE3BDCAE9 + 49204A0EB299839FAE05A532FBFC24B9CA3DAEA14098E8D287E27C2B2A491919 + A0C794C1016F82CB0B099A91A4D208205EA58B461282B6C4A44A66785E2166B6 + 2C29812C225EC15E5C2E0CA481EED3A4576178C44BEA282AAE91A880A222859C + FC12947FFE6CBAA718423EB76874F6066318190F887E5706856B678944144594 + 5BB3727389802278F385E75F7DF5A91FDDC2895376C3B79EDC8F947CD9749B41 + FA224C6633494B7E9804001AAD5AF0206FE8661BCFB9817345241213B36D7864 + 0293E4627906B71FDE02CF400F6657D7C14E21EF1E9DA2C8B0C1926D454C1E87 + 8A72084F4C2E29F33C16379D89AC4CED270D424692BE078C7434F0CFB25C9C9C + 708985999AE25C28036684E9672755FD3098F9B9145066AAB32969F0B95EC527 + 083020E130DD4394972FF99EE24262B2EA1172387D1D9C3EAD06A3503F815050 + 4C187EC20449F10292BFE6D5B3E11B1B8263744294666890E0247518203078BA + 70779F3DC78ABCFC1C141566A3AE2A8F8CAB0B0FFDECE18776BFF5C4FDB22F7C + F7994D747D17CC2C62F08D66A280730037ECF27A2FA3CCB394BBE578C15E2D76 + DC27E10F4610A25936E58DC1EB1AC391BDEB112295525250494AA88212B20736 + AD15D66C1BA2949479D0F9661D0E9F284B4B20C8A5D9C751C2D7C0FF8714157F + 07422AD3962287DBE915CDC3F53505888593E4DACBA0C9D3E3E0C13DC82A548B + E54E094C095C8E3045DA8409E0214B6F1CE136989400872716535B284C132D12 + 4F733C0B7C8D58170F722D8CC063A1A929AF82C3A2C12499461E239E5DC14008 + 2AA2C5C54BE7A2A2D82E9A93DD1E2F1C6E3F9CE4694C641A8B8BF3D033E28B74 + 346DB95E76ED571FBBD760B63D20932975E9F340DEF3102B482A693146A1946E + 842F9E5BDB4B0B6CB8726D9DF8FF6FFFB60F3D835338D1B21B93233DF08DF4C2 + AC31A1BA7A1172CC16282329524F86E948E065CCC9498F58F8E1051E018042CA + 0DF2192569B9ECD4C14F3B6619D3104BE000AA4BB3C442FEF0800773EA97A06C + 5505B6BEF436C2B249D8780627533322482649DDF4738BB508B95C781B5EEF50 + A65F9F7F8EE98A3B454214314C9D213F011408608C667D381C41501E854E9D8F + A12CB568FF576934D34ACE6AB762F9CA055831AF14457944901AB918BF515704 + 1B77B5A1B1B159F8288BDDD6202B28AFAF5E7EFECD3FCB2DACB98E794B92A894 + B28501915C6C22DD9B29668EC8175262E68BFCF19DE7C062D4E2B72F1C44F3E1 + FD18E96981D6684270620481D141E4E6546076D55CE4D3D742B130E2941378E6 + 330D381C1ED16AC21257914EF2028CF7CC58B9A40532EBC8296972300D39A7BC + B09BF50204873B088F3388EA39B3B1F2BA33D0D9D085FDBBB6C19AAB169E62BA + 312613510C72FAF9124949886878D38A4A31BD6E2DD5B740B92429926D2444F4 + 15F063CA31254CD860649426971AB6E2221CF70E21E021999D52A2A8A612EA2C + 3358857259DB66B3404F919120C99A4C46E0749119A468516B75C82E281CE12B + D254D5AF3EFDFCCFFDFBAB8978C43C5DD04FCF1CCE5D51D2C3BE505CF0A9329D + 38B9A278DE8A2ADC7EED62AC7BBB035B7734A1EDD05EBA383F2AEA9723EE71A0 + 6BDF5628497D9415CDC2E2DA59A4FBA3F09172E27A4D502453BF70BAD280C844 + 1F9094B42171B9420221536B14B4929406D3EF0F5298C7895F7385DB9E221044 + 5A8BC95059558BC2AA12F4B7F5C049FA3FA98D9DA2B2D2CE9BBBB0C331D1ACC6 + 1160D0AA0410124DC945393C4414E7F18609F020F272CCF4FF28F795C1C0AB83 + 6A37BAA606A1F21960C9B2C03B368520516C9224F1714CC2111C2761E0167D59 + 5A8359B4D128547A781D0E8C0FF4A2A26E196A172FFA0D5F91951C9DFAD29B7F + F69FA5B396DEC4FC755226A595121B360262D419115FE32E87E25C3D7E74C719 + 1899F463FDB676ECD9B287F4B50346AB11752BCEC4C831524A6D471025856052 + 19B17CE122BA080D1C7EAF5898E1B613BF3F247A5741039B4CF37C46AA72818E + 41E0D697F7D010CD6AD6DFDC2B54906D146B188EA990C84D72990410D91F18D5 + 26E8E5640C3962B551A28E30F90352469493E2F4A0D8A3E74812B74BF7A82223 + A627CA4D913B5488A49B100D668EF1104606DC501A1462D9B67F92922F39739D + 4147C95683DE91E3181E1A831124081221F8556ED86394FB48453A9293F04E8D + 89E608DE072755B221F652E497CEC19CA5171F69DCFAEC8D7C67DCCEAC2AAD59 + 32E7CADB1E7C956ED3367363E2B45FA047F728F16238413A1FB8E7F3A7612ECD + C2F53B3AB0E7DDC32443876840E598B5B48E0C5001BAF7BF0DCF502F02A4AF55 + 1496F367D523278F682A19164AC44FEE9B1D277746F0624E38C68530A99341E2 + 6585E84DCA8090F1034C439C38759404CBF22DF004789F592CBD9A76F2540456 + 703CEB0D340B2DE4FC25C3C332540DB7DA8B802A229647259FA2A228D043ABD0 + 80B5943EA183D6A28697C09E4AF9E89E23282FCBC360F724A6BAFDD0A4B4A2AF + 361A72E2C4403BE4C684D833E199F2C0A772C096B06032158023E5469CD4146F + 5651D3351495CD4279ED121456D4C39657EA7DEBE99F7CA5FBD89E06BE670B3D + C4555E79CBFD3F9ABDF0ACAFB289C92C34F2F8F38C7405E238DAEF174EF09295 + E5B8ED9A25686C1DC29E3D4771B4B18DC893A2A3AA0C85352582C3277BDAE0E8 + 6C41D0E5273E4BA2AAA41A668B165A935C2810275D30873E7B0E1E40EE07F287 + E2629147E404B942A80D56669948E0F575BE597EFEA23CA30085DB2C65E9029F + 7C469786F8372913D7CE394BD00F459C3CAEA1596F408A68C14966519DAB829A + 8CA546470AD0A810FC2BA308F14D84D0D33B8E298F0F39150678822E4C4C38A1 + 48D2CFABB404401063C303443D095138E4CE722581CC752E96B42DC91EB8135E + 64E7E663F6BC65A89EBF9228AB8884885AAC5FEDDEF08747F66EFCE3B3A26C41 + FF18D320C88ACAEB6ABEF0CD5FBF48F22D5F6C9448EB744EC487DB3CE81E0B62 + 7685193FFCCA1A4107DCB9B6636B0349C338677954D5CFCECC43C1F3AEAE0E38 + 7BBBE1191F437E4111993A2572B28CA20D9E4D9D9EA22097FEAFA6010F10002E + 5F54D2D6BCD0C39DDAC4D1AA744EE0E713DB970824A620AB490BAF37224CA21C + EF75D7D3519C367716A34672E3048222AE434443C6CD181335A218B7DF68B80C + 4311219231AF6D2BE07593E1EA7752C46961B71B30DCEF804EA317AB71E16090 + 92F3288917FEEDB858EA4CA6E2340FE3622F34EF71F0575851B77C35CA672F80 + 466FA2680D8B4663254566CFB1864DEB9FF9E94FA29120F3935F9606805BF734 + 443BC92BBFF4C3EF2F597DD93722E1A0184C96A2936311ECD93101854E86BBBE + B60CF36617A0EBC430B61000BCB98F29A5AAAE8E9CB54E6876914BF82FD7FBFB + 7B11774F891DFA3EA78BF8544E7252430AC14F332725929D5A14C35270784370 + 93C96167AB92A96024579E69FA654398220034F4F5821CA358B563B325CF8888 + D4496397A967C945A542263A2B346A2E4710BD25F4245D8986E4119A3C940B52 + 2A214D45194621952B3CE47B46469C70917028ADB163786282829940D228100C + F2D6DE299AFC34F0BC0EC20D61F4919BCA42C42059450598B362394AE7D48B59 + CF879E700F1617F4B4046034EC1DF8D3235FB9DBED181E4E5752BDB234005C48 + 6291ABCA2BAE2AB9F3DFFEF012E5EA62FE196E056CD83A84BE4E0F2EBCBA1657 + 5E331F3E1AAC3D7B8FA2EB781FDD9C0C7945F9147679A27A785258A5EB9D4413 + D5D5C58885A2F090A3F6FB7C709C38280E8C92D3851759AD64EBD5F0C58398A4 + EFB96876FB89E33971F2722997253828B972CB345468378B5618062133DB1930 + D131CD45C77414F04612B67D5C37E2936178630A97C98D510BF7D421A14AC04B + 923949493A25E7894380AA52F00568967B82181C98444949B6A88BF93CE40728 + 5F84FC014CFA2791203F203358894764925FE0D309E83EE62F5E2426236F1BE3 + 6347992D6209C9ECB1F9CCCBCB8A3CFF7FEFFBB7237BDED8911EA55026121800 + 55FA230392BAE64B3FB8E7F4733FF3035E3F1E1D7461CB1BC7505357882FDCB6 + 9AA49996A26008BBF7B6C06E35C0449CCE3B34DF4303990A8858B64C626E2D6F + CE30C0E1A2D7A401EB3AD480FE237BA1E11647B58ECC1C3122F1F144C08BF171 + 1F25DBA81878834672BB9CC01900DED36021605856B242132E38253FD9149C9A + E125D2FF8F71BB0EBD8E59AF25EA8951A2F5D2EC4D88842FE51FC999AB8441A3 + 67B2E4A0A36D1C052585A824E7DDB6AF8528518D889700083B11A36BD215D780 + 3B75027EBF6804AB9E5383BA05F34521904FB4646038E1C7C45A7442805133AB + 123B363DF7D44B4F3EF038A4459D70FA214050A61FAA3408CAC2D2EAC2BB7FF4 + E43AA3C556F9CEEBDBE07404F0B95B2E464545BED89DB973F751B19A949B6715 + 053D365F29C9514D573633656EFE535F574A1464C0D0A857F4FF37EF3F80B6B7 + DE426D59158114869D0668CD656B609A5584A6D661F40EBB49B52AA19385D1B2 + 77B7385A2742619D6B3772C3A1282D33B8A919A74B64B63689A2474A3ABF821F + 0A029D1D79B6DE0A43C20487D2497414849666783C269DADA7127DA56A84C9D3 + C88BE6E058CB006EBBF3224C8C39B177DD6B088DBB9162E74C464B93958F708E + 4D548BB373B368F0EB919593431383555A44D4A562BCA813938E6D60408A8BF3 + 110D4E1E7AF0DEEBBF17F439B94F95C3389806219859DE54A481D0A48148DE78 + D7035F2DA99CFBE3AD6FBC8AB32EBA128B4E5B28DC640749D1F1716EE2B2891E + 1DAE2DF108C8A7F7199DD4F44C117C83F3E696097E77FB6220BA25101AB0E937 + 4F60E5FCE5529B7B2C8A0B6FB810A52BE7A2B563149DBD93907384649B11F47A + E076BA61484530D6DE2E8A64DC21CD34436C2CAD7DF032634A92A43C1942F130 + B476130C361BDCBC239306235F9383A24019FC0A179CCA51413DBC11A5AABE16 + 65B32B11482948F393E779652F2EBB62054E5BBD004D87BBD0F8E22B883B0382 + DEC2F4BC727B2EE4E585A89E558192CAB274B3590A93533EE27EF22F2CB5D35D + 19EC677464EA6AAAF29C3FF9FAF5F7F41E6F3A9E9E33C134158968C82CF4CBD3 + 204CE786ACDCA2FC05CBCE59575E595BB5FADCCB45C12E4823383C3A259ED866 + D18B01E08D1FCC77EC809338B97D49B86D9A657A9D0A73E794096EE56F4DBAE3 + 686D3A88977EFE0B94582889CDAF438CD4C692F357A16ACD3CF40F38303CE681 + C16215DB6D5911F19EB8F2B22C02601CCD1B77C0D1372C960C65A94C2D4872B8 + B1641C7EBABFA28575A898379F065A2DCEC8E0C96022EE3FB4E95D516E4811FF + F3012732BAFDF33F73394AE6CE4653FB285EFFDB56E8E935BFF99DEB70B47D18 + 278EF760A0E10062131EE1D443D110F289F3E75DB65634237B7D211473A31B45 + 5C47D718429188506FF1F41227EFF859B1B436F9E7C71F7C68FDBADFBD9A1EE3 + D08C07831099D9F2A23C251A52A79F73E56DB7DEF3C00332B1909112A76F71F2 + E359CD0BE426F1512906D8CFA68992A542A59856EA5C29359B75985D5520254B + 4AF244E7E42D0E60D3AF1F47643288DA79754433D9C8ABAF40F1B239344849B1 + ACEA21F5C655DB2099C3B2E21C9ACD5152272A0449B737AEDB4026D02B6D1449 + A4C43A849294DBA87F0A795595587CDEF922A7B0A791188BE42EDDF3F657D741 + 1E958B1306C2510F141139CEBFEE0AC46DF9D8BAE900F66C3D887FBBEF46F0B9 + 7DEDC707459171605F2342439350CAD45091B29B7BE66AE42F5F2894538E4D87 + 3935F9686C19461F25729E744C457CDF7EA2CFC5F595E86CD9F3FACF7E70C77F + A4126C28103D1500FEDA4C1032D1A04A03A12E2AADB2FEE0E1A7FE66B3E7CE0B + F266BA84E468B97D91651F6B74AEA5E8448BB98E544D44E87B59BA17949BA3B2 + 6C461AC42C41132CF9B55A2D9E7DEE651C7E753DA2235ED2CD4A2C5CBA04058B + 6723453735AF6E16A99310A932927734936C94FC0D3A757AE910420E1EDF7B10 + 9D3B1B29B173714E416A8788499E14035CB57605ACB3CA443264BE175D107435 + DA54180DEB5F239F4093C76A819F548E8A3E5F76D5D5187447F1FCEF5EC64597 + ACC2E215F5E8ED1915D1CD7C7E62E75E2426DCB05BECF43A31549C4EA66BCE2C + 71DCC2D9A71563D419C6F67D3D0230A621062148E3509063459631D679D7972E + FFBAC739310569517F2600E13428F1533BF066E6065197FDFCEDDFB9E1AA1BEE + FC85DF2B1D1CCE5C6C358BAAB7D80D2F1662C80FF0D742D18438E646A3928B9E + 22AEC7F33EE13C7A70571D6B7A3E88F69DADBBF1D2A34FC24633719C38BBACAA + 02E7DFFA79D1A8C5656EDE64C22D88CCF36CEE44B9820694D72C146A1506DB8E + A365D30EA8924A68926AC495A440925168523AD45C7206B479F674A75C52F884 + 04AF43C77D38BCF94D61C4AC362B99C249A44272949F7901DEDEB8978C5C02F7 + 7CE70BE40FA6A4451F7A70A21D39740832A79F0CA5860C6500151409A69A2A2C + ADB108BFF2CABB27281FF8C59A3C03C0798185CA8A852581EF7FE3F6EF1CDABB + F9C00C399A7944D35110CF80807F100D2A7B769EFDE78FBFF4678B356709EFA4 + E13D5F1A9269E30EBF58F0B05975E424C9C152828DD28D1BB44AD2E57271DC8E + DB1F453ECD08AB592F0651DAB92F47FFB013BFFEF707617006498EFA68E68470 + F5B7EEC4AA8BD7605F4313F2F373495A2A60B7E9A5D2325D592024F5F9C8E906 + 07DB3B716CF32E325A0AE8E55A0489AA58EFEB147A545C7406D49494999BB94C + CE4B8BBC9A10743BD0B8E125D110CCB57EAF77027CD476CA568C867DADF8E14F + EF10AEDFE9F2093AE132BECD6EC140E3210C1DEA10DA3F14A61CB06225965F78 + 1A96CDB2E09DC611B49D7088FD79A2BB82C6274411B876E56C3CFBC7C77EFBF4 + E30FFD293DA6E153A28041C8EC6B4BCCF4F999EA97E254DF70FDCD777FF6865B + BFFD68241C921BF54A4C92640D33C55154984C1A3255FA6910F4041083C01D75 + 9E501C85B9364ACE6A4147E2A0298A9449770CAFFE711D9A5ED9285A63BA7A7A + B1E48AB5B8EEAEDBE19E7289C29ADE6480CDA4111ADFE90F8B419164B01C8EC1 + 111C5DFF2E25D604AC5A1365364AC8E4F00D4A236AAF5A8B38C94DFE7983C184 + DA72B3D8BA7B8464E78E579E8792A2476F3661647C04316F0C078F4FE2DA9BAE + C0E5D79C83F13197D4AA4FA0D908486EE969DABC03838DC744C99D0DD8B2CBCF + C53537AC424B9713FB5AC6844FE008E063DF3CBE20562DACC0404FEB9EAFDD7A + CD0FE2D15064461EC85050E66BEF69FEC2FB4443060806419B9D9BAF7FE4B72F + 3D575A56769ACBC333372E6AEE7CA34603E5037AF05E614EA25C676217CDAD2C + BCAFAC84D403538CD84B4689CDA4230AF2C4B16BC33EBCFC1F8F232BD72ABAD6 + 94E579D0E69B70C699E7C29E974F3FA72483A5C6902320C400D21D1F9C58A686 + 46D1B2E15DA4827198947AA88C94C0E3448D490DE67DFE5271BA0C7772988C16 + 51EB62C5D374B40FBB5E5B471446668B40189B1841676327AC3575B8EF17DFA6 + 01E66DB951D1F9C1A7DA734E60B9D9FCF64E8A843631249C98BFF4CDCF226ACD + C6EEC3C3528F11B7B6D0C3EB0BA3B62A07B9A6D4C875D75EFAF5D181E37D69A7 + F4BE7900A7B441CE04211311F23408FC1015D6EB6FBCF3F23BBF79DF1363634E + 59A6D189F5B9D1A0A244AD86D5A813E506F144DC2E42DFE38D252505B6E9361A + 8E1003DDC804CDC0E63DED78E3913FD060B9B078F15C8CCA8857F32CB8E6BA2F + D22C75636E752EB22951737737B7544AADE9D26E42CFD82445C256240231D835 + 460241867022069DCA847CA223BDD12092A4CF1B154E9D7FC73D3186D66DAF11 + 082A9889769A0E1F444F731FEEFFE32398B560AEA8EA72CB0BEF63E3923AAF28 + F23DB452FE1A3DDC4E4A500B2DB9FACA33CE80978C1F9F38C394C7099937C6E4 + D9F538F3B4CAE4CD5FBAF547DB36FE75D30C577CAA1ACAECDA794F43304E0162 + 666E50A6A34165B1DA4C8FFEFE953F64E595AF89A5177E5803994CD2C92D2C57 + F91C0AB1FA950681555351BE4DC85BB138C46BB9444713AE305A771DC1C1BF6D + C1F0009F9FCA452123BEF8E3BBC92304D1767C0879D9265496D8C556DB403499 + 6E02105BEFC93D07D1F2FA4628025158D47A04E511114D7A9519B33E73013434 + 609CC087479C982210591184BD4EF41ED84A2E5C2B24F0860D9B509E938B7F7F + FC61280C46211AD8780ADA13555C1901A845DB8EFD947F1A442EF211EF97AD59 + 034B591162A24B232E9A1C98362F5F5B8BFB7FFEEBBFFDE2FE6F3C9AF6EF91F7 + C9039928F8BBD678BC0F10194A52CCF00DF8CCE76FBBE88EBB7EFCFB7038CC9D + 9982928C46B5E05C6E06F006A2D34D5B224A8C1AB18B3ED330C600F1EF38DC21 + B4371DC3A1759BE1987262A87F1097DFFE05549CB5521CB5C9B39E1752C466C2 + 14292E454A9CEEA8552B44EF1337088FEE3B0825A9280325E3883A2A2A7966AD + 158B6EBA9C4C5B4AE4151F99297F503291618F07A3CDBB60D3E8D133E0C6C050 + 07562D9A874B6FBF09D94505424DC5D3FB2544C190CFC5233A3AF6E63E0C92D1 + 5510787CCA7DE9798B61AD2D27271F12D5DE826C3DCE5F598E9737EC69BEF1FA + 4BBF130BB93DE9D99E19FCD0FBE481BFDB24F27E2060060819A5A425A5A17EF2 + 2F9B9ECA2DA8388B9B617947A68112B591B89B2F9E0B6B99EE08E671EE6ACBE1 + 7A4FEA64518F4170D1E0F4770FA37BD741BCFAE66BB0E564E1B66F7D1B8DFD4E + D12EC2ED2449A1B94F1E95191767968684FE0F73FB242573752445EA488FA89A + E42F45982D2B0FF96B974347495DC55BB3944A61E8789F846F6A122347B623E4 + 8860D2194265B501D99433AEB8ED8BC82E2910D58088E8474A8A5CC0D7CC93A1 + 79F3764C1C3D012DBD4E381E221FB28A246A05B4E4BAAB8B2DA829B5A0A3CFE5 + BEF8D2CBEEED3DB6A7F97DE4680680CC2E9DCCB9AAEFBB67EDC372838E7FF1B2 + ABAE3FF7073F7DEC69AFD7AB32E855E2E81CB34123006065219767404821CB6A + 84C5AC4FEF43C374BF69981767686076EC69C0630F3E860B979D07FBAA85E492 + 93A2FECECB97BC152999DE1B96E45673A2C01849C424093A3EADD179B8093187 + 975CAF02BE64589409E40A0DBC76DE659F24074D2A8D22D14C9EC09A952536B9 + 8C1EDD0FDFB80FF5F3ABE97B2961D66EFCD6579157609A1E197A5951260F527E + 239D81C6CDBBD1F1CE3E1835ACC262587CF979987B5A354A73F414FD72F84249 + 7CEEA6BB1E59FFE2FF5D97BEC54C023E9586666E0CF950104ECD0D33A3416332 + 5BD4BFF9C38B8FD7CC5E70915211179CCDE71749E5E7D4F433A6D22098286167 + 40C87C8FEBFB6E6F003FFD8FDFA19C9CA8DD5881516D52C8DA20458989078F24 + 2FB75A722EE028E25EFF28D73CE8922A6755A1F9D5371124CEA77489A02C2C16 + 59ACB61C14AE5924DED022180C90210B89F398DC41FA9EC582D0401BBC2393E8 + 1F1DA46B0DC3A8D0A27CF962E49696228BCC6176B68DBC49162C566937919EAE + DD333A8586CDEFA0AFB70B0B16D7E3B3375D4779EDE4403DF85F2FBCFDC37B6F + FAA9E83696667DA63A3A33117FE42DB4A7FE99E91B32C53D8E065C7EF5F56BEE + 7BF0D77FE1C35BF8AD57C42EC740E4BDCFCA20D8CC2239A7908E049954E0D392 + 9778FAF9B7D1DBDB8F8B2FBB107B8E0E8925D218E5818AB21C1A10A3B44B2875 + 725F5B327D0014F3363BE9CE77762040499DE928A48872E72166CDA9C50AD2FC + D2C1B720E328C7897E17B6EDEF22A80238B17F3BB4A4CADFDDB3138EF1311853 + 1AC4482E8F267D88AAE2E2DC25BDD10C7B7696381992D7A2CDB66CCA6F317886 + 065066AD403937321466233F37970C64A4EF27DFBDF5EB2EE974C8F72B4B4C1B + 32FC835DFD1FE5A89D537383862845F5D29BEF3EB67CD9B2CB3871B2C30CF02C + 9521BD6740FAC39BCAD51AE574AB3BBFBC56AB404BFB00FEF4FC7A5C73F93968 + EDF38B5A0BBBCDB93505429124C48E97A41870B12B86F5781A085EC7E0D5BAEE + ED7BE0A3BCA2A1BF7E8A0419DD63EDBC795874FD45D21B2011106ACA139BB636 + A38B5CB83C3C456E39098D5145F92180B6BDCDE42BA290112D8ED07839521E51 + B5CDCE3690CB3789AD5023230E8C92814B100805B242E8625A9C881F438A66DF + FC9557C7A6463BBFDF73744B66956CA61C8DCC88820F3D84EA1F8190F9FEA9A5 + 6EE1A22FBAF4CAD54F3FF3C27394F6746CD559294855ECF43A177DCE2B6F8A4C + B704776DD0C0F0C17FBF7EF235CCA92946426DC3E0A85B2C8B569652046419C5 + 420DBBCF70A639372101928988443ACBF7EDDE07EF8941BA180D020402835D51 + 3D0B75D75E28DA0DB9C0D8D93D84CDEB0F20D1D9010581692507CDB52B952E85 + A6E62398181E23A5A581366244565D15F296CE46415D36EC94EB78A7CDE8C494 + 90CB7E5F804488262DBD233059B23139D2F9D4EEF5BF7B2295120AF3FD68288A + 8F78EED1878190A1A5CCE24FC6456B0C06A3FCA9E75EFCD545175C70ADDBEB13 + 49990B794AA5623A3973C93BDDB224FEF0DBB1BCB2E12046C86CCD9D5B8BC663 + 2362B672F2AE2ACB153FC855597F402A53F0CC4F883D73524FAC68CC4D88ED9E + 183A7C049347DAA14D11D128C2A234925F5281D957914FA03CC566EACDF5FB11 + A5C419397E98FC415C7475F0365AB94987A44783A1033D082483285E3E1F35E7 + AEA44901CA1D0A024B2506DC478EBC7FD8837DDB77C1353922DE672119F3A2A4 + 6676E3A16DCF7E2FE8E37E1E4137A134089908F84039FACF829049D233730303 + 213FEFC24B163DFBD7175F8C45E3FA4432DD44A5930A78DCCC251AB7D2BFCC34 + D4DE3586D73737E2ACD3E7634FF370FAC87D056AAB0B8553E5D3853961737B39 + CF78564991A8D45E6E328AAE1CA98B829CF8D09643986C3B01A55C85948A192F + 01ADC18EEACF9D031D51DA9EDDCD38D1ED828DB8DB98F4A324478D80C325F652 + 2BF36CC8CE29C3BED7B7A0B5E7282EBCF946B1158097509572F2377A85D80EE6 + 0FC429D745D1B86B2F1CA3C30878C7505C5EEC9C1C6ABA7BA0EB70677A7C66AE + 929D2A473FD259781F15844C44642AAC62058E1CA6EAC55736FC7CCD19677F2E + 4CF251EC5B23C9CA954FB6FDA2718B4F6A51CA4459FB4F2F37604E5501062648 + ABBB0264F214A828CD463625621E74072F11120D7134A544637252140579BD96 + 4F8BE468E0A8E09CD0FAF2464468966AE4A48F9426F853BC515D8DB9B75C81E1 + 5107B66F3B0A5B5E89E85D5ABCA41C2BEA728401DCD33C0A9F274889578D91E1 + 61BCF3E69B38FBFC4BE8F975E20C8B64FAD8CD0C85F676F5E1445B3B4201DEF2 + 244BA56223F7771C7AFB4DFCE3EAE807CAD17F168499D170AA6F909D77FE850B + FEBAEEB575C964C2CC9CAD10472A48256B757A958DD7175EDFD62EDA156D7633 + F6B78CC16AD6500234A230DF2A22C6E9F6C1E30D0A83150A49B5A264BA68C79F + F3423CEF0C62BA0A900BEED9BD9B24E708C94C23A20ADEA60AD8745928BCE23C + BCB3F5007181599C5A5C575B80A50B0A705A951963CE30B6358D617C9C92B41C + 6275B061C72EF1661B767B4E7AB3785CB4D97089646C641C1DADC7C5A1B5A954 + 187939AAD79B763EF770381898599698E98A336AE803E5E8BF0242261266E606 + 564A3AB54A9DFAEBBA571EBAE0A24B6E0A0602E94D1D32D1C228ED6B90A37BC8 + 8D3D870730AB32073B9B8645612F2F4B8FA27C0B8C061D857C58AC5DF3522997 + 0F78B148E484A4B44E1D4F9F89C7954DAF3F28A264FC4813BCC7BB61909B84BC + 34130D9A6C85E8233FD03BE08525BB004505169CB1BA1AF3CA4DA8CAD3A17722 + 8C9DCD9304C2A4B4E99CA2646C640C1EB7579C3A1F0A4AE0734EE3B70EE8A128 + E0B3B313E4940B8B6CC7DBF73DFF2D97838CC63F5825C347CC03FF2C08A7E686 + 4C92969F75F639F5AFBFB5E94572ADD654BA0F854FFB552BA59314B7EEEF45AE + DD80A6AE49D1EE585E6416DB9BF8AD8099867A071D120DD1F424ED2DB62D2533 + B234993C99A4592971271E5D866F6414EEE39D484EFA49EDC860283421662CC6 + BEE383B0E654507ED0E3A20BE6A3AED282F26C9D28ABF78E87D0D13B258E90F6 + BABDD3C72538261C527F53FA8804DE13CDE7E3F14ED450D04700E4071C037BBF + D37E78DB81F464CC24E2F72B4B7C2A87D39E0A42060875FAA15151767D61DD2B + 3FBDE4F24B6FE1AE0B71BE1017F5D40AB4763BC44EC6716710CD5D0ED45565A1 + BCD00C9BD980147148FFB01BC3E31E0100EF8EE7E49C295B6724290FBE386125 + 914A7F4D02889B02C67B8F61F4C43EA2B752F4F96816AB72C4F170A79F310FAB + 57D4A0C4AE12C5C4A3BD5E38BD6151818D10F7736B3EBFD5171F1B3139E184CF + EB155E83FB4CBDF4399F50C6DEC5964511E2EAFCEDDECDCFFC8926D887AE927D + 5C003E2E08338198991B44C3D8DAB5E7CE7AE5B5D75F52A9D4593C88DC0AC3EB + 00FD236E3272716CDAD323123083504634C12D8E238E00BAFA251AE24575DEBD + 13133234311D0989F48EA1443A22D82DB377E0AF73595B290B607C7B1352DD4A + 34253BA128AF46555539AEBDEE3C14D8343091D2E91FF58986325E8089D2CCE7 + F39222A2592B44831F24CA09D08C0F8A37AEE0AFF37B7C1AB95B9C264932E2DA + B5F9F9FFF8F770389071C01F549EFED40F2CFFA068C8282551DC7BF5B537EFBB + E28A4BBFCC862C491EA67FD42378FDD5ADED084612983BBB0095C57614E59A11 + A28138D63521940EF33D2B974854DA09CFD254F471F2A9BC49A9A6244048A5A6 + 17F0793B17E713BD418DB64D7B317CB81DBE2C1D14D936DC74CB759835AB0446 + 8D4C14E27A86DC12C0E91DA7BCBF980FA6E543CAF9ED6278C33727DF90D84B10 + 16752A56617ABD7AB471CB1FEF19E9EFE84F0FF2CCC2DCFBAE927D5C00FE1910 + 4E8D86F7F886356BCEA8DDFAEEBBA49490D337EA128BE33B1A7B70B86D18B555 + 85E4920B504A2070F2EE1970882D4EBC3EC0CB8A62706271D1C3C93395072A9E + A19E0C082242140260EEDE305B49191178AFFFF509CA291192B6165C7AD565B8 + E092738823258D393AEE17AA8BB93F9AF61D7C361127618FCB2B3EE7A384B84A + CB6FE3122671C15D1DE44613BD875EFF61DBE1AD6FA727DC4C25742A0DFDB7BD + 89C5FB8190A92B09172D2759F1BB279FBEE7B65B6EFCDEF064002D5DE378735B + 1B8AF22CA8ACC843FDAC22511975D2E037B50D89990C717686948C4524C4A4BD + C5E280A79934C42DF784B7D16C9176DE8B625E029B5FFE03BA5B1BA137E7A07A + 761DBEFAED6F89756FB54A068F3F2ABA42B8092C03AC140911A29E18811F109B + BCF98029291A0234AA949B8CB9F09ED8F3FCEED77FFB289FD682BF2F4FCF94A3 + 1FD90F7C9220CC04220342A67D5263365BF57FFAF39FBE51BBF0AC2FBEB0F998 + 9167ECACCA5CE1406BAB0B4442767943E8EC1917AB5EA2BD24AD8244BF0FD350 + 2CFDB5D47BF3814E6F47DDAC1C2CACB1E0C458026FBCB6152FFFF1A7E20415AD + DE827B7FFC13CCAE9B4B1A3F2EE86A622A28A22C963E67229AA622CE03D299A6 + 519190A3E2ED1F898AE86B715B2942832D47773E7FFFBD417EB3E7F7E68108FE + 4539FA498300BC772D3A63E054C4A7CA95675DBCA2B27EF505B53515593A933D + 4BAED65A351ABDC56C3218F92F3960190F140F7C881750C406EE881830414BE9 + CEE658FA735EF1D21A6C583CB700672FC9C5F6C313F8D137FE1D63437BC55137 + 9FBFFD6BB8E1962FD3CF0505DD7969A6F38693782611CF0081F73E73C9845984 + B7C3721EE04848EA0B100FB9BC07DFF83FDFE8EF6E694EDF5FA63037B33A1AC7 + C7380BFBD30221F3BBA7368C65F2033FC8FC2A143A9DDE2053A80C0AA54A2F93 + 29343285529B5758612D28AECAB6D8B3AD268B3D57AB33E4A8D43A8BC164B31A + 4C1693466FD229941A1DA9132D45803C1008C12DDED6458582C25CE4E458F0C6 + 5FFF862D2F3F41337E12F397ACC4C38F3D05855A236638575D83C4EBFE8074EC + 83386D459CB8121503CE6073F2E51E5AF608BC2B8905016406B4EE7DFE919603 + 6FAD4B2F817CD022CDCC44FC2FBFFDE3BF02C24C206616F732D4A4C54919ABC4 + C992F807BDBE5C6FB46A8C16BB416FB4DB541A9D8580306A0D962C5B4E4996DE + 9C6521CAB1D8738AB3477A3B72B6BFFE24C5138C46935DF1D0A3BF43FDE225E2 + E8667E2B01711C1AD1602018116D891132805CEE08A7F710F0F6258E10565EBC + DD8BA52AFB8F81CE43EB77AD7FE267A21A7892866656474F5DA401FE1FBEEDE3 + A920CCEC639D6E28C6C95D404A9CCC1F33C138F563E6CFA96A43211771A554C9 + E50A752412D2C85249CDFCC54B6D15D5736D6595B36C4AADC1AA501BB28C165B + AED9966B3598ED2685C66094C9E4FA544AA623592BE3DA5044BCD1A9F4E0531E + DD2E17121405FD9D87361ED8FA975F077C536EBC7FB74486863EB1771AFCA440 + 9809C4CC449D012433F8F2191F65A73C668220FB80EFFFA36B9D4907A2D24D40 + 682CD66C83DE64352BD55A0381A73798ECA6D2590BF2CDB6BC2C958A2CB55C91 + 438ACCE4F33807DA1ADFD971BCF9DD9D31716A88788E8C099BB9467C6A61EE13 + 7B2BE0FF0F21681C94FA9D17A60000000049454E44AE426082} + end + object PNGText: TImage + Left = 30 + Top = 51 + Width = 166 + Height = 27 + AutoSize = True + Picture.Data = { + 0954506E67496D61676589504E470D0A1A0A0000000D49484452000000A60000 + 001B0806000000F6DCF4DC000000097048597300000B1300000B1301009A9C18 + 00000A4D6943435050686F746F73686F70204943432070726F66696C65000078 + DA9D53775893F7163EDFF7650F5642D8F0B1976C81002223AC08C81059A21092 + 006184101240C585880A561415119C4855C482D50A489D88E2A028B867418A88 + 5A8B555C38EE1FDCA7B57D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691 + E6A26A003952853C3AD81F8F4F48C4C9BD80021548E0042010E6CBC26705C500 + 00F00379787E74B03FFC01AF6F00020070D52E2412C7E1FF83BA502657002091 + 00E02212E70B01905200C82E54C81400C81800B053B3640A009400006C797C42 + 2200AA0D00ECF4493E0500D8A993DC1700D8A21CA908008D0100992847240240 + BB00605581522C02C0C200A0AC40222E04C0AE018059B632470280BD0500768E + 58900F4060008099422CCC0020380200431E13CD03204C03A030D2BFE0A95F70 + 85B8480100C0CB95CD974BD23314B895D01A77F2F0E0E221E2C26CB142611729 + 106609E4229C979B231348E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666 + E76CEFF4C5A2FE6BF06F223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370 + C701B075BF6BA95B00DA560068DFF95D33DB09A05A0AD07AF98B7938FC401E9E + A150C83C1D1C0A0B0BED2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7A + F000719A4099ADC0A383FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD + 8E29D1E234B15C2C158AF15889B850224DC779B952914421C995E212E97F32F1 + 1F96FD0993770D00AC864FC04EB607B5CB6CC07EEE01028B0E58D27600407EF3 + 2D8C1A0B91001067343279F7000093BFF98F402B0100CD97A4E30000BCE8185C + A894174CC608000044A0812AB041070CC114ACC00E9CC11DBCC0170261064440 + 0C24C03C104206E4801C0AA11896411954C03AD804B5B0031AA0119AE110B4C1 + 31380DE7E0125C81EB70170660189EC218BC86090441C8081361213A8811628E + D822CE0817998E04226148349280A420E988145122C5C872A402A9426A915D48 + 23F22D7214398D5C40FA90DBC820328AFC8ABC47319481B25103D4027540B9A8 + 1F1A8AC6A073D174340F5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A + 8E6380D1310E668CD9615C8C87456089581A26C71663E55835568F35631D5837 + 76151BC09E61EF0824028B8013EC085E8410C26C82909047584C5843A825EC23 + B412BA085709838431C2272293A84FB4257A12F9C478623AB1905846AC26EE21 + 1E219E255E270E135F9348240EC992E44E0A21259032490B496B48DB482DA453 + A43ED210699C4C26EB906DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7 + 143AC588E24C09A22452A494124A35653FE504A59F324299A0AA51CDA99ED408 + AA883A9F5A496DA076502F5387A91334759A25CD9B1643CBA42DA3D5D09A6967 + 69F7682FE974BA09DD831E4597D097D26BE807E9E7E983F4770C0D860D83C748 + 6228196B197B19A718B7192F994CA605D39799C85430D7321B9967980F986F55 + 582AF62A7C1591CA12953A9556957E95E7AA545573553FD579AA0B54AB550FAB + 5E567DA64655B350E3A909D416ABD5A91D55BBA936AECE5277528F50CF515FA3 + BE5FFD82FA630DB2868546A08648A35463B7C6198D2116C63265F15842D67256 + 03EB2C6B984D625BB2F9EC4C7605FB1B762F7B4C534373AA66AC6691669DE671 + CD010EC6B1E0F039D99C4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA + 7ADABEDA62ED72ED16EDEBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA + 85BADB75CFEA3ED363EB79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD1 + 1F373034083690196C313863F0CC9063E86B9869B8D1F084E1A811CB68BA91C4 + 68A3D149A327B826EE8767E33578173E66AC6F1C62AC34DE65DC6B3C61626932 + DBA4C4A4C5E4BE29CD946B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C + 6B9E61BED9BCDBFC8D85A5459CC54A8B368BC796DA967CCB05964D96F7AC9856 + 3E567956F556D7AC49D65CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BAD + C4769B6DDF14E2148F29D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F6 + 6DF6CF1DCC1C121DD63B743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957 + 671B67A1739DF33517A64B90CB1297769717536DA78AA76E9F7ACB95E51AEEBA + D2B5D3F5A39BBB9BDCADD96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0 + F758E271CCE39DA79BA7C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8 + DBC45BE0BDCB7B603A3E3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE23 + 7ED67E997E07FC9EFB3BFACBFD8FF8BFE179F216F14E056001C101E501BD811A + 81B3036B031F049904A50735058D05BB062F0C3E15420C090D591F72936FC017 + F21BF96333DC672C9AD115CA089D155A1BFA30CC264C1ED6118E86CF08DF107E + 6FA6F94CE9CCB60888E0476C88B81F69199917F97D14292A32AA2EEA51B45374 + 7174F72CD6ACE459FB67BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9B + B880B8AAB8817887F845F1971274132409ED89E4C4D8C43D89E37302E76C9A33 + 9CE49A54967463AEE5DCA2B917E6E9CECB9E773C593559907C3885981297B23F + E5832042502F184FE5A76E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E6 + 9D5695F638DD3B7D43FA68864F4675C633094F522B79911992B923F34D5644D6 + DEACCFD971D92D39949C949CA3520D6996B42BD730B728B74F662B2B930DE479 + E66DCA1B9387CAF7E423F973F3DB156C854CD1A3B452AE500E164C2FA82B785B + 185B78B848BD485AD433DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1 + E022BF45BB16238B5317772E315D52BA647869F0D27DCB68CBB296FD50E25852 + 55F26A79DCF28E5283D2A5A5432B82573495A994C9CB6EAEF45AB96315619564 + 55EF6A97D55B567F2A17955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDA + DADE4AB7CAEDEB48EBA4EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B + 5F6D4ADE74A17A6AF58ECDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D + 7F5DCB56FDADABB7BED926DAD6BFDD777BF30E831D153BDEEF94ECBCB52B7857 + 6BBD457DF56ED2EE82DD8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645 + EFEB6A746F6CDCAFBFBFB2096D52368D1E483A70E59B806FDA9BED9A77B5705A + 2A0EC241E5C127DFA67C7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23A + BF75AC2DA36DA03DA1BDEFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F57 + 9EA09D283DF1F9E48293E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD + 6743CF9E3F1774EE4CB75FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE + 3D477E70FDE148AF5B6FEB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573 + D7F8D72E5D9F79BDEFC6EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D + 7A8F78AFFCBEDAFDEA07FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09 + 879EFE94FFD387E1D247CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2 + A713CFCA7E56FF79EB73ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372 + EFABA9AF3AC723C71FBCCE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40 + FE50F3D1FA63C7A7D04FF73EE77CFEFC2FF784F3FB25D29F33000019CA494441 + 5478DAE59C077C1645FAC79FD9FAF6379D900089D4D041448A0504012B20C829 + A2064F054FBDFF89E7215E11C482ED14C40A72827A8A0D45B1A020204524B400 + 2A8140422085F4F2B66D33FF99F77D3779F39A90377A9E77DEF361DCCDEEECCC + 96EFFE9EE7999D57440881FF15DBBB3B07CE1E90053E158302222060D78EC08D + 3D807CD5807503C06207222600703CDD47001389F719A220711ED5CAF94825B2 + 818504C041BC401002A4D06AB8793F841D2B62A8943A00A7299058FF2D18723C + 6D5700017CB45564D60422D0BE9004012105704D11489FDC067C652EDDE7076E + EA0A800EFD00F440ABD78468E73A7280C22582DD19D7B8FD607E692A5D0CA425 + F597BEEFEDB4325A72D1FF30981C0513B37F6EE26F0626061708362B3B0461D5 + 4F145E062BF28062F8A08E4F021B09F0144C42C1C43F1DCC44DA8BC8C044B8E6 + 24913E99FDAF0273C21FEE98FDD92F7DCF7F8C2D79EEA54BD081A325BFF4799C + C926D3B29996DA886D99B40CA2E503F647FFEE1D636E2C04666FD05415054024 + 5876223EE719E2E87A317DC202604D0B81C9BB011A4E00B69FC50B16C130EAF3 + FB8A1507CEAA370CA79031E293802DA3CEA5D782805500FA8FCA6AB37EDA0526 + EFA27D5BE8BE7844AAF3E3C8FA7903B9CAFD08D4AA026EDAAA42E8389882E96F + F59ACE0066360573656BC78D3CFF02C83BFC3D545556FEAC0FB05756EF603FED + 310AE6CC9F02E64C0841D21EDB1C2EB1D8025AE6D3B216428042B8BF82F03A7D + 62B0BF3D607E93B31B860DEA0DBA12408AE822C87B0AB8ED8F823C721E200216 + 0AA69582598FADE9986C7F8428DF6D02F99CEB410B546E271BEE19E9B7668223 + FBD5414ACA39B93255310BA352C5940D12F2FB61238827C0ABB8524A419CAE91 + 444F1E1896440A1F1F0566E82882134093ACC055EE1AAFBC73FF7A5B4D2EA0FE + 173D02131EFA0B88360ABED1EA3505C1042B28C4DD2E30EFB9F7CF41285F59B1 + 2CE6FB77FBEFEF0A2E9F5FBA38B89E94940C0BE7FFE507F51293928240EED8B6 + 9541066FBDF97A70DD349BCD0683CE1E0283060F09AEB3F67C3E5FE3FE338139 + 3AEA6FA658FB23FE66EB0363BEA2E6368796C56DD46177B890162A5DB00A422F + 013376A3B3693901E197A23D606ED8B405C68CBA0002AA17B443ABA0A65E989D + 56FCEE5C6F7D80BA6A1D4992CC35E83C8D21A968FA6B48A0EC88213A1324644B + EC08BED31421EC27CE54AF21C5A91C0D017843D5589849155280206E34302298 + 07D9CD7317FF7961206DE872DE5BD6512C3B3010F1722D162D58203EAAAF88B0 + F816870E3688267B02BC9C02C55B67EA5B97DDE208780C72FEAC95DCC0094B88 + BF5E864890C3666E41440745EEA0A9EEAC234E575CA3CF6F0BCC686098823248 + 367CBEBED5FBC7603C5954041FAD5D135C3F92F77D8BF53B77C90882CFA0BFE9 + E65941F0985D33FD7A7AFC09B0D27E583B7EBF37B864DBDA029301B1B915E896 + D0C25E19A65EEF87B7D5C5001933E67A2785D71F80901A9EC9D8FEF9E1F5B320 + 04692634A9E516885D79236D7F46A7840F0C4E07F99B077FE73B90FBBCBDF210 + 519181DCC669C0920C1A3140443C7DE029A053D72B42390E78F45AC39A966031 + 74F02A5E90250E049D2A1FC5D1003B16A92345D47D6BBA0344B53410E8D05725 + D7BD75A514D7E52B38FCC1ADE4DD5B97892C59029BAE084902701830B6803540 + DB10EBE99FCA29438CEB4463037A8A0A55DC443034160D7829795150D2F30BAA + 2C840AA7D4836F60F65663CA0B13DD32DF18F2448379F1F809D0B357EF204C89 + 89C941101994555515CD9A6F0B4C13C66830198C0CB008B880F61F5C9A60B263 + D8B6B6AC2530238160D031651C1501C3E8883A27C2C0D5B6D953F89686975741 + 383E6CC5DA52CB9F625BBAA4C2684201E43E9D9B63F9E6957348623AE009CFFE + 868814BB9D4B39297D9C261EFBEC49A36253D740B7AB35396DC4B578D7E2064B + 523A82F881A714914F26F9DF244A06062D236BA0565DF457E9D43EE0DD7D9600 + 69D86EF419EFC709FD3C42CF71DB7829018CBC35B38DCFFEFA22B2D9C1A08C91 + 867255E21B88AED804914FE38D781D448DA32F429836C441289B22CD5D7ED838 + 163E90903EB3D0D60834001930FD3563DCC21B6D567B63BD33292673A34CC9DA + 8284C1DBB97346505999B506A6D91E53521354134856CFDCC65E8EC83E19CCBD + B2B27EF032B404E6660881C8209C0C4D2E9C29A8A998917516C4080403F8E9F0 + BAA980AD198396A96B5DF8B8C2F0725F783F8B39E3C2E710AB629BB6B84F8256 + 0BBA2FCBF7E1DD1F4B457BE2FC6367FDC39D3EE84DE3FD055F2AB2A4126B1797 + 51755872E2935504AC1E2D61401AA7D4F2BCD55542CE9B3D1E551FFE9D92B3EE + 4E01590DCEA84335E0175C7EAF470497C1B9799B474C407CD2A03C0E937EC288 + 6C4076E96C38F4C52C3F41755C526F9FB0F9F17B8CAA6F1D52EF09C7A1FB94F7 + F440894FD4FD9696DC754B46784E054E30A892128CB1681070D108622B2DEFCA + 17CC69AC1709268BF79A3D0C1ADB31985646C597CCC53277CB00335DFCFD0F3C + 0C1FD2BFF7EFDDD32A98EC18D6DE8334DE345D320393B5639AA9D22CAEDDB1FD + ABE036A6E00CCE271F7BB85912D61298A6AA45C681E6B69B20A45A3F657CA92E + 0C556B16192644BA7CF3E530634B13DE2D34C61C1D6BE7186B344B16C09BB771 + 9EBEEE8E45EEBACAA381C117CF82D48C1964D727E3888488AA57A75B411378CD + E93504A8F5697E59547485CFBAFC38491F718B78E0E5A59CB78E53C5847E9CFF + 449C202099D30947402ED1EC34D60B78DDD6C1A33F44B60ED9A4C7144071C9A0 + FAFC60549782BDEC9B997ACE2B2FA84AA545BAF695CB786BC6A77AFEC72092D0 + 786A2C4604163F68C1EA4C570D4D0D1F4BCF60D4BD8DF522C1644A55491FBC3F + 0CCD9593AE0A02B4F18B96DD36DB67BA6576ECD8719704A19B4955311A4C06F0 + A2279E6EA69661B89AA9237B39D8310CF07DFBF604972C0ECD3B7CB819C0E163 + 9B8119A94A83C330B087BE29621B44D4D9D20E2059DB6E680A075AB248179E1B + 3E86D902680A2F2E829062B37A19B43C40C15C10F3596834A6A381A137E7D5BB + 852FEFFDBB68EBACFB07DF3859E877E91EE1D8D7338CAAFD7BE154C14542ED89 + 7B35D22090892FDEAA3714ED16BFBCBBAFA54F76291EF3F866AD60ED70CE5F93 + 61C4F5A823557B3A593EBC6F79DDE019876CCEF8F9BA9CE9E63A9D73B23CA3DB + 66195BF564ECA41933E1FCB28C051183E5C3FB97E2ED8FDD81BB5F88F8CB1EEF + AEB9138F215C0716D509B182E9B3A701B76D2E484A0590217F04BDA288F6C005 + F759FA4F6AACD79A2B67094E4B20B14C9A59F4F091599F01C8EA4483197CB854 + 819F7CEC9168B8827D58697891448F63309AEE9EA9E7862F3E0BAA3173F7D1C3 + 49D160CEA4E595F0BA799798EB662ED854BA96EAC4628D2041EBEE3F32D33715 + 7B3434BD18E6B1EC3C6AC2DBAEA2609E295E6D669AAF0E102F819EB36C8EBEE1 + EEA7A46E571F21032F1BE33FB261B19CBBF16A5EE03FD5E2D33EE7EB8E3D8DDD + 03008DBFEF6228CFBD41DCF854360C9EBD9774E93B84E4BD7650DDF3693F69D8 + 1D1E2531751DF7C5826BC9B0D9AF599D1D44F5F307AF851EC3F3F4492F8D46D6 + 843287CE32178133042FF5B8D599E4BDC50BB923AFDE600CBBED8038F8F73302 + 2E7414211FA16072B183994EB8AFE6A8B2729AE04BFE49132E3118BB32B35B9B + EAB506A6190F46C3C0148D2965B45B65C62034939B4830593DE69E199491898F + A98E4C3199E23270F7533099EBFE68EDFB21A869FFACCD96869BA2C16417C192 + 8B48558BDEC6C030139F9931F230139A921653F1A26D25344F6C4C756675A315 + 949D87092B4BA4CE987C51701BFB534FE58054B92F493FBE6FB3B2EFB5BEA8DF + 94D76C03C6DF1978FBE63A433EAB4EB8F6D5F3D4DC55A3F89DCB9E437D6F29F0 + 5EFAC035AE7533BF26F93B79FFE8FBFF64574E8B78DF1B8F28B6D4FD30F5C527 + 6D5F2E7C060E7E9080CEBFEB6D4FF709DBF50F6F5AE232EA41FCEDB6815A7CB7 + 03A02B9CA8630C5C197D35B75EEC59FBF87A9B68189A234D21D86890399543BA + AF9470CE249AF4706DDD48C2E835C4060397DA49E6E07274D1F3930D6BA72283 + A821301D529B60B664574E9A028329B06C782712B0C8FD4CF5580C1A09260330 + 5A79994583C98064C3424C7D5922651E1B3DBE695A3498D1490EB34268AE74D1 + 00B5C798EA66B600524B6D323019500CCAE8EC9F9DC77C88DD6EA270061F105E + 732B70B5277A183EEF11283B00F8DCEB5772E7CFF9932F77CD22E1ACB1ABADD6 + E45D0DBB5FD943F2DEECE11A39F3899AA1F3E6C281D5B78B75C7E28CE4FE8FD8 + 6A0A6F304E1F1D8E93BABEAC645C988776AF3AE2D63C8ADEEBCA257CD781CFD4 + 1CD874B753AD19023D26FE89D81D259CC501625D11D5F78300E547E7C1B66717 + 112D50645813BB70BA1714DE061A11C18E03315D081BFBD488049AD840DF321F + F0C3173D238D9DF58780C22336A2190B98CC1D4FA4A09D3C7902F6D1388F0132 + F2BC0B7E30C8DD9245273F2C666D69809EA9286B9329A909268372C7F6AD8D49 + 1453CB96A066160D667492D3CC654228E118044DEEB4BDB6007EA896AC1F134A + 06AE19871686B7B36DA3A1F9E03E6B8365E427E0CCD93D3306F34C0A6608EAA7 + FAD0FF48E9AAA7F23042C8218CBBFF4DA3DF8CEB8C6DCF760567479DB75AAF27 + 1BEF7BB836B97BB53BB5DF74DFA13D27ACD9CB7DDAD7FF40F2779F6131C9EEF6 + 28A06B9AEA93052E4114A564858858B2A69629DE446C64FFE9B045F372A8CA8F + A97CD1AE2C20E63C4F9151795CF25DB951F4758292D23F60CD3C2757E0502020 + 252901106D2EA3DA0FB1F8729E277AE5C92EDEE35FF5E28C0A22A45FEDB74F9A + 3BCC6BE97988667660B70B8D55CFA4980C12060F53420623532E064C5BD65A56 + 6E0B67F379E16488ADB376197866F2C48C85092C8C60FBD8B1AC7FD62FCBFA5B + CBCAD9C337DDA3399C13B92D1E9A62CC1F6B9BA1399891EDB39781A9B4A9D8EC + 86B20CFD8328284DD818C041156FCF971FA83B0250793C33F05AF641E4EC2CA1 + 19AB2671DE523F6C78F01D385D246B480219D5498A402C862E80E0D540484804 + 85C6A616035521514D540CA2F8C444D9AE5583C65B81E744B0065450A474302E + CC9E2B0FBBFA09553F1DBC651A2481AB720320C348D1DEBAEB9861280E7CE19D + AF72C93DB391EC00AEFC28289C15ACC4DBF6B9336C391E384D1C5C7DECABDDD6 + A3AB89256B7A2EB9FCD1AB34CE55C406352D6E5763F5585C3953AD6BA6CF080F + D9348F1399B286BED484BED0C46A0C5496D43CB7F4E9206C4C9183D93C8D2959 + 9B2CD63455D27C39AA2A2B82CA6BC21909667492C36C0134C593A3C380B863A7 + A0458B1EC3BC2BDCEE66886D003E139ABEFE04E3D5F6808977AE00A4D4BEA16F + 7B6C3AB2B82B941BDF4F41FB57BD2E6F7D725A9D7B50BD83E70B02BC240AA856 + D65247216BD9418C385FBCEEADEE2818186B82BBDC42EA8B3567173B1797463C + 2AC7F1F525C0FB4A7A5AEA0BD5AA6E13BE75CC5C3D84F71422954F23BA6683F8 + FD8B00FCB5CFE1FD6B6729080474CD8A61FE4E2376114E02A1603BF065DF8105 + F9DB38711DC05068A87A8A426E195EEB2FD8C11D5F8FA421B3E773E7DDBD10FC + 554170A58C218D87C41A639AEAC994AE2D571EAB99ED99C654930D0BF97CDE1F + 24560C561612B4F649B2715C109A121F060B73996C40BB90963F84B7B7F773E0 + 6868FA7AD4DAE03AABB3A98D3ACC22C73983AEAF5D602E391FC0623B422A7675 + 27B2F594D03F7B8856B4F759AE78CB6F946E97E4E3CAE34F631534BB4DC7DE8B + 1611C797F31B387FE5207076FB7343D5A93A4EB27D2A1BEA171E4E258EF36701 + AEF3FA61DFDBF1A4D3C825A47073B9E6761E86AB9EBDD8913A080258023F8890 + E0DF0BE493456B8DC35F4EF4F79DF81D37F1A9119C00F508AB880816428E6E01 + B9F65878FEA77959115E9D0209F15D693AEE07544073405FC530A3E4939D48E2 + C02F643E8A00DF675675CC6972C7BF96696F85F0C3E19C4897391A9A209DDCCE + 7E587B4C79CF34B81E4B1D666C0889BD208D597A2C600654158486532094ED07 + BC65712EA9383800675D5128F6187B576DEEC71FC8C55B8113841A5E740A4443 + B502689C82219908BC6EE080A4612C08BAE7B4C3E61435213E0E230559B41ACD + D0AC3AC2A23F803907901A2F8D53F77B2EFDFBF8A42E833985736A5E9D0347CE + A2B162DE17AF1B857B53D529CBEEC0E74E7F5EF455D2B8932A042F03CEDF0672 + D56108CE226270B29944C1EFE124B48CEF0938731C9543BA5FA2AEBC60FB08F5 + D5313BC4845E8092CE7B8CD699675E277F5D5322F25F3F519882D952929309CD + 5D66642CB8B29D1D996A7C26A85B52EC966C3334253EB19CC7E254B7601145B1 + CC4DAA01595DA2BEEABAEFA0F84037E1A2FB6E378A7754FB4E1D7DCB1228D060 + D45D6F40D684B7702090C059F8028F0EE9BC2863DB8E175E34F6BE8B5197E189 + C2B9D9AF1B717D3E16556F3C48B88188F17A60EB63367FFEC72F1A8253760E9A + B687EF3F652889CB4086A211BDB606E43533A771BED36FEBF68EC08DB9EF569C + 3EE46510A922CA2110F1D1AFC0A2D583D171087071E9A01EDD08FAEEF7C0866B + 018956400366D2F38E0F7DED11AC08CAF62E0A6C5A38574AEE5DCA5DBEF472D0 + 95A618BCFBF0C6550AE6CF01CDBFCD1898A3A17992C394D28C3999B1A19B7DED + 6FFA0776A6C1F542687B009E597B3F87CEC9ECE0788982E9970F2C67D31EB2B5 + 9DCB9641F56941BC6249177DEFF2615CEDC9F7B0EA03C39A04527C4762F01682 + B15C221A4A9286558DF7943BB99AFC1243B224E8F15D2D82180F84B701AFD429 + D866918D9A5A202A8DFF546F43D515736726F519BF8660828413DB0955372734 + 94BEEB3BF0C178A9D3F98784C193AE006FC509A3CB08503B0FA5F1A20ABCA702 + 444712E84466593768F91B40DBB91A1C504FAF56070C1600571A2084D9646601 + 79CB0AF4935BD320A9FF5EE9E60D439BCD6EB7C7FF8BB0F8E58D81B9009AC605 + D96C1E06A6194F3297B9129A20FD29D6DAE07AA462B7568759E427D32510C3AC + 26F6B9B2A4A4C461B73B3DF62D7F01726ACF53A8E1D41C8E06799C23F5024DF7 + ED410EF7A386178FC01801E7AFF060493C5B2A3B5A648871DDFC89BDABED5A65 + 01C4A5F1C4E65255B5CCAE97E511476A462AA928ABD789D7AF25F6C224C0D5F2 + E7CE5E61E931FC1DCC7341C0449DBAEADA1297F1F6AD753A75C9BEB873BF24B2 + 7D6C704A9020D27C46034B8F91E01871354D8EEA416700D2ED5AFE46D0BE790B + 1CA49E0D4DD21053032CDA01A652378D358EBC39B554A83F9EA2BBBB1E468ED4 + DE91BFEB906F5ADFD62DF9AF3106666442116DECD3200322FA8B50AC16D9B6A9 + C63FA60EB348156FCC0EDA8A31777CBD43EC9FD55B732855E05FF19B7B24C5B7 + 484888D3A0D3D0C98A3BF973A5FC5B70D8DCA03A5380ABABFC3DAE397C1729DC + D915670CAD962F7B7890B27E21C6EEF47BA4F82C0C9917BDA71FFB34C7A2291B + 149F16AF1F7E7D00BAE441BB7DDDFDB7A3CB1F5A8F07DC7240A52E98F394015F + 7B1C0440D9F0C6F58B09B2F8CA47CCFD2316E4D5C1D811634014E0849EE78214 + 9712CCBA5B055365138A394017DE017AD74B00968FABB0D6E527A19EE3F340B4 + 66B1DF2C35DAD4E53F1326FF7E8B1CC71C1DB56F73B8B4F4452856339395C619 + E72DD802681A96CA3C435B2BA18517A42D302BABCA21D16E834071DE04DFFA07 + 57D88A3E8D0B8C9ABBD67EE1FFCD526B4EE8BEDD6F754AF1E527FBEC490FA123 + 9F8F2581322029634FDB875D371FCBCA4BFE75B3A6637FFC1B44EC08D2250FFD + 56AF3CF6A654BC23DF6828963C40CA5CB27597A205CE1786DE768FA5CFF5EB54 + D18BA0AA80C0F71F75E74ABFFD107DFF7E377FCAD043D6698F0F41BC084185A3 + 7022C10EBC8D3A0B430716A1182003CDD239FDD8A60475D73B6E07A9653F85E3 + 68684988AE80D8B9BBF5A46DE0FCA49C17AE200DC5863CFD999BB9F88CD5C1D8 + 336C5CC6F89F87925FC062F9CD8F19D731B71EF3840908B96833243853E2B319 + 42094DE4A4E096ACC517A42D301BEAAAC06134A0EA7F4E2CC735554989762BC1 + 572EBB0A5BF8B5DEFDEF7D2C567F7B195F9C0F56AFE754AD60E9A4BB3272ED97 + 2EB8D22A8927B58AAFC128DC388D3F9AF3364AE8AF2962FCCBBC81BFB7F4EC33 + C4A82F3F37A073BD757B528EAC37AC524B760996A91FFDC3677778E5D37BFF28 + BD7DD3BD5CA046A8B67773CBD73C37CD9192F62E686AD389715228F30E3D86E0 + 6D261206EFC1752FC2F615B3ED48A709B7C006044436F592177CC8A838A6F3AA + 556CE87E2970A36EED8C3B5F702A0476C89C0EC74F27E23FC46201B3104289C9 + 4FB133C58EE6B0545BBF056A7100BE2D3095EA62C095857F93D7DDB250ABAA09 + E029CFDC20A765BD4B8E7F3CAF7AEB638BAC4CB5547B354ECC3A69EF3FF9118F + 2E6EB6F5185E2E22AA6E344BD60A365E8357DFF8A6ECF71E51EDCE5E846E67B3 + C679C912F4A2086BA0057C20F79E5A43AE78A2BF6AB394CAAF4F2C158E6D77A0 + 949E01A3C7B8355ADFC9F3C4C48C5A5015F64D5B0F5E8A600BCF560F1AC77EA3 + AED905AC7CFED02B964D2F4F9665571CFBF19ACE3941425ED0745A9C49608D1F + 50AD0E9CF1D74087012B386792414FA2F1976A4ED78FF952FC9F69B180C9AEB6 + BD2E3CD25AFAAC1869ACED41E1656BF1253B8795E1E5E4C87A6D81A9D51443A0 + F4E81C69EF1B231AD2CE5E523678E2768B6001D7C9DC91D6834B6F13BA5F7A5A + 47E92B146752A12363684055BD600785E3888111B1815F29EE480EADB9CF5275 + 3C19571C4202283820BA9040A131340F28018968F15D70627C6A8E67CC13CF1A + 9C6E189FFDED2941D7D25CFDC63C695417EEF6759D0056471C42AA8734AA2367 + 0133546693333C34C1D1F900708797DFAE7DF5C248B99EE7DCBC0B79890456F0 + 818658029546E4A94BE7F08EB4D3BA26D03CAAF920C5AF0ACC5FFBFFF040A92C + 0259A680D2E4BA21631894220B92EA2B88ABE43BB01D5802E25963C0E83C0DD4 + 840E80340378DCC0D940059EB0DFC54AC8A04090A3EB09D03815B63C02028F41 + 119C344FE100FB2AA066C01CD0FA4D84E4139BC07FD63828E391D4C9E2528D82 + AFC1A99583BFC3D9A05B1390DD6820CDE76990E0F879F02184C1D4A012E2F51A + A87B6F1670C5A51027248009A68E7D503BFC4ED086DD294A384053750456849A + 8D9FFD9AC0FC7F241936A086E258610000000049454E44AE426082} + end + end +end diff --git a/AboutFormUnit.h b/AboutFormUnit.h new file mode 100644 index 0000000..8b21ee7 --- /dev/null +++ b/AboutFormUnit.h @@ -0,0 +1,41 @@ +//--------------------------------------------------------------------------- + +#ifndef AboutFormUnitH +#define AboutFormUnitH +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include "PNGButton.hpp" +#include +#include +#include "GeneralDialogPanel.h" +#include +//--------------------------------------------------------------------------- +class TAboutForm : public TForm +{ +__published: // IDE-managed Components + TLabel *m_lblVersion; + TLabel *m_lblURL; + TLabel *m_lblStyleNums; + TLabel *m_lblType; + TGeneralDialogPanel *GeneralDialogPanel1; + TImage *PNGLogo; + TImage *PNGText; + void __fastcall FormCreate(TObject *Sender); + void __fastcall URLClick(TObject *Sender); + void __fastcall FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift); +private: // User declarations + void __fastcall WMNCHitTest(TWMNCHitTest &Msg); + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(WM_NCHITTEST, TWMNCHitTest, WMNCHitTest) + END_MESSAGE_MAP(TForm) +public: // User declarations + __fastcall TAboutForm(TComponent* Owner); +}; +//--------------------------------------------------------------------------- +extern PACKAGE TAboutForm *AboutForm; +//--------------------------------------------------------------------------- +#endif diff --git a/AudStylePanel.cpp b/AudStylePanel.cpp new file mode 100644 index 0000000..dd03cd2 --- /dev/null +++ b/AudStylePanel.cpp @@ -0,0 +1,1161 @@ +//--------------------------------------------------------------------------- +#include +#include +#include + +#pragma hdrstop + +#include "GlobalUnit.h" +#include "AudStylePanel.h" +#include "MessageFormUnit.h" +#include "FavorTextureUnit.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) + +#define LIST_RECOMMAND 0 +#define LIST_ORIGIN 1 +#define LIST_SHARE 2 +#define LIST_LOCAL 3 +#define LIST_COLLECTION 4 + + +__fastcall TAudStylePanel::TAudStylePanel(TComponent* AOwner) + : TStylePanel(AOwner) +{ + m_strTitle = ""; + AddToolBtn( 3, "imgTabSelect", CMClick, "ɸѡ" ); + m_nBtnCount = 1; + + AddToolBtn( 3, "imgTabLocal", ListTypeClick, "Զ" ); + m_lstBtnTools[m_nBtnCount++]->Tag = LIST_LOCAL; + + AddToolBtn( 3, "imgTabCollect", ListTypeClick, "ղصķ" ); + m_lstBtnTools[m_nBtnCount++]->Tag = LIST_COLLECTION; + + if( SOFTWARE_ID!=e_Pro_Lite ){ + AddToolBtn( 3, "imgTabShare", ListTypeClick, "ѷϷ" ); + m_lstBtnTools[m_nBtnCount++]->Tag = LIST_SHARE; + } + + AddToolBtn( 3, "imgTabRelease", ListTypeClick, "߷ԭ" ); + m_lstBtnTools[m_nBtnCount++]->Tag = LIST_ORIGIN; + + AddToolBtn( 3, "imgTabRecom", ListTypeClick, "ٷƼ" ); + m_lstBtnTools[m_nBtnCount++]->Tag = LIST_RECOMMAND; + + m_SearchPanel = new TStyleSelPanel(this); // + m_SearchPanel->Parent = this; + m_SearchPanel->Visible = false; + m_SearchPanel->Left = 1; + m_SearchPanel->Top = 25; + + m_editName = new TEdit(this); + m_editName->Parent = this; + m_editName->HideSelection = false; + m_editName->BorderStyle = bsNone; + m_editName->MaxLength = 39; + + m_editName->Font->Name = g_strTxtFontName; + m_editName->Font->Quality = TFontQuality::fqClearTypeNatural; + m_editName->Font->Size = g_szFont9; + + m_editName->OnMouseDown = EditMouseDown; + m_editName->OnMouseUp = EditMouseUp; + m_editName->OnMouseMove = EditMouseMove; + m_editName->OnKeyDown = EditKeyDown; + m_editName->OnChange = EditChange; + + m_iListType = 0; + + m_bDoubleClick = false; + m_RenameTimer = NULL; +} +//--------------------------------------------------------------------------- + +__fastcall TAudStylePanel::~TAudStylePanel() +{ + ClearFavorTextures( true ); +} +//--------------------------------------------------------------------------- + +void TAudStylePanel::Init() +{ +// InsColGet(); + if( g_aOriginStyles.empty() ){ + SelectStyle(); + } + + if( m_SearchPanel ){ + m_SearchPanel->Reset(); + if( ((TPNGButton*)m_lstBtnTools[0])->Down ){ + CMClick( NULL ); + } + } + + m_iListType = LIST_RECOMMAND; + for( int i=0; iDown = false; + } + m_lstBtnTools[m_nBtnCount-1]->Down = true; + + GetFavorTextures(); + RefreshList(); +} +//--------------------------------------------------------------------------- + +void __fastcall TAudStylePanel::UMSearchStyle(TMessage &msg) +{ + Stop( STOP_SELF ); + ClearAllItems(); + + RefreshList(); + + CalcViewArea(); + ResetScrollBar(); + InvalidateRgn( Handle, NULL, false ); +} +//--------------------------------------------------------------------------- + +void __fastcall TAudStylePanel::DoubleClick(TObject* sender) +{ + if( m_pSelItem && m_iFocCol==COL_TEXT ){ + int iOnline = m_pSelItem->GetOnlineState(); + if( iOnline==e_Downloaded ){ + PlayDemo( m_pSelItem, -1 ); + } + else if( iOnline==e_UnDownload ){ + DoDownload( sender ); + } + + m_bDoubleClick = true; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TAudStylePanel::DoCollect(TObject* Sender) +{ + if( m_pFocItem->iType==SEGTYPE_STYLE ) + SetCollect(m_pFocItem); + else if( m_pFocItem->iType==SEGTYPE_TRACK ){ + TTrackItem *pTrk = (TTrackItem*)m_pFocItem; + bool bSet = !pTrk->IsCollected(); +// InsColSet( (TTrackItem*)m_pFocItem, bCollected); +// pTrk->SetCollect( bSet ); + + SetFavorTexture( pTrk->pStyle->idLoc, pTrk->pStyle->idStyle, pTrk->GetSegType(), + pTrk->GetSegNo(), pTrk->pTrack->iChanNo, bSet ); + } + + DrawItem( m_pFocItem, m_iFocLine, -1 ); +} +// --------------------------------------------------------------------------- + +void TAudStylePanel::PlayDemo( TCommonItem *pItem, int tempo ) +{ + TStylePanel::PlayDemo( pItem, g_iMelodyKey<0 ? -1 : g_nMelodyTempo ); +} +//--------------------------------------------------------------------------- + +bool TAudStylePanel::StartDrag() +{ + bool bCanDrag = m_pFocItem->GetOnlineState()==e_Downloaded; //ѡ + + if( m_SearchPanel->DInStr.Length>0 && m_pFocItem->iType!=SEGTYPE_TRACK ) + bCanDrag = false; + + return bCanDrag; +} +//--------------------------------------------------------------------------- + +void TAudStylePanel::SetDownload( TCommonItem *pItem ) +{ + TStyleItem* pStyItem = pItem->GetStyleItem() ; + pStyItem->SetDownload(); + + //ҵǰк + TCommonItem *pFind = m_pTopItem; + for( int i=0; iGetStyleItem()==pStyItem ){ + DrawItem( pFind, i, COL_TEXT ); + } + + pFind = GetNextItem( pFind ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TAudStylePanel::OnNetworkMessage(TMessage &msg) +{ + WORD eMessage = HIWORD(msg.WParam); + WORD eExtra = LOWORD(msg.WParam); + + switch (eMessage) { + case e_styleInfoResponse: + { + if( 0!=eExtra && eExtra!=e_ShareStyle ) + break; + + int iStyleId = msg.LParam; + int idLoc = eExtra==e_ShareStyle ? 1 : 0; + + TPROSTYLE infoStyle; + if( idLoc==0 ) + infoStyle.pOrigin = new TSTYLEORIGIN; + else + infoStyle.pShare = new TSTYLESHARE; + + int ret = f_CM_GetStyleInfo( idLoc, iStyleId, &infoStyle ); + + if( ret==0 ){ + if( idLoc==0 && infoStyle.pOrigin->detail.iTimesignature!=g_iMelodyTimeSignature ) + break; + + if( idLoc==1 && infoStyle.pShare->iTimesignature!=g_iMelodyTimeSignature ) + break; + + bool bNew = false; + TPROSTYLE* pInfo = GetStyleInfo( idLoc, iStyleId ); + + if( !pInfo ){ + pInfo = new TPROSTYLE; + if( idLoc==0 ) + pInfo->pOrigin = new TSTYLEORIGIN; + else + pInfo->pShare = new TSTYLESHARE; + + bNew = true; + } + + pInfo->idLoc = infoStyle.idLoc; + pInfo->idStyle = infoStyle.idStyle; + if( idLoc==0 ) + memcpy( pInfo->pOrigin, infoStyle.pOrigin, sizeof(TSTYLEORIGIN) ); + else + memcpy( pInfo->pShare, infoStyle.pShare, sizeof(TSTYLESHARE) ); + + if( bNew ){ + STYLELIST& aStyles = idLoc==0 ? g_aOriginStyles : g_aShareStyles; + + int index = 0; + for( int i=aStyles.size()-1; i>=0; i-- ){ + if( pInfo->idStyle > aStyles[i]->idStyle ){ + index = i+1; + break; + } + } + + if( index>=aStyles.size() ) + aStyles.push_back( pInfo ); + else + aStyles.insert( aStyles.begin()+index, pInfo ); + + if( idLoc==0 && m_iListType==LIST_ORIGIN || + idLoc==1 && m_iListType==LIST_SHARE ){ + int iLine = m_nTotalLine - m_iTopLine; + + TStyleItem* pStyItem = AddStyleItem( pInfo, + IsCollected( pInfo->idLoc, pInfo->idStyle ) ); + + ResetScrollBar(); + + if( iLinepOrigin->cost = -1; + + TStyleItem * pStyItem = NULL; + for( int i=0; iCount; i++ ){ + TStyleItem *pItem = (TStyleItem*)m_aItems->Items[i]; + if( pItem->pStyle->idLoc==0 && pItem->pStyle->idStyle==iStyleId ){ + pStyItem = pItem; + break; + } + } + + //бɾ + if( pStyItem ){ + DeleteItem( pStyItem, iLine ); + } +*/ + DeleteStyleInfo( idLoc, iStyleId ); + } + } + } + break; + + case e_styleDataResponse: // download the style data + { + if( 0!=eExtra ) + break; + + int iRet = 0; + int iStyleId = msg.LParam; + + TPROSTYLE* pInfo = GetStyleInfo( 0, iStyleId ); + + if( pInfo && pInfo->pOrigin->state!=e_Downloaded ){ + pInfo->pOrigin->state = e_Downloaded; + + if( m_iListType==LIST_ORIGIN || m_iListType==LIST_RECOMMAND ){ + for( int i=0; iCount; i++ ){ + TStyleItem* pItem = (TStyleItem*)m_aItems->Items[i]; + if( pItem->pStyle && pItem->pStyle==pInfo ){ + //ˢʾ + SetDownload( pItem ); + break; + } + } + } + else if( m_iListType==LIST_SHARE ){ + for( int i=0; iCount; i++ ){ + TStyleItem* pStyItem = (TStyleItem*)m_aItems->Items[i]; + bool bSet = false; + for( int j=0; !bSet && jaItems->Count; j++ ){ + TSegmentItem* pSeg = (TSegmentItem*)pStyItem->aItems->Items[j]; + for( int k=0; kaItems->Count; k++ ){ + TTrackItem* pTrk = (TTrackItem*)pSeg->aItems->Items[k]; + if( pTrk->pStyle==pInfo ){ + SetDownload( pStyItem ); + bSet = true; + break; + } + } + } + } + } + } + } + break; + + case e_styleRecomResponse: + { + if( 0!=eExtra ) + break; + + //ȡƼб + int nRecomNum = 50; + DWORD idRecoms[50]; + + f_CM_GetStyleRecomIDs( g_iMelodyTimeSignature, idRecoms, &nRecomNum ); + + if( nRecomNum==0 ) + break; + + g_aRecomStyles.clear(); + for( int i=0; iidStyle ){ + g_aRecomStyles.push_back( pInfo ); + break; + } + } + } + + if( m_iListType==LIST_RECOMMAND && m_aItems->Count==0 ){ + PostMessage( Handle, UM_SEARCH, 0, 0 ); + } + } + break; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TAudStylePanel::OnNetworkError(TMessage &msg) +{ + WORD eMessage = HIWORD(msg.WParam); + WORD eExtra = LOWORD(msg.WParam); + + DebugPrint("ʴϢţ%dţ0x%X\n", eMessage, eExtra); +} +// --------------------------------------------------------------------------- + +void __fastcall TAudStylePanel::CMClick(System::TObject* Sender) //add ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +{ + m_SearchPanel->Visible = !m_SearchPanel->Visible; + ((TPNGButton*)m_lstBtnTools[0])->Down = m_SearchPanel->Visible; //ť + + Winapi::Messages::TWMSize Message; + Message.Width = Width; + Message.Height = Height; + WMSize(Message); + + InvalidateRgn( Handle, NULL, false ); +} + +void __fastcall TAudStylePanel::WMSize(Winapi::Messages::TWMSize &Message) +{ + if( m_SearchPanel && m_SearchPanel->Width != Width-2 ) + m_SearchPanel->Width = Width-2; + + if( m_SearchPanel && m_SearchPanel->Visible ){ + m_nTitleHeight = 25 + m_SearchPanel->Height; + } + else{ + m_nTitleHeight = 25; + } + + TStylePanel::WMSize(Message); +} + +bool TAudStylePanel::IsCollected( UINT idLoc, UINT idStyle ) +{ + for( int i=0; iidLoc==idLoc && g_aCollectStyles[i]->idStyle==idStyle ){ + return true; + } + } + + return false; +} +//--------------------------------------------------------------------------- + +DWORD TAudStylePanel::GetStyleOptions( TPROSTYLE* info ) +{ + DWORD dwOpts = 0; + + if( info->idLoc==0 ){ + dwOpts |= OPT_SCORE; + + if( info->pOrigin->state!=e_Downloaded ) + dwOpts |= OPT_DOWNLOAD; + else + dwOpts |= OPT_COLLECT; + + if( info->pOrigin->cost>0 ) + dwOpts |= OPT_CHARGE; + } + else if( info->idLoc==1 ){ + dwOpts |= OPT_SCORE; + + bool bDownloaded = true, + bCharge = false; + for( int s=0; s<4; s++ ){ + int rep = s<2 ? 1 : 2; + for( int r=0; rpShare->nSegNum[s]; + int iStart = r * 4, + iEnd = iStart + ( r==0 ? ( nSegNum & 0x0F ) : ( nSegNum>>4 )); + + for( int n=iStart; npShare->trkRef[s][n][t].idStyle>0; t++ ){ + TPROSTYLE* pTrkInfo = GetStyleInfo( 0, info->pShare->trkRef[s][n][t].idStyle ); + if(!pTrkInfo){ + bDownloaded = false; + goto LINE_BREAK; + } + + if( bDownloaded && pTrkInfo->pOrigin->state!=e_Downloaded ){ + bDownloaded = false; + if( bCharge ) + goto LINE_BREAK; + } + + if( !bCharge && pTrkInfo->pOrigin->cost>0 ){ + bCharge = true; + if( !bDownloaded ) + goto LINE_BREAK; + } + } + } + } + } +LINE_BREAK: + if( !bDownloaded ) + dwOpts |= OPT_DOWNLOAD; + else + dwOpts |= OPT_COLLECT; + + if( bCharge ) + dwOpts |= OPT_CHARGE; + } + else{ + dwOpts = OPT_DEL | OPT_UPLOAD; + } + + return dwOpts; +} +//--------------------------------------------------------------------------- + +String TAudStylePanel::ChargeTip( TStyleItem* pItem ) +{ + String strTip; + + if( pItem->pStyle->idLoc==0 ){ + strTip = "շѣ"; + strTip += IntToStr( ((TStyleItem*)pItem)->pStyle->pOrigin->cost ); + strTip += ""; + } + else if( pItem->pStyle->idLoc==1 ){ + strTip = " շѷ\n\n \n"; + strTip += "------------------------"; + + STYLELIST aStyles; + TPROSTYLE* info = pItem->pStyle; + char buf[512]; + + for( int s=0; s<4; s++ ){ + int rep = s<2 ? 1 : 2; + for( int r=0; rpShare->nSegNum[s]; + int iStart = r * 4, + iEnd = iStart + ( r==0 ? ( nSegNum & 0x0F ) : ( nSegNum>>4 )); + + for( int n=iStart; npShare->trkRef[s][n][t].idStyle>0; t++ ){ + TPROSTYLE* pTrkInfo = GetStyleInfo( 0, info->pShare->trkRef[s][n][t].idStyle ); + if( pTrkInfo->pOrigin->cost>0 ){ + bool bMatch = false; + for( int k=0; kidStyle, + pTrkInfo->pOrigin->cost ); + strTip += buf; + } + } + } + } + } + } + } + + return strTip; +} +//--------------------------------------------------------------------------- + +TStyleItem* __fastcall TAudStylePanel::AddStyleItem( TPROSTYLE* info, bool bCollected ) +{ + TStyleItem* pStyItem = CreateStyleItem( info, bCollected, true ); + InsertStyleItem( pStyItem, m_aItems->Count ); + + return pStyItem; +} +//--------------------------------------------------------------------------- + +void __fastcall TAudStylePanel::ListTypeClick(TObject *Sender) +{ + TPNGButton* pBtn = (TPNGButton*)Sender; + + if( !pBtn->Down ){ + pBtn->Down = true; + + for( int i=1; iTag; + } + else{ + m_lstBtnTools[i]->Down = false; + } + } + + if( m_SearchPanel ){ + m_SearchPanel->Reset(); + if( ((TPNGButton*)m_lstBtnTools[0])->Down ){ + CMClick( NULL ); + } + } + + PostMessage( Handle, UM_SEARCH, 0, 0 ); + } +} +//--------------------------------------------------------------------------- + +void TAudStylePanel::RefreshList() +{ + bool bAuthority = SOFTWARE_ID==e_Pro_Lite || g_bLogon + && (g_infoUser.accountInfo.authority & 0x1000); + + int iStart, iEnd, iStep; + STYLELIST& lstStyles = m_iListType==LIST_RECOMMAND ? g_aRecomStyles + : m_iListType==LIST_ORIGIN ? g_aOriginStyles + : m_iListType==LIST_SHARE ? g_aShareStyles + : m_iListType==LIST_COLLECTION ? g_aCollectStyles + : g_aLocalStyles; + + if( !lstStyles.empty() ){ + if( m_SearchPanel->iSortType==0 && m_SearchPanel->iSortMode==1 ){ + iStart = 0; + iEnd = lstStyles.size(); + iStep = 1; + } + else{ + iStart = lstStyles.size()-1; + iEnd = -1; + iStep = -1; + } + + for( int ind=iStart; ind!=iEnd; ind+=iStep ){ + TPROSTYLE* info = lstStyles[ind]; + + bool bCollect = false; + + if( m_iListType!=LIST_LOCAL ) + bCollect = IsCollected( info->idLoc, info->idStyle ); + + // + bool bAdd = false; + if( m_SearchPanel->DStyle.Length==10 || m_iListType==LIST_LOCAL ){ + bAdd = true; + } + else{ + for( int cunt=0; !bAdd && cuntDStyle.Length; cunt++ ){ + if( info->idLoc==0 ){ + TSTYLEDETAIL& detail = info->pOrigin->detail; + for( int ity=0;ity=0 && detail.type[ity]<=23 + &&( detail.type[ity] == m_SearchPanel->DStyle[cunt] + || m_SearchPanel->DStyle[cunt] == -2 + && detail.type[ity] >8 ) ){ // >8" Ϊ + bAdd = true; + break; + } + } + } + else if( info->idLoc==1 ){ + TSTYLESHARE* detail = info->pShare; + for( int ity=0;itytype);ity++ ){ + //жǷ + if( detail->type[ity]>=0 && detail->type[ity]<=23 + &&( detail->type[ity] == m_SearchPanel->DStyle[cunt] + || m_SearchPanel->DStyle[cunt] == -2 + && detail->type[ity] > 8 ) ){ // >8" Ϊ + bAdd = true; + break; + } + } + } + else if( m_SearchPanel->DStyle[cunt] == -2 ){ + bAdd = true; + break; + } + } + } + + if( bAdd ){ + // + TStyleItem* pStyItem = NULL; + + bool bInstSearch = m_SearchPanel->DInStr.Length>0; + if( bInstSearch ){ + pStyItem = CreateInstrumentItem( info, bCollect, bAuthority ); + } + else if( m_iListType!=LIST_COLLECTION || bCollect ){ + pStyItem = CreateStyleItem( info, bCollect, bAuthority ); + } + + if( pStyItem ){ + if( pStyItem->aItems->Count>0 ){ + int index = m_aItems->Count; + if( m_SearchPanel->iSortType==3 ){ //ٶ + int iMode = m_SearchPanel->iSortMode, + iTempo = info->idLoc==0 ? info->pOrigin->detail.iTempo + : info->idLoc==1 ? info->pShare->iTempo + : info->pLocal->iTempo; + + for( int i=0; iCount; i++ ){ + TStyleItem* pTmpSty = (TStyleItem*)m_aItems->Items[i]; + int tmpTempo = pTmpSty->pStyle->idLoc==0 + ? pTmpSty->pStyle->pOrigin->detail.iTempo + : pTmpSty->pStyle->idLoc==1 + ? pTmpSty->pStyle->pShare->iTempo + : pTmpSty->pStyle->pLocal->iTempo; + + if( iMode==0 && iTempo > tmpTempo + || iMode==1 && iTempo < tmpTempo ){ + index = i; + break; + } + } + + } + else if( ( m_iListType==LIST_ORIGIN || m_iListType==LIST_RECOMMAND ) + && m_SearchPanel->iSortType!=0 ){ //۸/ + int iType = m_SearchPanel->iSortType, + iMode = m_SearchPanel->iSortMode, + cost = info->pOrigin->cost, + score = info->pOrigin->score; + for( int i=0; iCount; i++ ){ + TStyleItem* pTmpSty = (TStyleItem*)m_aItems->Items[i]; + int tmpCost = pTmpSty->pStyle->pOrigin->cost, + tmpScore = pTmpSty->pStyle->pOrigin->score; + + if( iMode==0 && ( iType==1 && cost > tmpCost + || iType==2 && score > tmpScore ) + || iMode==1 && ( iType==1 && cost < tmpCost + || iType==2 && score < tmpScore )){ + index = i; + break; + } + } + } + + InsertStyleItem( pStyItem, index ); + } + else{ + delete pStyItem; + } + } + } + } + } + + if( m_aItems->Count>0 ){ + m_pTopItem = (TCommonItem*)m_aItems->First(); + } +} +//--------------------------------------------------------------------------- + +TStyleItem* TAudStylePanel::CreateInstrumentItem( TPROSTYLE* info, bool bCollected, bool bAuthority ) +{ + TStyleItem* pStyItem = NULL; + + for( int s=0; sidLoc==0 ? info->pOrigin->detail.nSegNum[s] + : info->idLoc==1 ? info->pShare->nSegNum[s] + : info->pLocal->nSegNum[s]; + int num = s>4 ); + if( num>0 ){ + for( int i=0; iidLoc==0 && info->pOrigin->detail.tracks[s][sn][j].no>=0 + && info->pOrigin->detail.tracks[s][sn][j].no!=9 + || info->idLoc==1 && info->pShare->trkRef[s][sn][j].idStyle>=0 + && info->pShare->trkRef[s][sn][j].chan!=9 + || info->idLoc>0 && info->pLocal->trkRef[s][sn][j].idStyle>=0 + && info->pLocal->trkRef[s][sn][j].chan!=9 ){ + char prog = info->idLoc==0 ? info->pOrigin->detail.tracks[s][sn][j].prog + : info->idLoc==1 ? info->pShare->trkRef[s][sn][j].prog + : info->pLocal->trkRef[s][sn][j].prog; + for( int m=0;mDInStr.Length;m++ ){ + if( m_SearchPanel->DInStr[m]==prog ){ + if( !pStyItem ){ //ӷ + DWORD dwOpts = GetStyleOptions( info ); + //pStyItem = AddStyle( info, dwOpts ); + pStyItem = new TStyleItem( info, dwOpts ); + +// if( bCollected ) +// pStyItem->SetCollect( true ); + } + + if( pStyItem && !pSegItem ){ + int vol = info->idLoc==0 ? 100 + : info->idLoc==1 ? info->pShare->nSegVol[s][sn] + : info->pLocal->nSegVol[s][sn]; + pSegItem = pStyItem->AddSegment( s, sn, 0, 0, -1, vol ); + } + + if( pSegItem ){ //Ӿ + pSegItem->AddTrack( info, sn, j, info->idLoc<=1?OPT_COLLECT:0, bAuthority ); + } + } + } + } + } + + if( pSegItem ){ + if( pSegItem->aItems->Count>0 ){ + if( s==SEGTYPE_INTRO ){ + pSegItem->nBars = info->idLoc==0 ? info->pOrigin->detail.aIntroBars[sn] + : info->idLoc==1 ? info->pShare->aIEBars[0][sn] + : info->pLocal->aIEBars[0][sn]; + } + else if( s==SEGTYPE_ENDING ){ + pSegItem->nBars = info->idLoc==0 ? info->pOrigin->detail.aEndingBars[sn] + : info->idLoc==1 ? info->pShare->aIEBars[1][sn] + : info->pLocal->aIEBars[1][sn]; + } + } + else{ + pStyItem->DeleteSegment( pSegItem ); + } + } + } + } + } + } + + return pStyItem; +} +//--------------------------------------------------------------------------- + +TStyleItem* TAudStylePanel::CreateStyleItem( TPROSTYLE* info, bool bCollected, bool bAuthority ) +{ + DWORD dwOpts = GetStyleOptions( info ); + + TStyleItem* pStyItem = new TStyleItem( info, dwOpts ); + +// if( bCollected ) pStyItem->SetCollect( true ); + + for( int s=0; sidLoc==0 ? info->pOrigin->detail.nSegNum[s] + : info->idLoc==1 ? info->pShare->nSegNum[s] + : info->pLocal->nSegNum[s]; + int num = s>4 ); + if( num>0 ){ + DWORD opts = sidLoc==0 ? 100 + : info->idLoc==1 ? info->pShare->nSegVol[s][sn] + : info->pLocal->nSegVol[s][sn]; + + TSegmentItem* pSegItem = pStyItem->AddSegment( s, sn, opts, 0, -1, vol ); + + for( int j=0; j<16; j++ ){ + pSegItem->AddTrack( info, sn, j, info->idLoc<=1?OPT_COLLECT:0, bAuthority ); + } + + if( pSegItem->aItems->Count>0 ){ + if( s==SEGTYPE_INTRO ){ + pSegItem->nBars = info->idLoc==0 ? info->pOrigin->detail.aIntroBars[sn] + : info->idLoc==1 ? info->pShare->aIEBars[0][sn] + : info->pLocal->aIEBars[0][sn]; + } + else if( s==SEGTYPE_ENDING ){ + pSegItem->nBars = info->idLoc==0 ? info->pOrigin->detail.aEndingBars[sn] + : info->idLoc==1 ? info->pShare->aIEBars[1][sn] + : info->pLocal->aIEBars[1][sn]; + } + } + else{ + pStyItem->DeleteSegment( pSegItem ); + } + } + } + } + } + + return pStyItem; +} +//--------------------------------------------------------------------------- + +void TAudStylePanel::InsertStyleItem( TStyleItem* pStyItem, int index ) +{ + if( indexCount ){ + if( index>0 ){ + TCommonItem* pPrev = (TCommonItem*)m_aItems->Items[index-1]; + pPrev->next = pStyItem; + pStyItem->prev = pPrev; + } + + TCommonItem* pNext = (TCommonItem*)m_aItems->Items[index]; + pNext->prev = pStyItem; + pStyItem->next = pNext; + } + else if( m_aItems->Count>0 ){ + TCommonItem *pLast = (TCommonItem*)m_aItems->Last(); + + pLast->next = pStyItem; + pStyItem->prev = pLast; + } + + m_aItems->Insert( index, pStyItem ); + + m_nTotalLine++; +} +//--------------------------------------------------------------------------- + +void __fastcall TAudStylePanel::ReloadLocalStyle( bool bShow ) +{ + if( m_iListType==LIST_LOCAL ){ + PostMessage( Handle, UM_SEARCH, 0, 0 ); + } + else if( bShow ){ + ListTypeClick( m_lstBtnTools[1] ); + } +} +//--------------------------------------------------------------------------- + +void TAudStylePanel::DeleteItem( TCommonItem *pItem, int iLine ) +{ + if( pItem->iType==SEGTYPE_STYLE ){ + TPROSTYLE* pStyle = ((TStyleItem*)pItem)->pStyle; + //Ƿʹ + bool bUsed = false; + + if( g_pUseStyle ){ + TStyleItem* pStyItem = (TStyleItem*)g_pUseStyle; + if( pStyItem->pStyle==pStyle ) + bUsed = true; + + for( int i=0; !bUsed && iaItems->Count; i++ ){ + TSegmentItem* pSeg = (TSegmentItem*)pStyItem->aItems->Items[i]; + for( int j=0; !bUsed && jaItems->Count; j++ ){ + TTrackItem* pTrk = (TTrackItem*)pSeg->aItems->Items[j]; + if( pTrk->pStyle==pStyle ){ + bUsed = true; + } + } + } + } + + if( !bUsed && g_pPreStyle ){ + TStyleItem* pStyItem = (TStyleItem*)g_pPreStyle; + if( pStyItem->pStyle==pStyle ) + bUsed = true; + + for( int i=0; !bUsed && iaItems->Count; i++ ){ + TSegmentItem* pSeg = (TSegmentItem*)pStyItem->aItems->Items[i]; + for( int j=0; !bUsed && jaItems->Count; j++ ){ + TTrackItem* pTrk = (TTrackItem*)pSeg->aItems->Items[j]; + if( pTrk->pStyle==pStyle ){ + bUsed = true; + } + } + } + } + + if( bUsed ){ + MessageForm->ShowMessage( "÷ʹû༭У޷ɾ", + MB_ICONERROR | MB_OK, "ɾ" ); + return; + } + + bUsed = false; + TPROSTYLE* pExampleStyle = NULL; + for( int i=0; !bUsed && iCount; i++ ){ + if( pItem==m_aItems->Items[i] ) + continue; + + TStyleItem* pSty = (TStyleItem*)m_aItems->Items[i]; + for( int j=0; !bUsed && jaItems->Count; j++ ){ + TSegmentItem* pSeg = (TSegmentItem*)pSty->aItems->Items[j]; + for( int k=0; kaItems->Count; k++ ){ + TTrackItem* pTrk = (TTrackItem*)pSeg->aItems->Items[k]; + + if( pTrk->pStyle->idLoc==pStyle->idLoc + && pTrk->pStyle->idStyle==pStyle->idStyle ){ + bUsed = true; + pExampleStyle = pSty->pStyle; + break; + } + } + } + } + + String strMsg = "ȷɾط"; + strMsg += UTF8ToMBCS(pStyle->pLocal->strStyleName).c_str(); + strMsg += ""; + + if( bUsed ){ + char buff[512]; + sprintf( buff, "\n\nò޸ L%d%sȷ", + LOWORD(pExampleStyle->idStyle), + UTF8ToMBCS(pExampleStyle->pLocal->strStyleName).c_str() ); + strMsg += buff; + } + + if( mrCancel==MessageForm->ShowMessage(strMsg, MB_ICONQUESTION | MB_OKCANCEL) ) + return; + + f_CM_DeleteLocalStyle( pStyle->idLoc, pStyle->idStyle ); + DeleteStyleInfo( pStyle->idLoc, pStyle->idStyle ); + + if( bUsed ) + Perform( UM_SEARCH, 0, 0 ); + else + TStylePanel::DeleteItem( pItem, iLine ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TAudStylePanel::EditChange(TObject *Sender) +{ + TEdit* pEdit = ((TEdit*)Sender); + + AnsiString strName = pEdit->Text.Trim(); + string strTmp = GBToUTF8(strName.c_str()); + + if( strTmp.length()>pEdit->MaxLength ){ + pEdit->OnChange = NULL; + pEdit->Text = pEdit->Text.SubString( 0, pEdit->Text.Length()-1 ); + pEdit->SelStart = pEdit->Text.Length(); + pEdit->OnChange = EditChange; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TAudStylePanel::EditMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) +{ + if( X>0 && XWidth && Y>0 && YHeight ) + Screen->Cursor = crIBeam; + else + Screen->Cursor = crArrow; +} +//--------------------------------------------------------------------------- + +void __fastcall TAudStylePanel::EditMouseDown(TObject *Sender, TMouseButton Button, + TShiftState Shift, int X, int Y) +{ + if( X<0 || X>m_editName->Width || Y<0 || Y>m_editName->Height ){ + ReleaseCapture(); + + TPoint pt( X, Y ); + pt = m_editName->ClientToScreen( pt ); + pt = ScreenToClient( pt ); + bool bInsideAudPanel = pt.x>0 && pt.x0 && pt.yHide(); + Screen->Cursor = crDefault; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TAudStylePanel::EditMouseUp(TObject *Sender, TMouseButton Button, + TShiftState Shift, int X, int Y) +{ + SetCapture( m_editName->Handle ); +} +//--------------------------------------------------------------------------- + +void __fastcall TAudStylePanel::EditKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) +{ + switch( Key ){ + case VK_RETURN: + StyleRename(); + m_editName->Hide(); + ReleaseCapture(); + Screen->Cursor = crDefault; + + break; + + case VK_ESCAPE: + m_editName->Hide(); + ReleaseCapture(); + Screen->Cursor = crDefault; + + break; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TAudStylePanel::RenameTiming(int op) +{ + if( m_RenameTimer ){ + delete m_RenameTimer; + m_RenameTimer = NULL; + } + + if( m_bDoubleClick ){ + m_bDoubleClick = false; + } + else if( op==1 ){ + m_RenameTimer = new TTimer(this); + m_RenameTimer->Interval = GetDoubleClickTime(); + m_RenameTimer->OnTimer = RenameTimerProc; + m_RenameTimer->Enabled = true; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TAudStylePanel::RenameTimerProc(System::TObject* Sender) +{ + if( m_RenameTimer ){ + DoRename( NULL ); + + delete m_RenameTimer; + m_RenameTimer = NULL; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TAudStylePanel::DoRename(TObject* Sender) +{ + if( m_iListType!=LIST_LOCAL ) + return; + + if( Sender ){ + SetSelect( m_pFocItem, m_iFocLine ); + } + + if( m_iFocLine==m_nItemShow-1 ){ + ScrollView( m_iTopLine+1 ); + } + + if( m_editName && m_pSelItem ){ + m_editName->Tag = (int)m_pSelItem; + + String strText; + m_pSelItem->AddStyleId( strText ); + int left = LEFT_BOUND + OPTION_WIDTH + Canvas->TextWidth( strText ); + int nOpt = m_pSelItem->aOptions->Count; + int top = ( m_editName->Font->Size==g_szFont9 ? 0 : 2 ) + m_iSelLine*m_nItemHeight+m_nTitleHeight; + int height = m_editName->Font->Size==g_szFont9 ? 16 : 13; + + + m_editName->SetBounds( left + LEFT_BOUND, + top, + Width - left - nOpt * OPTION_WIDTH - RIGHT_BOUND - 4, + height ); + + + TPROSTYLE* pStyle = ((TStyleItem*)m_pSelItem)->pStyle; + strText = UTF8ToMBCS(pStyle->pLocal->strStyleName).c_str(); + + m_editName->Text = strText; + + m_editName->Show(); + m_editName->SelectAll(); + + m_editName->SetFocus(); + SetCapture( m_editName->Handle ); + } +} +//--------------------------------------------------------------------------- + +void TAudStylePanel::StyleRename() +{ + if( !m_pSelItem ) + return; + + String strOldName, strNewName; + +// TStyleItem* pStyItem = (TStyleItem*)m_editName->Tag; + TPROSTYLE* pStyle = ((TStyleItem*)m_pSelItem)->pStyle; + +/* if( pStyle->idLoc==1 ) + strOldName = UTF8ToMBCS(pStyle->pShare->strStyleName).c_str(); + else if( pStyle->idLoc!=(UINT)-1 ) +*/ strOldName = UTF8ToMBCS(pStyle->pLocal->strStyleName).c_str(); + + strNewName = m_editName->Text.Trim(); + + if( strNewName.Length()>0 && strNewName.Compare( strOldName ) ){ + string strName = GBToUTF8(AnsiString(strNewName.c_str()).c_str()).c_str(); + strcpy( pStyle->pLocal->strStyleName, strName.c_str() ); + + f_CM_ChangeLocalStyle( pStyle ); + } +} +//--------------------------------------------------------------------------- + diff --git a/AudStylePanel.h b/AudStylePanel.h new file mode 100644 index 0000000..1ba9d83 --- /dev/null +++ b/AudStylePanel.h @@ -0,0 +1,75 @@ +//--------------------------------------------------------------------------- + +#ifndef AudStylePanelH +#define AudStylePanelH + +#include "StylePanel.h" +#include "StyleSelPanel.h" +//--------------------------------------------------------------------------- +class TAudStylePanel : public TStylePanel +{ +private: + bool IsCollected( UINT idLoc, UINT idStyle ); + DWORD GetStyleOptions( TPROSTYLE* info ); + void RefreshList(); + void StyleRename(); + + int m_iListType; + int m_nBtnCount; + bool m_bDoubleClick; + + TTimer *m_RenameTimer; + +protected: + TStyleSelPanel *m_SearchPanel; // + + void SetDownload( TCommonItem *pItem ); + TStyleItem* CreateInstrumentItem( TPROSTYLE* info, bool bCollected, bool bAuthority ); + TStyleItem* CreateStyleItem( TPROSTYLE* info, bool bCollected, bool bAuthority ); + void InsertStyleItem( TStyleItem* pStyItem, int index ); + TStyleItem* __fastcall AddStyleItem( TPROSTYLE* info, bool bCollected ); + + virtual void Init(); + virtual bool StartDrag(); + virtual void SetScrollTimer(TPoint ptNew){}; + virtual void PlayDemo( TCommonItem *pItem, int tempo ); + virtual void DeleteItem( TCommonItem *pItem, int iLine ); + virtual String ChargeTip( TStyleItem* pItem ); + virtual bool CanVSplit(){ return true; }; + + void __fastcall CMClick(System::TObject* Sender); //pngbutton + void __fastcall ListTypeClick( TObject *Sender ); + void __fastcall RenameTimerProc(System::TObject* Sender); + void __fastcall EditMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, + int X, int Y); + void __fastcall EditMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, + int X, int Y); + void __fastcall EditMouseMove(TObject *Sender, TShiftState Shift, int X, int Y); + void __fastcall EditKeyDown(TObject *Sender, WORD &Key, TShiftState Shift); + void __fastcall EditChange(TObject *Sender); + + virtual void __fastcall RenameTiming(int op); // + virtual void __fastcall DoRename(TObject* Sender); + virtual void __fastcall DoCollect(TObject* Sender); + virtual void __fastcall DoubleClick(TObject* sender); + + MESSAGE void __fastcall OnNetworkError(TMessage &msg); + MESSAGE void __fastcall OnNetworkMessage(TMessage &msg); + MESSAGE void __fastcall WMSize(Winapi::Messages::TWMSize &Message); //add + MESSAGE void __fastcall UMSearchStyle(TMessage &msg); + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(MSG_NETWORKERROR, TMessage, OnNetworkError) + MESSAGE_HANDLER(MSG_NETWORKMESSAGE, TMessage, OnNetworkMessage) + MESSAGE_HANDLER(WM_SIZE, TWMSize, WMSize) //add + MESSAGE_HANDLER(UM_SEARCH,TMessage,UMSearchStyle); + END_MESSAGE_MAP(TStylePanel) + +public: + __fastcall virtual TAudStylePanel(System::Classes::TComponent* AOwner); + __fastcall ~TAudStylePanel(); + + void __fastcall ReloadLocalStyle( bool bShow=true ); +}; + +#endif diff --git a/AudioFxFormUnit.cpp b/AudioFxFormUnit.cpp new file mode 100644 index 0000000..712bbd1 --- /dev/null +++ b/AudioFxFormUnit.cpp @@ -0,0 +1,388 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop + +#include "GlobalUnit.h" +#include "AudioFxFormUnit.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma link "GeneralDialogPanel" +#pragma link "TextButton" +#pragma link "ComboBoxComponent" +#pragma link "PNGButton" +#pragma link "SkinTrackBar" +#pragma resource "*.dfm" + +#define TIMER_INTERVAL 50 +#define FX_TOP_BOUND 24 +#define FX_BOTTOM_BOUND 24 +#define FX_LEFT_BOUND 40 +#define FX_ITEM_HEIGHT 40 + +TAudioFxForm *AudioFxForm; +//--------------------------------------------------------------------------- +__fastcall TAudioFxForm::TAudioFxForm( TComponent* Owner, int iTrk, double start, double end, + int iInd, int iFx, int iPlugin ) + : TForm(Owner) +{ + m_iTrack = iTrk; + m_iInd = iInd; + m_iFx = iFx; + m_iPlugin = iPlugin; + memset( m_fParam, 0, sizeof(float)*6 ); + memset( m_lstCaption, 0, sizeof(void*)*6 ); + memset( m_lstTrack, 0, sizeof(void*)*6 ); + + m_iCurrPos = 0; + m_dblPos = 0; + m_dblStep = TIMER_INTERVAL * (double)g_nMelodyTempo / g_nBPM / 60.0 / ( end - start ); + m_dblStart = start; + m_dblEnd = end; +} +//--------------------------------------------------------------------------- + +__fastcall TAudioFxForm::~TAudioFxForm() +{ + for( int i=0; i<6 && m_lstCaption[i]; i++ ){ + delete m_lstCaption[i]; + delete m_lstTrack[i]; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TAudioFxForm::FormClose(TObject *Sender, TCloseAction &Action) +{ + if( m_btnStop->Visible ){ + StopClick( NULL ); + } + + if( m_iFx>=FX_VST ) + f_MM_ShowVSTEditor( NULL, NULL, NULL, NULL, m_iTrack, m_iInd, NULL ); +} +//--------------------------------------------------------------------------- + +void __fastcall TAudioFxForm::PlayClick(TObject *Sender) +{ + double dblPos = ( (double)m_tbPosition->Position / m_tbPosition->Max ) * ( m_dblEnd - m_dblStart ) + m_dblStart; + + m_btnPlay->Visible = false; + m_btnStop->Visible = true; + + f_MM_Play( Handle, dblPos, TYPE_AUDIOFX|g_iSelAudio ); + SetPlayTimer( true, m_tTimer, m_tAccuracy, Handle, TIMER_INTERVAL ); +} +//--------------------------------------------------------------------------- + +void __fastcall TAudioFxForm::PowerClick(TObject *Sender) +{ + m_btnPowerOn->Visible = Sender==m_btnPowerOff; + m_btnPowerOff->Visible = !m_btnPowerOn->Visible; + + if( m_iFx>=FX_VST ) + f_MM_AudioSetFxParam( m_iTrack, m_iInd, (void*)m_btnPowerOn->Visible, 0 ); + else + f_MM_AudioSetFxParam( m_iTrack, m_iInd, (void*)(m_btnPowerOn->Visible ? m_fParam : NULL), 0 ); + + if( m_iInd<0 ) + m_btnOk->Enabled = m_btnPowerOn->Visible; +} +//--------------------------------------------------------------------------- + +void __fastcall TAudioFxForm::StopClick(TObject *Sender) +{ + m_btnStop->Visible = false; + m_btnPlay->Visible = true; + + f_MM_Stop(); + SetPlayTimer(false, m_tTimer, m_tAccuracy); +} +//--------------------------------------------------------------------------- + +void __fastcall TAudioFxForm::LoopClick(TObject *Sender) +{ + m_btnLoop->Down = !m_btnLoop->Down; +} +//--------------------------------------------------------------------------- + +void __fastcall TAudioFxForm::PresetChange(TComboBoxItem *Sender, int Index) +{ + if( m_iFxDefItemIndex!=m_cbPreset->ItemsCount-1 ){ + int iFxNo = m_iFx==FX_PITCH ? MAX_FX_NUM-1 : m_iFx; + + GetFxPreset( m_iFx, m_cbPreset->DefItemIndex, m_fParam ); + + for( int i=0; i<6 && m_lstTrack[i]; i++ ){ + m_lstTrack[i]->OnChange = NULL; + + if( m_iFx==FX_PITCH ){ + m_lstTrack[i]->Position = (int)m_fParam[i]; + } + else{ + int pos = Param2Pos( iFxNo, i, m_fParam[i] ); + m_lstTrack[i]->Position = pos; + } + + m_lstTrack[i]->Hint = IntToStr(m_lstTrack[i]->Position); + m_lstTrack[i]->OnChange = TrackBarChange; + } + + if( m_btnPowerOn->Visible ) + f_MM_AudioSetFxParam( m_iTrack, m_iInd, (void*)m_fParam, 0 ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TAudioFxForm::TrackBarChange(TObject *Sender) +{ + TSkinTrackBar* pTrack = (TSkinTrackBar*)Sender; + int nPos = pTrack->Position; + pTrack->Hint = IntToStr(nPos); + + int iFxNo = m_iFx==FX_PITCH ? MAX_FX_NUM-1 : m_iFx; + if( m_cbPreset->DefItemIndex!=m_cbPreset->ItemsCount-1 ) + m_cbPreset->DefItemIndex = m_cbPreset->ItemsCount-1; + + float fParam = Pos2Param( iFxNo, pTrack->Tag, nPos ); + m_fParam[pTrack->Tag] = fParam; + + if( m_btnPowerOn->Visible ) + f_MM_AudioSetFxParam( m_iTrack, m_iInd, (void*)m_fParam, 0 ); +} +//--------------------------------------------------------------------------- + +void __fastcall TAudioFxForm::UMMediaTime(TMessage &Message) +{ + m_dblPos += m_dblStep; + m_iCurrPos = (DWORD)( m_dblPos + 0.5 ); + + if( m_iCurrPos==m_tbPosition->Position ) + return; + + if( m_iCurrPos >= m_tbPosition->Max ){ + m_dblPos = 0; + m_iCurrPos = 0; + + if( m_btnLoop->Down ){ + f_MM_Play( Handle, m_dblStart, TYPE_AUDIOFX | g_iSelAudio ); + } + else{ + StopClick( NULL ); + } + } + + m_tbPosition->Position = m_iCurrPos; +} +//--------------------------------------------------------------------------- + +void __fastcall TAudioFxForm::PositionChange(TObject *Sender) +{ + if( m_iCurrPos!=m_tbPosition->Position ){ + m_iCurrPos = m_tbPosition->Position; + m_dblPos = m_iCurrPos; + + if( m_btnStop->Visible ){ + SetPlayTimer(false, m_tTimer, m_tAccuracy); + + double dblPos = ( (double)m_tbPosition->Position / m_tbPosition->Max ) * ( m_dblEnd - m_dblStart ) + m_dblStart; + f_MM_Play( Handle, dblPos, TYPE_AUDIOFX | g_iSelAudio ); + + SetPlayTimer( true, m_tTimer, m_tAccuracy, Handle, TIMER_INTERVAL ); + } + } +} +//--------------------------------------------------------------------------- + +void __fastcall TAudioFxForm::FormResize(TObject *Sender) +{ + m_panShow->SetBounds( m_panShow->Left, m_panShow->Top, + ClientWidth - 50, ClientHeight - 155 ); + + m_tbPosition->Width = m_panShow->Width; + m_tbPosition->Top = ClientHeight - 69; + + m_btnPlay->Top = ClientHeight - 43; + m_btnStop->Top = m_btnPlay->Top; + m_btnLoop->Top = m_btnPlay->Top; + m_btnOk->Top = m_btnPlay->Top + 1; + m_btnCancel->Top = m_btnOk->Top; + + m_btnPowerOn->Left = ClientWidth - 66; + m_btnPowerOff->Left = m_btnPowerOn->Left; + m_btnCancel->Left = ClientWidth - 83; + m_btnOk->Left = ClientWidth - 148; +} +//--------------------------------------------------------------------------- + +void __fastcall TAudioFxForm::UMEditorResize(TMessage &Message) +{ + int nWidth = Message.WParam, + nHeight = Message.LParam; + + if( nWidth==0 ) + nWidth = 300; + if( nHeight==0 ) + nHeight = 150; + + SetBounds( Left, Top, nWidth + 50, nHeight + 155 ); +} +//--------------------------------------------------------------------------- + +void __fastcall TAudioFxForm::FormCreate(TObject *Sender) +{ + m_BKGPanel->Font->Size = g_szFont9; + m_btnCancel->FontSize = g_szFont9; + m_btnOk->FontSize = g_szFont9; + m_cbPreset->SetFont(g_strTxtFontName, g_szFont9); + + String strCaption = m_BKGPanel->Caption + L" - "; + int nFormWidth = m_panShow->Width + 50, + nFormHeight = m_panShow->Height + 155; + + m_lblNoParams->Visible = false; + + if( m_iInd>=0 ) + m_btnOk->Text = "ȷ"; + + if( m_iFx>=FX_VST ){ + m_cbPreset->AddItem( "(Ĭ)" ); + m_cbPreset->DefItemIndex = 0; + + if( m_iPlugin<0 ) + strCaption += g_lstVSTFx[m_iFx-FX_VST]->strVSTName; + else + strCaption += g_lstVSTFx[m_iFx-FX_VST]->aPlugins[m_iPlugin]->name; + + int nWidth(0), nHeight(0); + if( f_MM_ShowVSTEditor( Handle, m_panShow->Handle, &nWidth, &nHeight, + m_iTrack, m_iInd, NULL )==S_OK ){ + if( nWidth<0 && nHeight<0 ){ + m_lblNoParams->Visible = true; + } + else{ + if( nWidth==0 || nHeight==0 ) + BorderStyle = bsSizeable; + + if( nWidth==0 ) + nWidth = 300; + if( nHeight==0 ) + nHeight = 150; + + nFormWidth = nWidth + 50; + nFormHeight = nHeight + 155; + } + } + } + else{ + int iFxNo = m_iFx==FX_PITCH ? MAX_FX_NUM-1 : m_iFx, + n = GetFxParamNum( m_iFx ), + t = FX_TOP_BOUND; + + strCaption += g_strEffect[iFxNo]; + + int nItemCount = 0; + for( int i=0; i<3; i++ ){ + if( strlen( g_strEffectPreset[iFxNo][i] )>0 ){ + m_cbPreset->AddItem( g_strEffectPreset[iFxNo][i] ); + nItemCount++; + } + else + break; + } + + m_cbPreset->AddItem( "Զ" ); + + if( false ){ + m_cbPreset->DefItemIndex = 0; + } + else{ + m_cbPreset->DefItemIndex = 0; + } + + if( m_iInd<0 || m_iInd>=g_aAudioTracks[m_iTrack]->lstFxs.size() ){ + GetFxPreset( m_iFx, m_cbPreset->DefItemIndex, m_fParam ); + f_MM_AudioSetFxParam( m_iTrack, m_iInd, (void*)m_fParam, 0 ); + } + else{ + TAudioFx* pFx = g_aAudioTracks[m_iTrack]->lstFxs[m_iInd]; + m_cbPreset->DefItemIndex = pFx->iPreset; + memcpy( m_fParam, pFx->pParam, sizeof(float) * pFx->nParamSize ); + + m_btnPowerOn->Visible = !pFx->bBypass; + m_btnPowerOff->Visible = !!pFx->bBypass; + } + + for( int i=0; iParent = m_panShow; + m_lstCaption[i]->Layout = tlBottom; + m_lstCaption[i]->Font->Name = g_strTxtFontName; + m_lstCaption[i]->Font->Size = g_szFont9; + m_lstCaption[i]->Font->Color = RGB( 156, 170, 189 ); + m_lstCaption[i]->SetBounds( FX_LEFT_BOUND, t, 60, 18 ); + m_lstCaption[i]->Caption = g_strEffectParamName[iFxNo][i]; + m_lstCaption[i]->Caption += ":"; + + m_lstTrack[i] = new TSkinTrackBar(this); + m_lstTrack[i]->Parent = m_panShow; + m_lstTrack[i]->ShowHint = true; + m_lstTrack[i]->Tag = i; + m_lstTrack[i]->SetBounds( 104, t, 209, 18 ); + + if( m_iFx==FX_PITCH ){ + m_lstTrack[i]->Min = -36; + m_lstTrack[i]->Max = 36; + m_lstTrack[i]->PageSize = 12; + m_lstTrack[i]->Position = (int)m_fParam[i]; + } + else{ + int pos = Param2Pos( iFxNo, i, m_fParam[i] ); + m_lstTrack[i]->Position = pos; + } + + m_lstTrack[i]->Hint = IntToStr(m_lstTrack[i]->Position); + m_lstTrack[i]->OnChange = TrackBarChange; + + t += FX_ITEM_HEIGHT; + } + + nFormHeight = t + 155; + } + + m_BKGPanel->Caption = strCaption; + SetBounds( Left, Top, nFormWidth, nFormHeight ); + + SetTransparent( this ); +} +//--------------------------------------------------------------------------- + +int __fastcall TAudioFxForm::GetParamCount() +{ + int count = 0; + + for( int i=0; i<6 && m_lstCaption[i]; i++ ){ + count++; + } + + return count; +} +//--------------------------------------------------------------------------- + +int __fastcall TAudioFxForm::GetPreset() +{ + return m_cbPreset->DefItemIndex; +} +//--------------------------------------------------------------------------- + +bool __fastcall TAudioFxForm::IsBypass() +{ + return m_btnPowerOff->Visible; +} +//--------------------------------------------------------------------------- + +void __fastcall TAudioFxForm::OkClick(TObject *Sender) +{ + f_MM_SaveVSTParams( m_iTrack, m_iInd, false ); +} +//--------------------------------------------------------------------------- + diff --git a/AudioFxFormUnit.dfm b/AudioFxFormUnit.dfm new file mode 100644 index 0000000..e95ba2c --- /dev/null +++ b/AudioFxFormUnit.dfm @@ -0,0 +1,833 @@ +object AudioFxForm: TAudioFxForm + Left = 0 + Top = 0 + BorderIcons = [] + BorderStyle = bsNone + ClientHeight = 238 + ClientWidth = 406 + Color = clBtnFace + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Position = poMainFormCenter + Scaled = False + OnClose = FormClose + OnCreate = FormCreate + OnResize = FormResize + TextHeight = 13 + object m_BKGPanel: TGeneralDialogPanel + Left = 0 + Top = 0 + Width = 406 + Height = 238 + Align = alClient + Caption = #38899#25928 + Color = 5064257 + ParentBackground = False + TabOrder = 0 + object m_btnPowerOff: TPNGButton + Left = 340 + Top = 38 + Width = 39 + Height = 26 + Hint = #25171#24320#38899#25928 + ParentCustomHint = False + ImgStates = 3 + ParentShowHint = False + PngImg.Data = { + 89504E470D0A1A0A0000000D49484452000000750000001A080600000089A613 + 33000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F33000004964944415478DAED9A5F4C144718 + C0BFBBDB8303EF3891F2C71339B1B641E8210891464B8D31312510904A09AD0F + DA36E9030F267DF2C5475F4C4C34C698D8342D264A1AFEA835D25209518AC490 + 801A0C29B1ADF45A4BEF304AE13882DC72F87DEB2EA1158FBDDB99E52EB949BE + ECECCCC2FE32BFDD99DB99312C2C2C806B5B31AC56BA7F772054B51143C048C0 + B0C847412ED72B0531448C398C59F928CA7551C96620A9F3F3F3663C49C6B0CB + 47B38E604A0A60CC604CCAC780DC50A9180E8CCD181918369DF988C387318EF1 + 08630C6342AEB362ACC3C89239AD32B35E89244ECB3C1E8C6774AE48B57F5051 + F995C7EBADD71168D9949599D9D2F963C717F0522E35D25BFB6B0F5CFFC3ED76 + AC36DB26A773ECEA95F62ACCFEAAE0D61EF8E8D4E8E868D56AB3E5E6E65EBFD2 + DEFA25663D8AD49CA2EDA5EE9CCD79ABCD067F3E1AA12ED949598C373076235B + 5B14B1D561B6472ECA43B6DE048B1504410093C90406A3110C06037716F2B610 + 0C923B104511E666A789AD1CAB4614A904F74B1435DC56828397DD6E0DB29D8B + 22B646CC7E2F179520DBB564EB5A10CC66146B06A38E52832855140320060230 + 33FD2FB15563D5A022D58570435A1A2EAFA0184ACACAE1D2376758345C21661F + 60E4603420DB8928623B8AD9EFE4A25DC8D66CB3A7813921517A5B8DF4B68621 + 35DF55023B76EE81A6F327C36291A4CA6F6960EE39F8269F12DB2758D517ED52 + 37611C44B6E351C4760CB397E4221A1A9A5252D32181A4E2DB6A32A1D830A4E6 + BD530CA5EFEE868B5F9F0E8B25287913A5B7740EA54E4D3C21B6C358D5C3446A + D97B7B2131D1021B9D6FC2ED9B9D909A960EF707FAB4341C33A91CD85E916A5F + 97B1285540A934AEF266A3F1545C2275F2D9381BA945A5BBA0A0B044CAFBA626 + C196628771CFDF9091B541BA695FCF0D708F3E8CA4E1344BE5C8A6592A0B362E + 52E929DBF2768104D5DD79199FB62D8B5D5C7AA603CAF7544052F21A18ECEF85 + 91E17BBA4AE5CCA6492A2B36E652E9E6FB2AEBA4A7ABEB8776A96CB971ABBAEE + 90F4145E6DF916FCD33E5DA4EAC016B154966CCCA5D24DAD561B34379D5D2C5B + 0E6E0D5EB3BFFE53F8CBFD3BFCDCDDA18B541DD82296CA928DB9D4839F1D81DF + 1E0E43FFEDEE9070942A6A3E06AB2D055A2F9ED745AA0E6C114B65C9C645EA72 + 7D3E01FEBF4CF951A0F673828554CE6C9AA4B262E322F546471B3CF18EAD786D + B8DF882CA47266D32495151B17A9C34383AABEA9DEDF5B09D91B73FF338EA868 + 384D5239B36992CA8A8DB9D40F1B3E97A6A7AEB55D58F1DA86438D30E3F7ABBA + 7649C3452C5507B688A5B264632E55E9EF57FA96A2A78D664BD476394B1A2E62 + A93AB0452C95251B97C907E55BEA75DD8902B6F49B2C8C86D334F9C0994DD3E4 + 032B366ED3840A20FD53EF3F8F11640C32B21CE0C8764A13DBE1361A2BA99CD9 + 344FE8D7D41F46B6B58B6C1499EBB3C1B101D904413AEFC2B73454E23AA14FBF + D2F25DDBC16249929E50BA118D05777ABB54776B21A46A5A7AE3C4C664E98D96 + DC5C453B2011D9680D761EC75ABFDF077DB77E02AFE7F18A7FAF66E92DBE48AE + 9E2D6616C9E3DB59D4B3C5CC7696F8C6331529D6369EC5B78886E68ABD2DA2F1 + CDDC2153CC6DE67E015E45E7AEE26F6CCA0000000049454E44AE426082} + ShowHint = True + Visible = False + OnClick = PowerClick + end + object m_btnCancel: TTextButton + Left = 323 + Top = 196 + Width = 56 + Height = 25 + ModalResult = mrCancel + ParentShowHint = False + ShowHint = True + Text = #21462#28040 + end + object m_btnOk: TTextButton + Left = 258 + Top = 196 + Width = 56 + Height = 25 + ModalResult = mrOk + ParentShowHint = False + ShowHint = True + OnClick = OkClick + Text = #24212#29992 + end + object m_lblPreset: TLabel + Left = 33 + Top = 41 + Width = 24 + Height = 14 + Caption = #39044#35774 + Font.Charset = DEFAULT_CHARSET + Font.Color = 12429980 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object m_cbPreset: TComboBoxComponent + Left = 71 + Top = 38 + Width = 98 + Height = 20 + ParentShowHint = False + ShowHint = True + OnChange = PresetChange + ShowItemCount = 5 + Parent = m_BKGPanel + end + object m_btnStop: TPNGButton + Left = 23 + Top = 194 + Width = 39 + Height = 26 + Hint = #20572#27490 + ParentCustomHint = False + ParentShowHint = False + PngImg.Data = { + 89504E470D0A1A0A0000000D494844520000009C0000001A0806000000425135 + 88000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F33000004C64944415478DAED9B7D6893471C + C72FC9F3A45D4C8DD1698B4263EBCB3A5DDD6C1D28DABD20B88DD6971237CAFA + C7A6C806F32F19634C6463228E21E25F1514D9F48F8EB22DA8D3B229145FAA28 + D85659F7D26DAE35424B5B37B3D898B5C99374DF4B2F9BCEDAE4FA3C777984E7 + 073FEE9EE71EC827779FDC13B83BDBE8E828297F7A29C9555CEB689BA8D98E54 + 904E643E2B15765F5624911A32861C66A5C6DA4CC9F64CC5B2A44486FB62A2F1 + 74381CC446854B24122AAE5D480F2BD51CB0C69151649895F49A0EA217391B59 + 8A9C852C90CC4739869083C86E641F32C4DADCC8E9C822C6E966CCB2820A1661 + 3CFDC8DBF41AC2C530F02AE3A15C5324F7D9BD7D7797F145205C3C2D9CE7E557 + AA0FF60F0CBC9603A8FBA2A8B0F0CBEFBE6D7E8B8C89473B6CC1865AFFC91BC1 + E0EC5CB3CDF5F9FA8E1D0DD4A0FA5B1AB7D6FFEABE9E9E9E9A5CB39594949C3C + 1AF86A1BAAFD102E02E1BC18D32318D3B5B966C3989EC098BE01E14269E18A01 + 192C2E2DCB351BB9D9DD45A7651FAD221F473E0FB6AF4DC4B611D573EC5619D8 + 5A9DF96EA228CAD82BC36E27369B4D380B1DB7D164928E1DD1348DC4862394AD + 0A4D5D60FA03F55294BF2F5FF562AEBB8D5CBE7086B2CD43FF74A785A31DF7B3 + 8906F549DA7164EC55BA1E6CFB4DC4F60EAAC7D9AD4AB07DE3724F238AAA423A + 95D8250A9784709A16275A3C4EA291BF28DB3A34B583A90FF57294DF9B48B825 + 10AE332D5C0ACE4483BA04D54E6431B20E6C9F9A88ED7D549BD8AD9560FBA2C0 + 3383A8CEBCD42C67A7B39C2CE1D8EC168F8D90A1F09F94ED75345D04D34DD42B + 50B69B48B84A08D73129E112F8922323C3A95F5736417FF97979F9C4A128199F + FD9F707391F560DB6522B61DA836B25BF4757F78AA77267152E130CB391C90EE + 21C2FDC7A665FCAC3136E5A16CC9D4B869A9D92D06E1EE846E51B637D1740E4C + 3778854BD2D7722C46B44496FDE650F19D9DC49E45BFE9162E7A3742AADE6EC8 + EAD974B41ED84A5C53DC199FD32B9C04B60784F34C9FF5AF700A84A3FFE344B3 + D1FF6FDA3DC2856F0FEA126E381A25CBEA3EE4626B6BDA49F25DAE8CCFE916EE + 4E38449EE3ECB8F3E8B8A91E6FC6E7F40A27816DD2C219C966B47091A13079B6 + EE232EB62B4D1F13778127E3738608B762F33E2EB84B9F6D93269C60365DC219 + C52642B8A5FEED5C6C5703BBE5095759FF09175C7BE307D28413CCA64B38A3D8 + 4408F7D4DA77B9D87E38B1579E70E57EBEF77D6760A734E104B3E912CE283611 + C23DB1662B17DB2FA71BE409B7B0FA3D2EB85F9BF748134E309B2EE18C621321 + 5CC90B5BB8D87ACE1E92279C6F35DFAF21D8D2204D38C16CBA84338A4D847073 + 56D473B1F55E6A94275CD1CA4D5C70FD173F97269C60365DC219C52642B89915 + 7E2EB65B1D0179C2792BEAB8E0421D4DD28413CCA64B38A3D84408E75954CDC5 + 16FEA9599E70AEC5EBB9E0A23F1E97269C60365DC219C52642B8C7E6AFE662FB + FB7A8B3CE1D4F92F71C1C5AF9F92269C60365DC219C5264238D557C5C7166C95 + 231C5DA2D1E6ACE282537A2F485BDA12CCA66B69CB2836114B5B5A61251FDB40 + BB9CA52D6BF1DE5ABC97BA782F32ACED49D9C5A3BE3DC9DA80993D9BB5019333 + C6DB80696D31CF9ECDDA62CE19E36D31B70ED16411D6219AC9C5788768AC6382 + 137359C70427DF770F1E13B40E424F18D641688EC87410FA1FF0936827C0A298 + CF0000000049454E44AE426082} + ShowHint = True + Visible = False + OnClick = StopClick + end + object m_btnPlay: TPNGButton + Left = 24 + Top = 195 + Width = 39 + Height = 26 + Hint = #25773#25918 + ParentCustomHint = False + ParentShowHint = False + PngImg.Data = { + 89504E470D0A1A0A0000000D494844520000009C0000001A0806000000425135 + 88000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F33000006DB4944415478DAED9B5B6C145518 + C7FF33B3B33BBB5DD8DEA08514684B34F000229840A284105E105120808A2682 + D110F4498C898A3E9878892646DF34F1816022C4A080968A260A4DA3D2126805 + 6AA55269BB157ABFEF76BBF7F53BB3B3A49576BBBB7366B60FFB255FE6ECCCB6 + FBDB737E73CE999D33422C16C3AA071E44B6E26AE3956487454A0BA59552D1B6 + 166DBF5911A50C530629FDDA36AC1D9B936C6BD63E143591614A246B4F499220 + 30E12291884CAF1D942E6D2B67813544E9A31CD5B6EC356BC402CAC59495940B + 29E799CCC7383C947D946D945D94C3DA3127652165A9C6E9D498CD0A269857E3 + E9A11C62AF49B82035BCACF130AE3C93EB6C72DD8D6B7C5E122E9410CEB5F5D1 + C7BEE8E9ED7D320B5053A2B4A4E4E44F3FFE701071F15885DDB773D7EEEA0EB7 + 7B71B6D9CA972DEBFAEECCA9ED546C4DE0EEDABDF7D3F6F6F6EDD966ABA8A8A8 + 3E73EA9BC354EC21E1BC245C01B5E997D4A68F679B8DDAF42CB5E97E126E3821 + DC5282742FAD5C916D3674B6B5B06E79192B5216536E22B66FE710DB1E2AD66A + BB5610DBAF56C5098BC5121F324411822018CEC2DA2D168DB2B643381C46D0EF + 656C1BE9500B310D50B992B6B7363CB239DBD586FADF6A18DB72AA9FB68470AC + E26ECCA1465DC92A0EF1A17407B17D3687D85EA6E2F7DAAE75C456E570E6C322 + CB249D0CD144E1A2245C381C42381482CF3BC2D89EA0430DC4D445E555B4BD3E + 87845B4DC235258453E1526DD4283BAB2261AA5C297E5673AC60AD515753B189 + 7229E5D3C4F6D11C627B9D8A5F6BBB1E26B613F35C4590AD36B59713937C6634 + 1A41241C517B41BD6CAA705AEF160A06E0191D646CCFD0A1DF89A993CA6B69DB + 90AA7031F6BF884F14E26CE0586F9A70EBE8FF3666249C7FC287C2375E40DFB1 + D390BA8760B52971480EF13FE1CA299F25B6F7E610DBDB543CAEED62C3FDB1F9 + 050B6065C2512F274924DD0C8DE59F9840D19117D177F414C49E21F56F32658B + AAED16567BB720093736DCCFD80ED0A15A62EA4857B8A07F02AE837B3078FA67 + 48FD23EA092472AA37DDC2793D63283BFE2124A7030355E7E1397E0EB6884090 + 567548D1137A853381ED1EE15C850BEF0A6721E184193E87271B9BBF85270937 + 3AD4A74B38DFB817A51FBF06C9A160F8421DBC55B5B046898DBE93A0B3DE740B + E7191B41C9D177D58A6311F1FA3078A21AE10B97A1508FC2E632990E177A8533 + 812D63E178B2F1166EDC3B86E20F5E81E850D4D7519F1F23D53508D735C1A64D + 17321D66B908E7FAFC08A43CC794FD0177173C5F9D85A5B50B8A6287C420336B + 545DC219CCA64B385E6C460837EF9D436A0F37398277FA305E5503A9A30F361B + 0DB319D41B17E1EC9F1C8698679FF6F84443338227CFC33E1E54E750E90C173C + 8433984D9770BCD88C104E79F30044BB32ED717F732B42E7EAA04C84D4F95D3A + C32C17E184F70F51F76B9FF13D31BA1A0BFC520FF1FC1538249B3A4F4965B8E0 + 219CC16CBA84E3C5668470C2E17D1015DBCC6C91288217AF42ACFB138A6455E7 + 77A90CB35C840BBCF51C048732EB7BA3A35EC4CE5D84F3C66D2876C7AC3D0A0F + E10C66D3251C2F3623840B1EDA09C16E9BF5BD318F0FB1DA46386EF5C2A628B3 + F6765C841B7D756F4A7089B0D4FF85A2BA9BF1C96792E0219CC16CBA84E3C566 + 8470DEE7B782AE105267BB760BF97FB4CF3AE7E4225CEF4BDB0025858A1B1885 + BDE62A0A7A3CEA84D88C1ECE60365DC2F1623342B8C17D9B52136ED803DBA51B + 70F58FD38584493D9C7B3F7D1125095C3004FBA51614FFDD03BB4C7311D9BC39 + 9CC16CBA84E3C56684705DBBD683BEC8CC6FA2CF52AEB5A1A07D0036E2922D26 + CEE15A9FDA80D80C6783ADE55F94347660BE688DFF626DF255AAC16CBA84E3C5 + 668470EE6D6B10B34EBF8AC9DAD68DE2E63BC813E5F84960F6556AD30E82B34D + 8593FB46B0E8723B8AFC5479ECF7A40C6E8DF010CE60365DC2F1623342B89B5B + 56927053E76396410F1636DD467E80A4B36576BB8B8B700D5B57DE3D1B245F00 + 0BAE776249BF9FE61B0E751299CD3B0D06B3E9128E179B11C2356F5C8E981C17 + 4EF20751D0D28D45C3019AD629F10B836CDD6960F704EB37572066115148738D + 8A4E0F9C567BCABF67A5D0A8BAEEA51ACC96F1CD7BC67669CB728DAD1BE5EEB1 + 385B8A73C8C9C1FBE63DBB977A6D7D19629208577B3FCABAC7E19095947F6B4B + 16FA578BF82770BDD289B27F06512858D3FEC53E59E85D9E64025BC6CB93027E + 3F9AEF7761F1CD7EE4435625CD948DF7F2A460C08F96250E94BA47902FC869DF + 4D4816D30997D602CCA8BAD234AC56163BA37986DE059826B065BC0093B13149 + 12EBE1F404EF059889D5C3A228D049C3B7DEA65B80995B629E3A5B6E89799A31 + DD12F3DC43342944EE219ACC62BA8768728F0926E7CA3D269879DDDDFB9860EE + 41E8A4917B103A8D98ED41E8FF0013A48036FFAB77F70000000049454E44AE42 + 6082} + ShowHint = True + OnClick = PlayClick + end + object m_btnPowerOn: TPNGButton + Tag = 1 + Left = 340 + Top = 38 + Width = 39 + Height = 26 + Hint = #20851#38381#38899#25928 + ParentCustomHint = False + ImgStates = 3 + ParentShowHint = False + PngImg.Data = { + 89504E470D0A1A0A0000000D49484452000000750000001A080600000089A613 + 33000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F33000004A74944415478DAED9A7F6894751C + C7DFF7737ADDB5DDB9ED86C4769B354E6AB666D08F952328DAD85889299622A5 + A0129185445052521649482814D20F31C1107569367142FD314B6895D354722A + 6C3709DB56DD3937D676CF73777DBECF9EE7B8EAB83DF73CDFE7D91DDC173E3C + DF7DBFCFEE5E7C5FCFF3FDDEF787259148A0EEEE7B305BE95CEFCF99AAAD1476 + 0A27C51CF96A97CBCD4A710A91224A31295F45B92E27D92C4C6A2C1673D01F2E + 8A62F9EA30114C4902C504C5A87C15E486F252CCA7A8A128A7F098CCC738C628 + 4628FA29AE5344E43A37858FA242E674CBCC662526715CE619A208B3BF15A9C5 + CD2DAD1F0F0D0FAF3011286DAAF0FB0F769D38BE1ED3725923DDF1E4D2659DA1 + C1C1F9B3CD16A8AABA7EF448471B65AF2AB84B972DFF606060A06DB6D9AAABAB + 3B8F741C7A99B2438AD4CAFA867B072B6B82B3CD866BFD7DAC4BAE62598A528A + 26623B9C436C4F51B65B2E0A12DB77CE396ED8ED76D86C3658AC56582C16C359 + 98B7443CCEDC4114454427C719DBC354D5A74865709772A8E11632384C77BB4F + 10DB4739C4F63C65BF928B1613DB3197BB04768783C43A6035516A9CA48AA200 + 511030317E83B1B553D519456A1DC19DD7D37081C7EF47705533BAD66CE5D170 + 8B287B81A2926225B16DCF21B657297B402E6A24B62F3CC5F3E07016496FAB95 + BDAD5948AD6969C49D6B5AF1F5D3AF65C5224995DF52213A85B1D1BF18DB3354 + 753AD7A506285611DBB61C62DB42D9FD72111B1AF6DEEA2D839349A5B7D56623 + B159480D343F8085AB5B7062F51B59B1C4256FA2F4964649EACDC81F8CED59AA + EAE622F5AE75ED70BA5D285F1CC42F1F1E86A7AA02570E7EA3A7E1B8493580ED + 7F528B7DE549A97692CAC655A3D9D8782AA6481D0D8FF0915ABBE251D4B43682 + FA1B4C0C87E1F2FB10EE0BC1170C20118BE3FCEE2FF17BCF452D0DA75BAA816C + BAA5F26033442A7BCA6E6B6A90A07EDABE0F7E7ADA942ECE5B5B89FA1796A3A8 + C483BEFD5D089DFCC154A906B3E992CA8B8DBB54F6E5F76D592B3D5D3FBEBB57 + 2A4B376E2D79FF45B8CABDE8DEBC137FFF79C314A926B06996CA938DBB54F6A5 + 734B4B70F2B9B79265E9E0D83D4D3B3661A4F7327A771E50F5D97AA59AC0A659 + 2A4F36EE529B3F7F13BF9D3A8B8B9F1DCB08C7D2836F6FC0DC322FBEDDF89E29 + 524D60D32C95271B7FA9FBB6A6EDF319E07FCBA41F056D0FA99E4EE8966A3C9B + 76A91CD90C91DAB36D0F2257AECD786FB673441E520D66D32595179B2152FB3B + BF5735A76AD8B41265F5B5FF1A4754349C2EA906B3E992CA8B8DBBD447766D46 + 6C4AC0A95776CD78EF639FBE8EA9C898AA7B531A4EB35413D8344BE5C9C65DAA + D2DFCF3497624F1B5B2D51DBE5A4349C66A926B06996CA93CD90C507652ED57F + FC74DAEE44014B9D9365D170BA161F0C66D3B5F8C08BCDB0654209D0EF833031 + 89C8A55072A96B5EDD02D89C8EAC1B8D975483D9742FE837ED7829C916FE7520 + C956BAE8F66936E2ED79674FC6CF3074419FFD4AAB6E6D84D3730B2C362B6251 + 411A0B2E7C725475B79641AAAEAD3783D8B86CBDB12DB705ED4B5094C23619BE + 8973BB3B10BE1C9AF1FFD56CBD1536C9D5B3E5CD2679E1388B7AB6BC39CE5238 + 78A622E5DBC1B3C211D1CC5CF97744B470983B63CABBC3DCFF002BA4E7AE5B39 + 17140000000049454E44AE426082} + ShowHint = True + OnClick = PowerClick + end + object m_btnLoop: TPNGButton + Left = 68 + Top = 195 + Width = 39 + Height = 26 + Hint = #24490#29615#25773#25918 + ParentCustomHint = False + ImgStates = 3 + ParentShowHint = False + PngImg.Data = { + 89504E470D0A1A0A0000000D49484452000000750000001A080600000089A613 + 33000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F33000005684944415478DAED9A0F4C55551C + C7BFEF1F3C9E0FDE03111E38F99726B05149906DE89C384CC321A828EA2A6BCD + 1646850DDACC9594B3D8523337E658C35C591A30A169B491115A5B186693500A + 068F24FEFFE7C9E0BD07F43BD7FB5C0BE33DDEBBF7021B67FBED9E7BCF79F77D + 389F7BCEE19D7B64131313887A7405662AFDF66BF554C5720A25851B859A3F2A + F9EB52A5710A2B859962843F5AF9B259C9266352C7C6C65474A2A1D0F1479584 + 60B664A118A618E08F16BEA1BC290229C228FC283C25E6631C43149D148D14AD + 147D7C9996C287C2C0736A7966A9129368E279DA297AD9B94DAA6EC3C6C4FCF6 + 8E8EED12023D3019FCFDBFFAB6ECD25EDC93CB1A695972CAD68BC6E6E6C09966 + 0B090E6E2DB950BC89B2F536DC94ADA9C79B9A9A36CD345B6868E8C50BC58599 + 946DB7490D7A2C3AA639282C7CA6D9F057631D1B92835996C297620DB115CD22 + B66D94ADE42F8513DB5537B5164AA5120A850232B91C32994C7416E66D627C9C + B983D56A8579C4C4D85653519D4D2A83BB3D8B1A2E82C1E1DEB0BB99D8F26611 + 5B3A654BF94B8F13DBD71AAD1E4A958AC4AA209750EA3849B55A2DB05A2C1836 + F533B6242ABA6E931A4570375D6938BDDE0BDE3E7A2EDF6C6CE1BED085867B84 + B23514411469C4963B8BD8DEA4EC39FE521CB17DE1A95B08959B3BD75BE5ACB7 + 4E43AADEDB0B3E3EDE5CDED874C761364E2ADF4B2DE6510C0DF430B65D54F493 + 4B52BDBCB4484A49407C421CD46AF7FBD7CD660B7EACBC86A2F3DFA0BF7FD099 + 86B3490DA1D84D6C876711DB41CA9EE52FB1A9E1532FEF45706352A9B72A1424 + D68E548E6DCB7AAC5BBF6A12DBD51FAA5074EE925DB671CE9B95EBA566923AD8 + D7C5D8F65051A5D352B55A0D8EE5BD0D8DC60326D3301AEB9BD1DDDD477F9C8A + 7E222D878E7AC7C8C8284E9DFC1CD5553725952A32DB24A93A1FBFFB52952495 + CDAB62B3B1F9D4FA2FA903BD9DAE4B6573C7BECC67D0F0A71115E53F7320B6A4 + 542A90B07115B6ED7C9ACB9F3C7A86006B24932A329B4B5285621354AA87468D + D111B343637F64D452BCF1D68B547F1459AFE4E2AE695854A912B13925556836 + 41A5BE9CB90BC6C61694955EB15B97A5E41D09D89CBA0E25E7CB515A78D9D186 + 734AAA446C4E49159A4D30A9D12B23919EB59BFEE31AC3A1FD1FA3BDB5DB2EDC + 02AD078E171CC01D631BDECBCE73B4E1A62D5542B6694B15834D10A9EC4B723E + CA80975ECB9D3735B420F7C0270E0D27EF1CDB07FF405FA4A7E588225562B669 + 49158B4D30A90BFDF4C83EF202FA7B8790FF6121DA5ABAE8379275CACFBC94BD + 1DC161017057BB51A3B4A1F4CB0AD4DE68105CAA846CD3962A069BA073EAE153 + 1934E9BB236BCF517ADA26ECD65F9BF804529F4FE0F27FD4187122E7EC94F55D + 99532562736A4E159A4D50A9CFBD968498D591C8CF2D46CD2FF576EBCBE53264 + 1CDA89256106BCBFBF003D9DFDA2499588CD29A942B3092A7569E41264BC9B86 + EEF63E1C79FD34C668F2B7977C0DDE78286231AA2A7EB75BD715A912B1392555 + 6836C1171F9ECD4CC48AB8E5B875BD119F9D28C3C8F0E8A43AEC49D3F968D1D7 + 3DE4D03DFFD3704E2F3E48C0E6F4E283906C824B55D3DCB0F76032421E0E406F + E720CA8BAB5077A3996E6CC2E29045085A66C0BA9458E87D3DF1C1AB67E8E9EC + 77E8BE42489580CD69A942B289B24CA8502AF0D48E95884F897960391B5EAA2E + DF42E9E92B0E0D3542499580CDA5057DC6B621ED49C46F89FD7FB6EF6A515250 + 39259B280BFAB6E46BD0217A4D3842C303A05EE086D6A66EEE29ACAEB84D4FCF + DD69DF4FC8576F22B109F2EACD37408FD8B591088B08243677FCDDD8859E8E01 + 5CFBBE16033D26BB9F77E4D5DBFC4B72C7D9E6CC4BF2F9ED2C8EB3CD99ED2CF3 + 1BCF1C48736DE3D9FC16D1A9B9E6DE16D1F9CDDC53A639B799FB1FC0F365BD55 + 01D0790000000049454E44AE426082} + ShowHint = True + OnClick = LoopClick + end + object m_panShow: TPanel + Left = 24 + Top = 72 + Width = 356 + Height = 83 + ParentCustomHint = False + BevelEdges = [] + BevelOuter = bvNone + Ctl3D = False + ParentColor = True + ParentCtl3D = False + ParentShowHint = False + ShowCaption = False + ShowHint = False + TabOrder = 0 + object m_lblNoParams: TLabel + Left = 39 + Top = 27 + Width = 84 + Height = 14 + Caption = #27809#26377#21487#35843#33410#21442#25968 + Font.Charset = DEFAULT_CHARSET + Font.Color = 12429980 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + end + object m_tbPosition: TSkinTrackBar + Tag = 1 + Left = 24 + Top = 169 + Width = 356 + Height = 19 + Hint = '0' + Caption = 'm_tbPosition' + FullRepaint = False + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentColor = True + ParentFont = False + ParentShowHint = False + ShowHint = False + TabOrder = 1 + OnChange = PositionChange + Max = 1000 + end + end +end diff --git a/AudioFxFormUnit.h b/AudioFxFormUnit.h new file mode 100644 index 0000000..bc6583d --- /dev/null +++ b/AudioFxFormUnit.h @@ -0,0 +1,76 @@ +//--------------------------------------------------------------------------- + +#ifndef AudioFxFormUnitH +#define AudioFxFormUnitH +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include "GeneralDialogPanel.h" +#include "TextButton.h" +#include +#include "ComboBoxComponent.h" +#include "PNGButton.hpp" +#include "SkinTrackBar.h" +//--------------------------------------------------------------------------- +class TAudioFxForm : public TForm +{ +__published: // IDE-managed Components + TGeneralDialogPanel *m_BKGPanel; + TTextButton *m_btnCancel; + TTextButton *m_btnOk; + TPNGButton *m_btnPlay; + TPNGButton *m_btnStop; + TPNGButton *m_btnPowerOn; + TPNGButton *m_btnLoop; + TLabel *m_lblPreset; + TComboBoxComponent *m_cbPreset; + TSkinTrackBar *m_tbPosition; + TLabel *m_lblNoParams; + TPanel *m_panShow; + TPNGButton *m_btnPowerOff; + void __fastcall PlayClick(TObject *Sender); + void __fastcall PowerClick(TObject *Sender); + void __fastcall StopClick(TObject *Sender); + void __fastcall LoopClick(TObject *Sender); + void __fastcall PresetChange(TComboBoxItem *Sender, int Index); + void __fastcall PositionChange(TObject *Sender); + void __fastcall TrackBarChange(TObject *Sender); + void __fastcall FormClose(TObject *Sender, TCloseAction &Action); + void __fastcall FormResize(TObject *Sender); + void __fastcall FormCreate(TObject *Sender); + void __fastcall OkClick(TObject *Sender); +private: // User declarations + TLabel * m_lstCaption[6]; + TSkinTrackBar * m_lstTrack[6]; + float m_fParam[6]; + + int m_iFx, m_iPlugin, m_iTrack, m_iInd; + bool m_bPowerOn; + double m_dblStart, m_dblEnd, m_dblStep, m_dblPos; + int m_iCurrPos; + UINT m_tTimer, m_tAccuracy; + + MESSAGE void __fastcall UMMediaTime(TMessage &Message); + MESSAGE void __fastcall UMEditorResize(TMessage &Message); + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(MSG_MEDIATIME, TMessage, UMMediaTime) + MESSAGE_HANDLER(MSG_VSTEDITORRESIZE, TMessage, UMEditorResize) + END_MESSAGE_MAP(TForm) + +public: // User declarations + __fastcall TAudioFxForm( TComponent* Owner, int iTrk, double start, double end, + int iInd=-1, int iFx=-1, int iPlugin=-1 ); + __fastcall ~TAudioFxForm(); + + int __fastcall GetParamCount(); + float* __fastcall GetParams(){ return m_fParam; }; + int __fastcall GetPreset(); + bool __fastcall IsBypass(); +}; +//--------------------------------------------------------------------------- +extern PACKAGE TAudioFxForm *AudioFxForm; +//--------------------------------------------------------------------------- +#endif diff --git a/AudioTrack.cpp b/AudioTrack.cpp new file mode 100644 index 0000000..30651a4 --- /dev/null +++ b/AudioTrack.cpp @@ -0,0 +1,813 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop + +#include "GlobalUnit.h" +#include "AudioTrack.h" +#include "Undo.h" +#include "Project.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) + +/***************************************************************************************/ +// ȫֱ +/***************************************************************************************/ + +TAudio g_Audio; +TAudioTrackList& g_aAudioTracks = g_Audio.AudioTracks(); //ȫƵ4飩 +int g_iSelAudio = 0; // ǰƵ + + /***************************************************************************************/ +// TAudioຯ +/***************************************************************************************/ + +void TAudio::CopyTrackList( int iStartBar, int nCopyBars, TAudioTrackList* lstAudio, bool bFx ) +{ + int iTrkStart = 1, + iTrkEnd = m_lstTracks.size(); + + if( g_iPreStage==0/*iTrkEnd==iTrkStart*/ ) + iTrkStart = 0; + + for( int i=iTrkStart; ilstBars.empty() ) + lstAudio->push_back( CopyTrack( i, iStartBar, nCopyBars, bFx ) ); + } +} + +TAudioTrack* TAudio::CopyTrack( int iTrack, int iStartBar, int nCopyBars, bool bFx, TAudioTrack* pDest ) +{ + TAudioTrack* pSrcTrack = m_lstTracks[iTrack], + *pDestTrack = pDest ? pDest : new TAudioTrack(); + + pDestTrack->state = pSrcTrack->state; + pDestTrack->volume = pSrcTrack->volume; + pDestTrack->pan = pSrcTrack->pan; + pDestTrack->gain = pSrcTrack->gain; + + for( int i=0; ilstBars.push_back( new TWaveBar( pSrcTrack->lstBars[iStartBar+i] ) ); + } + + if( bFx ){ + for( int i=0; ilstFxs.size(); i++ ) + pDestTrack->lstFxs.push_back( new TAudioFx( pSrcTrack->lstFxs[i]) ); + } + + return pDestTrack; +} + +void TAudio::ResetTracks( TAudioTrackList* lstAudio ) +{ + //Ƶ + while( m_lstTracks.size()>1 ){ + delete m_lstTracks.back(); + m_lstTracks.pop_back(); + } + + for( int i=0; isize(); i++ ){ + //滻AudioTrack + TAudioTrack* pNewTrack = DuplicateAudioTrack( (*lstAudio)[i] ); + m_lstTracks.push_back( pNewTrack ); + + AudioEffectsSet( i+1 ); + } + +/* if( m_lstTracks.size()>1 ){ + m_lstTracks[0]->bHide = true; + } +*/ +} + +void TAudio::RestoreAudio( TOpusStageList* lstStages, TAudioTrackList* lstAudio, bool bUndo ) +{ + int iOrigStage = 0, iVarBar = 0; + + TOpusStageList::iterator iterDest = lstStages->begin(), + iterSrc = g_lstOpusStages.begin(); + int iDestBar(0), iSrcBar(0);//, iDVB(0), iSVB(0); + while( iterDest!=lstStages->end() && iterSrc!=g_lstOpusStages.end() ){ + TOpusStage *pSrcStage = *iterSrc, + *pDestStage = *iterDest; + + if( pSrcStage->iSegTypeiSegTypeaBars.size(), pDestStage->aBars.size() ); + + if( nBar==pSrcStage->aBars.size() ){ + iterSrc++; + } + + if( nBar==pDestStage->aBars.size() ){ + iterDest++; + } + + iDestBar += nBar; + iSrcBar += nBar; + } + else if( pSrcStage->iSegTypeiSegType>=SEGTYPE_INTRO ){ //undo + int nBar = pDestStage->aBars.size(); + + iDestBar += nBar; + iSrcBar += nBar; + iterDest++; + } + else if( pSrcStage->iSegType>=SEGTYPE_INTRO && pDestStage->iSegTypeaBars.size(); + for( int i=1; iiSegType==SEGTYPE_INTRO && pDestStage->iSegType==SEGTYPE_ENDING ){//redo + //ɾƵ + int nBar = pSrcStage->aBars.size(); + for( int i=1; iiSegType==SEGTYPE_ENDING && pDestStage->iSegType==SEGTYPE_INTRO ){//undo + int nBar = pDestStage->aBars.size(); + + iDestBar += nBar; + iSrcBar += nBar; + iterDest++; + } + else{ //ǰβͬ + //redoȽϳȲհ׻ɾ + if( !bUndo ){ + if( pDestStage->aBars.size() > pSrcStage->aBars.size() ){ + int nBar = pDestStage->aBars.size() - pSrcStage->aBars.size(), + iInsBar = iSrcBar + pSrcStage->aBars.size(); + + for( int i=1; iaBars.size() < pSrcStage->aBars.size() ){ + int nBar = pSrcStage->aBars.size() - pDestStage->aBars.size(), + iDelBar = iSrcBar + pDestStage->aBars.size(); + + for( int i=1; iaBars.size(); + iDestBar += pDestStage->aBars.size(); + iterSrc++; + iterDest++; + } + } + + while( iterDest!=lstStages->end() ){ //undo + int nBar = (*iterDest)->aBars.size(); + + iDestBar += nBar; + iterDest++; + } + + //Ƶ + if( lstAudio ){ + for( int i=1; ilstBars.size() ); + + if( pSrc ){ + for( int i=0; ilstBars.size(); i++ ){ + TWaveBar* pWvBar = new TWaveBar; + memcpy( pWvBar->aVols, pSrc->lstBars[i], sizeof(DWORD)*POINTS_PER_BAR ); + pAT->lstBars.push_back( pWvBar ); + } + } + } + } + } +} + +void TAudio::WriteProj( FILE* pFile ) +{ + int num = m_lstTracks.size(); + fwrite( &num, sizeof(int), 1, pFile ); + + for( int i=0; ilstBars.size(); + fwrite( &nBars, sizeof(int), 1, pFile ); + +// fwrite( &bHide, sizeof(BYTE), 1, pFile ); +// fwrite( &bMute, sizeof(BYTE), 1, pFile ); + fwrite( &pAT->state, sizeof(BYTE), 1, pFile ); + fwrite( &pAT->volume, sizeof(BYTE), 1, pFile ); + fwrite( &pAT->pan, sizeof(char), 1, pFile ); + fwrite( &pAT->gain, sizeof(char), 1, pFile ); +// fwrite( &iShow, sizeof(BYTE), 1, pFile ); + + int count = pAT->lstFxs.size(); + fwrite( &count, sizeof(int), 1, pFile ); + + for( int j=0; jlstFxs[j]; + fwrite( &pFx->iFx, sizeof(int), 1, pFile ); + fwrite( &pFx->iPreset, sizeof(int), 1, pFile ); + fwrite( &pFx->bBypass, sizeof(WORD), 1, pFile ); + fwrite( &pFx->nParamSize, sizeof(WORD), 1, pFile ); + if( pFx->nParamSize>0 ) + fwrite( pFx->pParam, sizeof(float), pFx->nParamSize, pFile ); + + if( pFx->iFx >= FX_VST ){ + VSTINFO* pVST = g_lstVSTFx[pFx->iFx-FX_VST]; + DWORD uniqueID = pVST->uniqueID; + fwrite( &uniqueID, sizeof(DWORD), 1, pFile ); + + if( pFx->iPreset>=0 ){ + uniqueID = pVST->aPlugins[pFx->iPreset]->id; + fwrite( &uniqueID, sizeof(DWORD), 1, pFile ); + } + } + } + } +} + +int TAudio::ReadProj( FILE* pFile, DWORD dwVersion ) +{ + WORD wMajVersion = HIWORD( dwVersion ), + wMinVersion = LOWORD( dwVersion ); + int iError = E_PROJ_NOERROR; + + int num; + fread( &num, sizeof(int), 1, pFile ); + + for( int i=0; ilstBars.push_back( pWvBar ); + } + + if( wMajVersion==5 && wMinVersion>=6 ){ + fread( &pAT->state, sizeof(BYTE), 1, pFile ); + fread( &pAT->volume, sizeof(BYTE), 1, pFile ); + fread( &pAT->pan, sizeof(char), 1, pFile ); + fread( &pAT->gain, sizeof(char), 1, pFile ); + + int count = 0; + fread( &count, sizeof(int), 1, pFile ); + + for( int j=0; j0 ){ + pParam = new float[nParamSize]; + fread( pParam, sizeof(float), nParamSize, pFile ); + } + + if( iFx >= FX_VST ){ + DWORD uniqueID = 0, pluginID = 0; + fread( &uniqueID, sizeof(DWORD), 1, pFile ); + + if( iPreset>=0 ) + fread( &pluginID, sizeof(int), 1, pFile ); + + bAdd = false; + for( int k=0; kuniqueID ){ + iFx = FX_VST + k; + + if( iPreset<0 ){ + bAdd = true; + } + else{ + for( int p=0; paPlugins.size(); p++ ){ + if( g_lstVSTFx[k]->aPlugins[p]->id==pluginID ){ + iPreset = p; + bAdd = true; + + break; + } + } + } + + break; + } + } + } + + if( bAdd ){ + TAudioFx* pFx = new TAudioFx( iFx, iPreset, pParam, nParamSize, bBypass ); + pAT->lstFxs.push_back( pFx ); + } + else{ + iError |= E_PROJ_INVALIDFX; + } + } + } + else{ + BYTE bHide, bMute, iShow; + fread( &bHide, sizeof(BYTE), 1, pFile ); + fread( &bMute, sizeof(BYTE), 1, pFile ); + fread( &pAT->volume, sizeof(BYTE), 1, pFile ); + fread( &iShow, sizeof(BYTE), 1, pFile ); + + if( bHide ) + pAT->Hide(); + if( bMute ) + pAT->Mute(); + + for( int k=0; k=pAT->lstBars.size()-1 ){ + int iType = g_aAudioEffectTypes[k]; + + if( iType!=FX_PITCH ){ + int nSize = GetFxParamNum( iType ); + float* pParams = new float[nSize]; + int iPreset = pAE.iPreset; + + int nPresetCount = GetFxPresetCount( iType ); + + if( pAE.bOn ) + memcpy( pParams, pAE.aParams, sizeof(float)*nSize ); + else{ + if( iPreset>=nPresetCount ) + iPreset = 0; + + GetFxPreset( iType, iPreset, pParams ); + } + + TAudioFx* pFx = new TAudioFx( iType, iPreset, pParams, nSize, !pAE.bOn ); + pAT->lstFxs.push_back( pFx ); + } + } + else{ + iError |= E_PROJ_INVALIDFX; + } + } + } + } + } + + return iError; +} + +/***************************************************************************************/ +// ȫֺ +/***************************************************************************************/ + +TAudioTrack* NewAudioTrack( int nBar, bool bAddUndo ) +{ + TAudioTrack* pTrack = NULL; + + if( g_aAudioTracks.size()1 ){ + int iTrack = g_aAudioTracks.size()-1; + + for( int i=0; ilstBars.push_back( pBar ); + } + + if( bAddUndo ){ + f_MM_AudioNewTrack(); + + g_Undo.AddUndo( UNDO_TRKAUD_ADD, iTrack, 0, 0, NULL, NULL ); + + f_MM_AddUndoBefore( 0, NULL ); + f_MM_AddUndoAfter( 1, &iTrack ); + } + + g_aAudioTracks[0]->Hide(); + } + + PostMessage( Application->MainFormHandle, UM_ENABLERECORD, 0, 0 ); + } + + return pTrack; +} + +void DeleteAudioTrack( int iTrack, bool bAddUndo ) +{ + if( iTrack>0 && iTrack>=g_aAudioTracks.size() ) + return; + + int num = 1, iDelTrk = iTrack; + TAudioTrackList* aTracks = NULL; +// TAudioTrack* aTracks = NULL; + + if( iTrack<0 ){ + if( g_iPreStage==0 ){ + if( g_aAudioTracks[0]->lstBars.empty() ) + return; + else + iDelTrk = 0; + } + else if( g_aAudioTracks.size()<=1 ) + return; + } + + if( iDelTrk<0 ){ + int nBars = g_Opus.BarCount(); + num = g_aAudioTracks.size()-1; + + if( bAddUndo ){ + aTracks = new TAudioTrackList; +// aTracks = new TAudioTrack[num]; + int* aTrks = new int[num]; + + for( int i=0; i0; i-- ){ + if( bAddUndo ) +// g_Audio.CopyTrack( i, 0, nBars, true, &aTracks[i-1] ); + aTracks->insert( aTracks->begin(), DuplicateAudioTrack( g_aAudioTracks[i] )); + + f_MM_AudioDeleteTrack( i ); + delete g_aAudioTracks.back(); + g_aAudioTracks.pop_back(); + } + } + else{ + if( bAddUndo ){ + aTracks = new TAudioTrackList; + + aTracks->push_back( DuplicateAudioTrack( g_aAudioTracks[iDelTrk] )); + f_MM_AddUndoBefore( 1, &iDelTrk ); + } + + f_MM_AudioDeleteTrack( iDelTrk ); + delete g_aAudioTracks[iDelTrk]; + + if( iDelTrk==0 ) + g_aAudioTracks[0] = new TAudioTrack; + else + g_aAudioTracks.erase( g_aAudioTracks.begin() + iDelTrk ); + } + + if( bAddUndo ){ + int iUndoType = iTrack<0 ? UNDO_TRKAUD_DELALL : UNDO_TRKAUD_DEL; + g_Undo.AddUndo( iUndoType, iDelTrk, -1, -1, (void*)aTracks, NULL ); + } + + PostMessage( Application->MainFormHandle, UM_ENABLERECORD, 0, 0 ); + //Application->MainForm->Perform( UM_ENABLERECORD, 0, 0 ); +} + +void DuplicateRawBars() +{ + if( g_aAudioTracks.size()>1 || g_aAudioTracks[0]->lstBars.empty() ) + return; + + TAudioTrack* pRaw = g_aAudioTracks[0]; + TAudioTrack* pAT = DuplicateAudioTrack( pRaw ); + + g_aAudioTracks.push_back( pAT ); + + pRaw->Hide(); + pAT->Hide(false); + + f_MM_AudioNewTrack(); + f_MM_SetStreamVolume( 0x10+1, pAT->IsMute() ? 0.0 : ( pAT->volume / 100.0) ); + MoveAudio( 0, 0, pRaw->lstBars.size(), 1, 0, MODE_INSERT | OPT_BARS ); + + AudioEffectsSet( g_aAudioTracks.size()-1 ); +} + +TAudioTrack* DuplicateAudioTrack( TAudioTrack* pSrc ) +{ + if( !pSrc ) + return NULL; + + TAudioTrack* pNew = new TAudioTrack( pSrc ); + + //bars + for( int i=0; ilstBars.size(); i++ ){ + TWaveBar* pWvBar = new TWaveBar; + memcpy( pWvBar->aVols, pSrc->lstBars[i]->aVols, sizeof(DWORD)*POINTS_PER_BAR ); + pNew->lstBars.push_back( pWvBar ); + } + + for( int i=0; ilstFxs.size(); i++ ){ + TAudioFx* pFx = new TAudioFx( pSrc->lstFxs[i] ); + pNew->lstFxs.push_back( pFx ); + } + + return pNew; +} + +bool MoveAudio( int iSrcTrack, double dblStart, double dblEnd, + int iDestTrack, double dblInsert, int iOption ) +{ + bool bMoveBars = iOption & OPT_BARS, + bCountDown = false; + + int iMode = iOption & 0x0F; + int iStartBar = (int)dblStart, + iEndBar = (int)dblEnd, + iInsertBar = (int)dblInsert, + iStartPoint = (int)( (dblStart-iStartBar) * POINTS_PER_BAR + 0.5 ), + iEndPoint = (int)( (dblEnd-iEndBar) * POINTS_PER_BAR + 0.5 ), + iInsertPoint = (int)( (dblInsert-iInsertBar) * POINTS_PER_BAR + 0.5 ); + + TAudioTrack *pSrcTrack = iSrcTrack<0 ? NULL : g_aAudioTracks[iSrcTrack], + *pDestTrack = iDestTrack<0 ? NULL : g_aAudioTracks[iDestTrack]; + + if( bMoveBars ){ //Сڲ + int nBarCount = iEndBar - iStartBar, + iDelBar = iStartBar; + + if( iMode==MODE_MOVE || iMode==MODE_COPY || iMode==MODE_INSERT ){ + TWaveBarList lstCopyBars; + + for( int i=iStartBar; iaVols, pSrcTrack->lstBars[i]->aVols, + sizeof(DWORD)*POINTS_PER_BAR ); + + lstCopyBars.push_back( pWvBar ); + } + + InsertWaveBars( iDestTrack, iInsertBar, lstCopyBars ); + + if( iMode==MODE_MOVE && iInsertBariSP ){ + int lenP = iEP - iSP; + if( iMode==MODE_MOVE || iMode==MODE_COPY ) + memcpy( aWave + iPoint, pSrcTrack->lstBars[i]->aVols + iSP, + sizeof(DWORD) * lenP ); + + if( iMode==MODE_MOVE || iMode==MODE_ERASE ) + memset( pSrcTrack->lstBars[i]->aVols + iSP, 0, + sizeof(DWORD) * lenP ); + + iPoint += lenP; + } + else{ + break; + } + } + } + + if( iMode==MODE_MOVE || iMode==MODE_COPY ){ + if( iDestTrack==0 ){ //ӳ + double dblMinLen = dblInsert + dblEnd - dblStart; + if( dblMinLen > pDestTrack->lstBars.size() ){ + int nBars = (int)dblMinLen; + if( dblMinLen - nBars > 0 ) + nBars++; + + for( int i=pDestTrack->lstBars.size(); ilstBars.push_back( pWvBar ); + } + } + } + + int iPoint = 0; + while( iPoint0 ){ + iSP = iInsertPoint; + + if( iSP + nPoints - iPoint < POINTS_PER_BAR ) + iEP = iSP + nPoints - iPoint; + } + else if( nPoints-iPoint < POINTS_PER_BAR ){ + iEP = nPoints - iPoint; + } + + if( iEP > iSP ){ + int lenP = iEP - iSP; + memcpy( pDestTrack->lstBars[iInsertBar]->aVols + iInsertPoint, + aWave + iPoint, sizeof(DWORD) * lenP ); + + iInsertPoint = 0; + iInsertBar++; + iPoint += lenP; + } + else{ + break; + } + } + + delete[] aWave; + } + + f_MM_AudioMove( iDestTrack, dblInsert, iSrcTrack, dblStart, dblEnd, iMode ); + + if( g_iSelAudio==0 ) + PostMessage( Application->MainForm->Handle, UM_AUTORECOGNITION, iMode, 0 ); + } + + return bCountDown; +} + +int CopyWave( int iTrack, int iStartBar, int iStartPoint, + int iEndBar, int iEndPoint, DWORD** aWave ) +{ + bool bT2A = *aWave==NULL; + int nSelPoints = ( iEndBar - iStartBar - 1) * POINTS_PER_BAR + + (POINTS_PER_BAR - iStartPoint) + iEndPoint; + + if( bT2A ){ + *aWave = new DWORD[nSelPoints]; + } + + TAudioTrack* pTrack = g_aAudioTracks[iTrack]; + int iPoint = 0; + + for( int i=iStartBar; i<=iEndBar; i++ ){ + int iSP = 0, iEP = POINTS_PER_BAR; + if( i==iStartBar ) + iSP = iStartPoint; + if( i==iEndBar ) + iEP = iEndPoint; + + if( iEP>iSP ){ + char *pSrc = (char*)( bT2A ? pTrack->lstBars[i]->aVols+iSP : (*aWave)+iPoint ), + *pDest = (char*)( bT2A ? (*aWave)+iPoint : pTrack->lstBars[i]->aVols+iSP ); + + memcpy( pDest, pSrc, sizeof(DWORD) * ( iEP - iSP )); + + iPoint += iEP - iSP; + } + else{ + break; + } + } + + return nSelPoints; +} + +void RemoveWaveBars( int iTrack, int iStartBar, int nDelBars ) +{ + TAudioTrack* pTrack = g_aAudioTracks[iTrack]; + + for( int i=0; ilstBars[iStartBar]; + pTrack->lstBars.erase( pTrack->lstBars.begin()+iStartBar ); + } +} + +void InsertWaveBars( int iTrack, int iInsertBar, TWaveBarList lstBars ) +{ + TAudioTrack* pTrack = g_aAudioTracks[iTrack]; + + if( pTrack->lstBars.size()>0 && iInsertBar < pTrack->lstBars.size() ){ + for( int i=lstBars.size()-1; i>=0; i-- ){ + pTrack->lstBars.insert( pTrack->lstBars.begin()+iInsertBar, lstBars[i] ); + } + } + else{ + for( int i=0; ilstBars.push_back( lstBars[i] ); + } + } +} + +void RestoreWaveBars( int iInsBar, int nBars, DWORD* aWave ) +{ + int nPoints = nBars * POINTS_PER_BAR; + + for( int i=1; iaVols, pW + j * POINTS_PER_BAR, + sizeof(DWORD)*POINTS_PER_BAR ); + + lstWaveBars.push_back( pWvBar ); + } + + InsertWaveBars( i, iInsBar, lstWaveBars ); + } +} + +TAudioTrack* CopyAudioTrack( int iTrack, int iStartBar, int nCopyBars ) +{ + TAudioTrack* pSrcTrack = g_aAudioTracks[iTrack], + *pDestTrack = new TAudioTrack(pSrcTrack); + + for( int i=0; iaVols, pSrcTrack->lstBars[iStartBar+i], + sizeof(DWORD)*POINTS_PER_BAR ); + pDestTrack->lstBars.push_back( pWvBar ); + } + + return pDestTrack; +} + +void InsertAudioTrack( int iTrack, int iInsertBar, int nBars, TAudioTrack* pSrcTrack, int iStartBar ) +{ + TAudioTrack* pDestTrack = g_aAudioTracks[iTrack]; + + if( pDestTrack->lstBars.size()>0 && iInsertBar < pDestTrack->lstBars.size() ){ + for( int i=nBars-1; i>=0; i-- ){ + TWaveBar* pWvBar = new TWaveBar; + + if( pSrcTrack ) + memcpy( pWvBar->aVols, pSrcTrack->lstBars[iStartBar+i], sizeof(DWORD)*POINTS_PER_BAR ); + + pDestTrack->lstBars.insert( pDestTrack->lstBars.begin()+iInsertBar, pWvBar ); + } + } + else{ + for( int i=0; iaVols, pSrcTrack->lstBars[iStartBar+i], sizeof(DWORD)*POINTS_PER_BAR ); + + pDestTrack->lstBars.push_back( pWvBar ); + } + } +} diff --git a/AudioTrack.h b/AudioTrack.h new file mode 100644 index 0000000..edcaca7 --- /dev/null +++ b/AudioTrack.h @@ -0,0 +1,166 @@ +//--------------------------------------------------------------------------- + +#ifndef AudioTrackH +#define AudioTrackH +//--------------------------------------------------------------------------- + +#include "FxDef.h" +#include "BaseTrack.h" + +#include +using namespace std; + +#define MODE_INIT 0 +#define MODE_CHANGE 1 +#define MODE_INSERT 2 +#define MODE_DELETE 3 //ɾС +#define MODE_MOVE 4 //ƶС/Ƶ +#define MODE_COPY 5 //ƣС/Ƶ +#define MODE_ERASE 6 //Ƶ +#define MODE_LOAD 7 +#define MODE_RECORD 8 +#define MODE_RELOAD 9 +#define OPT_BARS 0x10 + +#define POINTS_PER_BAR 120 +#define MAX_AUDIOTRACK 17 + +typedef struct tagWaveBar //С +{ + //ÿСPOINTS_PER_BARֵ + DWORD aVols[POINTS_PER_BAR]; + + tagWaveBar() + { + memset( this, 0, sizeof(tagWaveBar) ); + } + + tagWaveBar( tagWaveBar* pSrc ) + { + memcpy( this, pSrc, sizeof(tagWaveBar)); + } +} TWaveBar; + +typedef vector TWaveBarList; +typedef vector TAudioFxList; + +class TAudioTrack : public TBaseTrack +{ +public: + TWaveBarList lstBars; + TAudioFxList lstFxs; + + TAudioTrack() : TBaseTrack() + { + } + + TAudioTrack( TAudioTrack* pSrc ) : TBaseTrack( pSrc->state, pSrc->volume, pSrc->pan, pSrc->gain ) + { + } + + ~TAudioTrack() + { + while( !lstBars.empty() ){ + delete lstBars.back(); + lstBars.pop_back(); + } + + while( !lstFxs.empty() ){ + delete lstFxs.back(); + lstFxs.pop_back(); + } + } +}; + +typedef vector TAudioTrackList; + +class TAudio +{ +private: + TAudioTrackList m_lstTracks; + +public: + TAudioTrackList& AudioTracks() { return m_lstTracks; }; + void CopyTrackList( int iStartBar, int nCopyBars, TAudioTrackList* lstAudio, bool bFx=false ); + TAudioTrack* CopyTrack( int iTrack, int iStartBar, int nCopyBars, bool bFx=false, + TAudioTrack* pDest=NULL ); + void ResetTracks( TAudioTrackList* lstAudio ); + void RestoreAudio( TOpusStageList* lstStages, TAudioTrackList* lstAudio, bool bUndo ); + bool Empty(){ return m_lstTracks.size()==1 && m_lstTracks[0]->lstBars.empty(); }; + + void WriteProj( FILE* pFile ); + int ReadProj( FILE* pFile, DWORD dwVersion ); + + TAudio() { + m_lstTracks.push_back( new TAudioTrack ); + }; + + ~TAudio(){ + while( m_lstTracks.size()>0 ){ + delete m_lstTracks.back(); + m_lstTracks.pop_back(); + } + } +}; + +extern TAudio g_Audio; +extern int g_iSelAudio; //ǰ +extern TAudioTrackList& g_aAudioTracks; //ȫƵ4飩 + +///////////////////////////////////////////// +//ڰ汾 +typedef struct tagEffect +{ + int iBarStart, iBarEnd; + int iPointStart, iPointEnd; + bool bOn; + int iPreset; + float *aParams; + tagEffect* pNext; + + tagEffect(){ + memset( this, 0, sizeof(tagEffect) ); + iPreset = -1; + } + + tagEffect( tagEffect* pSrc ){ + pNext = NULL; + iBarStart = pSrc->iBarStart; + iBarEnd = pSrc->iBarEnd; + iPointStart = pSrc->iPointStart; + iPointEnd = pSrc->iPointEnd; + iPreset = pSrc->iPreset; + bOn = pSrc->bOn; + if( pSrc->aParams ){ + aParams = new float[6]; + memcpy( aParams, pSrc->aParams, sizeof(float)*6 ); + } + } + + ~tagEffect(){ + if( aParams ) + delete aParams; + } +}TEffect, *PTEffect; +// +////////////////////////////////////////////// +/***************************************************************************************/ +// ȫֺ +/***************************************************************************************/ +TAudioTrack* NewAudioTrack( int nBar, bool bAddUndo=true ); +void DeleteAudioTrack( int iTrack, bool bAddUndo=true ); +void DuplicateRawBars(); +TAudioTrack* DuplicateAudioTrack( TAudioTrack* pSrc ); +bool MoveAudio( int iSrcTrack, double dblStart, double dblEnd, + int iDestTrack, double dblInsert, int iOption ); //أǷˢ +//int GetShowWave( int iTrack ); //ȡǰʾ +int CopyWave( int iTrack, int iStartBar, int iStartPoint, + int iEndBar, int iEndPoint, DWORD** aWave ); //Ʋ +void RemoveWaveBars( int iTrack, int iStartBar, int nDelBars ); +void InsertWaveBars( int iTrack, int iInsertBar, TWaveBarList lstCopyBars ); +void RestoreWaveBars( int iInsBar, int nBars, DWORD* aWave ); +TAudioTrack* CopyAudioTrack( int iTrack, int iStartBar, int nCopyBars ); +void InsertAudioTrack( int iTrack, int iInsertBar, int nBars, TAudioTrack* pSrcTrack, int iStartBar=0 ); + +//--------------------------------------------------------------------------- +#endif diff --git a/BKGMemoUnit.cpp b/BKGMemoUnit.cpp new file mode 100644 index 0000000..450595a --- /dev/null +++ b/BKGMemoUnit.cpp @@ -0,0 +1,108 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop + +#include "BKGMemoUnit.h" +#include "GlobalUnit.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +static const COLORREF + CLR_BKG = RGB(228, 232, 237);//168, 180, 196); +//--------------------------------------------------------------------------- +__fastcall BKGMemoUnit::TMemo::TMemo(System::Classes::TComponent* AOwner) + : Vcl::Stdctrls::TMemo(AOwner) +{ + ControlStyle >> csOpaque; + +// FTransparent = true; + m_pbmpBkg = new TBitmap(); + + //ñˢ + m_pbmpBkg->Width = 2; + m_pbmpBkg->Height = 2; + + m_pbmpBkg->Canvas->Brush->Color = CLR_BKG; + m_pbmpBkg->Canvas->Pen->Color = CLR_BKG; + m_pbmpBkg->Canvas->Rectangle(0, 0, m_pbmpBkg->Width, m_pbmpBkg->Height); + + Brush->Bitmap = m_pbmpBkg; + +} + +//--------------------------------------------------------------------------- +__fastcall BKGMemoUnit::TMemo::~TMemo() +{ + if(m_pbmpBkg) + delete m_pbmpBkg; +} +//--------------------------------------------------------------------------- + +void __fastcall BKGMemoUnit::TMemo::CreateWnd(void) +{ + Vcl::Stdctrls::TMemo::CreateWnd(); + + if( FTransparent ){ + SetWindowLong( Parent->Handle, GWL_STYLE, + GetWindowLong(Parent->Handle, GWL_STYLE) & ~WS_CLIPCHILDREN ); + } +} + +//--------------------------------------------------------------------------- +void __fastcall BKGMemoUnit::TMemo::CreateParams(Vcl::Controls::TCreateParams &Params) +{ + Vcl::Stdctrls::TMemo::CreateParams( Params ); + Params.ExStyle |= WS_EX_TRANSPARENT; +} +//--------------------------------------------------------------------------- + +void __fastcall BKGMemoUnit::TMemo::Invalidate() +{ + if( FTransparent ) + SendMessage( Handle, UM_TEINVALIDATE, 0, 0 ); + else + Vcl::Stdctrls::TMemo::Invalidate(); +} +//--------------------------------------------------------------------------- + +void __fastcall BKGMemoUnit::TMemo::WMEraseBkgnd(TWMEraseBkgnd &Message) +{ + + if( Parent && FTransparent ) + PostMessage( Handle, UM_TEINVALIDATE, 0, 0 ); + else + DefaultHandler( &Message ); + +} +//--------------------------------------------------------------------------- + +void __fastcall BKGMemoUnit::TMemo::CNCtlColorEdit(TWMCtlColorEdit &Message) +{ + if( FTransparent ){ + + SetBkColor(Message.ChildDC, CLR_BKG); +// SetBkMode( Message.ChildDC, TRANSPARENT); + Font->Size = 8; + Message.Result = (int)Brush->Handle; + } + else + DefaultHandler( &Message ); +} + +//--------------------------------------------------------------------------- +void __fastcall BKGMemoUnit::TMemo::TEInvalidate(TMessage &Message) +{ + if( Parent && FTransparent ){ + TRect r = GetClientRect(); + TPoint& pTL = r.TopLeft(); + pTL = Parent->ScreenToClient( ClientToScreen(pTL) ); + TPoint& pBR = r.BottomRight(); + pBR = Parent->ScreenToClient( ClientToScreen(pBR) ); + + RedrawWindow( Handle, &r, 0, RDW_FRAME|RDW_INVALIDATE ); + } + else + Vcl::Stdctrls::TMemo::Invalidate(); +} + +//--------------------------------------------------------------------------- + diff --git a/BKGMemoUnit.h b/BKGMemoUnit.h new file mode 100644 index 0000000..6f7c066 --- /dev/null +++ b/BKGMemoUnit.h @@ -0,0 +1,44 @@ +//--------------------------------------------------------------------------- +#ifndef BKGMemoUnitH +#define BKGMemoUnitH + +#define UM_TEINVALIDATE WM_USER + 0x1003 +#include "SkinScrollBarUnit.h" + +namespace BKGMemoUnit +{ +//--------------------------------------------------------------------------- +class TMemo : public Stdctrls::TMemo +{ +private: + + TBitmap *m_pbmpBkg; + bool FTransparent; + + MESSAGE void __fastcall WMEraseBkgnd(TWMEraseBkgnd &Message); + MESSAGE void __fastcall CNCtlColorEdit(TWMCtlColorEdit &Message); + MESSAGE void __fastcall TEInvalidate(TMessage &Message); + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(WM_ERASEBKGND, TWMEraseBkgnd, WMEraseBkgnd) + MESSAGE_HANDLER(CN_CTLCOLOREDIT, TWMCtlColorEdit, CNCtlColorEdit) + MESSAGE_HANDLER(UM_TEINVALIDATE, TMessage, TEInvalidate) + END_MESSAGE_MAP(Vcl::Stdctrls::TMemo) + +protected: + virtual void __fastcall CreateWnd(); + virtual void __fastcall CreateParams(Vcl::Controls::TCreateParams &Params); + +public: + __fastcall virtual TMemo(System::Classes::TComponent* AOwner); + __fastcall ~TMemo(); + + virtual void __fastcall Invalidate(); + +}; + +} + +using namespace BKGMemoUnit; + +#endif diff --git a/BaseTrack.cpp b/BaseTrack.cpp new file mode 100644 index 0000000..082624b --- /dev/null +++ b/BaseTrack.cpp @@ -0,0 +1,197 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop + +#include "GlobalUnit.h" +#include "MidiTrack.h" +#include "AudioTrack.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) + +//--------------------------------------------------------------------------- +bool IsTrackMute( int iType, int iTrack ) +{ + TBaseTrack* pBase = iType==ST_MIDI ? (TBaseTrack*)g_aMidiTracks[iTrack] + : (TBaseTrack*)g_aAudioTracks[iTrack]; + + if( pBase->IsMute() ) + return true; + else if( !pBase->IsSolo() ){ + for( int i=0; iIsSolo() ) + return true; + } + + int iATStart = g_iPreStage==0 ? 0 : 1, + iATEnd = g_iPreStage==0 ? 1 : g_aAudioTracks.size(); + + for( int i=iATStart; iIsSolo() ) + return true; + } + } + + return false; +} +//--------------------------------------------------------------------------- + +void SetTrackParams( bool bSolo ) +{ + vector aSoloTracks; + + int iATStart = g_iPreStage==0 ? 0 : 1, + iATEnd = g_iPreStage==0 ? 1 : g_aAudioTracks.size(); + + if( bSolo ){ + for( int i=iATStart; iIsSolo() ) + aSoloTracks.push_back( g_aAudioTracks[i] ); + } + for( int i=0; iIsSolo() ) + aSoloTracks.push_back( g_aMidiTracks[i] ); + } + } + + for( int i=iATStart; iIsMute() || !aSoloTracks.empty() && !pAT->IsSolo() ) + f_MM_SetAudioTrackParam( i, 0, 0 ); + else + f_MM_SetAudioTrackParam( i, 0, (float)(pAT->volume / 100.0) ); + + f_MM_SetAudioTrackParam( i, 1, (float)(pAT->pan / 100.0) ); + f_MM_SetAudioTrackParam( i, 2, (float)(pAT->gain / 100.0) ); + } + for( int i=0; iIsMute() || !aSoloTracks.empty() && !pMT->IsSolo() ) + f_MM_SetMidiTrackParam( pMT->file, pMT->chno, 0, 0 ); + else{ + f_MM_SetMidiTrackParam( pMT->file, pMT->chno, 0, pMT->volume ); + } + } +} +//--------------------------------------------------------------------------- + +void ChangeTrackState( int iType, int iTrack, int iState, bool& bSet, bool& bUnset ) +{ + TBaseTrack* pBaseTrk = iType==ST_AUDIO ? (TBaseTrack*)g_aAudioTracks[iTrack] + : (TBaseTrack*)g_aMidiTracks[iTrack]; + int iATStart = g_iPreStage==0 ? 0 : 1, + iATEnd = g_iPreStage==0 ? 1 : g_aAudioTracks.size(); + + bSet = !(pBaseTrk->state & iState); + + vector aSoloTracks; + for( int i=iATStart; iIsSolo() ) + aSoloTracks.push_back( g_aAudioTracks[i] ); + } + for( int i=0; iIsSolo() ) + aSoloTracks.push_back( g_aMidiTracks[i] ); + } + + if( aSoloTracks.empty() ){ + if( iState==TRACK_MUTE ){ + if( iType==ST_AUDIO ){ + f_MM_SetAudioTrackParam( iTrack, 0, bSet ? 0 : pBaseTrk->volume / 100.0 ); + } + else{ + TMidiTrack* pMT = (TMidiTrack*)pBaseTrk; + f_MM_SetMidiTrackParam( pMT->file, pMT->chno, 0, bSet ? 0 : pMT->volume ); + } + + pBaseTrk->Mute( bSet ); + } + else{ + for( int i=iATStart; iIsMute() ){ + f_MM_SetAudioTrackParam( i, 0, pBaseTrk->volume / 100.0 ); + pBaseTrk->Mute( false ); + bUnset = true; + } + } + else{ + f_MM_SetAudioTrackParam( i, 0, 0 ); + } + } + + for( int i=0; iIsMute() ){ + f_MM_SetMidiTrackParam( pMT->file, pMT->chno, 0, pMT->volume ); + + pMT->Mute( false ); + bUnset = true; + } + } + else{ + f_MM_SetMidiTrackParam( pMT->file, pMT->chno, 0, 0 ); + DebugPrint( "Midi mute file %d, chno %d\n", pMT->file, pMT->chno ); + } + } + + pBaseTrk->Solo(); + } + } + else if( pBaseTrk->IsSolo() ){ + if( iState==TRACK_MUTE || aSoloTracks.size()>1 ){ + if( iType==ST_AUDIO ) + f_MM_SetAudioTrackParam( iTrack, 0, 0 ); + else{ + TMidiTrack* pMT = (TMidiTrack*)pBaseTrk; + f_MM_SetMidiTrackParam( pMT->file, pMT->chno, 0, 0 ); + } + + if( iState==TRACK_MUTE ){ + pBaseTrk->Mute(); + bUnset = true; + } + } + + if( aSoloTracks.size()==1 ){ + for( int i=iATStart; iIsMute() ){ + f_MM_SetAudioTrackParam( i, 0, g_aAudioTracks[i]->volume / 100.0 ); + } + } + for( int i=0; iIsMute() ){ + f_MM_SetMidiTrackParam( pMT->file, pMT->chno, 0, pMT->volume ); + } + } + } + + pBaseTrk->Solo( false ); + } + else{ + if( iState==TRACK_MUTE ){ + pBaseTrk->Mute( bSet ); + } + else{ + if( iType==ST_AUDIO ){ + f_MM_SetAudioTrackParam( iTrack, 0, bSet ? pBaseTrk->volume / 100.0 : 0 ); + } + else{ + TMidiTrack* pMT = (TMidiTrack*)pBaseTrk; + f_MM_SetMidiTrackParam( pMT->file, pMT->chno, 0, bSet ? pMT->volume : 0 ); + } + + pBaseTrk->Solo( bSet ); + + if( bSet && pBaseTrk->IsMute() ){ + pBaseTrk->Mute( false ); + bUnset = true; + } + } + } +} +//--------------------------------------------------------------------------- + diff --git a/BaseTrack.h b/BaseTrack.h new file mode 100644 index 0000000..cb920a9 --- /dev/null +++ b/BaseTrack.h @@ -0,0 +1,50 @@ +//--------------------------------------------------------------------------- + +#ifndef BaseTrackH +#define BaseTrackH +//--------------------------------------------------------------------------- +#define TRACK_NORMAL 0x00 +#define TRACK_MUTE 0x01 +#define TRACK_SOLO 0x02 +#define TRACK_HIDE 0x04 + +#define ST_MIDI 0 +#define ST_AUDIO 1 + +class TBaseTrack +{ +public: + BYTE state; + BYTE volume; + char pan; + char gain; + + TBaseTrack() + { + state = TRACK_NORMAL; + volume = 100; + pan = gain = 0; + }; + + TBaseTrack( BYTE s, BYTE v, char p, char g ) + { + state = s; + volume = v; + pan = p; + gain = g; + } + + bool IsMute(){ return state & TRACK_MUTE; }; + bool IsSolo(){ return state & TRACK_SOLO; }; + bool IsHide(){ return state & TRACK_HIDE; }; + void Mute( bool bMute=true ) { if( bMute ) state |= TRACK_MUTE; else state &= ~TRACK_MUTE; }; + void Solo( bool bSolo=true ) { if( bSolo ) state |= TRACK_SOLO; else state &= ~TRACK_SOLO; }; + void Hide( bool bHide=true ) { if( bHide ) state |= TRACK_HIDE; else state &= ~TRACK_HIDE; }; + +}; + +void SetTrackParams( bool bSolo=true ); //bSoloǷǶ״̬ +bool IsTrackMute( int iType, int iTrack ); +void ChangeTrackState( int iType, int iTrack, int iState, bool& bSet, bool& bUnset ); + +#endif diff --git a/BtnPanelUnit.cpp b/BtnPanelUnit.cpp new file mode 100644 index 0000000..bfb6030 --- /dev/null +++ b/BtnPanelUnit.cpp @@ -0,0 +1,527 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop + +#include "BtnPanelUnit.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +VCTBtnPanel::iterator vc_pFindVCTBtnPanel; +//--------------------------------------------------------------------------- +__fastcall TBtnPanel::TBtnPanel(TWinControl *pTWnCtl) +: TComponent(pTWnCtl) +{ + m_pTWnCtl = pTWnCtl; + + m_pAppEvents = new TApplicationEvents(this); + m_pAppEvents->OnMessage = OnAppEvents; + + + m_bPalEn = false; + m_bPalLD = false; + m_bPalRD = false; + + m_bBtnEn = m_bBtnLD = m_bBtnRD = false; + m_pParentBtn = NULL; + + FLeft = FTop = FWidth = FHeight = 0; + FEnabled = true; + FDown = false; + FStateEnter = true; + FStateCount = 3; + FBtnCurState = Bs_NORMAL; + FTransparent = false; + FTransparentValue = 255; + + m_BtnCurStateBac = Bs_NORMAL; +} +//--------------------------------------------------------------------------- +__fastcall TBtnPanel::~TBtnPanel() +{ + SAFE_DELETE(m_pAppEvents) +} +//--------------------------------------------------------------------------- +bool __fastcall TBtnPanel::IsPtInSubtn(int XPos, int YPos) +{ + for(vc_pFindVCTBtnPanel =m_VCSubtn.begin(); + vc_pFindVCTBtnPanel!=m_VCSubtn.end(); + vc_pFindVCTBtnPanel++ ) + { + TRect TRectTmpSubView + = TRect((*vc_pFindVCTBtnPanel)->Left, (*vc_pFindVCTBtnPanel)->Top, + (*vc_pFindVCTBtnPanel)->Left+(*vc_pFindVCTBtnPanel)->Width, + (*vc_pFindVCTBtnPanel)->Top+(*vc_pFindVCTBtnPanel)->Height); + if( PtInRect(TRectTmpSubView, TPoint(XPos, YPos) ) ) { + return true; + } + } + + return false; +} +//--------------------------------------------------------------------------- +bool __fastcall TBtnPanel::IsBtnHandleAppEvent(unsigned int message, int XPos, int YPos) +{ + if( IsPtInSubtn(XPos, YPos) ) { + + if( Bs_NORMAL==FBtnCurState ) + return false; + } + + return true; +} +//--------------------------------------------------------------------------- +void __fastcall TBtnPanel::OnAppEvents(tagMSG &Msg, bool &Handled) +{ + // ----- + if( false == FEnabled || + false == m_pTWnCtl->Enabled || + (false == m_bPalEn && + Msg.hwnd != m_pTWnCtl->Handle) ) + return; + + if( WM_LBUTTONDOWN == Msg.message || + WM_LBUTTONUP == Msg.message || + WM_LBUTTONDBLCLK == Msg.message || + WM_RBUTTONDOWN == Msg.message || + WM_RBUTTONUP == Msg.message || + WM_MOUSEMOVE == Msg.message ) + { + + }else return; + + // ----- + TRect rtSelf = TRect(Left, Top, Left+Width, Top+Height); + TPoint pt = m_pTWnCtl->ScreenToClient(TPoint(Msg.pt.x, Msg.pt.y)); + + TWMMouse Message; + Message.Msg = Msg.message; + Message.XPos = pt.x; + Message.YPos = pt.y; + + if( false==IsBtnHandleAppEvent(Message.Msg, Message.XPos, Message.YPos) ) return; + + // ----- + MsState MsStatus = Ms_NONE; + //뿪 + if( m_bPalEn && !PtInRect( rtSelf, pt ) ) { + + if( WM_MOUSEMOVE != Msg.message ) { + + return; + + }else if( WM_MOUSEMOVE==Msg.message ) { + + m_bPalEn = false; + MsStatus = Ms_LEAVE; + BtnHandleAppEvent(MsStatus, Message.XPos, Message.YPos); + + return; + } + //Ѿ뿪 + } else if(!m_bPalEn && !PtInRect( rtSelf, pt ) ) { + + if( m_bPalLD ) { //϶¼ + MsStatus = Ms_DRAG; + BtnHandleAppEvent(MsStatus, Message.XPos, Message.YPos); + } + + // WM_LBUTTONUP WM_RBUTTONUP ٴ + if((WM_LBUTTONUP != Msg.message && WM_RBUTTONUP != Msg.message) || + (false==m_bPalLD && WM_LBUTTONUP == Msg.message ) || //ûа¼ ٴ + (false==m_bPalRD && WM_RBUTTONUP == Msg.message ) ) + return; + } + + // ----- + switch( Msg.message ) + { + case WM_LBUTTONDOWN: + { + MsStatus = Ms_LDOWN; + m_bPalLD = true; + + } break; + case WM_LBUTTONUP: + { + if( m_bPalLD ) { + MsStatus = Ms_LUP; + m_bPalLD = false; + } + + } break; + case WM_LBUTTONDBLCLK: + { + MsStatus = Ms_LLDOWN; + + } break; + case WM_RBUTTONDOWN: + { + MsStatus = Ms_RDOWN; + m_bPalRD = true; + + } break; + case WM_RBUTTONUP: + { + if(m_bPalRD) { + + MsStatus = Ms_RUP; + m_bPalRD = false; + } + + } break; + case WM_MOUSEMOVE: + { + if( m_bPalEn ) + { + if(m_bPalLD) + MsStatus = Ms_DRAG; + else + MsStatus = Ms_MOVE; + + }else MsStatus = Ms_ENTER; + + m_bPalEn = true; + + } break; + default: break; + } + + if(Ms_NONE!=MsStatus ) BtnHandleAppEvent(MsStatus, Message.XPos, Message.YPos); +} +//--------------------------------------------------------------------------- +void __fastcall TBtnPanel::BtnHandleAppEvent(MsState MsSrcTmp, int XPos, int YPos) +{ + MsState MsTmp = Ms_NONE; + BtnState BsTmp = Bs_NONE; + + switch( MsSrcTmp ) + { + case Ms_LDOWN: + { + m_bBtnLD = true; + BsTmp = Bs_DOWN; + FBtnCurState = BsTmp; + + MsTmp = Ms_LDOWN; + + } break; + case Ms_LLDOWN: + { + MsTmp = Ms_LLDOWN; + + } break; + case Ms_LUP: + { + m_bBtnLD = false; + if( PtInRect( TRect(Left, Top, Left+Width, Top+Height), + TPoint(XPos, YPos) ) ) + BsTmp = Bs_ENTER; + else + BsTmp = Bs_NORMAL; + FBtnCurState = BsTmp; + + MsTmp = Ms_LUP; + + } break; + case Ms_RDOWN: + { + MsTmp = Ms_RDOWN; + + } break; + case Ms_RUP: + { + MsTmp = Ms_RUP; + + } break; + case Ms_ENTER: + { + if( true!=m_bBtnLD ) { + + m_bBtnEn = true; + BsTmp = Bs_ENTER; + FBtnCurState = BsTmp; + + MsTmp = Ms_ENTER; + } + } break; + case Ms_LEAVE: + { + if( true!=m_bBtnLD ) { + + m_bBtnEn = false; + BsTmp = Bs_NORMAL; + FBtnCurState = BsTmp; + + MsTmp = Ms_LEAVE; + } + + } break; + case Ms_MOVE: + { + if( m_bBtnEn ) { + + bool bIsPtInSubtn = IsPtInSubtn(XPos, YPos); + if( bIsPtInSubtn ) { + + m_bBtnEn = false; + BsTmp = Bs_NORMAL; + FBtnCurState = BsTmp; + + MsTmp = Ms_LEAVE; + + }else { + + MsTmp = Ms_MOVE; + } + + }else{ + + m_bBtnEn = true; + BsTmp = Bs_ENTER; + FBtnCurState = BsTmp; + + MsTmp = Ms_ENTER; + } + + } break; + case Ms_DRAG: + { + MsTmp = Ms_DRAG; + + } break; + default: break; + } + + if( Ms_NONE != MsTmp ) BtnMsEvent(MsTmp, XPos, YPos); + if( Bs_NONE != BsTmp ) BtnDrEvent(FBtnCurState, XPos, YPos); +} +//--------------------------------------------------------------------------- +void __fastcall TBtnPanel::BtnHandleState() +{ + BtnState BtnStateTmp = this->FBtnCurState; + if( false==m_pTWnCtl->Enabled || + false==FEnabled ) { + + BtnStateTmp = Bs_DISABLE; + + }else { + + if( false==FStateEnter && Bs_ENTER==this->FBtnCurState ) + BtnStateTmp = Bs_NORMAL; + + if( FDown ) BtnStateTmp = Bs_DOWN; + + if( FStateCount<=BtnStateTmp ) BtnStateTmp = FStateCount-1; + } + + m_BtnCurStateBac = FBtnCurState = BtnStateTmp; +} +//--------------------------------------------------------------------------- +void __fastcall TBtnPanel::BtnDrEvent(BtnState BsTmp, int XPos, int YPos) +{ + if( Bs_DOWN == BsTmp || + Bs_ENTER == BsTmp || + Bs_NORMAL == BsTmp ) + { + int BtnCurStateBac = m_BtnCurStateBac; + BtnHandleState(); + if( BtnCurStateBac==m_BtnCurStateBac ) return; + + Paint(); + } +} +//--------------------------------------------------------------------------- +void __fastcall TBtnPanel::BtnMsEvent(MsState MsTmp, int XPos, int YPos) +{ + if( Ms_LDOWN == MsTmp || + Ms_LUP == MsTmp || + Ms_LLDOWN == MsTmp || + Ms_RDOWN == MsTmp || + Ms_RUP == MsTmp || + Ms_ENTER == MsTmp || + Ms_LEAVE == MsTmp || + Ms_MOVE == MsTmp || + Ms_DRAG == MsTmp ) + { + if( OnPanelMsEvent ) OnPanelMsEvent(MsTmp, XPos, YPos); + } +} +//--------------------------------------------------------------------------- +void __fastcall TBtnPanel::AddSubPanel(TBtnPanel *pTBtnPanel) +{ + m_VCSubtn.push_back(pTBtnPanel); + pTBtnPanel->m_pParentBtn = this; +} +//--------------------------------------------------------------------------- +void __fastcall TBtnPanel::SetBounds(int nLeft, int nTop, int nWidth, int nHeight) +{ + FLeft = nLeft; + FTop = nTop; + FWidth = nWidth; + FHeight = nHeight; +} +//--------------------------------------------------------------------------- +void __fastcall TBtnPanel::PaintParent(TCanvas *CanvasDrawCus) +{ + if( this->m_pParentBtn ) { + this->m_pParentBtn->Paint(CanvasDrawCus, false); + } +} +//--------------------------------------------------------------------------- +void __fastcall TBtnPanel::PaintSub(TCanvas *CanvasParent) +{ + if( m_VCSubtn.size() ) { + + for(vc_pFindVCTBtnPanel =m_VCSubtn.begin(); + vc_pFindVCTBtnPanel!=m_VCSubtn.end(); + vc_pFindVCTBtnPanel++ ) + { + ((TBtnPanel *)(*vc_pFindVCTBtnPanel))->Paint(CanvasParent, false); + } + } +} +//--------------------------------------------------------------------------- +void __fastcall TBtnPanel::Paint(TCanvas *Canvas, bool bParent) +{ + TCanvas *CanvasDraw = Canvas; + + TRect rtThis = TRect(this->Left, this->Top, + this->Left+this->Width, + this->Top +this->Height); + + TRect rtCreate = TRect(this->m_pTWnCtl->Left, this->m_pTWnCtl->Top, + this->m_pTWnCtl->Left+this->m_pTWnCtl->Width, + this->m_pTWnCtl->Top +this->m_pTWnCtl->Height); + + // + HDC ParentDC = GetDC(this->m_pTWnCtl->Handle); + HDC DCCreate; + HBITMAP BmpCreate; + TCanvas *CanvasCreate; + if( NULL==Canvas ) { + + DCCreate = CreateCompatibleDC(ParentDC); + BmpCreate = CreateCompatibleBitmap(ParentDC, + rtCreate.Width(), + rtCreate.Height()); + SelectObject(DCCreate, BmpCreate); + PerformEraseBackground(this->m_pTWnCtl, DCCreate); + CanvasCreate = new TCanvas(); + CanvasCreate->Handle = DCCreate; + + CanvasDraw = CanvasCreate; + if( FTransparent ) { + SetBkMode( CanvasDraw->Handle, TRANSPARENT); + StyleServices()->DrawParentBackground( + this->m_pTWnCtl->Handle, + CanvasDraw->Handle, + NULL, false, rtThis); + } + } + + // + if( FPanelDrEvent ) + { + BtnHandleState(); + + //½ + TCanvas *CanvasCusDraw = new TCanvas(); + HDC DCCusDraw; + HBITMAP BmpCusDraw; + DCCusDraw = CreateCompatibleDC(ParentDC); + BmpCusDraw = CreateCompatibleBitmap(ParentDC, rtCreate.Width(), + rtCreate.Height()); + SelectObject(DCCusDraw, BmpCusDraw); + PerformEraseBackground(this->m_pTWnCtl, DCCusDraw); + CanvasCusDraw->Handle = DCCusDraw; + + if( FTransparent ) { + + SetBkMode( CanvasCusDraw->Handle, TRANSPARENT); + StyleServices()->DrawParentBackground( + this->m_pTWnCtl->Handle, + CanvasCusDraw->Handle, + NULL, false, rtThis); + + //parentͼ + if( this->m_pParentBtn ) { + + if( true==bParent ) { + + if( NULL==Canvas ) PaintParent(CanvasDraw); + } + + StretchBlt(CanvasCusDraw->Handle, + rtThis.Left, rtThis.Top, + rtThis.Width(), rtThis.Height(), + CanvasDraw->Handle, + rtThis.Left, rtThis.Top, + rtThis.Width(), rtThis.Height(), + SRCCOPY); + } + } + + FPanelDrEvent(FBtnCurState, rtThis, CanvasCusDraw); + + if( FTransparent ) { + + BLENDFUNCTION BFun; + BFun.BlendOp = AC_SRC_OVER; + BFun.BlendFlags = 0; + BFun.SourceConstantAlpha = FTransparentValue; + BFun.AlphaFormat = 0; + + ::AlphaBlend( CanvasDraw->Handle, + rtThis.Left, rtThis.Top, + rtThis.Width(), rtThis.Height(), + CanvasCusDraw->Handle, + rtThis.Left, rtThis.Top, + rtThis.Width(), rtThis.Height(), + BFun); + + }else{ + + StretchBlt(CanvasDraw->Handle, + rtThis.Left, rtThis.Top, + rtThis.Width(), rtThis.Height(), + CanvasCusDraw->Handle, + rtThis.Left, rtThis.Top, + rtThis.Width(), rtThis.Height(), + SRCCOPY); + } + + if( true==bParent ) + PaintSub(CanvasDraw); + + DeleteDC(DCCusDraw); + DeleteObject(BmpCusDraw); + SAFE_DELETE(CanvasCusDraw) + } + + if( NULL==Canvas ) { + + StretchBlt(ParentDC, + this->Left, this->Top, + this->Width, this->Height, + CanvasDraw->Handle, + this->Left, this->Top, + this->Width, this->Height, + SRCCOPY); + + DeleteDC(DCCreate); + DeleteObject(BmpCreate); + SAFE_DELETE(CanvasCreate) + } +} +//--------------------------------------------------------------------------- +void __fastcall TBtnPanel::Update(bool bEreaseBkg) +{ + if( m_pParentBtn && bEreaseBkg ) { + + ((TBtnPanel *)m_pParentBtn)->Update(bEreaseBkg); + + }else { + + Paint(); + } +} +//--------------------------------------------------------------------------- diff --git a/BtnPanelUnit.h b/BtnPanelUnit.h new file mode 100644 index 0000000..d0fa959 --- /dev/null +++ b/BtnPanelUnit.h @@ -0,0 +1,126 @@ +//--------------------------------------------------------------------------- + +#ifndef BtnPanelUnitH +#define BtnPanelUnitH +//--------------------------------------------------------------------------- +#include +//--------------------------------------------------------------------------- +#include +using namespace std; +//--------------------------------------------------------------------------- +#ifndef SAFE_DELETE(p) +#define SAFE_DELETE(p) { if(p) { delete (p); (p)=NULL; } } +#endif +//--------------------------------------------------------------------------- +typedef enum{ + + Bs_NORMAL=0, + Bs_ENTER, + Bs_DOWN, + Bs_DISABLE, + Bs_NONE + +}BtnState; + +typedef enum{ + + Ms_LDOWN=0, + Ms_LUP, + Ms_LLDOWN, + Ms_RDOWN, + Ms_RUP, + Ms_ENTER, + Ms_LEAVE, + Ms_MOVE, + Ms_DRAG, + Ms_NONE +}MsState; +//--------------------------------------------------------------------------- +class TBtnPanel; +typedef vector VCTBtnPanel; +extern VCTBtnPanel::iterator vc_pFindVCTBtnPanel; +//--------------------------------------------------------------------------- +typedef void __fastcall (__closure *PanelMsEvent)(int MsTmp, int XPos, int YPos); +typedef void __fastcall (__closure *PanelDrEvent)(int BsTmp, TRect TRectTmp, TCanvas *pCanvas); +//--------------------------------------------------------------------------- +class TBtnPanel: public TComponent +{ + +private: + + TApplicationEvents *m_pAppEvents; + bool m_bPalEn, m_bPalLD, m_bPalRD; + void __fastcall OnAppEvents(tagMSG &Msg, bool &Handled); + + TBtnPanel *m_pParentBtn; + VCTBtnPanel m_VCSubtn; + bool m_bBtnEn, m_bBtnLD, m_bBtnRD; + int m_BtnCurStateBac; + + bool __fastcall IsBtnHandleAppEvent(unsigned int message, int XPos, int YPos); + bool __fastcall IsPtInSubtn(int XPos, int YPos); + void __fastcall BtnHandleAppEvent(MsState MsSrcTmp, int XPos, int YPos); + void __fastcall BtnHandleState(); + void __fastcall BtnMsEvent(MsState MsTmp, int XPos, int YPos); + void __fastcall BtnDrEvent(BtnState BsTmp, int XPos, int YPos); + + void __fastcall PaintParent(TCanvas *CanvasDrawCus); + void __fastcall PaintSub(TCanvas *CanvasDraw); + + // ----- + int FLeft, FTop, FWidth, FHeight; + bool FEnabled; + bool FDown; + bool FStateEnter; + int FStateCount; + int FBtnCurState; + bool FTransparent; + BYTE FTransparentValue; + PanelMsEvent FPanelMsEvent; + PanelDrEvent FPanelDrEvent; + +public: + + TWinControl *m_pTWnCtl; + void __fastcall SetBounds(int nLeft, int nTop, int nWidth, int nHeight); + void __fastcall AddSubPanel(TBtnPanel *pTBtnPanel); + void __fastcall Update(bool bEreaseBkg=true); + void __fastcall Paint(TCanvas *Canvas=NULL, bool bParent=true); + + __fastcall TBtnPanel(TWinControl *pTWnCtl); + __fastcall ~TBtnPanel(); + +__published: + + __property int Left = { read=FLeft, write=FLeft, default=0 }; + __property int Top = { read=FTop, write=FTop, default=0 }; + __property int Width = { read=FWidth, write=FWidth, default=0 }; + __property int Height = { read=FHeight, write=FHeight, default=0 }; + __property bool StateEnter = { read=FStateEnter, write=FStateEnter, default=true }; + __property bool Enabled = { read=FEnabled, write=FEnabled, default=true }; + __property bool Down = { read=FDown, write=FDown, default=false }; + __property int BtnCurState = { read=FBtnCurState,write=FBtnCurState,default=Bs_NORMAL}; + __property int StateCount = { read=FStateCount, write=FStateCount, default=3 }; + __property bool Transparent = { read=FTransparent, write=FTransparent, default=false }; + __property BYTE TransparentValue = { read=FTransparentValue, write=FTransparentValue, default=255 }; + __property PanelMsEvent OnPanelMsEvent = { read=FPanelMsEvent , write=FPanelMsEvent }; + __property PanelDrEvent OnPanelDrEvent = { read=FPanelDrEvent , write=FPanelDrEvent }; +}; +//--------------------------------------------------------------------------- +#endif + +/****************************************** +******************READ ME****************** +******************************************* +@ ȴ¼ڴ¼ +@ ¼ϵǾ; +@ ϵ; +@ ػ棬viewӦػ棻 +@ rect仯viewӦػ棻 +@ ֻpngҪtrans +@ StateCount-->BtnState; +@ Ms_LLDOWN-->event no paint; +******************************************* +******************************************* +*******************************************/ + diff --git a/CKBox.h b/CKBox.h new file mode 100644 index 0000000..11465e7 --- /dev/null +++ b/CKBox.h @@ -0,0 +1,74 @@ +//--------------------------------------------------------------------------- + +#ifndef CKBoxH +#define CKBoxH +#include +#include +//--------------------------------------------------------------------------- +class PACKAGE TCKBox : public TPanel +{ +private: + bool FChecked; + bool FEnabled; + bool bMouse; + bool FAutoBox; + TNotifyEvent FOnChange; + TColor FBoxColor; + + String m_strText; +// TLabel *m_pCaption; + Vcl::Imaging::Pngimage::TPngImage *m_pImgCheck; + +private: + void __fastcall SetBoxEnabled(bool bEnabled); + void __fastcall SetEnabled(bool bEnabled); + void __fastcall SetChecked(bool bCheck); + void __fastcall SetBoxColor(TColor cColor); + TFont* __fastcall GetTextFont(); + void __fastcall SetTextFont( TFont* Value ); +// void __fastcall Clicklb(TObject *Sender); +// TColor __fastcall ColorSub(TColor cColor,int index); + String __fastcall GetCaption(); + void __fastcall SetCaption( String Value ); + +protected: + virtual void __fastcall Paint(void); + + MESSAGE void __fastcall CMMouseLeave(TWMMouse &Message); + MESSAGE void __fastcall CMMouseEnter(TWMMouse &Message); + MESSAGE void __fastcall WMSize(Winapi::Messages::TWMSize &Message); + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(CM_MOUSEENTER, TWMMouse, CMMouseEnter) + MESSAGE_HANDLER(CM_MOUSELEAVE, TWMMouse, CMMouseLeave) + MESSAGE_HANDLER(WM_SIZE, TWMSize, WMSize) + END_MESSAGE_MAP(TPanel) +public: + DYNAMIC void __fastcall Click(void); + + __fastcall TCKBox( TComponent* Owner ); + __fastcall ~TCKBox(); + +__published: + __property bool Checked = { read = FChecked, write = SetChecked, default = 0 }; + __property bool Enabled = { read = FEnabled, write = SetEnabled, default = 1 }; + __property bool AutoBox = { read = FAutoBox,write = FAutoBox,default = 1}; + __property TColor BoxColor = { read = FBoxColor,write = SetBoxColor }; + __property Font = { read = GetTextFont, write = SetTextFont }; + __property TNotifyEvent OnChange = {read = FOnChange, write = FOnChange ,default = NULL}; + __property String Caption = {read = GetCaption, write = SetCaption }; +}; +#endif + +/* + ʹ˵ + 1OnChange Ϊ Checked ıʱ Ϊⲿӿ Ҳʹø TPanel ġonClick + 2FontSize Ϊ С + 3AutoBox Ϊ True ʱ + Box ĴС߶ȱ仯 + Ϊfalse ʱ + Box ĴС ؼ Height 仯 + 4BoxEnabled ܷʹ TPanel Enabled ͻ + ע + ؼ С Height Ϊ 6 С Width Ϊ 11 + +*/ diff --git a/CapButton.h b/CapButton.h new file mode 100644 index 0000000..3513466 --- /dev/null +++ b/CapButton.h @@ -0,0 +1,139 @@ +//--------------------------------------------------------------------------- +#ifndef CapButtonH +#define CapButtonH +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include +#include +//--------------------------------------------------------------------------- +class PACKAGE TCapButton : public TGraphicControl +{ +public: + enum TModalResult{ + mrNone = System::Int8(0x0), + mrOk = System::Int8(0x1), + mrCancel = System::Int8(0x2), + mrAbort = System::Int8(0x3), + mrRetry = System::Int8(0x4), + mrIgnore = System::Int8(0x5), + mrYes = System::Int8(0x6), + mrNo = System::Int8(0x7), + mrClose = System::Int8(0x8), + mrHelp = System::Int8(0x9), + mrTryAgain = System::Int8(0xa), + mrContinue = System::Int8(0xb), + mrAll = System::Int8(0xc), + mrNoToAll = System::Int8(0xd), + mrYesToAll = System::Int8(0xe) + }; + +private: + COLORREF + clrFrameExNormal, + clrFrameExEnter, + clrFrameExDisable, + clrFrameNormal, + clrLineNormal, + clrRectNormal, + clrRectDisable, + clrCapArrowOpenBound[10], + clrCapArrowOpenLine[4], + clrExFrameBound[4], + clrExFrameBoundDisable[4]; + + TColor FBorderColor; + TColor FInterFrameColor; + TColor FInterColor; + + void __fastcall IniColor(int nstate); + COLORREF __fastcall TransformColor(COLORREF icolor, int nNum=0, bool bplus=true); + void __fastcall SetBorderColor(TColor iBorderColor); + void __fastcall SetInterFrameColor(TColor iInterFrameColor); + void __fastcall SetInterColor(TColor iInterColor); +private: + String FCaption; + TNotifyEvent FOnMouseEnter;//on mouse enter notify event + TNotifyEvent FOnMouseLeave;//on mouse leave notify event +// System::Uitypes::TModalResult FModalResult; + TModalResult FModalResult; + + int __fastcall GetFontSize(); + + MESSAGE void __fastcall CMMouseEnter(Winapi::Messages::TMessage &Msg); // to know when mouse is entered + MESSAGE void __fastcall CMMouseLeave(Winapi::Messages::TMessage &Msg); // to know when mouse is leaved + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(CM_MOUSEENTER, TMessage, CMMouseEnter) + MESSAGE_HANDLER(CM_MOUSELEAVE, TMessage, CMMouseLeave) + END_MESSAGE_MAP(TGraphicControl) + +protected: + bool FEnablePNG; //ǷpngʽͼƬ + bool FDown; // value to know if we painting mouse down + int EtatBtn; // 0=Normal 1=Mouse entered 2=Pressed 3=Disabled + int FStateCount; + Vcl::Imaging::Pngimage::TPngImage *FPngImg; //our 4 states image + + DYNAMIC void __fastcall MouseDown(System::Uitypes::TMouseButton Button, System::Classes::TShiftState Shift, int X, int Y); + DYNAMIC void __fastcall MouseUp(System::Uitypes::TMouseButton Button, System::Classes::TShiftState Shift, int X, int Y); + virtual void __fastcall SetEnabled(bool Value); + +public: + + __fastcall virtual TCapButton(System::Classes::TComponent* AOwner); + __fastcall virtual ~TCapButton(void); + + void __fastcall SetStateCount( int count ); + void __fastcall SetPngImg(Vcl::Imaging::Pngimage::TPngImage *value); // we set the png image + void __fastcall SetDown(bool value); // to know if mouse is down or not + void __fastcall SetEnablePNG(bool Value);// to know if customer set png img + void __fastcall SetCaption(String Value); + virtual void __fastcall Paint(void); // override the painting of the component + DYNAMIC void __fastcall Click(void); + +__published: + + __property Action; + __property Anchors = {default=3}; + __property bool Down = {read=FDown, write=SetDown, default=False}; + __property Enabled = {default=1}; + __property int ImgStates = {read=FStateCount, write=SetStateCount, default=4}; +// __property System::Uitypes::TModalResult ModalResult = {read=FModalResult, write=FModalResult, default=0}; + __property TModalResult ModalResult = {read=FModalResult, write=FModalResult, default=0}; + __property ParentShowHint = {default=1}; + __property Vcl::Imaging::Pngimage::TPngImage *PngImg = {read=FPngImg, write=SetPngImg}; + __property PopupMenu; + __property ShowHint; + __property Visible = {default=1}; + __property OnClick; + __property OnContextPopup; + __property OnMouseDown; + __property OnMouseMove; + __property OnMouseUp; + __property System::Classes::TNotifyEvent OnMouseEnter = {read=FOnMouseEnter, write=FOnMouseEnter}; + __property System::Classes::TNotifyEvent OnMouseLeave = {read=FOnMouseLeave, write=FOnMouseLeave}; + __property bool EnablePNG = {read=FEnablePNG, write=SetEnablePNG, default=False}; + __property TColor BorderColor = {read=FBorderColor, write=SetBorderColor, default=TColor(0x83807d)}; + __property TColor InterFrameColor = {read=FInterFrameColor, write=SetInterFrameColor, default=TColor(0x302e2c)}; + __property TColor InterColor = {read=FInterColor, write=SetInterColor, default=TColor(0x58504a)}; +private: + Vcl::Imaging::Pngimage::TPngImage *m_pPngButton, *m_pPngFoucusButton; + Vcl::Imaging::Pngimage::TPngImage *pTmpDraw, *pTmpFoucusDraw; + void __fastcall PaintCustomer(void); + void __fastcall PaintCustomerText(void); + +public: + TRect rtCaption; + + void __fastcall SetFontSize( int value ); + void __fastcall SetFont(String name, int size ); + +__published: + __property String Caption = {read=FCaption, write=FCaption}; + __property int FontSize = {read=GetFontSize, write=SetFontSize, default=8}; +}; +//--------------------------------------------------------------------------- +#endif diff --git a/ChordPanel.cpp b/ChordPanel.cpp new file mode 100644 index 0000000..4c826b4 --- /dev/null +++ b/ChordPanel.cpp @@ -0,0 +1,414 @@ +//--------------------------------------------------------------------------- +#include +#include +#pragma hdrstop + +#include "GlobalUnit.h" +#include "ChordPanel.h" + +#define COL_HEIGHT 40 +#define COL_GAP 10 +#define MAINKEY_WIDTH 50 +#define ADJKEY_WIDTH 40 +#define CHORDTYPE_WIDTH 96 + +String u_strChordType[] = { " Maj", "С Min", "С 7", "С Min7", + "Ҷ Sus2", " Sus4", " Sus6", " Maj7" }; + +//--------------------------------------------------------------------------- +#pragma package(smart_init) + +__fastcall TChordPanel::TChordPanel(TComponent* AOwner) + : TToolpalPanel(AOwner) +{ + m_iType = TPTYPE_CHORD; + m_nTextHeight = 40; + m_iMelodyKey = 0; + m_iMainKey = m_iChordType = -1; + m_iAdjustKey = 0; + m_bEnable = false; + m_lblName = NULL; + m_lblType = NULL; + + m_strTitle = ""; + AddToolBtn( 3, "imgAlphaChord", KeyModeClick, "ʾӢĺ" ); +} +//--------------------------------------------------------------------------- + +void __fastcall TChordPanel::CreateWnd(void) +{ + TToolpalPanel::CreateWnd(); + + m_lblName = new TLabel(this); + m_lblName->Parent = this; + m_lblName->Alignment = taCenter; + m_lblName->Layout = tlCenter; + m_lblName->AutoSize = false; + m_lblName->SetBounds( LEFT_BOUND + COL_GAP, + m_nTitleHeight + COL_GAP, + MAINKEY_WIDTH + ADJKEY_WIDTH + COL_GAP, + m_nTextHeight - COL_GAP ); + m_lblName->Font->Name = g_strTxtFontName; +// m_lblName->Font->Size = g_szFont9; + m_lblName->Font->Color = RGB(156, 170, 189); + m_lblName->Caption = g_bAlphaKey ? L"ҵ" : L"Ҽ"; + + m_lblType = new TLabel(this); + m_lblType->Parent = this; + m_lblType->Alignment = taCenter; + m_lblType->Layout = tlCenter; + m_lblType->AutoSize = false; + m_lblType->SetBounds( m_lblName->Left + m_lblName->Width + 16, + m_nTitleHeight + COL_GAP, + CHORDTYPE_WIDTH, + m_nTextHeight - COL_GAP ); + m_lblType->Font->Name = g_strTxtFontName; +// m_lblType->Font->Size = g_szFont9; + m_lblType->Font->Color = RGB(156, 170, 189); + m_lblType->Caption = L""; + + for( int i = 0; i < 7; i++ ){ + m_aMainKeys[i] = new TTextButton(this); + m_aMainKeys[i]->Parent = this; + m_aMainKeys[i]->Enabled = false; + m_aMainKeys[i]->OnClick = MainKeyClick; + m_aMainKeys[i]->Tag = MainKeyTag( i ); + m_aMainKeys[i]->Text = g_bAlphaKey ? g_strAlphaTable[i] : g_strTable[i]; + m_aMainKeys[i]->FontName = g_strTxtFontName; + m_aMainKeys[i]->FontSize = g_szFont12; + m_aMainKeys[i]->SetBounds( LEFT_BOUND + COL_GAP, + m_nTitleHeight + m_nTextHeight + i*COL_HEIGHT, + MAINKEY_WIDTH, COL_HEIGHT ); + } + + for( int i=0; i<2; i++ ){ + m_aAdjustKeys[i] = new TTextButton(this); + m_aAdjustKeys[i]->Parent = this; + m_aAdjustKeys[i]->Enabled = false; + m_aAdjustKeys[i]->OnClick = AdjustKeyClick; + m_aAdjustKeys[i]->Tag = i==0 ? 1 : -1; + m_aAdjustKeys[i]->Text = i==0 ? "#" : "b"; + m_aAdjustKeys[i]->FontName = g_strTxtFontName; + m_aAdjustKeys[i]->FontSize = g_szFont12; + m_aAdjustKeys[i]->SetBounds( m_aMainKeys[0]->Left + m_aMainKeys[0]->Width + COL_GAP, + m_nTitleHeight + m_nTextHeight + i*COL_HEIGHT, + ADJKEY_WIDTH, COL_HEIGHT ); + } + + for( int i=0; iParent = this; + m_aChordTypes[i]->Enabled = false; + m_aChordTypes[i]->OnClick = ChordTypeClick; + m_aChordTypes[i]->Tag = i; + m_aChordTypes[i]->Text = u_strChordType[i]; + m_aChordTypes[i]->FontName = g_strTxtFontName; + m_aChordTypes[i]->FontSize = g_szFont12; + + int h = i; + + if( i==7 ) h = 4; + else if( i>=4 ) h++; + + m_aChordTypes[i]->SetBounds( m_aAdjustKeys[0]->Left + m_aAdjustKeys[0]->Width + 16, + m_nTitleHeight + m_nTextHeight + h*COL_HEIGHT, + CHORDTYPE_WIDTH, COL_HEIGHT ); + } + + m_lstBtnTools[0]->Down = g_bAlphaKey; +} +//--------------------------------------------------------------------------- + +__fastcall TChordPanel::~TChordPanel() +{ + for( int i = 0; i < 7; i++ ){ + SAFE_DELETE( m_aMainKeys[i] ); + } + + for( int i=0; i<2; i++ ){ + SAFE_DELETE( m_aAdjustKeys[i] ); + m_aAdjustKeys[i] = NULL; + } + + for( int i=0; i=0 ) + m_aMainKeys[m_iMainKey]->SetDown( false ); + if( iMainKey>=0 ) + m_aMainKeys[iMainKey]->SetDown( true ); + + m_iMainKey = iMainKey; + } + + EnableAdjustKey( iMainKey, iAdjustKey ); + EnableChordType( iMainKey ); + m_iAdjustKey = iAdjustKey; + + if( m_iChordType!=iChordType ){ + if( m_iChordType>=0 ) + m_aChordTypes[m_iChordType]->SetDown(false); + + if( iChordType>=0 ) + m_aChordTypes[iChordType]->SetDown(true); + + m_iChordType = iChordType; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TChordPanel::MainKeyClick( TObject* Sender ) +{ + int iSeries = ((TTextButton*)Sender)->Tag, + iAdjustKey = 0, + iChordType = 0; + + if( iSeries==1 || iSeries==2 || iSeries==5 ) + iChordType = 1; + else if( iSeries==6 ) + iAdjustKey = -1; + + if( g_bAlphaKey ){ + int iKey = (iSeries<3) ? (iSeries*2) : (iSeries*2 - 1); + iKey += m_iMelodyKey + iAdjustKey; + + if( iKey<0 ) iKey += 12; + else if( iKey>11 ) iKey -= 12; + + if( iKey==1 || iKey==3 || iKey==8 || iKey==10 ) iAdjustKey = -1; + else if( iKey==6 ) iAdjustKey = 1; + } + + int iMainKey = -1; + for( int i=0; i<7; i++ ){ + if( m_aMainKeys[i]==Sender ){ + iMainKey = i; + break; + } + } + + if( iMainKey!=m_iMainKey || iAdjustKey!=m_iAdjustKey || iChordType!=m_iChordType ){ + SetChord( iMainKey, iAdjustKey, iChordType ); + m_pContentPanel->SetSelectChord( GetChordKey(), iChordType ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TChordPanel::AdjustKeyClick( TObject* Sender ) +{ + TTextButton* pAdjust = (TTextButton*)Sender; + int iAdjustKey = pAdjust->Down ? 0 : pAdjust->Tag; + + if( iAdjustKey!=m_iAdjustKey ){ + SetChord( m_iMainKey, iAdjustKey, m_iChordType ); + + m_pContentPanel->SetSelectChord( GetChordKey(), m_iChordType ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TChordPanel::ChordTypeClick( TObject* Sender ) +{ + int iChordType = ((TTextButton*)Sender)->Tag; + + if( iChordType!=m_iChordType ){ + SetChord( m_iMainKey, m_iAdjustKey, iChordType ); + + m_pContentPanel->SetSelectChord( GetChordKey(), iChordType ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TChordPanel::EnableChordModify( bool bEnable, int iBarKey, int iChordKey, int iChordType ) +{ + SetMelodyKey( iBarKey ); + + int iMainKey, iAdjustKey; + + m_pContentPanel->GetChordDispalyKey( iChordKey, iBarKey, iMainKey, iAdjustKey ); + + if( bEnable!=m_bEnable ){ + for( int i=0; i<7; i++ ){ + TTextButton * pBtn = m_aMainKeys[i]; + pBtn->Enabled = bEnable; + pBtn->SetDown( bEnable && i==iMainKey ); + } + + for( int i=0; iEnabled = bEnable; + pBtn->SetDown( bEnable && i==iChordType ); + } + + EnableAdjustKey( bEnable ? iMainKey : 0, iAdjustKey ); + EnableChordType( bEnable ? iMainKey : -1 ); + + m_bEnable = bEnable; + m_iMainKey = iMainKey; + m_iAdjustKey = iAdjustKey; + m_iChordType = iChordType; + } + else if( bEnable ){ + SetChord( iMainKey, iAdjustKey, iChordType ); + } +} +//--------------------------------------------------------------------------- + +void TChordPanel::EnableAdjustKey( int iMainKey, int iAdjustKey ) +{ + switch( iMainKey ){ + case -1: case 0: case 4: + m_aAdjustKeys[0]->Enabled = false; + m_aAdjustKeys[1]->Enabled = false; + break; + + case 3: + m_aAdjustKeys[0]->Enabled = true; + m_aAdjustKeys[1]->Enabled = false; + break; + + default: + m_aAdjustKeys[0]->Enabled = false; + m_aAdjustKeys[1]->Enabled = true; + break; + } + + m_aAdjustKeys[0]->SetDown( iAdjustKey>0 ); + m_aAdjustKeys[1]->SetDown( iAdjustKey<0 ); +} +//--------------------------------------------------------------------------- + +void TChordPanel::EnableChordType( int iMainKey ) +{ + for( int i=0; iEnabled = iMainKey>=0; + } +} +//--------------------------------------------------------------------------- + +int TChordPanel::MainKeyTag( int index ) +{ + int iTag = index; + + if( g_bAlphaKey && m_iMelodyKey>0 ){ + int iOffset = 0; + switch( m_iMelodyKey ){ + case 1: case 2: iOffset = 1; break; + case 3: case 4: iOffset = 2; break; + case 5: case 6: iOffset = 3; break; + case 7: iOffset = 4; break; + case 8: case 9: iOffset = 5; break; + case 10: case 11: iOffset = 6; break; + } + + iTag -= iOffset; + if( iTag<0 ) + iTag += 7; + } + + return iTag; +} +//--------------------------------------------------------------------------- + +void __fastcall TChordPanel::SetMelodyKey( int iKey ) +{ + if( m_iMelodyKey!=iKey ){ + m_iMelodyKey = iKey; + + if( iKey>0 ){ + for( int i=0; i<7; i++ ){ + if( m_aMainKeys[i] ) + m_aMainKeys[i]->Tag = MainKeyTag( i ); + } + } + } +} +//--------------------------------------------------------------------------- + +int TChordPanel::GetChordKey() +{ + int iKey = m_iMainKey; + + switch( m_iMainKey ){ + case 1: case 2: + iKey = m_iMainKey * 2; + if( m_iAdjustKey!=0 ) iKey += m_iAdjustKey; + break; + + case 3: + iKey = 5; + if( m_iAdjustKey!=0 ) iKey += m_iAdjustKey; + break; + + case 4: + iKey = 7; + break; + + case 5: case 6: + iKey = m_iMainKey * 2 - 1; + if( m_iAdjustKey!=0 ) iKey += m_iAdjustKey; + break; + } + + if( iKey>=0 && !g_bAlphaKey ){ + iKey += m_iMelodyKey; + if( iKey>11 ) + iKey -= 12; + } + + return iKey; +} +//--------------------------------------------------------------------------- + +void __fastcall TChordPanel::KeyModeClick(TObject *Sender) +{ + TPNGButton* pBtn = (TPNGButton*)Sender; +// pBtn->Down = !pBtn->Down; + SetKeyMode( !pBtn->Down ); +} +//--------------------------------------------------------------------------- + +void TChordPanel::SetKeyMode( bool bAlpha ) +{ + if( g_bAlphaKey!= bAlpha ){ + if( m_lblName ){ + int iChordKey = GetChordKey(); + g_bAlphaKey = bAlpha; + + for( int i = 0; i < 7; i++ ){ + m_aMainKeys[i]->Text = g_bAlphaKey ? g_strAlphaTable[i] : g_strTable[i]; + m_aMainKeys[i]->Tag = MainKeyTag( i ); + if( Visible ) + m_aMainKeys[i]->Repaint(); + } + + if( Visible ){ + int iMainKey, iAdjustKey; + m_pContentPanel->GetChordDispalyKey( iChordKey, m_iMelodyKey, iMainKey, iAdjustKey ); + + SetChord( iMainKey, iAdjustKey, m_iChordType ); + } + + m_lblName->Caption = g_bAlphaKey ? L"ҵ" : L"Ҽ"; + m_lstBtnTools[0]->Down = bAlpha; + } + else{ + g_bAlphaKey = bAlpha; + } + + m_pContentPanel->InvalidateShowBars( BAR_DATA ); + } +} +//--------------------------------------------------------------------------- diff --git a/ChordPanel.h b/ChordPanel.h new file mode 100644 index 0000000..01149b3 --- /dev/null +++ b/ChordPanel.h @@ -0,0 +1,69 @@ +//--------------------------------------------------------------------------- + +#ifndef ChordPanelH +#define ChordPanelH + +#include "ContentPanelUnit.h" +#include "ToolpalPanel.h" +#include "TextButton.h" + +enum CONCORD_TYPE{ + c_Type_Maj, + c_Type_Min, + c_Type_Dom7, + c_Type_Min7, + c_Type_Sus2, + c_Type_Sus4, + c_Type_Sus6, + c_Type_Maj7, + c_Type_Num +}; +//--------------------------------------------------------------------------- + +class TChordPanel : public TToolpalPanel +{ +private: + TContentPanel* m_pContentPanel; // + + TTextButton *m_aMainKeys[7], + *m_aAdjustKeys[2], + *m_aChordTypes[c_Type_Num]; + TLabel *m_lblName, + *m_lblType; + + int m_nTextHeight; + int m_iMainKey, m_iAdjustKey, m_iChordType, m_iMelodyKey; + bool m_bEnable; + + void EnableAdjustKey( int iMainKey, int iAdjustKey ); + void EnableChordType( int iMainKey ); + int MainKeyTag( int index ); + int GetChordKey(); + + + void __fastcall MainKeyClick( TObject* Sender ); + void __fastcall AdjustKeyClick( TObject* Sender ); + void __fastcall ChordTypeClick( TObject* Sender ); + void __fastcall KeyModeClick( TObject* Sender ); +protected: + MESSAGE void __fastcall WMSize(Winapi::Messages::TWMSize &Message); + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(WM_SIZE, TWMSize, WMSize) + END_MESSAGE_MAP(TToolpalPanel) + + virtual void __fastcall CreateWnd(); + +public: + __fastcall virtual TChordPanel(System::Classes::TComponent* AOwner); + __fastcall ~TChordPanel(); + + void SetKeyMode( bool bAlpha ); + void __fastcall SetMelodyKey( int iKey ); + void __fastcall SetContentPanel( TContentPanel* pPanel ){ m_pContentPanel=pPanel; }; + void __fastcall SetChord( int iMainKey, int iAdjustKey, int iChordType ); + void __fastcall EnableChordModify( bool bEnable, int iBarKey, int iChordKey, int iChordType ); +}; + +//--------------------------------------------------------------------------- + +#endif diff --git a/ComboBoxComponent.h b/ComboBoxComponent.h new file mode 100644 index 0000000..ba1e089 --- /dev/null +++ b/ComboBoxComponent.h @@ -0,0 +1,427 @@ +//--------------------------------------------------------------------------- + +#ifndef ComboBoxComponentH +#define ComboBoxComponentH + +#include +#include +#include +#include +#include +#include +#include +//--------------------------------------------------------------------------- +class TDropListScrollBar; +class TComboBoxItem; +class TDropListView; +class CBCapButton; +//--------------------------------------------------------------------------- +/* б¼ */ +typedef void __fastcall (__closure *TItemClickEvent)(TComboBoxItem* Sender, int Index); + +/* бʾ */ +enum DECLSPEC_DENUM TComboBoxMode : unsigned char {cbShowUp, cbShowDown}; +//typedef System::Set TComboBoxMode; +/* б仯¼ */ +typedef void __fastcall (__closure *TComboBoxChangeEvent)(TComboBoxItem* Sender, int Index); + +/**************************************************************************************************/ +/**************************************************************************************************/ +class TDropListScrollBar : public TScrollBar +{ +private: +// int m_nTileHeight, //add by tj 2013/11/18 + int m_nThumbHeight, + m_nThumbTop, + m_nPreThumbTop, + m_nDragPos, + m_nDragPoint, + m_iClicked, + m_iHitPrev, + m_nMax, + m_nMin, + m_nPos, + m_nPage, + m_nTrackPos; + + bool m_bPause, + m_bNotify, + m_bDrag, + m_bTrace; + + TBitmap *u_pPicLineUp, + *u_pPicLineDown; + + TTimer *m_pTimer; + TCanvas *m_pCanvas; + + int HitTest( int X, int Y ); + void CalcThumbHeight(); + void CalcThumbTop(); + void DrawArrow( int iDirection, int iState ); + void DrawThumb( int iState, bool bEraseBk, int iPageUD=-1 ); + + void __fastcall TimerProc(TObject* Sender); + + MESSAGE void __fastcall WMPaint(Winapi::Messages::TWMPaint &Message); + MESSAGE void __fastcall WMLButtonDown(TWMMouse &Message); + MESSAGE void __fastcall WMLButtonUp(TWMMouse &Message); + MESSAGE void __fastcall WMLButtonDblClk(TWMMouse &Message); + MESSAGE void __fastcall WMRButtonDown(TWMMouse &Message); //add by tj 2013/11/18 + MESSAGE void __fastcall WMRButtonUp(TWMMouse &Message); //add by tj 2013/11/18 + MESSAGE void __fastcall WMMouseMove(TWMMouse &Message); +// MESSAGE void __fastcall CMMouseLeave(TMessage &Message); //add by tj 2013/11/25 12:35 + MESSAGE void __fastcall SBMSetScrollInfo(TMessage &Message); + MESSAGE void __fastcall SBMGetScrollInfo(TMessage &Message); + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(WM_PAINT, TWMPaint, WMPaint) + MESSAGE_HANDLER(WM_LBUTTONDOWN, TWMLButtonDown, WMLButtonDown) + MESSAGE_HANDLER(WM_LBUTTONUP, TWMLButtonUp, WMLButtonUp) + MESSAGE_HANDLER(WM_LBUTTONDBLCLK, TWMLButtonDblClk, WMLButtonDblClk) + MESSAGE_HANDLER(WM_RBUTTONDOWN, TWMRButtonDown, WMRButtonDown) + MESSAGE_HANDLER(WM_RBUTTONUP, TWMRButtonUp, WMRButtonUp) //add by tj 2013/11/18 + MESSAGE_HANDLER(WM_MOUSEMOVE, TWMMouseMove, WMMouseMove) //add by tj 2013/11/18 +// MESSAGE_HANDLER(CM_MOUSELEAVE, TMessage, CMMouseLeave) //add by tj 2013/11/25 12:35 + MESSAGE_HANDLER(SBM_SETSCROLLINFO, TMessage, SBMSetScrollInfo) + MESSAGE_HANDLER(SBM_GETSCROLLINFO, TMessage, SBMGetScrollInfo) + END_MESSAGE_MAP(TScrollBar) + +protected: + virtual void __fastcall PaintWindow(HDC DC); + +public: + TWinControl *m_pWndCtrl; + bool m_bAction; + + __fastcall virtual TDropListScrollBar(System::Classes::TComponent* AOwner); + __fastcall ~TDropListScrollBar(); + + void __fastcall CMMouseLeave(TObject *Sender); //add by tj 2013/11/25 12:35 + + bool IsDraging(){ return m_bDrag; }; + void __fastcall SetPosition(int Value, bool bRedraw=true); + void __fastcall SetPageSize(int Value, bool bRedraw=true); + void __fastcall SetRange(int AMin, int AMax, bool bRedraw=true); + void __fastcall GetScrollRange(int* nMin, int* nMax); + int __fastcall GetScrollPos(); + int __fastcall GetPageSize(); +}; +/**************************************************************************************************/ +/**************************************************************************************************/ +class TComboBoxItem : public TObject +{ +private: + int FTag; + String FCaption; + TItemClickEvent FOnItemClick; + + void __fastcall SetCaption(String Caption); + +public: + __fastcall TComboBoxItem(String Caption, TItemClickEvent OnItemClick); + + void __fastcall DrawItem(TCanvas *Canvas, TRect Rect, bool Selected); + +__published: + __property String Caption = {read = FCaption, write = FCaption}; + __property int Tag = {read = FTag, write = FTag}; + __property TItemClickEvent OnItemClicked = {read = FOnItemClick, write = FOnItemClick}; +}; +// --------------------------------------------------------------------------- +// TDropListView +// --------------------------------------------------------------------------- +class TDropListView : public TWinControl +{ +private: + TNotifyEvent FOnHide, // б¼ + FOnShow; // бʾ¼ + + int FItemHeight, + FItemWidth, + FShowItemsCount, + FDefItemIndex; + + TControlCanvas *m_Canvas; + TList *m_ItemRectList, + *m_ItemList; + + TDropListScrollBar *m_ScrollBar; + + HWND m_pActiveWnd; + + int m_BeginIndex, + m_EndIndex, + m_CurrentItemIndex, + m_RealShowCount, + m_MouseX, + m_MouseY; + + void __fastcall CreateScrollBar(); + + void __fastcall DoItemsCountChange(); + void __fastcall DoItemClicked(int Index); + void __fastcall DoItemSelect(int Index); + void __fastcall DoKeyUpDown(int Index); + void __fastcall DoShowItemsChange(); + + int __fastcall CalcListHeight(); + int __fastcall GetItemsCount(); + TRect *__fastcall GetItemRect(int Index); + + void __fastcall SetShowItemsCount(int Value); + + MESSAGE void __fastcall WMEraseBkgnd(TWMEraseBkgnd &Message); + MESSAGE void __fastcall WMKeyDown(TWMKeyDown &Message); + MESSAGE void __fastcall WMKillFocus(TMessage &Message); + MESSAGE void __fastcall WMLButtonDown(TWMLButtonDown &Message); + MESSAGE void __fastcall WMMouseWheel(TWMMouseWheel &Message); + MESSAGE void __fastcall WMPaint(TWMPaint &Message); + MESSAGE void __fastcall WMSetFocus(TMessage &Message); + MESSAGE void __fastcall WMVScroll(TWMScroll &Message); + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(WM_ERASEBKGND, TWMEraseBkgnd, WMEraseBkgnd) + MESSAGE_HANDLER(CN_KEYDOWN, TWMKeyDown, WMKeyDown) + MESSAGE_HANDLER(WM_KILLFOCUS, TMessage, WMKillFocus) + MESSAGE_HANDLER(WM_LBUTTONDOWN, TWMLButtonDown, WMLButtonDown) + MESSAGE_HANDLER(WM_MOUSEWHEEL, TWMMouseWheel, WMMouseWheel) + MESSAGE_HANDLER(WM_PAINT, TWMPaint, WMPaint) + MESSAGE_HANDLER(WM_SETFOCUS, TMessage, WMSetFocus) + MESSAGE_HANDLER(WM_VSCROLL, TWMScroll, WMVScroll) + END_MESSAGE_MAP(TWinControl) + +protected: + virtual void __fastcall CreateParams(TCreateParams &Params); + virtual void __fastcall CreateWnd(); + virtual void __fastcall PaintWindow(HDC DC); + + DYNAMIC void __fastcall MouseDown(TMouseButton Button, TShiftState Shift, int X, int Y); + DYNAMIC void __fastcall MouseMove(TShiftState Shift, int X, int Y); + DYNAMIC void __fastcall MouseUp(TMouseButton Button, TShiftState Shift, int X, int Y); + +public: + __fastcall TDropListView(TComponent *Owner); + __fastcall ~TDropListView(); + void __fastcall AddItem(TComboBoxItem* Item); + void __fastcall Clear(); + TComboBoxItem *__fastcall GetItem(int Index); + void __fastcall Hide(); + void __fastcall RemoveItem(int Index); + void __fastcall ScrollPos(int Pos); + void __fastcall Show(); + void __fastcall SetFontSize(int sz); + void __fastcall SetFont(String name, int sz); + +__published: + __property int ListHeight = {read = CalcListHeight}; + __property int ItemHeight = {write = FItemHeight, read = FItemHeight, default = 16}; + + __property TNotifyEvent OnHide = {write = FOnHide, read = FOnHide}; + __property TNotifyEvent OnShow = {write = FOnShow, read = FOnShow}; + + __property int ShowItemsCount = {write = SetShowItemsCount, read = FShowItemsCount}; + + __property int DefItemIndex = {read = FDefItemIndex, write = FDefItemIndex}; + __property int ItemsCount = {read = GetItemsCount}; +}; +/**************************************************************************************************/ +/**************************************************************************************************/ +class CBCapButton : public TGraphicControl +{ +public: + enum TModalResult{ + mrNone = System::Int8(0x0), + mrOk = System::Int8(0x1), + mrCancel = System::Int8(0x2), + mrAbort = System::Int8(0x3), + mrRetry = System::Int8(0x4), + mrIgnore = System::Int8(0x5), + mrYes = System::Int8(0x6), + mrNo = System::Int8(0x7), + mrClose = System::Int8(0x8), + mrHelp = System::Int8(0x9), + mrTryAgain = System::Int8(0xa), + mrContinue = System::Int8(0xb), + mrAll = System::Int8(0xc), + mrNoToAll = System::Int8(0xd), + mrYesToAll = System::Int8(0xe) + }; + +private: + COLORREF + clrFrameExNormal, + clrFrameExEnter, + clrFrameExDisable, + clrFrameNormal, + clrLineNormal, + clrRectNormal, + clrRectDisable, + clrCapArrowOpenBound[10], + clrCapArrowOpenLine[4], + clrExFrameBound[4], + clrExFrameBoundDisable[4]; + + TColor FBorderColor; + TColor FInterFrameColor; + TColor FInterColor; + + void __fastcall IniColor(int nstate); + COLORREF __fastcall TransformColor(COLORREF icolor, int nNum=0, bool bplus=true); + void __fastcall SetBorderColor(TColor iBorderColor); + void __fastcall SetInterFrameColor(TColor iInterFrameColor); + void __fastcall SetInterColor(TColor iInterColor); + + TNotifyEvent FOnMouseEnter;//on mouse enter notify event + TNotifyEvent FOnMouseLeave;//on mouse leave notify event + + String FCaption; +// System::Uitypes::TModalResult FModalResult; + TModalResult FModalResult; + + void __fastcall SetCaption(String Value); + + MESSAGE void __fastcall CMMouseEnter(Winapi::Messages::TMessage &Msg); // to know when mouse is entered + MESSAGE void __fastcall CMMouseLeave(Winapi::Messages::TMessage &Msg); // to know when mouse is leaved + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(CM_MOUSEENTER, TMessage, CMMouseEnter) + MESSAGE_HANDLER(CM_MOUSELEAVE, TMessage, CMMouseLeave) + END_MESSAGE_MAP(TGraphicControl) + +protected: + bool FEnablePNG; //ǷpngʽͼƬ + bool FDown; // value to know if we painting mouse down + int EtatBtn; // 0=Normal 1=Mouse entered 2=Pressed 3=Disabled + int FStateCount; + Vcl::Imaging::Pngimage::TPngImage *FPngImg; //our 4 states image + + + DYNAMIC void __fastcall MouseDown(System::Uitypes::TMouseButton Button, System::Classes::TShiftState Shift, int X, int Y); + DYNAMIC void __fastcall MouseUp(System::Uitypes::TMouseButton Button, System::Classes::TShiftState Shift, int X, int Y); + virtual void __fastcall SetEnabled(bool Value); + +public: + + __fastcall virtual CBCapButton(System::Classes::TComponent* AOwner); + __fastcall virtual ~CBCapButton(void); + + void __fastcall SetStateCount( int count ); + void __fastcall SetPngImg(Vcl::Imaging::Pngimage::TPngImage *value); // we set the png image + void __fastcall SetDown(bool value); // to know if mouse is down or not + void __fastcall SetEnablePNG(bool Value);// to know if customer set png img + virtual void __fastcall SetFontSize( int value ); + virtual void __fastcall SetFont( String name, int sz ); + virtual void __fastcall Paint(void); // override the painting of the component + DYNAMIC void __fastcall Click(void); + +__published: + + __property Action; + __property Anchors = {default=3}; + __property bool Down = {read=FDown, write=SetDown, default=False}; + __property Enabled = {default=1}; + __property int ImgStates = {read=FStateCount, write=SetStateCount, default=4}; +// __property System::Uitypes::TModalResult ModalResult = {read=FModalResult, write=FModalResult, default=0}; + __property TModalResult ModalResult = {read=FModalResult, write=FModalResult, default=0}; + __property ParentShowHint = {default=1}; + __property Vcl::Imaging::Pngimage::TPngImage *PngImg = {read=FPngImg, write=SetPngImg}; + __property PopupMenu; + __property ShowHint; + __property Visible = {default=1}; + __property OnClick; + __property OnContextPopup; + __property OnMouseDown; + __property OnMouseMove; + __property OnMouseUp; + __property System::Classes::TNotifyEvent OnMouseEnter = {read=FOnMouseEnter, write=FOnMouseEnter}; + __property System::Classes::TNotifyEvent OnMouseLeave = {read=FOnMouseLeave, write=FOnMouseLeave}; + __property bool EnablePNG = {read=FEnablePNG, write=SetEnablePNG, default=False}; + __property TColor BorderColor = {read=FBorderColor, write=SetBorderColor, default=TColor(0x83807d)}; + __property TColor InterFrameColor = {read=FInterFrameColor, write=SetInterFrameColor, default=TColor(0x302e2c)}; + __property TColor InterColor = {read=FInterColor, write=SetInterColor, default=TColor(0x58504a)}; +private: + Vcl::Imaging::Pngimage::TPngImage *m_pPngButton, *m_pPngFoucusButton; + Vcl::Imaging::Pngimage::TPngImage *pTmpDraw, *pTmpFoucusDraw; + void __fastcall PaintCustomer(void); + void __fastcall PaintCustomerText(void); + +public: + TRect rtCaption; + +__published: + __property int FontSize = {write=SetFontSize, default=8}; + __property String Caption = {read=FCaption, write=SetCaption}; + +}; +/**************************************************************************************************/ +/**************************************************************************************************/ +class PACKAGE TComboBoxComponent : public CBCapButton +{ +private: + TComboBoxChangeEvent FOnChange; // ComboBox仯¼ + int FItemHeight, + FShowItemCount; + TComboBoxMode FShowMode; + + TDropListView *m_DropListView; // б + bool m_IsMouseOver; + int m_ClickStat; // ..... + + + void __fastcall DoItemClick(TComboBoxItem *Sender, int Index); + + // бءʾ¼ + void __fastcall DoDropListShow(TObject *Sender); + void __fastcall DoDropListHide(TObject *Sender); + + int __fastcall GetDefaultItem(); + int __fastcall GetItemsCount(); + + void __fastcall SetDefaultItem(int Value); + void __fastcall SetItemHeight(int Value); + void __fastcall SetShowItemCount(int Value); + void __fastcall SetShowMode(TComboBoxMode Value); + + void __fastcall DoMouseEnter(TObject *Sender); + void __fastcall DoMouseLeave(TObject *Sender); + + //MESSAGE void __fastcall CMMouseEnter(TMessage &Message); + //MESSAGE void __fastcall CMMouseLeave(TMessage &Message); + + //BEGIN_MESSAGE_MAP + // MESSAGE_HANDLER(CM_MOUSEENTER, TMessage, CMMouseEnter) + // MESSAGE_HANDLER(CM_MOUSELEAVE, TMessage, CMMouseLeave) + //END_MESSAGE_MAP(CBCapButton) + + +protected: + DYNAMIC void __fastcall MouseDown(TMouseButton Button, TShiftState Shift, int X, int Y); + DYNAMIC void __fastcall MouseUp(TMouseButton Button, TShiftState Shift, int X, int Y); + + virtual void __fastcall SetParent(TWinControl* AParent); +public: + __fastcall TComboBoxComponent(TComponent *Owner); + __fastcall ~TComboBoxComponent(); + + TComboBoxItem * __fastcall AddItem(String Caption); + void __fastcall Clear(); + void __fastcall RemoveItem(int Index); + TComboBoxItem * __fastcall GetItem(int Index); + virtual void __fastcall SetFontSize( int value ); + virtual void __fastcall SetFont( String name, int size ); + __property int DefItemIndex = {read = GetDefaultItem, write = SetDefaultItem}; + __property int ItemsCount = {read = GetItemsCount}; + +__published: + __property TComboBoxChangeEvent OnChange = {read = FOnChange, write = FOnChange}; + + __property int ItemHeight = {read = FItemHeight, write = SetItemHeight, default = 20}; + __property int ShowItemCount = {read = FShowItemCount, write = SetShowItemCount, default = 10}; + __property TComboBoxMode ShowMode = {read = FShowMode, write = SetShowMode, default = cbShowDown}; + __property TWinControl* Parent = {read=FParent, write=SetParent}; +}; +/**************************************************************************************************/ +/**************************************************************************************************/ + +#endif diff --git a/Component/CapButton/CapButton.cpp b/Component/CapButton/CapButton.cpp new file mode 100644 index 0000000..98834df --- /dev/null +++ b/Component/CapButton/CapButton.cpp @@ -0,0 +1,1185 @@ +//--------------------------------------------------------------------------- + +#include +#include +#pragma hdrstop + +#include "CapButton.h" + +#pragma package(smart_init) + +const static char pngImageCap[] = { +0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52, +0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0A, 0x08, 0x06, 0x00, 0x00, 0x00, 0x62, 0xF0, 0xA4, +0x83, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0B, 0x13, 0x00, 0x00, 0x0B, +0x13, 0x01, 0x00, 0x9A, 0x9C, 0x18, 0x00, 0x00, 0x0A, 0x4D, 0x69, 0x43, 0x43, 0x50, 0x50, 0x68, +0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x49, 0x43, 0x43, 0x20, 0x70, 0x72, 0x6F, 0x66, +0x69, 0x6C, 0x65, 0x00, 0x00, 0x78, 0xDA, 0x9D, 0x53, 0x77, 0x58, 0x93, 0xF7, 0x16, 0x3E, 0xDF, +0xF7, 0x65, 0x0F, 0x56, 0x42, 0xD8, 0xF0, 0xB1, 0x97, 0x6C, 0x81, 0x00, 0x22, 0x23, 0xAC, 0x08, +0xC8, 0x10, 0x59, 0xA2, 0x10, 0x92, 0x00, 0x61, 0x84, 0x10, 0x12, 0x40, 0xC5, 0x85, 0x88, 0x0A, +0x56, 0x14, 0x15, 0x11, 0x9C, 0x48, 0x55, 0xC4, 0x82, 0xD5, 0x0A, 0x48, 0x9D, 0x88, 0xE2, 0xA0, +0x28, 0xB8, 0x67, 0x41, 0x8A, 0x88, 0x5A, 0x8B, 0x55, 0x5C, 0x38, 0xEE, 0x1F, 0xDC, 0xA7, 0xB5, +0x7D, 0x7A, 0xEF, 0xED, 0xED, 0xFB, 0xD7, 0xFB, 0xBC, 0xE7, 0x9C, 0xE7, 0xFC, 0xCE, 0x79, 0xCF, +0x0F, 0x80, 0x11, 0x12, 0x26, 0x91, 0xE6, 0xA2, 0x6A, 0x00, 0x39, 0x52, 0x85, 0x3C, 0x3A, 0xD8, +0x1F, 0x8F, 0x4F, 0x48, 0xC4, 0xC9, 0xBD, 0x80, 0x02, 0x15, 0x48, 0xE0, 0x04, 0x20, 0x10, 0xE6, +0xCB, 0xC2, 0x67, 0x05, 0xC5, 0x00, 0x00, 0xF0, 0x03, 0x79, 0x78, 0x7E, 0x74, 0xB0, 0x3F, 0xFC, +0x01, 0xAF, 0x6F, 0x00, 0x02, 0x00, 0x70, 0xD5, 0x2E, 0x24, 0x12, 0xC7, 0xE1, 0xFF, 0x83, 0xBA, +0x50, 0x26, 0x57, 0x00, 0x20, 0x91, 0x00, 0xE0, 0x22, 0x12, 0xE7, 0x0B, 0x01, 0x90, 0x52, 0x00, +0xC8, 0x2E, 0x54, 0xC8, 0x14, 0x00, 0xC8, 0x18, 0x00, 0xB0, 0x53, 0xB3, 0x64, 0x0A, 0x00, 0x94, +0x00, 0x00, 0x6C, 0x79, 0x7C, 0x42, 0x22, 0x00, 0xAA, 0x0D, 0x00, 0xEC, 0xF4, 0x49, 0x3E, 0x05, +0x00, 0xD8, 0xA9, 0x93, 0xDC, 0x17, 0x00, 0xD8, 0xA2, 0x1C, 0xA9, 0x08, 0x00, 0x8D, 0x01, 0x00, +0x99, 0x28, 0x47, 0x24, 0x02, 0x40, 0xBB, 0x00, 0x60, 0x55, 0x81, 0x52, 0x2C, 0x02, 0xC0, 0xC2, +0x00, 0xA0, 0xAC, 0x40, 0x22, 0x2E, 0x04, 0xC0, 0xAE, 0x01, 0x80, 0x59, 0xB6, 0x32, 0x47, 0x02, +0x80, 0xBD, 0x05, 0x00, 0x76, 0x8E, 0x58, 0x90, 0x0F, 0x40, 0x60, 0x00, 0x80, 0x99, 0x42, 0x2C, +0xCC, 0x00, 0x20, 0x38, 0x02, 0x00, 0x43, 0x1E, 0x13, 0xCD, 0x03, 0x20, 0x4C, 0x03, 0xA0, 0x30, +0xD2, 0xBF, 0xE0, 0xA9, 0x5F, 0x70, 0x85, 0xB8, 0x48, 0x01, 0x00, 0xC0, 0xCB, 0x95, 0xCD, 0x97, +0x4B, 0xD2, 0x33, 0x14, 0xB8, 0x95, 0xD0, 0x1A, 0x77, 0xF2, 0xF0, 0xE0, 0xE2, 0x21, 0xE2, 0xC2, +0x6C, 0xB1, 0x42, 0x61, 0x17, 0x29, 0x10, 0x66, 0x09, 0xE4, 0x22, 0x9C, 0x97, 0x9B, 0x23, 0x13, +0x48, 0xE7, 0x03, 0x4C, 0xCE, 0x0C, 0x00, 0x00, 0x1A, 0xF9, 0xD1, 0xC1, 0xFE, 0x38, 0x3F, 0x90, +0xE7, 0xE6, 0xE4, 0xE1, 0xE6, 0x66, 0xE7, 0x6C, 0xEF, 0xF4, 0xC5, 0xA2, 0xFE, 0x6B, 0xF0, 0x6F, +0x22, 0x3E, 0x21, 0xF1, 0xDF, 0xFE, 0xBC, 0x8C, 0x02, 0x04, 0x00, 0x10, 0x4E, 0xCF, 0xEF, 0xDA, +0x5F, 0xE5, 0xE5, 0xD6, 0x03, 0x70, 0xC7, 0x01, 0xB0, 0x75, 0xBF, 0x6B, 0xA9, 0x5B, 0x00, 0xDA, +0x56, 0x00, 0x68, 0xDF, 0xF9, 0x5D, 0x33, 0xDB, 0x09, 0xA0, 0x5A, 0x0A, 0xD0, 0x7A, 0xF9, 0x8B, +0x79, 0x38, 0xFC, 0x40, 0x1E, 0x9E, 0xA1, 0x50, 0xC8, 0x3C, 0x1D, 0x1C, 0x0A, 0x0B, 0x0B, 0xED, +0x25, 0x62, 0xA1, 0xBD, 0x30, 0xE3, 0x8B, 0x3E, 0xFF, 0x33, 0xE1, 0x6F, 0xE0, 0x8B, 0x7E, 0xF6, +0xFC, 0x40, 0x1E, 0xFE, 0xDB, 0x7A, 0xF0, 0x00, 0x71, 0x9A, 0x40, 0x99, 0xAD, 0xC0, 0xA3, 0x83, +0xFD, 0x71, 0x61, 0x6E, 0x76, 0xAE, 0x52, 0x8E, 0xE7, 0xCB, 0x04, 0x42, 0x31, 0x6E, 0xF7, 0xE7, +0x23, 0xFE, 0xC7, 0x85, 0x7F, 0xFD, 0x8E, 0x29, 0xD1, 0xE2, 0x34, 0xB1, 0x5C, 0x2C, 0x15, 0x8A, +0xF1, 0x58, 0x89, 0xB8, 0x50, 0x22, 0x4D, 0xC7, 0x79, 0xB9, 0x52, 0x91, 0x44, 0x21, 0xC9, 0x95, +0xE2, 0x12, 0xE9, 0x7F, 0x32, 0xF1, 0x1F, 0x96, 0xFD, 0x09, 0x93, 0x77, 0x0D, 0x00, 0xAC, 0x86, +0x4F, 0xC0, 0x4E, 0xB6, 0x07, 0xB5, 0xCB, 0x6C, 0xC0, 0x7E, 0xEE, 0x01, 0x02, 0x8B, 0x0E, 0x58, +0xD2, 0x76, 0x00, 0x40, 0x7E, 0xF3, 0x2D, 0x8C, 0x1A, 0x0B, 0x91, 0x00, 0x10, 0x67, 0x34, 0x32, +0x79, 0xF7, 0x00, 0x00, 0x93, 0xBF, 0xF9, 0x8F, 0x40, 0x2B, 0x01, 0x00, 0xCD, 0x97, 0xA4, 0xE3, +0x00, 0x00, 0xBC, 0xE8, 0x18, 0x5C, 0xA8, 0x94, 0x17, 0x4C, 0xC6, 0x08, 0x00, 0x00, 0x44, 0xA0, +0x81, 0x2A, 0xB0, 0x41, 0x07, 0x0C, 0xC1, 0x14, 0xAC, 0xC0, 0x0E, 0x9C, 0xC1, 0x1D, 0xBC, 0xC0, +0x17, 0x02, 0x61, 0x06, 0x44, 0x40, 0x0C, 0x24, 0xC0, 0x3C, 0x10, 0x42, 0x06, 0xE4, 0x80, 0x1C, +0x0A, 0xA1, 0x18, 0x96, 0x41, 0x19, 0x54, 0xC0, 0x3A, 0xD8, 0x04, 0xB5, 0xB0, 0x03, 0x1A, 0xA0, +0x11, 0x9A, 0xE1, 0x10, 0xB4, 0xC1, 0x31, 0x38, 0x0D, 0xE7, 0xE0, 0x12, 0x5C, 0x81, 0xEB, 0x70, +0x17, 0x06, 0x60, 0x18, 0x9E, 0xC2, 0x18, 0xBC, 0x86, 0x09, 0x04, 0x41, 0xC8, 0x08, 0x13, 0x61, +0x21, 0x3A, 0x88, 0x11, 0x62, 0x8E, 0xD8, 0x22, 0xCE, 0x08, 0x17, 0x99, 0x8E, 0x04, 0x22, 0x61, +0x48, 0x34, 0x92, 0x80, 0xA4, 0x20, 0xE9, 0x88, 0x14, 0x51, 0x22, 0xC5, 0xC8, 0x72, 0xA4, 0x02, +0xA9, 0x42, 0x6A, 0x91, 0x5D, 0x48, 0x23, 0xF2, 0x2D, 0x72, 0x14, 0x39, 0x8D, 0x5C, 0x40, 0xFA, +0x90, 0xDB, 0xC8, 0x20, 0x32, 0x8A, 0xFC, 0x8A, 0xBC, 0x47, 0x31, 0x94, 0x81, 0xB2, 0x51, 0x03, +0xD4, 0x02, 0x75, 0x40, 0xB9, 0xA8, 0x1F, 0x1A, 0x8A, 0xC6, 0xA0, 0x73, 0xD1, 0x74, 0x34, 0x0F, +0x5D, 0x80, 0x96, 0xA2, 0x6B, 0xD1, 0x1A, 0xB4, 0x1E, 0x3D, 0x80, 0xB6, 0xA2, 0xA7, 0xD1, 0x4B, +0xE8, 0x75, 0x74, 0x00, 0x7D, 0x8A, 0x8E, 0x63, 0x80, 0xD1, 0x31, 0x0E, 0x66, 0x8C, 0xD9, 0x61, +0x5C, 0x8C, 0x87, 0x45, 0x60, 0x89, 0x58, 0x1A, 0x26, 0xC7, 0x16, 0x63, 0xE5, 0x58, 0x35, 0x56, +0x8F, 0x35, 0x63, 0x1D, 0x58, 0x37, 0x76, 0x15, 0x1B, 0xC0, 0x9E, 0x61, 0xEF, 0x08, 0x24, 0x02, +0x8B, 0x80, 0x13, 0xEC, 0x08, 0x5E, 0x84, 0x10, 0xC2, 0x6C, 0x82, 0x90, 0x90, 0x47, 0x58, 0x4C, +0x58, 0x43, 0xA8, 0x25, 0xEC, 0x23, 0xB4, 0x12, 0xBA, 0x08, 0x57, 0x09, 0x83, 0x84, 0x31, 0xC2, +0x27, 0x22, 0x93, 0xA8, 0x4F, 0xB4, 0x25, 0x7A, 0x12, 0xF9, 0xC4, 0x78, 0x62, 0x3A, 0xB1, 0x90, +0x58, 0x46, 0xAC, 0x26, 0xEE, 0x21, 0x1E, 0x21, 0x9E, 0x25, 0x5E, 0x27, 0x0E, 0x13, 0x5F, 0x93, +0x48, 0x24, 0x0E, 0xC9, 0x92, 0xE4, 0x4E, 0x0A, 0x21, 0x25, 0x90, 0x32, 0x49, 0x0B, 0x49, 0x6B, +0x48, 0xDB, 0x48, 0x2D, 0xA4, 0x53, 0xA4, 0x3E, 0xD2, 0x10, 0x69, 0x9C, 0x4C, 0x26, 0xEB, 0x90, +0x6D, 0xC9, 0xDE, 0xE4, 0x08, 0xB2, 0x80, 0xAC, 0x20, 0x97, 0x91, 0xB7, 0x90, 0x0F, 0x90, 0x4F, +0x92, 0xFB, 0xC9, 0xC3, 0xE4, 0xB7, 0x14, 0x3A, 0xC5, 0x88, 0xE2, 0x4C, 0x09, 0xA2, 0x24, 0x52, +0xA4, 0x94, 0x12, 0x4A, 0x35, 0x65, 0x3F, 0xE5, 0x04, 0xA5, 0x9F, 0x32, 0x42, 0x99, 0xA0, 0xAA, +0x51, 0xCD, 0xA9, 0x9E, 0xD4, 0x08, 0xAA, 0x88, 0x3A, 0x9F, 0x5A, 0x49, 0x6D, 0xA0, 0x76, 0x50, +0x2F, 0x53, 0x87, 0xA9, 0x13, 0x34, 0x75, 0x9A, 0x25, 0xCD, 0x9B, 0x16, 0x43, 0xCB, 0xA4, 0x2D, +0xA3, 0xD5, 0xD0, 0x9A, 0x69, 0x67, 0x69, 0xF7, 0x68, 0x2F, 0xE9, 0x74, 0xBA, 0x09, 0xDD, 0x83, +0x1E, 0x45, 0x97, 0xD0, 0x97, 0xD2, 0x6B, 0xE8, 0x07, 0xE9, 0xE7, 0xE9, 0x83, 0xF4, 0x77, 0x0C, +0x0D, 0x86, 0x0D, 0x83, 0xC7, 0x48, 0x62, 0x28, 0x19, 0x6B, 0x19, 0x7B, 0x19, 0xA7, 0x18, 0xB7, +0x19, 0x2F, 0x99, 0x4C, 0xA6, 0x05, 0xD3, 0x97, 0x99, 0xC8, 0x54, 0x30, 0xD7, 0x32, 0x1B, 0x99, +0x67, 0x98, 0x0F, 0x98, 0x6F, 0x55, 0x58, 0x2A, 0xF6, 0x2A, 0x7C, 0x15, 0x91, 0xCA, 0x12, 0x95, +0x3A, 0x95, 0x56, 0x95, 0x7E, 0x95, 0xE7, 0xAA, 0x54, 0x55, 0x73, 0x55, 0x3F, 0xD5, 0x79, 0xAA, +0x0B, 0x54, 0xAB, 0x55, 0x0F, 0xAB, 0x5E, 0x56, 0x7D, 0xA6, 0x46, 0x55, 0xB3, 0x50, 0xE3, 0xA9, +0x09, 0xD4, 0x16, 0xAB, 0xD5, 0xA9, 0x1D, 0x55, 0xBB, 0xA9, 0x36, 0xAE, 0xCE, 0x52, 0x77, 0x52, +0x8F, 0x50, 0xCF, 0x51, 0x5F, 0xA3, 0xBE, 0x5F, 0xFD, 0x82, 0xFA, 0x63, 0x0D, 0xB2, 0x86, 0x85, +0x46, 0xA0, 0x86, 0x48, 0xA3, 0x54, 0x63, 0xB7, 0xC6, 0x19, 0x8D, 0x21, 0x16, 0xC6, 0x32, 0x65, +0xF1, 0x58, 0x42, 0xD6, 0x72, 0x56, 0x03, 0xEB, 0x2C, 0x6B, 0x98, 0x4D, 0x62, 0x5B, 0xB2, 0xF9, +0xEC, 0x4C, 0x76, 0x05, 0xFB, 0x1B, 0x76, 0x2F, 0x7B, 0x4C, 0x53, 0x43, 0x73, 0xAA, 0x66, 0xAC, +0x66, 0x91, 0x66, 0x9D, 0xE6, 0x71, 0xCD, 0x01, 0x0E, 0xC6, 0xB1, 0xE0, 0xF0, 0x39, 0xD9, 0x9C, +0x4A, 0xCE, 0x21, 0xCE, 0x0D, 0xCE, 0x7B, 0x2D, 0x03, 0x2D, 0x3F, 0x2D, 0xB1, 0xD6, 0x6A, 0xAD, +0x66, 0xAD, 0x7E, 0xAD, 0x37, 0xDA, 0x7A, 0xDA, 0xBE, 0xDA, 0x62, 0xED, 0x72, 0xED, 0x16, 0xED, +0xEB, 0xDA, 0xEF, 0x75, 0x70, 0x9D, 0x40, 0x9D, 0x2C, 0x9D, 0xF5, 0x3A, 0x6D, 0x3A, 0xF7, 0x75, +0x09, 0xBA, 0x36, 0xBA, 0x51, 0xBA, 0x85, 0xBA, 0xDB, 0x75, 0xCF, 0xEA, 0x3E, 0xD3, 0x63, 0xEB, +0x79, 0xE9, 0x09, 0xF5, 0xCA, 0xF5, 0x0E, 0xE9, 0xDD, 0xD1, 0x47, 0xF5, 0x6D, 0xF4, 0xA3, 0xF5, +0x17, 0xEA, 0xEF, 0xD6, 0xEF, 0xD1, 0x1F, 0x37, 0x30, 0x34, 0x08, 0x36, 0x90, 0x19, 0x6C, 0x31, +0x38, 0x63, 0xF0, 0xCC, 0x90, 0x63, 0xE8, 0x6B, 0x98, 0x69, 0xB8, 0xD1, 0xF0, 0x84, 0xE1, 0xA8, +0x11, 0xCB, 0x68, 0xBA, 0x91, 0xC4, 0x68, 0xA3, 0xD1, 0x49, 0xA3, 0x27, 0xB8, 0x26, 0xEE, 0x87, +0x67, 0xE3, 0x35, 0x78, 0x17, 0x3E, 0x66, 0xAC, 0x6F, 0x1C, 0x62, 0xAC, 0x34, 0xDE, 0x65, 0xDC, +0x6B, 0x3C, 0x61, 0x62, 0x69, 0x32, 0xDB, 0xA4, 0xC4, 0xA4, 0xC5, 0xE4, 0xBE, 0x29, 0xCD, 0x94, +0x6B, 0x9A, 0x66, 0xBA, 0xD1, 0xB4, 0xD3, 0x74, 0xCC, 0xCC, 0xC8, 0x2C, 0xDC, 0xAC, 0xD8, 0xAC, +0xC9, 0xEC, 0x8E, 0x39, 0xD5, 0x9C, 0x6B, 0x9E, 0x61, 0xBE, 0xD9, 0xBC, 0xDB, 0xFC, 0x8D, 0x85, +0xA5, 0x45, 0x9C, 0xC5, 0x4A, 0x8B, 0x36, 0x8B, 0xC7, 0x96, 0xDA, 0x96, 0x7C, 0xCB, 0x05, 0x96, +0x4D, 0x96, 0xF7, 0xAC, 0x98, 0x56, 0x3E, 0x56, 0x79, 0x56, 0xF5, 0x56, 0xD7, 0xAC, 0x49, 0xD6, +0x5C, 0xEB, 0x2C, 0xEB, 0x6D, 0xD6, 0x57, 0x6C, 0x50, 0x1B, 0x57, 0x9B, 0x0C, 0x9B, 0x3A, 0x9B, +0xCB, 0xB6, 0xA8, 0xAD, 0x9B, 0xAD, 0xC4, 0x76, 0x9B, 0x6D, 0xDF, 0x14, 0xE2, 0x14, 0x8F, 0x29, +0xD2, 0x29, 0xF5, 0x53, 0x6E, 0xDA, 0x31, 0xEC, 0xFC, 0xEC, 0x0A, 0xEC, 0x9A, 0xEC, 0x06, 0xED, +0x39, 0xF6, 0x61, 0xF6, 0x25, 0xF6, 0x6D, 0xF6, 0xCF, 0x1D, 0xCC, 0x1C, 0x12, 0x1D, 0xD6, 0x3B, +0x74, 0x3B, 0x7C, 0x72, 0x74, 0x75, 0xCC, 0x76, 0x6C, 0x70, 0xBC, 0xEB, 0xA4, 0xE1, 0x34, 0xC3, +0xA9, 0xC4, 0xA9, 0xC3, 0xE9, 0x57, 0x67, 0x1B, 0x67, 0xA1, 0x73, 0x9D, 0xF3, 0x35, 0x17, 0xA6, +0x4B, 0x90, 0xCB, 0x12, 0x97, 0x76, 0x97, 0x17, 0x53, 0x6D, 0xA7, 0x8A, 0xA7, 0x6E, 0x9F, 0x7A, +0xCB, 0x95, 0xE5, 0x1A, 0xEE, 0xBA, 0xD2, 0xB5, 0xD3, 0xF5, 0xA3, 0x9B, 0xBB, 0x9B, 0xDC, 0xAD, +0xD9, 0x6D, 0xD4, 0xDD, 0xCC, 0x3D, 0xC5, 0x7D, 0xAB, 0xFB, 0x4D, 0x2E, 0x9B, 0x1B, 0xC9, 0x5D, +0xC3, 0x3D, 0xEF, 0x41, 0xF4, 0xF0, 0xF7, 0x58, 0xE2, 0x71, 0xCC, 0xE3, 0x9D, 0xA7, 0x9B, 0xA7, +0xC2, 0xF3, 0x90, 0xE7, 0x2F, 0x5E, 0x76, 0x5E, 0x59, 0x5E, 0xFB, 0xBD, 0x1E, 0x4F, 0xB3, 0x9C, +0x26, 0x9E, 0xD6, 0x30, 0x6D, 0xC8, 0xDB, 0xC4, 0x5B, 0xE0, 0xBD, 0xCB, 0x7B, 0x60, 0x3A, 0x3E, +0x3D, 0x65, 0xFA, 0xCE, 0xE9, 0x03, 0x3E, 0xC6, 0x3E, 0x02, 0x9F, 0x7A, 0x9F, 0x87, 0xBE, 0xA6, +0xBE, 0x22, 0xDF, 0x3D, 0xBE, 0x23, 0x7E, 0xD6, 0x7E, 0x99, 0x7E, 0x07, 0xFC, 0x9E, 0xFB, 0x3B, +0xFA, 0xCB, 0xFD, 0x8F, 0xF8, 0xBF, 0xE1, 0x79, 0xF2, 0x16, 0xF1, 0x4E, 0x05, 0x60, 0x01, 0xC1, +0x01, 0xE5, 0x01, 0xBD, 0x81, 0x1A, 0x81, 0xB3, 0x03, 0x6B, 0x03, 0x1F, 0x04, 0x99, 0x04, 0xA5, +0x07, 0x35, 0x05, 0x8D, 0x05, 0xBB, 0x06, 0x2F, 0x0C, 0x3E, 0x15, 0x42, 0x0C, 0x09, 0x0D, 0x59, +0x1F, 0x72, 0x93, 0x6F, 0xC0, 0x17, 0xF2, 0x1B, 0xF9, 0x63, 0x33, 0xDC, 0x67, 0x2C, 0x9A, 0xD1, +0x15, 0xCA, 0x08, 0x9D, 0x15, 0x5A, 0x1B, 0xFA, 0x30, 0xCC, 0x26, 0x4C, 0x1E, 0xD6, 0x11, 0x8E, +0x86, 0xCF, 0x08, 0xDF, 0x10, 0x7E, 0x6F, 0xA6, 0xF9, 0x4C, 0xE9, 0xCC, 0xB6, 0x08, 0x88, 0xE0, +0x47, 0x6C, 0x88, 0xB8, 0x1F, 0x69, 0x19, 0x99, 0x17, 0xF9, 0x7D, 0x14, 0x29, 0x2A, 0x32, 0xAA, +0x2E, 0xEA, 0x51, 0xB4, 0x53, 0x74, 0x71, 0x74, 0xF7, 0x2C, 0xD6, 0xAC, 0xE4, 0x59, 0xFB, 0x67, +0xBD, 0x8E, 0xF1, 0x8F, 0xA9, 0x8C, 0xB9, 0x3B, 0xDB, 0x6A, 0xB6, 0x72, 0x76, 0x67, 0xAC, 0x6A, +0x6C, 0x52, 0x6C, 0x63, 0xEC, 0x9B, 0xB8, 0x80, 0xB8, 0xAA, 0xB8, 0x81, 0x78, 0x87, 0xF8, 0x45, +0xF1, 0x97, 0x12, 0x74, 0x13, 0x24, 0x09, 0xED, 0x89, 0xE4, 0xC4, 0xD8, 0xC4, 0x3D, 0x89, 0xE3, +0x73, 0x02, 0xE7, 0x6C, 0x9A, 0x33, 0x9C, 0xE4, 0x9A, 0x54, 0x96, 0x74, 0x63, 0xAE, 0xE5, 0xDC, +0xA2, 0xB9, 0x17, 0xE6, 0xE9, 0xCE, 0xCB, 0x9E, 0x77, 0x3C, 0x59, 0x35, 0x59, 0x90, 0x7C, 0x38, +0x85, 0x98, 0x12, 0x97, 0xB2, 0x3F, 0xE5, 0x83, 0x20, 0x42, 0x50, 0x2F, 0x18, 0x4F, 0xE5, 0xA7, +0x6E, 0x4D, 0x1D, 0x13, 0xF2, 0x84, 0x9B, 0x85, 0x4F, 0x45, 0xBE, 0xA2, 0x8D, 0xA2, 0x51, 0xB1, +0xB7, 0xB8, 0x4A, 0x3C, 0x92, 0xE6, 0x9D, 0x56, 0x95, 0xF6, 0x38, 0xDD, 0x3B, 0x7D, 0x43, 0xFA, +0x68, 0x86, 0x4F, 0x46, 0x75, 0xC6, 0x33, 0x09, 0x4F, 0x52, 0x2B, 0x79, 0x91, 0x19, 0x92, 0xB9, +0x23, 0xF3, 0x4D, 0x56, 0x44, 0xD6, 0xDE, 0xAC, 0xCF, 0xD9, 0x71, 0xD9, 0x2D, 0x39, 0x94, 0x9C, +0x94, 0x9C, 0xA3, 0x52, 0x0D, 0x69, 0x96, 0xB4, 0x2B, 0xD7, 0x30, 0xB7, 0x28, 0xB7, 0x4F, 0x66, +0x2B, 0x2B, 0x93, 0x0D, 0xE4, 0x79, 0xE6, 0x6D, 0xCA, 0x1B, 0x93, 0x87, 0xCA, 0xF7, 0xE4, 0x23, +0xF9, 0x73, 0xF3, 0xDB, 0x15, 0x6C, 0x85, 0x4C, 0xD1, 0xA3, 0xB4, 0x52, 0xAE, 0x50, 0x0E, 0x16, +0x4C, 0x2F, 0xA8, 0x2B, 0x78, 0x5B, 0x18, 0x5B, 0x78, 0xB8, 0x48, 0xBD, 0x48, 0x5A, 0xD4, 0x33, +0xDF, 0x66, 0xFE, 0xEA, 0xF9, 0x23, 0x0B, 0x82, 0x16, 0x7C, 0xBD, 0x90, 0xB0, 0x50, 0xB8, 0xB0, +0xB3, 0xD8, 0xB8, 0x78, 0x59, 0xF1, 0xE0, 0x22, 0xBF, 0x45, 0xBB, 0x16, 0x23, 0x8B, 0x53, 0x17, +0x77, 0x2E, 0x31, 0x5D, 0x52, 0xBA, 0x64, 0x78, 0x69, 0xF0, 0xD2, 0x7D, 0xCB, 0x68, 0xCB, 0xB2, +0x96, 0xFD, 0x50, 0xE2, 0x58, 0x52, 0x55, 0xF2, 0x6A, 0x79, 0xDC, 0xF2, 0x8E, 0x52, 0x83, 0xD2, +0xA5, 0xA5, 0x43, 0x2B, 0x82, 0x57, 0x34, 0x95, 0xA9, 0x94, 0xC9, 0xCB, 0x6E, 0xAE, 0xF4, 0x5A, +0xB9, 0x63, 0x15, 0x61, 0x95, 0x64, 0x55, 0xEF, 0x6A, 0x97, 0xD5, 0x5B, 0x56, 0x7F, 0x2A, 0x17, +0x95, 0x5F, 0xAC, 0x70, 0xAC, 0xA8, 0xAE, 0xF8, 0xB0, 0x46, 0xB8, 0xE6, 0xE2, 0x57, 0x4E, 0x5F, +0xD5, 0x7C, 0xF5, 0x79, 0x6D, 0xDA, 0xDA, 0xDE, 0x4A, 0xB7, 0xCA, 0xED, 0xEB, 0x48, 0xEB, 0xA4, +0xEB, 0x6E, 0xAC, 0xF7, 0x59, 0xBF, 0xAF, 0x4A, 0xBD, 0x6A, 0x41, 0xD5, 0xD0, 0x86, 0xF0, 0x0D, +0xAD, 0x1B, 0xF1, 0x8D, 0xE5, 0x1B, 0x5F, 0x6D, 0x4A, 0xDE, 0x74, 0xA1, 0x7A, 0x6A, 0xF5, 0x8E, +0xCD, 0xB4, 0xCD, 0xCA, 0xCD, 0x03, 0x35, 0x61, 0x35, 0xED, 0x5B, 0xCC, 0xB6, 0xAC, 0xDB, 0xF2, +0xA1, 0x36, 0xA3, 0xF6, 0x7A, 0x9D, 0x7F, 0x5D, 0xCB, 0x56, 0xFD, 0xAD, 0xAB, 0xB7, 0xBE, 0xD9, +0x26, 0xDA, 0xD6, 0xBF, 0xDD, 0x77, 0x7B, 0xF3, 0x0E, 0x83, 0x1D, 0x15, 0x3B, 0xDE, 0xEF, 0x94, +0xEC, 0xBC, 0xB5, 0x2B, 0x78, 0x57, 0x6B, 0xBD, 0x45, 0x7D, 0xF5, 0x6E, 0xD2, 0xEE, 0x82, 0xDD, +0x8F, 0x1A, 0x62, 0x1B, 0xBA, 0xBF, 0xE6, 0x7E, 0xDD, 0xB8, 0x47, 0x77, 0x4F, 0xC5, 0x9E, 0x8F, +0x7B, 0xA5, 0x7B, 0x07, 0xF6, 0x45, 0xEF, 0xEB, 0x6A, 0x74, 0x6F, 0x6C, 0xDC, 0xAF, 0xBF, 0xBF, +0xB2, 0x09, 0x6D, 0x52, 0x36, 0x8D, 0x1E, 0x48, 0x3A, 0x70, 0xE5, 0x9B, 0x80, 0x6F, 0xDA, 0x9B, +0xED, 0x9A, 0x77, 0xB5, 0x70, 0x5A, 0x2A, 0x0E, 0xC2, 0x41, 0xE5, 0xC1, 0x27, 0xDF, 0xA6, 0x7C, +0x7B, 0xE3, 0x50, 0xE8, 0xA1, 0xCE, 0xC3, 0xDC, 0xC3, 0xCD, 0xDF, 0x99, 0x7F, 0xB7, 0xF5, 0x08, +0xEB, 0x48, 0x79, 0x2B, 0xD2, 0x3A, 0xBF, 0x75, 0xAC, 0x2D, 0xA3, 0x6D, 0xA0, 0x3D, 0xA1, 0xBD, +0xEF, 0xE8, 0x8C, 0xA3, 0x9D, 0x1D, 0x5E, 0x1D, 0x47, 0xBE, 0xB7, 0xFF, 0x7E, 0xEF, 0x31, 0xE3, +0x63, 0x75, 0xC7, 0x35, 0x8F, 0x57, 0x9E, 0xA0, 0x9D, 0x28, 0x3D, 0xF1, 0xF9, 0xE4, 0x82, 0x93, +0xE3, 0xA7, 0x64, 0xA7, 0x9E, 0x9D, 0x4E, 0x3F, 0x3D, 0xD4, 0x99, 0xDC, 0x79, 0xF7, 0x4C, 0xFC, +0x99, 0x6B, 0x5D, 0x51, 0x5D, 0xBD, 0x67, 0x43, 0xCF, 0x9E, 0x3F, 0x17, 0x74, 0xEE, 0x4C, 0xB7, +0x5F, 0xF7, 0xC9, 0xF3, 0xDE, 0xE7, 0x8F, 0x5D, 0xF0, 0xBC, 0x70, 0xF4, 0x22, 0xF7, 0x62, 0xDB, +0x25, 0xB7, 0x4B, 0xAD, 0x3D, 0xAE, 0x3D, 0x47, 0x7E, 0x70, 0xFD, 0xE1, 0x48, 0xAF, 0x5B, 0x6F, +0xEB, 0x65, 0xF7, 0xCB, 0xED, 0x57, 0x3C, 0xAE, 0x74, 0xF4, 0x4D, 0xEB, 0x3B, 0xD1, 0xEF, 0xD3, +0x7F, 0xFA, 0x6A, 0xC0, 0xD5, 0x73, 0xD7, 0xF8, 0xD7, 0x2E, 0x5D, 0x9F, 0x79, 0xBD, 0xEF, 0xC6, +0xEC, 0x1B, 0xB7, 0x6E, 0x26, 0xDD, 0x1C, 0xB8, 0x25, 0xBA, 0xF5, 0xF8, 0x76, 0xF6, 0xED, 0x17, +0x77, 0x0A, 0xEE, 0x4C, 0xDC, 0x5D, 0x7A, 0x8F, 0x78, 0xAF, 0xFC, 0xBE, 0xDA, 0xFD, 0xEA, 0x07, +0xFA, 0x0F, 0xEA, 0x7F, 0xB4, 0xFE, 0xB1, 0x65, 0xC0, 0x6D, 0xE0, 0xF8, 0x60, 0xC0, 0x60, 0xCF, +0xC3, 0x59, 0x0F, 0xEF, 0x0E, 0x09, 0x87, 0x9E, 0xFE, 0x94, 0xFF, 0xD3, 0x87, 0xE1, 0xD2, 0x47, +0xCC, 0x47, 0xD5, 0x23, 0x46, 0x23, 0x8D, 0x8F, 0x9D, 0x1F, 0x1F, 0x1B, 0x0D, 0x1A, 0xBD, 0xF2, +0x64, 0xCE, 0x93, 0xE1, 0xA7, 0xB2, 0xA7, 0x13, 0xCF, 0xCA, 0x7E, 0x56, 0xFF, 0x79, 0xEB, 0x73, +0xAB, 0xE7, 0xDF, 0xFD, 0xE2, 0xFB, 0x4B, 0xCF, 0x58, 0xFC, 0xD8, 0xF0, 0x0B, 0xF9, 0x8B, 0xCF, +0xBF, 0xAE, 0x79, 0xA9, 0xF3, 0x72, 0xEF, 0xAB, 0xA9, 0xAF, 0x3A, 0xC7, 0x23, 0xC7, 0x1F, 0xBC, +0xCE, 0x79, 0x3D, 0xF1, 0xA6, 0xFC, 0xAD, 0xCE, 0xDB, 0x7D, 0xEF, 0xB8, 0xEF, 0xBA, 0xDF, 0xC7, +0xBD, 0x1F, 0x99, 0x28, 0xFC, 0x40, 0xFE, 0x50, 0xF3, 0xD1, 0xFA, 0x63, 0xC7, 0xA7, 0xD0, 0x4F, +0xF7, 0x3E, 0xE7, 0x7C, 0xFE, 0xFC, 0x2F, 0xF7, 0x84, 0xF3, 0xFB, 0x25, 0xD2, 0x9F, 0x33, 0x00, +0x00, 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, 0x7A, 0x25, 0x00, 0x00, 0x80, 0x83, 0x00, +0x00, 0xF9, 0xFF, 0x00, 0x00, 0x80, 0xE9, 0x00, 0x00, 0x75, 0x30, 0x00, 0x00, 0xEA, 0x60, 0x00, +0x00, 0x3A, 0x98, 0x00, 0x00, 0x17, 0x6F, 0x92, 0x5F, 0xC5, 0x46, 0x00, 0x00, 0x00, 0xFA, 0x49, +0x44, 0x41, 0x54, 0x78, 0xDA, 0x7C, 0x91, 0xC1, 0x4A, 0x02, 0x51, 0x14, 0x86, 0x3F, 0x47, 0x17, +0x2D, 0x22, 0x83, 0xDC, 0xF8, 0x22, 0x3D, 0x44, 0x0F, 0xE0, 0xB2, 0xBD, 0x5B, 0x5F, 0x20, 0xDA, +0x86, 0x09, 0xE2, 0xC2, 0x47, 0x28, 0xDC, 0x85, 0x50, 0xCC, 0x2C, 0x6C, 0x20, 0x04, 0x49, 0x10, +0x71, 0x20, 0x17, 0xA6, 0xA8, 0x43, 0x0D, 0x64, 0xA0, 0x8D, 0x8D, 0x57, 0xE7, 0xE6, 0xDC, 0x36, +0xA3, 0x18, 0x6A, 0xDF, 0xEE, 0x9C, 0xFF, 0x5B, 0x1C, 0xCE, 0x1F, 0x01, 0x0E, 0x80, 0x04, 0x70, +0x0C, 0xC4, 0xD8, 0xE6, 0x07, 0x98, 0x00, 0x9F, 0x11, 0xE0, 0x24, 0x9D, 0xB9, 0xB8, 0x3F, 0x3C, +0x8A, 0x9F, 0xB2, 0x87, 0x6F, 0xF7, 0xEB, 0xB9, 0x98, 0xBB, 0x3C, 0xD3, 0x80, 0x45, 0xD5, 0xD4, +0x0B, 0x2A, 0x08, 0x96, 0xBB, 0x44, 0x15, 0x04, 0xCB, 0xAA, 0xA9, 0x17, 0x80, 0x85, 0x06, 0x78, +0xAD, 0x46, 0xCD, 0xB4, 0x07, 0x3D, 0x7D, 0x97, 0x6C, 0x0F, 0xBA, 0x46, 0xAB, 0x51, 0x33, 0x01, +0x4F, 0x03, 0x14, 0x30, 0x7A, 0x34, 0xEE, 0xAE, 0xA4, 0xEF, 0xCF, 0xFE, 0x1C, 0x2B, 0xA5, 0x78, +0xAA, 0x3C, 0x5C, 0x03, 0x23, 0x40, 0x69, 0xE1, 0xDE, 0xFF, 0x70, 0xDE, 0xDA, 0xBD, 0xD7, 0xF6, +0xED, 0xA6, 0xDC, 0xED, 0xBC, 0xDC, 0xBC, 0xDB, 0x7D, 0x0B, 0xF0, 0x01, 0x56, 0xB2, 0x02, 0xC6, +0x46, 0xB9, 0x94, 0xF7, 0xA6, 0xAE, 0x03, 0xE0, 0x4D, 0x5D, 0xC7, 0x28, 0x97, 0xF2, 0xC0, 0x38, +0xCC, 0xD7, 0x32, 0x80, 0x9C, 0x0B, 0x31, 0xB4, 0x9A, 0xF5, 0x2C, 0x80, 0xD5, 0xAC, 0x67, 0xE7, +0x42, 0x0C, 0x01, 0xB9, 0xEF, 0x4B, 0x51, 0x20, 0x99, 0x3A, 0x4F, 0x67, 0x80, 0x64, 0x38, 0xFF, +0x4B, 0x2C, 0x2C, 0x6A, 0xAB, 0xA0, 0xDF, 0x01, 0x00, 0x85, 0xC4, 0x6C, 0x23, 0xF2, 0xF0, 0x72, +0xEA, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82}; + +////////////////////////////////////////////////////////////////////////////////////////////// +const static char pngImageCapF[] = { +0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52, +0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0A, 0x08, 0x06, 0x00, 0x00, 0x00, 0x62, 0xF0, 0xA4, +0x83, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0B, 0x13, 0x00, 0x00, 0x0B, +0x13, 0x01, 0x00, 0x9A, 0x9C, 0x18, 0x00, 0x00, 0x0A, 0x4D, 0x69, 0x43, 0x43, 0x50, 0x50, 0x68, +0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x49, 0x43, 0x43, 0x20, 0x70, 0x72, 0x6F, 0x66, +0x69, 0x6C, 0x65, 0x00, 0x00, 0x78, 0xDA, 0x9D, 0x53, 0x77, 0x58, 0x93, 0xF7, 0x16, 0x3E, 0xDF, +0xF7, 0x65, 0x0F, 0x56, 0x42, 0xD8, 0xF0, 0xB1, 0x97, 0x6C, 0x81, 0x00, 0x22, 0x23, 0xAC, 0x08, +0xC8, 0x10, 0x59, 0xA2, 0x10, 0x92, 0x00, 0x61, 0x84, 0x10, 0x12, 0x40, 0xC5, 0x85, 0x88, 0x0A, +0x56, 0x14, 0x15, 0x11, 0x9C, 0x48, 0x55, 0xC4, 0x82, 0xD5, 0x0A, 0x48, 0x9D, 0x88, 0xE2, 0xA0, +0x28, 0xB8, 0x67, 0x41, 0x8A, 0x88, 0x5A, 0x8B, 0x55, 0x5C, 0x38, 0xEE, 0x1F, 0xDC, 0xA7, 0xB5, +0x7D, 0x7A, 0xEF, 0xED, 0xED, 0xFB, 0xD7, 0xFB, 0xBC, 0xE7, 0x9C, 0xE7, 0xFC, 0xCE, 0x79, 0xCF, +0x0F, 0x80, 0x11, 0x12, 0x26, 0x91, 0xE6, 0xA2, 0x6A, 0x00, 0x39, 0x52, 0x85, 0x3C, 0x3A, 0xD8, +0x1F, 0x8F, 0x4F, 0x48, 0xC4, 0xC9, 0xBD, 0x80, 0x02, 0x15, 0x48, 0xE0, 0x04, 0x20, 0x10, 0xE6, +0xCB, 0xC2, 0x67, 0x05, 0xC5, 0x00, 0x00, 0xF0, 0x03, 0x79, 0x78, 0x7E, 0x74, 0xB0, 0x3F, 0xFC, +0x01, 0xAF, 0x6F, 0x00, 0x02, 0x00, 0x70, 0xD5, 0x2E, 0x24, 0x12, 0xC7, 0xE1, 0xFF, 0x83, 0xBA, +0x50, 0x26, 0x57, 0x00, 0x20, 0x91, 0x00, 0xE0, 0x22, 0x12, 0xE7, 0x0B, 0x01, 0x90, 0x52, 0x00, +0xC8, 0x2E, 0x54, 0xC8, 0x14, 0x00, 0xC8, 0x18, 0x00, 0xB0, 0x53, 0xB3, 0x64, 0x0A, 0x00, 0x94, +0x00, 0x00, 0x6C, 0x79, 0x7C, 0x42, 0x22, 0x00, 0xAA, 0x0D, 0x00, 0xEC, 0xF4, 0x49, 0x3E, 0x05, +0x00, 0xD8, 0xA9, 0x93, 0xDC, 0x17, 0x00, 0xD8, 0xA2, 0x1C, 0xA9, 0x08, 0x00, 0x8D, 0x01, 0x00, +0x99, 0x28, 0x47, 0x24, 0x02, 0x40, 0xBB, 0x00, 0x60, 0x55, 0x81, 0x52, 0x2C, 0x02, 0xC0, 0xC2, +0x00, 0xA0, 0xAC, 0x40, 0x22, 0x2E, 0x04, 0xC0, 0xAE, 0x01, 0x80, 0x59, 0xB6, 0x32, 0x47, 0x02, +0x80, 0xBD, 0x05, 0x00, 0x76, 0x8E, 0x58, 0x90, 0x0F, 0x40, 0x60, 0x00, 0x80, 0x99, 0x42, 0x2C, +0xCC, 0x00, 0x20, 0x38, 0x02, 0x00, 0x43, 0x1E, 0x13, 0xCD, 0x03, 0x20, 0x4C, 0x03, 0xA0, 0x30, +0xD2, 0xBF, 0xE0, 0xA9, 0x5F, 0x70, 0x85, 0xB8, 0x48, 0x01, 0x00, 0xC0, 0xCB, 0x95, 0xCD, 0x97, +0x4B, 0xD2, 0x33, 0x14, 0xB8, 0x95, 0xD0, 0x1A, 0x77, 0xF2, 0xF0, 0xE0, 0xE2, 0x21, 0xE2, 0xC2, +0x6C, 0xB1, 0x42, 0x61, 0x17, 0x29, 0x10, 0x66, 0x09, 0xE4, 0x22, 0x9C, 0x97, 0x9B, 0x23, 0x13, +0x48, 0xE7, 0x03, 0x4C, 0xCE, 0x0C, 0x00, 0x00, 0x1A, 0xF9, 0xD1, 0xC1, 0xFE, 0x38, 0x3F, 0x90, +0xE7, 0xE6, 0xE4, 0xE1, 0xE6, 0x66, 0xE7, 0x6C, 0xEF, 0xF4, 0xC5, 0xA2, 0xFE, 0x6B, 0xF0, 0x6F, +0x22, 0x3E, 0x21, 0xF1, 0xDF, 0xFE, 0xBC, 0x8C, 0x02, 0x04, 0x00, 0x10, 0x4E, 0xCF, 0xEF, 0xDA, +0x5F, 0xE5, 0xE5, 0xD6, 0x03, 0x70, 0xC7, 0x01, 0xB0, 0x75, 0xBF, 0x6B, 0xA9, 0x5B, 0x00, 0xDA, +0x56, 0x00, 0x68, 0xDF, 0xF9, 0x5D, 0x33, 0xDB, 0x09, 0xA0, 0x5A, 0x0A, 0xD0, 0x7A, 0xF9, 0x8B, +0x79, 0x38, 0xFC, 0x40, 0x1E, 0x9E, 0xA1, 0x50, 0xC8, 0x3C, 0x1D, 0x1C, 0x0A, 0x0B, 0x0B, 0xED, +0x25, 0x62, 0xA1, 0xBD, 0x30, 0xE3, 0x8B, 0x3E, 0xFF, 0x33, 0xE1, 0x6F, 0xE0, 0x8B, 0x7E, 0xF6, +0xFC, 0x40, 0x1E, 0xFE, 0xDB, 0x7A, 0xF0, 0x00, 0x71, 0x9A, 0x40, 0x99, 0xAD, 0xC0, 0xA3, 0x83, +0xFD, 0x71, 0x61, 0x6E, 0x76, 0xAE, 0x52, 0x8E, 0xE7, 0xCB, 0x04, 0x42, 0x31, 0x6E, 0xF7, 0xE7, +0x23, 0xFE, 0xC7, 0x85, 0x7F, 0xFD, 0x8E, 0x29, 0xD1, 0xE2, 0x34, 0xB1, 0x5C, 0x2C, 0x15, 0x8A, +0xF1, 0x58, 0x89, 0xB8, 0x50, 0x22, 0x4D, 0xC7, 0x79, 0xB9, 0x52, 0x91, 0x44, 0x21, 0xC9, 0x95, +0xE2, 0x12, 0xE9, 0x7F, 0x32, 0xF1, 0x1F, 0x96, 0xFD, 0x09, 0x93, 0x77, 0x0D, 0x00, 0xAC, 0x86, +0x4F, 0xC0, 0x4E, 0xB6, 0x07, 0xB5, 0xCB, 0x6C, 0xC0, 0x7E, 0xEE, 0x01, 0x02, 0x8B, 0x0E, 0x58, +0xD2, 0x76, 0x00, 0x40, 0x7E, 0xF3, 0x2D, 0x8C, 0x1A, 0x0B, 0x91, 0x00, 0x10, 0x67, 0x34, 0x32, +0x79, 0xF7, 0x00, 0x00, 0x93, 0xBF, 0xF9, 0x8F, 0x40, 0x2B, 0x01, 0x00, 0xCD, 0x97, 0xA4, 0xE3, +0x00, 0x00, 0xBC, 0xE8, 0x18, 0x5C, 0xA8, 0x94, 0x17, 0x4C, 0xC6, 0x08, 0x00, 0x00, 0x44, 0xA0, +0x81, 0x2A, 0xB0, 0x41, 0x07, 0x0C, 0xC1, 0x14, 0xAC, 0xC0, 0x0E, 0x9C, 0xC1, 0x1D, 0xBC, 0xC0, +0x17, 0x02, 0x61, 0x06, 0x44, 0x40, 0x0C, 0x24, 0xC0, 0x3C, 0x10, 0x42, 0x06, 0xE4, 0x80, 0x1C, +0x0A, 0xA1, 0x18, 0x96, 0x41, 0x19, 0x54, 0xC0, 0x3A, 0xD8, 0x04, 0xB5, 0xB0, 0x03, 0x1A, 0xA0, +0x11, 0x9A, 0xE1, 0x10, 0xB4, 0xC1, 0x31, 0x38, 0x0D, 0xE7, 0xE0, 0x12, 0x5C, 0x81, 0xEB, 0x70, +0x17, 0x06, 0x60, 0x18, 0x9E, 0xC2, 0x18, 0xBC, 0x86, 0x09, 0x04, 0x41, 0xC8, 0x08, 0x13, 0x61, +0x21, 0x3A, 0x88, 0x11, 0x62, 0x8E, 0xD8, 0x22, 0xCE, 0x08, 0x17, 0x99, 0x8E, 0x04, 0x22, 0x61, +0x48, 0x34, 0x92, 0x80, 0xA4, 0x20, 0xE9, 0x88, 0x14, 0x51, 0x22, 0xC5, 0xC8, 0x72, 0xA4, 0x02, +0xA9, 0x42, 0x6A, 0x91, 0x5D, 0x48, 0x23, 0xF2, 0x2D, 0x72, 0x14, 0x39, 0x8D, 0x5C, 0x40, 0xFA, +0x90, 0xDB, 0xC8, 0x20, 0x32, 0x8A, 0xFC, 0x8A, 0xBC, 0x47, 0x31, 0x94, 0x81, 0xB2, 0x51, 0x03, +0xD4, 0x02, 0x75, 0x40, 0xB9, 0xA8, 0x1F, 0x1A, 0x8A, 0xC6, 0xA0, 0x73, 0xD1, 0x74, 0x34, 0x0F, +0x5D, 0x80, 0x96, 0xA2, 0x6B, 0xD1, 0x1A, 0xB4, 0x1E, 0x3D, 0x80, 0xB6, 0xA2, 0xA7, 0xD1, 0x4B, +0xE8, 0x75, 0x74, 0x00, 0x7D, 0x8A, 0x8E, 0x63, 0x80, 0xD1, 0x31, 0x0E, 0x66, 0x8C, 0xD9, 0x61, +0x5C, 0x8C, 0x87, 0x45, 0x60, 0x89, 0x58, 0x1A, 0x26, 0xC7, 0x16, 0x63, 0xE5, 0x58, 0x35, 0x56, +0x8F, 0x35, 0x63, 0x1D, 0x58, 0x37, 0x76, 0x15, 0x1B, 0xC0, 0x9E, 0x61, 0xEF, 0x08, 0x24, 0x02, +0x8B, 0x80, 0x13, 0xEC, 0x08, 0x5E, 0x84, 0x10, 0xC2, 0x6C, 0x82, 0x90, 0x90, 0x47, 0x58, 0x4C, +0x58, 0x43, 0xA8, 0x25, 0xEC, 0x23, 0xB4, 0x12, 0xBA, 0x08, 0x57, 0x09, 0x83, 0x84, 0x31, 0xC2, +0x27, 0x22, 0x93, 0xA8, 0x4F, 0xB4, 0x25, 0x7A, 0x12, 0xF9, 0xC4, 0x78, 0x62, 0x3A, 0xB1, 0x90, +0x58, 0x46, 0xAC, 0x26, 0xEE, 0x21, 0x1E, 0x21, 0x9E, 0x25, 0x5E, 0x27, 0x0E, 0x13, 0x5F, 0x93, +0x48, 0x24, 0x0E, 0xC9, 0x92, 0xE4, 0x4E, 0x0A, 0x21, 0x25, 0x90, 0x32, 0x49, 0x0B, 0x49, 0x6B, +0x48, 0xDB, 0x48, 0x2D, 0xA4, 0x53, 0xA4, 0x3E, 0xD2, 0x10, 0x69, 0x9C, 0x4C, 0x26, 0xEB, 0x90, +0x6D, 0xC9, 0xDE, 0xE4, 0x08, 0xB2, 0x80, 0xAC, 0x20, 0x97, 0x91, 0xB7, 0x90, 0x0F, 0x90, 0x4F, +0x92, 0xFB, 0xC9, 0xC3, 0xE4, 0xB7, 0x14, 0x3A, 0xC5, 0x88, 0xE2, 0x4C, 0x09, 0xA2, 0x24, 0x52, +0xA4, 0x94, 0x12, 0x4A, 0x35, 0x65, 0x3F, 0xE5, 0x04, 0xA5, 0x9F, 0x32, 0x42, 0x99, 0xA0, 0xAA, +0x51, 0xCD, 0xA9, 0x9E, 0xD4, 0x08, 0xAA, 0x88, 0x3A, 0x9F, 0x5A, 0x49, 0x6D, 0xA0, 0x76, 0x50, +0x2F, 0x53, 0x87, 0xA9, 0x13, 0x34, 0x75, 0x9A, 0x25, 0xCD, 0x9B, 0x16, 0x43, 0xCB, 0xA4, 0x2D, +0xA3, 0xD5, 0xD0, 0x9A, 0x69, 0x67, 0x69, 0xF7, 0x68, 0x2F, 0xE9, 0x74, 0xBA, 0x09, 0xDD, 0x83, +0x1E, 0x45, 0x97, 0xD0, 0x97, 0xD2, 0x6B, 0xE8, 0x07, 0xE9, 0xE7, 0xE9, 0x83, 0xF4, 0x77, 0x0C, +0x0D, 0x86, 0x0D, 0x83, 0xC7, 0x48, 0x62, 0x28, 0x19, 0x6B, 0x19, 0x7B, 0x19, 0xA7, 0x18, 0xB7, +0x19, 0x2F, 0x99, 0x4C, 0xA6, 0x05, 0xD3, 0x97, 0x99, 0xC8, 0x54, 0x30, 0xD7, 0x32, 0x1B, 0x99, +0x67, 0x98, 0x0F, 0x98, 0x6F, 0x55, 0x58, 0x2A, 0xF6, 0x2A, 0x7C, 0x15, 0x91, 0xCA, 0x12, 0x95, +0x3A, 0x95, 0x56, 0x95, 0x7E, 0x95, 0xE7, 0xAA, 0x54, 0x55, 0x73, 0x55, 0x3F, 0xD5, 0x79, 0xAA, +0x0B, 0x54, 0xAB, 0x55, 0x0F, 0xAB, 0x5E, 0x56, 0x7D, 0xA6, 0x46, 0x55, 0xB3, 0x50, 0xE3, 0xA9, +0x09, 0xD4, 0x16, 0xAB, 0xD5, 0xA9, 0x1D, 0x55, 0xBB, 0xA9, 0x36, 0xAE, 0xCE, 0x52, 0x77, 0x52, +0x8F, 0x50, 0xCF, 0x51, 0x5F, 0xA3, 0xBE, 0x5F, 0xFD, 0x82, 0xFA, 0x63, 0x0D, 0xB2, 0x86, 0x85, +0x46, 0xA0, 0x86, 0x48, 0xA3, 0x54, 0x63, 0xB7, 0xC6, 0x19, 0x8D, 0x21, 0x16, 0xC6, 0x32, 0x65, +0xF1, 0x58, 0x42, 0xD6, 0x72, 0x56, 0x03, 0xEB, 0x2C, 0x6B, 0x98, 0x4D, 0x62, 0x5B, 0xB2, 0xF9, +0xEC, 0x4C, 0x76, 0x05, 0xFB, 0x1B, 0x76, 0x2F, 0x7B, 0x4C, 0x53, 0x43, 0x73, 0xAA, 0x66, 0xAC, +0x66, 0x91, 0x66, 0x9D, 0xE6, 0x71, 0xCD, 0x01, 0x0E, 0xC6, 0xB1, 0xE0, 0xF0, 0x39, 0xD9, 0x9C, +0x4A, 0xCE, 0x21, 0xCE, 0x0D, 0xCE, 0x7B, 0x2D, 0x03, 0x2D, 0x3F, 0x2D, 0xB1, 0xD6, 0x6A, 0xAD, +0x66, 0xAD, 0x7E, 0xAD, 0x37, 0xDA, 0x7A, 0xDA, 0xBE, 0xDA, 0x62, 0xED, 0x72, 0xED, 0x16, 0xED, +0xEB, 0xDA, 0xEF, 0x75, 0x70, 0x9D, 0x40, 0x9D, 0x2C, 0x9D, 0xF5, 0x3A, 0x6D, 0x3A, 0xF7, 0x75, +0x09, 0xBA, 0x36, 0xBA, 0x51, 0xBA, 0x85, 0xBA, 0xDB, 0x75, 0xCF, 0xEA, 0x3E, 0xD3, 0x63, 0xEB, +0x79, 0xE9, 0x09, 0xF5, 0xCA, 0xF5, 0x0E, 0xE9, 0xDD, 0xD1, 0x47, 0xF5, 0x6D, 0xF4, 0xA3, 0xF5, +0x17, 0xEA, 0xEF, 0xD6, 0xEF, 0xD1, 0x1F, 0x37, 0x30, 0x34, 0x08, 0x36, 0x90, 0x19, 0x6C, 0x31, +0x38, 0x63, 0xF0, 0xCC, 0x90, 0x63, 0xE8, 0x6B, 0x98, 0x69, 0xB8, 0xD1, 0xF0, 0x84, 0xE1, 0xA8, +0x11, 0xCB, 0x68, 0xBA, 0x91, 0xC4, 0x68, 0xA3, 0xD1, 0x49, 0xA3, 0x27, 0xB8, 0x26, 0xEE, 0x87, +0x67, 0xE3, 0x35, 0x78, 0x17, 0x3E, 0x66, 0xAC, 0x6F, 0x1C, 0x62, 0xAC, 0x34, 0xDE, 0x65, 0xDC, +0x6B, 0x3C, 0x61, 0x62, 0x69, 0x32, 0xDB, 0xA4, 0xC4, 0xA4, 0xC5, 0xE4, 0xBE, 0x29, 0xCD, 0x94, +0x6B, 0x9A, 0x66, 0xBA, 0xD1, 0xB4, 0xD3, 0x74, 0xCC, 0xCC, 0xC8, 0x2C, 0xDC, 0xAC, 0xD8, 0xAC, +0xC9, 0xEC, 0x8E, 0x39, 0xD5, 0x9C, 0x6B, 0x9E, 0x61, 0xBE, 0xD9, 0xBC, 0xDB, 0xFC, 0x8D, 0x85, +0xA5, 0x45, 0x9C, 0xC5, 0x4A, 0x8B, 0x36, 0x8B, 0xC7, 0x96, 0xDA, 0x96, 0x7C, 0xCB, 0x05, 0x96, +0x4D, 0x96, 0xF7, 0xAC, 0x98, 0x56, 0x3E, 0x56, 0x79, 0x56, 0xF5, 0x56, 0xD7, 0xAC, 0x49, 0xD6, +0x5C, 0xEB, 0x2C, 0xEB, 0x6D, 0xD6, 0x57, 0x6C, 0x50, 0x1B, 0x57, 0x9B, 0x0C, 0x9B, 0x3A, 0x9B, +0xCB, 0xB6, 0xA8, 0xAD, 0x9B, 0xAD, 0xC4, 0x76, 0x9B, 0x6D, 0xDF, 0x14, 0xE2, 0x14, 0x8F, 0x29, +0xD2, 0x29, 0xF5, 0x53, 0x6E, 0xDA, 0x31, 0xEC, 0xFC, 0xEC, 0x0A, 0xEC, 0x9A, 0xEC, 0x06, 0xED, +0x39, 0xF6, 0x61, 0xF6, 0x25, 0xF6, 0x6D, 0xF6, 0xCF, 0x1D, 0xCC, 0x1C, 0x12, 0x1D, 0xD6, 0x3B, +0x74, 0x3B, 0x7C, 0x72, 0x74, 0x75, 0xCC, 0x76, 0x6C, 0x70, 0xBC, 0xEB, 0xA4, 0xE1, 0x34, 0xC3, +0xA9, 0xC4, 0xA9, 0xC3, 0xE9, 0x57, 0x67, 0x1B, 0x67, 0xA1, 0x73, 0x9D, 0xF3, 0x35, 0x17, 0xA6, +0x4B, 0x90, 0xCB, 0x12, 0x97, 0x76, 0x97, 0x17, 0x53, 0x6D, 0xA7, 0x8A, 0xA7, 0x6E, 0x9F, 0x7A, +0xCB, 0x95, 0xE5, 0x1A, 0xEE, 0xBA, 0xD2, 0xB5, 0xD3, 0xF5, 0xA3, 0x9B, 0xBB, 0x9B, 0xDC, 0xAD, +0xD9, 0x6D, 0xD4, 0xDD, 0xCC, 0x3D, 0xC5, 0x7D, 0xAB, 0xFB, 0x4D, 0x2E, 0x9B, 0x1B, 0xC9, 0x5D, +0xC3, 0x3D, 0xEF, 0x41, 0xF4, 0xF0, 0xF7, 0x58, 0xE2, 0x71, 0xCC, 0xE3, 0x9D, 0xA7, 0x9B, 0xA7, +0xC2, 0xF3, 0x90, 0xE7, 0x2F, 0x5E, 0x76, 0x5E, 0x59, 0x5E, 0xFB, 0xBD, 0x1E, 0x4F, 0xB3, 0x9C, +0x26, 0x9E, 0xD6, 0x30, 0x6D, 0xC8, 0xDB, 0xC4, 0x5B, 0xE0, 0xBD, 0xCB, 0x7B, 0x60, 0x3A, 0x3E, +0x3D, 0x65, 0xFA, 0xCE, 0xE9, 0x03, 0x3E, 0xC6, 0x3E, 0x02, 0x9F, 0x7A, 0x9F, 0x87, 0xBE, 0xA6, +0xBE, 0x22, 0xDF, 0x3D, 0xBE, 0x23, 0x7E, 0xD6, 0x7E, 0x99, 0x7E, 0x07, 0xFC, 0x9E, 0xFB, 0x3B, +0xFA, 0xCB, 0xFD, 0x8F, 0xF8, 0xBF, 0xE1, 0x79, 0xF2, 0x16, 0xF1, 0x4E, 0x05, 0x60, 0x01, 0xC1, +0x01, 0xE5, 0x01, 0xBD, 0x81, 0x1A, 0x81, 0xB3, 0x03, 0x6B, 0x03, 0x1F, 0x04, 0x99, 0x04, 0xA5, +0x07, 0x35, 0x05, 0x8D, 0x05, 0xBB, 0x06, 0x2F, 0x0C, 0x3E, 0x15, 0x42, 0x0C, 0x09, 0x0D, 0x59, +0x1F, 0x72, 0x93, 0x6F, 0xC0, 0x17, 0xF2, 0x1B, 0xF9, 0x63, 0x33, 0xDC, 0x67, 0x2C, 0x9A, 0xD1, +0x15, 0xCA, 0x08, 0x9D, 0x15, 0x5A, 0x1B, 0xFA, 0x30, 0xCC, 0x26, 0x4C, 0x1E, 0xD6, 0x11, 0x8E, +0x86, 0xCF, 0x08, 0xDF, 0x10, 0x7E, 0x6F, 0xA6, 0xF9, 0x4C, 0xE9, 0xCC, 0xB6, 0x08, 0x88, 0xE0, +0x47, 0x6C, 0x88, 0xB8, 0x1F, 0x69, 0x19, 0x99, 0x17, 0xF9, 0x7D, 0x14, 0x29, 0x2A, 0x32, 0xAA, +0x2E, 0xEA, 0x51, 0xB4, 0x53, 0x74, 0x71, 0x74, 0xF7, 0x2C, 0xD6, 0xAC, 0xE4, 0x59, 0xFB, 0x67, +0xBD, 0x8E, 0xF1, 0x8F, 0xA9, 0x8C, 0xB9, 0x3B, 0xDB, 0x6A, 0xB6, 0x72, 0x76, 0x67, 0xAC, 0x6A, +0x6C, 0x52, 0x6C, 0x63, 0xEC, 0x9B, 0xB8, 0x80, 0xB8, 0xAA, 0xB8, 0x81, 0x78, 0x87, 0xF8, 0x45, +0xF1, 0x97, 0x12, 0x74, 0x13, 0x24, 0x09, 0xED, 0x89, 0xE4, 0xC4, 0xD8, 0xC4, 0x3D, 0x89, 0xE3, +0x73, 0x02, 0xE7, 0x6C, 0x9A, 0x33, 0x9C, 0xE4, 0x9A, 0x54, 0x96, 0x74, 0x63, 0xAE, 0xE5, 0xDC, +0xA2, 0xB9, 0x17, 0xE6, 0xE9, 0xCE, 0xCB, 0x9E, 0x77, 0x3C, 0x59, 0x35, 0x59, 0x90, 0x7C, 0x38, +0x85, 0x98, 0x12, 0x97, 0xB2, 0x3F, 0xE5, 0x83, 0x20, 0x42, 0x50, 0x2F, 0x18, 0x4F, 0xE5, 0xA7, +0x6E, 0x4D, 0x1D, 0x13, 0xF2, 0x84, 0x9B, 0x85, 0x4F, 0x45, 0xBE, 0xA2, 0x8D, 0xA2, 0x51, 0xB1, +0xB7, 0xB8, 0x4A, 0x3C, 0x92, 0xE6, 0x9D, 0x56, 0x95, 0xF6, 0x38, 0xDD, 0x3B, 0x7D, 0x43, 0xFA, +0x68, 0x86, 0x4F, 0x46, 0x75, 0xC6, 0x33, 0x09, 0x4F, 0x52, 0x2B, 0x79, 0x91, 0x19, 0x92, 0xB9, +0x23, 0xF3, 0x4D, 0x56, 0x44, 0xD6, 0xDE, 0xAC, 0xCF, 0xD9, 0x71, 0xD9, 0x2D, 0x39, 0x94, 0x9C, +0x94, 0x9C, 0xA3, 0x52, 0x0D, 0x69, 0x96, 0xB4, 0x2B, 0xD7, 0x30, 0xB7, 0x28, 0xB7, 0x4F, 0x66, +0x2B, 0x2B, 0x93, 0x0D, 0xE4, 0x79, 0xE6, 0x6D, 0xCA, 0x1B, 0x93, 0x87, 0xCA, 0xF7, 0xE4, 0x23, +0xF9, 0x73, 0xF3, 0xDB, 0x15, 0x6C, 0x85, 0x4C, 0xD1, 0xA3, 0xB4, 0x52, 0xAE, 0x50, 0x0E, 0x16, +0x4C, 0x2F, 0xA8, 0x2B, 0x78, 0x5B, 0x18, 0x5B, 0x78, 0xB8, 0x48, 0xBD, 0x48, 0x5A, 0xD4, 0x33, +0xDF, 0x66, 0xFE, 0xEA, 0xF9, 0x23, 0x0B, 0x82, 0x16, 0x7C, 0xBD, 0x90, 0xB0, 0x50, 0xB8, 0xB0, +0xB3, 0xD8, 0xB8, 0x78, 0x59, 0xF1, 0xE0, 0x22, 0xBF, 0x45, 0xBB, 0x16, 0x23, 0x8B, 0x53, 0x17, +0x77, 0x2E, 0x31, 0x5D, 0x52, 0xBA, 0x64, 0x78, 0x69, 0xF0, 0xD2, 0x7D, 0xCB, 0x68, 0xCB, 0xB2, +0x96, 0xFD, 0x50, 0xE2, 0x58, 0x52, 0x55, 0xF2, 0x6A, 0x79, 0xDC, 0xF2, 0x8E, 0x52, 0x83, 0xD2, +0xA5, 0xA5, 0x43, 0x2B, 0x82, 0x57, 0x34, 0x95, 0xA9, 0x94, 0xC9, 0xCB, 0x6E, 0xAE, 0xF4, 0x5A, +0xB9, 0x63, 0x15, 0x61, 0x95, 0x64, 0x55, 0xEF, 0x6A, 0x97, 0xD5, 0x5B, 0x56, 0x7F, 0x2A, 0x17, +0x95, 0x5F, 0xAC, 0x70, 0xAC, 0xA8, 0xAE, 0xF8, 0xB0, 0x46, 0xB8, 0xE6, 0xE2, 0x57, 0x4E, 0x5F, +0xD5, 0x7C, 0xF5, 0x79, 0x6D, 0xDA, 0xDA, 0xDE, 0x4A, 0xB7, 0xCA, 0xED, 0xEB, 0x48, 0xEB, 0xA4, +0xEB, 0x6E, 0xAC, 0xF7, 0x59, 0xBF, 0xAF, 0x4A, 0xBD, 0x6A, 0x41, 0xD5, 0xD0, 0x86, 0xF0, 0x0D, +0xAD, 0x1B, 0xF1, 0x8D, 0xE5, 0x1B, 0x5F, 0x6D, 0x4A, 0xDE, 0x74, 0xA1, 0x7A, 0x6A, 0xF5, 0x8E, +0xCD, 0xB4, 0xCD, 0xCA, 0xCD, 0x03, 0x35, 0x61, 0x35, 0xED, 0x5B, 0xCC, 0xB6, 0xAC, 0xDB, 0xF2, +0xA1, 0x36, 0xA3, 0xF6, 0x7A, 0x9D, 0x7F, 0x5D, 0xCB, 0x56, 0xFD, 0xAD, 0xAB, 0xB7, 0xBE, 0xD9, +0x26, 0xDA, 0xD6, 0xBF, 0xDD, 0x77, 0x7B, 0xF3, 0x0E, 0x83, 0x1D, 0x15, 0x3B, 0xDE, 0xEF, 0x94, +0xEC, 0xBC, 0xB5, 0x2B, 0x78, 0x57, 0x6B, 0xBD, 0x45, 0x7D, 0xF5, 0x6E, 0xD2, 0xEE, 0x82, 0xDD, +0x8F, 0x1A, 0x62, 0x1B, 0xBA, 0xBF, 0xE6, 0x7E, 0xDD, 0xB8, 0x47, 0x77, 0x4F, 0xC5, 0x9E, 0x8F, +0x7B, 0xA5, 0x7B, 0x07, 0xF6, 0x45, 0xEF, 0xEB, 0x6A, 0x74, 0x6F, 0x6C, 0xDC, 0xAF, 0xBF, 0xBF, +0xB2, 0x09, 0x6D, 0x52, 0x36, 0x8D, 0x1E, 0x48, 0x3A, 0x70, 0xE5, 0x9B, 0x80, 0x6F, 0xDA, 0x9B, +0xED, 0x9A, 0x77, 0xB5, 0x70, 0x5A, 0x2A, 0x0E, 0xC2, 0x41, 0xE5, 0xC1, 0x27, 0xDF, 0xA6, 0x7C, +0x7B, 0xE3, 0x50, 0xE8, 0xA1, 0xCE, 0xC3, 0xDC, 0xC3, 0xCD, 0xDF, 0x99, 0x7F, 0xB7, 0xF5, 0x08, +0xEB, 0x48, 0x79, 0x2B, 0xD2, 0x3A, 0xBF, 0x75, 0xAC, 0x2D, 0xA3, 0x6D, 0xA0, 0x3D, 0xA1, 0xBD, +0xEF, 0xE8, 0x8C, 0xA3, 0x9D, 0x1D, 0x5E, 0x1D, 0x47, 0xBE, 0xB7, 0xFF, 0x7E, 0xEF, 0x31, 0xE3, +0x63, 0x75, 0xC7, 0x35, 0x8F, 0x57, 0x9E, 0xA0, 0x9D, 0x28, 0x3D, 0xF1, 0xF9, 0xE4, 0x82, 0x93, +0xE3, 0xA7, 0x64, 0xA7, 0x9E, 0x9D, 0x4E, 0x3F, 0x3D, 0xD4, 0x99, 0xDC, 0x79, 0xF7, 0x4C, 0xFC, +0x99, 0x6B, 0x5D, 0x51, 0x5D, 0xBD, 0x67, 0x43, 0xCF, 0x9E, 0x3F, 0x17, 0x74, 0xEE, 0x4C, 0xB7, +0x5F, 0xF7, 0xC9, 0xF3, 0xDE, 0xE7, 0x8F, 0x5D, 0xF0, 0xBC, 0x70, 0xF4, 0x22, 0xF7, 0x62, 0xDB, +0x25, 0xB7, 0x4B, 0xAD, 0x3D, 0xAE, 0x3D, 0x47, 0x7E, 0x70, 0xFD, 0xE1, 0x48, 0xAF, 0x5B, 0x6F, +0xEB, 0x65, 0xF7, 0xCB, 0xED, 0x57, 0x3C, 0xAE, 0x74, 0xF4, 0x4D, 0xEB, 0x3B, 0xD1, 0xEF, 0xD3, +0x7F, 0xFA, 0x6A, 0xC0, 0xD5, 0x73, 0xD7, 0xF8, 0xD7, 0x2E, 0x5D, 0x9F, 0x79, 0xBD, 0xEF, 0xC6, +0xEC, 0x1B, 0xB7, 0x6E, 0x26, 0xDD, 0x1C, 0xB8, 0x25, 0xBA, 0xF5, 0xF8, 0x76, 0xF6, 0xED, 0x17, +0x77, 0x0A, 0xEE, 0x4C, 0xDC, 0x5D, 0x7A, 0x8F, 0x78, 0xAF, 0xFC, 0xBE, 0xDA, 0xFD, 0xEA, 0x07, +0xFA, 0x0F, 0xEA, 0x7F, 0xB4, 0xFE, 0xB1, 0x65, 0xC0, 0x6D, 0xE0, 0xF8, 0x60, 0xC0, 0x60, 0xCF, +0xC3, 0x59, 0x0F, 0xEF, 0x0E, 0x09, 0x87, 0x9E, 0xFE, 0x94, 0xFF, 0xD3, 0x87, 0xE1, 0xD2, 0x47, +0xCC, 0x47, 0xD5, 0x23, 0x46, 0x23, 0x8D, 0x8F, 0x9D, 0x1F, 0x1F, 0x1B, 0x0D, 0x1A, 0xBD, 0xF2, +0x64, 0xCE, 0x93, 0xE1, 0xA7, 0xB2, 0xA7, 0x13, 0xCF, 0xCA, 0x7E, 0x56, 0xFF, 0x79, 0xEB, 0x73, +0xAB, 0xE7, 0xDF, 0xFD, 0xE2, 0xFB, 0x4B, 0xCF, 0x58, 0xFC, 0xD8, 0xF0, 0x0B, 0xF9, 0x8B, 0xCF, +0xBF, 0xAE, 0x79, 0xA9, 0xF3, 0x72, 0xEF, 0xAB, 0xA9, 0xAF, 0x3A, 0xC7, 0x23, 0xC7, 0x1F, 0xBC, +0xCE, 0x79, 0x3D, 0xF1, 0xA6, 0xFC, 0xAD, 0xCE, 0xDB, 0x7D, 0xEF, 0xB8, 0xEF, 0xBA, 0xDF, 0xC7, +0xBD, 0x1F, 0x99, 0x28, 0xFC, 0x40, 0xFE, 0x50, 0xF3, 0xD1, 0xFA, 0x63, 0xC7, 0xA7, 0xD0, 0x4F, +0xF7, 0x3E, 0xE7, 0x7C, 0xFE, 0xFC, 0x2F, 0xF7, 0x84, 0xF3, 0xFB, 0x25, 0xD2, 0x9F, 0x33, 0x00, +0x00, 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, 0x7A, 0x25, 0x00, 0x00, 0x80, 0x83, 0x00, +0x00, 0xF9, 0xFF, 0x00, 0x00, 0x80, 0xE9, 0x00, 0x00, 0x75, 0x30, 0x00, 0x00, 0xEA, 0x60, 0x00, +0x00, 0x3A, 0x98, 0x00, 0x00, 0x17, 0x6F, 0x92, 0x5F, 0xC5, 0x46, 0x00, 0x00, 0x00, 0xFB, 0x49, +0x44, 0x41, 0x54, 0x78, 0xDA, 0x7C, 0xD1, 0xBD, 0x6A, 0xC2, 0x60, 0x14, 0xC6, 0xF1, 0xBF, 0xD1, +0xA1, 0x63, 0x3F, 0x5C, 0xBC, 0x91, 0x5E, 0x44, 0x6F, 0xA0, 0xB7, 0xE0, 0x6C, 0xE9, 0xD8, 0x1B, +0x50, 0x2B, 0x88, 0x43, 0xEB, 0x52, 0x48, 0x17, 0x6D, 0x1D, 0x0A, 0x0E, 0x81, 0x08, 0x42, 0x40, +0x1C, 0xEA, 0xD0, 0xA2, 0x16, 0x85, 0xD0, 0x52, 0xC8, 0xE2, 0xA0, 0xF6, 0x55, 0x24, 0xD1, 0x37, +0xD6, 0x37, 0x2E, 0xB1, 0x08, 0x6A, 0x9F, 0xED, 0x9C, 0xF3, 0x9B, 0xCE, 0x13, 0x01, 0x8E, 0x80, +0x38, 0x70, 0x0C, 0xC4, 0xD8, 0xCD, 0x2F, 0x30, 0x01, 0x46, 0x11, 0xE0, 0x2C, 0x73, 0xFF, 0x64, +0x9C, 0x9C, 0xC6, 0xCF, 0x39, 0x10, 0xF1, 0x33, 0x6A, 0x5D, 0x27, 0x2F, 0x2F, 0x34, 0x40, 0x56, +0x2B, 0x7A, 0x41, 0x29, 0xB5, 0xDA, 0x07, 0x95, 0x52, 0xAB, 0x6A, 0x45, 0x2F, 0x00, 0x52, 0x03, +0xDC, 0x46, 0xDD, 0xB0, 0xEC, 0x7E, 0xC7, 0xDC, 0x87, 0xED, 0x5E, 0xBB, 0xD6, 0xA8, 0x1B, 0x16, +0xE0, 0x6A, 0x40, 0x00, 0x0C, 0x9F, 0x1F, 0xEF, 0xD2, 0x52, 0x2E, 0xBC, 0x6D, 0xE8, 0xFB, 0x72, +0xFE, 0x52, 0x7E, 0xB8, 0x05, 0x86, 0x40, 0xA0, 0x6D, 0xF6, 0xCE, 0xF7, 0x67, 0xFF, 0xE3, 0xBD, +0x55, 0xDE, 0xC6, 0xDD, 0xB7, 0xD7, 0xD2, 0x97, 0xDD, 0xEB, 0x02, 0x3E, 0xC0, 0x06, 0x07, 0x80, +0xD0, 0x8B, 0xB9, 0xFC, 0x54, 0x8C, 0x07, 0x00, 0x53, 0x31, 0x1E, 0xE8, 0xC5, 0x5C, 0x1E, 0x10, +0xE1, 0xFD, 0x0F, 0x03, 0x2C, 0x3D, 0x77, 0xE6, 0x34, 0x2D, 0x33, 0x0B, 0xD0, 0xB4, 0xCC, 0xAC, +0xE7, 0xCE, 0x1C, 0x60, 0x79, 0xE8, 0x4B, 0x51, 0x20, 0x71, 0x75, 0x93, 0x49, 0x01, 0x89, 0x70, +0xFE, 0x37, 0xB1, 0xB0, 0xA8, 0x9D, 0x82, 0xD6, 0x03, 0x00, 0xB4, 0xA2, 0x69, 0x23, 0xE2, 0x9D, +0x11, 0xE7, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82}; +//////////////////////////////////////////////////////////////////////////////////// +#define EX_FRAME 0 +#define IN_FRAME 1 +#define IN_RECT 2 +#define ALL 3 + +static COLORREF + CLR_TXT_NOR = RGB( 156, 170, 189 ), + CLR_TXT_HOT = RGB( 201, 214, 229 ), + CLR_TXT_DIS = RGB( 75, 77, 79 ); +/* + clrFrameExNormal = RGB(125,128,131), + clrFrameExEnter = RGB(145,156,170), + clrFrameExDisable = RGB(109,114,120), + + clrFrameNormal = RGB(44,46,48), + clrLineNormal = RGB(44,46,48), + + clrRectNormal = RGB(74,80,88), + clrRectDisable = RGB(100,106,113), + + //Ǵңϵ + + clrCapArrowOpenBound[10]= + { RGB(50,54,60),RGB(54,58,64),RGB(57,61,67),RGB(58,63,69), + RGB(58,63,69),RGB(62,67,74),RGB(64,69,76), + RGB(66,71,78),RGB(68,74,81), + RGB(71,77,85)}, + + clrCapArrowOpenLine[4] = + { RGB(59,64,70), + RGB(65,70,77), + RGB(69,75,82), + RGB(73,78,86)}, + clrExFrameBound[4] = + { RGB(81,87,94), + RGB(94,100,107), + RGB(113,118,124), + RGB(126,130,136) + }, + clrExFrameBoundDisable[4] = + { RGB(77,83,91), + RGB(86,91,99), + RGB(98,103,110), + RGB(105,110,117) + }; +*/ + +//////////////////////////////////////////////////////////////////////////////////// +#define PIXEL_EXTERNAL_FRAME 1 //߽С +#define PIXEL_INTERNAL_FARME 1 //ڱ߽С +#define PIXEL_INTERNAL_BOUND 1 //ԲǴС +#define PIXEL_INTERNAL_DISPART 1 //ָ +#define PIXLE_TEXT_LEFT_OFFSET 3 //ƫƾ +#define PIXEL_INTERNAL_RECTRIGHT_HEIGHT m_pPngButton->Height //ڲͼƬ߶ +#define PIXEL_INTERNAL_RECTRIGHT_WIDTH m_pPngButton->Width //ڲͼƬ +//ڲߵRightֵ +#define PIXEL_INTERNAL_RECTLEFT_RIGHT Width - PIXEL_EXTERNAL_FRAME \ + - PIXEL_INTERNAL_FARME \ + - PIXEL_INTERNAL_RECTRIGHT_WIDTH \ + - PIXEL_INTERNAL_DISPART +//X Y ʣĿȺ͸߶ +#define PIXEL_TEXT_X Width - 2*PIXLE_TEXT_LEFT_OFFSET \ + - PIXEL_INTERNAL_RECTRIGHT_WIDTH \ + - PIXEL_INTERNAL_DISPART + +#define PIXEL_TEXT_Y Height - 2 * PIXEL_EXTERNAL_FRAME \ + - 2 * PIXEL_INTERNAL_FARME + +//--------------------------------------------------------------------------- +// ValidCtrCheck is used to assure that the components created do not have +// any pure virtual functions. +// + +static inline void ValidCtrCheck(TCapButton *) +{ + new TCapButton(NULL); +} +//--------------------------------------------------------------------------- +namespace Capbutton +{ + void __fastcall PACKAGE Register() + { + TComponentClass classes[1] = {__classid(TCapButton)}; + RegisterComponents(L"Samples", classes, 0); + } +} +//--------------------------------------------------------------------------- +__fastcall TCapButton::TCapButton(TComponent* Owner) + : TGraphicControl(Owner) +{ + Height = 24; //a default Height + Width = 75; //a default Width + FStateCount = 4; //default state count + FDown = false; + ShowHint = true; + + FPngImg = new Vcl::Imaging::Pngimage::TPngImage(); //we create our png + + m_pPngButton = new TPngImage(); + m_pPngFoucusButton = new TPngImage(); + + pTmpFoucusDraw = new TPngImage(); + pTmpDraw = new TPngImage(); + + TMemoryStream *pngStream = new TMemoryStream(); + + pngStream->Position = 0; + pngStream->WriteBuffer(pngImageCap, 3021); + pngStream->Position = 0; + m_pPngButton->LoadFromStream(pngStream); + pTmpDraw->Assign(m_pPngButton); + + pngStream->Clear(); + pngStream->Position = 0; + pngStream->WriteBuffer(pngImageCapF, 3022); + pngStream->Position = 0; + m_pPngFoucusButton->LoadFromStream(pngStream); + pTmpFoucusDraw->Assign(m_pPngFoucusButton); + + delete pngStream; + + + pTmpDraw->SetSize(m_pPngButton->Width, m_pPngButton->Height); + pTmpFoucusDraw->SetSize(m_pPngFoucusButton->Width, m_pPngFoucusButton->Height); + + FEnablePNG = false; + + Canvas->Font->Size = 8; + + FBorderColor = TColor(0x83807d); + FInterFrameColor = TColor(0x302e2c); + FInterColor = TColor(0x58504a); + + IniColor( ALL ); +} + +//--------------------------------------------------------------------------- + +__fastcall TCapButton::~TCapButton(void) +{ + if(m_pPngButton) + delete m_pPngButton; + + if(FPngImg) + delete FPngImg; + + if(pTmpDraw) + delete pTmpDraw; +} + +//--------------------------------------------------------------------------- + +void __fastcall TCapButton::SetStateCount( int count ) +{ + if( count>4 ) count = 4; + if( count<2 ) count = 2; + + FStateCount = count; +} + +//--------------------------------------------------------------------------- + +void __fastcall TCapButton::SetPngImg(Vcl::Imaging::Pngimage::TPngImage *value) +{ + + if(value) { + FPngImg->Assign(value); + FEnablePNG = true; + }else { + FEnablePNG = false; + return; + } + + //Now setting the component width and height by the png image used + Height = FPngImg->Height; + Width = FPngImg->Width / FStateCount; + + Constraints->MaxHeight = Height; + Constraints->MinHeight = Height; + Constraints->MaxWidth = Width; + Constraints->MinWidth = Width; + + EtatBtn = 0; //reset the component state to normal +} + +//--------------------------------------------------------------------------- +void __fastcall TCapButton::SetDown(bool value) +{ + if( FStateCount<3 ) + value = false; + + FDown = value; + if( FDown==False ) + EtatBtn = 0; //is the mouse down is false then we reset the component state to normal + + Paint(); + Refresh(); //we repaint the componet) +} + +//--------------------------------------------------------------------------- +void __fastcall TCapButton::Paint(void) +{ + + if( ComponentState.Contains(csDesigning) ){ //ʱ + + if(FEnablePNG){ + if( FPngImg ){ //pngʽͼƬ + Constraints->MaxHeight = FPngImg->Height; + Constraints->MinHeight = FPngImg->Height; + Constraints->MaxWidth = FPngImg->Width / FStateCount; + Constraints->MinWidth = FPngImg->Width / FStateCount; + } + + //get component state: down, enabled/disabled + if( FPngImg && Enabled ) + FPngImg->Draw( Canvas, Rect(0, 0, FStateCount*Width, Height) ); // Normal + if( FPngImg && Enabled && FDown ) + FPngImg->Draw( Canvas, Rect(-(Width*2), 0, (FStateCount-2)*Width, Height) ); // the component is pressed + if( FPngImg && !Enabled ) + FPngImg->Draw( Canvas, Rect(-(Width*3), 0, (FStateCount-3)*Width, Height) ); // Disabled + + // design a rectangle for our component + // this can be removed to achieve cool rounded buttons + //Canvas->Pen->Style = psDot; + //Canvas->Brush->Style = bsClear; + //Canvas->Rectangle( 0, 0, Width, Height ); + }else{ //Ի汳 + + if( FDown ) EtatBtn = 2; + if( !Enabled ) EtatBtn = 3; + + PaintCustomer(); + } + } + else{ //ʱ + if( FDown ) EtatBtn = 2; + if( !Enabled ) EtatBtn = 3; + + if( FEnablePNG && FPngImg ){ //pngʽͼƬ + switch( EtatBtn ){ + case 0: + FPngImg->Draw( Canvas, Rect(0, 0, FStateCount*Width, Height) ); // Normal + break; + case 1: + FPngImg->Draw( Canvas, Rect(-Width, 0, (FStateCount-1)*Width, Height) ); // Mouse Entered + break; + case 2: + FPngImg->Draw( Canvas, Rect(-(Width*2), 0, (FStateCount-2)*Width, Height) ); // Pressed + break; + case 3: + FPngImg->Draw( Canvas, Rect(-(Width*3), 0, (FStateCount-3)*Width, Height) ); // Disabled + break; + } + + PaintCustomerText(); + }else { //Ի汳 + PaintCustomer(); + } + } +} + +//--------------------------------------------------------------------------- +void __fastcall TCapButton::SetEnabled(bool Value) +{ + if(FStateCount<4) //can't be disable + Value = true; + + TGraphicControl::SetEnabled(Value); + + if( Enabled ) + EtatBtn = 0; + else + EtatBtn = 3; + + Paint(); +} +//--------------------------------------------------------------------------- +void __fastcall TCapButton::MouseDown(System::Uitypes::TMouseButton Button, + System::Classes::TShiftState Shift, int X, int Y) +{ + TGraphicControl::MouseDown( Button, Shift, X, Y ); + + if( Button==mbLeft && Enabled && FStateCount>2){ + EtatBtn = 2; // Pressed + + Paint(); + Refresh(); + } + + TCustomForm * parentForm = GetParentForm( this ); + if( parentForm && parentForm==Application->MainForm ){ + TPoint pt(X,Y); + pt = ClientToParent( pt, parentForm ); + Application->MainForm->OnMouseDown( NULL, Button, Shift, pt.X, pt.Y ); + } +} + +//--------------------------------------------------------------------------- +void __fastcall TCapButton::MouseUp(System::Uitypes::TMouseButton Button, + System::Classes::TShiftState Shift, int X, int Y) +{ + TGraphicControl::MouseUp( Button, Shift, X, Y ); + + if( Button==mbLeft && Enabled ){ + if( X>=0 && X=0 && YModalResult = FModalResult; + } + + TGraphicControl::Click(); +} + +//--------------------------------------------------------------------------- +int __fastcall TCapButton::GetFontSize() +{ + return Canvas->Font->Size; +} + +//--------------------------------------------------------------------------- +void __fastcall TCapButton::SetFontSize( int value ) +{ + Canvas->Font->Size = value; + +// Paint(); +// Refresh(); +// Invalidate(); +} + +//--------------------------------------------------------------------------- +void __fastcall TCapButton::SetFont(String name, int size ) +{ + Canvas->Font->Name = name; + Canvas->Font->Size = size; +} +//--------------------------------------------------------------------------- +void __fastcall TCapButton::SetEnablePNG(bool Value) +{ + if(FEnablePNG) + return ; + + if( !FPngImg || ( FPngImg && (0== FPngImg->Width && 0== FPngImg->Height) ) ){ + FEnablePNG = false; + return; + } + + FEnablePNG = Value; +} +//--------------------------------------------------------------------------- +void __fastcall TCapButton::PaintCustomer(void) +{ + TRect rectDraw = GetClientRect(); + TRect tmpRet = rectDraw; + + //================߿ + if(EtatBtn == 0){ + Canvas->Brush->Color = clrFrameExNormal; + Canvas->Pen->Color = clrFrameExNormal; + }else if(EtatBtn == 3){ + Canvas->Brush->Color = clrFrameExDisable; + Canvas->Pen->Color = clrFrameExDisable; + }else { + Canvas->Brush->Color = clrFrameExEnter; + Canvas->Pen->Color = clrFrameExEnter; + } + + int X,Y; + // + Y = 0; + X = PIXEL_EXTERNAL_FRAME ; + Canvas->MoveTo( X, Y ); + X = Width - PIXEL_EXTERNAL_FRAME ; + Canvas->LineTo( X, Y ); + // + Y = Height - PIXEL_EXTERNAL_FRAME ; + X = PIXEL_EXTERNAL_FRAME ; + Canvas->MoveTo( X, Y ); + X = Width - PIXEL_EXTERNAL_FRAME ; + Canvas->LineTo( X, Y ); + // + X = 0 ; + Y = PIXEL_EXTERNAL_FRAME ; + Canvas->MoveTo( X, Y ); + Y = Height - PIXEL_EXTERNAL_FRAME ; + Canvas->LineTo( X, Y ); + // + X = Width - PIXEL_EXTERNAL_FRAME ; + Y = PIXEL_EXTERNAL_FRAME ; + Canvas->MoveTo( X, Y ); + Y = Height - PIXEL_EXTERNAL_FRAME ; + Canvas->LineTo( X, Y ); + + //߿Բ + int iLPixl, iTPixl, iRPixl, iBPixl ; + TRect tmpRetPic = rectDraw; //ڲ򽥱ͼ + int iDistant = 1; //rightbottom - 1 + for(int i=0;i<4;i++) + { + // 4*4 + iLPixl = tmpRetPic.Left + i; + iTPixl = tmpRetPic.Top; + iRPixl = tmpRetPic.Right - i - iDistant; + iBPixl = tmpRetPic.Bottom - iDistant; + + if(EtatBtn == 3) + Canvas->Pen->Color = clrExFrameBoundDisable[i]; + else + Canvas->Pen->Color = clrExFrameBound[i]; + + Canvas->Pixels[iLPixl][iTPixl] = Canvas->Pen->Color; + Canvas->Pixels[iRPixl][iTPixl] = Canvas->Pen->Color; + Canvas->Pixels[iLPixl][iBPixl] = Canvas->Pen->Color; + Canvas->Pixels[iRPixl][iBPixl] = Canvas->Pen->Color; + + if(i>0){ //ÿǶԳ + iLPixl = tmpRetPic.Left; + iTPixl = tmpRetPic.Top + i; + iRPixl = tmpRetPic.Right - iDistant; + iBPixl = tmpRetPic.Bottom - i - iDistant; + Canvas->Pixels[iLPixl][iTPixl] = Canvas->Pen->Color; + Canvas->Pixels[iRPixl][iTPixl] = Canvas->Pen->Color; + Canvas->Pixels[iLPixl][iBPixl] = Canvas->Pen->Color; + Canvas->Pixels[iRPixl][iBPixl] = Canvas->Pen->Color; + } + } + //=================ڱ߿ + + //Բ + Canvas->Pen->Color = clrFrameNormal; + + tmpRet.Top = PIXEL_EXTERNAL_FRAME; + + tmpRet.left = PIXEL_EXTERNAL_FRAME; + Canvas->Pixels[tmpRet.left][tmpRet.top] = Canvas->Pen->Color; + + tmpRet.left = Width - PIXEL_EXTERNAL_FRAME - PIXEL_INTERNAL_FARME; + Canvas->Pixels[tmpRet.left][tmpRet.top] = Canvas->Pen->Color; + + ////////////// + tmpRet.Top = Height - PIXEL_EXTERNAL_FRAME - PIXEL_INTERNAL_FARME; + + tmpRet.left = PIXEL_EXTERNAL_FRAME; + Canvas->Pixels[tmpRet.left][tmpRet.top] = Canvas->Pen->Color; + + tmpRet.left = Width - PIXEL_EXTERNAL_FRAME - PIXEL_INTERNAL_FARME; + Canvas->Pixels[tmpRet.left][tmpRet.top] = Canvas->Pen->Color; + + // + Canvas->Pen->Color = clrFrameNormal; + + // + Y = PIXEL_EXTERNAL_FRAME; + X = PIXEL_EXTERNAL_FRAME + PIXEL_INTERNAL_FARME; + Canvas->MoveTo( X, Y ); + X = Width - PIXEL_EXTERNAL_FRAME - PIXEL_INTERNAL_FARME; + Canvas->LineTo( X, Y ); + // + Y = Height - PIXEL_EXTERNAL_FRAME - PIXEL_INTERNAL_FARME; + X = PIXEL_EXTERNAL_FRAME + PIXEL_INTERNAL_FARME; + Canvas->MoveTo( X, Y ); + X = Width - PIXEL_EXTERNAL_FRAME - PIXEL_INTERNAL_FARME; + Canvas->LineTo( X, Y ); + // + X = PIXEL_EXTERNAL_FRAME ; + Y = PIXEL_EXTERNAL_FRAME + PIXEL_INTERNAL_FARME; + Canvas->MoveTo( X, Y ); + Y = Height - PIXEL_EXTERNAL_FRAME - PIXEL_INTERNAL_FARME; + Canvas->LineTo( X, Y ); + // + X = Width - PIXEL_EXTERNAL_FRAME - PIXEL_INTERNAL_FARME; + Y = PIXEL_EXTERNAL_FRAME + PIXEL_INTERNAL_FARME; + Canvas->MoveTo( X, Y ); + Y = Height - PIXEL_EXTERNAL_FRAME - PIXEL_INTERNAL_FARME; + Canvas->LineTo( X, Y ); + + //==============ڲָ + Canvas->Pen->Color = clrLineNormal; + X = PIXEL_INTERNAL_RECTLEFT_RIGHT; + Y = PIXEL_EXTERNAL_FRAME + PIXEL_INTERNAL_FARME; + Canvas->MoveTo( X, Y ); + Y = Height - PIXEL_EXTERNAL_FRAME - PIXEL_INTERNAL_FARME; + Canvas->LineTo( X, Y ); + + //==============ڲ + if(3 == EtatBtn){ + Canvas->Brush->Color = clrRectDisable; + Canvas->Pen->Color = clrRectDisable; + }else{ + Canvas->Brush->Color = clrRectNormal; + Canvas->Pen->Color = clrRectNormal; + } + + tmpRet.Left = PIXEL_EXTERNAL_FRAME + PIXEL_INTERNAL_FARME; + tmpRet.Top = PIXEL_EXTERNAL_FRAME + PIXEL_INTERNAL_FARME; + tmpRet.Right = PIXEL_INTERNAL_RECTLEFT_RIGHT; + tmpRet.Bottom = Height - PIXEL_EXTERNAL_FRAME - PIXEL_INTERNAL_FARME; + + Canvas->Rectangle(tmpRet.Left, tmpRet.Top, + tmpRet.Right, tmpRet.Bottom); + + + //ڲұ + tmpRet.Left = PIXEL_INTERNAL_RECTLEFT_RIGHT + PIXEL_INTERNAL_DISPART; + tmpRet.Top = PIXEL_EXTERNAL_FRAME + PIXEL_INTERNAL_FARME; + tmpRet.Right = Width - PIXEL_EXTERNAL_FRAME - PIXEL_INTERNAL_FARME; + tmpRet.Bottom = Height - PIXEL_EXTERNAL_FRAME - PIXEL_INTERNAL_FARME; + + Canvas->Rectangle(tmpRet.Left, tmpRet.Top, + tmpRet.Right, tmpRet.Bottom); + + //ڲұ ͼ + tmpRet.Top = Height - PIXEL_EXTERNAL_FRAME - PIXEL_INTERNAL_FARME + - PIXEL_INTERNAL_RECTRIGHT_HEIGHT; + + if(3 != EtatBtn) + { + if(2 == EtatBtn) // down + { + TRect tmpRetPic = rectDraw; //ڲ򽥱ͼ + int iDistant = PIXEL_EXTERNAL_FRAME + PIXEL_INTERNAL_FARME; + tmpRetPic.Left += iDistant; + tmpRetPic.Top += iDistant; + tmpRetPic.Right -= iDistant; + tmpRetPic.Bottom -= iDistant; + + iDistant = 1; //rightbottom - 1 + + int iTmpAdd = 0;//clrCapArrowOpenBound ǰλ + for(int i=0; i<4; i++) + { + // + Canvas->Brush->Color = clrCapArrowOpenLine[i]; + Canvas->FrameRect(tmpRetPic); + + int iadd = 0;//clrCapArrowOpenBound ǰλ + for(int j=0; j<4-i; j++) { + + // 4*4 + iLPixl = tmpRetPic.Left + j; + iTPixl = tmpRetPic.Top; + iRPixl = tmpRetPic.Right - j - iDistant; + iBPixl = tmpRetPic.Bottom - iDistant; + + Canvas->Pen->Color = clrCapArrowOpenBound[iTmpAdd+j]; + Canvas->Pixels[iLPixl][iTPixl] = Canvas->Pen->Color; + Canvas->Pixels[iRPixl][iTPixl] = Canvas->Pen->Color; + Canvas->Pixels[iLPixl][iBPixl] = Canvas->Pen->Color; + Canvas->Pixels[iRPixl][iBPixl] = Canvas->Pen->Color; + + if(j>0){ //ÿǶԳ + iLPixl = tmpRetPic.Left; + iTPixl = tmpRetPic.Top + j; + iRPixl = tmpRetPic.Right - iDistant; + iBPixl = tmpRetPic.Bottom - j - iDistant; + Canvas->Pixels[iLPixl][iTPixl] = Canvas->Pen->Color; + Canvas->Pixels[iRPixl][iTPixl] = Canvas->Pen->Color; + Canvas->Pixels[iLPixl][iBPixl] = Canvas->Pen->Color; + Canvas->Pixels[iRPixl][iBPixl] = Canvas->Pen->Color; + } + + iadd++; + } + + iTmpAdd += iadd; + + tmpRetPic.Left += iDistant; + tmpRetPic.Top += iDistant; + tmpRetPic.Right -= iDistant; + tmpRetPic.Bottom -= iDistant; + } + + //ڲָ + Canvas->Pen->Color = clrLineNormal; + X = PIXEL_INTERNAL_RECTLEFT_RIGHT; + Y = PIXEL_EXTERNAL_FRAME + PIXEL_INTERNAL_FARME; + Canvas->MoveTo( X, Y ); + Y = Height - PIXEL_EXTERNAL_FRAME - PIXEL_INTERNAL_FARME; + Canvas->LineTo( X, Y ); + } + + if(EtatBtn == 2 || EtatBtn == 1) + Canvas->Draw( tmpRet.Left, tmpRet.Top, pTmpFoucusDraw ); + + if(EtatBtn == 0) + Canvas->Draw( tmpRet.Left, tmpRet.Top, pTmpDraw ); + } + + PaintCustomerText(); +} + +//--------------------------------------------------------------------------- +void __fastcall TCapButton::PaintCustomerText(void) +{ + int X,Y; + if( !FCaption.IsEmpty() ){ + if( EtatBtn==0 ){ + Canvas->Font->Color = CLR_TXT_NOR; + } + else if( EtatBtn==3 ){ + Canvas->Font->Color = CLR_TXT_DIS; + } + else{ + Canvas->Font->Color = CLR_TXT_HOT; + } + + //add by tj 2013/12/10 + Canvas->Brush->Style = bsClear; + String strCaption = FCaption; + TSize size = Canvas->TextExtent( strCaption ); + int nLen = strCaption.Length(); + + + if( !(0 == rtCaption.Height()) || FEnablePNG ) + { + if( size.Width > rtCaption.Width()) + { + nLen = nLen*rtCaption.Width()/size.Width ; + nLen -= 1; + + if(nLen <= 0){ + strCaption = strCaption.SubString(0, 1); + }else{ + strCaption = strCaption.SubString(0, nLen); + strCaption += ".."; + } + + size = Canvas->TextExtent( strCaption ); + } + + X = rtCaption.Left + ( rtCaption.Width()-size.Width )/2; + Y = rtCaption.Top + ( rtCaption.Height()-size.Height )/2; + + }else if(0 == rtCaption.Height()){ + + if( size.Width > PIXEL_TEXT_X) + { + nLen = nLen*(PIXEL_TEXT_X)/size.Width; + nLen -= 1; + + if(nLen <= 0){ + strCaption = strCaption.SubString(0, 1); + }else{ + strCaption = strCaption.SubString(0, nLen); + strCaption += ".."; + } + + size = Canvas->TextExtent( strCaption ); + } + + X = PIXLE_TEXT_LEFT_OFFSET + ( PIXEL_TEXT_X - size.Width )/2; + Y = ( Height-size.Height )/2; + } + + Canvas->TextOut( X, Y, strCaption ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TCapButton::IniColor(int nstate) +{ + int num; + if(nstate == EX_FRAME || nstate == ALL) { + //߿ + clrFrameExNormal = FBorderColor; + clrFrameExEnter = TransformColor(clrFrameExNormal, 20); + clrFrameExDisable= TransformColor(clrFrameExNormal, 20, false); + for(int i=3; i>=0; i--){ + clrExFrameBound[i] = TransformColor(clrFrameExNormal, 9*(3-i+1), false); + } + + for(int i=3; i>=0; i--){ + clrExFrameBoundDisable[i] = TransformColor(clrFrameExDisable, 9*(3-i+1), false); + } + } + + if(nstate == IN_FRAME || nstate == ALL){ + //ڱ߿ͷֽ + clrLineNormal = clrFrameNormal = FInterFrameColor; + } + + if(nstate == IN_RECT || nstate == ALL){ + //ڲ + clrRectNormal = FInterColor; + clrRectDisable = TransformColor(clrRectNormal, 26); + //Ǵңϵ + + num = 3; + for(int i=3; i>=0; i--){ + if(i==3) + clrCapArrowOpenLine[i] = TransformColor(clrRectNormal, num, false); + else + clrCapArrowOpenLine[i] = TransformColor(clrCapArrowOpenLine[i+1], num, false); + num++; + } + + num = 1; + int temp = 0; + for(int i=3; i>=0; i--){ + for(int j=i; j>=0; j--){ + clrCapArrowOpenBound[temp+j] = TransformColor(clrCapArrowOpenLine[3-i], num*(i-j+1), false); + } + temp += i+1; + } + } +} + +COLORREF __fastcall TCapButton::TransformColor(COLORREF icolor, int nNum, bool bplus) +{ + BYTE r,g,b; + + r = icolor&0xff; + g = (icolor&0xff00)>>8; + b = (icolor&0xff0000)>>16; + + if(bplus){ + r += nNum; + g += nNum; + b += nNum; + }else{ + r -= nNum; + g -= nNum; + b -= nNum; + } + + return RGB(r, g, b); +} +//--------------------------------------------------------------------------- + +void __fastcall TCapButton::SetBorderColor(TColor iBorderColor) +{ + FBorderColor = iBorderColor; + IniColor(EX_FRAME); + Invalidate(); +} +//--------------------------------------------------------------------------- + +void __fastcall TCapButton::SetInterFrameColor(TColor iInterFrameColor) +{ + FInterFrameColor = iInterFrameColor; + IniColor(IN_FRAME); + Invalidate(); +} +//--------------------------------------------------------------------------- + +void __fastcall TCapButton::SetInterColor(TColor iInterColor) +{ + FInterColor = iInterColor; + IniColor(IN_RECT); + Invalidate(); +} +//--------------------------------------------------------------------------- diff --git a/Component/CapButton/CapButton.h b/Component/CapButton/CapButton.h new file mode 100644 index 0000000..3513466 --- /dev/null +++ b/Component/CapButton/CapButton.h @@ -0,0 +1,139 @@ +//--------------------------------------------------------------------------- +#ifndef CapButtonH +#define CapButtonH +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include +#include +//--------------------------------------------------------------------------- +class PACKAGE TCapButton : public TGraphicControl +{ +public: + enum TModalResult{ + mrNone = System::Int8(0x0), + mrOk = System::Int8(0x1), + mrCancel = System::Int8(0x2), + mrAbort = System::Int8(0x3), + mrRetry = System::Int8(0x4), + mrIgnore = System::Int8(0x5), + mrYes = System::Int8(0x6), + mrNo = System::Int8(0x7), + mrClose = System::Int8(0x8), + mrHelp = System::Int8(0x9), + mrTryAgain = System::Int8(0xa), + mrContinue = System::Int8(0xb), + mrAll = System::Int8(0xc), + mrNoToAll = System::Int8(0xd), + mrYesToAll = System::Int8(0xe) + }; + +private: + COLORREF + clrFrameExNormal, + clrFrameExEnter, + clrFrameExDisable, + clrFrameNormal, + clrLineNormal, + clrRectNormal, + clrRectDisable, + clrCapArrowOpenBound[10], + clrCapArrowOpenLine[4], + clrExFrameBound[4], + clrExFrameBoundDisable[4]; + + TColor FBorderColor; + TColor FInterFrameColor; + TColor FInterColor; + + void __fastcall IniColor(int nstate); + COLORREF __fastcall TransformColor(COLORREF icolor, int nNum=0, bool bplus=true); + void __fastcall SetBorderColor(TColor iBorderColor); + void __fastcall SetInterFrameColor(TColor iInterFrameColor); + void __fastcall SetInterColor(TColor iInterColor); +private: + String FCaption; + TNotifyEvent FOnMouseEnter;//on mouse enter notify event + TNotifyEvent FOnMouseLeave;//on mouse leave notify event +// System::Uitypes::TModalResult FModalResult; + TModalResult FModalResult; + + int __fastcall GetFontSize(); + + MESSAGE void __fastcall CMMouseEnter(Winapi::Messages::TMessage &Msg); // to know when mouse is entered + MESSAGE void __fastcall CMMouseLeave(Winapi::Messages::TMessage &Msg); // to know when mouse is leaved + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(CM_MOUSEENTER, TMessage, CMMouseEnter) + MESSAGE_HANDLER(CM_MOUSELEAVE, TMessage, CMMouseLeave) + END_MESSAGE_MAP(TGraphicControl) + +protected: + bool FEnablePNG; //ǷpngʽͼƬ + bool FDown; // value to know if we painting mouse down + int EtatBtn; // 0=Normal 1=Mouse entered 2=Pressed 3=Disabled + int FStateCount; + Vcl::Imaging::Pngimage::TPngImage *FPngImg; //our 4 states image + + DYNAMIC void __fastcall MouseDown(System::Uitypes::TMouseButton Button, System::Classes::TShiftState Shift, int X, int Y); + DYNAMIC void __fastcall MouseUp(System::Uitypes::TMouseButton Button, System::Classes::TShiftState Shift, int X, int Y); + virtual void __fastcall SetEnabled(bool Value); + +public: + + __fastcall virtual TCapButton(System::Classes::TComponent* AOwner); + __fastcall virtual ~TCapButton(void); + + void __fastcall SetStateCount( int count ); + void __fastcall SetPngImg(Vcl::Imaging::Pngimage::TPngImage *value); // we set the png image + void __fastcall SetDown(bool value); // to know if mouse is down or not + void __fastcall SetEnablePNG(bool Value);// to know if customer set png img + void __fastcall SetCaption(String Value); + virtual void __fastcall Paint(void); // override the painting of the component + DYNAMIC void __fastcall Click(void); + +__published: + + __property Action; + __property Anchors = {default=3}; + __property bool Down = {read=FDown, write=SetDown, default=False}; + __property Enabled = {default=1}; + __property int ImgStates = {read=FStateCount, write=SetStateCount, default=4}; +// __property System::Uitypes::TModalResult ModalResult = {read=FModalResult, write=FModalResult, default=0}; + __property TModalResult ModalResult = {read=FModalResult, write=FModalResult, default=0}; + __property ParentShowHint = {default=1}; + __property Vcl::Imaging::Pngimage::TPngImage *PngImg = {read=FPngImg, write=SetPngImg}; + __property PopupMenu; + __property ShowHint; + __property Visible = {default=1}; + __property OnClick; + __property OnContextPopup; + __property OnMouseDown; + __property OnMouseMove; + __property OnMouseUp; + __property System::Classes::TNotifyEvent OnMouseEnter = {read=FOnMouseEnter, write=FOnMouseEnter}; + __property System::Classes::TNotifyEvent OnMouseLeave = {read=FOnMouseLeave, write=FOnMouseLeave}; + __property bool EnablePNG = {read=FEnablePNG, write=SetEnablePNG, default=False}; + __property TColor BorderColor = {read=FBorderColor, write=SetBorderColor, default=TColor(0x83807d)}; + __property TColor InterFrameColor = {read=FInterFrameColor, write=SetInterFrameColor, default=TColor(0x302e2c)}; + __property TColor InterColor = {read=FInterColor, write=SetInterColor, default=TColor(0x58504a)}; +private: + Vcl::Imaging::Pngimage::TPngImage *m_pPngButton, *m_pPngFoucusButton; + Vcl::Imaging::Pngimage::TPngImage *pTmpDraw, *pTmpFoucusDraw; + void __fastcall PaintCustomer(void); + void __fastcall PaintCustomerText(void); + +public: + TRect rtCaption; + + void __fastcall SetFontSize( int value ); + void __fastcall SetFont(String name, int size ); + +__published: + __property String Caption = {read=FCaption, write=FCaption}; + __property int FontSize = {read=GetFontSize, write=SetFontSize, default=8}; +}; +//--------------------------------------------------------------------------- +#endif diff --git a/Component/CapButton/TCapButton.cpp b/Component/CapButton/TCapButton.cpp new file mode 100644 index 0000000..c2815fb --- /dev/null +++ b/Component/CapButton/TCapButton.cpp @@ -0,0 +1,17 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop +#pragma package(smart_init) +//--------------------------------------------------------------------------- + +// Package source. +//--------------------------------------------------------------------------- + + +#pragma argsused +extern "C" int _libmain(unsigned long reason) +{ + return 1; +} +//--------------------------------------------------------------------------- diff --git a/Component/CheckBox/CKBox.cpp b/Component/CheckBox/CKBox.cpp new file mode 100644 index 0000000..b58b21c --- /dev/null +++ b/Component/CheckBox/CKBox.cpp @@ -0,0 +1,664 @@ +//--------------------------------------------------------------------------- + +#pragma hdrstop + +#include "CKBox.h" +#include +//--------------------------------------------------------------------------- +#pragma package(smart_init) + +static inline void ValidCtrCheck(TCKBox *) +{ + new TCKBox(NULL); +} + +#define BOX_RECT RGB( 145, 156, 170 ) +#define CLR_ENABLED RGB( 100, 108, 119 ) +#define CLR_ENABLED_1 RGB( 119, 129, 130 ) +#define CLR_CAPTION RGB( 172, 184, 200 ) + +#define RET_LEFT 4 +#define RET_W 10 + +#define CLR_RECT_1_1 RGB( 100, 108, 119 ) //bMouse +#define CLR_RECT_1_2 RGB( 87,96,111 ) + +//#define CLR_RECT_2_1 RGB( 102,113,130 ) // bMouse&&!FCheck +//#define CLR_RECT_2_2 RGB( 43,46,51 ) //Check +//#define CLR_RECT_2_3 RGB( 77,85,100 ) //Nor + +#define MIN_H 6 +#define MIN_W 11 + +const static char pngImageCheck[] = { +0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00, +0x0d,0x49,0x48,0x44,0x52,0x00,0x00,0x00,0x0c,0x00, +0x00,0x00,0x0b,0x08,0x06,0x00,0x00,0x00,0x4b,0x70, +0x6c,0x5f,0x00,0x00,0x00,0x09,0x70,0x48,0x59,0x73, +0x00,0x00,0x0b,0x13,0x00,0x00,0x0b,0x13,0x01,0x00, +0x9a,0x9c,0x18,0x00,0x00,0x0a,0x4d,0x69,0x43,0x43, +0x50,0x50,0x68,0x6f,0x74,0x6f,0x73,0x68,0x6f,0x70, +0x20,0x49,0x43,0x43,0x20,0x70,0x72,0x6f,0x66,0x69, +0x6c,0x65,0x00,0x00,0x78,0xda,0x9d,0x53,0x77,0x58, +0x93,0xf7,0x16,0x3e,0xdf,0xf7,0x65,0x0f,0x56,0x42, +0xd8,0xf0,0xb1,0x97,0x6c,0x81,0x00,0x22,0x23,0xac, +0x08,0xc8,0x10,0x59,0xa2,0x10,0x92,0x00,0x61,0x84, +0x10,0x12,0x40,0xc5,0x85,0x88,0x0a,0x56,0x14,0x15, +0x11,0x9c,0x48,0x55,0xc4,0x82,0xd5,0x0a,0x48,0x9d, +0x88,0xe2,0xa0,0x28,0xb8,0x67,0x41,0x8a,0x88,0x5a, +0x8b,0x55,0x5c,0x38,0xee,0x1f,0xdc,0xa7,0xb5,0x7d, +0x7a,0xef,0xed,0xed,0xfb,0xd7,0xfb,0xbc,0xe7,0x9c, +0xe7,0xfc,0xce,0x79,0xcf,0x0f,0x80,0x11,0x12,0x26, +0x91,0xe6,0xa2,0x6a,0x00,0x39,0x52,0x85,0x3c,0x3a, +0xd8,0x1f,0x8f,0x4f,0x48,0xc4,0xc9,0xbd,0x80,0x02, +0x15,0x48,0xe0,0x04,0x20,0x10,0xe6,0xcb,0xc2,0x67, +0x05,0xc5,0x00,0x00,0xf0,0x03,0x79,0x78,0x7e,0x74, +0xb0,0x3f,0xfc,0x01,0xaf,0x6f,0x00,0x02,0x00,0x70, +0xd5,0x2e,0x24,0x12,0xc7,0xe1,0xff,0x83,0xba,0x50, +0x26,0x57,0x00,0x20,0x91,0x00,0xe0,0x22,0x12,0xe7, +0x0b,0x01,0x90,0x52,0x00,0xc8,0x2e,0x54,0xc8,0x14, +0x00,0xc8,0x18,0x00,0xb0,0x53,0xb3,0x64,0x0a,0x00, +0x94,0x00,0x00,0x6c,0x79,0x7c,0x42,0x22,0x00,0xaa, +0x0d,0x00,0xec,0xf4,0x49,0x3e,0x05,0x00,0xd8,0xa9, +0x93,0xdc,0x17,0x00,0xd8,0xa2,0x1c,0xa9,0x08,0x00, +0x8d,0x01,0x00,0x99,0x28,0x47,0x24,0x02,0x40,0xbb, +0x00,0x60,0x55,0x81,0x52,0x2c,0x02,0xc0,0xc2,0x00, +0xa0,0xac,0x40,0x22,0x2e,0x04,0xc0,0xae,0x01,0x80, +0x59,0xb6,0x32,0x47,0x02,0x80,0xbd,0x05,0x00,0x76, +0x8e,0x58,0x90,0x0f,0x40,0x60,0x00,0x80,0x99,0x42, +0x2c,0xcc,0x00,0x20,0x38,0x02,0x00,0x43,0x1e,0x13, +0xcd,0x03,0x20,0x4c,0x03,0xa0,0x30,0xd2,0xbf,0xe0, +0xa9,0x5f,0x70,0x85,0xb8,0x48,0x01,0x00,0xc0,0xcb, +0x95,0xcd,0x97,0x4b,0xd2,0x33,0x14,0xb8,0x95,0xd0, +0x1a,0x77,0xf2,0xf0,0xe0,0xe2,0x21,0xe2,0xc2,0x6c, +0xb1,0x42,0x61,0x17,0x29,0x10,0x66,0x09,0xe4,0x22, +0x9c,0x97,0x9b,0x23,0x13,0x48,0xe7,0x03,0x4c,0xce, +0x0c,0x00,0x00,0x1a,0xf9,0xd1,0xc1,0xfe,0x38,0x3f, +0x90,0xe7,0xe6,0xe4,0xe1,0xe6,0x66,0xe7,0x6c,0xef, +0xf4,0xc5,0xa2,0xfe,0x6b,0xf0,0x6f,0x22,0x3e,0x21, +0xf1,0xdf,0xfe,0xbc,0x8c,0x02,0x04,0x00,0x10,0x4e, +0xcf,0xef,0xda,0x5f,0xe5,0xe5,0xd6,0x03,0x70,0xc7, +0x01,0xb0,0x75,0xbf,0x6b,0xa9,0x5b,0x00,0xda,0x56, +0x00,0x68,0xdf,0xf9,0x5d,0x33,0xdb,0x09,0xa0,0x5a, +0x0a,0xd0,0x7a,0xf9,0x8b,0x79,0x38,0xfc,0x40,0x1e, +0x9e,0xa1,0x50,0xc8,0x3c,0x1d,0x1c,0x0a,0x0b,0x0b, +0xed,0x25,0x62,0xa1,0xbd,0x30,0xe3,0x8b,0x3e,0xff, +0x33,0xe1,0x6f,0xe0,0x8b,0x7e,0xf6,0xfc,0x40,0x1e, +0xfe,0xdb,0x7a,0xf0,0x00,0x71,0x9a,0x40,0x99,0xad, +0xc0,0xa3,0x83,0xfd,0x71,0x61,0x6e,0x76,0xae,0x52, +0x8e,0xe7,0xcb,0x04,0x42,0x31,0x6e,0xf7,0xe7,0x23, +0xfe,0xc7,0x85,0x7f,0xfd,0x8e,0x29,0xd1,0xe2,0x34, +0xb1,0x5c,0x2c,0x15,0x8a,0xf1,0x58,0x89,0xb8,0x50, +0x22,0x4d,0xc7,0x79,0xb9,0x52,0x91,0x44,0x21,0xc9, +0x95,0xe2,0x12,0xe9,0x7f,0x32,0xf1,0x1f,0x96,0xfd, +0x09,0x93,0x77,0x0d,0x00,0xac,0x86,0x4f,0xc0,0x4e, +0xb6,0x07,0xb5,0xcb,0x6c,0xc0,0x7e,0xee,0x01,0x02, +0x8b,0x0e,0x58,0xd2,0x76,0x00,0x40,0x7e,0xf3,0x2d, +0x8c,0x1a,0x0b,0x91,0x00,0x10,0x67,0x34,0x32,0x79, +0xf7,0x00,0x00,0x93,0xbf,0xf9,0x8f,0x40,0x2b,0x01, +0x00,0xcd,0x97,0xa4,0xe3,0x00,0x00,0xbc,0xe8,0x18, +0x5c,0xa8,0x94,0x17,0x4c,0xc6,0x08,0x00,0x00,0x44, +0xa0,0x81,0x2a,0xb0,0x41,0x07,0x0c,0xc1,0x14,0xac, +0xc0,0x0e,0x9c,0xc1,0x1d,0xbc,0xc0,0x17,0x02,0x61, +0x06,0x44,0x40,0x0c,0x24,0xc0,0x3c,0x10,0x42,0x06, +0xe4,0x80,0x1c,0x0a,0xa1,0x18,0x96,0x41,0x19,0x54, +0xc0,0x3a,0xd8,0x04,0xb5,0xb0,0x03,0x1a,0xa0,0x11, +0x9a,0xe1,0x10,0xb4,0xc1,0x31,0x38,0x0d,0xe7,0xe0, +0x12,0x5c,0x81,0xeb,0x70,0x17,0x06,0x60,0x18,0x9e, +0xc2,0x18,0xbc,0x86,0x09,0x04,0x41,0xc8,0x08,0x13, +0x61,0x21,0x3a,0x88,0x11,0x62,0x8e,0xd8,0x22,0xce, +0x08,0x17,0x99,0x8e,0x04,0x22,0x61,0x48,0x34,0x92, +0x80,0xa4,0x20,0xe9,0x88,0x14,0x51,0x22,0xc5,0xc8, +0x72,0xa4,0x02,0xa9,0x42,0x6a,0x91,0x5d,0x48,0x23, +0xf2,0x2d,0x72,0x14,0x39,0x8d,0x5c,0x40,0xfa,0x90, +0xdb,0xc8,0x20,0x32,0x8a,0xfc,0x8a,0xbc,0x47,0x31, +0x94,0x81,0xb2,0x51,0x03,0xd4,0x02,0x75,0x40,0xb9, +0xa8,0x1f,0x1a,0x8a,0xc6,0xa0,0x73,0xd1,0x74,0x34, +0x0f,0x5d,0x80,0x96,0xa2,0x6b,0xd1,0x1a,0xb4,0x1e, +0x3d,0x80,0xb6,0xa2,0xa7,0xd1,0x4b,0xe8,0x75,0x74, +0x00,0x7d,0x8a,0x8e,0x63,0x80,0xd1,0x31,0x0e,0x66, +0x8c,0xd9,0x61,0x5c,0x8c,0x87,0x45,0x60,0x89,0x58, +0x1a,0x26,0xc7,0x16,0x63,0xe5,0x58,0x35,0x56,0x8f, +0x35,0x63,0x1d,0x58,0x37,0x76,0x15,0x1b,0xc0,0x9e, +0x61,0xef,0x08,0x24,0x02,0x8b,0x80,0x13,0xec,0x08, +0x5e,0x84,0x10,0xc2,0x6c,0x82,0x90,0x90,0x47,0x58, +0x4c,0x58,0x43,0xa8,0x25,0xec,0x23,0xb4,0x12,0xba, +0x08,0x57,0x09,0x83,0x84,0x31,0xc2,0x27,0x22,0x93, +0xa8,0x4f,0xb4,0x25,0x7a,0x12,0xf9,0xc4,0x78,0x62, +0x3a,0xb1,0x90,0x58,0x46,0xac,0x26,0xee,0x21,0x1e, +0x21,0x9e,0x25,0x5e,0x27,0x0e,0x13,0x5f,0x93,0x48, +0x24,0x0e,0xc9,0x92,0xe4,0x4e,0x0a,0x21,0x25,0x90, +0x32,0x49,0x0b,0x49,0x6b,0x48,0xdb,0x48,0x2d,0xa4, +0x53,0xa4,0x3e,0xd2,0x10,0x69,0x9c,0x4c,0x26,0xeb, +0x90,0x6d,0xc9,0xde,0xe4,0x08,0xb2,0x80,0xac,0x20, +0x97,0x91,0xb7,0x90,0x0f,0x90,0x4f,0x92,0xfb,0xc9, +0xc3,0xe4,0xb7,0x14,0x3a,0xc5,0x88,0xe2,0x4c,0x09, +0xa2,0x24,0x52,0xa4,0x94,0x12,0x4a,0x35,0x65,0x3f, +0xe5,0x04,0xa5,0x9f,0x32,0x42,0x99,0xa0,0xaa,0x51, +0xcd,0xa9,0x9e,0xd4,0x08,0xaa,0x88,0x3a,0x9f,0x5a, +0x49,0x6d,0xa0,0x76,0x50,0x2f,0x53,0x87,0xa9,0x13, +0x34,0x75,0x9a,0x25,0xcd,0x9b,0x16,0x43,0xcb,0xa4, +0x2d,0xa3,0xd5,0xd0,0x9a,0x69,0x67,0x69,0xf7,0x68, +0x2f,0xe9,0x74,0xba,0x09,0xdd,0x83,0x1e,0x45,0x97, +0xd0,0x97,0xd2,0x6b,0xe8,0x07,0xe9,0xe7,0xe9,0x83, +0xf4,0x77,0x0c,0x0d,0x86,0x0d,0x83,0xc7,0x48,0x62, +0x28,0x19,0x6b,0x19,0x7b,0x19,0xa7,0x18,0xb7,0x19, +0x2f,0x99,0x4c,0xa6,0x05,0xd3,0x97,0x99,0xc8,0x54, +0x30,0xd7,0x32,0x1b,0x99,0x67,0x98,0x0f,0x98,0x6f, +0x55,0x58,0x2a,0xf6,0x2a,0x7c,0x15,0x91,0xca,0x12, +0x95,0x3a,0x95,0x56,0x95,0x7e,0x95,0xe7,0xaa,0x54, +0x55,0x73,0x55,0x3f,0xd5,0x79,0xaa,0x0b,0x54,0xab, +0x55,0x0f,0xab,0x5e,0x56,0x7d,0xa6,0x46,0x55,0xb3, +0x50,0xe3,0xa9,0x09,0xd4,0x16,0xab,0xd5,0xa9,0x1d, +0x55,0xbb,0xa9,0x36,0xae,0xce,0x52,0x77,0x52,0x8f, +0x50,0xcf,0x51,0x5f,0xa3,0xbe,0x5f,0xfd,0x82,0xfa, +0x63,0x0d,0xb2,0x86,0x85,0x46,0xa0,0x86,0x48,0xa3, +0x54,0x63,0xb7,0xc6,0x19,0x8d,0x21,0x16,0xc6,0x32, +0x65,0xf1,0x58,0x42,0xd6,0x72,0x56,0x03,0xeb,0x2c, +0x6b,0x98,0x4d,0x62,0x5b,0xb2,0xf9,0xec,0x4c,0x76, +0x05,0xfb,0x1b,0x76,0x2f,0x7b,0x4c,0x53,0x43,0x73, +0xaa,0x66,0xac,0x66,0x91,0x66,0x9d,0xe6,0x71,0xcd, +0x01,0x0e,0xc6,0xb1,0xe0,0xf0,0x39,0xd9,0x9c,0x4a, +0xce,0x21,0xce,0x0d,0xce,0x7b,0x2d,0x03,0x2d,0x3f, +0x2d,0xb1,0xd6,0x6a,0xad,0x66,0xad,0x7e,0xad,0x37, +0xda,0x7a,0xda,0xbe,0xda,0x62,0xed,0x72,0xed,0x16, +0xed,0xeb,0xda,0xef,0x75,0x70,0x9d,0x40,0x9d,0x2c, +0x9d,0xf5,0x3a,0x6d,0x3a,0xf7,0x75,0x09,0xba,0x36, +0xba,0x51,0xba,0x85,0xba,0xdb,0x75,0xcf,0xea,0x3e, +0xd3,0x63,0xeb,0x79,0xe9,0x09,0xf5,0xca,0xf5,0x0e, +0xe9,0xdd,0xd1,0x47,0xf5,0x6d,0xf4,0xa3,0xf5,0x17, +0xea,0xef,0xd6,0xef,0xd1,0x1f,0x37,0x30,0x34,0x08, +0x36,0x90,0x19,0x6c,0x31,0x38,0x63,0xf0,0xcc,0x90, +0x63,0xe8,0x6b,0x98,0x69,0xb8,0xd1,0xf0,0x84,0xe1, +0xa8,0x11,0xcb,0x68,0xba,0x91,0xc4,0x68,0xa3,0xd1, +0x49,0xa3,0x27,0xb8,0x26,0xee,0x87,0x67,0xe3,0x35, +0x78,0x17,0x3e,0x66,0xac,0x6f,0x1c,0x62,0xac,0x34, +0xde,0x65,0xdc,0x6b,0x3c,0x61,0x62,0x69,0x32,0xdb, +0xa4,0xc4,0xa4,0xc5,0xe4,0xbe,0x29,0xcd,0x94,0x6b, +0x9a,0x66,0xba,0xd1,0xb4,0xd3,0x74,0xcc,0xcc,0xc8, +0x2c,0xdc,0xac,0xd8,0xac,0xc9,0xec,0x8e,0x39,0xd5, +0x9c,0x6b,0x9e,0x61,0xbe,0xd9,0xbc,0xdb,0xfc,0x8d, +0x85,0xa5,0x45,0x9c,0xc5,0x4a,0x8b,0x36,0x8b,0xc7, +0x96,0xda,0x96,0x7c,0xcb,0x05,0x96,0x4d,0x96,0xf7, +0xac,0x98,0x56,0x3e,0x56,0x79,0x56,0xf5,0x56,0xd7, +0xac,0x49,0xd6,0x5c,0xeb,0x2c,0xeb,0x6d,0xd6,0x57, +0x6c,0x50,0x1b,0x57,0x9b,0x0c,0x9b,0x3a,0x9b,0xcb, +0xb6,0xa8,0xad,0x9b,0xad,0xc4,0x76,0x9b,0x6d,0xdf, +0x14,0xe2,0x14,0x8f,0x29,0xd2,0x29,0xf5,0x53,0x6e, +0xda,0x31,0xec,0xfc,0xec,0x0a,0xec,0x9a,0xec,0x06, +0xed,0x39,0xf6,0x61,0xf6,0x25,0xf6,0x6d,0xf6,0xcf, +0x1d,0xcc,0x1c,0x12,0x1d,0xd6,0x3b,0x74,0x3b,0x7c, +0x72,0x74,0x75,0xcc,0x76,0x6c,0x70,0xbc,0xeb,0xa4, +0xe1,0x34,0xc3,0xa9,0xc4,0xa9,0xc3,0xe9,0x57,0x67, +0x1b,0x67,0xa1,0x73,0x9d,0xf3,0x35,0x17,0xa6,0x4b, +0x90,0xcb,0x12,0x97,0x76,0x97,0x17,0x53,0x6d,0xa7, +0x8a,0xa7,0x6e,0x9f,0x7a,0xcb,0x95,0xe5,0x1a,0xee, +0xba,0xd2,0xb5,0xd3,0xf5,0xa3,0x9b,0xbb,0x9b,0xdc, +0xad,0xd9,0x6d,0xd4,0xdd,0xcc,0x3d,0xc5,0x7d,0xab, +0xfb,0x4d,0x2e,0x9b,0x1b,0xc9,0x5d,0xc3,0x3d,0xef, +0x41,0xf4,0xf0,0xf7,0x58,0xe2,0x71,0xcc,0xe3,0x9d, +0xa7,0x9b,0xa7,0xc2,0xf3,0x90,0xe7,0x2f,0x5e,0x76, +0x5e,0x59,0x5e,0xfb,0xbd,0x1e,0x4f,0xb3,0x9c,0x26, +0x9e,0xd6,0x30,0x6d,0xc8,0xdb,0xc4,0x5b,0xe0,0xbd, +0xcb,0x7b,0x60,0x3a,0x3e,0x3d,0x65,0xfa,0xce,0xe9, +0x03,0x3e,0xc6,0x3e,0x02,0x9f,0x7a,0x9f,0x87,0xbe, +0xa6,0xbe,0x22,0xdf,0x3d,0xbe,0x23,0x7e,0xd6,0x7e, +0x99,0x7e,0x07,0xfc,0x9e,0xfb,0x3b,0xfa,0xcb,0xfd, +0x8f,0xf8,0xbf,0xe1,0x79,0xf2,0x16,0xf1,0x4e,0x05, +0x60,0x01,0xc1,0x01,0xe5,0x01,0xbd,0x81,0x1a,0x81, +0xb3,0x03,0x6b,0x03,0x1f,0x04,0x99,0x04,0xa5,0x07, +0x35,0x05,0x8d,0x05,0xbb,0x06,0x2f,0x0c,0x3e,0x15, +0x42,0x0c,0x09,0x0d,0x59,0x1f,0x72,0x93,0x6f,0xc0, +0x17,0xf2,0x1b,0xf9,0x63,0x33,0xdc,0x67,0x2c,0x9a, +0xd1,0x15,0xca,0x08,0x9d,0x15,0x5a,0x1b,0xfa,0x30, +0xcc,0x26,0x4c,0x1e,0xd6,0x11,0x8e,0x86,0xcf,0x08, +0xdf,0x10,0x7e,0x6f,0xa6,0xf9,0x4c,0xe9,0xcc,0xb6, +0x08,0x88,0xe0,0x47,0x6c,0x88,0xb8,0x1f,0x69,0x19, +0x99,0x17,0xf9,0x7d,0x14,0x29,0x2a,0x32,0xaa,0x2e, +0xea,0x51,0xb4,0x53,0x74,0x71,0x74,0xf7,0x2c,0xd6, +0xac,0xe4,0x59,0xfb,0x67,0xbd,0x8e,0xf1,0x8f,0xa9, +0x8c,0xb9,0x3b,0xdb,0x6a,0xb6,0x72,0x76,0x67,0xac, +0x6a,0x6c,0x52,0x6c,0x63,0xec,0x9b,0xb8,0x80,0xb8, +0xaa,0xb8,0x81,0x78,0x87,0xf8,0x45,0xf1,0x97,0x12, +0x74,0x13,0x24,0x09,0xed,0x89,0xe4,0xc4,0xd8,0xc4, +0x3d,0x89,0xe3,0x73,0x02,0xe7,0x6c,0x9a,0x33,0x9c, +0xe4,0x9a,0x54,0x96,0x74,0x63,0xae,0xe5,0xdc,0xa2, +0xb9,0x17,0xe6,0xe9,0xce,0xcb,0x9e,0x77,0x3c,0x59, +0x35,0x59,0x90,0x7c,0x38,0x85,0x98,0x12,0x97,0xb2, +0x3f,0xe5,0x83,0x20,0x42,0x50,0x2f,0x18,0x4f,0xe5, +0xa7,0x6e,0x4d,0x1d,0x13,0xf2,0x84,0x9b,0x85,0x4f, +0x45,0xbe,0xa2,0x8d,0xa2,0x51,0xb1,0xb7,0xb8,0x4a, +0x3c,0x92,0xe6,0x9d,0x56,0x95,0xf6,0x38,0xdd,0x3b, +0x7d,0x43,0xfa,0x68,0x86,0x4f,0x46,0x75,0xc6,0x33, +0x09,0x4f,0x52,0x2b,0x79,0x91,0x19,0x92,0xb9,0x23, +0xf3,0x4d,0x56,0x44,0xd6,0xde,0xac,0xcf,0xd9,0x71, +0xd9,0x2d,0x39,0x94,0x9c,0x94,0x9c,0xa3,0x52,0x0d, +0x69,0x96,0xb4,0x2b,0xd7,0x30,0xb7,0x28,0xb7,0x4f, +0x66,0x2b,0x2b,0x93,0x0d,0xe4,0x79,0xe6,0x6d,0xca, +0x1b,0x93,0x87,0xca,0xf7,0xe4,0x23,0xf9,0x73,0xf3, +0xdb,0x15,0x6c,0x85,0x4c,0xd1,0xa3,0xb4,0x52,0xae, +0x50,0x0e,0x16,0x4c,0x2f,0xa8,0x2b,0x78,0x5b,0x18, +0x5b,0x78,0xb8,0x48,0xbd,0x48,0x5a,0xd4,0x33,0xdf, +0x66,0xfe,0xea,0xf9,0x23,0x0b,0x82,0x16,0x7c,0xbd, +0x90,0xb0,0x50,0xb8,0xb0,0xb3,0xd8,0xb8,0x78,0x59, +0xf1,0xe0,0x22,0xbf,0x45,0xbb,0x16,0x23,0x8b,0x53, +0x17,0x77,0x2e,0x31,0x5d,0x52,0xba,0x64,0x78,0x69, +0xf0,0xd2,0x7d,0xcb,0x68,0xcb,0xb2,0x96,0xfd,0x50, +0xe2,0x58,0x52,0x55,0xf2,0x6a,0x79,0xdc,0xf2,0x8e, +0x52,0x83,0xd2,0xa5,0xa5,0x43,0x2b,0x82,0x57,0x34, +0x95,0xa9,0x94,0xc9,0xcb,0x6e,0xae,0xf4,0x5a,0xb9, +0x63,0x15,0x61,0x95,0x64,0x55,0xef,0x6a,0x97,0xd5, +0x5b,0x56,0x7f,0x2a,0x17,0x95,0x5f,0xac,0x70,0xac, +0xa8,0xae,0xf8,0xb0,0x46,0xb8,0xe6,0xe2,0x57,0x4e, +0x5f,0xd5,0x7c,0xf5,0x79,0x6d,0xda,0xda,0xde,0x4a, +0xb7,0xca,0xed,0xeb,0x48,0xeb,0xa4,0xeb,0x6e,0xac, +0xf7,0x59,0xbf,0xaf,0x4a,0xbd,0x6a,0x41,0xd5,0xd0, +0x86,0xf0,0x0d,0xad,0x1b,0xf1,0x8d,0xe5,0x1b,0x5f, +0x6d,0x4a,0xde,0x74,0xa1,0x7a,0x6a,0xf5,0x8e,0xcd, +0xb4,0xcd,0xca,0xcd,0x03,0x35,0x61,0x35,0xed,0x5b, +0xcc,0xb6,0xac,0xdb,0xf2,0xa1,0x36,0xa3,0xf6,0x7a, +0x9d,0x7f,0x5d,0xcb,0x56,0xfd,0xad,0xab,0xb7,0xbe, +0xd9,0x26,0xda,0xd6,0xbf,0xdd,0x77,0x7b,0xf3,0x0e, +0x83,0x1d,0x15,0x3b,0xde,0xef,0x94,0xec,0xbc,0xb5, +0x2b,0x78,0x57,0x6b,0xbd,0x45,0x7d,0xf5,0x6e,0xd2, +0xee,0x82,0xdd,0x8f,0x1a,0x62,0x1b,0xba,0xbf,0xe6, +0x7e,0xdd,0xb8,0x47,0x77,0x4f,0xc5,0x9e,0x8f,0x7b, +0xa5,0x7b,0x07,0xf6,0x45,0xef,0xeb,0x6a,0x74,0x6f, +0x6c,0xdc,0xaf,0xbf,0xbf,0xb2,0x09,0x6d,0x52,0x36, +0x8d,0x1e,0x48,0x3a,0x70,0xe5,0x9b,0x80,0x6f,0xda, +0x9b,0xed,0x9a,0x77,0xb5,0x70,0x5a,0x2a,0x0e,0xc2, +0x41,0xe5,0xc1,0x27,0xdf,0xa6,0x7c,0x7b,0xe3,0x50, +0xe8,0xa1,0xce,0xc3,0xdc,0xc3,0xcd,0xdf,0x99,0x7f, +0xb7,0xf5,0x08,0xeb,0x48,0x79,0x2b,0xd2,0x3a,0xbf, +0x75,0xac,0x2d,0xa3,0x6d,0xa0,0x3d,0xa1,0xbd,0xef, +0xe8,0x8c,0xa3,0x9d,0x1d,0x5e,0x1d,0x47,0xbe,0xb7, +0xff,0x7e,0xef,0x31,0xe3,0x63,0x75,0xc7,0x35,0x8f, +0x57,0x9e,0xa0,0x9d,0x28,0x3d,0xf1,0xf9,0xe4,0x82, +0x93,0xe3,0xa7,0x64,0xa7,0x9e,0x9d,0x4e,0x3f,0x3d, +0xd4,0x99,0xdc,0x79,0xf7,0x4c,0xfc,0x99,0x6b,0x5d, +0x51,0x5d,0xbd,0x67,0x43,0xcf,0x9e,0x3f,0x17,0x74, +0xee,0x4c,0xb7,0x5f,0xf7,0xc9,0xf3,0xde,0xe7,0x8f, +0x5d,0xf0,0xbc,0x70,0xf4,0x22,0xf7,0x62,0xdb,0x25, +0xb7,0x4b,0xad,0x3d,0xae,0x3d,0x47,0x7e,0x70,0xfd, +0xe1,0x48,0xaf,0x5b,0x6f,0xeb,0x65,0xf7,0xcb,0xed, +0x57,0x3c,0xae,0x74,0xf4,0x4d,0xeb,0x3b,0xd1,0xef, +0xd3,0x7f,0xfa,0x6a,0xc0,0xd5,0x73,0xd7,0xf8,0xd7, +0x2e,0x5d,0x9f,0x79,0xbd,0xef,0xc6,0xec,0x1b,0xb7, +0x6e,0x26,0xdd,0x1c,0xb8,0x25,0xba,0xf5,0xf8,0x76, +0xf6,0xed,0x17,0x77,0x0a,0xee,0x4c,0xdc,0x5d,0x7a, +0x8f,0x78,0xaf,0xfc,0xbe,0xda,0xfd,0xea,0x07,0xfa, +0x0f,0xea,0x7f,0xb4,0xfe,0xb1,0x65,0xc0,0x6d,0xe0, +0xf8,0x60,0xc0,0x60,0xcf,0xc3,0x59,0x0f,0xef,0x0e, +0x09,0x87,0x9e,0xfe,0x94,0xff,0xd3,0x87,0xe1,0xd2, +0x47,0xcc,0x47,0xd5,0x23,0x46,0x23,0x8d,0x8f,0x9d, +0x1f,0x1f,0x1b,0x0d,0x1a,0xbd,0xf2,0x64,0xce,0x93, +0xe1,0xa7,0xb2,0xa7,0x13,0xcf,0xca,0x7e,0x56,0xff, +0x79,0xeb,0x73,0xab,0xe7,0xdf,0xfd,0xe2,0xfb,0x4b, +0xcf,0x58,0xfc,0xd8,0xf0,0x0b,0xf9,0x8b,0xcf,0xbf, +0xae,0x79,0xa9,0xf3,0x72,0xef,0xab,0xa9,0xaf,0x3a, +0xc7,0x23,0xc7,0x1f,0xbc,0xce,0x79,0x3d,0xf1,0xa6, +0xfc,0xad,0xce,0xdb,0x7d,0xef,0xb8,0xef,0xba,0xdf, +0xc7,0xbd,0x1f,0x99,0x28,0xfc,0x40,0xfe,0x50,0xf3, +0xd1,0xfa,0x63,0xc7,0xa7,0xd0,0x4f,0xf7,0x3e,0xe7, +0x7c,0xfe,0xfc,0x2f,0xf7,0x84,0xf3,0xfb,0x25,0xd2, +0x9f,0x33,0x00,0x00,0x00,0x20,0x63,0x48,0x52,0x4d, +0x00,0x00,0x7a,0x25,0x00,0x00,0x80,0x83,0x00,0x00, +0xf9,0xff,0x00,0x00,0x80,0xe9,0x00,0x00,0x75,0x30, +0x00,0x00,0xea,0x60,0x00,0x00,0x3a,0x98,0x00,0x00, +0x17,0x6f,0x92,0x5f,0xc5,0x46,0x00,0x00,0x00,0xd8, +0x49,0x44,0x41,0x54,0x78,0xda,0x8c,0xd1,0xbd,0x4a, +0xc4,0x60,0x10,0x85,0xe1,0x27,0x59,0x1b,0x51,0xb4, +0x12,0x94,0x05,0xc1,0x72,0x83,0x16,0x09,0x9a,0xb4, +0x6a,0x65,0x25,0x6c,0x25,0x78,0x0d,0x56,0xbb,0x95, +0xa5,0x9d,0x95,0x8d,0x20,0x78,0x03,0x62,0xab,0x78, +0x07,0x56,0x69,0xd2,0x2c,0x04,0xaf,0x62,0x5b,0xcb, +0xcf,0x26,0x81,0xcf,0x1f,0x88,0x03,0x53,0x9c,0xe1, +0x9d,0x19,0xe6,0x4c,0x12,0x42,0x30,0x14,0x59,0x51, +0x9d,0xe2,0x0d,0xaf,0xe9,0x3f,0xe0,0xb2,0x83,0x57, +0xb1,0x4c,0x07,0xe0,0x4d,0x3c,0x77,0x30,0x6c,0x0f, +0x6d,0x78,0xc4,0x5e,0xa4,0xc7,0x69,0x34,0x6d,0x3d, +0x2b,0xaa,0x83,0x48,0x5f,0xe2,0x22,0x82,0x6f,0x71, +0x9c,0x84,0x10,0x64,0x45,0x75,0x8e,0x07,0x2c,0x91, +0x63,0x84,0x8f,0x68,0xfa,0xbc,0x6d,0xea,0x3b,0x58, +0xc9,0x8a,0xea,0x1e,0x57,0xfd,0x4a,0x4c,0xb1,0x1b, +0xc1,0xd7,0x3d,0x0c,0xa3,0xad,0x9d,0xf1,0x3b,0xd6, +0x70,0x84,0x14,0xfb,0x38,0xc1,0x06,0x9e,0xda,0xa6, +0x9e,0xc5,0x47,0x25,0xfd,0x1f,0x22,0xaf,0x7b,0x47, +0x16,0xa8,0xda,0xa6,0xfe,0xfc,0xb3,0xa1,0x6b,0x3a, +0xc3,0x4b,0x27,0x0f,0xdb,0xa6,0x5e,0xfc,0xf2,0x2d, +0x84,0xf0,0x2d,0x27,0x79,0x39,0x9d,0xe4,0xe5,0xcd, +0xcf,0x7a,0x9f,0x5f,0x03,0x00,0xb7,0x35,0x53,0x35, +0x8f,0xfe,0x68,0x97,0x00,0x00,0x00,0x00,0x49,0x45, +0x4e,0x44,0xae,0x42,0x60,0x82 +}; + + +__fastcall TCKBox::TCKBox( TComponent* Owner ) +:TPanel(Owner) +{ + Width = 80; + Height = 18; + + FAutoBox = true; +// FBoxEnabled = true; + FEnabled = true; + bMouse = false; + + ParentColor = true; + Ctl3D = false; + ParentCtl3D = false; + DoubleBuffered = true; + + m_pImgCheck = new Vcl::Imaging::Pngimage::TPngImage(); //we create our png + TMemoryStream *pngStream = new TMemoryStream(); + pngStream->Position = 0; + pngStream->WriteBuffer(pngImageCheck, 2988); + pngStream->Position = 0; + m_pImgCheck->LoadFromStream(pngStream); + delete pngStream; + +/* m_pCaption = new TLabel(this); + m_pCaption->Parent = this; +// m_pCaption->AutoSize = true; + m_pCaption->OnClick = Clicklb; + m_pCaption->Left = Height + 2; + m_pCaption->Top = ( Height - m_pCaption->Height ) / 2; +*/ +} +//--------------------------------------------------------------------------- + +__fastcall TCKBox::~TCKBox() +{ + if( m_pImgCheck ){ + delete m_pImgCheck; + m_pImgCheck = NULL; + } + +/* if( m_pCaption ){ + delete m_pCaption; + m_pCaption = NULL; + } +*/ +} +//--------------------------------------------------------------------------- + +namespace Ckbox +{ + void __fastcall PACKAGE Register() + { + TComponentClass classes[1] = {__classid(TCKBox)}; + RegisterComponents(L"Samples", classes, 0); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TCKBox::Paint(void) +{ + TRect Rect; + int hText = Canvas->TextHeight( m_strText );// m_pCaption->Height; + + if( FAutoBox && hText>0 ){ + Rect.init( RET_LEFT, (Height-hText)/2, RET_LEFT+hText, (Height+hText)/2+1 ); + } + else{ + Rect.init( RET_LEFT, 0, RET_LEFT + Height, Height ); + } + + if( FEnabled ){ + Canvas->Brush->Color = BoxColor; + Canvas->FrameRect( Rect ); + + TRect rct1,rct2; + if( Rect.Height()<= 9 ){ + rct1.init( Rect.Left+1,Rect.Top+1,Rect.Right-1,Rect.Bottom-1 ); //1 + } + else{ + rct1.init( Rect.Left+1,Rect.Top+1,Rect.Right-1,Rect.Bottom-1 ); //1 + } + + rct2.init( Rect.Left+1+1,Rect.Top+1+1,Rect.Right-1-1,Rect.Bottom-1-1 ); + + if( bMouse && !FChecked ){ + if( Rect.Height()<=9 ){ + Canvas->Brush->Color = CLR_RECT_1_1; // + Canvas->FillRect(rct1); + } + else{ + Canvas->Brush->Color = CLR_RECT_1_1; // + Canvas->FillRect(rct1); + } + } + else if( bMouse && FChecked ){ + if( Rect.Height()<=9 ){ + Canvas->Brush->Color = CLR_RECT_1_1; // + Canvas->FrameRect(rct1); + + Canvas->StretchDraw(rct2, m_pImgCheck); //ڿ + + }else{ + Canvas->Brush->Color = CLR_RECT_1_1; // + Canvas->FillRect(rct1); + + Canvas->StretchDraw(rct2, m_pImgCheck); //ڿ + } + } + else if( !bMouse && FChecked ){ + if( Rect.Height()<=9 ){ + Canvas->Brush->Color = CLR_RECT_1_2; // + Canvas->FrameRect(rct1); + + Canvas->StretchDraw(rct2, m_pImgCheck); //ڿ + } + else{ + Canvas->Brush->Color = CLR_RECT_1_2; // + Canvas->FillRect(rct1); + + Canvas->StretchDraw(rct2, m_pImgCheck); //ڿ + } + } + else if( !bMouse && !FChecked ){ + if( Rect.Height()<=9 ){ + Canvas->Brush->Color = CLR_RECT_1_2; // + Canvas->FillRect(rct1); + } + else{ + Canvas->Brush->Color = CLR_RECT_1_2; // + Canvas->FillRect(rct1);//FrameRect(rct1); + } + } + + } + else{ + Canvas->Brush->Color = CLR_ENABLED; + Canvas->FrameRect( Rect ); + TRect temp(Rect.Left+1,Rect.Top+1,Rect.Right-1,Rect.Bottom-1); + Canvas->Brush->Color = CLR_ENABLED_1; + Canvas->FillRect( temp ); + } + + if( !m_strText.IsEmpty() ){ + int x = RET_LEFT + Height + 2, y = (Height-hText)/2; + + Canvas->Brush->Style = bsClear; + + Canvas->TextOut( x, y, m_strText ); + if( !FEnabled ){ +// } +// else{ + + //Canvas->Font->Color = RGB(255,255,255); + Canvas->TextOut( x, y, m_strText ); + + TColor clUse = Canvas->Font->Color; + Canvas->Font->Color = RGB(128,128,128); + Canvas->TextOut( x-1, y-1, m_strText ); + + Canvas->Font->Color = clUse; + } + + Canvas->Brush->Style = bsSolid; + } +} +//--------------------------------------------------------------------------- +/* +TColor __fastcall TCKBox::ColorSub(TColor cColor,int index) +{ + int R = GetRValue(cColor);//; cColor&0x000000FF;// + int G = GetGValue(cColor);//cColor&0x0000FF00;// + int B = GetBValue(cColor);//cColor&0x0000FF00;// +// int A = cColor&0xFF000000; + + int tr= (R*(100-index)+255*index)/100, + tg = (G*(100-index)+255*index)/100, + tb = (B*(100-index)+255*index)/100; + + return RGB(tr,tg,tb); + +} +//--------------------------------------------------------------------------- +*/ +void __fastcall TCKBox::SetChecked(bool bCheck) +{ + if( FChecked!=bCheck ){ + FChecked = bCheck; + + if(FOnChange) + FOnChange(this); + + if( Visible && Handle ){ + RECT rect; + SetRect( &rect, 0, 0, Height, Height ); + InvalidateRect( Handle, &rect, false ); + } + } +} +//--------------------------------------------------------------------------- + +void __fastcall TCKBox::SetEnabled(bool bEnabled) +{ + if( FEnabled!=bEnabled ){ + FEnabled = bEnabled; +// Paint(); + Invalidate(); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TCKBox::SetBoxColor(TColor cColor) +{ + if( FBoxColor!=cColor ){ + FBoxColor = cColor; + //Paint(); + if( Visible && Handle ){ + RECT rect; + SetRect( &rect, 0, 0, Height, Height ); + InvalidateRect( Handle, &rect, false ); + } + } +} +//--------------------------------------------------------------------------- + +TFont* __fastcall TCKBox::GetTextFont() +{ + return Canvas->Font; +} +//--------------------------------------------------------------------------- + +void __fastcall TCKBox::SetTextFont(TFont* Value) +{ +/* if( m_pCaption ){ + m_pCaption->Font = Value; + m_pCaption->Invalidate(); + } +*/ + Canvas->Font = Value; + + if( Visible && Handle ){ + RECT rect; + SetRect( &rect, Height, 0, Width, Height ); + InvalidateRect( Handle, &rect, false ); + } + //Invalidate(); +} +//--------------------------------------------------------------------------- + +void __fastcall TCKBox::Click(void) +{ + if( FEnabled ){ + FChecked = !Checked; + if(FOnChange) + FOnChange(this); + TPanel::Click(); + // Paint(); + Invalidate(); + } +} +//--------------------------------------------------------------------------- + + +void __fastcall TCKBox::CMMouseLeave(TWMMouse &Message) +{ + if(bMouse){ + bMouse = false; + RECT rect; + SetRect( &rect, 0, 0, Height, Height ); + InvalidateRect( Handle, &rect, false ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TCKBox::CMMouseEnter(TWMMouse &Message) +{ + if(!bMouse){ + bMouse = true; + RECT rect; + SetRect( &rect, 0, 0, Height, Height ); + InvalidateRect( Handle, &rect, false ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TCKBox::WMSize(Winapi::Messages::TWMSize &Message) +{ + Height = Message.Height < MIN_H ? MIN_H : Message.Height; + Width = Message.Width< MIN_W ? MIN_W : Message.Width; + +/* m_pCaption->Left = Height + 2; + m_pCaption->Top = ( Height - m_pCaption->Height ) / 2; + m_pCaption->Width = Width - Height - 2; + m_pCaption->Invalidate(); +*/ + Message.Result = true; + + return; +} +//--------------------------------------------------------------------------- + +String __fastcall TCKBox::GetCaption() +{ +// if( m_pCaption ) +// return m_pCaption->Caption; + + return m_strText; +} +//--------------------------------------------------------------------------- + +void __fastcall TCKBox::SetCaption( String Value ) +{ + m_strText = Value; + + if( Visible && Handle ){ + RECT rect; + SetRect( &rect, Height, 0, Width, Height ); + InvalidateRect( Handle, &rect, false ); + } + +/* + if( m_pCaption ){ + m_pCaption->Caption = Value; + m_pCaption->Invalidate(); + } +*/ +} +//--------------------------------------------------------------------------- + diff --git a/Component/CheckBox/CKBox.h b/Component/CheckBox/CKBox.h new file mode 100644 index 0000000..11465e7 --- /dev/null +++ b/Component/CheckBox/CKBox.h @@ -0,0 +1,74 @@ +//--------------------------------------------------------------------------- + +#ifndef CKBoxH +#define CKBoxH +#include +#include +//--------------------------------------------------------------------------- +class PACKAGE TCKBox : public TPanel +{ +private: + bool FChecked; + bool FEnabled; + bool bMouse; + bool FAutoBox; + TNotifyEvent FOnChange; + TColor FBoxColor; + + String m_strText; +// TLabel *m_pCaption; + Vcl::Imaging::Pngimage::TPngImage *m_pImgCheck; + +private: + void __fastcall SetBoxEnabled(bool bEnabled); + void __fastcall SetEnabled(bool bEnabled); + void __fastcall SetChecked(bool bCheck); + void __fastcall SetBoxColor(TColor cColor); + TFont* __fastcall GetTextFont(); + void __fastcall SetTextFont( TFont* Value ); +// void __fastcall Clicklb(TObject *Sender); +// TColor __fastcall ColorSub(TColor cColor,int index); + String __fastcall GetCaption(); + void __fastcall SetCaption( String Value ); + +protected: + virtual void __fastcall Paint(void); + + MESSAGE void __fastcall CMMouseLeave(TWMMouse &Message); + MESSAGE void __fastcall CMMouseEnter(TWMMouse &Message); + MESSAGE void __fastcall WMSize(Winapi::Messages::TWMSize &Message); + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(CM_MOUSEENTER, TWMMouse, CMMouseEnter) + MESSAGE_HANDLER(CM_MOUSELEAVE, TWMMouse, CMMouseLeave) + MESSAGE_HANDLER(WM_SIZE, TWMSize, WMSize) + END_MESSAGE_MAP(TPanel) +public: + DYNAMIC void __fastcall Click(void); + + __fastcall TCKBox( TComponent* Owner ); + __fastcall ~TCKBox(); + +__published: + __property bool Checked = { read = FChecked, write = SetChecked, default = 0 }; + __property bool Enabled = { read = FEnabled, write = SetEnabled, default = 1 }; + __property bool AutoBox = { read = FAutoBox,write = FAutoBox,default = 1}; + __property TColor BoxColor = { read = FBoxColor,write = SetBoxColor }; + __property Font = { read = GetTextFont, write = SetTextFont }; + __property TNotifyEvent OnChange = {read = FOnChange, write = FOnChange ,default = NULL}; + __property String Caption = {read = GetCaption, write = SetCaption }; +}; +#endif + +/* + ʹ˵ + 1OnChange Ϊ Checked ıʱ Ϊⲿӿ Ҳʹø TPanel ġonClick + 2FontSize Ϊ С + 3AutoBox Ϊ True ʱ + Box ĴС߶ȱ仯 + Ϊfalse ʱ + Box ĴС ؼ Height 仯 + 4BoxEnabled ܷʹ TPanel Enabled ͻ + ע + ؼ С Height Ϊ 6 С Width Ϊ 11 + +*/ diff --git a/Component/CheckBox/TCKBox.cpp b/Component/CheckBox/TCKBox.cpp new file mode 100644 index 0000000..c2815fb --- /dev/null +++ b/Component/CheckBox/TCKBox.cpp @@ -0,0 +1,17 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop +#pragma package(smart_init) +//--------------------------------------------------------------------------- + +// Package source. +//--------------------------------------------------------------------------- + + +#pragma argsused +extern "C" int _libmain(unsigned long reason) +{ + return 1; +} +//--------------------------------------------------------------------------- diff --git a/Component/ComboBoxComponent/CapButton.cpp b/Component/ComboBoxComponent/CapButton.cpp new file mode 100644 index 0000000..66aecc3 --- /dev/null +++ b/Component/ComboBoxComponent/CapButton.cpp @@ -0,0 +1,1212 @@ +//--------------------------------------------------------------------------- + +#include +#include "ComboBoxComponent.h" + +const static char pngImageCap[] = { +0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52, +0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0A, 0x08, 0x06, 0x00, 0x00, 0x00, 0x62, 0xF0, 0xA4, +0x83, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0B, 0x13, 0x00, 0x00, 0x0B, +0x13, 0x01, 0x00, 0x9A, 0x9C, 0x18, 0x00, 0x00, 0x0A, 0x4D, 0x69, 0x43, 0x43, 0x50, 0x50, 0x68, +0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x49, 0x43, 0x43, 0x20, 0x70, 0x72, 0x6F, 0x66, +0x69, 0x6C, 0x65, 0x00, 0x00, 0x78, 0xDA, 0x9D, 0x53, 0x77, 0x58, 0x93, 0xF7, 0x16, 0x3E, 0xDF, +0xF7, 0x65, 0x0F, 0x56, 0x42, 0xD8, 0xF0, 0xB1, 0x97, 0x6C, 0x81, 0x00, 0x22, 0x23, 0xAC, 0x08, +0xC8, 0x10, 0x59, 0xA2, 0x10, 0x92, 0x00, 0x61, 0x84, 0x10, 0x12, 0x40, 0xC5, 0x85, 0x88, 0x0A, +0x56, 0x14, 0x15, 0x11, 0x9C, 0x48, 0x55, 0xC4, 0x82, 0xD5, 0x0A, 0x48, 0x9D, 0x88, 0xE2, 0xA0, +0x28, 0xB8, 0x67, 0x41, 0x8A, 0x88, 0x5A, 0x8B, 0x55, 0x5C, 0x38, 0xEE, 0x1F, 0xDC, 0xA7, 0xB5, +0x7D, 0x7A, 0xEF, 0xED, 0xED, 0xFB, 0xD7, 0xFB, 0xBC, 0xE7, 0x9C, 0xE7, 0xFC, 0xCE, 0x79, 0xCF, +0x0F, 0x80, 0x11, 0x12, 0x26, 0x91, 0xE6, 0xA2, 0x6A, 0x00, 0x39, 0x52, 0x85, 0x3C, 0x3A, 0xD8, +0x1F, 0x8F, 0x4F, 0x48, 0xC4, 0xC9, 0xBD, 0x80, 0x02, 0x15, 0x48, 0xE0, 0x04, 0x20, 0x10, 0xE6, +0xCB, 0xC2, 0x67, 0x05, 0xC5, 0x00, 0x00, 0xF0, 0x03, 0x79, 0x78, 0x7E, 0x74, 0xB0, 0x3F, 0xFC, +0x01, 0xAF, 0x6F, 0x00, 0x02, 0x00, 0x70, 0xD5, 0x2E, 0x24, 0x12, 0xC7, 0xE1, 0xFF, 0x83, 0xBA, +0x50, 0x26, 0x57, 0x00, 0x20, 0x91, 0x00, 0xE0, 0x22, 0x12, 0xE7, 0x0B, 0x01, 0x90, 0x52, 0x00, +0xC8, 0x2E, 0x54, 0xC8, 0x14, 0x00, 0xC8, 0x18, 0x00, 0xB0, 0x53, 0xB3, 0x64, 0x0A, 0x00, 0x94, +0x00, 0x00, 0x6C, 0x79, 0x7C, 0x42, 0x22, 0x00, 0xAA, 0x0D, 0x00, 0xEC, 0xF4, 0x49, 0x3E, 0x05, +0x00, 0xD8, 0xA9, 0x93, 0xDC, 0x17, 0x00, 0xD8, 0xA2, 0x1C, 0xA9, 0x08, 0x00, 0x8D, 0x01, 0x00, +0x99, 0x28, 0x47, 0x24, 0x02, 0x40, 0xBB, 0x00, 0x60, 0x55, 0x81, 0x52, 0x2C, 0x02, 0xC0, 0xC2, +0x00, 0xA0, 0xAC, 0x40, 0x22, 0x2E, 0x04, 0xC0, 0xAE, 0x01, 0x80, 0x59, 0xB6, 0x32, 0x47, 0x02, +0x80, 0xBD, 0x05, 0x00, 0x76, 0x8E, 0x58, 0x90, 0x0F, 0x40, 0x60, 0x00, 0x80, 0x99, 0x42, 0x2C, +0xCC, 0x00, 0x20, 0x38, 0x02, 0x00, 0x43, 0x1E, 0x13, 0xCD, 0x03, 0x20, 0x4C, 0x03, 0xA0, 0x30, +0xD2, 0xBF, 0xE0, 0xA9, 0x5F, 0x70, 0x85, 0xB8, 0x48, 0x01, 0x00, 0xC0, 0xCB, 0x95, 0xCD, 0x97, +0x4B, 0xD2, 0x33, 0x14, 0xB8, 0x95, 0xD0, 0x1A, 0x77, 0xF2, 0xF0, 0xE0, 0xE2, 0x21, 0xE2, 0xC2, +0x6C, 0xB1, 0x42, 0x61, 0x17, 0x29, 0x10, 0x66, 0x09, 0xE4, 0x22, 0x9C, 0x97, 0x9B, 0x23, 0x13, +0x48, 0xE7, 0x03, 0x4C, 0xCE, 0x0C, 0x00, 0x00, 0x1A, 0xF9, 0xD1, 0xC1, 0xFE, 0x38, 0x3F, 0x90, +0xE7, 0xE6, 0xE4, 0xE1, 0xE6, 0x66, 0xE7, 0x6C, 0xEF, 0xF4, 0xC5, 0xA2, 0xFE, 0x6B, 0xF0, 0x6F, +0x22, 0x3E, 0x21, 0xF1, 0xDF, 0xFE, 0xBC, 0x8C, 0x02, 0x04, 0x00, 0x10, 0x4E, 0xCF, 0xEF, 0xDA, +0x5F, 0xE5, 0xE5, 0xD6, 0x03, 0x70, 0xC7, 0x01, 0xB0, 0x75, 0xBF, 0x6B, 0xA9, 0x5B, 0x00, 0xDA, +0x56, 0x00, 0x68, 0xDF, 0xF9, 0x5D, 0x33, 0xDB, 0x09, 0xA0, 0x5A, 0x0A, 0xD0, 0x7A, 0xF9, 0x8B, +0x79, 0x38, 0xFC, 0x40, 0x1E, 0x9E, 0xA1, 0x50, 0xC8, 0x3C, 0x1D, 0x1C, 0x0A, 0x0B, 0x0B, 0xED, +0x25, 0x62, 0xA1, 0xBD, 0x30, 0xE3, 0x8B, 0x3E, 0xFF, 0x33, 0xE1, 0x6F, 0xE0, 0x8B, 0x7E, 0xF6, +0xFC, 0x40, 0x1E, 0xFE, 0xDB, 0x7A, 0xF0, 0x00, 0x71, 0x9A, 0x40, 0x99, 0xAD, 0xC0, 0xA3, 0x83, +0xFD, 0x71, 0x61, 0x6E, 0x76, 0xAE, 0x52, 0x8E, 0xE7, 0xCB, 0x04, 0x42, 0x31, 0x6E, 0xF7, 0xE7, +0x23, 0xFE, 0xC7, 0x85, 0x7F, 0xFD, 0x8E, 0x29, 0xD1, 0xE2, 0x34, 0xB1, 0x5C, 0x2C, 0x15, 0x8A, +0xF1, 0x58, 0x89, 0xB8, 0x50, 0x22, 0x4D, 0xC7, 0x79, 0xB9, 0x52, 0x91, 0x44, 0x21, 0xC9, 0x95, +0xE2, 0x12, 0xE9, 0x7F, 0x32, 0xF1, 0x1F, 0x96, 0xFD, 0x09, 0x93, 0x77, 0x0D, 0x00, 0xAC, 0x86, +0x4F, 0xC0, 0x4E, 0xB6, 0x07, 0xB5, 0xCB, 0x6C, 0xC0, 0x7E, 0xEE, 0x01, 0x02, 0x8B, 0x0E, 0x58, +0xD2, 0x76, 0x00, 0x40, 0x7E, 0xF3, 0x2D, 0x8C, 0x1A, 0x0B, 0x91, 0x00, 0x10, 0x67, 0x34, 0x32, +0x79, 0xF7, 0x00, 0x00, 0x93, 0xBF, 0xF9, 0x8F, 0x40, 0x2B, 0x01, 0x00, 0xCD, 0x97, 0xA4, 0xE3, +0x00, 0x00, 0xBC, 0xE8, 0x18, 0x5C, 0xA8, 0x94, 0x17, 0x4C, 0xC6, 0x08, 0x00, 0x00, 0x44, 0xA0, +0x81, 0x2A, 0xB0, 0x41, 0x07, 0x0C, 0xC1, 0x14, 0xAC, 0xC0, 0x0E, 0x9C, 0xC1, 0x1D, 0xBC, 0xC0, +0x17, 0x02, 0x61, 0x06, 0x44, 0x40, 0x0C, 0x24, 0xC0, 0x3C, 0x10, 0x42, 0x06, 0xE4, 0x80, 0x1C, +0x0A, 0xA1, 0x18, 0x96, 0x41, 0x19, 0x54, 0xC0, 0x3A, 0xD8, 0x04, 0xB5, 0xB0, 0x03, 0x1A, 0xA0, +0x11, 0x9A, 0xE1, 0x10, 0xB4, 0xC1, 0x31, 0x38, 0x0D, 0xE7, 0xE0, 0x12, 0x5C, 0x81, 0xEB, 0x70, +0x17, 0x06, 0x60, 0x18, 0x9E, 0xC2, 0x18, 0xBC, 0x86, 0x09, 0x04, 0x41, 0xC8, 0x08, 0x13, 0x61, +0x21, 0x3A, 0x88, 0x11, 0x62, 0x8E, 0xD8, 0x22, 0xCE, 0x08, 0x17, 0x99, 0x8E, 0x04, 0x22, 0x61, +0x48, 0x34, 0x92, 0x80, 0xA4, 0x20, 0xE9, 0x88, 0x14, 0x51, 0x22, 0xC5, 0xC8, 0x72, 0xA4, 0x02, +0xA9, 0x42, 0x6A, 0x91, 0x5D, 0x48, 0x23, 0xF2, 0x2D, 0x72, 0x14, 0x39, 0x8D, 0x5C, 0x40, 0xFA, +0x90, 0xDB, 0xC8, 0x20, 0x32, 0x8A, 0xFC, 0x8A, 0xBC, 0x47, 0x31, 0x94, 0x81, 0xB2, 0x51, 0x03, +0xD4, 0x02, 0x75, 0x40, 0xB9, 0xA8, 0x1F, 0x1A, 0x8A, 0xC6, 0xA0, 0x73, 0xD1, 0x74, 0x34, 0x0F, +0x5D, 0x80, 0x96, 0xA2, 0x6B, 0xD1, 0x1A, 0xB4, 0x1E, 0x3D, 0x80, 0xB6, 0xA2, 0xA7, 0xD1, 0x4B, +0xE8, 0x75, 0x74, 0x00, 0x7D, 0x8A, 0x8E, 0x63, 0x80, 0xD1, 0x31, 0x0E, 0x66, 0x8C, 0xD9, 0x61, +0x5C, 0x8C, 0x87, 0x45, 0x60, 0x89, 0x58, 0x1A, 0x26, 0xC7, 0x16, 0x63, 0xE5, 0x58, 0x35, 0x56, +0x8F, 0x35, 0x63, 0x1D, 0x58, 0x37, 0x76, 0x15, 0x1B, 0xC0, 0x9E, 0x61, 0xEF, 0x08, 0x24, 0x02, +0x8B, 0x80, 0x13, 0xEC, 0x08, 0x5E, 0x84, 0x10, 0xC2, 0x6C, 0x82, 0x90, 0x90, 0x47, 0x58, 0x4C, +0x58, 0x43, 0xA8, 0x25, 0xEC, 0x23, 0xB4, 0x12, 0xBA, 0x08, 0x57, 0x09, 0x83, 0x84, 0x31, 0xC2, +0x27, 0x22, 0x93, 0xA8, 0x4F, 0xB4, 0x25, 0x7A, 0x12, 0xF9, 0xC4, 0x78, 0x62, 0x3A, 0xB1, 0x90, +0x58, 0x46, 0xAC, 0x26, 0xEE, 0x21, 0x1E, 0x21, 0x9E, 0x25, 0x5E, 0x27, 0x0E, 0x13, 0x5F, 0x93, +0x48, 0x24, 0x0E, 0xC9, 0x92, 0xE4, 0x4E, 0x0A, 0x21, 0x25, 0x90, 0x32, 0x49, 0x0B, 0x49, 0x6B, +0x48, 0xDB, 0x48, 0x2D, 0xA4, 0x53, 0xA4, 0x3E, 0xD2, 0x10, 0x69, 0x9C, 0x4C, 0x26, 0xEB, 0x90, +0x6D, 0xC9, 0xDE, 0xE4, 0x08, 0xB2, 0x80, 0xAC, 0x20, 0x97, 0x91, 0xB7, 0x90, 0x0F, 0x90, 0x4F, +0x92, 0xFB, 0xC9, 0xC3, 0xE4, 0xB7, 0x14, 0x3A, 0xC5, 0x88, 0xE2, 0x4C, 0x09, 0xA2, 0x24, 0x52, +0xA4, 0x94, 0x12, 0x4A, 0x35, 0x65, 0x3F, 0xE5, 0x04, 0xA5, 0x9F, 0x32, 0x42, 0x99, 0xA0, 0xAA, +0x51, 0xCD, 0xA9, 0x9E, 0xD4, 0x08, 0xAA, 0x88, 0x3A, 0x9F, 0x5A, 0x49, 0x6D, 0xA0, 0x76, 0x50, +0x2F, 0x53, 0x87, 0xA9, 0x13, 0x34, 0x75, 0x9A, 0x25, 0xCD, 0x9B, 0x16, 0x43, 0xCB, 0xA4, 0x2D, +0xA3, 0xD5, 0xD0, 0x9A, 0x69, 0x67, 0x69, 0xF7, 0x68, 0x2F, 0xE9, 0x74, 0xBA, 0x09, 0xDD, 0x83, +0x1E, 0x45, 0x97, 0xD0, 0x97, 0xD2, 0x6B, 0xE8, 0x07, 0xE9, 0xE7, 0xE9, 0x83, 0xF4, 0x77, 0x0C, +0x0D, 0x86, 0x0D, 0x83, 0xC7, 0x48, 0x62, 0x28, 0x19, 0x6B, 0x19, 0x7B, 0x19, 0xA7, 0x18, 0xB7, +0x19, 0x2F, 0x99, 0x4C, 0xA6, 0x05, 0xD3, 0x97, 0x99, 0xC8, 0x54, 0x30, 0xD7, 0x32, 0x1B, 0x99, +0x67, 0x98, 0x0F, 0x98, 0x6F, 0x55, 0x58, 0x2A, 0xF6, 0x2A, 0x7C, 0x15, 0x91, 0xCA, 0x12, 0x95, +0x3A, 0x95, 0x56, 0x95, 0x7E, 0x95, 0xE7, 0xAA, 0x54, 0x55, 0x73, 0x55, 0x3F, 0xD5, 0x79, 0xAA, +0x0B, 0x54, 0xAB, 0x55, 0x0F, 0xAB, 0x5E, 0x56, 0x7D, 0xA6, 0x46, 0x55, 0xB3, 0x50, 0xE3, 0xA9, +0x09, 0xD4, 0x16, 0xAB, 0xD5, 0xA9, 0x1D, 0x55, 0xBB, 0xA9, 0x36, 0xAE, 0xCE, 0x52, 0x77, 0x52, +0x8F, 0x50, 0xCF, 0x51, 0x5F, 0xA3, 0xBE, 0x5F, 0xFD, 0x82, 0xFA, 0x63, 0x0D, 0xB2, 0x86, 0x85, +0x46, 0xA0, 0x86, 0x48, 0xA3, 0x54, 0x63, 0xB7, 0xC6, 0x19, 0x8D, 0x21, 0x16, 0xC6, 0x32, 0x65, +0xF1, 0x58, 0x42, 0xD6, 0x72, 0x56, 0x03, 0xEB, 0x2C, 0x6B, 0x98, 0x4D, 0x62, 0x5B, 0xB2, 0xF9, +0xEC, 0x4C, 0x76, 0x05, 0xFB, 0x1B, 0x76, 0x2F, 0x7B, 0x4C, 0x53, 0x43, 0x73, 0xAA, 0x66, 0xAC, +0x66, 0x91, 0x66, 0x9D, 0xE6, 0x71, 0xCD, 0x01, 0x0E, 0xC6, 0xB1, 0xE0, 0xF0, 0x39, 0xD9, 0x9C, +0x4A, 0xCE, 0x21, 0xCE, 0x0D, 0xCE, 0x7B, 0x2D, 0x03, 0x2D, 0x3F, 0x2D, 0xB1, 0xD6, 0x6A, 0xAD, +0x66, 0xAD, 0x7E, 0xAD, 0x37, 0xDA, 0x7A, 0xDA, 0xBE, 0xDA, 0x62, 0xED, 0x72, 0xED, 0x16, 0xED, +0xEB, 0xDA, 0xEF, 0x75, 0x70, 0x9D, 0x40, 0x9D, 0x2C, 0x9D, 0xF5, 0x3A, 0x6D, 0x3A, 0xF7, 0x75, +0x09, 0xBA, 0x36, 0xBA, 0x51, 0xBA, 0x85, 0xBA, 0xDB, 0x75, 0xCF, 0xEA, 0x3E, 0xD3, 0x63, 0xEB, +0x79, 0xE9, 0x09, 0xF5, 0xCA, 0xF5, 0x0E, 0xE9, 0xDD, 0xD1, 0x47, 0xF5, 0x6D, 0xF4, 0xA3, 0xF5, +0x17, 0xEA, 0xEF, 0xD6, 0xEF, 0xD1, 0x1F, 0x37, 0x30, 0x34, 0x08, 0x36, 0x90, 0x19, 0x6C, 0x31, +0x38, 0x63, 0xF0, 0xCC, 0x90, 0x63, 0xE8, 0x6B, 0x98, 0x69, 0xB8, 0xD1, 0xF0, 0x84, 0xE1, 0xA8, +0x11, 0xCB, 0x68, 0xBA, 0x91, 0xC4, 0x68, 0xA3, 0xD1, 0x49, 0xA3, 0x27, 0xB8, 0x26, 0xEE, 0x87, +0x67, 0xE3, 0x35, 0x78, 0x17, 0x3E, 0x66, 0xAC, 0x6F, 0x1C, 0x62, 0xAC, 0x34, 0xDE, 0x65, 0xDC, +0x6B, 0x3C, 0x61, 0x62, 0x69, 0x32, 0xDB, 0xA4, 0xC4, 0xA4, 0xC5, 0xE4, 0xBE, 0x29, 0xCD, 0x94, +0x6B, 0x9A, 0x66, 0xBA, 0xD1, 0xB4, 0xD3, 0x74, 0xCC, 0xCC, 0xC8, 0x2C, 0xDC, 0xAC, 0xD8, 0xAC, +0xC9, 0xEC, 0x8E, 0x39, 0xD5, 0x9C, 0x6B, 0x9E, 0x61, 0xBE, 0xD9, 0xBC, 0xDB, 0xFC, 0x8D, 0x85, +0xA5, 0x45, 0x9C, 0xC5, 0x4A, 0x8B, 0x36, 0x8B, 0xC7, 0x96, 0xDA, 0x96, 0x7C, 0xCB, 0x05, 0x96, +0x4D, 0x96, 0xF7, 0xAC, 0x98, 0x56, 0x3E, 0x56, 0x79, 0x56, 0xF5, 0x56, 0xD7, 0xAC, 0x49, 0xD6, +0x5C, 0xEB, 0x2C, 0xEB, 0x6D, 0xD6, 0x57, 0x6C, 0x50, 0x1B, 0x57, 0x9B, 0x0C, 0x9B, 0x3A, 0x9B, +0xCB, 0xB6, 0xA8, 0xAD, 0x9B, 0xAD, 0xC4, 0x76, 0x9B, 0x6D, 0xDF, 0x14, 0xE2, 0x14, 0x8F, 0x29, +0xD2, 0x29, 0xF5, 0x53, 0x6E, 0xDA, 0x31, 0xEC, 0xFC, 0xEC, 0x0A, 0xEC, 0x9A, 0xEC, 0x06, 0xED, +0x39, 0xF6, 0x61, 0xF6, 0x25, 0xF6, 0x6D, 0xF6, 0xCF, 0x1D, 0xCC, 0x1C, 0x12, 0x1D, 0xD6, 0x3B, +0x74, 0x3B, 0x7C, 0x72, 0x74, 0x75, 0xCC, 0x76, 0x6C, 0x70, 0xBC, 0xEB, 0xA4, 0xE1, 0x34, 0xC3, +0xA9, 0xC4, 0xA9, 0xC3, 0xE9, 0x57, 0x67, 0x1B, 0x67, 0xA1, 0x73, 0x9D, 0xF3, 0x35, 0x17, 0xA6, +0x4B, 0x90, 0xCB, 0x12, 0x97, 0x76, 0x97, 0x17, 0x53, 0x6D, 0xA7, 0x8A, 0xA7, 0x6E, 0x9F, 0x7A, +0xCB, 0x95, 0xE5, 0x1A, 0xEE, 0xBA, 0xD2, 0xB5, 0xD3, 0xF5, 0xA3, 0x9B, 0xBB, 0x9B, 0xDC, 0xAD, +0xD9, 0x6D, 0xD4, 0xDD, 0xCC, 0x3D, 0xC5, 0x7D, 0xAB, 0xFB, 0x4D, 0x2E, 0x9B, 0x1B, 0xC9, 0x5D, +0xC3, 0x3D, 0xEF, 0x41, 0xF4, 0xF0, 0xF7, 0x58, 0xE2, 0x71, 0xCC, 0xE3, 0x9D, 0xA7, 0x9B, 0xA7, +0xC2, 0xF3, 0x90, 0xE7, 0x2F, 0x5E, 0x76, 0x5E, 0x59, 0x5E, 0xFB, 0xBD, 0x1E, 0x4F, 0xB3, 0x9C, +0x26, 0x9E, 0xD6, 0x30, 0x6D, 0xC8, 0xDB, 0xC4, 0x5B, 0xE0, 0xBD, 0xCB, 0x7B, 0x60, 0x3A, 0x3E, +0x3D, 0x65, 0xFA, 0xCE, 0xE9, 0x03, 0x3E, 0xC6, 0x3E, 0x02, 0x9F, 0x7A, 0x9F, 0x87, 0xBE, 0xA6, +0xBE, 0x22, 0xDF, 0x3D, 0xBE, 0x23, 0x7E, 0xD6, 0x7E, 0x99, 0x7E, 0x07, 0xFC, 0x9E, 0xFB, 0x3B, +0xFA, 0xCB, 0xFD, 0x8F, 0xF8, 0xBF, 0xE1, 0x79, 0xF2, 0x16, 0xF1, 0x4E, 0x05, 0x60, 0x01, 0xC1, +0x01, 0xE5, 0x01, 0xBD, 0x81, 0x1A, 0x81, 0xB3, 0x03, 0x6B, 0x03, 0x1F, 0x04, 0x99, 0x04, 0xA5, +0x07, 0x35, 0x05, 0x8D, 0x05, 0xBB, 0x06, 0x2F, 0x0C, 0x3E, 0x15, 0x42, 0x0C, 0x09, 0x0D, 0x59, +0x1F, 0x72, 0x93, 0x6F, 0xC0, 0x17, 0xF2, 0x1B, 0xF9, 0x63, 0x33, 0xDC, 0x67, 0x2C, 0x9A, 0xD1, +0x15, 0xCA, 0x08, 0x9D, 0x15, 0x5A, 0x1B, 0xFA, 0x30, 0xCC, 0x26, 0x4C, 0x1E, 0xD6, 0x11, 0x8E, +0x86, 0xCF, 0x08, 0xDF, 0x10, 0x7E, 0x6F, 0xA6, 0xF9, 0x4C, 0xE9, 0xCC, 0xB6, 0x08, 0x88, 0xE0, +0x47, 0x6C, 0x88, 0xB8, 0x1F, 0x69, 0x19, 0x99, 0x17, 0xF9, 0x7D, 0x14, 0x29, 0x2A, 0x32, 0xAA, +0x2E, 0xEA, 0x51, 0xB4, 0x53, 0x74, 0x71, 0x74, 0xF7, 0x2C, 0xD6, 0xAC, 0xE4, 0x59, 0xFB, 0x67, +0xBD, 0x8E, 0xF1, 0x8F, 0xA9, 0x8C, 0xB9, 0x3B, 0xDB, 0x6A, 0xB6, 0x72, 0x76, 0x67, 0xAC, 0x6A, +0x6C, 0x52, 0x6C, 0x63, 0xEC, 0x9B, 0xB8, 0x80, 0xB8, 0xAA, 0xB8, 0x81, 0x78, 0x87, 0xF8, 0x45, +0xF1, 0x97, 0x12, 0x74, 0x13, 0x24, 0x09, 0xED, 0x89, 0xE4, 0xC4, 0xD8, 0xC4, 0x3D, 0x89, 0xE3, +0x73, 0x02, 0xE7, 0x6C, 0x9A, 0x33, 0x9C, 0xE4, 0x9A, 0x54, 0x96, 0x74, 0x63, 0xAE, 0xE5, 0xDC, +0xA2, 0xB9, 0x17, 0xE6, 0xE9, 0xCE, 0xCB, 0x9E, 0x77, 0x3C, 0x59, 0x35, 0x59, 0x90, 0x7C, 0x38, +0x85, 0x98, 0x12, 0x97, 0xB2, 0x3F, 0xE5, 0x83, 0x20, 0x42, 0x50, 0x2F, 0x18, 0x4F, 0xE5, 0xA7, +0x6E, 0x4D, 0x1D, 0x13, 0xF2, 0x84, 0x9B, 0x85, 0x4F, 0x45, 0xBE, 0xA2, 0x8D, 0xA2, 0x51, 0xB1, +0xB7, 0xB8, 0x4A, 0x3C, 0x92, 0xE6, 0x9D, 0x56, 0x95, 0xF6, 0x38, 0xDD, 0x3B, 0x7D, 0x43, 0xFA, +0x68, 0x86, 0x4F, 0x46, 0x75, 0xC6, 0x33, 0x09, 0x4F, 0x52, 0x2B, 0x79, 0x91, 0x19, 0x92, 0xB9, +0x23, 0xF3, 0x4D, 0x56, 0x44, 0xD6, 0xDE, 0xAC, 0xCF, 0xD9, 0x71, 0xD9, 0x2D, 0x39, 0x94, 0x9C, +0x94, 0x9C, 0xA3, 0x52, 0x0D, 0x69, 0x96, 0xB4, 0x2B, 0xD7, 0x30, 0xB7, 0x28, 0xB7, 0x4F, 0x66, +0x2B, 0x2B, 0x93, 0x0D, 0xE4, 0x79, 0xE6, 0x6D, 0xCA, 0x1B, 0x93, 0x87, 0xCA, 0xF7, 0xE4, 0x23, +0xF9, 0x73, 0xF3, 0xDB, 0x15, 0x6C, 0x85, 0x4C, 0xD1, 0xA3, 0xB4, 0x52, 0xAE, 0x50, 0x0E, 0x16, +0x4C, 0x2F, 0xA8, 0x2B, 0x78, 0x5B, 0x18, 0x5B, 0x78, 0xB8, 0x48, 0xBD, 0x48, 0x5A, 0xD4, 0x33, +0xDF, 0x66, 0xFE, 0xEA, 0xF9, 0x23, 0x0B, 0x82, 0x16, 0x7C, 0xBD, 0x90, 0xB0, 0x50, 0xB8, 0xB0, +0xB3, 0xD8, 0xB8, 0x78, 0x59, 0xF1, 0xE0, 0x22, 0xBF, 0x45, 0xBB, 0x16, 0x23, 0x8B, 0x53, 0x17, +0x77, 0x2E, 0x31, 0x5D, 0x52, 0xBA, 0x64, 0x78, 0x69, 0xF0, 0xD2, 0x7D, 0xCB, 0x68, 0xCB, 0xB2, +0x96, 0xFD, 0x50, 0xE2, 0x58, 0x52, 0x55, 0xF2, 0x6A, 0x79, 0xDC, 0xF2, 0x8E, 0x52, 0x83, 0xD2, +0xA5, 0xA5, 0x43, 0x2B, 0x82, 0x57, 0x34, 0x95, 0xA9, 0x94, 0xC9, 0xCB, 0x6E, 0xAE, 0xF4, 0x5A, +0xB9, 0x63, 0x15, 0x61, 0x95, 0x64, 0x55, 0xEF, 0x6A, 0x97, 0xD5, 0x5B, 0x56, 0x7F, 0x2A, 0x17, +0x95, 0x5F, 0xAC, 0x70, 0xAC, 0xA8, 0xAE, 0xF8, 0xB0, 0x46, 0xB8, 0xE6, 0xE2, 0x57, 0x4E, 0x5F, +0xD5, 0x7C, 0xF5, 0x79, 0x6D, 0xDA, 0xDA, 0xDE, 0x4A, 0xB7, 0xCA, 0xED, 0xEB, 0x48, 0xEB, 0xA4, +0xEB, 0x6E, 0xAC, 0xF7, 0x59, 0xBF, 0xAF, 0x4A, 0xBD, 0x6A, 0x41, 0xD5, 0xD0, 0x86, 0xF0, 0x0D, +0xAD, 0x1B, 0xF1, 0x8D, 0xE5, 0x1B, 0x5F, 0x6D, 0x4A, 0xDE, 0x74, 0xA1, 0x7A, 0x6A, 0xF5, 0x8E, +0xCD, 0xB4, 0xCD, 0xCA, 0xCD, 0x03, 0x35, 0x61, 0x35, 0xED, 0x5B, 0xCC, 0xB6, 0xAC, 0xDB, 0xF2, +0xA1, 0x36, 0xA3, 0xF6, 0x7A, 0x9D, 0x7F, 0x5D, 0xCB, 0x56, 0xFD, 0xAD, 0xAB, 0xB7, 0xBE, 0xD9, +0x26, 0xDA, 0xD6, 0xBF, 0xDD, 0x77, 0x7B, 0xF3, 0x0E, 0x83, 0x1D, 0x15, 0x3B, 0xDE, 0xEF, 0x94, +0xEC, 0xBC, 0xB5, 0x2B, 0x78, 0x57, 0x6B, 0xBD, 0x45, 0x7D, 0xF5, 0x6E, 0xD2, 0xEE, 0x82, 0xDD, +0x8F, 0x1A, 0x62, 0x1B, 0xBA, 0xBF, 0xE6, 0x7E, 0xDD, 0xB8, 0x47, 0x77, 0x4F, 0xC5, 0x9E, 0x8F, +0x7B, 0xA5, 0x7B, 0x07, 0xF6, 0x45, 0xEF, 0xEB, 0x6A, 0x74, 0x6F, 0x6C, 0xDC, 0xAF, 0xBF, 0xBF, +0xB2, 0x09, 0x6D, 0x52, 0x36, 0x8D, 0x1E, 0x48, 0x3A, 0x70, 0xE5, 0x9B, 0x80, 0x6F, 0xDA, 0x9B, +0xED, 0x9A, 0x77, 0xB5, 0x70, 0x5A, 0x2A, 0x0E, 0xC2, 0x41, 0xE5, 0xC1, 0x27, 0xDF, 0xA6, 0x7C, +0x7B, 0xE3, 0x50, 0xE8, 0xA1, 0xCE, 0xC3, 0xDC, 0xC3, 0xCD, 0xDF, 0x99, 0x7F, 0xB7, 0xF5, 0x08, +0xEB, 0x48, 0x79, 0x2B, 0xD2, 0x3A, 0xBF, 0x75, 0xAC, 0x2D, 0xA3, 0x6D, 0xA0, 0x3D, 0xA1, 0xBD, +0xEF, 0xE8, 0x8C, 0xA3, 0x9D, 0x1D, 0x5E, 0x1D, 0x47, 0xBE, 0xB7, 0xFF, 0x7E, 0xEF, 0x31, 0xE3, +0x63, 0x75, 0xC7, 0x35, 0x8F, 0x57, 0x9E, 0xA0, 0x9D, 0x28, 0x3D, 0xF1, 0xF9, 0xE4, 0x82, 0x93, +0xE3, 0xA7, 0x64, 0xA7, 0x9E, 0x9D, 0x4E, 0x3F, 0x3D, 0xD4, 0x99, 0xDC, 0x79, 0xF7, 0x4C, 0xFC, +0x99, 0x6B, 0x5D, 0x51, 0x5D, 0xBD, 0x67, 0x43, 0xCF, 0x9E, 0x3F, 0x17, 0x74, 0xEE, 0x4C, 0xB7, +0x5F, 0xF7, 0xC9, 0xF3, 0xDE, 0xE7, 0x8F, 0x5D, 0xF0, 0xBC, 0x70, 0xF4, 0x22, 0xF7, 0x62, 0xDB, +0x25, 0xB7, 0x4B, 0xAD, 0x3D, 0xAE, 0x3D, 0x47, 0x7E, 0x70, 0xFD, 0xE1, 0x48, 0xAF, 0x5B, 0x6F, +0xEB, 0x65, 0xF7, 0xCB, 0xED, 0x57, 0x3C, 0xAE, 0x74, 0xF4, 0x4D, 0xEB, 0x3B, 0xD1, 0xEF, 0xD3, +0x7F, 0xFA, 0x6A, 0xC0, 0xD5, 0x73, 0xD7, 0xF8, 0xD7, 0x2E, 0x5D, 0x9F, 0x79, 0xBD, 0xEF, 0xC6, +0xEC, 0x1B, 0xB7, 0x6E, 0x26, 0xDD, 0x1C, 0xB8, 0x25, 0xBA, 0xF5, 0xF8, 0x76, 0xF6, 0xED, 0x17, +0x77, 0x0A, 0xEE, 0x4C, 0xDC, 0x5D, 0x7A, 0x8F, 0x78, 0xAF, 0xFC, 0xBE, 0xDA, 0xFD, 0xEA, 0x07, +0xFA, 0x0F, 0xEA, 0x7F, 0xB4, 0xFE, 0xB1, 0x65, 0xC0, 0x6D, 0xE0, 0xF8, 0x60, 0xC0, 0x60, 0xCF, +0xC3, 0x59, 0x0F, 0xEF, 0x0E, 0x09, 0x87, 0x9E, 0xFE, 0x94, 0xFF, 0xD3, 0x87, 0xE1, 0xD2, 0x47, +0xCC, 0x47, 0xD5, 0x23, 0x46, 0x23, 0x8D, 0x8F, 0x9D, 0x1F, 0x1F, 0x1B, 0x0D, 0x1A, 0xBD, 0xF2, +0x64, 0xCE, 0x93, 0xE1, 0xA7, 0xB2, 0xA7, 0x13, 0xCF, 0xCA, 0x7E, 0x56, 0xFF, 0x79, 0xEB, 0x73, +0xAB, 0xE7, 0xDF, 0xFD, 0xE2, 0xFB, 0x4B, 0xCF, 0x58, 0xFC, 0xD8, 0xF0, 0x0B, 0xF9, 0x8B, 0xCF, +0xBF, 0xAE, 0x79, 0xA9, 0xF3, 0x72, 0xEF, 0xAB, 0xA9, 0xAF, 0x3A, 0xC7, 0x23, 0xC7, 0x1F, 0xBC, +0xCE, 0x79, 0x3D, 0xF1, 0xA6, 0xFC, 0xAD, 0xCE, 0xDB, 0x7D, 0xEF, 0xB8, 0xEF, 0xBA, 0xDF, 0xC7, +0xBD, 0x1F, 0x99, 0x28, 0xFC, 0x40, 0xFE, 0x50, 0xF3, 0xD1, 0xFA, 0x63, 0xC7, 0xA7, 0xD0, 0x4F, +0xF7, 0x3E, 0xE7, 0x7C, 0xFE, 0xFC, 0x2F, 0xF7, 0x84, 0xF3, 0xFB, 0x25, 0xD2, 0x9F, 0x33, 0x00, +0x00, 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, 0x7A, 0x25, 0x00, 0x00, 0x80, 0x83, 0x00, +0x00, 0xF9, 0xFF, 0x00, 0x00, 0x80, 0xE9, 0x00, 0x00, 0x75, 0x30, 0x00, 0x00, 0xEA, 0x60, 0x00, +0x00, 0x3A, 0x98, 0x00, 0x00, 0x17, 0x6F, 0x92, 0x5F, 0xC5, 0x46, 0x00, 0x00, 0x00, 0xFA, 0x49, +0x44, 0x41, 0x54, 0x78, 0xDA, 0x7C, 0x91, 0xC1, 0x4A, 0x02, 0x51, 0x14, 0x86, 0x3F, 0x47, 0x17, +0x2D, 0x22, 0x83, 0xDC, 0xF8, 0x22, 0x3D, 0x44, 0x0F, 0xE0, 0xB2, 0xBD, 0x5B, 0x5F, 0x20, 0xDA, +0x86, 0x09, 0xE2, 0xC2, 0x47, 0x28, 0xDC, 0x85, 0x50, 0xCC, 0x2C, 0x6C, 0x20, 0x04, 0x49, 0x10, +0x71, 0x20, 0x17, 0xA6, 0xA8, 0x43, 0x0D, 0x64, 0xA0, 0x8D, 0x8D, 0x57, 0xE7, 0xE6, 0xDC, 0x36, +0xA3, 0x18, 0x6A, 0xDF, 0xEE, 0x9C, 0xFF, 0x5B, 0x1C, 0xCE, 0x1F, 0x01, 0x0E, 0x80, 0x04, 0x70, +0x0C, 0xC4, 0xD8, 0xE6, 0x07, 0x98, 0x00, 0x9F, 0x11, 0xE0, 0x24, 0x9D, 0xB9, 0xB8, 0x3F, 0x3C, +0x8A, 0x9F, 0xB2, 0x87, 0x6F, 0xF7, 0xEB, 0xB9, 0x98, 0xBB, 0x3C, 0xD3, 0x80, 0x45, 0xD5, 0xD4, +0x0B, 0x2A, 0x08, 0x96, 0xBB, 0x44, 0x15, 0x04, 0xCB, 0xAA, 0xA9, 0x17, 0x80, 0x85, 0x06, 0x78, +0xAD, 0x46, 0xCD, 0xB4, 0x07, 0x3D, 0x7D, 0x97, 0x6C, 0x0F, 0xBA, 0x46, 0xAB, 0x51, 0x33, 0x01, +0x4F, 0x03, 0x14, 0x30, 0x7A, 0x34, 0xEE, 0xAE, 0xA4, 0xEF, 0xCF, 0xFE, 0x1C, 0x2B, 0xA5, 0x78, +0xAA, 0x3C, 0x5C, 0x03, 0x23, 0x40, 0x69, 0xE1, 0xDE, 0xFF, 0x70, 0xDE, 0xDA, 0xBD, 0xD7, 0xF6, +0xED, 0xA6, 0xDC, 0xED, 0xBC, 0xDC, 0xBC, 0xDB, 0x7D, 0x0B, 0xF0, 0x01, 0x56, 0xB2, 0x02, 0xC6, +0x46, 0xB9, 0x94, 0xF7, 0xA6, 0xAE, 0x03, 0xE0, 0x4D, 0x5D, 0xC7, 0x28, 0x97, 0xF2, 0xC0, 0x38, +0xCC, 0xD7, 0x32, 0x80, 0x9C, 0x0B, 0x31, 0xB4, 0x9A, 0xF5, 0x2C, 0x80, 0xD5, 0xAC, 0x67, 0xE7, +0x42, 0x0C, 0x01, 0xB9, 0xEF, 0x4B, 0x51, 0x20, 0x99, 0x3A, 0x4F, 0x67, 0x80, 0x64, 0x38, 0xFF, +0x4B, 0x2C, 0x2C, 0x6A, 0xAB, 0xA0, 0xDF, 0x01, 0x00, 0x85, 0xC4, 0x6C, 0x23, 0xF2, 0xF0, 0x72, +0xEA, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82}; + + +////////////////////////////////////////////////////////////////////////////////////////////// +const static char pngImageCapF[] = { +0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52, +0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0A, 0x08, 0x06, 0x00, 0x00, 0x00, 0x62, 0xF0, 0xA4, +0x83, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0B, 0x13, 0x00, 0x00, 0x0B, +0x13, 0x01, 0x00, 0x9A, 0x9C, 0x18, 0x00, 0x00, 0x0A, 0x4D, 0x69, 0x43, 0x43, 0x50, 0x50, 0x68, +0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x49, 0x43, 0x43, 0x20, 0x70, 0x72, 0x6F, 0x66, +0x69, 0x6C, 0x65, 0x00, 0x00, 0x78, 0xDA, 0x9D, 0x53, 0x77, 0x58, 0x93, 0xF7, 0x16, 0x3E, 0xDF, +0xF7, 0x65, 0x0F, 0x56, 0x42, 0xD8, 0xF0, 0xB1, 0x97, 0x6C, 0x81, 0x00, 0x22, 0x23, 0xAC, 0x08, +0xC8, 0x10, 0x59, 0xA2, 0x10, 0x92, 0x00, 0x61, 0x84, 0x10, 0x12, 0x40, 0xC5, 0x85, 0x88, 0x0A, +0x56, 0x14, 0x15, 0x11, 0x9C, 0x48, 0x55, 0xC4, 0x82, 0xD5, 0x0A, 0x48, 0x9D, 0x88, 0xE2, 0xA0, +0x28, 0xB8, 0x67, 0x41, 0x8A, 0x88, 0x5A, 0x8B, 0x55, 0x5C, 0x38, 0xEE, 0x1F, 0xDC, 0xA7, 0xB5, +0x7D, 0x7A, 0xEF, 0xED, 0xED, 0xFB, 0xD7, 0xFB, 0xBC, 0xE7, 0x9C, 0xE7, 0xFC, 0xCE, 0x79, 0xCF, +0x0F, 0x80, 0x11, 0x12, 0x26, 0x91, 0xE6, 0xA2, 0x6A, 0x00, 0x39, 0x52, 0x85, 0x3C, 0x3A, 0xD8, +0x1F, 0x8F, 0x4F, 0x48, 0xC4, 0xC9, 0xBD, 0x80, 0x02, 0x15, 0x48, 0xE0, 0x04, 0x20, 0x10, 0xE6, +0xCB, 0xC2, 0x67, 0x05, 0xC5, 0x00, 0x00, 0xF0, 0x03, 0x79, 0x78, 0x7E, 0x74, 0xB0, 0x3F, 0xFC, +0x01, 0xAF, 0x6F, 0x00, 0x02, 0x00, 0x70, 0xD5, 0x2E, 0x24, 0x12, 0xC7, 0xE1, 0xFF, 0x83, 0xBA, +0x50, 0x26, 0x57, 0x00, 0x20, 0x91, 0x00, 0xE0, 0x22, 0x12, 0xE7, 0x0B, 0x01, 0x90, 0x52, 0x00, +0xC8, 0x2E, 0x54, 0xC8, 0x14, 0x00, 0xC8, 0x18, 0x00, 0xB0, 0x53, 0xB3, 0x64, 0x0A, 0x00, 0x94, +0x00, 0x00, 0x6C, 0x79, 0x7C, 0x42, 0x22, 0x00, 0xAA, 0x0D, 0x00, 0xEC, 0xF4, 0x49, 0x3E, 0x05, +0x00, 0xD8, 0xA9, 0x93, 0xDC, 0x17, 0x00, 0xD8, 0xA2, 0x1C, 0xA9, 0x08, 0x00, 0x8D, 0x01, 0x00, +0x99, 0x28, 0x47, 0x24, 0x02, 0x40, 0xBB, 0x00, 0x60, 0x55, 0x81, 0x52, 0x2C, 0x02, 0xC0, 0xC2, +0x00, 0xA0, 0xAC, 0x40, 0x22, 0x2E, 0x04, 0xC0, 0xAE, 0x01, 0x80, 0x59, 0xB6, 0x32, 0x47, 0x02, +0x80, 0xBD, 0x05, 0x00, 0x76, 0x8E, 0x58, 0x90, 0x0F, 0x40, 0x60, 0x00, 0x80, 0x99, 0x42, 0x2C, +0xCC, 0x00, 0x20, 0x38, 0x02, 0x00, 0x43, 0x1E, 0x13, 0xCD, 0x03, 0x20, 0x4C, 0x03, 0xA0, 0x30, +0xD2, 0xBF, 0xE0, 0xA9, 0x5F, 0x70, 0x85, 0xB8, 0x48, 0x01, 0x00, 0xC0, 0xCB, 0x95, 0xCD, 0x97, +0x4B, 0xD2, 0x33, 0x14, 0xB8, 0x95, 0xD0, 0x1A, 0x77, 0xF2, 0xF0, 0xE0, 0xE2, 0x21, 0xE2, 0xC2, +0x6C, 0xB1, 0x42, 0x61, 0x17, 0x29, 0x10, 0x66, 0x09, 0xE4, 0x22, 0x9C, 0x97, 0x9B, 0x23, 0x13, +0x48, 0xE7, 0x03, 0x4C, 0xCE, 0x0C, 0x00, 0x00, 0x1A, 0xF9, 0xD1, 0xC1, 0xFE, 0x38, 0x3F, 0x90, +0xE7, 0xE6, 0xE4, 0xE1, 0xE6, 0x66, 0xE7, 0x6C, 0xEF, 0xF4, 0xC5, 0xA2, 0xFE, 0x6B, 0xF0, 0x6F, +0x22, 0x3E, 0x21, 0xF1, 0xDF, 0xFE, 0xBC, 0x8C, 0x02, 0x04, 0x00, 0x10, 0x4E, 0xCF, 0xEF, 0xDA, +0x5F, 0xE5, 0xE5, 0xD6, 0x03, 0x70, 0xC7, 0x01, 0xB0, 0x75, 0xBF, 0x6B, 0xA9, 0x5B, 0x00, 0xDA, +0x56, 0x00, 0x68, 0xDF, 0xF9, 0x5D, 0x33, 0xDB, 0x09, 0xA0, 0x5A, 0x0A, 0xD0, 0x7A, 0xF9, 0x8B, +0x79, 0x38, 0xFC, 0x40, 0x1E, 0x9E, 0xA1, 0x50, 0xC8, 0x3C, 0x1D, 0x1C, 0x0A, 0x0B, 0x0B, 0xED, +0x25, 0x62, 0xA1, 0xBD, 0x30, 0xE3, 0x8B, 0x3E, 0xFF, 0x33, 0xE1, 0x6F, 0xE0, 0x8B, 0x7E, 0xF6, +0xFC, 0x40, 0x1E, 0xFE, 0xDB, 0x7A, 0xF0, 0x00, 0x71, 0x9A, 0x40, 0x99, 0xAD, 0xC0, 0xA3, 0x83, +0xFD, 0x71, 0x61, 0x6E, 0x76, 0xAE, 0x52, 0x8E, 0xE7, 0xCB, 0x04, 0x42, 0x31, 0x6E, 0xF7, 0xE7, +0x23, 0xFE, 0xC7, 0x85, 0x7F, 0xFD, 0x8E, 0x29, 0xD1, 0xE2, 0x34, 0xB1, 0x5C, 0x2C, 0x15, 0x8A, +0xF1, 0x58, 0x89, 0xB8, 0x50, 0x22, 0x4D, 0xC7, 0x79, 0xB9, 0x52, 0x91, 0x44, 0x21, 0xC9, 0x95, +0xE2, 0x12, 0xE9, 0x7F, 0x32, 0xF1, 0x1F, 0x96, 0xFD, 0x09, 0x93, 0x77, 0x0D, 0x00, 0xAC, 0x86, +0x4F, 0xC0, 0x4E, 0xB6, 0x07, 0xB5, 0xCB, 0x6C, 0xC0, 0x7E, 0xEE, 0x01, 0x02, 0x8B, 0x0E, 0x58, +0xD2, 0x76, 0x00, 0x40, 0x7E, 0xF3, 0x2D, 0x8C, 0x1A, 0x0B, 0x91, 0x00, 0x10, 0x67, 0x34, 0x32, +0x79, 0xF7, 0x00, 0x00, 0x93, 0xBF, 0xF9, 0x8F, 0x40, 0x2B, 0x01, 0x00, 0xCD, 0x97, 0xA4, 0xE3, +0x00, 0x00, 0xBC, 0xE8, 0x18, 0x5C, 0xA8, 0x94, 0x17, 0x4C, 0xC6, 0x08, 0x00, 0x00, 0x44, 0xA0, +0x81, 0x2A, 0xB0, 0x41, 0x07, 0x0C, 0xC1, 0x14, 0xAC, 0xC0, 0x0E, 0x9C, 0xC1, 0x1D, 0xBC, 0xC0, +0x17, 0x02, 0x61, 0x06, 0x44, 0x40, 0x0C, 0x24, 0xC0, 0x3C, 0x10, 0x42, 0x06, 0xE4, 0x80, 0x1C, +0x0A, 0xA1, 0x18, 0x96, 0x41, 0x19, 0x54, 0xC0, 0x3A, 0xD8, 0x04, 0xB5, 0xB0, 0x03, 0x1A, 0xA0, +0x11, 0x9A, 0xE1, 0x10, 0xB4, 0xC1, 0x31, 0x38, 0x0D, 0xE7, 0xE0, 0x12, 0x5C, 0x81, 0xEB, 0x70, +0x17, 0x06, 0x60, 0x18, 0x9E, 0xC2, 0x18, 0xBC, 0x86, 0x09, 0x04, 0x41, 0xC8, 0x08, 0x13, 0x61, +0x21, 0x3A, 0x88, 0x11, 0x62, 0x8E, 0xD8, 0x22, 0xCE, 0x08, 0x17, 0x99, 0x8E, 0x04, 0x22, 0x61, +0x48, 0x34, 0x92, 0x80, 0xA4, 0x20, 0xE9, 0x88, 0x14, 0x51, 0x22, 0xC5, 0xC8, 0x72, 0xA4, 0x02, +0xA9, 0x42, 0x6A, 0x91, 0x5D, 0x48, 0x23, 0xF2, 0x2D, 0x72, 0x14, 0x39, 0x8D, 0x5C, 0x40, 0xFA, +0x90, 0xDB, 0xC8, 0x20, 0x32, 0x8A, 0xFC, 0x8A, 0xBC, 0x47, 0x31, 0x94, 0x81, 0xB2, 0x51, 0x03, +0xD4, 0x02, 0x75, 0x40, 0xB9, 0xA8, 0x1F, 0x1A, 0x8A, 0xC6, 0xA0, 0x73, 0xD1, 0x74, 0x34, 0x0F, +0x5D, 0x80, 0x96, 0xA2, 0x6B, 0xD1, 0x1A, 0xB4, 0x1E, 0x3D, 0x80, 0xB6, 0xA2, 0xA7, 0xD1, 0x4B, +0xE8, 0x75, 0x74, 0x00, 0x7D, 0x8A, 0x8E, 0x63, 0x80, 0xD1, 0x31, 0x0E, 0x66, 0x8C, 0xD9, 0x61, +0x5C, 0x8C, 0x87, 0x45, 0x60, 0x89, 0x58, 0x1A, 0x26, 0xC7, 0x16, 0x63, 0xE5, 0x58, 0x35, 0x56, +0x8F, 0x35, 0x63, 0x1D, 0x58, 0x37, 0x76, 0x15, 0x1B, 0xC0, 0x9E, 0x61, 0xEF, 0x08, 0x24, 0x02, +0x8B, 0x80, 0x13, 0xEC, 0x08, 0x5E, 0x84, 0x10, 0xC2, 0x6C, 0x82, 0x90, 0x90, 0x47, 0x58, 0x4C, +0x58, 0x43, 0xA8, 0x25, 0xEC, 0x23, 0xB4, 0x12, 0xBA, 0x08, 0x57, 0x09, 0x83, 0x84, 0x31, 0xC2, +0x27, 0x22, 0x93, 0xA8, 0x4F, 0xB4, 0x25, 0x7A, 0x12, 0xF9, 0xC4, 0x78, 0x62, 0x3A, 0xB1, 0x90, +0x58, 0x46, 0xAC, 0x26, 0xEE, 0x21, 0x1E, 0x21, 0x9E, 0x25, 0x5E, 0x27, 0x0E, 0x13, 0x5F, 0x93, +0x48, 0x24, 0x0E, 0xC9, 0x92, 0xE4, 0x4E, 0x0A, 0x21, 0x25, 0x90, 0x32, 0x49, 0x0B, 0x49, 0x6B, +0x48, 0xDB, 0x48, 0x2D, 0xA4, 0x53, 0xA4, 0x3E, 0xD2, 0x10, 0x69, 0x9C, 0x4C, 0x26, 0xEB, 0x90, +0x6D, 0xC9, 0xDE, 0xE4, 0x08, 0xB2, 0x80, 0xAC, 0x20, 0x97, 0x91, 0xB7, 0x90, 0x0F, 0x90, 0x4F, +0x92, 0xFB, 0xC9, 0xC3, 0xE4, 0xB7, 0x14, 0x3A, 0xC5, 0x88, 0xE2, 0x4C, 0x09, 0xA2, 0x24, 0x52, +0xA4, 0x94, 0x12, 0x4A, 0x35, 0x65, 0x3F, 0xE5, 0x04, 0xA5, 0x9F, 0x32, 0x42, 0x99, 0xA0, 0xAA, +0x51, 0xCD, 0xA9, 0x9E, 0xD4, 0x08, 0xAA, 0x88, 0x3A, 0x9F, 0x5A, 0x49, 0x6D, 0xA0, 0x76, 0x50, +0x2F, 0x53, 0x87, 0xA9, 0x13, 0x34, 0x75, 0x9A, 0x25, 0xCD, 0x9B, 0x16, 0x43, 0xCB, 0xA4, 0x2D, +0xA3, 0xD5, 0xD0, 0x9A, 0x69, 0x67, 0x69, 0xF7, 0x68, 0x2F, 0xE9, 0x74, 0xBA, 0x09, 0xDD, 0x83, +0x1E, 0x45, 0x97, 0xD0, 0x97, 0xD2, 0x6B, 0xE8, 0x07, 0xE9, 0xE7, 0xE9, 0x83, 0xF4, 0x77, 0x0C, +0x0D, 0x86, 0x0D, 0x83, 0xC7, 0x48, 0x62, 0x28, 0x19, 0x6B, 0x19, 0x7B, 0x19, 0xA7, 0x18, 0xB7, +0x19, 0x2F, 0x99, 0x4C, 0xA6, 0x05, 0xD3, 0x97, 0x99, 0xC8, 0x54, 0x30, 0xD7, 0x32, 0x1B, 0x99, +0x67, 0x98, 0x0F, 0x98, 0x6F, 0x55, 0x58, 0x2A, 0xF6, 0x2A, 0x7C, 0x15, 0x91, 0xCA, 0x12, 0x95, +0x3A, 0x95, 0x56, 0x95, 0x7E, 0x95, 0xE7, 0xAA, 0x54, 0x55, 0x73, 0x55, 0x3F, 0xD5, 0x79, 0xAA, +0x0B, 0x54, 0xAB, 0x55, 0x0F, 0xAB, 0x5E, 0x56, 0x7D, 0xA6, 0x46, 0x55, 0xB3, 0x50, 0xE3, 0xA9, +0x09, 0xD4, 0x16, 0xAB, 0xD5, 0xA9, 0x1D, 0x55, 0xBB, 0xA9, 0x36, 0xAE, 0xCE, 0x52, 0x77, 0x52, +0x8F, 0x50, 0xCF, 0x51, 0x5F, 0xA3, 0xBE, 0x5F, 0xFD, 0x82, 0xFA, 0x63, 0x0D, 0xB2, 0x86, 0x85, +0x46, 0xA0, 0x86, 0x48, 0xA3, 0x54, 0x63, 0xB7, 0xC6, 0x19, 0x8D, 0x21, 0x16, 0xC6, 0x32, 0x65, +0xF1, 0x58, 0x42, 0xD6, 0x72, 0x56, 0x03, 0xEB, 0x2C, 0x6B, 0x98, 0x4D, 0x62, 0x5B, 0xB2, 0xF9, +0xEC, 0x4C, 0x76, 0x05, 0xFB, 0x1B, 0x76, 0x2F, 0x7B, 0x4C, 0x53, 0x43, 0x73, 0xAA, 0x66, 0xAC, +0x66, 0x91, 0x66, 0x9D, 0xE6, 0x71, 0xCD, 0x01, 0x0E, 0xC6, 0xB1, 0xE0, 0xF0, 0x39, 0xD9, 0x9C, +0x4A, 0xCE, 0x21, 0xCE, 0x0D, 0xCE, 0x7B, 0x2D, 0x03, 0x2D, 0x3F, 0x2D, 0xB1, 0xD6, 0x6A, 0xAD, +0x66, 0xAD, 0x7E, 0xAD, 0x37, 0xDA, 0x7A, 0xDA, 0xBE, 0xDA, 0x62, 0xED, 0x72, 0xED, 0x16, 0xED, +0xEB, 0xDA, 0xEF, 0x75, 0x70, 0x9D, 0x40, 0x9D, 0x2C, 0x9D, 0xF5, 0x3A, 0x6D, 0x3A, 0xF7, 0x75, +0x09, 0xBA, 0x36, 0xBA, 0x51, 0xBA, 0x85, 0xBA, 0xDB, 0x75, 0xCF, 0xEA, 0x3E, 0xD3, 0x63, 0xEB, +0x79, 0xE9, 0x09, 0xF5, 0xCA, 0xF5, 0x0E, 0xE9, 0xDD, 0xD1, 0x47, 0xF5, 0x6D, 0xF4, 0xA3, 0xF5, +0x17, 0xEA, 0xEF, 0xD6, 0xEF, 0xD1, 0x1F, 0x37, 0x30, 0x34, 0x08, 0x36, 0x90, 0x19, 0x6C, 0x31, +0x38, 0x63, 0xF0, 0xCC, 0x90, 0x63, 0xE8, 0x6B, 0x98, 0x69, 0xB8, 0xD1, 0xF0, 0x84, 0xE1, 0xA8, +0x11, 0xCB, 0x68, 0xBA, 0x91, 0xC4, 0x68, 0xA3, 0xD1, 0x49, 0xA3, 0x27, 0xB8, 0x26, 0xEE, 0x87, +0x67, 0xE3, 0x35, 0x78, 0x17, 0x3E, 0x66, 0xAC, 0x6F, 0x1C, 0x62, 0xAC, 0x34, 0xDE, 0x65, 0xDC, +0x6B, 0x3C, 0x61, 0x62, 0x69, 0x32, 0xDB, 0xA4, 0xC4, 0xA4, 0xC5, 0xE4, 0xBE, 0x29, 0xCD, 0x94, +0x6B, 0x9A, 0x66, 0xBA, 0xD1, 0xB4, 0xD3, 0x74, 0xCC, 0xCC, 0xC8, 0x2C, 0xDC, 0xAC, 0xD8, 0xAC, +0xC9, 0xEC, 0x8E, 0x39, 0xD5, 0x9C, 0x6B, 0x9E, 0x61, 0xBE, 0xD9, 0xBC, 0xDB, 0xFC, 0x8D, 0x85, +0xA5, 0x45, 0x9C, 0xC5, 0x4A, 0x8B, 0x36, 0x8B, 0xC7, 0x96, 0xDA, 0x96, 0x7C, 0xCB, 0x05, 0x96, +0x4D, 0x96, 0xF7, 0xAC, 0x98, 0x56, 0x3E, 0x56, 0x79, 0x56, 0xF5, 0x56, 0xD7, 0xAC, 0x49, 0xD6, +0x5C, 0xEB, 0x2C, 0xEB, 0x6D, 0xD6, 0x57, 0x6C, 0x50, 0x1B, 0x57, 0x9B, 0x0C, 0x9B, 0x3A, 0x9B, +0xCB, 0xB6, 0xA8, 0xAD, 0x9B, 0xAD, 0xC4, 0x76, 0x9B, 0x6D, 0xDF, 0x14, 0xE2, 0x14, 0x8F, 0x29, +0xD2, 0x29, 0xF5, 0x53, 0x6E, 0xDA, 0x31, 0xEC, 0xFC, 0xEC, 0x0A, 0xEC, 0x9A, 0xEC, 0x06, 0xED, +0x39, 0xF6, 0x61, 0xF6, 0x25, 0xF6, 0x6D, 0xF6, 0xCF, 0x1D, 0xCC, 0x1C, 0x12, 0x1D, 0xD6, 0x3B, +0x74, 0x3B, 0x7C, 0x72, 0x74, 0x75, 0xCC, 0x76, 0x6C, 0x70, 0xBC, 0xEB, 0xA4, 0xE1, 0x34, 0xC3, +0xA9, 0xC4, 0xA9, 0xC3, 0xE9, 0x57, 0x67, 0x1B, 0x67, 0xA1, 0x73, 0x9D, 0xF3, 0x35, 0x17, 0xA6, +0x4B, 0x90, 0xCB, 0x12, 0x97, 0x76, 0x97, 0x17, 0x53, 0x6D, 0xA7, 0x8A, 0xA7, 0x6E, 0x9F, 0x7A, +0xCB, 0x95, 0xE5, 0x1A, 0xEE, 0xBA, 0xD2, 0xB5, 0xD3, 0xF5, 0xA3, 0x9B, 0xBB, 0x9B, 0xDC, 0xAD, +0xD9, 0x6D, 0xD4, 0xDD, 0xCC, 0x3D, 0xC5, 0x7D, 0xAB, 0xFB, 0x4D, 0x2E, 0x9B, 0x1B, 0xC9, 0x5D, +0xC3, 0x3D, 0xEF, 0x41, 0xF4, 0xF0, 0xF7, 0x58, 0xE2, 0x71, 0xCC, 0xE3, 0x9D, 0xA7, 0x9B, 0xA7, +0xC2, 0xF3, 0x90, 0xE7, 0x2F, 0x5E, 0x76, 0x5E, 0x59, 0x5E, 0xFB, 0xBD, 0x1E, 0x4F, 0xB3, 0x9C, +0x26, 0x9E, 0xD6, 0x30, 0x6D, 0xC8, 0xDB, 0xC4, 0x5B, 0xE0, 0xBD, 0xCB, 0x7B, 0x60, 0x3A, 0x3E, +0x3D, 0x65, 0xFA, 0xCE, 0xE9, 0x03, 0x3E, 0xC6, 0x3E, 0x02, 0x9F, 0x7A, 0x9F, 0x87, 0xBE, 0xA6, +0xBE, 0x22, 0xDF, 0x3D, 0xBE, 0x23, 0x7E, 0xD6, 0x7E, 0x99, 0x7E, 0x07, 0xFC, 0x9E, 0xFB, 0x3B, +0xFA, 0xCB, 0xFD, 0x8F, 0xF8, 0xBF, 0xE1, 0x79, 0xF2, 0x16, 0xF1, 0x4E, 0x05, 0x60, 0x01, 0xC1, +0x01, 0xE5, 0x01, 0xBD, 0x81, 0x1A, 0x81, 0xB3, 0x03, 0x6B, 0x03, 0x1F, 0x04, 0x99, 0x04, 0xA5, +0x07, 0x35, 0x05, 0x8D, 0x05, 0xBB, 0x06, 0x2F, 0x0C, 0x3E, 0x15, 0x42, 0x0C, 0x09, 0x0D, 0x59, +0x1F, 0x72, 0x93, 0x6F, 0xC0, 0x17, 0xF2, 0x1B, 0xF9, 0x63, 0x33, 0xDC, 0x67, 0x2C, 0x9A, 0xD1, +0x15, 0xCA, 0x08, 0x9D, 0x15, 0x5A, 0x1B, 0xFA, 0x30, 0xCC, 0x26, 0x4C, 0x1E, 0xD6, 0x11, 0x8E, +0x86, 0xCF, 0x08, 0xDF, 0x10, 0x7E, 0x6F, 0xA6, 0xF9, 0x4C, 0xE9, 0xCC, 0xB6, 0x08, 0x88, 0xE0, +0x47, 0x6C, 0x88, 0xB8, 0x1F, 0x69, 0x19, 0x99, 0x17, 0xF9, 0x7D, 0x14, 0x29, 0x2A, 0x32, 0xAA, +0x2E, 0xEA, 0x51, 0xB4, 0x53, 0x74, 0x71, 0x74, 0xF7, 0x2C, 0xD6, 0xAC, 0xE4, 0x59, 0xFB, 0x67, +0xBD, 0x8E, 0xF1, 0x8F, 0xA9, 0x8C, 0xB9, 0x3B, 0xDB, 0x6A, 0xB6, 0x72, 0x76, 0x67, 0xAC, 0x6A, +0x6C, 0x52, 0x6C, 0x63, 0xEC, 0x9B, 0xB8, 0x80, 0xB8, 0xAA, 0xB8, 0x81, 0x78, 0x87, 0xF8, 0x45, +0xF1, 0x97, 0x12, 0x74, 0x13, 0x24, 0x09, 0xED, 0x89, 0xE4, 0xC4, 0xD8, 0xC4, 0x3D, 0x89, 0xE3, +0x73, 0x02, 0xE7, 0x6C, 0x9A, 0x33, 0x9C, 0xE4, 0x9A, 0x54, 0x96, 0x74, 0x63, 0xAE, 0xE5, 0xDC, +0xA2, 0xB9, 0x17, 0xE6, 0xE9, 0xCE, 0xCB, 0x9E, 0x77, 0x3C, 0x59, 0x35, 0x59, 0x90, 0x7C, 0x38, +0x85, 0x98, 0x12, 0x97, 0xB2, 0x3F, 0xE5, 0x83, 0x20, 0x42, 0x50, 0x2F, 0x18, 0x4F, 0xE5, 0xA7, +0x6E, 0x4D, 0x1D, 0x13, 0xF2, 0x84, 0x9B, 0x85, 0x4F, 0x45, 0xBE, 0xA2, 0x8D, 0xA2, 0x51, 0xB1, +0xB7, 0xB8, 0x4A, 0x3C, 0x92, 0xE6, 0x9D, 0x56, 0x95, 0xF6, 0x38, 0xDD, 0x3B, 0x7D, 0x43, 0xFA, +0x68, 0x86, 0x4F, 0x46, 0x75, 0xC6, 0x33, 0x09, 0x4F, 0x52, 0x2B, 0x79, 0x91, 0x19, 0x92, 0xB9, +0x23, 0xF3, 0x4D, 0x56, 0x44, 0xD6, 0xDE, 0xAC, 0xCF, 0xD9, 0x71, 0xD9, 0x2D, 0x39, 0x94, 0x9C, +0x94, 0x9C, 0xA3, 0x52, 0x0D, 0x69, 0x96, 0xB4, 0x2B, 0xD7, 0x30, 0xB7, 0x28, 0xB7, 0x4F, 0x66, +0x2B, 0x2B, 0x93, 0x0D, 0xE4, 0x79, 0xE6, 0x6D, 0xCA, 0x1B, 0x93, 0x87, 0xCA, 0xF7, 0xE4, 0x23, +0xF9, 0x73, 0xF3, 0xDB, 0x15, 0x6C, 0x85, 0x4C, 0xD1, 0xA3, 0xB4, 0x52, 0xAE, 0x50, 0x0E, 0x16, +0x4C, 0x2F, 0xA8, 0x2B, 0x78, 0x5B, 0x18, 0x5B, 0x78, 0xB8, 0x48, 0xBD, 0x48, 0x5A, 0xD4, 0x33, +0xDF, 0x66, 0xFE, 0xEA, 0xF9, 0x23, 0x0B, 0x82, 0x16, 0x7C, 0xBD, 0x90, 0xB0, 0x50, 0xB8, 0xB0, +0xB3, 0xD8, 0xB8, 0x78, 0x59, 0xF1, 0xE0, 0x22, 0xBF, 0x45, 0xBB, 0x16, 0x23, 0x8B, 0x53, 0x17, +0x77, 0x2E, 0x31, 0x5D, 0x52, 0xBA, 0x64, 0x78, 0x69, 0xF0, 0xD2, 0x7D, 0xCB, 0x68, 0xCB, 0xB2, +0x96, 0xFD, 0x50, 0xE2, 0x58, 0x52, 0x55, 0xF2, 0x6A, 0x79, 0xDC, 0xF2, 0x8E, 0x52, 0x83, 0xD2, +0xA5, 0xA5, 0x43, 0x2B, 0x82, 0x57, 0x34, 0x95, 0xA9, 0x94, 0xC9, 0xCB, 0x6E, 0xAE, 0xF4, 0x5A, +0xB9, 0x63, 0x15, 0x61, 0x95, 0x64, 0x55, 0xEF, 0x6A, 0x97, 0xD5, 0x5B, 0x56, 0x7F, 0x2A, 0x17, +0x95, 0x5F, 0xAC, 0x70, 0xAC, 0xA8, 0xAE, 0xF8, 0xB0, 0x46, 0xB8, 0xE6, 0xE2, 0x57, 0x4E, 0x5F, +0xD5, 0x7C, 0xF5, 0x79, 0x6D, 0xDA, 0xDA, 0xDE, 0x4A, 0xB7, 0xCA, 0xED, 0xEB, 0x48, 0xEB, 0xA4, +0xEB, 0x6E, 0xAC, 0xF7, 0x59, 0xBF, 0xAF, 0x4A, 0xBD, 0x6A, 0x41, 0xD5, 0xD0, 0x86, 0xF0, 0x0D, +0xAD, 0x1B, 0xF1, 0x8D, 0xE5, 0x1B, 0x5F, 0x6D, 0x4A, 0xDE, 0x74, 0xA1, 0x7A, 0x6A, 0xF5, 0x8E, +0xCD, 0xB4, 0xCD, 0xCA, 0xCD, 0x03, 0x35, 0x61, 0x35, 0xED, 0x5B, 0xCC, 0xB6, 0xAC, 0xDB, 0xF2, +0xA1, 0x36, 0xA3, 0xF6, 0x7A, 0x9D, 0x7F, 0x5D, 0xCB, 0x56, 0xFD, 0xAD, 0xAB, 0xB7, 0xBE, 0xD9, +0x26, 0xDA, 0xD6, 0xBF, 0xDD, 0x77, 0x7B, 0xF3, 0x0E, 0x83, 0x1D, 0x15, 0x3B, 0xDE, 0xEF, 0x94, +0xEC, 0xBC, 0xB5, 0x2B, 0x78, 0x57, 0x6B, 0xBD, 0x45, 0x7D, 0xF5, 0x6E, 0xD2, 0xEE, 0x82, 0xDD, +0x8F, 0x1A, 0x62, 0x1B, 0xBA, 0xBF, 0xE6, 0x7E, 0xDD, 0xB8, 0x47, 0x77, 0x4F, 0xC5, 0x9E, 0x8F, +0x7B, 0xA5, 0x7B, 0x07, 0xF6, 0x45, 0xEF, 0xEB, 0x6A, 0x74, 0x6F, 0x6C, 0xDC, 0xAF, 0xBF, 0xBF, +0xB2, 0x09, 0x6D, 0x52, 0x36, 0x8D, 0x1E, 0x48, 0x3A, 0x70, 0xE5, 0x9B, 0x80, 0x6F, 0xDA, 0x9B, +0xED, 0x9A, 0x77, 0xB5, 0x70, 0x5A, 0x2A, 0x0E, 0xC2, 0x41, 0xE5, 0xC1, 0x27, 0xDF, 0xA6, 0x7C, +0x7B, 0xE3, 0x50, 0xE8, 0xA1, 0xCE, 0xC3, 0xDC, 0xC3, 0xCD, 0xDF, 0x99, 0x7F, 0xB7, 0xF5, 0x08, +0xEB, 0x48, 0x79, 0x2B, 0xD2, 0x3A, 0xBF, 0x75, 0xAC, 0x2D, 0xA3, 0x6D, 0xA0, 0x3D, 0xA1, 0xBD, +0xEF, 0xE8, 0x8C, 0xA3, 0x9D, 0x1D, 0x5E, 0x1D, 0x47, 0xBE, 0xB7, 0xFF, 0x7E, 0xEF, 0x31, 0xE3, +0x63, 0x75, 0xC7, 0x35, 0x8F, 0x57, 0x9E, 0xA0, 0x9D, 0x28, 0x3D, 0xF1, 0xF9, 0xE4, 0x82, 0x93, +0xE3, 0xA7, 0x64, 0xA7, 0x9E, 0x9D, 0x4E, 0x3F, 0x3D, 0xD4, 0x99, 0xDC, 0x79, 0xF7, 0x4C, 0xFC, +0x99, 0x6B, 0x5D, 0x51, 0x5D, 0xBD, 0x67, 0x43, 0xCF, 0x9E, 0x3F, 0x17, 0x74, 0xEE, 0x4C, 0xB7, +0x5F, 0xF7, 0xC9, 0xF3, 0xDE, 0xE7, 0x8F, 0x5D, 0xF0, 0xBC, 0x70, 0xF4, 0x22, 0xF7, 0x62, 0xDB, +0x25, 0xB7, 0x4B, 0xAD, 0x3D, 0xAE, 0x3D, 0x47, 0x7E, 0x70, 0xFD, 0xE1, 0x48, 0xAF, 0x5B, 0x6F, +0xEB, 0x65, 0xF7, 0xCB, 0xED, 0x57, 0x3C, 0xAE, 0x74, 0xF4, 0x4D, 0xEB, 0x3B, 0xD1, 0xEF, 0xD3, +0x7F, 0xFA, 0x6A, 0xC0, 0xD5, 0x73, 0xD7, 0xF8, 0xD7, 0x2E, 0x5D, 0x9F, 0x79, 0xBD, 0xEF, 0xC6, +0xEC, 0x1B, 0xB7, 0x6E, 0x26, 0xDD, 0x1C, 0xB8, 0x25, 0xBA, 0xF5, 0xF8, 0x76, 0xF6, 0xED, 0x17, +0x77, 0x0A, 0xEE, 0x4C, 0xDC, 0x5D, 0x7A, 0x8F, 0x78, 0xAF, 0xFC, 0xBE, 0xDA, 0xFD, 0xEA, 0x07, +0xFA, 0x0F, 0xEA, 0x7F, 0xB4, 0xFE, 0xB1, 0x65, 0xC0, 0x6D, 0xE0, 0xF8, 0x60, 0xC0, 0x60, 0xCF, +0xC3, 0x59, 0x0F, 0xEF, 0x0E, 0x09, 0x87, 0x9E, 0xFE, 0x94, 0xFF, 0xD3, 0x87, 0xE1, 0xD2, 0x47, +0xCC, 0x47, 0xD5, 0x23, 0x46, 0x23, 0x8D, 0x8F, 0x9D, 0x1F, 0x1F, 0x1B, 0x0D, 0x1A, 0xBD, 0xF2, +0x64, 0xCE, 0x93, 0xE1, 0xA7, 0xB2, 0xA7, 0x13, 0xCF, 0xCA, 0x7E, 0x56, 0xFF, 0x79, 0xEB, 0x73, +0xAB, 0xE7, 0xDF, 0xFD, 0xE2, 0xFB, 0x4B, 0xCF, 0x58, 0xFC, 0xD8, 0xF0, 0x0B, 0xF9, 0x8B, 0xCF, +0xBF, 0xAE, 0x79, 0xA9, 0xF3, 0x72, 0xEF, 0xAB, 0xA9, 0xAF, 0x3A, 0xC7, 0x23, 0xC7, 0x1F, 0xBC, +0xCE, 0x79, 0x3D, 0xF1, 0xA6, 0xFC, 0xAD, 0xCE, 0xDB, 0x7D, 0xEF, 0xB8, 0xEF, 0xBA, 0xDF, 0xC7, +0xBD, 0x1F, 0x99, 0x28, 0xFC, 0x40, 0xFE, 0x50, 0xF3, 0xD1, 0xFA, 0x63, 0xC7, 0xA7, 0xD0, 0x4F, +0xF7, 0x3E, 0xE7, 0x7C, 0xFE, 0xFC, 0x2F, 0xF7, 0x84, 0xF3, 0xFB, 0x25, 0xD2, 0x9F, 0x33, 0x00, +0x00, 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, 0x7A, 0x25, 0x00, 0x00, 0x80, 0x83, 0x00, +0x00, 0xF9, 0xFF, 0x00, 0x00, 0x80, 0xE9, 0x00, 0x00, 0x75, 0x30, 0x00, 0x00, 0xEA, 0x60, 0x00, +0x00, 0x3A, 0x98, 0x00, 0x00, 0x17, 0x6F, 0x92, 0x5F, 0xC5, 0x46, 0x00, 0x00, 0x00, 0xFB, 0x49, +0x44, 0x41, 0x54, 0x78, 0xDA, 0x7C, 0xD1, 0xBD, 0x6A, 0xC2, 0x60, 0x14, 0xC6, 0xF1, 0xBF, 0xD1, +0xA1, 0x63, 0x3F, 0x5C, 0xBC, 0x91, 0x5E, 0x44, 0x6F, 0xA0, 0xB7, 0xE0, 0x6C, 0xE9, 0xD8, 0x1B, +0x50, 0x2B, 0x88, 0x43, 0xEB, 0x52, 0x48, 0x17, 0x6D, 0x1D, 0x0A, 0x0E, 0x81, 0x08, 0x42, 0x40, +0x1C, 0xEA, 0xD0, 0xA2, 0x16, 0x85, 0xD0, 0x52, 0xC8, 0xE2, 0xA0, 0xF6, 0x55, 0x24, 0xD1, 0x37, +0xD6, 0x37, 0x2E, 0xB1, 0x08, 0x6A, 0x9F, 0xED, 0x9C, 0xF3, 0x9B, 0xCE, 0x13, 0x01, 0x8E, 0x80, +0x38, 0x70, 0x0C, 0xC4, 0xD8, 0xCD, 0x2F, 0x30, 0x01, 0x46, 0x11, 0xE0, 0x2C, 0x73, 0xFF, 0x64, +0x9C, 0x9C, 0xC6, 0xCF, 0x39, 0x10, 0xF1, 0x33, 0x6A, 0x5D, 0x27, 0x2F, 0x2F, 0x34, 0x40, 0x56, +0x2B, 0x7A, 0x41, 0x29, 0xB5, 0xDA, 0x07, 0x95, 0x52, 0xAB, 0x6A, 0x45, 0x2F, 0x00, 0x52, 0x03, +0xDC, 0x46, 0xDD, 0xB0, 0xEC, 0x7E, 0xC7, 0xDC, 0x87, 0xED, 0x5E, 0xBB, 0xD6, 0xA8, 0x1B, 0x16, +0xE0, 0x6A, 0x40, 0x00, 0x0C, 0x9F, 0x1F, 0xEF, 0xD2, 0x52, 0x2E, 0xBC, 0x6D, 0xE8, 0xFB, 0x72, +0xFE, 0x52, 0x7E, 0xB8, 0x05, 0x86, 0x40, 0xA0, 0x6D, 0xF6, 0xCE, 0xF7, 0x67, 0xFF, 0xE3, 0xBD, +0x55, 0xDE, 0xC6, 0xDD, 0xB7, 0xD7, 0xD2, 0x97, 0xDD, 0xEB, 0x02, 0x3E, 0xC0, 0x06, 0x07, 0x80, +0xD0, 0x8B, 0xB9, 0xFC, 0x54, 0x8C, 0x07, 0x00, 0x53, 0x31, 0x1E, 0xE8, 0xC5, 0x5C, 0x1E, 0x10, +0xE1, 0xFD, 0x0F, 0x03, 0x2C, 0x3D, 0x77, 0xE6, 0x34, 0x2D, 0x33, 0x0B, 0xD0, 0xB4, 0xCC, 0xAC, +0xE7, 0xCE, 0x1C, 0x60, 0x79, 0xE8, 0x4B, 0x51, 0x20, 0x71, 0x75, 0x93, 0x49, 0x01, 0x89, 0x70, +0xFE, 0x37, 0xB1, 0xB0, 0xA8, 0x9D, 0x82, 0xD6, 0x03, 0x00, 0xB4, 0xA2, 0x69, 0x23, 0xE2, 0x9D, +0x11, 0xE7, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82}; +//////////////////////////////////////////////////////////////////////////////////// +#define EX_FRAME 0 +#define IN_FRAME 1 +#define IN_RECT 2 +#define ALL 3 +static COLORREF + CLR_TXT_NOR = RGB( 156, 170, 189 ), + CLR_TXT_HOT = RGB( 201, 214, 229 ), + CLR_TXT_DIS = RGB( 75, 77, 79 ); +/* + clrFrameExBound = RGB(65,70,77), + + clrFrameExNormal = RGB(125,128,131), + clrFrameExEnter = RGB(145,156,170), + clrFrameExDisable = RGB(109,114,120), + + clrFrameBoundNormal = RGB(125,128,131), + clrFrameBoundEnter = RGB(86,89,91), + + clrFrameNormal = RGB(44,46,48), + clrLineNormal = RGB(44,46,48), + + clrRectNormal = RGB(74,80,88), + clrRectDisable = RGB(100,106,113), + + //Ǵңϵ + + clrCapArrowOpenBound[10]= + { RGB(50,54,60),RGB(54,58,64),RGB(57,61,67),RGB(58,63,69), + RGB(58,63,69),RGB(62,67,74),RGB(64,69,76), + RGB(66,71,78),RGB(68,74,81), + RGB(71,77,85)}, + + clrCapArrowOpenLine[4] = + { RGB(59,64,70), + RGB(65,70,77), + RGB(69,75,82), + RGB(73,78,86)}, + clrExFrameBound[4] = + { RGB(81,87,94), + RGB(94,100,107), + RGB(113,118,124), + RGB(126,130,136) + }, + clrExFrameBoundDisable[4] = + { RGB(77,83,91), + RGB(86,91,99), + RGB(98,103,110), + RGB(105,110,117) + }; +*/ +//////////////////////////////////////////////////////////////////////////////////// + +#define PIXEL_EXTERNAL_FRAME 1 //߽С +#define PIXEL_INTERNAL_FARME 1 //ڱ߽С +#define PIXEL_INTERNAL_BOUND 1 //ԲǴС +#define PIXEL_INTERNAL_DISPART 1 //ָ +#define PIXLE_TEXT_LEFT_OFFSET 3 //ƫƾ +#define PIXEL_INTERNAL_RECTRIGHT_HEIGHT m_pPngButton->Height //ڲͼƬ߶ +#define PIXEL_INTERNAL_RECTRIGHT_WIDTH m_pPngButton->Width //ڲͼƬ +//ڲߵRightֵ +#define PIXEL_INTERNAL_RECTLEFT_RIGHT Width - PIXEL_EXTERNAL_FRAME \ + - PIXEL_INTERNAL_FARME \ + - PIXEL_INTERNAL_RECTRIGHT_WIDTH \ + - PIXEL_INTERNAL_DISPART +//X Y ʣĿȺ͸߶ +#define PIXEL_TEXT_X Width - 2*PIXLE_TEXT_LEFT_OFFSET \ + - PIXEL_INTERNAL_RECTRIGHT_WIDTH \ + - PIXEL_INTERNAL_DISPART + +#define PIXEL_TEXT_Y Height - 2 * PIXEL_EXTERNAL_FRAME \ + - 2 * PIXEL_INTERNAL_FARME + +//--------------------------------------------------------------------------- +__fastcall CBCapButton::CBCapButton(TComponent* Owner) + : TGraphicControl(Owner) +{ + Height = 24; //a default Height + Width = 75; //a default Width + FStateCount = 4; //default state count + FDown = false; + ShowHint = true; + + FPngImg = new Vcl::Imaging::Pngimage::TPngImage(); //we create our png + + m_pPngButton = new TPngImage(); + m_pPngFoucusButton = new TPngImage(); + + pTmpDraw = new TPngImage(); + pTmpFoucusDraw = new TPngImage(); + + TMemoryStream *pngStream = new TMemoryStream(); + + pngStream->Position = 0; + pngStream->WriteBuffer(pngImageCap, 3021); + pngStream->Position = 0; + m_pPngButton->LoadFromStream(pngStream); + pTmpDraw->Assign(m_pPngButton); + + pngStream->Clear(); + pngStream->Position = 0; + pngStream->WriteBuffer(pngImageCapF, 3022); + pngStream->Position = 0; + m_pPngFoucusButton->LoadFromStream(pngStream); + pTmpFoucusDraw->Assign(m_pPngFoucusButton); + + delete pngStream; + + pTmpDraw->SetSize(m_pPngButton->Width, m_pPngButton->Height); + pTmpFoucusDraw->SetSize(m_pPngFoucusButton->Width, m_pPngFoucusButton->Height); + + + FEnablePNG = false; + + Canvas->Font->Size = 8; + + FBorderColor = TColor(0x83807d); + FInterFrameColor = TColor(0x302e2c); + FInterColor = TColor(0x58504a); + + IniColor( ALL ); +} + +//--------------------------------------------------------------------------- + +__fastcall CBCapButton::~CBCapButton(void) +{ + if(m_pPngButton) + delete m_pPngButton; + + if(FPngImg) + delete FPngImg; + + if(pTmpDraw) + delete pTmpDraw; +} + +//--------------------------------------------------------------------------- + +void __fastcall CBCapButton::SetStateCount( int count ) +{ + if( count>4 ) count = 4; + if( count<2 ) count = 2; + + FStateCount = count; +} + +//--------------------------------------------------------------------------- + +void __fastcall CBCapButton::SetPngImg(Vcl::Imaging::Pngimage::TPngImage *value) +{ + + if(value) { + FPngImg->Assign(value); + FEnablePNG = true; + }else { + FEnablePNG = false; + return; + } + + //Now setting the component width and height by the png image used + Height = FPngImg->Height; + Width = FPngImg->Width / FStateCount; + + Constraints->MaxHeight = Height; + Constraints->MinHeight = Height; + Constraints->MaxWidth = Width; + Constraints->MinWidth = Width; + + EtatBtn = 0; //reset the component state to normal +} + +//--------------------------------------------------------------------------- +void __fastcall CBCapButton::SetDown(bool value) +{ + if( FStateCount<3 ) + value = false; + + FDown = value; + if( FDown==False ) + EtatBtn = 0; //is the mouse down is false then we reset the component state to normal + + Paint(); + Refresh(); //we repaint the componet) +} + +//--------------------------------------------------------------------------- +void __fastcall CBCapButton::Paint(void) +{ + + if( ComponentState.Contains(csDesigning) ){ //ʱ + + if(FEnablePNG){ + if( FPngImg ){ //pngʽͼƬ + Constraints->MaxHeight = FPngImg->Height; + Constraints->MinHeight = FPngImg->Height; + Constraints->MaxWidth = FPngImg->Width / FStateCount; + Constraints->MinWidth = FPngImg->Width / FStateCount; + } + + //get component state: down, enabled/disabled + if( FPngImg && Enabled ) + FPngImg->Draw( Canvas, Rect(0, 0, FStateCount*Width, Height) ); // Normal + if( FPngImg && Enabled && FDown ) + FPngImg->Draw( Canvas, Rect(-(Width*2), 0, (FStateCount-2)*Width, Height) ); // the component is pressed + if( FPngImg && !Enabled ) + FPngImg->Draw( Canvas, Rect(-(Width*3), 0, (FStateCount-3)*Width, Height) ); // Disabled + + // design a rectangle for our component + // this can be removed to achieve cool rounded buttons + //Canvas->Pen->Style = psDot; + //Canvas->Brush->Style = bsClear; + //Canvas->Rectangle( 0, 0, Width, Height ); + }else{ //Ի汳 + + if(m_pPngButton){ + //add by tj 2013/12/10 +// Height = m_pPngButton->Height + PIXEL_HEIGHT_ADD_PIC; +// Constraints->MaxHeight = Height; +// Constraints->MaxHeight = m_pPngButton->Height + PIXEL_HEIGHT_ADD_PIC; +// Constraints->MinHeight = 21; +// Constraints->MinWidth = m_pPngButton->Width + 26; + } + + + if( FDown ) EtatBtn = 2; + if( !Enabled ) EtatBtn = 3; + + PaintCustomer(); + } + } + else{ //ʱ + if( FDown ) EtatBtn = 2; + if( !Enabled ) EtatBtn = 3; + + if( FEnablePNG && FPngImg ){ //pngʽͼƬ + switch( EtatBtn ){ + case 0: + FPngImg->Draw( Canvas, Rect(0, 0, FStateCount*Width, Height) ); // Normal + break; + case 1: + FPngImg->Draw( Canvas, Rect(-Width, 0, (FStateCount-1)*Width, Height) ); // Mouse Entered + break; + case 2: + FPngImg->Draw( Canvas, Rect(-(Width*2), 0, (FStateCount-2)*Width, Height) ); // Pressed + break; + case 3: + FPngImg->Draw( Canvas, Rect(-(Width*3), 0, (FStateCount-3)*Width, Height) ); // Disabled + break; + } + + PaintCustomerText(); + }else { //Ի汳 + PaintCustomer(); + } + } +} + +//--------------------------------------------------------------------------- +void __fastcall CBCapButton::SetEnabled(bool Value) +{ + if(FStateCount<4) //can't be disable + Value = true; + + TGraphicControl::SetEnabled(Value); + + if( Enabled ) + EtatBtn = 0; + else + EtatBtn = 3; + + Paint(); +} +//--------------------------------------------------------------------------- +void __fastcall CBCapButton::MouseDown(System::Uitypes::TMouseButton Button, + System::Classes::TShiftState Shift, int X, int Y) +{ + TGraphicControl::MouseDown( Button, Shift, X, Y ); + + if( Button==mbLeft && Enabled && FStateCount>2){ + EtatBtn = 2; // Pressed + + Paint(); + Refresh(); + } + + TCustomForm * parentForm = GetParentForm( this ); + if( parentForm && parentForm==Application->MainForm ){ + TPoint pt(X,Y); + pt = ClientToParent( pt, parentForm ); + Application->MainForm->OnMouseDown( NULL, Button, Shift, pt.X, pt.Y ); + } +} + +//--------------------------------------------------------------------------- +void __fastcall CBCapButton::MouseUp(System::Uitypes::TMouseButton Button, + System::Classes::TShiftState Shift, int X, int Y) +{ + TGraphicControl::MouseUp( Button, Shift, X, Y ); + + if( Button==mbLeft && Enabled ){ + if( X>=0 && X=0 && YModalResult = FModalResult; + } + + TGraphicControl::Click(); +} + +//--------------------------------------------------------------------------- +//int __fastcall TCapButton::GetFontSize() +//{ +// return Canvas->Font->Size; +//} +void __fastcall CBCapButton::SetFontSize( int value ) +{ + Canvas->Font->Size = value; + +// Paint(); +// Refresh(); +// Invalidate(); +} +//--------------------------------------------------------------------------- +void __fastcall CBCapButton::SetFont( String name, int sz ) +{ + Canvas->Font->Name = name; + Canvas->Font->Size = sz; +} +//--------------------------------------------------------------------------- +void __fastcall CBCapButton::SetEnablePNG(bool Value) +{ + if(FEnablePNG) + return ; + + if( !FPngImg || ( FPngImg && (0== FPngImg->Width && 0== FPngImg->Height) ) ){ + FEnablePNG = false; + return; + } + + FEnablePNG = Value; +} +//--------------------------------------------------------------------------- +void __fastcall CBCapButton::PaintCustomer(void) +{ + TRect rectDraw = GetClientRect(); + TRect tmpRet = rectDraw; + + //================߿ + if(EtatBtn == 0){ + Canvas->Brush->Color = clrFrameExNormal; + Canvas->Pen->Color = clrFrameExNormal; + }else if(EtatBtn == 3){ + Canvas->Brush->Color = clrFrameExDisable; + Canvas->Pen->Color = clrFrameExDisable; + }else { + Canvas->Brush->Color = clrFrameExEnter; + Canvas->Pen->Color = clrFrameExEnter; + } + + int X,Y; + // + Y = 0; + X = PIXEL_EXTERNAL_FRAME ; + Canvas->MoveTo( X, Y ); + X = Width - PIXEL_EXTERNAL_FRAME ; + Canvas->LineTo( X, Y ); + // + Y = Height - PIXEL_EXTERNAL_FRAME ; + X = PIXEL_EXTERNAL_FRAME ; + Canvas->MoveTo( X, Y ); + X = Width - PIXEL_EXTERNAL_FRAME ; + Canvas->LineTo( X, Y ); + // + X = 0 ; + Y = PIXEL_EXTERNAL_FRAME ; + Canvas->MoveTo( X, Y ); + Y = Height - PIXEL_EXTERNAL_FRAME ; + Canvas->LineTo( X, Y ); + // + X = Width - PIXEL_EXTERNAL_FRAME ; + Y = PIXEL_EXTERNAL_FRAME ; + Canvas->MoveTo( X, Y ); + Y = Height - PIXEL_EXTERNAL_FRAME ; + Canvas->LineTo( X, Y ); + + //߿Բ + int iLPixl, iTPixl, iRPixl, iBPixl ; + TRect tmpRetPic = rectDraw; //ڲ򽥱ͼ + int iDistant = 1; //rightbottom - 1 + for(int i=0;i<4;i++) + { + // 4*4 + iLPixl = tmpRetPic.Left + i; + iTPixl = tmpRetPic.Top; + iRPixl = tmpRetPic.Right - i - iDistant; + iBPixl = tmpRetPic.Bottom - iDistant; + + if(EtatBtn == 3) + Canvas->Pen->Color = clrExFrameBoundDisable[i]; + else + Canvas->Pen->Color = clrExFrameBound[i]; + + Canvas->Pixels[iLPixl][iTPixl] = Canvas->Pen->Color; + Canvas->Pixels[iRPixl][iTPixl] = Canvas->Pen->Color; + Canvas->Pixels[iLPixl][iBPixl] = Canvas->Pen->Color; + Canvas->Pixels[iRPixl][iBPixl] = Canvas->Pen->Color; + + if(i>0){ //ÿǶԳ + iLPixl = tmpRetPic.Left; + iTPixl = tmpRetPic.Top + i; + iRPixl = tmpRetPic.Right - iDistant; + iBPixl = tmpRetPic.Bottom - i - iDistant; + Canvas->Pixels[iLPixl][iTPixl] = Canvas->Pen->Color; + Canvas->Pixels[iRPixl][iTPixl] = Canvas->Pen->Color; + Canvas->Pixels[iLPixl][iBPixl] = Canvas->Pen->Color; + Canvas->Pixels[iRPixl][iBPixl] = Canvas->Pen->Color; + } + } + //=================ڱ߿ + + //Բ + //if(EtatBtn == 0) Canvas->Pen->Color = clrFrameBoundNormal; + //else Canvas->Pen->Color = clrFrameBoundEnter; + + Canvas->Pen->Color = clrFrameNormal; + + tmpRet.Top = PIXEL_EXTERNAL_FRAME; + + tmpRet.left = PIXEL_EXTERNAL_FRAME; + Canvas->Pixels[tmpRet.left][tmpRet.top] = Canvas->Pen->Color; + + tmpRet.left = Width - PIXEL_EXTERNAL_FRAME - PIXEL_INTERNAL_FARME; + Canvas->Pixels[tmpRet.left][tmpRet.top] = Canvas->Pen->Color; + + ////////////// + tmpRet.Top = Height - PIXEL_EXTERNAL_FRAME - PIXEL_INTERNAL_FARME; + + tmpRet.left = PIXEL_EXTERNAL_FRAME; + Canvas->Pixels[tmpRet.left][tmpRet.top] = Canvas->Pen->Color; + + tmpRet.left = Width - PIXEL_EXTERNAL_FRAME - PIXEL_INTERNAL_FARME; + Canvas->Pixels[tmpRet.left][tmpRet.top] = Canvas->Pen->Color; + + // + Canvas->Pen->Color = clrFrameNormal; + + // + Y = PIXEL_EXTERNAL_FRAME; + X = PIXEL_EXTERNAL_FRAME + PIXEL_INTERNAL_FARME; + Canvas->MoveTo( X, Y ); + X = Width - PIXEL_EXTERNAL_FRAME - PIXEL_INTERNAL_FARME; + Canvas->LineTo( X, Y ); + // + Y = Height - PIXEL_EXTERNAL_FRAME - PIXEL_INTERNAL_FARME; + X = PIXEL_EXTERNAL_FRAME + PIXEL_INTERNAL_FARME; + Canvas->MoveTo( X, Y ); + X = Width - PIXEL_EXTERNAL_FRAME - PIXEL_INTERNAL_FARME; + Canvas->LineTo( X, Y ); + // + X = PIXEL_EXTERNAL_FRAME ; + Y = PIXEL_EXTERNAL_FRAME + PIXEL_INTERNAL_FARME; + Canvas->MoveTo( X, Y ); + Y = Height - PIXEL_EXTERNAL_FRAME - PIXEL_INTERNAL_FARME; + Canvas->LineTo( X, Y ); + // + X = Width - PIXEL_EXTERNAL_FRAME - PIXEL_INTERNAL_FARME; + Y = PIXEL_EXTERNAL_FRAME + PIXEL_INTERNAL_FARME; + Canvas->MoveTo( X, Y ); + Y = Height - PIXEL_EXTERNAL_FRAME - PIXEL_INTERNAL_FARME; + Canvas->LineTo( X, Y ); + + //==============ڲָ + Canvas->Pen->Color = clrLineNormal; + X = PIXEL_INTERNAL_RECTLEFT_RIGHT; + Y = PIXEL_EXTERNAL_FRAME + PIXEL_INTERNAL_FARME; + Canvas->MoveTo( X, Y ); + Y = Height - PIXEL_EXTERNAL_FRAME - PIXEL_INTERNAL_FARME; + Canvas->LineTo( X, Y ); + + //==============ڲ + if(3 == EtatBtn){ + Canvas->Brush->Color = clrRectDisable; + Canvas->Pen->Color = clrRectDisable; + }else{ + Canvas->Brush->Color = clrRectNormal; + Canvas->Pen->Color = clrRectNormal; + } + + tmpRet.Left = PIXEL_EXTERNAL_FRAME + PIXEL_INTERNAL_FARME; + tmpRet.Top = PIXEL_EXTERNAL_FRAME + PIXEL_INTERNAL_FARME; + tmpRet.Right = PIXEL_INTERNAL_RECTLEFT_RIGHT; + tmpRet.Bottom = Height - PIXEL_EXTERNAL_FRAME - PIXEL_INTERNAL_FARME; + + Canvas->Rectangle(tmpRet.Left, tmpRet.Top, + tmpRet.Right, tmpRet.Bottom); + + + //ڲұ + tmpRet.Left = PIXEL_INTERNAL_RECTLEFT_RIGHT + PIXEL_INTERNAL_DISPART; + tmpRet.Top = PIXEL_EXTERNAL_FRAME + PIXEL_INTERNAL_FARME; + tmpRet.Right = Width - PIXEL_EXTERNAL_FRAME - PIXEL_INTERNAL_FARME; + tmpRet.Bottom = Height - PIXEL_EXTERNAL_FRAME - PIXEL_INTERNAL_FARME; + + Canvas->Rectangle(tmpRet.Left, tmpRet.Top, + tmpRet.Right, tmpRet.Bottom); + +// //ڲұ ͼ + tmpRet.Top = Height - PIXEL_EXTERNAL_FRAME - PIXEL_INTERNAL_FARME + - PIXEL_INTERNAL_RECTRIGHT_HEIGHT; + if(3 != EtatBtn) + { + if(2 == EtatBtn) // down + { + TRect tmpRetPic = rectDraw; //ڲ򽥱ͼ + int iDistant = PIXEL_EXTERNAL_FRAME + PIXEL_INTERNAL_FARME; + tmpRetPic.Left += iDistant; + tmpRetPic.Top += iDistant; + tmpRetPic.Right -= iDistant; + tmpRetPic.Bottom -= iDistant; + + iDistant = 1; //rightbottom - 1 + + int iTmpAdd = 0;//clrCapArrowOpenBound ǰλ + for(int i=0; i<4; i++) + { + // + Canvas->Brush->Color = clrCapArrowOpenLine[i]; + Canvas->FrameRect(tmpRetPic); + + int iadd = 0;//clrCapArrowOpenBound ǰλ + for(int j=0; j<4-i; j++) { + + // 4*4 + iLPixl = tmpRetPic.Left + j; + iTPixl = tmpRetPic.Top; + iRPixl = tmpRetPic.Right - j - iDistant; + iBPixl = tmpRetPic.Bottom - iDistant; + + Canvas->Pen->Color = clrCapArrowOpenBound[iTmpAdd+j]; + Canvas->Pixels[iLPixl][iTPixl] = Canvas->Pen->Color; + Canvas->Pixels[iRPixl][iTPixl] = Canvas->Pen->Color; + Canvas->Pixels[iLPixl][iBPixl] = Canvas->Pen->Color; + Canvas->Pixels[iRPixl][iBPixl] = Canvas->Pen->Color; + + if(j>0){ //ÿǶԳ + iLPixl = tmpRetPic.Left; + iTPixl = tmpRetPic.Top + j; + iRPixl = tmpRetPic.Right - iDistant; + iBPixl = tmpRetPic.Bottom - j - iDistant; + Canvas->Pixels[iLPixl][iTPixl] = Canvas->Pen->Color; + Canvas->Pixels[iRPixl][iTPixl] = Canvas->Pen->Color; + Canvas->Pixels[iLPixl][iBPixl] = Canvas->Pen->Color; + Canvas->Pixels[iRPixl][iBPixl] = Canvas->Pen->Color; + } + + iadd++; + } + + iTmpAdd += iadd; + + tmpRetPic.Left += iDistant; + tmpRetPic.Top += iDistant; + tmpRetPic.Right -= iDistant; + tmpRetPic.Bottom -= iDistant; + } + + //ڲָ + Canvas->Pen->Color = clrLineNormal; + X = PIXEL_INTERNAL_RECTLEFT_RIGHT; + Y = PIXEL_EXTERNAL_FRAME + PIXEL_INTERNAL_FARME; + Canvas->MoveTo( X, Y ); + Y = Height - PIXEL_EXTERNAL_FRAME - PIXEL_INTERNAL_FARME; + Canvas->LineTo( X, Y ); + } + + //int iWidth, iHeight, iLeft, iTop; + //iWidth = m_pPngButton->Width/2; + //iHeight = m_pPngButton->Height; + //iLeft = 0; + //iTop = 0; + + //pTmpDraw->Canvas->Lock(); + + //if( 0 == EtatBtn ) {//nomal + //StretchBlt(pTmpDraw->Canvas->Handle, 0, 0, iWidth, iHeight, + //m_pPngButton->Canvas->Handle, 0, iTop, iWidth, iHeight, SRCCOPY); + + //}else if( 1 == EtatBtn || 2 == EtatBtn){ // down enter + // StretchBlt(pTmpDraw->Canvas->Handle, 0, 0, iWidth, iHeight, + // m_pPngButton->Canvas->Handle, iWidth, iTop, iWidth, iHeight, SRCCOPY); + // Canvas->Draw( tmpRet.Left, tmpRet.Top, pTmpDraw ); + //} + if(EtatBtn == 2 || EtatBtn == 1) + { + //StretchBlt(pTmpDraw->Canvas->Handle, 0, 0, iWidth, iHeight, + // m_pPngButton->Canvas->Handle, iWidth, iTop, iWidth, iHeight, SRCCOPY); + Canvas->Draw( tmpRet.Left, tmpRet.Top, pTmpFoucusDraw ); + } + + if(EtatBtn == 0) + Canvas->Draw( tmpRet.Left, tmpRet.Top, pTmpDraw ); + + //pTmpDraw->Canvas->Unlock(); + + //Canvas->Draw( tmpRet.Left, tmpRet.Top, pTmpDraw ); + } + + + PaintCustomerText(); +} + +//--------------------------------------------------------------------------- +void __fastcall CBCapButton::PaintCustomerText(void) +{ + int X,Y; + if( !FCaption.IsEmpty() ){ + if( EtatBtn==0 ){ + Canvas->Font->Color = CLR_TXT_NOR; + } + else if( EtatBtn==3 ){ + Canvas->Font->Color = CLR_TXT_DIS; + } + else{ + Canvas->Font->Color = CLR_TXT_HOT; + } + + //add by tj 2013/12/10 + Canvas->Brush->Style = bsClear; + String strCaption = FCaption; + TSize size = Canvas->TextExtent( strCaption ); + int nLen = strCaption.Length(); + + + if( !(0 == rtCaption.Height()) || FEnablePNG ) + { + if( size.Width > rtCaption.Width()) + { + nLen = nLen*rtCaption.Width()/size.Width ; + nLen -= 1; + + if(nLen <= 0){ + strCaption = strCaption.SubString(0, 1); + }else{ + strCaption = strCaption.SubString(0, nLen); + strCaption += ".."; + } + + size = Canvas->TextExtent( strCaption ); + } + + X = rtCaption.Left + ( rtCaption.Width()-size.Width )/2; + Y = rtCaption.Top + ( rtCaption.Height()-size.Height )/2; + + }else if(0 == rtCaption.Height()){ + + if( size.Width > PIXEL_TEXT_X) + { + nLen = nLen*(PIXEL_TEXT_X)/size.Width; + nLen -= 1; + + if(nLen <= 0){ + strCaption = strCaption.SubString(0, 1); + }else{ + strCaption = strCaption.SubString(0, nLen); + strCaption += ".."; + } + + size = Canvas->TextExtent( strCaption ); + } + + X = PIXLE_TEXT_LEFT_OFFSET + ( PIXEL_TEXT_X - size.Width )/2; + Y = ( Height-size.Height )/2; + } + + Canvas->TextOut( X, Y, strCaption ); + } +} +//--------------------------------------------------------------------------- +void __fastcall CBCapButton::SetCaption(String Value) +{ + if(FCaption != Value) + { + FCaption = Value; + + Paint(); + } +} +//-------------------------------------------------------------------------- +void __fastcall CBCapButton::IniColor(int nstate) +{ + int num; + if(nstate == EX_FRAME || nstate == ALL) { + //߿ + clrFrameExNormal = FBorderColor; + clrFrameExEnter = TransformColor(clrFrameExNormal, 20); + clrFrameExDisable= TransformColor(clrFrameExNormal, 20, false); + for(int i=3; i>=0; i--){ + clrExFrameBound[i] = TransformColor(clrFrameExNormal, 9*(3-i+1), false); + } + + for(int i=3; i>=0; i--){ + clrExFrameBoundDisable[i] = TransformColor(clrFrameExDisable, 9*(3-i+1), false); + } + } + + if(nstate == IN_FRAME || nstate == ALL){ + //ڱ߿ͷֽ + clrLineNormal = clrFrameNormal = FInterFrameColor; + } + + if(nstate == IN_RECT || nstate == ALL){ + //ڲ + clrRectNormal = FInterColor; + clrRectDisable = TransformColor(clrRectNormal, 26); + //Ǵңϵ + + num = 3; + for(int i=3; i>=0; i--){ + if(i==3) + clrCapArrowOpenLine[i] = TransformColor(clrRectNormal, num, false); + else + clrCapArrowOpenLine[i] = TransformColor(clrCapArrowOpenLine[i+1], num, false); + num++; + } + + num = 1; + int temp = 0; + for(int i=3; i>=0; i--){ + for(int j=i; j>=0; j--){ + clrCapArrowOpenBound[temp+j] = TransformColor(clrCapArrowOpenLine[3-i], num*(i-j+1), false); + } + temp += i+1; + } + } +} + +COLORREF __fastcall CBCapButton::TransformColor(COLORREF icolor, int nNum, bool bplus) +{ + BYTE r,g,b; + + r = icolor&0xff; + g = (icolor&0xff00)>>8; + b = (icolor&0xff0000)>>16; + + if(bplus){ + r += nNum; + g += nNum; + b += nNum; + }else{ + r -= nNum; + g -= nNum; + b -= nNum; + } + + return RGB(r, g, b); +} +//--------------------------------------------------------------------------- + +void __fastcall CBCapButton::SetBorderColor(TColor iBorderColor) +{ + FBorderColor = iBorderColor; + IniColor(EX_FRAME); + Invalidate(); +} +//--------------------------------------------------------------------------- + +void __fastcall CBCapButton::SetInterFrameColor(TColor iInterFrameColor) +{ + FInterFrameColor = iInterFrameColor; + IniColor(IN_FRAME); + Invalidate(); +} +//--------------------------------------------------------------------------- + +void __fastcall CBCapButton::SetInterColor(TColor iInterColor) +{ + FInterColor = iInterColor; + IniColor(IN_RECT); + Invalidate(); +} +//--------------------------------------------------------------------------- + diff --git a/Component/ComboBoxComponent/ComboBoxComponent.cpp b/Component/ComboBoxComponent/ComboBoxComponent.cpp new file mode 100644 index 0000000..b6860b5 --- /dev/null +++ b/Component/ComboBoxComponent/ComboBoxComponent.cpp @@ -0,0 +1,241 @@ +//--------------------------------------------------------------------------- + +#pragma hdrstop + +#include "ComboBoxComponent.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) + +#include "DropListScrollBar.cpp" +#include "DropListView.cpp" +#include "CapButton.cpp" + +static inline void ValidCtrCheck(TComboBoxComponent *) +{ + new TComboBoxComponent(NULL); +} + +namespace Comboboxcomponent +{ + void __fastcall PACKAGE Register() + { + TComponentClass classes[1] = {__classid(TComboBoxComponent)}; + RegisterComponents(L"Samples", classes, 0); + } +} + +#define MIN(x, y) ((x)<(y)?(x):(y)) + + +__fastcall TComboBoxComponent::TComboBoxComponent(TComponent *Owner) + : CBCapButton(Owner) +{ + m_ClickStat = 0; + + m_IsMouseOver = false; + + ItemHeight = 20; + ShowItemCount = 5; + + FShowMode = TComboBoxMode(cbShowDown); + + // ʼб + m_DropListView = new TDropListView(this); + m_DropListView->Parent = (TWinControl *)Owner; + m_DropListView->SetDesignVisible(false); + m_DropListView->Visible = false; + + m_DropListView->OnHide = DoDropListHide; + m_DropListView->OnShow = DoDropListShow; + + OnMouseEnter = DoMouseEnter; + OnMouseLeave = DoMouseLeave; +} + +__fastcall TComboBoxComponent::~TComboBoxComponent() +{ +} + +void __fastcall TComboBoxComponent::SetParent(TWinControl* AParent) +{ + m_DropListView->Parent = AParent; + CBCapButton::Parent = AParent; +} + +void __fastcall TComboBoxComponent::SetFontSize( int value ) +{ + m_DropListView->SetFontSize(value); + CBCapButton::SetFontSize(value); +} + +void __fastcall TComboBoxComponent::SetFont( String name, int size ) +{ + CBCapButton::SetFont(name, size); + m_DropListView->SetFont(name, size); +} + +TComboBoxItem * __fastcall TComboBoxComponent::AddItem(String Caption) +{ + TComboBoxItem * pNewItem = new TComboBoxItem(Caption, DoItemClick); + m_DropListView->AddItem(pNewItem); + + return pNewItem; +} + +TComboBoxItem * __fastcall TComboBoxComponent::GetItem(int Index) +{ + return m_DropListView->GetItem( Index ); +} + +void __fastcall TComboBoxComponent::Clear() +{ + if(m_DropListView->ItemsCount != 0) + { + m_DropListView->Clear(); + } +} + +void __fastcall TComboBoxComponent::DoDropListShow(TObject *Sender) +{ + Down = true; + m_ClickStat = 1; +} + +void __fastcall TComboBoxComponent::DoDropListHide(TObject *Sender) +{ + Down = false; + + if(!m_IsMouseOver) + { + m_ClickStat = 2; + } + else + { + m_ClickStat = 3; + } +} + +void __fastcall TComboBoxComponent::DoItemClick(TComboBoxItem* Sender, int Index) +{ + Caption = Sender->Caption; + if(FOnChange) FOnChange(Sender, Index); +} + +void __fastcall TComboBoxComponent::DoMouseEnter(TObject *Sender) +{ + m_IsMouseOver = true; +} + +void __fastcall TComboBoxComponent::DoMouseLeave(TObject *Sender) +{ + m_IsMouseOver = false; +} +/* +void __fastcall TComboBoxComponent::CMMouseEnter(TMessage &Message) +{ + m_IsMouseOver = true; + //TGraphicControl::Dispatch(&Message); + CBCapButton::DefaultHandler(&Message); +} + +void __fastcall TComboBoxComponent::CMMouseLeave(TMessage &Message) +{ + m_IsMouseOver = false; + //TGraphicControl::Dispatch(&Message); +} +*/ +void __fastcall TComboBoxComponent::MouseDown(TMouseButton Button, TShiftState Shift, int X, int Y) +{ + TGraphicControl::MouseDown(Button, Shift, X, Y); + + if(Button != 0) return; + + if(m_ClickStat == 3) return; + + m_DropListView->ItemHeight = FItemHeight; + m_DropListView->Width = Width; + + TPoint var_Client(0, Height); + TPoint var_Screen = ClientToScreen(var_Client); + + m_DropListView->Left = var_Screen.X; + + m_DropListView->ShowItemsCount = FShowItemCount; + + if(ShowMode == TComboBoxMode(cbShowUp)) + { + // Ϸʾ + m_DropListView->Top = var_Screen.Y - Height - m_DropListView->ListHeight; + } + else + { + // ·ʾ + m_DropListView->Top = var_Screen.Y; + } + + m_DropListView->Show(); +} + +void __fastcall TComboBoxComponent::MouseUp(TMouseButton Button, TShiftState Shift, int X, int Y) +{ + TGraphicControl::MouseUp(Button, Shift, X, Y); + + if(Button != 0) return; + + if(m_ClickStat == 3) m_ClickStat = 0; +} + +int __fastcall TComboBoxComponent::GetDefaultItem() +{ + return m_DropListView->DefItemIndex; +} + +int __fastcall TComboBoxComponent::GetItemsCount() +{ + return m_DropListView->ItemsCount; +} + +void __fastcall TComboBoxComponent::RemoveItem(int Index) +{ + int var_Count = m_DropListView->ItemsCount; + if(Index < var_Count && Index >= 0) + { + m_DropListView->RemoveItem(Index); + } +} + +void __fastcall TComboBoxComponent::SetDefaultItem(int Value) +{ + int var_Count = m_DropListView->ItemsCount; + + if(Value >= var_Count || Value < 0) + { + Value = -1; + Caption = ""; + } + else if(var_Count > 0) + { + TComboBoxItem *var_Item = m_DropListView->GetItem(Value); + if(var_Item != NULL) + { + Caption = var_Item->Caption; + } + } + + m_DropListView->DefItemIndex = Value; +} + +void __fastcall TComboBoxComponent::SetItemHeight(int Value) +{ + FItemHeight = Value; +} + +void __fastcall TComboBoxComponent::SetShowMode(TComboBoxMode Value) +{ + FShowMode = Value; +} + +void __fastcall TComboBoxComponent::SetShowItemCount(int Value) +{ + FShowItemCount = Value; +} diff --git a/Component/ComboBoxComponent/ComboBoxComponent.h b/Component/ComboBoxComponent/ComboBoxComponent.h new file mode 100644 index 0000000..ba1e089 --- /dev/null +++ b/Component/ComboBoxComponent/ComboBoxComponent.h @@ -0,0 +1,427 @@ +//--------------------------------------------------------------------------- + +#ifndef ComboBoxComponentH +#define ComboBoxComponentH + +#include +#include +#include +#include +#include +#include +#include +//--------------------------------------------------------------------------- +class TDropListScrollBar; +class TComboBoxItem; +class TDropListView; +class CBCapButton; +//--------------------------------------------------------------------------- +/* б¼ */ +typedef void __fastcall (__closure *TItemClickEvent)(TComboBoxItem* Sender, int Index); + +/* бʾ */ +enum DECLSPEC_DENUM TComboBoxMode : unsigned char {cbShowUp, cbShowDown}; +//typedef System::Set TComboBoxMode; +/* б仯¼ */ +typedef void __fastcall (__closure *TComboBoxChangeEvent)(TComboBoxItem* Sender, int Index); + +/**************************************************************************************************/ +/**************************************************************************************************/ +class TDropListScrollBar : public TScrollBar +{ +private: +// int m_nTileHeight, //add by tj 2013/11/18 + int m_nThumbHeight, + m_nThumbTop, + m_nPreThumbTop, + m_nDragPos, + m_nDragPoint, + m_iClicked, + m_iHitPrev, + m_nMax, + m_nMin, + m_nPos, + m_nPage, + m_nTrackPos; + + bool m_bPause, + m_bNotify, + m_bDrag, + m_bTrace; + + TBitmap *u_pPicLineUp, + *u_pPicLineDown; + + TTimer *m_pTimer; + TCanvas *m_pCanvas; + + int HitTest( int X, int Y ); + void CalcThumbHeight(); + void CalcThumbTop(); + void DrawArrow( int iDirection, int iState ); + void DrawThumb( int iState, bool bEraseBk, int iPageUD=-1 ); + + void __fastcall TimerProc(TObject* Sender); + + MESSAGE void __fastcall WMPaint(Winapi::Messages::TWMPaint &Message); + MESSAGE void __fastcall WMLButtonDown(TWMMouse &Message); + MESSAGE void __fastcall WMLButtonUp(TWMMouse &Message); + MESSAGE void __fastcall WMLButtonDblClk(TWMMouse &Message); + MESSAGE void __fastcall WMRButtonDown(TWMMouse &Message); //add by tj 2013/11/18 + MESSAGE void __fastcall WMRButtonUp(TWMMouse &Message); //add by tj 2013/11/18 + MESSAGE void __fastcall WMMouseMove(TWMMouse &Message); +// MESSAGE void __fastcall CMMouseLeave(TMessage &Message); //add by tj 2013/11/25 12:35 + MESSAGE void __fastcall SBMSetScrollInfo(TMessage &Message); + MESSAGE void __fastcall SBMGetScrollInfo(TMessage &Message); + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(WM_PAINT, TWMPaint, WMPaint) + MESSAGE_HANDLER(WM_LBUTTONDOWN, TWMLButtonDown, WMLButtonDown) + MESSAGE_HANDLER(WM_LBUTTONUP, TWMLButtonUp, WMLButtonUp) + MESSAGE_HANDLER(WM_LBUTTONDBLCLK, TWMLButtonDblClk, WMLButtonDblClk) + MESSAGE_HANDLER(WM_RBUTTONDOWN, TWMRButtonDown, WMRButtonDown) + MESSAGE_HANDLER(WM_RBUTTONUP, TWMRButtonUp, WMRButtonUp) //add by tj 2013/11/18 + MESSAGE_HANDLER(WM_MOUSEMOVE, TWMMouseMove, WMMouseMove) //add by tj 2013/11/18 +// MESSAGE_HANDLER(CM_MOUSELEAVE, TMessage, CMMouseLeave) //add by tj 2013/11/25 12:35 + MESSAGE_HANDLER(SBM_SETSCROLLINFO, TMessage, SBMSetScrollInfo) + MESSAGE_HANDLER(SBM_GETSCROLLINFO, TMessage, SBMGetScrollInfo) + END_MESSAGE_MAP(TScrollBar) + +protected: + virtual void __fastcall PaintWindow(HDC DC); + +public: + TWinControl *m_pWndCtrl; + bool m_bAction; + + __fastcall virtual TDropListScrollBar(System::Classes::TComponent* AOwner); + __fastcall ~TDropListScrollBar(); + + void __fastcall CMMouseLeave(TObject *Sender); //add by tj 2013/11/25 12:35 + + bool IsDraging(){ return m_bDrag; }; + void __fastcall SetPosition(int Value, bool bRedraw=true); + void __fastcall SetPageSize(int Value, bool bRedraw=true); + void __fastcall SetRange(int AMin, int AMax, bool bRedraw=true); + void __fastcall GetScrollRange(int* nMin, int* nMax); + int __fastcall GetScrollPos(); + int __fastcall GetPageSize(); +}; +/**************************************************************************************************/ +/**************************************************************************************************/ +class TComboBoxItem : public TObject +{ +private: + int FTag; + String FCaption; + TItemClickEvent FOnItemClick; + + void __fastcall SetCaption(String Caption); + +public: + __fastcall TComboBoxItem(String Caption, TItemClickEvent OnItemClick); + + void __fastcall DrawItem(TCanvas *Canvas, TRect Rect, bool Selected); + +__published: + __property String Caption = {read = FCaption, write = FCaption}; + __property int Tag = {read = FTag, write = FTag}; + __property TItemClickEvent OnItemClicked = {read = FOnItemClick, write = FOnItemClick}; +}; +// --------------------------------------------------------------------------- +// TDropListView +// --------------------------------------------------------------------------- +class TDropListView : public TWinControl +{ +private: + TNotifyEvent FOnHide, // б¼ + FOnShow; // бʾ¼ + + int FItemHeight, + FItemWidth, + FShowItemsCount, + FDefItemIndex; + + TControlCanvas *m_Canvas; + TList *m_ItemRectList, + *m_ItemList; + + TDropListScrollBar *m_ScrollBar; + + HWND m_pActiveWnd; + + int m_BeginIndex, + m_EndIndex, + m_CurrentItemIndex, + m_RealShowCount, + m_MouseX, + m_MouseY; + + void __fastcall CreateScrollBar(); + + void __fastcall DoItemsCountChange(); + void __fastcall DoItemClicked(int Index); + void __fastcall DoItemSelect(int Index); + void __fastcall DoKeyUpDown(int Index); + void __fastcall DoShowItemsChange(); + + int __fastcall CalcListHeight(); + int __fastcall GetItemsCount(); + TRect *__fastcall GetItemRect(int Index); + + void __fastcall SetShowItemsCount(int Value); + + MESSAGE void __fastcall WMEraseBkgnd(TWMEraseBkgnd &Message); + MESSAGE void __fastcall WMKeyDown(TWMKeyDown &Message); + MESSAGE void __fastcall WMKillFocus(TMessage &Message); + MESSAGE void __fastcall WMLButtonDown(TWMLButtonDown &Message); + MESSAGE void __fastcall WMMouseWheel(TWMMouseWheel &Message); + MESSAGE void __fastcall WMPaint(TWMPaint &Message); + MESSAGE void __fastcall WMSetFocus(TMessage &Message); + MESSAGE void __fastcall WMVScroll(TWMScroll &Message); + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(WM_ERASEBKGND, TWMEraseBkgnd, WMEraseBkgnd) + MESSAGE_HANDLER(CN_KEYDOWN, TWMKeyDown, WMKeyDown) + MESSAGE_HANDLER(WM_KILLFOCUS, TMessage, WMKillFocus) + MESSAGE_HANDLER(WM_LBUTTONDOWN, TWMLButtonDown, WMLButtonDown) + MESSAGE_HANDLER(WM_MOUSEWHEEL, TWMMouseWheel, WMMouseWheel) + MESSAGE_HANDLER(WM_PAINT, TWMPaint, WMPaint) + MESSAGE_HANDLER(WM_SETFOCUS, TMessage, WMSetFocus) + MESSAGE_HANDLER(WM_VSCROLL, TWMScroll, WMVScroll) + END_MESSAGE_MAP(TWinControl) + +protected: + virtual void __fastcall CreateParams(TCreateParams &Params); + virtual void __fastcall CreateWnd(); + virtual void __fastcall PaintWindow(HDC DC); + + DYNAMIC void __fastcall MouseDown(TMouseButton Button, TShiftState Shift, int X, int Y); + DYNAMIC void __fastcall MouseMove(TShiftState Shift, int X, int Y); + DYNAMIC void __fastcall MouseUp(TMouseButton Button, TShiftState Shift, int X, int Y); + +public: + __fastcall TDropListView(TComponent *Owner); + __fastcall ~TDropListView(); + void __fastcall AddItem(TComboBoxItem* Item); + void __fastcall Clear(); + TComboBoxItem *__fastcall GetItem(int Index); + void __fastcall Hide(); + void __fastcall RemoveItem(int Index); + void __fastcall ScrollPos(int Pos); + void __fastcall Show(); + void __fastcall SetFontSize(int sz); + void __fastcall SetFont(String name, int sz); + +__published: + __property int ListHeight = {read = CalcListHeight}; + __property int ItemHeight = {write = FItemHeight, read = FItemHeight, default = 16}; + + __property TNotifyEvent OnHide = {write = FOnHide, read = FOnHide}; + __property TNotifyEvent OnShow = {write = FOnShow, read = FOnShow}; + + __property int ShowItemsCount = {write = SetShowItemsCount, read = FShowItemsCount}; + + __property int DefItemIndex = {read = FDefItemIndex, write = FDefItemIndex}; + __property int ItemsCount = {read = GetItemsCount}; +}; +/**************************************************************************************************/ +/**************************************************************************************************/ +class CBCapButton : public TGraphicControl +{ +public: + enum TModalResult{ + mrNone = System::Int8(0x0), + mrOk = System::Int8(0x1), + mrCancel = System::Int8(0x2), + mrAbort = System::Int8(0x3), + mrRetry = System::Int8(0x4), + mrIgnore = System::Int8(0x5), + mrYes = System::Int8(0x6), + mrNo = System::Int8(0x7), + mrClose = System::Int8(0x8), + mrHelp = System::Int8(0x9), + mrTryAgain = System::Int8(0xa), + mrContinue = System::Int8(0xb), + mrAll = System::Int8(0xc), + mrNoToAll = System::Int8(0xd), + mrYesToAll = System::Int8(0xe) + }; + +private: + COLORREF + clrFrameExNormal, + clrFrameExEnter, + clrFrameExDisable, + clrFrameNormal, + clrLineNormal, + clrRectNormal, + clrRectDisable, + clrCapArrowOpenBound[10], + clrCapArrowOpenLine[4], + clrExFrameBound[4], + clrExFrameBoundDisable[4]; + + TColor FBorderColor; + TColor FInterFrameColor; + TColor FInterColor; + + void __fastcall IniColor(int nstate); + COLORREF __fastcall TransformColor(COLORREF icolor, int nNum=0, bool bplus=true); + void __fastcall SetBorderColor(TColor iBorderColor); + void __fastcall SetInterFrameColor(TColor iInterFrameColor); + void __fastcall SetInterColor(TColor iInterColor); + + TNotifyEvent FOnMouseEnter;//on mouse enter notify event + TNotifyEvent FOnMouseLeave;//on mouse leave notify event + + String FCaption; +// System::Uitypes::TModalResult FModalResult; + TModalResult FModalResult; + + void __fastcall SetCaption(String Value); + + MESSAGE void __fastcall CMMouseEnter(Winapi::Messages::TMessage &Msg); // to know when mouse is entered + MESSAGE void __fastcall CMMouseLeave(Winapi::Messages::TMessage &Msg); // to know when mouse is leaved + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(CM_MOUSEENTER, TMessage, CMMouseEnter) + MESSAGE_HANDLER(CM_MOUSELEAVE, TMessage, CMMouseLeave) + END_MESSAGE_MAP(TGraphicControl) + +protected: + bool FEnablePNG; //ǷpngʽͼƬ + bool FDown; // value to know if we painting mouse down + int EtatBtn; // 0=Normal 1=Mouse entered 2=Pressed 3=Disabled + int FStateCount; + Vcl::Imaging::Pngimage::TPngImage *FPngImg; //our 4 states image + + + DYNAMIC void __fastcall MouseDown(System::Uitypes::TMouseButton Button, System::Classes::TShiftState Shift, int X, int Y); + DYNAMIC void __fastcall MouseUp(System::Uitypes::TMouseButton Button, System::Classes::TShiftState Shift, int X, int Y); + virtual void __fastcall SetEnabled(bool Value); + +public: + + __fastcall virtual CBCapButton(System::Classes::TComponent* AOwner); + __fastcall virtual ~CBCapButton(void); + + void __fastcall SetStateCount( int count ); + void __fastcall SetPngImg(Vcl::Imaging::Pngimage::TPngImage *value); // we set the png image + void __fastcall SetDown(bool value); // to know if mouse is down or not + void __fastcall SetEnablePNG(bool Value);// to know if customer set png img + virtual void __fastcall SetFontSize( int value ); + virtual void __fastcall SetFont( String name, int sz ); + virtual void __fastcall Paint(void); // override the painting of the component + DYNAMIC void __fastcall Click(void); + +__published: + + __property Action; + __property Anchors = {default=3}; + __property bool Down = {read=FDown, write=SetDown, default=False}; + __property Enabled = {default=1}; + __property int ImgStates = {read=FStateCount, write=SetStateCount, default=4}; +// __property System::Uitypes::TModalResult ModalResult = {read=FModalResult, write=FModalResult, default=0}; + __property TModalResult ModalResult = {read=FModalResult, write=FModalResult, default=0}; + __property ParentShowHint = {default=1}; + __property Vcl::Imaging::Pngimage::TPngImage *PngImg = {read=FPngImg, write=SetPngImg}; + __property PopupMenu; + __property ShowHint; + __property Visible = {default=1}; + __property OnClick; + __property OnContextPopup; + __property OnMouseDown; + __property OnMouseMove; + __property OnMouseUp; + __property System::Classes::TNotifyEvent OnMouseEnter = {read=FOnMouseEnter, write=FOnMouseEnter}; + __property System::Classes::TNotifyEvent OnMouseLeave = {read=FOnMouseLeave, write=FOnMouseLeave}; + __property bool EnablePNG = {read=FEnablePNG, write=SetEnablePNG, default=False}; + __property TColor BorderColor = {read=FBorderColor, write=SetBorderColor, default=TColor(0x83807d)}; + __property TColor InterFrameColor = {read=FInterFrameColor, write=SetInterFrameColor, default=TColor(0x302e2c)}; + __property TColor InterColor = {read=FInterColor, write=SetInterColor, default=TColor(0x58504a)}; +private: + Vcl::Imaging::Pngimage::TPngImage *m_pPngButton, *m_pPngFoucusButton; + Vcl::Imaging::Pngimage::TPngImage *pTmpDraw, *pTmpFoucusDraw; + void __fastcall PaintCustomer(void); + void __fastcall PaintCustomerText(void); + +public: + TRect rtCaption; + +__published: + __property int FontSize = {write=SetFontSize, default=8}; + __property String Caption = {read=FCaption, write=SetCaption}; + +}; +/**************************************************************************************************/ +/**************************************************************************************************/ +class PACKAGE TComboBoxComponent : public CBCapButton +{ +private: + TComboBoxChangeEvent FOnChange; // ComboBox仯¼ + int FItemHeight, + FShowItemCount; + TComboBoxMode FShowMode; + + TDropListView *m_DropListView; // б + bool m_IsMouseOver; + int m_ClickStat; // ..... + + + void __fastcall DoItemClick(TComboBoxItem *Sender, int Index); + + // бءʾ¼ + void __fastcall DoDropListShow(TObject *Sender); + void __fastcall DoDropListHide(TObject *Sender); + + int __fastcall GetDefaultItem(); + int __fastcall GetItemsCount(); + + void __fastcall SetDefaultItem(int Value); + void __fastcall SetItemHeight(int Value); + void __fastcall SetShowItemCount(int Value); + void __fastcall SetShowMode(TComboBoxMode Value); + + void __fastcall DoMouseEnter(TObject *Sender); + void __fastcall DoMouseLeave(TObject *Sender); + + //MESSAGE void __fastcall CMMouseEnter(TMessage &Message); + //MESSAGE void __fastcall CMMouseLeave(TMessage &Message); + + //BEGIN_MESSAGE_MAP + // MESSAGE_HANDLER(CM_MOUSEENTER, TMessage, CMMouseEnter) + // MESSAGE_HANDLER(CM_MOUSELEAVE, TMessage, CMMouseLeave) + //END_MESSAGE_MAP(CBCapButton) + + +protected: + DYNAMIC void __fastcall MouseDown(TMouseButton Button, TShiftState Shift, int X, int Y); + DYNAMIC void __fastcall MouseUp(TMouseButton Button, TShiftState Shift, int X, int Y); + + virtual void __fastcall SetParent(TWinControl* AParent); +public: + __fastcall TComboBoxComponent(TComponent *Owner); + __fastcall ~TComboBoxComponent(); + + TComboBoxItem * __fastcall AddItem(String Caption); + void __fastcall Clear(); + void __fastcall RemoveItem(int Index); + TComboBoxItem * __fastcall GetItem(int Index); + virtual void __fastcall SetFontSize( int value ); + virtual void __fastcall SetFont( String name, int size ); + __property int DefItemIndex = {read = GetDefaultItem, write = SetDefaultItem}; + __property int ItemsCount = {read = GetItemsCount}; + +__published: + __property TComboBoxChangeEvent OnChange = {read = FOnChange, write = FOnChange}; + + __property int ItemHeight = {read = FItemHeight, write = SetItemHeight, default = 20}; + __property int ShowItemCount = {read = FShowItemCount, write = SetShowItemCount, default = 10}; + __property TComboBoxMode ShowMode = {read = FShowMode, write = SetShowMode, default = cbShowDown}; + __property TWinControl* Parent = {read=FParent, write=SetParent}; +}; +/**************************************************************************************************/ +/**************************************************************************************************/ + +#endif diff --git a/Component/ComboBoxComponent/DropListScrollBar.cpp b/Component/ComboBoxComponent/DropListScrollBar.cpp new file mode 100644 index 0000000..05a1c32 --- /dev/null +++ b/Component/ComboBoxComponent/DropListScrollBar.cpp @@ -0,0 +1,1197 @@ +//--------------------------------------------------------------------------- +#include "ComboBoxComponent.h" + +//add by tj 2013/11/21 +#define PIXEL_EXTERNAL_FRAME 1 +#define PIXEL_EX2INTERNAL 1 +#define PIXEL_INTERNAL_FARME 1 +#define PIXEL_INTERNAL_BOUND 1 +#define PIXEL_INTERNAL_LINE 6 //add by tj 2013/12/10 + +#define TIME_DELAY 200 +#define TIME_NOTIFY 100 +#define THUMB_BORDER 7 +#define THUMB_MINSIZE (THUMB_BORDER * 2) + +#define STATE_NORMAL 0 +#define STATE_HIGHLIGHT 1 +#define STATE_PUSH 2 + +const static char SB_LineUp[] = { +0x42, 0x4D, 0x38, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x28, 0x00, +0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00, +0x00, 0x00, 0x02, 0x07, 0x00, 0x00, 0x12, 0x0B, 0x00, 0x00, 0x12, 0x0B, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x24, 0x21, 0x23, 0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x23, +0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x23, 0x1F, +0x1D, 0x23, 0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x28, 0x24, 0x21, +0x13, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x11, 0x10, 0x13, 0x11, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x13, 0x11, 0x10, 0x00, 0x00, 0x23, 0x1F, 0x1D, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, +0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, +0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x23, 0x1F, 0x1D, +0x00, 0x00, 0x00, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, +0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, +0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x5E, 0x57, +0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, +0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, +0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x1F, 0x1D, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, +0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, +0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x23, 0x1F, 0x1D, +0x00, 0x00, 0x00, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, +0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, +0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x5E, 0x57, +0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, +0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, +0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x1F, 0x1D, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, +0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, +0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x23, 0x1F, 0x1D, +0x00, 0x00, 0x00, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, +0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, +0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x5E, 0x57, +0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, +0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, +0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x1F, 0x1D, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x2C, +0x27, 0x24, 0x23, 0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x23, 0x1F, +0x1D, 0x23, 0x1F, 0x1D, 0x2C, 0x27, 0x24, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x23, 0x1F, 0x1D, +0x00, 0x00, 0x00, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x45, 0x3E, 0x3A, 0x31, 0x2C, 0x29, 0x31, +0x2C, 0x29, 0x31, 0x2C, 0x29, 0x31, 0x2C, 0x29, 0x31, 0x2C, 0x29, 0x31, 0x2C, 0x29, 0x45, 0x3E, +0x3A, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x5E, 0x57, +0x66, 0x5E, 0x57, 0x3D, 0x38, 0x34, 0x31, 0x2C, 0x29, 0x31, 0x2C, 0x29, 0x31, 0x2C, 0x29, 0x31, +0x2C, 0x29, 0x31, 0x2C, 0x29, 0x31, 0x2C, 0x29, 0x3D, 0x38, 0x34, 0x66, 0x5E, 0x57, 0x66, 0x5E, +0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x1F, 0x1D, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x41, +0x3B, 0x36, 0x23, 0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x23, 0x1F, +0x1D, 0x23, 0x1F, 0x1D, 0x41, 0x3B, 0x36, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x23, 0x1F, 0x1D, +0x00, 0x00, 0x00, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x74, 0x6B, 0x63, 0x32, 0x2D, 0x2A, 0x31, +0x2C, 0x29, 0x31, 0x2C, 0x29, 0x31, 0x2C, 0x29, 0x31, 0x2C, 0x29, 0x32, 0x2D, 0x2A, 0x74, 0x6B, +0x63, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x5E, 0x57, +0x66, 0x5E, 0x57, 0x5C, 0x55, 0x4E, 0x32, 0x2D, 0x2A, 0x31, 0x2C, 0x29, 0x31, 0x2C, 0x29, 0x31, +0x2C, 0x29, 0x31, 0x2C, 0x29, 0x32, 0x2D, 0x2A, 0x5C, 0x55, 0x4E, 0x66, 0x5E, 0x57, 0x66, 0x5E, +0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x1F, 0x1D, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, +0x42, 0x3C, 0x32, 0x2D, 0x2A, 0x23, 0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x23, 0x1F, +0x1D, 0x32, 0x2D, 0x2A, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x23, 0x1F, 0x1D, +0x00, 0x00, 0x00, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x53, 0x4C, 0x46, 0x31, +0x2C, 0x29, 0x31, 0x2C, 0x29, 0x31, 0x2C, 0x29, 0x31, 0x2C, 0x29, 0x53, 0x4C, 0x46, 0x84, 0x79, +0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x5E, 0x57, +0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x47, 0x41, 0x3C, 0x31, 0x2C, 0x29, 0x31, 0x2C, 0x29, 0x31, +0x2C, 0x29, 0x31, 0x2C, 0x29, 0x47, 0x41, 0x3C, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, +0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x1F, 0x1D, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, +0x42, 0x3C, 0x45, 0x40, 0x3A, 0x26, 0x21, 0x1F, 0x23, 0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x25, 0x21, +0x1F, 0x45, 0x40, 0x3A, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x23, 0x1F, 0x1D, +0x00, 0x00, 0x00, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x7E, 0x74, 0x6B, 0x37, +0x31, 0x2E, 0x31, 0x2C, 0x29, 0x31, 0x2C, 0x29, 0x36, 0x31, 0x2D, 0x7E, 0x74, 0x6B, 0x84, 0x79, +0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x5E, 0x57, +0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x62, 0x5A, 0x54, 0x35, 0x30, 0x2C, 0x31, 0x2C, 0x29, 0x31, +0x2C, 0x29, 0x34, 0x2F, 0x2C, 0x62, 0x5A, 0x54, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, +0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x1F, 0x1D, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, +0x42, 0x3C, 0x48, 0x42, 0x3C, 0x37, 0x32, 0x2E, 0x23, 0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x37, 0x32, +0x2D, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x23, 0x1F, 0x1D, +0x00, 0x00, 0x00, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x5E, +0x56, 0x4F, 0x31, 0x2C, 0x29, 0x31, 0x2C, 0x29, 0x5D, 0x55, 0x4F, 0x84, 0x79, 0x70, 0x84, 0x79, +0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x5E, 0x57, +0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x4E, 0x47, 0x42, 0x31, 0x2C, 0x29, 0x31, +0x2C, 0x29, 0x4D, 0x46, 0x41, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, +0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x1F, 0x1D, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, +0x42, 0x3C, 0x48, 0x42, 0x3C, 0x47, 0x41, 0x3B, 0x28, 0x24, 0x21, 0x28, 0x24, 0x21, 0x47, 0x41, +0x3B, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x23, 0x1F, 0x1D, +0x00, 0x00, 0x00, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x82, +0x77, 0x6E, 0x3D, 0x37, 0x33, 0x3D, 0x37, 0x33, 0x82, 0x77, 0x6E, 0x84, 0x79, 0x70, 0x84, 0x79, +0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x5E, 0x57, +0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x65, 0x5D, 0x56, 0x38, 0x33, 0x2F, 0x38, +0x33, 0x2F, 0x65, 0x5D, 0x56, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, +0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x1F, 0x1D, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, +0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x3D, 0x38, 0x33, 0x3D, 0x38, 0x33, 0x48, 0x42, +0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x23, 0x1F, 0x1D, +0x00, 0x00, 0x00, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, +0x79, 0x70, 0x6C, 0x62, 0x5B, 0x6C, 0x62, 0x5B, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, +0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x5E, 0x57, +0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x56, 0x4F, 0x49, 0x56, +0x4F, 0x49, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, +0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x1F, 0x1D, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, +0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, +0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x23, 0x1F, 0x1D, +0x00, 0x00, 0x00, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, +0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, +0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x5E, 0x57, +0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, +0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, +0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x1F, 0x1D, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, +0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, +0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x23, 0x1F, 0x1D, +0x00, 0x00, 0x00, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, +0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, +0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x5E, 0x57, +0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, +0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, +0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x24, 0x21, 0x23, 0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x23, +0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x23, 0x1F, +0x1D, 0x23, 0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x28, 0x24, 0x21, +0x13, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x11, 0x10, 0x13, 0x11, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x13, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00}; + +const static char SB_LineDown[] = { +0x42, 0x4D, 0x38, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x28, 0x00, +0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00, +0x00, 0x00, 0x02, 0x07, 0x00, 0x00, 0x12, 0x0B, 0x00, 0x00, 0x12, 0x0B, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x24, 0x21, 0x23, 0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x23, +0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x23, 0x1F, +0x1D, 0x23, 0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x28, 0x24, 0x21, +0x13, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x11, 0x10, 0x13, 0x11, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x13, 0x11, 0x10, 0x00, 0x00, 0x23, 0x1F, 0x1D, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, +0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, +0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x23, 0x1F, 0x1D, +0x00, 0x00, 0x00, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, +0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, +0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x5E, 0x57, +0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, +0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, +0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x1F, 0x1D, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, +0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, +0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x23, 0x1F, 0x1D, +0x00, 0x00, 0x00, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, +0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, +0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x5E, 0x57, +0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, +0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, +0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x1F, 0x1D, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, +0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x3F, 0x3A, 0x35, 0x3F, 0x3A, 0x35, 0x48, 0x42, +0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x23, 0x1F, 0x1D, +0x00, 0x00, 0x00, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, +0x79, 0x70, 0x70, 0x67, 0x5F, 0x70, 0x67, 0x5F, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, +0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x5E, 0x57, +0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x5A, 0x52, 0x4C, 0x5A, +0x52, 0x4C, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, +0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x1F, 0x1D, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, +0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x2A, 0x26, 0x23, 0x2A, 0x26, 0x23, 0x48, 0x42, +0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x23, 0x1F, 0x1D, +0x00, 0x00, 0x00, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x83, +0x78, 0x6F, 0x41, 0x3A, 0x36, 0x41, 0x3A, 0x36, 0x83, 0x78, 0x6F, 0x84, 0x79, 0x70, 0x84, 0x79, +0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x5E, 0x57, +0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x65, 0x5D, 0x56, 0x3B, 0x35, 0x32, 0x3B, +0x35, 0x32, 0x65, 0x5D, 0x56, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, +0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x1F, 0x1D, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, +0x42, 0x3C, 0x48, 0x42, 0x3C, 0x39, 0x34, 0x2F, 0x23, 0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x39, 0x34, +0x2F, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x23, 0x1F, 0x1D, +0x00, 0x00, 0x00, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x62, +0x59, 0x53, 0x31, 0x2C, 0x29, 0x31, 0x2C, 0x29, 0x62, 0x59, 0x53, 0x84, 0x79, 0x70, 0x84, 0x79, +0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x5E, 0x57, +0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x50, 0x49, 0x44, 0x31, 0x2C, 0x29, 0x31, +0x2C, 0x29, 0x50, 0x49, 0x44, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, +0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x1F, 0x1D, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, +0x42, 0x3C, 0x46, 0x40, 0x3A, 0x26, 0x21, 0x1F, 0x23, 0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x26, 0x21, +0x1F, 0x45, 0x40, 0x3A, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x23, 0x1F, 0x1D, +0x00, 0x00, 0x00, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x7F, 0x74, 0x6C, 0x37, +0x31, 0x2E, 0x31, 0x2C, 0x29, 0x31, 0x2C, 0x29, 0x37, 0x31, 0x2E, 0x7E, 0x74, 0x6B, 0x84, 0x79, +0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x5E, 0x57, +0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x63, 0x5B, 0x54, 0x35, 0x30, 0x2C, 0x31, 0x2C, 0x29, 0x31, +0x2C, 0x29, 0x35, 0x30, 0x2C, 0x62, 0x5A, 0x54, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, +0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x1F, 0x1D, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, +0x42, 0x3C, 0x34, 0x2F, 0x2C, 0x23, 0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x23, 0x1F, +0x1D, 0x34, 0x2F, 0x2B, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x23, 0x1F, 0x1D, +0x00, 0x00, 0x00, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x58, 0x50, 0x4A, 0x31, +0x2C, 0x29, 0x31, 0x2C, 0x29, 0x31, 0x2C, 0x29, 0x31, 0x2C, 0x29, 0x57, 0x4F, 0x4A, 0x84, 0x79, +0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x5E, 0x57, +0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x4A, 0x44, 0x3F, 0x31, 0x2C, 0x29, 0x31, 0x2C, 0x29, 0x31, +0x2C, 0x29, 0x31, 0x2C, 0x29, 0x49, 0x43, 0x3E, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, +0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x1F, 0x1D, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x43, +0x3D, 0x38, 0x24, 0x20, 0x1E, 0x23, 0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x23, 0x1F, +0x1D, 0x24, 0x20, 0x1E, 0x43, 0x3D, 0x38, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x23, 0x1F, 0x1D, +0x00, 0x00, 0x00, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x78, 0x6E, 0x66, 0x33, 0x2E, 0x2B, 0x31, +0x2C, 0x29, 0x31, 0x2C, 0x29, 0x31, 0x2C, 0x29, 0x31, 0x2C, 0x29, 0x33, 0x2E, 0x2B, 0x78, 0x6E, +0x66, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x5E, 0x57, +0x66, 0x5E, 0x57, 0x5F, 0x57, 0x51, 0x32, 0x2D, 0x2A, 0x31, 0x2C, 0x29, 0x31, 0x2C, 0x29, 0x31, +0x2C, 0x29, 0x31, 0x2C, 0x29, 0x32, 0x2D, 0x2A, 0x5F, 0x57, 0x51, 0x66, 0x5E, 0x57, 0x66, 0x5E, +0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x1F, 0x1D, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x2E, +0x29, 0x26, 0x23, 0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x23, 0x1F, +0x1D, 0x23, 0x1F, 0x1D, 0x2E, 0x29, 0x26, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x23, 0x1F, 0x1D, +0x00, 0x00, 0x00, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x49, 0x43, 0x3E, 0x31, 0x2C, 0x29, 0x31, +0x2C, 0x29, 0x31, 0x2C, 0x29, 0x31, 0x2C, 0x29, 0x31, 0x2C, 0x29, 0x31, 0x2C, 0x29, 0x49, 0x43, +0x3E, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x5E, 0x57, +0x66, 0x5E, 0x57, 0x41, 0x3B, 0x37, 0x31, 0x2C, 0x29, 0x31, 0x2C, 0x29, 0x31, 0x2C, 0x29, 0x31, +0x2C, 0x29, 0x31, 0x2C, 0x29, 0x31, 0x2C, 0x29, 0x41, 0x3B, 0x37, 0x66, 0x5E, 0x57, 0x66, 0x5E, +0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x1F, 0x1D, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, +0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, +0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x23, 0x1F, 0x1D, +0x00, 0x00, 0x00, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, +0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, +0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x5E, 0x57, +0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, +0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, +0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x1F, 0x1D, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, +0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, +0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x23, 0x1F, 0x1D, +0x00, 0x00, 0x00, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, +0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, +0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x5E, 0x57, +0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, +0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, +0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x1F, 0x1D, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, +0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, +0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x48, 0x42, 0x3C, 0x23, 0x1F, 0x1D, +0x00, 0x00, 0x00, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, +0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x84, 0x79, +0x70, 0x84, 0x79, 0x70, 0x84, 0x79, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x5E, 0x57, +0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, +0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, 0x57, 0x66, 0x5E, +0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x24, 0x21, 0x23, 0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x23, +0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x23, 0x1F, +0x1D, 0x23, 0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x23, 0x1F, 0x1D, 0x28, 0x24, 0x21, +0x13, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x11, 0x10, 0x13, 0x11, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x13, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00}; + +static const COLORREF + RGB_EXTERNAL_FRAME = RGB(29,31,35), + RGB_EXTERNAL_NOR = RGB(60,66,72), + RGB_EXTERNAL_HIG = RGB(74,80,88), + RGB_INTERNAL_NOR = RGB(39,42,47), //272a2f + RGB_INTERNAL_HIG = RGB(74,80,88), //4a5058 + RGB_INTERNAL_PUSH = RGB(50,54,60), //32363c + RGB_INTERNAL_LINE_NOR = RGB(25,27,30), //191b1e + RGB_INTERNAL_LINE_HIG = RGB(58,63,69), //3a3f45 + RGB_INTERNAL_LINE_PUSH = RGB(38,41,45), //26292d + RGB_INTERNAL_LINE_NOR_TRANS[6] ={ RGB(44,47,53), //2c2f35 + RGB(47,51,57), + RGB(52,55,62), + RGB(56,59,67), + RGB(57,59,69), + RGB(59,61,71) + }, + RGB_INTERNAL_LINE_HIG_TRANS[6] ={ RGB(79,86,94),//4f565e + RGB(83,90,99), + RGB(87,94,104), + RGB(91,99,109), + RGB(92,100,111), + RGB(94,104,115), + }, + RGB_INTERNAL_LINE_PUSH_TRANS[6] ={ RGB(55,59,66), //373b42 + RGB(60,65,72), + RGB(64,69,77), + RGB(69,75,83), + RGB(70,77,86), + RGB(72,79,88) + }, + RGB_INTERNAL_FRAME_NOR = RGB(34,36,41), + RGB_INTERNAL_ROUND_BKG_N_NOR = RGB(41,44,49), + RGB_INTERNAL_ROUND_BKG_N_HIG = RGB(51,55,61), + RGB_INTERNAL_ROUND_BKG_H_NOR = RGB(43,46,52), + RGB_INTERNAL_ROUND_BKG_H_HIG = RGB(56,61,67); +//--------------------------------------------------------------------------- +__fastcall TDropListScrollBar::TDropListScrollBar(TComponent* AOwner) + : TScrollBar(AOwner) +{ + ParentCtl3D = false; //add by tj 2013/11/14 + SetParentComponent(AOwner); + + TMemoryStream *SBLineUpStream = new TMemoryStream(); + TMemoryStream *SBLineDownStream = new TMemoryStream(); + + SBLineUpStream->Position = 0; + SBLineUpStream->WriteBuffer(SB_LineUp, 1848); + SBLineUpStream->Position = 0; + + SBLineDownStream->Position = 0; + SBLineDownStream->WriteBuffer(SB_LineDown, 1848); + SBLineDownStream->Position = 0; + + u_pPicLineUp = new TBitmap(); + u_pPicLineUp->LoadFromStream(SBLineUpStream); + u_pPicLineDown = new TBitmap(); + u_pPicLineDown->LoadFromStream(SBLineDownStream); + + delete SBLineUpStream, SBLineDownStream; + + Kind = sbVertical; + Width = u_pPicLineUp->Height;//add by tj 2013/11/19 + DoubleBuffered = TRUE; + + m_nThumbHeight = 0; + m_nThumbTop = Width; + m_nPreThumbTop = Width; +// m_nTileHeight = 18; //add by tj 2013/11/14 + + m_nTrackPos = m_nMax = m_nMin = m_nPos = m_nPage = 0; + m_iClicked = -1; + m_iHitPrev = -1; + + m_bAction = m_bPause = m_bNotify = m_bDrag = m_bTrace = false; + + m_pCanvas = new TControlCanvas(); + ((TControlCanvas*)m_pCanvas)->Control = this; + Ctl3D = false; + + //곤ڰµļʱ + m_pTimer = new TTimer(this); + m_pTimer->Enabled = false; + m_pTimer->OnTimer = TimerProc; + + OnMouseLeave = CMMouseLeave; +} + +//--------------------------------------------------------------------------- +__fastcall TDropListScrollBar::~TDropListScrollBar() +{ + if( m_pCanvas ){ + delete m_pCanvas; + m_pCanvas = NULL; + } + + if( m_pTimer ){ + delete m_pTimer; + m_pTimer = NULL; + } + + if( u_pPicLineUp ){ + delete u_pPicLineUp; + } + + if( u_pPicLineDown ){ + delete u_pPicLineDown; + } +} + +//--------------------------------------------------------------------------- +int TDropListScrollBar::HitTest( int X, int Y ) +{ + if( Y<0 ) + return -1; + else if( YWidth/3 ) + m_pCanvas->Draw( x, y, pPic ); + else{ + tmpRect.Left = x; + tmpRect.Right = tmpRect.Left + Width*3; + tmpRect.Top = y; + tmpRect.Bottom = tmpRect.top + Width; + m_pCanvas->StretchDraw( tmpRect, pPic); + } +} + +//--------------------------------------------------------------------------- +void TDropListScrollBar::DrawThumb( int iState, bool bEraseBk, int iPageUD ) +{ + //add by tj 2013/11/14 + TRect rectDraw; + + //=========================== + // + + rectDraw.Left = PIXEL_EXTERNAL_FRAME; + rectDraw.Right = Width -rectDraw.Left; + + // Ϲ + if(iPageUD == SB_PAGEUP || iState== STATE_PUSH ){ + m_pCanvas->Brush->Color = RGB_EXTERNAL_HIG; + m_pCanvas->Pen->Color = RGB_EXTERNAL_HIG; + }else { + m_pCanvas->Brush->Color = RGB_EXTERNAL_NOR; + m_pCanvas->Pen->Color = RGB_EXTERNAL_NOR; + } + + if( bEraseBk ) //ػ + rectDraw.Top = Width; + else if( m_nPreThumbTopRectangle(rectDraw.Left, rectDraw.Top, + rectDraw.Right, rectDraw.Bottom); + } + + // ¹ + if(iPageUD == SB_PAGEDOWN || iState== STATE_PUSH){ + m_pCanvas->Brush->Color = RGB_EXTERNAL_HIG; + m_pCanvas->Pen->Color = RGB_EXTERNAL_HIG; + }else { + m_pCanvas->Brush->Color = RGB_EXTERNAL_NOR; + m_pCanvas->Pen->Color = RGB_EXTERNAL_NOR; + } + rectDraw.Top = m_nThumbTop + m_nThumbHeight; + if( bEraseBk ) + rectDraw.bottom = Height - Width; + else if( m_nPreThumbTop>m_nThumbTop ){ //ϣΪǰײֵ + rectDraw.bottom = m_nThumbHeight+m_nPreThumbTop; + if( rectDraw.bottom>Height-Width ) + rectDraw.bottom = Height-Width; + }else + rectDraw.Bottom = Height - Width; //£Ϊǰײֵ + + if( rectDraw.Height()>0 ){ + m_pCanvas->Rectangle(rectDraw.Left, rectDraw.Top, + rectDraw.Right, rectDraw.Bottom); + } + + //=========================== + // + if( m_nThumbHeight>0 ){ + //=========================== + // + if(iState==STATE_NORMAL || iState == STATE_HIGHLIGHT){ + m_pCanvas->Brush->Color = RGB_EXTERNAL_NOR; + m_pCanvas->Pen->Color = RGB_EXTERNAL_NOR; + }else if(iState== STATE_PUSH ){ + m_pCanvas->Brush->Color = RGB_EXTERNAL_HIG; + m_pCanvas->Pen->Color = RGB_EXTERNAL_HIG; + } + rectDraw.Top = m_nThumbTop; + rectDraw.Bottom = m_nThumbTop + m_nThumbHeight; + + // + rectDraw.Left = PIXEL_EXTERNAL_FRAME; + rectDraw.Right = rectDraw.Left+PIXEL_EX2INTERNAL; + m_pCanvas->Rectangle(rectDraw.Left, rectDraw.Top, + rectDraw.Right, rectDraw.Bottom); + // + rectDraw.Left = Width - PIXEL_EXTERNAL_FRAME-PIXEL_EX2INTERNAL; + rectDraw.Right = Width - PIXEL_EXTERNAL_FRAME; + m_pCanvas->Rectangle(rectDraw.Left, rectDraw.Top, + rectDraw.Right, rectDraw.Bottom); + + //=========================== + // + if(iState == STATE_NORMAL){ + m_pCanvas->Brush->Color = RGB_INTERNAL_NOR; + m_pCanvas->Pen->Color = RGB_INTERNAL_NOR; + }else if(iState == STATE_HIGHLIGHT){ + m_pCanvas->Brush->Color = RGB_INTERNAL_HIG; + m_pCanvas->Pen->Color = RGB_INTERNAL_HIG; + }else if(iState == STATE_PUSH){ + m_pCanvas->Brush->Color = RGB_INTERNAL_PUSH; + m_pCanvas->Pen->Color = RGB_INTERNAL_PUSH; + } + + rectDraw.left = PIXEL_EXTERNAL_FRAME+PIXEL_EX2INTERNAL+PIXEL_INTERNAL_FARME; + rectDraw.right = Width-rectDraw.left; + rectDraw.Top = m_nThumbTop + PIXEL_INTERNAL_BOUND; + rectDraw.Bottom = m_nThumbTop + m_nThumbHeight - PIXEL_INTERNAL_BOUND; + m_pCanvas->Rectangle(rectDraw.Left, rectDraw.Top, + rectDraw.Right, rectDraw.Bottom); + + //add by tj 2013/12/10 + // + //=========================== + // + COLORREF colLine, *colLineTrans, *colLineLight; + if(iState == STATE_NORMAL){ + colLine = RGB_INTERNAL_LINE_NOR; + colLineTrans = (COLORREF *)RGB_INTERNAL_LINE_NOR_TRANS; + }else if(iState == STATE_HIGHLIGHT){ + colLine = RGB_INTERNAL_LINE_HIG; + colLineTrans = (COLORREF *)RGB_INTERNAL_LINE_HIG_TRANS; + }else if(iState == STATE_PUSH){ + colLine = RGB_INTERNAL_LINE_PUSH; + colLineTrans = (COLORREF *)RGB_INTERNAL_LINE_PUSH_TRANS; + } + + + int X,Y,iPixlX,iPixlY; + + iPixlY = Y = m_nThumbTop + m_nThumbHeight/2 - 3; + iPixlX = X = rectDraw.left + (Width - 2*rectDraw.left - PIXEL_INTERNAL_LINE)/2; + for(int i=0; i<3; i++){ + + iPixlY = Y; + + iPixlX = X; + iPixlY += 1; + for(int j=0; j<6; j++){ + m_pCanvas->Pixels[iPixlX][iPixlY] = colLineTrans[j]; + iPixlX += 1; + } + + iPixlX = X; + iPixlY = Y; + m_pCanvas->Pen->Color = colLine; + m_pCanvas->MoveTo(iPixlX,iPixlY); + iPixlX = Width - iPixlX; + m_pCanvas->LineTo(iPixlX,iPixlY); + + Y += 3; + } + + //=========================== + // ߿ + m_pCanvas->Brush->Color = RGB_INTERNAL_FRAME_NOR; + m_pCanvas->Pen->Color = RGB_INTERNAL_FRAME_NOR; + + + //߿ + rectDraw.left = PIXEL_EXTERNAL_FRAME + PIXEL_EX2INTERNAL; + rectDraw.right = PIXEL_EXTERNAL_FRAME + PIXEL_EX2INTERNAL + PIXEL_INTERNAL_FARME; + m_pCanvas->Rectangle(rectDraw.Left, rectDraw.Top, + rectDraw.Right, rectDraw.Bottom); + //ұ߿ + rectDraw.left = Width - (PIXEL_EXTERNAL_FRAME+PIXEL_EX2INTERNAL+PIXEL_INTERNAL_FARME); + rectDraw.right = Width - (PIXEL_EXTERNAL_FRAME+PIXEL_EX2INTERNAL); + m_pCanvas->Rectangle(rectDraw.Left, rectDraw.Top, + rectDraw.Right, rectDraw.Bottom); + + //ϱ߿ + rectDraw.left = PIXEL_EXTERNAL_FRAME + PIXEL_EX2INTERNAL + PIXEL_INTERNAL_FARME; + rectDraw.right = Width - rectDraw.left; + rectDraw.Top = m_nThumbTop; + rectDraw.Bottom = m_nThumbTop + PIXEL_INTERNAL_BOUND; + m_pCanvas->Rectangle(rectDraw.Left, rectDraw.Top, + rectDraw.Right, rectDraw.Bottom); + + //±߿ + rectDraw.Top = m_nThumbTop + m_nThumbHeight-PIXEL_INTERNAL_BOUND; + rectDraw.Bottom = m_nThumbTop + m_nThumbHeight; + m_pCanvas->Rectangle(rectDraw.Left, rectDraw.Top, + rectDraw.Right, rectDraw.Bottom); + + //=========================== + // + if(iState == STATE_NORMAL){ + m_pCanvas->Pen->Color = RGB_INTERNAL_ROUND_BKG_N_NOR; + }else if(iState == STATE_HIGHLIGHT ){ + m_pCanvas->Pen->Color = RGB_INTERNAL_ROUND_BKG_N_HIG; + }else if( iState == STATE_PUSH){ + m_pCanvas->Pen->Color = RGB_INTERNAL_ROUND_BKG_H_HIG; + } + + //Ͻ + rectDraw.left = PIXEL_EXTERNAL_FRAME + PIXEL_EX2INTERNAL; + rectDraw.Top = m_nThumbTop; + m_pCanvas->Pixels[rectDraw.left][rectDraw.top] = m_pCanvas->Pen->Color; + + //½ + rectDraw.Top = m_nThumbTop + m_nThumbHeight - PIXEL_INTERNAL_BOUND; + m_pCanvas->Pixels[rectDraw.left][rectDraw.top] = m_pCanvas->Pen->Color; + + //Ͻ + rectDraw.left = Width - (PIXEL_EXTERNAL_FRAME+PIXEL_EX2INTERNAL+PIXEL_INTERNAL_BOUND); + rectDraw.Top = m_nThumbTop; + m_pCanvas->Pixels[rectDraw.left][rectDraw.top] = m_pCanvas->Pen->Color; + + //½ + rectDraw.Top = m_nThumbTop + m_nThumbHeight - PIXEL_INTERNAL_BOUND; + m_pCanvas->Pixels[rectDraw.left][rectDraw.top] = m_pCanvas->Pen->Color; + } + +/* TBitmap *pBmp = NULL; + + rectDraw.Left = 0; + rectDraw.Right = rectDraw.Left + Width; + + // Ҫ + if( Width!=u_pPicPageUpTile->Width ){ + pBmp = new TBitmap(); + pBmp->Width = Width; + pBmp->Height = m_nTileHeight; + tmpRect.Left = 0; + tmpRect.Top = 0; + tmpRect.Right = Width; + tmpRect.Bottom = m_nTileHeight; + pBmp->Canvas->StretchDraw( tmpRect, u_pPicPageUpTile ); + } + + // Ϲ + if( bEraseBk ) + rectDraw.Top = Width; + else if( m_nPreThumbTopBrush->Bitmap = u_pPicPageUpTile; + else{ + m_pCanvas->Brush->Bitmap = pBmp; + } + + m_pCanvas->FillRect( rectDraw ); + } + + // ¹ + rectDraw.Top = m_nThumbTop + m_nThumbHeight; + if( bEraseBk ) + rectDraw.bottom = Height - Width; + else if( m_nPreThumbTop>m_nThumbTop ){ + rectDraw.bottom = m_nThumbHeight+m_nPreThumbTop; + if( rectDraw.bottom>Height-Width ){ + rectDraw.bottom = Height-Width; + } + } + else + rectDraw.Bottom = rectDraw.Top; + + if( rectDraw.Height()>0 ){ + if( !pBmp ) + m_pCanvas->Brush->Bitmap = u_pPicPageDownTile; + else{ + tmpRect.Left = 0; + tmpRect.Top = 0; + tmpRect.Right = Width; + tmpRect.Bottom = m_nTileHeight; + pBmp->Canvas->StretchDraw( tmpRect, u_pPicPageDownTile ); + m_pCanvas->Brush->Bitmap = pBmp; + } + + m_pCanvas->FillRect( rectDraw ); + } + + // ƻ + if( m_nThumbHeight>0 ){ + int x = - iState * Width, + y = m_nThumbTop, + hTileUp, + hTileDown; + if( m_nThumbHeight>=THUMB_MINSIZE*2 ){ + hTileUp = (m_nThumbHeight-THUMB_MINSIZE*2+1)/2, + hTileDown = m_nThumbHeight - THUMB_MINSIZE*2 - hTileUp; + } + else{ + hTileUp = (m_nThumbHeight-THUMB_MINSIZE+1)/2, + hTileDown = m_nThumbHeight - THUMB_MINSIZE - hTileUp; + } + + rectDraw.left = x; + rectDraw.right = rectDraw.left + Width*3; + + if( !pBmp ){ + //鶥Բ + m_pCanvas->Draw( x, y, u_pPicThumbTop ); y += THUMB_BORDER; + + //ϲƽ + if( hTileUp>0 ){ + for( int i=0; iHeight+1; i++ ){ + m_pCanvas->Draw( x, y+u_pPicThumbTile->Height*i, u_pPicThumbTile ); + } + y += hTileUp; + } + + //в + if( m_nThumbHeight>=THUMB_MINSIZE*2 ){ + m_pCanvas->Draw( x, y, u_pPicThumbMid ); y += THUMB_BORDER * 2; + } + + //²ƽ + if( hTileDown>0 ){ + for( int i=0; iHeight+1; i++ ){ + m_pCanvas->Draw( x, y+u_pPicThumbTile->Height*i, u_pPicThumbTile ); + } + y += hTileDown; + } + + //ײԲ + m_pCanvas->Draw( x, y, u_pPicThumbBottom ); + } + } + + // ʱͼ + if( pBmp ){ + delete pBmp; + pBmp = NULL; + } +*/ + m_nPreThumbTop = m_nThumbTop; +} + +//--------------------------------------------------------------------------- +void __fastcall TDropListScrollBar::PaintWindow(HDC DC) +{ + if( !m_pCanvas->Handle ) + m_pCanvas->Handle = DC; + + // ϼͷ + DrawArrow( SB_LINEUP, STATE_NORMAL ); + + // ƻ + DrawThumb( STATE_NORMAL, true ); + + // ¼ͷ + DrawArrow( SB_LINEDOWN, STATE_NORMAL ); + + TRect rectDraw; + + //add by tj 2013/11/14 + //=========================== + // ұ߿ + m_pCanvas->Brush->Color = RGB_EXTERNAL_FRAME; + m_pCanvas->Pen->Color = RGB_EXTERNAL_FRAME; + + rectDraw.Top = Width; + rectDraw.Bottom = Height - Width; + + rectDraw.Left = 0; + rectDraw.Right = rectDraw.Left + PIXEL_EXTERNAL_FRAME; + m_pCanvas->Rectangle(rectDraw.Left, rectDraw.Top, + rectDraw.Right, rectDraw.Bottom); + + rectDraw.Left = Width - PIXEL_EXTERNAL_FRAME; + rectDraw.Right = Width; + m_pCanvas->Rectangle(rectDraw.Left, rectDraw.Top, + rectDraw.Right, rectDraw.Bottom); +} + +//--------------------------------------------------------------------------- +void __fastcall TDropListScrollBar::WMPaint(TWMPaint &Message) +{ + PaintHandler(Message); +} +//--------------------------------------------------------------------------- +void __fastcall TDropListScrollBar::SetPosition(int Value, bool bRedraw) +{ + if( m_nPos!=Value ){ + m_nPos = Value; + + CalcThumbTop(); + if( bRedraw ) DrawThumb( STATE_NORMAL, false ); + } +} +//--------------------------------------------------------------------------- +void __fastcall TDropListScrollBar::SetPageSize(int Value, bool bRedraw) +{ + if( m_nPage!=Value ){ + m_nPage = Value; + + CalcThumbHeight(); + if( bRedraw ){ + DrawThumb( STATE_NORMAL, true ); + Invalidate(); + } + } +} +//--------------------------------------------------------------------------- +void __fastcall TDropListScrollBar::SetRange(int AMin, int AMax, bool bRedraw) +{ + if( m_nMin!=AMin || m_nMax!=AMax ){ + m_nMin = AMin; + m_nMax = AMax; + + CalcThumbHeight(); + if( bRedraw ){ + DrawThumb( STATE_NORMAL, true ); + Invalidate(); + } + } +} +//--------------------------------------------------------------------------- +int __fastcall TDropListScrollBar::GetScrollPos() +{ + return m_nPos; +} +//--------------------------------------------------------------------------- +void __fastcall TDropListScrollBar::GetScrollRange(int* nMin, int* nMax) +{ + *nMin = m_nMin; + *nMax = m_nMax; +} +//--------------------------------------------------------------------------- +int __fastcall TDropListScrollBar::GetPageSize() +{ + return m_nPage; +} +//--------------------------------------------------------------------------- + +void __fastcall TDropListScrollBar::SBMSetScrollInfo(TMessage &Message) +{ +/* //add by tj 2013/11/14 + bool bRedraw = bool(Message.WParam) && Visible; + PScrollInfo pSi = PScrollInfo(Message.LParam); + + if( pSi->fMask & SIF_RANGE ) + SetRange( pSi->nMin, pSi->nMax, bRedraw ); + + if( pSi->fMask & SIF_PAGE ) + SetPageSize( pSi->nPage, bRedraw ); + + if( pSi->fMask & SIF_POS ) + SetPosition( pSi->nPos, bRedraw ); +*/ +} + +//--------------------------------------------------------------------------- +void __fastcall TDropListScrollBar::SBMGetScrollInfo(TMessage &Message) +{ +/* //add by tj 2013/11/14 + PScrollInfo pSi = PScrollInfo(Message.LParam); + + if( pSi->fMask & SIF_PAGE ) + pSi->nPage = m_nPage; + + if( pSi->fMask & SIF_POS ) + pSi->nPos = m_nPos; + + if( pSi->fMask & SIF_TRACKPOS ) + pSi->nTrackPos = m_nTrackPos; + + if( pSi->fMask & SIF_RANGE ){ + pSi->nMin = m_nMin; + pSi->nMax = m_nMax; + } +*/ +} + +//--------------------------------------------------------------------------- +void __fastcall TDropListScrollBar::WMLButtonDown(TWMMouse &Message) +{ + SetCapture(Handle); + + m_bAction = true; + m_pWndCtrl->SetFocus(); + + int iHit = HitTest( Message.XPos, Message.YPos ); + if( iHit==SB_THUMBTRACK ){ + m_bDrag = TRUE; + m_nDragPoint = Message.YPos; + m_nDragPos = m_nPos; + m_nTrackPos = m_nDragPos; + DrawThumb( STATE_PUSH, false ); + } + else{ + m_iClicked = iHit; + m_pWndCtrl->Perform( WM_VSCROLL, MAKELONG(m_iClicked,0), LPARAM(Handle) ); + + m_pTimer->Interval = TIME_DELAY; + m_pTimer->Enabled = true; + m_bPause = false; + + int nNewPos = m_nPos; + if( iHit==SB_LINEUP || iHit==SB_LINEDOWN ){ + DrawArrow( iHit, STATE_PUSH ); + nNewPos += (iHit==SB_LINEUP) ? -1 : 1; + } + else if( iHit==SB_PAGEUP || iHit==SB_PAGEDOWN ){ + nNewPos += (iHit==SB_PAGEUP) ? -m_nPage+1 : m_nPage-1; + } + + int nLenInSi = m_nMax-m_nMin-m_nPage+1; + if( nNewPosnLenInSi ) + nNewPos = nLenInSi; + + if( nNewPos!=m_nPos ){ + m_nPos = nNewPos; + CalcThumbTop(); + //add by tj 2013/11/14 + DrawThumb( STATE_NORMAL, false, iHit ); + } + } +} + +//--------------------------------------------------------------------------- +void __fastcall TDropListScrollBar::WMLButtonUp(TWMMouse &Message) +{ + ReleaseCapture(); + + if( m_bDrag ){ + m_bDrag = false; + m_pWndCtrl->Perform(WM_VSCROLL, MAKELONG(SB_THUMBPOSITION, m_nTrackPos), LPARAM(Handle) ); + if( m_nTrackPos!=m_nPos ){ + m_nPos = m_nTrackPos; + } + + m_nTrackPos = 0; + CalcThumbTop(); + + int iHit = HitTest( Message.XPos, Message.YPos ); + if( iHit==SB_THUMBTRACK ) + DrawThumb( STATE_HIGHLIGHT, false ); + else + DrawThumb( STATE_NORMAL, false ); + } + else if( m_iClicked!=-1 ){ + m_pTimer->Enabled = false; + if( m_bNotify ){ + m_bNotify = false; + } + + if( m_iClicked==SB_LINEUP || m_iClicked==SB_LINEDOWN ) + DrawArrow( m_iClicked, STATE_NORMAL ); + + //add by tj 2013/11/14 + if( m_iClicked==SB_PAGEUP || m_iClicked==SB_PAGEDOWN ) + DrawThumb( STATE_NORMAL, false); + + m_iClicked = -1; + } + + m_bAction = false; +} + +//--------------------------------------------------------------------------- +void __fastcall TDropListScrollBar::WMLButtonDblClk(TWMMouse &Message) +{ + int uHit = HitTest( Message.XPos, Message.YPos ); + if( uHit!=SB_THUMBTRACK ){ + m_iClicked = uHit; + + WMLButtonDown( Message ); + m_bAction = false; + } +} + +//--------------------------------------------------------------------------- +void __fastcall TDropListScrollBar::WMMouseMove(TWMMouse &Message) +{ + if( ((Extctrls::TPanel*)m_pWndCtrl)->OnMouseLeave ){ + ((Extctrls::TPanel*)m_pWndCtrl)->OnMouseLeave(NULL); + } + + Commctrl::TTrackMouseEvent tme; + int nDragLen, nLenInSi, nSlide, nTrackLen, nNewPos, iHit, iState; + if( !m_bTrace && (Message.Keys & MK_LBUTTON) ){ + tme.cbSize = sizeof(tme); + tme.hwndTrack = Handle; + tme.dwFlags = TME_LEAVE; + tme.dwHoverTime = 1; + m_bTrace = _TrackMouseEvent(&tme); + } + + if( m_bDrag ){ + nTrackLen = Height - 2 * Width - m_nThumbHeight; + nLenInSi = m_nMax-m_nMin-m_nPage+1; + nDragLen = Message.YPos - m_nDragPoint; + if( nTrackLen==0 ) + nSlide = 0; + else + nSlide = nDragLen * nLenInSi / nTrackLen; + + nNewPos = m_nDragPos + nSlide; + if( nNewPosnLenInSi ) + nNewPos = nLenInSi; + + if( nNewPos!=m_nTrackPos ){ + m_nTrackPos = nNewPos; + CalcThumbTop(); + DrawThumb( STATE_PUSH, false ); + m_pWndCtrl->Perform(WM_VSCROLL, MAKELONG(SB_THUMBTRACK, m_nTrackPos), LPARAM(Handle) ); + } + } + else if( m_iClicked!=-1 ){ + iHit = HitTest( Message.XPos, Message.YPos ); + if( iHit==m_iClicked ){ + m_bPause = false; + iState = STATE_PUSH; //add by tj 2013/11/18 + } + else{ + m_bPause = true; + iState = STATE_NORMAL; + } + + if( m_iClicked==SB_LINEUP || m_iClicked==SB_LINEDOWN ) + DrawArrow( m_iClicked, iState ); + } + else{ + iHit = HitTest( Message.XPos, Message.YPos ); + if( iHit!=m_iHitPrev ){ + if( m_iHitPrev!=-1 ){ + if( m_iHitPrev==SB_THUMBTRACK ) + DrawThumb( STATE_NORMAL, FALSE ); + else if( m_iHitPrev==SB_LINEUP || m_iHitPrev==SB_LINEDOWN ) + DrawArrow( m_iHitPrev, STATE_NORMAL ); + } + + if( iHit!=-1 ){ + if( iHit==SB_THUMBTRACK ) + DrawThumb( STATE_HIGHLIGHT, FALSE ); + else if( iHit==SB_LINEUP || iHit==SB_LINEDOWN ) + DrawArrow( iHit, STATE_HIGHLIGHT ); + } + + m_iHitPrev = iHit; + } + } +} + +//--------------------------------------------------------------------------- +/* +void __fastcall TDropListScrollBar::CMMouseLeave(TMessage &Message) +{ + if( m_iHitPrev!=-1 ){ + if( m_iHitPrev==SB_THUMBTRACK ) + DrawThumb( STATE_NORMAL, false ); + else if( m_iHitPrev==SB_LINEUP || m_iHitPrev==SB_LINEDOWN ) + DrawArrow( m_iHitPrev, STATE_NORMAL ); + + m_iHitPrev = -1; + } +} +*/ +//--------------------------------------------------------------------------- + +void __fastcall TDropListScrollBar::CMMouseLeave(TObject *Sender) +{ + if( m_iHitPrev!=-1 ){ + if( m_iHitPrev==SB_THUMBTRACK ) + DrawThumb( STATE_NORMAL, false ); + else if( m_iHitPrev==SB_LINEUP || m_iHitPrev==SB_LINEDOWN ) + DrawArrow( m_iHitPrev, STATE_NORMAL ); + + m_iHitPrev = -1; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TDropListScrollBar::WMRButtonDown(TWMMouse &Message) +{ +// DefaultHandler(&Message); //add by tj 2013/11/18 +} +//--------------------------------------------------------------------------- +void __fastcall TDropListScrollBar::WMRButtonUp(TWMMouse &Message) +{ +// DefaultHandler(&Message); //add by tj 2013/11/18 +} +//--------------------------------------------------------------------------- +void __fastcall TDropListScrollBar::TimerProc(TObject* Sender) +{ + if( m_pTimer->Interval==TIME_DELAY ){ + m_bNotify = true; + + m_pTimer->Enabled = false; + m_pTimer->Interval = TIME_NOTIFY; + m_pTimer->Enabled = true; + } + else if( m_pTimer->Interval==TIME_NOTIFY && !m_bPause ){ + int nNewPos = m_nPos; + //add by tj 2013/11/14 + bool bPageUD = false; + int iHit; + + switch( m_iClicked ){ + case SB_LINEUP: + nNewPos -= 1; + if( m_nPos==m_nMin ){ + m_pTimer->Enabled = false; + return; + } + break; + + case SB_LINEDOWN: + nNewPos += 1; + if( m_nPos==m_nMax ){ + m_pTimer->Enabled = false; + return; + } + break; + + case SB_PAGEUP: + case SB_PAGEDOWN: + { + TPoint pt; + GetCursorPos(&pt); + pt = ScreenToClient(pt); + + iHit = HitTest( pt.X, pt.Y ); + if( iHit==SB_THUMBTRACK ){ + m_pTimer->Enabled = false; + return; + } + nNewPos += (m_iClicked==SB_PAGEUP) ? -m_nPage+1 : m_nPage-1; + bPageUD = true; + } + break; + } + + int nLenInSi = m_nMax-m_nMin-m_nPage+1; + if( nNewPosnLenInSi ) + nNewPos = nLenInSi; + + if( nNewPos!=m_nPos ){ + m_nPos = nNewPos; + CalcThumbTop(); + //add by tj 2013/11/14 + if(bPageUD) + DrawThumb( STATE_NORMAL, false, iHit ); + else + DrawThumb( STATE_NORMAL, false ); + } + + m_pWndCtrl->Perform( WM_VSCROLL, MAKELONG(m_iClicked,0), LPARAM(Handle) ); + } +} \ No newline at end of file diff --git a/Component/ComboBoxComponent/DropListView.cpp b/Component/ComboBoxComponent/DropListView.cpp new file mode 100644 index 0000000..d815154 --- /dev/null +++ b/Component/ComboBoxComponent/DropListView.cpp @@ -0,0 +1,619 @@ +//--------------------------------------------------------------------------- + +#include "ComboBoxComponent.h" + +//--------------------------------------------------------------------------- +#define CP_ITEM_SLECTED RGB(67, 73, 80) +#define CP_ITEM_UNSLECTED RGB(39, 42, 47) +//--------------------------------------------------------------------------- +__fastcall TComboBoxItem::TComboBoxItem(String Caption, TItemClickEvent OnItemClick) +{ + FCaption = Caption; + FOnItemClick = OnItemClick; + FTag = 0; +} +//--------------------------------------------------------------------------- +void __fastcall TComboBoxItem::DrawItem(TCanvas *Canvas, TRect Rect, bool Selected) +{ + if(Selected) + Canvas->Brush->Color = CP_ITEM_SLECTED; + else + Canvas->Brush->Color = CP_ITEM_UNSLECTED; + + /* Ʊ */ + Canvas->FillRect(Rect); + + /* */ + int var_TextRectTop = Rect.Top + (Rect.Height() - Canvas->TextHeight(FCaption)) / 2; + + TRect var_TextRect(4, var_TextRectTop, Rect.Right - 4, Rect.Bottom); + + Canvas->TextRect(var_TextRect, FCaption); +} +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +//#define CP_BORDER RGB(29, 31, 35) +#define CP_BORDER RGB(106, 111, 117) +#define CP_BACKGRND RGB(39, 42, 47) + +#define CP_BORDER_HL RGB(30, 32, 36) +#define CP_BACKGRND_HL RGB(67, 73, 80) + +#define CP_TXT_NOR RGB(213, 221, 232) +#define CP_TXT_DISABLE RGB(100, 108, 119) +#define CP_BREAK RGB(100, 108, 119) +#define CP_BOARD_FILL RGB(76, 82, 91) + +#define MIN(x, y) ((x) < (y) ? (x) : (y)) +#define MAX(x, y) ((x) > (y) ? (x) : (y)) +//--------------------------------------------------------------------------- +__fastcall TDropListView::TDropListView(TComponent *Owner) : TWinControl(Owner) +{ + m_Canvas = new TControlCanvas(); + m_Canvas->Control = this; + m_Canvas->Font->Color = RGB(156, 170, 189); + + m_ItemRectList = new TList(); + m_ItemList = new TList(); + + FOnHide = NULL; + FOnShow = NULL; + + FItemHeight = 16; + FItemWidth = 99; + FDefItemIndex = -1; + FShowItemsCount = 10; + DoShowItemsChange(); + + m_CurrentItemIndex = 0; + m_RealShowCount = 0; + + m_BeginIndex = 0; + + m_ScrollBar = NULL; + + SetDesignVisible(false); + Ctl3D = false; + ParentBackground = false; + ParentBiDiMode = false; + ParentColor = false; + ParentCustomHint = false; + ParentDoubleBuffered = false; + ParentFont = true; + ParentShowHint = false; + + CreateScrollBar(); +} +//--------------------------------------------------------------------------- +__fastcall TDropListView::~TDropListView() +{ + if(m_ItemRectList) + { + delete m_ItemRectList; + m_ItemRectList = NULL; + } + + if(m_ItemList) + { + delete m_ItemList; + m_ItemList = NULL; + } + + if(m_ScrollBar) + { + delete m_ScrollBar; + m_ScrollBar = NULL; + } + + if(m_Canvas) + { + delete m_Canvas; + m_Canvas = NULL; + } +} +//--------------------------------------------------------------------------- +void __fastcall TDropListView::AddItem(TComboBoxItem* Item) +{ + m_ItemList->Add(Item); + + DoItemsCountChange(); +} +//--------------------------------------------------------------------------- +int __fastcall TDropListView::CalcListHeight() +{ + if(ItemsCount == 0) + return 10; + else + return FItemHeight * m_RealShowCount; +} +//--------------------------------------------------------------------------- +void __fastcall TDropListView::Clear() +{ + m_ItemList->Clear(); + FDefItemIndex = -1; +} +//--------------------------------------------------------------------------- +void __fastcall TDropListView::CreateParams(TCreateParams &Params) +{ + TWinControl::CreateParams(Params); + + Params.Style = 0; + + Params.Style = WS_POPUP; +} +//--------------------------------------------------------------------------- +void __fastcall TDropListView::CreateScrollBar() +{ + m_ScrollBar = new TDropListScrollBar(NULL); + m_ScrollBar->Parent = this; + m_ScrollBar->Visible = false; + m_ScrollBar->m_pWndCtrl = this; +} +//--------------------------------------------------------------------------- +void __fastcall TDropListView::CreateWnd() +{ + TWinControl::CreateWnd(); +} +//--------------------------------------------------------------------------- +void __fastcall TDropListView::SetFontSize(int sz) +{ + m_Canvas->Font->Size = sz; +} +//--------------------------------------------------------------------------- +void __fastcall TDropListView::SetFont(String name, int sz) +{ + m_Canvas->Font->Name = name; + m_Canvas->Font->Size = sz; +} +//--------------------------------------------------------------------------- +void __fastcall TDropListView::DoItemClicked(int Index) +{ + FDefItemIndex = Index; + GetItem(FDefItemIndex)->OnItemClicked(GetItem(FDefItemIndex), FDefItemIndex); + Hide(); +} +//--------------------------------------------------------------------------- +void __fastcall TDropListView::DoItemsCountChange() +{ + m_RealShowCount = MIN(FShowItemsCount, ItemsCount); + + m_EndIndex = m_BeginIndex + m_RealShowCount; +} +//--------------------------------------------------------------------------- +void __fastcall TDropListView::DoItemSelect(int Index) +{ + if(Index != m_CurrentItemIndex) + { + /* ԭһѡ */ + if(m_CurrentItemIndex >= m_BeginIndex && m_CurrentItemIndex < m_EndIndex) + { + GetItem(m_CurrentItemIndex)->DrawItem(m_Canvas, + *GetItemRect(m_CurrentItemIndex - m_BeginIndex), false); + } + /* µǰѡ */ + m_CurrentItemIndex = Index; + /* ػѡ */ + GetItem(m_CurrentItemIndex)->DrawItem(m_Canvas, + *GetItemRect(m_CurrentItemIndex - m_BeginIndex), true); + } +} +//--------------------------------------------------------------------------- +void __fastcall TDropListView::DoKeyUpDown(int Index) +{ + if(Index < m_BeginIndex) + { + int var_eIndex = Index + 1; + + if(var_eIndex < m_RealShowCount) + ScrollPos(0); + else + ScrollPos(var_eIndex - m_RealShowCount); + } + + if(Index >= m_EndIndex) + { + int var_eIndex = Index + m_RealShowCount; + + if(var_eIndex > ItemsCount) + ScrollPos(ItemsCount - m_RealShowCount); + else + ScrollPos(var_eIndex - m_RealShowCount); + } + + DoItemSelect(Index); +} +//--------------------------------------------------------------------------- +void __fastcall TDropListView::DoShowItemsChange() +{ + m_ItemRectList->Clear(); + + for(int i = 0; i < FShowItemsCount; i++) + { + int var_ItemTop = i * FItemHeight; + int var_ItemBottom = var_ItemTop + FItemHeight; + + m_ItemRectList->Add(new TRect(1, var_ItemTop + 1, FItemWidth, var_ItemBottom - 1)); + } + + DoItemsCountChange(); +} +//--------------------------------------------------------------------------- +void __fastcall TDropListView::Hide() +{ + TWinControl::Hide(); + + SetActiveWindow(m_pActiveWnd); + + if(FOnHide) FOnHide(this); +} +//--------------------------------------------------------------------------- +int __fastcall TDropListView::GetItemsCount() +{ + if(m_ItemList) + return m_ItemList->Count; + else + return -1; +} +//--------------------------------------------------------------------------- +TComboBoxItem *__fastcall TDropListView::GetItem(int Index) +{ + if(ItemsCount == 0 || Index < 0 || Index > ItemsCount) + return NULL; + else + return (TComboBoxItem *)m_ItemList->Items[Index]; +} +//--------------------------------------------------------------------------- +TRect *__fastcall TDropListView::GetItemRect(int Index) +{ + return (TRect *)m_ItemRectList->Items[Index]; +} +//--------------------------------------------------------------------------- +void __fastcall TDropListView::MouseDown(TMouseButton Button, TShiftState Shift, int X, int Y) +{ + TWinControl::MouseDown(Button, Shift, X, Y); + + TRect cl_Rect = GetClientRect(); + + if(X >= 0 && X <= cl_Rect.Right && Y >= 0 && Y <= cl_Rect.Bottom && ItemsCount > 0) + { + if(Button == 0 && X < FItemWidth) + { + int var_DefItemIndex = Y / FItemHeight + m_BeginIndex; + + if(m_CurrentItemIndex != var_DefItemIndex) + DoItemSelect(var_DefItemIndex); + else + DoItemClicked(var_DefItemIndex); + } + } + else + { + Hide(); + } +} +//--------------------------------------------------------------------------- +void __fastcall TDropListView::MouseMove(TShiftState Shift, int X, int Y) +{ + TWinControl::MouseMove(Shift, X, Y); + + if(m_MouseX == X && m_MouseY == Y) return; + + m_MouseX = X; + m_MouseY = Y; + + TRect var_Rect = GetClientRect(); + + if(X >= 0 && X < FItemWidth && Y >= 0 && Y < var_Rect.Bottom && ItemsCount > 0) + DoItemSelect(Y / FItemHeight + m_BeginIndex); +} +//--------------------------------------------------------------------------- +void __fastcall TDropListView::MouseUp(TMouseButton Button, TShiftState Shift, int X, int Y) +{ + TWinControl::MouseUp(Button, Shift, X, Y); + + TRect cl_Rect = GetClientRect(); + + if(X >= 0 && X <= cl_Rect.Right && Y >= 0 && Y <= cl_Rect.Bottom) + { + if(Visible && ItemsCount > 0 && Button == 0 && X < FItemWidth) + { + int var_DefItemIndex = Y / FItemHeight + m_BeginIndex; + + if(m_CurrentItemIndex != var_DefItemIndex) + DoItemSelect(var_DefItemIndex); + else + DoItemClicked(var_DefItemIndex); + } + } + else + { + if(Visible) Hide(); + } +} +//--------------------------------------------------------------------------- +void __fastcall TDropListView::PaintWindow(HDC DC) +{ + if(ItemsCount == 0) return; + + m_Canvas->Lock(); + for(int Index = m_BeginIndex; Index < m_EndIndex; Index++) + { + int var_ShowIndex = Index - m_BeginIndex; + + if(Index == m_CurrentItemIndex) + GetItem(Index)->DrawItem(m_Canvas, *GetItemRect(var_ShowIndex), true); + else + GetItem(Index)->DrawItem(m_Canvas, *GetItemRect(var_ShowIndex), false); + } + m_Canvas->Unlock(); +} +//--------------------------------------------------------------------------- +void __fastcall TDropListView::RemoveItem(int Index) +{ + if(ItemsCount == 0 || Index < 0 || Index > ItemsCount) + return; + + if(Index == FDefItemIndex) + FDefItemIndex = -1; + else if(Index > FDefItemIndex) + FDefItemIndex--; + + m_ItemList->Delete(Index); +} +//--------------------------------------------------------------------------- +void __fastcall TDropListView::ScrollPos(int Pos) +{ + if(Pos >= 0 && Pos < ItemsCount) + { + int var_bIndex = Pos; + int var_eIndex = Pos + m_RealShowCount; + + if(var_eIndex > ItemsCount) + { + var_eIndex = ItemsCount; + var_bIndex = var_eIndex - m_RealShowCount; + } + + if(var_bIndex != m_BeginIndex) + { + m_BeginIndex = var_bIndex; + m_EndIndex = var_eIndex; + + PaintWindow(NULL); + } + } +} +//--------------------------------------------------------------------------- +void __fastcall TDropListView::SetShowItemsCount(int Value) +{ + if(FShowItemsCount != Value) + { + FShowItemsCount = Value; + + DoShowItemsChange(); + } +} +//--------------------------------------------------------------------------- +void __fastcall TDropListView::Show() +{ + TWinControl::Show(); + + m_pActiveWnd = GetActiveWindow(); + SetActiveWindow(Handle); + + //if(FDefItemIndex == -1) + //m_CurrentItemIndex = 0; + //else + m_CurrentItemIndex = FDefItemIndex; + + if(m_CurrentItemIndex == -1) + { + m_BeginIndex = 0; + m_EndIndex = m_RealShowCount; + ScrollPos(0); + } + else + { + m_BeginIndex = m_CurrentItemIndex; + m_EndIndex = m_CurrentItemIndex + m_RealShowCount; + + if(m_EndIndex > ItemsCount) + { + m_EndIndex = ItemsCount; + m_BeginIndex = m_EndIndex - m_RealShowCount; + } + + if(m_CurrentItemIndex < m_BeginIndex || m_CurrentItemIndex >= m_EndIndex) + { + int var_eIndex = m_CurrentItemIndex + 1; + + if(var_eIndex < m_RealShowCount) + ScrollPos(m_BeginIndex); + else + ScrollPos(m_EndIndex - m_RealShowCount); + } + } + + if(ItemsCount == 0) + Height = 10; + else + Height = FItemHeight * m_RealShowCount; + + if(m_ScrollBar) + { + m_ScrollBar->Height = Height - 2; + m_ScrollBar->Left = Width - m_ScrollBar->Width - 1; + m_ScrollBar->Top = 1; + + if(m_RealShowCount < ItemsCount) + { + m_ScrollBar->Visible = true; + FItemWidth = m_ScrollBar->Left; + m_ScrollBar->SetRange(0, ItemsCount - 1); + m_ScrollBar->SetPageSize(m_RealShowCount); + m_ScrollBar->SetPosition(m_BeginIndex); + DoShowItemsChange(); + } + else + { + m_ScrollBar->Visible = false; + FItemWidth = Width - 1; + DoShowItemsChange(); + } + } + + if(FOnShow) FOnShow(this); +} +//--------------------------------------------------------------------------- +void __fastcall TDropListView::WMEraseBkgnd(TWMEraseBkgnd &Message) +{ + TCanvas* var_BKCanvas = new TCanvas(); + var_BKCanvas->Handle = Message.DC; + + TRect var_Rect = GetClientRect(); + + var_BKCanvas->Brush->Color = CP_BACKGRND; // Ƶɫ + var_BKCanvas->FillRect(var_Rect); + + var_BKCanvas->Brush->Color = CP_BORDER; // Ʊ߿ + var_BKCanvas->FrameRect(var_Rect); + + delete var_BKCanvas; + var_BKCanvas = NULL; +} +//--------------------------------------------------------------------------- +void __fastcall TDropListView::WMKeyDown(TWMKeyDown &Message) +{ + if(ItemsCount == 0) return; + + if(Message.CharCode == VK_UP) + { + int var_Index = m_CurrentItemIndex - 1; + if(var_Index < 0) var_Index = 0; + + DoKeyUpDown(var_Index); + } + else if(Message.CharCode == VK_DOWN) + { + int var_Index = m_CurrentItemIndex + 1; + if(var_Index >= ItemsCount) var_Index = ItemsCount - 1; + + DoKeyUpDown(var_Index); + } + else if(Message.CharCode == VK_ESCAPE) + { + Hide(); + } + else if(Message.CharCode == VK_RETURN) + { + DoItemClicked(m_CurrentItemIndex); + } +} +//--------------------------------------------------------------------------- +void __fastcall TDropListView::WMKillFocus(TMessage &Message) +{ + Hide(); +} +//--------------------------------------------------------------------------- +void __fastcall TDropListView::WMLButtonDown(TWMLButtonDown &Message) +{ + TWinControl::Dispatch(&Message); + + if(m_ScrollBar) + { + } +} +//--------------------------------------------------------------------------- +void __fastcall TDropListView::WMMouseWheel(TWMMouseWheel &Message) +{ + UINT nSBCode; + + if(Message.WheelDelta < 0) + { + nSBCode = SB_LINEDOWN; + } + else + { + nSBCode = SB_LINEUP; + } + + if(m_ScrollBar->Visible) + Perform(WM_VSCROLL, MAKELONG(nSBCode, 0), NULL); +} +//--------------------------------------------------------------------------- +void __fastcall TDropListView::WMPaint(TWMPaint &Message) +{ + PaintHandler(Message); +} +//--------------------------------------------------------------------------- +void __fastcall TDropListView::WMSetFocus(TMessage &Message) +{ +} +//--------------------------------------------------------------------------- +void __fastcall TDropListView::WMVScroll(TWMScroll &Message) +{ + int minpos, maxpos, page, curpos; + + m_ScrollBar->GetScrollRange(& minpos, & maxpos); + + page = m_ScrollBar->GetPageSize(); + curpos = m_ScrollBar->GetScrollPos(); + + switch(Message.ScrollCode) + { + case SB_TOP: + curpos = minpos; + break; + + case SB_BOTTOM: + curpos = maxpos - page + 1; + break; + + case SB_ENDSCROLL: + break; + + case SB_LINEUP: + if(curpos > minpos) + { + curpos--; + } + break; + + case SB_LINEDOWN: + if(curpos < maxpos - page + 1) + { + curpos++; + } + break; + + case SB_PAGEUP: + if(curpos > minpos) + { + curpos = MAX(minpos, curpos - page); + } + break; + + case SB_PAGEDOWN: + if(curpos < maxpos) + { + curpos = MIN(maxpos - page + 1, curpos + page); + } + break; + + case SB_THUMBPOSITION: + curpos = Message.Pos; + break; + + case SB_THUMBTRACK: + curpos = Message.Pos; + break; + } + + if(Message.ScrollBar != m_ScrollBar->Handle) + { + m_ScrollBar->SetPosition(curpos); + } + + ScrollPos(curpos); +} +//--------------------------------------------------------------------------- \ No newline at end of file diff --git a/Component/ComboBoxComponent/TComboBoxComponent.cpp b/Component/ComboBoxComponent/TComboBoxComponent.cpp new file mode 100644 index 0000000..c2815fb --- /dev/null +++ b/Component/ComboBoxComponent/TComboBoxComponent.cpp @@ -0,0 +1,17 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop +#pragma package(smart_init) +//--------------------------------------------------------------------------- + +// Package source. +//--------------------------------------------------------------------------- + + +#pragma argsused +extern "C" int _libmain(unsigned long reason) +{ + return 1; +} +//--------------------------------------------------------------------------- diff --git a/Component/ComponentGroup.dsk b/Component/ComponentGroup.dsk new file mode 100644 index 0000000..7318675 --- /dev/null +++ b/Component/ComponentGroup.dsk @@ -0,0 +1,654 @@ +[Closed Files] +File_0=TSourceModule,'E:\Ac_Project\Ac_Windows\PngButton\PNGButton.pas',0,1,181,82,200,0,0,, +File_1=TSourceModule,'d:\program file\embarcadero\studio\23.0\include\dinkumware\xlocnum',0,1,1586,20,1618,0,0,, +File_2=TSourceModule,'E:\Ac_Project\Ac_Windows\PngButton\TPNGButtonPCH1.h',0,1,1,1,1,0,0,, +File_3=TSourceModule,'d:\program file\embarcadero\studio\23.0\include\windows\crtl\typeinfo.h',0,1,122,2,154,0,0,, +File_4=TSourceModule,'E:\BCB_Project\Apps\UKeyApps\SLPChecker\SLPChecker.cpp',0,1,1,99,594,0,0,, +File_5=TSourceModule,'E:\BCB_Project\Apps\UKeyApps\SLPrint\PrintThread.cpp',0,1,1,1,1,0,0,, +File_6=TSourceModule,'E:\BCB_Project\Apps\UKeyApps\SLPChecker\Common.cpp',0,1,34,63,66,0,0,, +File_7=TSourceModule,'E:\BCB_Project\Apps\UKeyApps\SLPChecker\SLPChecker.vrc',0,1,1,1,2,0,0,, +File_8=TSourceModule,'E:\BCB_Project\Apps\Global\GlobalUnit.cpp',0,1,1,1,1,0,0,, +File_9=TSourceModule,'E:\BCB_Project\Apps\TotalGoals\Datas.cpp',0,1,1834,55,1847,0,0,, +File_10=TSourceModule,'E:\BCB_Project\Apps\TotalGoals\TGsMain.cpp',0,1,1378,115,1406,0,0,, +File_11=TSourceModule,'E:\BCB_Project\Apps\SportteryHedge\SLHdgMain.cpp',0,1,1,1,1,0,0,, +File_12=TSourceModule,'E:\BCB_Project\Apps\TotalGoals\HGPanelUnit.cpp',0,1,145,75,169,0,0,, +File_13=TSourceModule,'E:\BCB_Project\Apps\TotalGoals\BDPanelUnit.cpp',0,1,134,57,79,0,0,, +File_14=TSourceModule,'E:\BCB_Project\Apps\TotalGoals\SLPanelUnit.cpp',0,1,9,56,26,0,0,, + +[Modules] +Count=0 +EditWindowCount=1 + +[EditWindow0] +ViewCount=0 +CurrentView=-1 +PercentageSizes=1 +Create=1 +Visible=1 +Docked=1 +State=0 +Left=0 +Top=0 +Width=9938 +Height=9253 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=9938 +ClientHeight=9253 +TBDockHeight=4476 +LRDockWidth=3621 +Dockable=1 +StayOnTop=0 +DockedToMainForm=1 +BorlandEditorCodeExplorer=BorlandEditorCodeExplorer@EditWindow0 +TopPanelSize=0 +LeftPanelSize=1895 +LeftPanelClients=PropertyInspector,DockSite3 +LeftPanelData=00000800010100000000251000000000000001670700000000000001000000005A0E000009000000446F636B53697465330100000000B31C00001100000050726F7065727479496E73706563746F72FFFFFFFF +RightPanelSize=1996 +RightPanelClients=DockSite2,DockSite4 +RightPanelData=00000800010100000000251000000000000001CC0700000000000001000000004912000009000000446F636B53697465320100000000B31C000009000000446F636B5369746534FFFFFFFF +BottomPanelSize=1542 +BottomPanelClients=DockSite1,MessageView +BottomPanelData=0000080001020100000009000000446F636B536974653103450000000000000206060000000000000100000000034500000F0000004D65737361676556696577466F726DFFFFFFFF +BottomMiddlePanelSize=0 +BottomMiddlePanelClients=DockSite0,GraphDrawingModel +BottomMiddelPanelData=0000080001020200000009000000446F636B536974653010000000477261706844726177696E67566965779F1D00000000000002F206000000000000FFFFFFFF + +[Watches] +Count=0 + +[WatchWindow] +WatchColumnWidth=120 +WatchShowColumnHeaders=1 +PercentageSizes=1 +Create=1 +Visible=1 +Docked=1 +State=0 +Left=0 +Top=0 +Width=3824 +Height=1221 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=3824 +ClientHeight=1221 +TBDockHeight=216 +LRDockWidth=13602 +Dockable=1 +StayOnTop=0 + +[Breakpoints] +Count=0 + +[EmbarcaderoWin32Debugger_AddressBreakpoints] +Count=0 + +[EmbarcaderoWin64Debugger_AddressBreakpoints] +Count=0 + +[EmbarcaderoWin64LLDBDebugger_AddressBreakpoints] +Count=0 + +[Main Window] +PercentageSizes=1 +Create=1 +Visible=1 +Docked=0 +State=2 +Left=145 +Top=273 +Width=8930 +Height=8520 +MaxLeft=-4 +MaxTop=-7 +MaxWidth=8930 +MaxHeight=8520 +ClientWidth=10000 +ClientHeight=10057 +BottomPanelSize=8944 +BottomPanelClients=EditWindow0 +BottomPanelData=0000080000000000000000000000000000000000000000000000000100000000000000000C0000004564697457696E646F775F30FFFFFFFF + +[ProjectManager] +PercentageSizes=1 +Create=1 +Visible=1 +Docked=1 +State=0 +Left=0 +Top=0 +Width=1996 +Height=4382 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=1996 +ClientHeight=4382 +TBDockHeight=5898 +LRDockWidth=2348 +Dockable=1 +StayOnTop=0 + +[MessageView] +PercentageSizes=1 +Create=1 +Visible=1 +Docked=1 +State=0 +Left=0 +Top=28 +Width=9938 +Height=1394 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=9938 +ClientHeight=1394 +TBDockHeight=1394 +LRDockWidth=2770 +Dockable=1 +StayOnTop=0 + +[ToolForm] +PercentageSizes=1 +Create=1 +Visible=1 +Docked=1 +State=0 +Left=0 +Top=0 +Width=1996 +Height=2557 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=1996 +ClientHeight=2557 +TBDockHeight=7155 +LRDockWidth=1996 +Dockable=1 +StayOnTop=0 + +[PropertyInspector] +PercentageSizes=1 +Create=1 +Visible=1 +Docked=1 +State=0 +Left=0 +Top=557 +Width=1895 +Height=3599 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=1895 +ClientHeight=3599 +PixelsPerInch=96 +MonitorNum=0 +TBDockHeight=4274 +LRDockWidth=1895 +Dockable=1 +StayOnTop=0 +SplitPos=111 + +[frmDesignPreview] +PercentageSizes=1 +Create=1 +Visible=1 +Docked=1 +State=0 +Left=0 +Top=0 +Width=1996 +Height=4073 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=1996 +ClientHeight=4073 +TBDockHeight=5955 +LRDockWidth=2512 +Dockable=1 +StayOnTop=0 + +[TemplateView] +PercentageSizes=1 +Create=1 +Visible=0 +Docked=1 +State=0 +Left=0 +Top=0 +Width=273 +Height=359 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=273 +ClientHeight=359 +TBDockHeight=359 +LRDockWidth=273 +Dockable=1 +StayOnTop=0 +Name=120 +Description=334 +filter=1 + +[DebugLogView] +PercentageSizes=1 +Create=1 +Visible=1 +Docked=1 +State=0 +Left=0 +Top=0 +Width=3824 +Height=1221 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=3824 +ClientHeight=1221 +TBDockHeight=409 +LRDockWidth=4949 +Dockable=1 +StayOnTop=0 + +[ThreadStatusWindow] +PercentageSizes=1 +Create=1 +Visible=1 +Docked=1 +State=0 +Left=0 +Top=0 +Width=3824 +Height=1221 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=3824 +ClientHeight=1221 +TBDockHeight=216 +LRDockWidth=7406 +Dockable=1 +StayOnTop=0 +Column0Width=145 +Column1Width=100 +Column2Width=115 +Column3Width=619 + +[LocalVarsWindow] +PercentageSizes=1 +Create=1 +Visible=1 +Docked=1 +State=0 +Left=0 +Top=0 +Width=3824 +Height=1221 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=3824 +ClientHeight=1221 +TBDockHeight=1537 +LRDockWidth=3484 +Dockable=1 +StayOnTop=0 + +[CallStackWindow] +PercentageSizes=1 +Create=1 +Visible=1 +Docked=1 +State=0 +Left=0 +Top=0 +Width=3824 +Height=1221 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=3824 +ClientHeight=1221 +TBDockHeight=2062 +LRDockWidth=3484 +Dockable=1 +StayOnTop=0 + +[PatchForm] +PercentageSizes=1 +Create=1 +Visible=1 +Docked=1 +State=0 +Left=0 +Top=0 +Width=2340 +Height=1279 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=2340 +ClientHeight=1279 +TBDockHeight=2500 +LRDockWidth=3398 +Dockable=1 +StayOnTop=0 + +[FindReferencsForm] +PercentageSizes=1 +Create=1 +Visible=1 +Docked=1 +State=0 +Left=0 +Top=0 +Width=2340 +Height=1279 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=2340 +ClientHeight=1279 +TBDockHeight=2320 +LRDockWidth=2824 +Dockable=1 +StayOnTop=0 + +[RefactoringForm] +PercentageSizes=1 +Create=1 +Visible=1 +Docked=1 +State=0 +Left=0 +Top=0 +Width=2340 +Height=1279 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=2340 +ClientHeight=1279 +TBDockHeight=3211 +LRDockWidth=2824 +Dockable=1 +StayOnTop=0 + +[ToDo List] +PercentageSizes=1 +Create=1 +Visible=1 +Docked=1 +State=0 +Left=0 +Top=0 +Width=2340 +Height=1279 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=2340 +ClientHeight=1279 +TBDockHeight=1157 +LRDockWidth=3676 +Dockable=1 +StayOnTop=0 +Column0Width=314 +Column1Width=30 +Column2Width=150 +Column3Width=172 +Column4Width=129 +SortOrder=4 +ShowHints=1 +ShowChecked=1 + +[DataExplorerContainer] +PercentageSizes=1 +Create=1 +Visible=1 +Docked=1 +State=0 +Left=0 +Top=0 +Width=1996 +Height=4073 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=1996 +ClientHeight=4073 +TBDockHeight=4885 +LRDockWidth=7148 +Dockable=1 +StayOnTop=0 + +[GraphDrawingModel] +PercentageSizes=1 +Create=1 +Visible=0 +Docked=1 +State=0 +Left=0 +Top=0 +Width=2855 +Height=3211 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=2855 +ClientHeight=3211 +TBDockHeight=3211 +LRDockWidth=2855 +Dockable=1 +StayOnTop=0 + +[BreakpointWindow] +PercentageSizes=1 +Create=1 +Visible=1 +Docked=1 +State=0 +Left=0 +Top=0 +Width=3824 +Height=1221 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=3824 +ClientHeight=1221 +TBDockHeight=1545 +LRDockWidth=8742 +Dockable=1 +StayOnTop=0 +Column0Width=200 +Column1Width=75 +Column2Width=200 +Column3Width=200 +Column4Width=200 +Column5Width=75 +Column6Width=75 + +[StructureView] +PercentageSizes=1 +Create=1 +Visible=1 +Docked=1 +State=0 +Left=0 +Top=0 +Width=1895 +Height=3542 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=1895 +ClientHeight=3542 +TBDockHeight=3678 +LRDockWidth=1895 +Dockable=1 +StayOnTop=0 + +[ParnassusBookmarksForm] +PercentageSizes=1 +Create=1 +Visible=0 +Docked=0 +State=0 +Left=0 +Top=0 +Width=2227 +Height=2364 +MaxLeft=-4 +MaxTop=-7 +ClientWidth=2164 +ClientHeight=2083 +TBDockHeight=2364 +LRDockWidth=2227 +Dockable=1 +StayOnTop=0 + +[BorlandEditorCodeExplorer@EditWindow0] +PercentageSizes=1 +Create=1 +Visible=0 +Docked=0 +State=0 +Left=0 +Top=0 +Width=1824 +Height=6171 +MaxLeft=-4 +MaxTop=-7 +ClientWidth=1762 +ClientHeight=5891 +TBDockHeight=6171 +LRDockWidth=1824 +Dockable=1 +StayOnTop=0 + +[DockHosts] +DockHostCount=5 + +[DockSite0] +HostDockSite=DockBottomCenterPanel +DockSiteType=1 +PercentageSizes=1 +Create=1 +Visible=0 +Docked=1 +State=0 +Left=8 +Top=8 +Width=2340 +Height=1480 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=2340 +ClientHeight=1480 +PixelsPerInch=96 +MonitorNum=0 +TBDockHeight=1480 +LRDockWidth=2340 +Dockable=1 +StayOnTop=0 +TabPosition=1 +ActiveTabID=RefactoringForm +TabDockClients=RefactoringForm,PatchForm,FindReferencsForm,ToDo List + +[DockSite1] +HostDockSite=DockBottomPanel +DockSiteType=1 +PercentageSizes=1 +Create=1 +Visible=0 +Docked=1 +State=0 +Left=8 +Top=8 +Width=3824 +Height=1422 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=3824 +ClientHeight=1422 +PixelsPerInch=96 +MonitorNum=0 +TBDockHeight=1422 +LRDockWidth=3824 +Dockable=1 +StayOnTop=0 +TabPosition=1 +ActiveTabID=DebugLogView +TabDockClients=DebugLogView,BreakpointWindow,ThreadStatusWindow,CallStackWindow,WatchWindow,LocalVarsWindow + +[DockSite2] +HostDockSite=DockRightPanel +DockSiteType=1 +PercentageSizes=1 +Create=1 +Visible=1 +Docked=1 +State=0 +Left=0 +Top=28 +Width=1996 +Height=4583 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=1996 +ClientHeight=4583 +PixelsPerInch=96 +MonitorNum=0 +TBDockHeight=4274 +LRDockWidth=1996 +Dockable=1 +StayOnTop=0 +TabPosition=1 +ActiveTabID=ProjectManager +TabDockClients=ProjectManager,DataExplorerContainer,frmDesignPreview + +[DockSite3] +HostDockSite=DockLeftPanel +DockSiteType=1 +PercentageSizes=1 +Create=1 +Visible=1 +Docked=1 +State=0 +Left=0 +Top=28 +Width=1895 +Height=3542 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=1895 +ClientHeight=3542 +PixelsPerInch=96 +MonitorNum=0 +TBDockHeight=4274 +LRDockWidth=1895 +Dockable=1 +StayOnTop=0 +TabPosition=1 +ActiveTabID=StructureView +TabDockClients=StructureView + +[DockSite4] +HostDockSite=DockRightPanel +DockSiteType=1 +PercentageSizes=1 +Create=1 +Visible=1 +Docked=1 +State=0 +Left=0 +Top=702 +Width=1996 +Height=2557 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=1996 +ClientHeight=2557 +PixelsPerInch=96 +MonitorNum=0 +TBDockHeight=4274 +LRDockWidth=1996 +Dockable=1 +StayOnTop=0 +TabPosition=1 +ActiveTabID=ToolForm +TabDockClients=ToolForm,TemplateView + +[ActiveProject] +ActiveProject=8 + diff --git a/Component/ComponentGroup.groupproj b/Component/ComponentGroup.groupproj new file mode 100644 index 0000000..398bd79 --- /dev/null +++ b/Component/ComponentGroup.groupproj @@ -0,0 +1,120 @@ + + + {CE208A77-9005-40A7-9448-30493E16683A} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Default.Personality.12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Component/GenelralDialogPanel/GeneralDialogPanel.cpp b/Component/GenelralDialogPanel/GeneralDialogPanel.cpp new file mode 100644 index 0000000..6be50f2 --- /dev/null +++ b/Component/GenelralDialogPanel/GeneralDialogPanel.cpp @@ -0,0 +1,353 @@ +//--------------------------------------------------------------------------- + +#include +#include + +#pragma hdrstop + +#include "GeneralDialogPanel.h" +#pragma package(smart_init) +#include "PNGButton.cpp" + +//--------------------------------------------------------------------------- +// ValidCtrCheck is used to assure that the components created do not have +// any pure virtual functions. +// +// +static const char *pngImage = +"89504E470D0A1A0A0000000D49484452000000450000001208060000000D0613"\ +"66000000097048597300000B1300000B1301009A9C1800000A4D694343505068"\ +"6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF"\ +"F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A"\ +"561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5"\ +"7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8"\ +"1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC"\ +"01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200"\ +"C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05"\ +"00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2"\ +"00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C"\ +"CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97"\ +"4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313"\ +"48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F"\ +"223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA"\ +"560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED"\ +"2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383"\ +"FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A"\ +"F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86"\ +"4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432"\ +"79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0"\ +"812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C"\ +"0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70"\ +"170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261"\ +"48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA"\ +"90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F"\ +"5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961"\ +"5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402"\ +"8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2"\ +"272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93"\ +"48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90"\ +"6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452"\ +"A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650"\ +"2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83"\ +"1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7"\ +"192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295"\ +"3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9"\ +"09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685"\ +"46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9"\ +"EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C"\ +"4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED"\ +"EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB"\ +"79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31"\ +"3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87"\ +"67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94"\ +"6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85"\ +"A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6"\ +"5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29"\ +"D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B"\ +"743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6"\ +"4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD"\ +"D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7"\ +"C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E"\ +"3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B"\ +"FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5"\ +"0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1"\ +"15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0"\ +"476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67"\ +"BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845"\ +"F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC"\ +"A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7"\ +"6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA"\ +"68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C"\ +"949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423"\ +"F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433"\ +"DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317"\ +"772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2"\ +"A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17"\ +"955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4"\ +"EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E"\ +"CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9"\ +"26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD"\ +"8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF"\ +"B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C"\ +"7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD"\ +"EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293"\ +"E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7"\ +"5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F"\ +"EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6"\ +"EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07"\ +"FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247"\ +"CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73"\ +"ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC"\ +"CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F"\ +"F73EE77CFEFC2FF784F3FB25D29F330000067F4944415478DABD58094C944714"\ +"9EDD85656529085A400B495913D46A9346894DDAC4A3BA2A566CB54A8B72552C"\ +"2A022D2AD178228256299472C8214D056FA86D53A807A65A4D5AABD1A6D15A95"\ +"8A3D14C55A05916365D9DDBE61DFB06F87DD4093EA9FBCFCF3CF3FF3E69B6FDE"\ +"BCF76614168B853D89C7643289A282881245419A5A50E4F6F4BF19C522B55738"\ +"18E3BFEA96755A1494143291FFF3E124A8405C405C515CB05E8031E19B122740"\ +"77811851BAB0AD994C5249C610A220933413DD322926223DC43F695204684E84"\ +"1B883B881644837574E2666C4F09E3F5069036907690C7488E9828255C4D4458"\ +"A323C205295C4727911EC26552B8724F102F029A21B02604C627E40D32800CC0"\ +"81B6A018255254488816F5FAE07B004EC6420029B14E41087908F200DF6D488C"\ +"98A8205C8DFAB4F816C4D0AD27B0084238CE0ED4D981C4181D598A666EF8DBE9"\ +"D7AFD7A7D2E5562A955D5151917129EF27D7565656BD94959D73C068347AD136"\ +"414141B95F1EAA5A830350525C10A857C4FCC8942B57AFA648BA4D5B32338AA7"\ +"4F9BFAD7C54B977CE2172F4D34180C5ADA263838B8A0F2C0BE2C24A61D096384"\ +"14F7D7C366A53434DC5E27E34E4A5CB6FCDDD898BA13274FFAAD5ABD264FC6ED"\ +"EFEFBFEDE8E19AED8418879612307DC6CC838D8D8DE368673737B7FB39D9592B"\ +"D7AEDBB0AAB9B97904FDE7EBEBFB53EDD1C373A178CB81A5085206720C00BE10"\ +"C087D0FE1E1E1E8FCA4A4B76AE484D0D877F0112E89F01F4122836A2B5762029"\ +"165CF96E5238E99326EB773535358DEF2F6E2F2FCF1F4E9D3C1149C8363A2285"\ +"BF34A74E9F0E0156BF80157B962A51A954066E4DB44EA3D1DCDBBC296D9E5E3F"\ +"E52C9A3B7D84C96A9094217575752F2E5C149FDDDADA3A9036747575ED845554"\ +"4B643517EF284C1D3D7AD445F8BC0DD28C63C8DBA79B9433677ED4A5AC5879A0"\ +"BFB83FDCBA65C1C409E37FEB0F297C22CF64E77C1CB177DFFE02B3D9ECC29C3C"\ +"0A85C23C3FE29DA4D4952BF6C0E723661FFE7A3031AB4FE1663B0444575D5DA3"\ +"DFB8293D0E74AB9CE906D3B7AC5FB7B66CF69B6FD4C2E70D903B085EF814C66C"\ +"3E6800EA1F5C5C523AB17467D9B6BE702F8A5BB87A59C2D26FE1F31FD42B2CD0"\ +"EC2CFAF0C1862E5E92B0F9ECB973B1CE94BF3C6EDCAE92E21D1BA0D8C06C61B2"\ +"D7FC98D5F171D0FE9C149091EB37A64DE4E438D31D1636F33858E07750BC0A52"\ +"CFACDB8783EF64F6215990C20304B79021807B5E3F705721D1F7983540F46C4B"\ +"67A4F08102DF9A175E545F7F639A33E5C386E98E1DAAAAE4FBFD26593D47A4B8"\ +"21686E29C340462C8A5F3CFBFCF90B639DE90E09197B01FCCC5750BC82A4DC41"\ +"F08F9D90E285A4F803EEE47EE0CE27A4504B71480A9F84F772F07AE0B157B13E"\ +"1EFD94C95BB3B66FCB665627285B8BC80D844F190AA2CBFD242F7C5779C59CBE"\ +"7483891F4A5C96C057946F1FEA53689EC2497147FD83C117461CABAD5DDE97EE"\ +"D0D0E91F6DCDCC38C8ACDB87EB1551CDE1F6D102E0D0FC82C2DDB27352ABD54D"\ +"9D9D9DDEB48E3B31087B51B131D1479835E6CBA48895E4FD86D61E3FFE2A4482"\ +"4CD9A96AB5EEAD6D6DED1EB48E3BDFCC8CF4B553F5FAEF91141A7DC4027247DB"\ +"9D039557EC0EC9CB2F28EF2FEEE4A4C49898E8A8F3CC96033974B46ED7AED58D"\ +"8C7B2FFE6B880E8154C9A0413EBF1415166C84C8912BFF832871F3D39DA5B386"\ +"0F0FE6A6FE58224544079F9BB76E3DBF2032BAA2A5A5E539DA3F3030F04FD82A"\ +"FBE74746C6DDBFFFC02E72787A7A36ECDD53111D1810F007B32671224A0852BA"\ +"33E5CB977FF503DCD510798264DC25454519B10BE3B264DC10817E07DC61A346"\ +"BD7097D932E65EA4784C0B9DB1FFEEDDBF67D2CE3CD66F4E4F9B032B760556E3"\ +"15B0A27D5D5D5DEEB48D9F9F6FCDB1238723A0D84AAAEDCC1B74E7CBBAB55A6D"\ +"CBEEF2CF72753ADD23708EBE49C91F24C1AA6A1CE84E62F6662EF294EE6C76C2"\ +"A4D78A1F3E6C992BE3DE51989F3076CC98E6EA9A6F02D236A5E7C11CED1243C8"\ +"553E875C6509B3256F26991411253C992D25B620106EBA069CA048F37BBA32AB"\ +"1314D1815A0A27458326CEF7BD0FEAD7206966664BF34532A6C46F03EA7D8084"\ +"B4619DBC7DD4ACF7B94A9C7D449A2FCE490A664BF3E9B94AA4F9E6A771201413"\ +"D52070772C8B3CC2C46C074271B853927F1D08BA1D276164B64847F58BC3A02B"\ +"B33F65D3444F29E93632DB8150E87D2AA764015C9C64C5D5015D497A925531FB"\ +"53AEB83AA027590BEB7DD5E0E2A0AFD02F1E25C144C7168BF254AE0E2831F482"\ +"C9D9458F7C5944FFC9174D8C3DA14BA67F0133893470B75DAFB1000000004945"\ +"4E44AE426082"; + +//--------------------------------------------------------------------------- + +static const COLORREF + CLR_TXT_HOT = RGB(171, 186, 207), //d5dde8 + CLR_BKG_EXTERNAL_ROUND = RGB(107, 115, 126), + CLR_BKG_EXTERNAL_FRMAE = RGB(145, 156, 170), + CLR_BKG_INTERNAL = RGB(65, 70, 77 ), + CLR_BKG_INTERNAL_LINE_HIG = RGB(118, 126, 134), + CLR_BKG_INTERNAL_LINE_BLACK = RGB(32, 36, 41 ); + +//--------------------------------------------------------------------------- +static inline void ValidCtrCheck(TGeneralDialogPanel *) +{ + new TGeneralDialogPanel(NULL); +} +//--------------------------------------------------------------------------- + +#define PNGCLOSE_LEFT Width - m_imgClose->Width/3 - 2 +#define PNGCLOSE_TOP 3 +__fastcall TGeneralDialogPanel::TGeneralDialogPanel(TComponent* Owner) + : TPanel(Owner) +{ + Color = CLR_BKG_INTERNAL; + FOnCanceled = NULL; + m_imgClose = new TPngImage(); + + TMemoryStream *pngStream = new TMemoryStream(); + + String pngData = pngImage; + int length = pngData.Length(); + const char *temppngImage = pngImage; + + unsigned char buffer[10000]; + for(int i=0;iPosition = 0; + pngStream->WriteBuffer(buffer, length); + + pngStream->Position = 0; + m_imgClose->LoadFromStream(pngStream); + + delete pngStream; + + m_btnClose = new CBTPNButton(this); + m_btnClose->SetStateCount( 3 ); + m_btnClose->SetPngImg( m_imgClose ); + m_btnClose->SetColor( Color ); + + m_btnClose->Left = PNGCLOSE_LEFT; + m_btnClose->Top = PNGCLOSE_TOP; + m_btnClose->Hint = "ر"; + m_btnClose->ModalResult = System::Uitypes::mrCancel; + m_btnClose->Parent = this; + m_btnClose->OnClick = CloseClick; + + Canvas->Font->Size = 9; +} +//--------------------------------------------------------------------------- +__fastcall TGeneralDialogPanel::~TGeneralDialogPanel() +{ + if(m_imgClose) + delete m_imgClose; + if(m_btnClose) + delete m_btnClose; +} +//--------------------------------------------------------------------------- +namespace Generaldialogpanel +{ + void __fastcall PACKAGE Register() + { + TComponentClass classes[1] = {__classid(TGeneralDialogPanel)}; + RegisterComponents(L"Samples", classes, 0); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TGeneralDialogPanel::CloseClick(TObject *Sender) +{ + if( FOnCanceled ) + FOnCanceled( this ); +} + +//--------------------------------------------------------------------------- +void __fastcall TGeneralDialogPanel::WMEraseBkgnd(Winapi::Messages::TWMEraseBkgnd &Message) +{ + TRect rect = GetClientRect(); + TRect rectFill = rect; + + TCanvas* tempCanvas = new TCanvas; + tempCanvas->Handle = Message.DC; + + rectFill.Top = rectFill.Top + LEN_BKG_EXTERNAL_ROUND; + rectFill.Left = rectFill.Left + LEN_BKG_EXTERNAL_ROUND; + rectFill.Right = rectFill.Right - LEN_BKG_EXTERNAL_ROUND; + rectFill.Bottom = rectFill.Bottom - LEN_BKG_EXTERNAL_ROUND; + + tempCanvas->Brush->Color = CLR_BKG_INTERNAL; + + tempCanvas->FillRect( rectFill ); + + delete tempCanvas; + + Message.Result = true; +} +//--------------------------------------------------------------------------- + +void __fastcall TGeneralDialogPanel::WMSize(Winapi::Messages::TWMSize &Message) +{ + DefaultHandler( &Message ); + + m_btnClose->Left = PNGCLOSE_LEFT; + m_btnClose->Top = PNGCLOSE_TOP; +} +//--------------------------------------------------------------------------- + +void __fastcall TGeneralDialogPanel::CreateWnd() +{ + Vcl::Extctrls::TPanel::CreateWnd(); + + Canvas->Font->Assign(Font); +} +//--------------------------------------------------------------------------- + +void __fastcall TGeneralDialogPanel::Paint(void) +{ + + //==========Բ + Canvas->Pen->Color = CLR_BKG_EXTERNAL_ROUND; + int X,Y; + // + Y = 0; + + X = 0; + Canvas->Pixels[X][Y] = Canvas->Pen->Color; + X = Width - LEN_BKG_EXTERNAL_ROUND; + Canvas->Pixels[X][Y] = Canvas->Pen->Color; + + // + Y = Height - LEN_BKG_EXTERNAL_ROUND; + + X = 0; + Canvas->Pixels[X][Y] = Canvas->Pen->Color; + X = Width - LEN_BKG_EXTERNAL_ROUND; + Canvas->Pixels[X][Y] = Canvas->Pen->Color; + + //===========߿ + Canvas->Pen->Color = CLR_BKG_EXTERNAL_FRMAE; + + Canvas->MoveTo( LEN_BKG_EXTERNAL_FRMAE, 0 ); + Canvas->LineTo( Width-LEN_BKG_EXTERNAL_FRMAE, 0 ); + + Canvas->MoveTo( LEN_BKG_EXTERNAL_FRMAE, Height-LEN_BKG_EXTERNAL_FRMAE ); + Canvas->LineTo( Width-LEN_BKG_EXTERNAL_FRMAE, Height-LEN_BKG_EXTERNAL_FRMAE ); + + Canvas->MoveTo( 0, LEN_BKG_EXTERNAL_FRMAE ); + Canvas->LineTo( 0, Height-LEN_BKG_EXTERNAL_FRMAE ); + + Canvas->MoveTo( Width-LEN_BKG_EXTERNAL_FRMAE, LEN_BKG_EXTERNAL_FRMAE ); + Canvas->LineTo( Width-LEN_BKG_EXTERNAL_FRMAE, Height-LEN_BKG_EXTERNAL_FRMAE ); + + //===========ָ + int iLineHeight = LEN_BKG_INTERNAL_LINE; + + Canvas->Pen->Color = CLR_BKG_INTERNAL_LINE_HIG; + Canvas->MoveTo( LEN_BKG_EXTERNAL_FRMAE, iLineHeight ); + Canvas->LineTo( Width-LEN_BKG_EXTERNAL_FRMAE, iLineHeight ); + Canvas->MoveTo( LEN_BKG_EXTERNAL_FRMAE, iLineHeight+2 ); + Canvas->LineTo( Width-LEN_BKG_EXTERNAL_FRMAE, iLineHeight+2 ); + + Canvas->Pen->Color = CLR_BKG_INTERNAL_LINE_BLACK; + Canvas->MoveTo( LEN_BKG_EXTERNAL_FRMAE, iLineHeight+1 ); + Canvas->LineTo( Width-LEN_BKG_EXTERNAL_FRMAE, iLineHeight+1 ); + + // + + Canvas->Font->Color = CLR_TXT_HOT; + Canvas->Brush->Style = bsClear; + TSize size = Canvas->TextExtent( Caption ); + X = LEN_BKG_EXTERNAL_FRMAE + ( Width - size.Width )/2, + Y = LEN_BKG_EXTERNAL_FRMAE + ( LEN_BKG_INTERNAL_LINE-size.Height )/2; + Canvas->TextOut( X, Y, Caption ); +} +//--------------------------------------------------------------------------- +void __fastcall TGeneralDialogPanel::MouseDown(System::Uitypes::TMouseButton Button, System::Classes::TShiftState Shift, int X, int Y) +{ + + if (X > Left + 10 && X < Left + Width - 50 && Y < Top + LEN_BKG_INTERNAL_LINE){ + ReleaseCapture(); + Parent->Perform(WM_NCLBUTTONDOWN,HTCAPTION, 0); + }else{ + Vcl::Extctrls::TPanel::MouseDown(Button, Shift, X, Y); + } +} +//--------------------------------------------------------------------------- diff --git a/Component/GenelralDialogPanel/GeneralDialogPanel.h b/Component/GenelralDialogPanel/GeneralDialogPanel.h new file mode 100644 index 0000000..7abd787 --- /dev/null +++ b/Component/GenelralDialogPanel/GeneralDialogPanel.h @@ -0,0 +1,54 @@ +//--------------------------------------------------------------------------- +///////////////////////////////// +////////װ ǵɱĹ̺ʹùмͼƬ Res\System\close.png -->L"PngImage_Close" +///////////////////////////////// + +#ifndef GeneralDialogPanelH +#define GeneralDialogPanelH +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include +#include +#include +//--------------------------------------------------------------------------- +class CBTPNButton; +#define LEN_BKG_EXTERNAL_ROUND 1 +#define LEN_BKG_EXTERNAL_FRMAE 1 +#define LEN_BKG_INTERNAL_LINE 23 +//--------------------------------------------------------------------------- +class PACKAGE TGeneralDialogPanel : public TPanel +{ +private: + TNotifyEvent FOnCanceled; // رմ¼ + + TPngImage *m_imgClose; + CBTPNButton *m_btnClose; + + void __fastcall CloseClick(TObject *Sender); + + MESSAGE void __fastcall WMEraseBkgnd(Winapi::Messages::TWMEraseBkgnd &Message); + MESSAGE void __fastcall WMSize(Winapi::Messages::TWMSize &Message); + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(WM_ERASEBKGND, TWMEraseBkgnd, WMEraseBkgnd) + MESSAGE_HANDLER(WM_SIZE, TWMSize, WMSize) + END_MESSAGE_MAP(Vcl::Extctrls::TPanel) + +protected: + + virtual void __fastcall Paint(void); + virtual void __fastcall CreateWnd(); + DYNAMIC void __fastcall MouseDown(System::Uitypes::TMouseButton Button, + System::Classes::TShiftState Shift, int X, int Y); +public: + __fastcall TGeneralDialogPanel(TComponent* Owner); + __fastcall ~TGeneralDialogPanel(); + +__published: + __property TNotifyEvent OnCanceled = {write = FOnCanceled, read = FOnCanceled}; +}; +//--------------------------------------------------------------------------- +#endif + diff --git a/Component/GenelralDialogPanel/PNGButton.cpp b/Component/GenelralDialogPanel/PNGButton.cpp new file mode 100644 index 0000000..184260b --- /dev/null +++ b/Component/GenelralDialogPanel/PNGButton.cpp @@ -0,0 +1,205 @@ +//--------------------------------------------------------------------------- + +#include + +#pragma hdrstop + +#include "PNGButton.h" +//#pragma package(smart_init) +//--------------------------------------------------------------------------- +// ValidCtrCheck is used to assure that the components created do not have +// any pure virtual functions. +// + +//static inline void ValidCtrCheck(TPNGButton *) +//{ +// new TPNGButton(NULL); +//} +////--------------------------------------------------------------------------- + +__fastcall CBTPNButton::CBTPNButton(TComponent* Owner) + : TGraphicControl(Owner) +{ + Height = 25; //a default Height + Width = 75; //a default Width + FStateCount = 4; //default state count + FPngImg = new Vcl::Imaging::Pngimage::TPngImage(); //we create our png + FDown = false; +} + +//--------------------------------------------------------------------------- +__fastcall CBTPNButton::~CBTPNButton(void) +{ + if(FPngImg) + delete FPngImg; //destroy our png +} + +//--------------------------------------------------------------------------- + +void __fastcall CBTPNButton::SetStateCount( int count ) +{ + if( count>4 ) count = 4; + if( count<2 ) count = 2; + + FStateCount = count; +} + +//--------------------------------------------------------------------------- +void __fastcall CBTPNButton::SetPngImg(Vcl::Imaging::Pngimage::TPngImage *value) +{ + FPngImg->Assign(value); + + //Now setting the component width and height by the png image used + Height = FPngImg->Height; + Width = FPngImg->Width / FStateCount; + + Constraints->MaxHeight = Height; + Constraints->MinHeight = Height; + Constraints->MaxWidth = Width; + Constraints->MinWidth = Width; + + EtatBtn = 0; //reset the component state to normal +} + +//--------------------------------------------------------------------------- +void __fastcall CBTPNButton::SetDown(bool value) +{ + if( FStateCount<3 ) + value = false; + + FDown = value; + if( FDown==False ) + EtatBtn = 0; //is the mouse down is false then we reset the component state to normal + + Paint(); +// Refresh(); //we repaint the componet) +} + +//--------------------------------------------------------------------------- +void __fastcall CBTPNButton::SetColor( TColor value ) +{ + FBkColor = value; +} + +//--------------------------------------------------------------------------- +void __fastcall CBTPNButton::Paint(void) +{ + TRect rect = GetClientRect(); + Canvas->Brush->Color = FBkColor; + Canvas->FillRect( rect ); + + if( FPngImg ){ + switch( EtatBtn ){ + case 0: + FPngImg->Draw( Canvas, Rect(0, 0, FStateCount*Width, Height) ); // Normal + break; + case 1: + FPngImg->Draw( Canvas, Rect(-Width, 0, (FStateCount-1)*Width, Height) ); // Mouse Entered + break; + case 2: + FPngImg->Draw( Canvas, Rect(-(Width*2), 0, (FStateCount-2)*Width, Height) ); // Pressed + break; + case 3: + FPngImg->Draw( Canvas, Rect(-(Width*3), 0, (FStateCount-3)*Width, Height) ); // Disabled + break; + } + } +} + +//--------------------------------------------------------------------------- +void __fastcall CBTPNButton::SetEnabled(bool Value) +{ + if(FStateCount<4) //can't be disable + Value = true; + + TGraphicControl::SetEnabled(Value); + + if( Enabled ) + EtatBtn = 0; + else + EtatBtn = 3; + + Paint(); +} +//--------------------------------------------------------------------------- +void __fastcall CBTPNButton::MouseDown(System::Uitypes::TMouseButton Button, + System::Classes::TShiftState Shift, int X, int Y) +{ + TGraphicControl::MouseDown( Button, Shift, X, Y ); + + if( Button==mbLeft && Enabled && FStateCount>2){ + EtatBtn = 2; // Pressed + Paint(); +// Refresh(); + } +} + +//--------------------------------------------------------------------------- +void __fastcall CBTPNButton::MouseUp(System::Uitypes::TMouseButton Button, + System::Classes::TShiftState Shift, int X, int Y) +{ + TGraphicControl::MouseUp( Button, Shift, X, Y ); + + if( Button==mbLeft && Enabled ){ + if( X>=0 && X=0 && YModalResult = FModalResult; + parentForm->Close(); + } + + TGraphicControl::Click(); +} + +//--------------------------------------------------------------------------- + +//namespace Pngbutton +//{ +// void __fastcall PACKAGE Register() +// { +// TComponentClass classes[1] = {__classid(TPNGButton)}; +// RegisterComponents(L"Samples", classes, 0); +// } +//} +////--------------------------------------------------------------------------- diff --git a/Component/GenelralDialogPanel/PNGButton.h b/Component/GenelralDialogPanel/PNGButton.h new file mode 100644 index 0000000..673dc71 --- /dev/null +++ b/Component/GenelralDialogPanel/PNGButton.h @@ -0,0 +1,108 @@ +//--------------------------------------------------------------------------- +///////////////////////////////// +////////װ Բðװֱԭ .pasļװ +///////////////////////////////// + +///////////////////////////////// +/////////ʹ +//--µİʹ +//.cpp #pragma package(smart_init) ȥ +//°.cpp #include "PNGButton.cpp" +///////////////////////////////// + +#ifndef PNGButtonH +#define PNGButtonH +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include + +//--------------------------------------------------------------------------- +//class PACKAGE TPNGButton : public TGraphicControl + +class CBTPNButton : public TGraphicControl +{ +public: + enum TModalResult{ + mrNone = System::Int8(0x0), + mrOk = System::Int8(0x1), + mrCancel = System::Int8(0x2), + mrAbort = System::Int8(0x3), + mrRetry = System::Int8(0x4), + mrIgnore = System::Int8(0x5), + mrYes = System::Int8(0x6), + mrNo = System::Int8(0x7), + mrClose = System::Int8(0x8), + mrHelp = System::Int8(0x9), + mrTryAgain = System::Int8(0xa), + mrContinue = System::Int8(0xb), + mrAll = System::Int8(0xc), + mrNoToAll = System::Int8(0xd), + mrYesToAll = System::Int8(0xe) + }; +private: + TNotifyEvent FOnMouseEnter;//on mouse enter notify event + TNotifyEvent FOnMouseLeave;//on mouse leave notify event +// System::Uitypes::TModalResult FModalResult; + TModalResult FModalResult; + + MESSAGE void __fastcall CMMouseEnter(Winapi::Messages::TMessage &Msg); // to know when mouse is entered + MESSAGE void __fastcall CMMouseLeave(Winapi::Messages::TMessage &Msg); // to know when mouse is leaved + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(CM_MOUSEENTER, TMessage, CMMouseEnter) + MESSAGE_HANDLER(CM_MOUSELEAVE, TMessage, CMMouseLeave) + END_MESSAGE_MAP(TGraphicControl) + +protected: + + int EtatBtn; // 0=Normal 1=Mouse entered 2=Pressed 3=Disabled + int FStateCount; + Vcl::Imaging::Pngimage::TPngImage *FPngImg; //our 4 states image + bool FDown; // value to know if we painting mouse down + TColor FBkColor; + + DYNAMIC void __fastcall MouseDown(System::Uitypes::TMouseButton Button, System::Classes::TShiftState Shift, int X, int Y); + DYNAMIC void __fastcall MouseUp(System::Uitypes::TMouseButton Button, System::Classes::TShiftState Shift, int X, int Y); + virtual void __fastcall SetEnabled(bool Value); + +public: + + __fastcall virtual CBTPNButton(System::Classes::TComponent* AOwner); + __fastcall virtual ~CBTPNButton(void); + + void __fastcall SetStateCount( int count ); + void __fastcall SetPngImg(Vcl::Imaging::Pngimage::TPngImage *value); // we set the png image + void __fastcall SetDown(bool value); // to know if mouse is down or not + void __fastcall SetColor( TColor value ); + + virtual void __fastcall Paint(void); // override the painting of the component + DYNAMIC void __fastcall Click(void); + + +__published: + + __property Action; + __property Anchors = {default=3}; + __property bool Down = {read=FDown, write=SetDown, default=False}; + __property Enabled = {default=1}; + __property int ImgStates = {read=FStateCount, write=SetStateCount, default=4}; +// __property System::Uitypes::TModalResult ModalResult = {read=FModalResult, write=FModalResult, default=0}; + __property TModalResult ModalResult = {read=FModalResult, write=FModalResult, default=0}; + __property ParentShowHint = {default=1}; + __property Vcl::Imaging::Pngimage::TPngImage *PngImg = {read=FPngImg, write=SetPngImg}; + __property PopupMenu; + __property ShowHint; + __property Visible = {default=1}; + __property OnClick; + __property OnContextPopup; + __property OnMouseDown; + __property OnMouseMove; + __property OnMouseUp; + __property System::Classes::TNotifyEvent OnMouseEnter = {read=FOnMouseEnter, write=FOnMouseEnter}; + __property System::Classes::TNotifyEvent OnMouseLeave = {read=FOnMouseLeave, write=FOnMouseLeave}; +}; +//--------------------------------------------------------------------------- +#endif diff --git a/Component/GenelralDialogPanel/TGeneralDialogPanel.cpp b/Component/GenelralDialogPanel/TGeneralDialogPanel.cpp new file mode 100644 index 0000000..c2815fb --- /dev/null +++ b/Component/GenelralDialogPanel/TGeneralDialogPanel.cpp @@ -0,0 +1,17 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop +#pragma package(smart_init) +//--------------------------------------------------------------------------- + +// Package source. +//--------------------------------------------------------------------------- + + +#pragma argsused +extern "C" int _libmain(unsigned long reason) +{ + return 1; +} +//--------------------------------------------------------------------------- diff --git a/Component/LineEdit/LineEdit.cpp b/Component/LineEdit/LineEdit.cpp new file mode 100644 index 0000000..2be5e25 --- /dev/null +++ b/Component/LineEdit/LineEdit.cpp @@ -0,0 +1,784 @@ +//--------------------------------------------------------------------------- + +#include + +#pragma hdrstop + +#include "LineEdit.h" +#pragma package(smart_init) +//--------------------------------------------------------------------------- +// ValidCtrCheck is used to assure that the components created do not have +// any pure virtual functions. +// + +static inline void ValidCtrCheck(TLineEdit *) +{ + new TLineEdit(NULL); +} +//--------------------------------------------------------------------------- +__fastcall TLineEdit::TLineEdit(TComponent* Owner) + : TWinControl(Owner) +{ + m_Canvas = new TControlCanvas(); + m_Canvas->Control = this; + + m_HintLabel = new TLabel(this); + m_HintLabel->Font->Color = TColor(0x594D43); + m_HintLabel->OnMouseDown = DoHintLabelMouseDown; + + Height = 24; + Width = 124; + FBorderColor = TColor(0x5F5954); + FShadowColor = TColor(0x4C463F); + Color = TColor(0xC4B4A8); + FHintColor = TColor(0x594D43); + FMaxLength = 500; + FOnChange = NULL; + TabStop = true; + + FNumberMax = -1; + FNumberMin = -1; + + m_IsCreated = false; +} +//--------------------------------------------------------------------------- +namespace Lineedit +{ + void __fastcall PACKAGE Register() + { + TComponentClass classes[1] = {__classid(TLineEdit)}; + RegisterComponents(L"Samples", classes, 0); + } +} +//--------------------------------------------------------------------------- + +__fastcall TLineEdit::~TLineEdit() +{ + if(m_Canvas) + { + delete m_Canvas; + m_Canvas = NULL; + } + + if(m_HintLabel) + { + delete m_HintLabel; + m_HintLabel = NULL; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TLineEdit::SetTextFont(String name, int size) +{ + Font->Name = name; + Font->Size = size; + + m_HintLabel->Font->Name = Font->Name; + m_HintLabel->Font->Size = Font->Size; +} +//--------------------------------------------------------------------------- + +void __fastcall TLineEdit::AdjustThisSize() +{ + // ôԲǴ + HRGN var_Hrgn; + var_Hrgn = CreateRoundRectRgn(0, 0, Width + 1, Height + 1, 3, 3); + SetWindowRgn(Handle, var_Hrgn, true); + DeleteObject(var_Hrgn); + + // ȡ߶ + m_FontHeight = CalcFontHeight(); + + int var_EditTop = (Height - m_FontHeight) / 2; + + // ༭λ + m_TextRect = GetClientRect(); + m_TextRect.Left += 4; + m_TextRect.Right -= 4; + m_TextRect.Top = var_EditTop; + + // HintTextλ + m_HintLabel->Top = m_TextRect.Top; + m_HintLabel->Left = m_TextRect.Left; + m_HintLabel->Width = m_TextRect.Width(); + + // ñ༭ұ߾ + SendMessage(Handle, EM_SETMARGINS, EC_LEFTMARGIN | EC_RIGHTMARGIN, 0); + + // ñ༭(б༭Ч) + SendMessage(Handle, EM_SETRECT, 0, (LPARAM)(&m_TextRect)); +} + +int __fastcall TLineEdit::CalcColorValue(TColor Bg, TColor Fr, int Level, int Alpha) +{ + return ((Bg * (Level - Alpha) + Fr * Alpha) / Level); +} + +int __fastcall TLineEdit::CalcFontHeight() +{ + // ߶ + TTextMetric var_Metric; + HDC var_DC = GetDC(0); + + SelectObject(var_DC, Font->Handle); + GetTextMetricsW(var_DC, &var_Metric); + + ReleaseDC(0, var_DC); + + return var_Metric.tmHeight; +} + +void __fastcall TLineEdit::CreateShadowColor() +{ + int var_R, var_G, var_B, var_Alpha; + int Level = (int)(atan(3.14 / 2) * 500); + + // Ӱɫ + for(int var_Index = 0; var_Index < 4; var_Index++) + { + var_Alpha = (int)(atan(3.14 / (2 * 3) * var_Index) * 500); + + var_R = CalcColorValue(GetRValue(FShadowColor), GetRValue(Color), Level, var_Alpha); + var_G = CalcColorValue(GetGValue(FShadowColor), GetGValue(Color), Level, var_Alpha); + var_B = CalcColorValue(GetBValue(FShadowColor), GetBValue(Color), Level, var_Alpha); + + m_ShadowColorArray[var_Index] = RGB(var_R, var_G, var_B); + } + + m_ShadowColorArray[4] = Color; +} + +void __fastcall TLineEdit::CreateParams(TCreateParams &Params) +{ + TWinControl::CreateParams(Params); + CreateSubClass(Params, L"EDIT"); + + DWORD var_Alignments[] = {ES_LEFT, ES_RIGHT, ES_CENTER}; + DWORD var_CharCase[] = {0, ES_UPPERCASE, ES_LOWERCASE}; + DWORD var_HideSelection[] = {ES_NOHIDESEL, 0}; + DWORD var_NumbersOnly[] = {0, ES_NUMBER}; + DWORD var_OEMConvert[] = {0, ES_OEMCONVERT}; + DWORD var_PasswordChar[] = {0, ES_PASSWORD}; + DWORD var_ReadOnly[] = {0, ES_READONLY}; + + Params.Style |= var_Alignments[FAlignment]; + Params.Style |= var_CharCase[FCharCase]; + Params.Style |= var_HideSelection[FHideSelection]; + Params.Style |= var_NumbersOnly[FNumbersOnly]; + Params.Style |= var_OEMConvert[FOEMConvert]; + Params.Style |= var_PasswordChar[FPasswordChar != 0]; + Params.Style |= var_ReadOnly[FReadOnly]; + + Params.Style |= ES_AUTOHSCROLL; + Params.Style |= ES_MULTILINE; + + //Params.Style |= WS_TABSTOP; + + //Params.ExStyle |= WS_EX_CONTROLPARENT; +} + +void __fastcall TLineEdit::CreateWindowHandle(const TCreateParams &Params) +{ + TWinControl::CreateWindowHandle(Params); +} + +void __fastcall TLineEdit::CreateWnd() +{ + TWinControl::CreateWnd(); + m_HintLabel->Parent = this; + + if(FPasswordChar != 0) + { + if(FPasswordChar == '*') + { + SendMessageW(Handle, EM_SETPASSWORDCHAR, L'', 0); + } + else + { + SendMessageW(Handle, EM_SETPASSWORDCHAR, FPasswordChar, 0); + } + } + + if(FReadOnly) + { + SendMessage(WindowHandle, EM_SETREADONLY, 1, 0); + } + + if(!m_IsCreated) + { + SetText(FText); + m_IsCreated = true; + } + + SetMaxLength(FMaxLength); + + AdjustThisSize(); +} + +void __fastcall TLineEdit::CMColorChanged(TMessage &Message) +{ + CreateShadowColor(); + Invalidate(); +} + +void __fastcall TLineEdit::CMFontChanged(TWMFontChange &Message) +{ + TColor var_FontColor = Font->Color; + + if(var_FontColor != m_FontColor) { + m_FontColor = var_FontColor; // ɫ + Invalidate(); + } + else { + m_HintLabel->Font->Name = Font->Name; + m_HintLabel->Font->Size = Font->Size; + + RecreateWnd(); + } +} + +void __fastcall TLineEdit::SetBorderColor(TColor Color) +{ + if(FBorderColor != Color) + { + FBorderColor = Color; + SendMessage(Handle, CM_COLORCHANGED, 0, 0); + } +} + +void __fastcall TLineEdit::SetCursorPos(int Pos) +{ + //SendMessage(Handle, EM_SETSEL, Pos, Pos); + + SendMessage(Handle, EM_SCROLL, SB_PAGEUP, 0); +} + +void __fastcall TLineEdit::SetFocus() +{ + m_HintLabel->Visible = false; + TWinControl::SetFocus(); +} + +void __fastcall TLineEdit::SetOnChange(TNotifyEvent OnChange) +{ + FOnChange = OnChange; +} + +void __fastcall TLineEdit::SetShadowColor(TColor Color) +{ + if(FShadowColor != Color) + { + FShadowColor = Color; + SendMessage(Handle, CM_COLORCHANGED, 0, 0); + } +} + +void __fastcall TLineEdit::ShowHintText() +{ + if(Text.IsEmpty() && !Focused()) + m_HintLabel->Visible = true; + else + m_HintLabel->Visible = false; + //if(Text.Length() == 0) m_HintLabel->Visible = true; + //else m_HintLabel->Visible = false; +} + +void __fastcall TLineEdit::WMChar(TWMChar &Message) +{ + if(Message.CharCode < 32) + { + switch(Message.CharCode) + { + case 1: // Ctrl + A + case 3: // ˫ + SelectAll(); + break; + + default: + TWinControl::Dispatch(&Message); + } + } + else if(Message.CharCode == 32) + { + if(!FNumbersOnly) + TWinControl::Dispatch(&Message); + } + else + { + // Ƴ + String text = GetText(); + int selStart = GetSelStart(); + int selLen = GetSelLength(); + text.Delete(selStart + 1, selLen); + + if(text.Length() < FMaxLength) + { + if(FNumbersOnly) + { + if(Message.CharCode >= 0x30 && Message.CharCode <= 0x39) + { + if(FNumberMax != -1) { + wchar_t c = Message.CharCode; + + if(!text.IsEmpty()) { + if(selStart == 0 && Message.CharCode == '0') + return; + + if(StrToInt(text) == 0 && Message.CharCode == '0') + return; + } + + text.Insert(String(c), selStart); + int num = StrToInt(text); + if(num <= FNumberMax) { + TWinControl::Dispatch(&Message); + } + } + else + TWinControl::Dispatch(&Message); + } + } + else + { + TWinControl::Dispatch(&Message); + } + } + else + { + //MessageBeep(MB_OK); + } + } +} + +void __fastcall TLineEdit::WMCommand(TWMCommand &Message) +{ + if(Message.NotifyCode == EN_CHANGE) + { + //ShowHintText(); + Invalidate(); + if(FOnChange) FOnChange(this); + } +} + +void __fastcall TLineEdit::WMCtlColorEdit(TWMCtlColorEdit &Message) +{ + if(GetTextColor(Message.ChildDC) != ColorToRGB(Font->Color)) + SetTextColor(Message.ChildDC, ColorToRGB(Font->Color)); // ñ༭ɫ + + //if(GetBkColor(Message.ChildDC) != ColorToRGB(Color)) + //{ + // SetBkColor(Message.ChildDC, ColorToRGB(Color)); // ñ༭ɫ + //} + + if(GetBkMode(Message.ChildDC) != TRANSPARENT) + SetBkMode(Message.ChildDC, TRANSPARENT); + + //ExcludeUpdateRgn(Message.ChildDC, Message.ChildWnd); */ +} + +void __fastcall TLineEdit::WMCtlColorStatic(TWMCtlColorStatic &Message) +{ + SetTextColor(Message.ChildDC, ColorToRGB(Font->Color)); // ñ༭ɫ + + if(GetBkMode(Message.ChildDC) != TRANSPARENT) + SetBkMode(Message.ChildDC, TRANSPARENT); + + //SetBkColor(Message.ChildDC, ColorToRGB(Color)); // ñ༭ɫ +} + +void __fastcall TLineEdit::WMEraseBkgnd(TWMEraseBkgnd &Message) +{ + m_Canvas->Lock(); + m_Canvas->Handle = Message.DC; + + TRect var_Rect = GetClientRect(); + + // Ʊ + m_Canvas->Brush->Color = Color; + m_Canvas->FillRect(var_Rect); + + // Ʊ߿ + m_Canvas->Brush->Color = FBorderColor; + m_Canvas->FrameRect(var_Rect); + + var_Rect.Top++; + var_Rect.Left++; + var_Rect.Right--; + var_Rect.Bottom--; + + // Ӱ + m_Canvas->Brush->Color = TColor(m_ShadowColorArray[0]); + //m_Canvas->Brush->Color = FShadowColor; + m_Canvas->FrameRect(var_Rect); + + for(int var_Layer = 1; var_Layer < 4; var_Layer++) + { + // ûɫ + m_Canvas->Pen->Color = TColor(m_ShadowColorArray[var_Layer]); + + m_Canvas->MoveTo(var_Rect.Left + var_Layer, var_Rect.Bottom - 2); + m_Canvas->LineTo(var_Rect.Left + var_Layer, var_Rect.Top + var_Layer); + + m_Canvas->MoveTo(var_Rect.Left + var_Layer, var_Rect.Top + var_Layer); + m_Canvas->LineTo(var_Rect.Right - 1, var_Rect.Top + var_Layer); + } + + m_Canvas->UpdateTextFlags(); + m_Canvas->Unlock(); +} + +void __fastcall TLineEdit::WMKeyDown(TWMKeyDown &Message) +{ + if(Message.CharCode == VK_RETURN && !FReadOnly && Enabled) + { + MessageBeep(MB_OK); + } + + TWinControl::Dispatch(&Message); +} + +void __fastcall TLineEdit::WMKillFocus(TWMKillFocus &Message) +{ + ShowHintText(); + + TWinControl::Dispatch(&Message); + + if(Text.Length() < FMaxLength && !Text.IsEmpty()) + { + if(FNumbersOnly && FNumberMin != -1) + { + int Value = StrToInt(Text); + if(Value < FNumberMin) { + Text = IntToStr(FNumberMin); + } + } + } + + Invalidate(); +} + +void __fastcall TLineEdit::WMPaint(TWMPaint &Message) +{ + PaintHandler(Message); +} + +void __fastcall TLineEdit::WMSetFocus(TWMSetFocus &Message) +{ + //ShowHintText(); + m_HintLabel->Visible = false; + TWinControl::Dispatch(&Message); +} + +void __fastcall TLineEdit::WMSize(TWMSize &Message) +{ + // ȡǰ߶ + m_FontHeight = CalcFontHeight(); + + // ༭С߶ + int var_MinHeight = m_FontHeight + 4; + int var_MinWidth = 20; + + // ߵĺϷ + if(Height < var_MinHeight) + { + Height = var_MinHeight; + return; + } + + if(Width < var_MinWidth) + { + Width = var_MinWidth; + return; + } + + AdjustThisSize(); +} + +/******************************************************************************/ +// ༭ +/******************************************************************************/ +void __fastcall TLineEdit::DoHintLabelMouseDown(TObject *Sender, + TMouseButton Button, + TShiftState Shift, int X, int Y) +{ + SetFocus(); +} + +void __fastcall TLineEdit::Clear() +{ + FText = ""; + SetText(FText); +} + +void __fastcall TLineEdit::ClearSelection() +{ + SendMessage(Handle, WM_CLEAR, 0, 0); +} + +void __fastcall TLineEdit::CopyToClipboard() +{ + SendMessage(Handle, WM_COPY, 0, 0); +} + +void __fastcall TLineEdit::CutToClipboard() +{ + SendMessage(Handle, WM_CUT, 0, 0); +} + +void __fastcall TLineEdit::PasteFromClipboard() +{ + SendMessage(Handle, WM_PASTE, 0, 0); +} + +void __fastcall TLineEdit::Undo() +{ + SendMessage(Handle, WM_UNDO, 0, 0); +} + +void __fastcall TLineEdit::ClearUndo() +{ + SendMessage(Handle, EM_EMPTYUNDOBUFFER, 0, 0); +} + +void __fastcall TLineEdit::SelectAll() +{ + SendMessage(Handle, EM_SETSEL, 0, -1); +} + +String __fastcall TLineEdit::GetText() +{ + if(HandleAllocated()) + { + SendMessageW(Handle, WM_GETTEXT, 1024, (LPARAM)m_TextBuf); + } + else + { + wcscpy( m_TextBuf, FText.c_str() ); + } + + return String(m_TextBuf); +} + +bool __fastcall TLineEdit::GetCanUndo() +{ + if(HandleAllocated()) + { + return (SendMessage(Handle, EM_CANUNDO, 0, 0) != 0); + } + else + { + return false; + } +} + +int __fastcall TLineEdit::GetSelLength() +{ + TSelection Selection; + SendMessage(Handle, EM_GETSEL, (WPARAM)&Selection.StartPos, (LPARAM)&Selection.EndPos); + + return Selection.EndPos - Selection.StartPos; +} + +int __fastcall TLineEdit::GetSelStart() +{ + int var_Result; + SendMessage(Handle, EM_GETSEL, (WPARAM)&var_Result, 0); + + return var_Result; +} + +String __fastcall TLineEdit::GetSelText() +{ + int var_Start, var_Length; + + var_Start = GetSelStart(); + var_Length = GetSelLength(); + + return Text.SubString(var_Start + 1, var_Length); +} + +void __fastcall TLineEdit::SetMaxLength(int Value) +{ + if(Value > 500 || Value <= 0) + { + Value = 500; + } + + if(FMaxLength != Value) + { + FMaxLength = Value; + } +} + +void __fastcall TLineEdit::SetSelLength(int Value) +{ + TSelection Selection; + SendMessage(Handle, EM_GETSEL, (WPARAM)&Selection.StartPos, (LPARAM)&Selection.EndPos); + + Selection.EndPos = Selection.StartPos + Value; + SendMessage(Handle, EM_SETSEL, Selection.StartPos, Selection.EndPos); + SendMessage(Handle, EM_SCROLLCARET, 0, 0); +} + +void __fastcall TLineEdit::SetSelStart(int Value) +{ + SendMessage(Handle, EM_SETSEL, Value, Value); +} + +void __fastcall TLineEdit::SetAlignment(TAlignment Value) +{ + if(FAlignment != Value) + { + FAlignment = Value; + m_HintLabel->Alignment = Value; + + if(HandleAllocated()) + { + RecreateWnd(); + } + } +} + +void __fastcall TLineEdit::SetCharCase(TEditCharCase Value) +{ + if(FCharCase != Value) + { + FCharCase = Value; + + if(HandleAllocated()) + { + RecreateWnd(); + } + } +} + +void __fastcall TLineEdit::SetHideSelection(bool Value) +{ + if(FHideSelection != Value) + { + FHideSelection = Value; + + if(HandleAllocated()) + { + RecreateWnd(); + } + } +} + +void __fastcall TLineEdit::SetHintText(String Value) +{ + if(FHintText != Value) + { + FHintText = Value; + m_HintLabel->Caption = Value; + } +} + +void __fastcall TLineEdit::SetHintColor(TColor Value) +{ + if(FHintColor != Value) + { + FHintColor = Value; + m_HintLabel->Font->Color = Value; + } +} + +void __fastcall TLineEdit::SetNumbersOnly(bool Value) +{ + if(FNumbersOnly != Value) + { + FNumbersOnly = Value; + + if(HandleAllocated()) + { + RecreateWnd(); + } + } +} + +void __fastcall TLineEdit::SetOEMConvert(bool Value) +{ + if(FOEMConvert != Value) + { + FOEMConvert = Value; + + if(HandleAllocated()) + { + RecreateWnd(); + } + } +} + +void __fastcall TLineEdit::SetPasswordChar(WideChar Value) +{ + if(FPasswordChar != Value) + { + FPasswordChar = Value; + + if(HandleAllocated()) + { + RecreateWnd(); + } + } +} + +void __fastcall TLineEdit::SetReadOnly(bool Value) +{ + if(FReadOnly != Value) + { + FReadOnly = Value; + + if(HandleAllocated()) + { + RecreateWnd(); + } + } +} + +void __fastcall TLineEdit::SetText(String Value) +{ + FText = Value; + + if(HandleAllocated()) + { + //SetWindowText(Handle, Value.c_str()); + + //SetWindowText(Handle, FText.c_str()); + if(Value.IsEmpty()) + { + m_HintLabel->SetDesignVisible(true); + m_HintLabel->Visible = true; + } + else + { + m_HintLabel->SetDesignVisible(false); + m_HintLabel->Visible = false; + } + + SendMessageW(Handle, WM_SETTEXT, 0, (LPARAM)Value.c_str()); + + if(FOnChange) FOnChange(this); + } +} + +void __fastcall TLineEdit::SetNumberMax(int Value) +{ + if(FNumberMax != Value) { + + FNumberMax = Value; + } +} + +void __fastcall TLineEdit::SetNumberMin(int Value) +{ + if(FNumberMin != Value) { + + if(Value > FNumberMax) { + Value = FNumberMax; + } + + FNumberMin = Value; + } +} + +/******************************************************************************/ diff --git a/Component/LineEdit/LineEdit.h b/Component/LineEdit/LineEdit.h new file mode 100644 index 0000000..6aa18f7 --- /dev/null +++ b/Component/LineEdit/LineEdit.h @@ -0,0 +1,186 @@ +//--------------------------------------------------------------------------- + +#ifndef LineEditH +#define LineEditH +//--------------------------------------------------------------------------- +#include +//--------------------------------------------------------------------------- +class PACKAGE TLineEdit : public TWinControl +{ +private: + TEditCharCase FCharCase; + TColor FBorderColor, // ߿ɫ + FShadowColor; // Ӱɫ + TAlignment FAlignment; + WideChar FPasswordChar; + String FText; + String FHintText; + TColor FHintColor; + bool FHideSelection, + FNumbersOnly, + FOEMConvert, + FReadOnly; + int FMaxLength, + FNumberMax, + FNumberMin; + TNotifyEvent FOnChange; + + TControlCanvas *m_Canvas; + int m_ShadowColorArray[4]; // Ӱɫ + int m_FontHeight; // ߶ + bool m_IsCreated; + TLabel *m_HintLabel; + TColor m_FontColor; // ɫ + TRect m_TextRect; + WCHAR m_TextBuf[512]; + + void __fastcall AdjustThisSize(); + + int __fastcall CalcColorValue(TColor BgColor, TColor FrColor, int Level, int Alpha); + int __fastcall CalcFontHeight(); + void __fastcall CreateShadowColor(); // Ӱɫ + + void __fastcall SetBorderColor(TColor Color); + void __fastcall SetOnChange(TNotifyEvent OnChange); + void __fastcall SetShadowColor(TColor Color); + + void __fastcall ShowHintText(); + +/******************************************************************************/ +// ༭ +/******************************************************************************/ + void __fastcall DoHintLabelMouseDown(TObject *Sender, + TMouseButton Button, + TShiftState Shift, int X, int Y); + + UnicodeString __fastcall GetText(); + + bool __fastcall GetCanUndo(); + int __fastcall GetSelLength(); + int __fastcall GetSelStart(); + String __fastcall GetSelText(); + + void __fastcall SetAlignment(TAlignment Value); + void __fastcall SetCharCase(TEditCharCase Value); + void __fastcall SetHideSelection(bool Value); + void __fastcall SetHintText(String Value); + void __fastcall SetHintColor(TColor Value); + void __fastcall SetNumbersOnly(bool Value); + void __fastcall SetOEMConvert(bool Value); + void __fastcall SetPasswordChar(WideChar Value); + void __fastcall SetReadOnly(bool Value); + void __fastcall SetText(UnicodeString Value); + + void __fastcall SetMaxLength(int Value); + void __fastcall SetSelLength(int Value); + void __fastcall SetSelStart(int Value); + + void __fastcall SetNumberMax(int Value); + void __fastcall SetNumberMin(int Value); +/******************************************************************************/ + + MESSAGE void __fastcall CMColorChanged(TMessage &Message); + MESSAGE void __fastcall CMFontChanged(TWMFontChange &Message); + MESSAGE void __fastcall WMChar(TWMChar &Message); + MESSAGE void __fastcall WMCommand(TWMCommand &Message); + MESSAGE void __fastcall WMCtlColorEdit(TWMCtlColorEdit &Message); + MESSAGE void __fastcall WMCtlColorStatic(TWMCtlColorStatic &Message); + MESSAGE void __fastcall WMEraseBkgnd(TWMEraseBkgnd &Message); + MESSAGE void __fastcall WMKeyDown(TWMKeyDown &Message); + MESSAGE void __fastcall WMKillFocus(TWMKillFocus &Message); + MESSAGE void __fastcall WMPaint(TWMPaint &Message); + MESSAGE void __fastcall WMSetFocus(TWMSetFocus &Message); + MESSAGE void __fastcall WMSize(TWMSize &Message); + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(CM_COLORCHANGED, TMessage, CMColorChanged) + MESSAGE_HANDLER(CM_FONTCHANGED, TWMFontChange, CMFontChanged) + MESSAGE_HANDLER(CN_COMMAND, TWMCommand, WMCommand) + MESSAGE_HANDLER(CN_CTLCOLOREDIT, TWMCtlColorEdit, WMCtlColorEdit) + MESSAGE_HANDLER(CN_CTLCOLORSTATIC, TWMCtlColorStatic, WMCtlColorStatic) + MESSAGE_HANDLER(WM_CHAR, TWMChar, WMChar) + MESSAGE_HANDLER(WM_ERASEBKGND, TWMEraseBkgnd, WMEraseBkgnd) + MESSAGE_HANDLER(WM_KEYDOWN, TWMKeyDown, WMKeyDown) + MESSAGE_HANDLER(WM_KILLFOCUS, TWMKillFocus, WMKillFocus) + MESSAGE_HANDLER(WM_PAINT, TWMPaint, WMPaint) + MESSAGE_HANDLER(WM_SETFOCUS, TWMSetFocus, WMSetFocus) + MESSAGE_HANDLER(WM_SIZE, TWMSize, WMSize) + END_MESSAGE_MAP(TWinControl) + + __property Hint; + +protected: + virtual void __fastcall CreateParams(TCreateParams &Params); + virtual void __fastcall CreateWindowHandle(const TCreateParams &Params); + virtual void __fastcall CreateWnd(); + +public: + __fastcall TLineEdit(TComponent* Owner); + __fastcall ~TLineEdit(); + + void __fastcall SetFocus(); + void __fastcall SetCursorPos(int Pos); + void __fastcall SetTextFont(String name, int size); + +/******************************************************************************/ +// ༭ +/******************************************************************************/ + void __fastcall Clear(); + void __fastcall ClearSelection(); + void __fastcall CopyToClipboard(); + void __fastcall CutToClipboard(); + + void __fastcall PasteFromClipboard(); + void __fastcall Undo(); + void __fastcall ClearUndo(); + void __fastcall SelectAll(); + + __property bool CanUndo = {read = GetCanUndo, nodefault}; + __property int SelLength = {read = GetSelLength, write = SetSelLength, nodefault}; + __property int SelStart = {read = GetSelStart, write = SetSelStart, nodefault}; + __property String SelText = {read = GetSelText}; + + __property AlignWithMargins = {default = false}; + __property HelpContext; + __property HelpKeyword; + __property HelpType; + __property Margins; + __property Cursor; +/******************************************************************************/ + +__published: + __property TColor BorderColor = {read = FBorderColor, write = SetBorderColor, default = TColor(0x5F5954)}; + __property TColor ShadowColor = {read = FShadowColor, write = SetShadowColor, default = TColor(0x4C463F)}; + + __property TNotifyEvent OnChange = {read = FOnChange, write = SetOnChange}; + + + __property TAlignment Alignment = {read = FAlignment, write = SetAlignment}; + __property TEditCharCase CharCase = {read = FCharCase, write = SetCharCase}; + + __property bool HideSelection = {read = FHideSelection, write = SetHideSelection}; + __property String HintText = {read = FHintText, write = SetHintText}; + __property TColor HintColor = {read = FHintColor, write = SetHintColor, default = TColor(0x594D43)}; + __property int MaxLength = {read = FMaxLength, write = SetMaxLength, default = 500}; + __property bool NumbersOnly = {read = FNumbersOnly, write = SetNumbersOnly}; + __property bool OEMConvert = {read = FOEMConvert, write = SetOEMConvert}; + __property WideChar PasswordChar = {read = FPasswordChar, write = SetPasswordChar}; + __property bool ReadOnly = {read = FReadOnly, write = SetReadOnly}; + + __property int NumberMax = {read = FNumberMax, write = SetNumberMax}; + __property int NumberMin = {read = FNumberMin, write = SetNumberMin}; + + __property UnicodeString Text = {read = GetText, write = SetText}; + + __property Color = {default = TColor(0xC4B4A8)}; + __property Font; + + __property TabOrder = {default = -1}; + __property TabStop = {default = true}; + + __property OnKeyDown; + __property OnKeyPress; + __property OnKeyUp; +}; +//--------------------------------------------------------------------------- +#endif diff --git a/Component/LineEdit/TLineEdit.cpp b/Component/LineEdit/TLineEdit.cpp new file mode 100644 index 0000000..c2815fb --- /dev/null +++ b/Component/LineEdit/TLineEdit.cpp @@ -0,0 +1,17 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop +#pragma package(smart_init) +//--------------------------------------------------------------------------- + +// Package source. +//--------------------------------------------------------------------------- + + +#pragma argsused +extern "C" int _libmain(unsigned long reason) +{ + return 1; +} +//--------------------------------------------------------------------------- diff --git a/Component/RadioBtn/RadioBtn.cpp b/Component/RadioBtn/RadioBtn.cpp new file mode 100644 index 0000000..f3c0c18 --- /dev/null +++ b/Component/RadioBtn/RadioBtn.cpp @@ -0,0 +1,156 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop + +#include "RadioBtn.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +//--------------------------------------------------------------------------- +static inline void ValidCtrCheck(TRadioBtn *) +{ + new TRadioBtn(NULL); +} +//--------------------------------------------------------------------------- +namespace Radiobtn +{ + void __fastcall PACKAGE Register() + { + TComponentClass classes[1] = {__classid(TRadioBtn)}; + RegisterComponents(L"Samples", classes, 0); + } +} +//--------------------------------------------------------------------------- +__fastcall TRadioBtn::TRadioBtn(System::Classes::TComponent* AOwner) : TPanel(AOwner) +{ + m_pRaBtn = new TRadioButton(this); + m_pRaBtn->Parent = this; + m_pRaBtn->ControlStyle>>csOpaque; + m_pRaBtn->Caption= L""; + m_pRaBtn->OnClick = Onclicked; + + m_lbCaption = new TLabel(this); + m_lbCaption->Parent = this; + m_lbCaption->ControlStyle>>csOpaque; + m_lbCaption->OnClick = Onclicked; + m_lbCaption->OnMouseMove = MouseMoveEvent; + + this->OnMouseMove = MouseMoveEvent; + + FChecked = false; + FEnabled = true; + + SetChildBounds(); + SetCaption(L"TRadioBtn"); + SetFont(Font); + + ControlStyle >> csOpaque; + + Width = 100; + Height = 17; +} +//--------------------------------------------------------------------------- +__fastcall TRadioBtn::~TRadioBtn(void) +{ + if(m_lbCaption) delete m_lbCaption; + if(m_pRaBtn) delete m_pRaBtn; +} +//--------------------------------------------------------------------------- +void __fastcall TRadioBtn::SetChildBounds() +{ + int nEdge = GetSystemMetrics(SM_CXMENUCHECK); + + int mHgt = m_lbCaption->Height; + if( mHgt>Height ) Height = mHgt; + + m_lbCaption->SetBounds(nEdge+1, (Height-m_lbCaption->Height)/2, + m_lbCaption->Width, m_lbCaption->Height); + + m_pRaBtn->SetBounds(0, 0, nEdge, Height); +} +//--------------------------------------------------------------------------- +void __fastcall TRadioBtn::CreateWnd(void) +{ + Vcl::Extctrls::TPanel::CreateWnd(); + + SetWindowLong( Parent->Handle, GWL_STYLE, + GetWindowLong(Parent->Handle, GWL_STYLE) & ~WS_CLIPCHILDREN ); +} +//--------------------------------------------------------------------------- +void __fastcall TRadioBtn::CreateParams(Controls::TCreateParams &Params) +{ + Vcl::Extctrls::TPanel::CreateParams(Params); + + Params.ExStyle |= WS_EX_TRANSPARENT; +} +//--------------------------------------------------------------------------- +void __fastcall TRadioBtn::Paint() +{ + SetBkMode( Canvas->Handle, TRANSPARENT ); + StyleServices()->DrawParentBackground( Handle, Canvas->Handle, NULL, true); +} +//--------------------------------------------------------------------------- +void __fastcall TRadioBtn::WMSize(Winapi::Messages::TWMSize &Message) +{ + SetChildBounds(); +} +//-------------------------------------------------------------------------- +void __fastcall TRadioBtn::SetCaption(String FCaptionTmp) +{ + m_lbCaption->Caption = FCaptionTmp; + FCaption = FCaptionTmp; +} +//-------------------------------------------------------------------------- +void __fastcall TRadioBtn::SetFont(TFont *FFontTmp) +{ + m_lbCaption->Font = FFontTmp; + SetChildBounds(); + this->Invalidate(); +} +//-------------------------------------------------------------------------- +void __fastcall TRadioBtn::SetChecked(bool bChecked) +{ + m_pRaBtn->Checked = bChecked; + FChecked = bChecked; +} +//-------------------------------------------------------------------------- +void __fastcall TRadioBtn::SetEnabled(bool bEnabled) +{ + FEnabled = bEnabled; + + m_lbCaption->Enabled = bEnabled; + + m_pRaBtn->Enabled = bEnabled; +} +//-------------------------------------------------------------------------- +void __fastcall TRadioBtn::SetCheckedSameparent(TWinControl* pCtrl) +{ + if( pCtrl->ClassNameIs( TRadioBtn::ClassName() ) ){ + TRadioBtn *pTRadioBtn = (TRadioBtn *)pCtrl; + if( pTRadioBtn->Checked && pTRadioBtn!=this ) + pTRadioBtn->Checked = false; + } +} +//-------------------------------------------------------------------------- +void __fastcall TRadioBtn::Onclicked(TObject *Sender) +{ + if(!FChecked) { + SetChecked(true); + for( int i=0; iParent->ControlCount; i++ ){ + SetCheckedSameparent( (TWinControl*)(this->Parent->Controls[i]) ); + } + if( OnClick ) OnClick(this); + } +} +//-------------------------------------------------------------------------- +void __fastcall TRadioBtn::Click(void) +{ + if( !FEnabled ) return; + + Onclicked(NULL); +} +//--------------------------------------------------------------------------- +void __fastcall TRadioBtn::MouseMoveEvent(System::TObject* Sender, System::Classes::TShiftState Shift, int X, int Y) +{ + if( !FEnabled ) return; +} +//--------------------------------------------------------------------------- diff --git a/Component/RadioBtn/RadioBtn.h b/Component/RadioBtn/RadioBtn.h new file mode 100644 index 0000000..a729a61 --- /dev/null +++ b/Component/RadioBtn/RadioBtn.h @@ -0,0 +1,55 @@ +//--------------------------------------------------------------------------- + +#ifndef RadioBtnH +#define RadioBtnH +//--------------------------------------------------------------------------- +#include +#include +#include +#include +//--------------------------------------------------------------------------- +class PACKAGE TRadioBtn :public TPanel { + +private: + + bool FChecked; + bool FEnabled; + String FCaption; + void __fastcall SetCaption(String FCaptionTmp); + void __fastcall SetFont(TFont *FFontTmp); + void __fastcall SetChecked(bool bChecked); + void __fastcall SetEnabled(bool bEnabled); + + + TLabel *m_lbCaption; + TRadioButton *m_pRaBtn; + + void __fastcall Onclicked(TObject *Sender); + void __fastcall SetCheckedSameparent(TWinControl* pCtrl); + void __fastcall SetChildBounds(); + COLORREF __fastcall TransformColor(COLORREF icolor, int nNum, bool bplus=true); + + void __fastcall MouseMoveEvent(System::TObject* Sender, System::Classes::TShiftState Shift, int X, int Y); + + virtual void __fastcall CreateWnd(); + virtual void __fastcall CreateParams(Controls::TCreateParams &Params); + virtual void __fastcall Paint(void); + + DYNAMIC void __fastcall Click(void); + MESSAGE void __fastcall WMSize(Winapi::Messages::TWMSize &Message); + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(WM_SIZE, TWMSize, WMSize) + END_MESSAGE_MAP( TPanel ) + +public: + + __fastcall TRadioBtn(System::Classes::TComponent* AOwner); + __fastcall ~TRadioBtn(void); + +__published: + __property Font = {write=SetFont}; + __property String Caption = {read=FCaption, write=SetCaption}; + __property bool Checked = {read=FChecked, write=SetChecked, default=false}; + __property bool Enabled = {read=FEnabled, write=SetEnabled, default=true}; +}; +#endif diff --git a/Component/RadioBtn/TRadioBtn.cpp b/Component/RadioBtn/TRadioBtn.cpp new file mode 100644 index 0000000..c2815fb --- /dev/null +++ b/Component/RadioBtn/TRadioBtn.cpp @@ -0,0 +1,17 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop +#pragma package(smart_init) +//--------------------------------------------------------------------------- + +// Package source. +//--------------------------------------------------------------------------- + + +#pragma argsused +extern "C" int _libmain(unsigned long reason) +{ + return 1; +} +//--------------------------------------------------------------------------- diff --git a/Component/SkinTrackBar/SkinTrackBar.cpp b/Component/SkinTrackBar/SkinTrackBar.cpp new file mode 100644 index 0000000..0f56554 --- /dev/null +++ b/Component/SkinTrackBar/SkinTrackBar.cpp @@ -0,0 +1,467 @@ +//--------------------------------------------------------------------------- + +#pragma hdrstop + +#include "SkinTrackBar.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#define trHorizontal 1 //򻬿 +#define trVertical 0 //򻬿 + +#define SLIDER_MAX_H 25 //鳤 +#define SLIDER_MIN_H 10 +#define SLIDER_W 10 // + +#define PANEL_MIN_W 30 //PanelС + +#define CHANNEL_LEFT 5 +#define CHANNEL_W 2 //ۿ + +static const COLORREF + CLR_BACK_ENABLE = RGB(22,33,44), //d5dde8 + CLR_BACK_DISABLE = RGB(112,130,154), //d5dde8 + CLR_SLIDER_DOWN = RGB(77,88,99), //d5dde8 + CLR_SLIDER_HOVER = RGB(55,66,77), //d5dde8 + CLR_SLIDER_NORMAL = RGB(44,55,77); //d5dde8 + +static inline void ValidCtrCheck(TSkinTrackBar *) +{ + new TSkinTrackBar(NULL); +} + +namespace Skintrackbar +{ + void __fastcall PACKAGE Register() + { + TComponentClass classes[1] = {__classid(TSkinTrackBar)}; + RegisterComponents(L"Samples", classes, 0); + } +} + +__fastcall TSkinTrackBar::TSkinTrackBar(System::Classes::TComponent* AOwner) + : TPanel(AOwner) +{ + bDown = false; + bMouse = false; + FEnabled = true; + + FOrientation = 1; //ĬϺ򻬿 + FMax = 100; + FMin = 0; + FPosition = 0; + FPageSize = 1; + Hint = IntToStr(FPosition); + + ParentBackground = true; + + Slider = new TPaintBox(this); + Slider->Parent = this; + Slider->ParentShowHint = false; + Slider->ShowHint = false; + + Slider->OnMouseEnter = CMMouseEnter; + Slider->OnMouseLeave = CMMouseLeave; + Slider->OnMouseDown = CMMouseDown; + Slider->OnPaint = SliderPaint; + + ParentColor = true; +} +//----------------------------------------------------------------------------- +__fastcall TSkinTrackBar::~TSkinTrackBar() +{ + delete Slider; + Slider = NULL; +} + +void __fastcall TSkinTrackBar::SetMax(int Value) +{ + if(Value <= FMin) + { +// if(ComponentState.Contains(csDesigning)) +// { +// MessageBox(Handle, "MaxMin!!!", "", MB_OK | MB_ICONERROR); +// } + } + else + { + if(FMax != Value) + { + FMax = Value; + + if(FPosition > FMax){ + FPosition = FMax; + if(FOnChange) + FOnChange(this); + } + + if( FOrientation ){ + Slider->Left = CHANNEL_LEFT+(double)(FPosition-FMin)*(Width-2*CHANNEL_LEFT-SLIDER_W)/(FMax-FMin); + } + else{ + Slider->Top = Height-CHANNEL_LEFT-(double)(FPosition-FMin)*(Height-2*CHANNEL_LEFT-SLIDER_W)/(FMax-FMin)-SLIDER_W; + } + } + } +} + +void __fastcall TSkinTrackBar::SetMin(int Value) +{ + if(Value >= FMax) + { +// if(ComponentState.Contains(csDesigning)) +// { +// MessageBox(Handle, "MinСMax!!!", "", MB_OK | MB_ICONERROR); +// } + } + else + { + if(FMin != Value) + { + FMin = Value; + + if(FPosition < FMin){ + FPosition = FMin; + if(FOnChange) + FOnChange(this); + } + + if( FOrientation ){ + Slider->Left = CHANNEL_LEFT+(double)(FPosition-FMin)*(Width-2*CHANNEL_LEFT-SLIDER_W)/(FMax-FMin); + } + else{ + Slider->Top = Height-CHANNEL_LEFT-(double)(FPosition-FMin)*(Height-2*CHANNEL_LEFT-SLIDER_W)/(FMax-FMin)-SLIDER_W; + } + } + } +} + +void __fastcall TSkinTrackBar::SetPosition(int iPosition) +{ + if(iPosition>FMax) + iPosition = FMax; + if(iPositionLeft = CHANNEL_LEFT+(double)(FPosition-FMin)*(Width-2*CHANNEL_LEFT-SLIDER_W)/(FMax-FMin); + } + else{ + Slider->Top = Height-CHANNEL_LEFT-(double)(FPosition-FMin)*(Height-2*CHANNEL_LEFT-SLIDER_W)/(FMax-FMin)-SLIDER_W; + } + + if(FOnChange) + FOnChange(this); + + Invalidate(); +// Slider->Invalidate(); + + } +} + +void __fastcall TSkinTrackBar::SetOrientation(bool bOrientation) +{ + if(FOrientation != bOrientation) + { + FOrientation = bOrientation; + + TWMSize msg; + WMSize(msg); + + Invalidate(); +// Slider->Invalidate(); + } +} + +void __fastcall TSkinTrackBar::SetEnabled(bool bEnabled) +{ + if( FEnabled!=bEnabled ){ + FEnabled = bEnabled; + Invalidate(); + } +} + +void __fastcall TSkinTrackBar::CMMouseEnter(System::TObject* Sender) +{ + if( FEnabled ){ + bMouse = true; + Slider->Invalidate(); + } +} + + +void __fastcall TSkinTrackBar::CMMouseLeave(System::TObject* Sender) +{ + if( FEnabled ){ + bMouse = false; + Slider->Invalidate(); + } +} + +void __fastcall TSkinTrackBar::CMMouseDown(System::TObject* Sender, System::Uitypes::TMouseButton Button, + System::Classes::TShiftState Shift, int X, int Y) +{ + if( FEnabled && Button==mbLeft ){ + bDown = true; + MouseCapture = true; + Slider->Invalidate(); + SetFocus(); + } +} + +void __fastcall TSkinTrackBar::WMMouseMove(TWMMouse &Message) +{ + if( FEnabled && bDown ){ + if( FOrientation ){ // trHorizontal 1 //򻬿 + DrawH(Message); + } + else{ + DrawV(Message); + } + } + + TPanel::Dispatch(&Message); +} + +void __fastcall TSkinTrackBar::WMLButtonDown(TWMLButtonDown &Message) +{ + if( FEnabled ){ + if( FOrientation && Message.YPos>Slider->Top + && Message.YPosTop+Slider->Height + && Message.XPos>0 && Message.XPosSlider->Left + && Message.XPosLeft + Slider->Width + && Message.YPos>0 && Message.YPosInvalidate(); + } + + TPanel::Dispatch(&Message); +} + +void __fastcall TSkinTrackBar::WMMouseWheel(TWMMouseWheel &Message) +{ + if( FEnabled ){ + int iPos = FPosition; + if( Message.WheelDelta>0 ){ + iPos += FPageSize; + if( iPos>FMax ) + iPos = FMax; + } + else{ + iPos -= FPageSize; + if( iPosHandle = Message.DC; + + if( Enabled ){ + tempCanvas->Brush->Color = CLR_BACK_ENABLE; + tempCanvas->FillRect(Channel); + } + else{ + tempCanvas->Brush->Color = CLR_BACK_DISABLE; + tempCanvas->FillRect(Channel); + } + + delete tempCanvas; +} + +void __fastcall TSkinTrackBar::SliderPaint(System::TObject* Sender) +{ + TRect rect = Slider->ClientRect; + + if ( !FEnabled ) { + Slider->Canvas->Brush->Color = CLR_BACK_DISABLE; + Slider->Canvas->FillRect(rect); + +// TRect rct(rect); +// Frame3D( Slider->Canvas, rect, clBlack,clGray,1 ); +// rect = rct; + } + else if(bDown){//갴 + Slider->Canvas->Brush->Color = CLR_SLIDER_DOWN; + Slider->Canvas->FillRect(rect); + +// TRect rct(rect); + Frame3D( Slider->Canvas, rect, clBlack,clGray,1 ); +// rect = rct; + } + else if(bMouse){//ƶ + Slider->Canvas->Brush->Color = CLR_SLIDER_HOVER; + Slider->Canvas->FillRect(rect); + +// TRect rct(rect); + Frame3D( Slider->Canvas, rect, clGray,clBlack, 1 ); +// rect = rct; + } + else{ //ƽ + Slider->Canvas->Brush->Color = CLR_SLIDER_NORMAL; + Slider->Canvas->FillRect(rect); + +// TRect rct(rect); + Frame3D( Slider->Canvas, rect, clGray,clBlack, 1 ); +// rect = rct; + } +} + +void __fastcall TSkinTrackBar::DrawH(TWMMouse &Message) // +{ + int oldPosition = FPosition; + + if(Message.XPosLeft==CHANNEL_LEFT) + return; + + Slider->Left = CHANNEL_LEFT; + + FPosition = FMin; + } + else if(Message.XPos>Width-CHANNEL_LEFT-SLIDER_W/2){ + if(Slider->Left==Width-CHANNEL_LEFT - SLIDER_W) + return; + + Slider->Left = Width-CHANNEL_LEFT - SLIDER_W; + + FPosition = FMax; + } + else{ + FPosition = FMin+(double)(Message.XPos - CHANNEL_LEFT - SLIDER_W/2)/(Width-2*CHANNEL_LEFT-SLIDER_W)*(FMax-FMin) +0.5; + + Slider->Left = CHANNEL_LEFT+(double)(FPosition-FMin)*(Width-2*CHANNEL_LEFT-SLIDER_W)/(FMax-FMin); + } + + Hint = IntToStr(FPosition); + if( oldPosition!=FPosition && FOnChange ) + FOnChange(this); +} + +void __fastcall TSkinTrackBar::DrawV(TWMMouse &Message) +{ + int oldPosition = FPosition; + + if(Message.YPosTop==CHANNEL_LEFT) + return; + + Slider->Top = CHANNEL_LEFT; + + FPosition = FMax; + + } + else if(Message.YPos>Height-CHANNEL_LEFT-SLIDER_W/2){ + if(Slider->Top==Height-CHANNEL_LEFT - SLIDER_W) + return; + + Slider->Top = Height-CHANNEL_LEFT - SLIDER_W; + + FPosition = FMin; + } + else{ + FPosition = FMax-(double)(Message.YPos - CHANNEL_LEFT - SLIDER_W/2)/(Height-2*CHANNEL_LEFT-SLIDER_W)*(FMax-FMin); + + Slider->Top = Height-CHANNEL_LEFT-(double)(FPosition-FMin)*(Height-2*CHANNEL_LEFT-SLIDER_W)/(FMax-FMin)-SLIDER_W; + } + + if( oldPosition!=FPosition && FOnChange ) + FOnChange(this); +} + +void __fastcall TSkinTrackBar::WMSize(TWMSize &Message) +{ + if(FOrientation){ + //ȷ򻬿 + if( Width=SLIDER_MAX_H ){ + Slider->Left = CHANNEL_LEFT+(double)(FPosition-FMin)* (Width-2*CHANNEL_LEFT-SLIDER_W)/(FMax-FMin); + Slider->Top = Height/2-SLIDER_MAX_H/2; + Slider->Width = SLIDER_W; + Slider->Height = SLIDER_MAX_H; + } + else{ + Slider->Left = CHANNEL_LEFT+(double)(FPosition-FMin)*(Width-2*CHANNEL_LEFT-SLIDER_W)/(FMax-FMin); + Slider->Top = 1; + Slider->Width = SLIDER_W; + Slider->Height = Height-2; + } + } + else + { + //ȷ򻬿 + if( Height=SLIDER_MAX_H ){ + Slider->Left = Width/2-SLIDER_MAX_H/2; + Slider->Top = Height-CHANNEL_LEFT-(double)(FPosition-FMin)*(Height-2*CHANNEL_LEFT-SLIDER_W)/(FMax-FMin)-SLIDER_W; + Slider->Width = SLIDER_MAX_H; + Slider->Height = SLIDER_W; + } + else{ + Slider->Left = 1; + Slider->Top = Height-CHANNEL_LEFT-(double)(FPosition-FMin)*(Height-2*CHANNEL_LEFT-SLIDER_W)/(FMax-FMin)-SLIDER_W; + Slider->Width = Width-2; + Slider->Height = SLIDER_W; + } + } +} diff --git a/Component/SkinTrackBar/SkinTrackBar.h b/Component/SkinTrackBar/SkinTrackBar.h new file mode 100644 index 0000000..79205ea --- /dev/null +++ b/Component/SkinTrackBar/SkinTrackBar.h @@ -0,0 +1,105 @@ +//--------------------------------------------------------------------------- + +#ifndef SkinTrackBarH +#define SkinTrackBarH + +#include "vcl.h" + +//--------------------------------------------------------------------------- + +class PACKAGE TSkinTrackBar : public TPanel +{ +private: + TPaintBox *Slider; + + int FPosition; + bool FOrientation, + FEnabled; + TNotifyEvent FOnChange; + + int FMax, + FMin; + int FPageSize; + + bool bDown; + bool bMouse; + + void __fastcall Paint(void){}; + + void __fastcall DrawH(TWMMouse &Message); + void __fastcall DrawV(TWMMouse &Message); + + void __fastcall SetMax(int Value); + void __fastcall SetMin(int Value); + + void __fastcall SetPosition(int iPosition); + void __fastcall SetOrientation(bool bOrientation); + void __fastcall SetEnabled(bool bEnabled); + + void __fastcall SliderPaint(System::TObject* Sender); + + void __fastcall CMMouseEnter(System::TObject* Sender); + void __fastcall CMMouseLeave(System::TObject* Sender); + void __fastcall CMMouseDown(System::TObject* Sender, System::Uitypes::TMouseButton Button, System::Classes::TShiftState Shift, int X, int Y); + + MESSAGE void __fastcall WMMouseWheel(TWMMouseWheel &Message); + MESSAGE void __fastcall WMSize(TWMSize &Message); + MESSAGE void __fastcall WMEraseBkgnd(TWMEraseBkgnd &Message); + MESSAGE void __fastcall WMLButtonDown(TWMLButtonDown &Message); + MESSAGE void __fastcall WMLButtonUp(TWMLButtonUp &Message); + MESSAGE void __fastcall WMMouseMove(TWMMouse &Message); + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(WM_SIZE, TWMSize, WMSize) + MESSAGE_HANDLER(WM_LBUTTONDOWN, TWMLButtonDown, WMLButtonDown) + MESSAGE_HANDLER(WM_LBUTTONUP, TWMLButtonUp, WMLButtonUp) + MESSAGE_HANDLER(WM_MOUSEWHEEL, TWMMouseWheel, WMMouseWheel) + MESSAGE_HANDLER(WM_ERASEBKGND, TWMEraseBkgnd, WMEraseBkgnd) + MESSAGE_HANDLER(WM_MOUSEMOVE, TWMMouseMove, WMMouseMove) + END_MESSAGE_MAP(TPanel) + +public: + void __fastcall TMouseWheelEvent(System::TObject* Sender, System::Classes::TShiftState Shift, int WheelDelta, const System::Types::TPoint &MousePos, bool &Handled); + __fastcall TSkinTrackBar(System::Classes::TComponent* AOwner); + __fastcall ~TSkinTrackBar(); + +__published: + __property bool Orientation = {read=FOrientation, write=SetOrientation, default=true}; + __property TNotifyEvent OnChange = {read = FOnChange, write = FOnChange ,default = NULL}; + + __property bool Enabled = {read = FEnabled, write = SetEnabled, default=true }; + __property int Max = {read = FMax, write = SetMax, default = 100}; + __property int Min = {read = FMin, write = SetMin, default = 0}; + __property int PageSize = {read = FPageSize, write = FPageSize, default = 1}; + __property int Position = {read = FPosition, write = SetPosition, stored=FPosition, default = 0}; +}; + +#endif + +/************************************************************ +ʹ˵ + 1ڲ + ÷OrientationֵMax,СֵMin,λPosition + 2ⲿӿ + OnChange Ϊ TNotifyEvent + 3ʹ + + p_Track = new TSkinTrackBar(GeneralDialogPanel1); + p_Track->Parent = GeneralDialogPanel1; + + p_Track->Top = 50; + p_Track->Left = 100; + p_Track->Width = 100; + p_Track->Height = 100; + + p_Track->Position = 30; //ʼλ + + p_Track->ParentBackground = true; //Ƿ񱳾͸Ϊtrue򱳾Ϊ Parentı---ĬΪtrue + + p_Track->Orientation = false; //鷽 Ϊ true ,Ϊfalse ĬΪ true + + p_Track->OnChange = Change; //ⲿӿChange + + p_Track->Show(); + +************************************************************/ diff --git a/Component/SkinTrackBar/TSkinTrackBar.cpp b/Component/SkinTrackBar/TSkinTrackBar.cpp new file mode 100644 index 0000000..c2815fb --- /dev/null +++ b/Component/SkinTrackBar/TSkinTrackBar.cpp @@ -0,0 +1,17 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop +#pragma package(smart_init) +//--------------------------------------------------------------------------- + +// Package source. +//--------------------------------------------------------------------------- + + +#pragma argsused +extern "C" int _libmain(unsigned long reason) +{ + return 1; +} +//--------------------------------------------------------------------------- diff --git a/Component/TCKBox.cbproj b/Component/TCKBox.cbproj new file mode 100644 index 0000000..ce428be --- /dev/null +++ b/Component/TCKBox.cbproj @@ -0,0 +1,1207 @@ + + + {781A2B05-B95E-4FE6-A26D-DC9F35D3606A} + 20.4 + VCL + CheckBox\TCKBox.cpp + True + Release + Win32 + 1048577 + Package + TCKBox + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) + true + TCKBox + CheckBox\;E:\Ac_Project\Ac_Windows\AC_Pro\Component\;E:\Ac_Project\Ac_Windows\AC_Pro\Component\CheckBox\;$(ILINK_LibraryPath) + CppPackage + E:\Ac_Project\Ac_Windows\AC_Pro\Component\CheckBox;$(DCC_UnitSearchPath) + CheckBox\;E:\Ac_Project\Ac_Windows\AC_Pro\Component\;E:\Ac_Project\Ac_Windows\AC_Pro\Component\CheckBox\;$(IncludePath) + <_TCHARMapping>char + true + JPHNE + true + true + .\$(Platform)\$(Config) + false + true + true + $(BDSLIB)\$(PLATFORM)\release\$(LANGDIR);$(ILINK_TranslatedLibraryPath) + None + 2052 + CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) + + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + adortl;bcbie;bcbsmp;bindcomp;bindcompdbx;bindcompfmx;bindcompvcl;bindengine;CloudService;CustomIPTransport;dbexpress;dbrtl;dbxcds;DbxClientDriver;DbxCommonDriver;DBXInterBaseDriver;DBXMySQLDriver;DBXSqliteDriver;dsnap;dsnapcon;dsnapxml;emsclient;IndyCore;IndyIPClient;IndyIPCommon;IndyIPServer;IndyProtocols;IndySystem;inet;inetdb;inetdbxpress;MetropolisUILiveTile;RESTBackendComponents;RESTComponents;rtl;soapmidas;soaprtl;soapserver;svn;TCapButton;tethering;vcl;vclactnband;vcldb;vcldsnap;vclie;vclimg;VCLRESTComponents;vclribbon;VclSmp;vcltouch;vclx;xmlrtl;$(PackageImports) + $(BDSINCLUDE)\windows\vcl;$(IncludePath) + 1033 + true + CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) + + + $(BDSINCLUDE)\windows\vcl;$(IncludePath) + adortl;bindcomp;bindcompdbx;bindcompfmx;bindcompvcl;bindengine;CloudService;CustomIPTransport;dbexpress;dbrtl;dbxcds;DbxClientDriver;DbxCommonDriver;DBXInterBaseDriver;DBXMySQLDriver;DBXSqliteDriver;dsnap;dsnapcon;dsnapxml;emsclient;IndyCore;IndyIPClient;IndyIPCommon;IndyIPServer;IndyProtocols;IndySystem;inet;inetdb;inetdbxpress;MetropolisUILiveTile;RESTBackendComponents;RESTComponents;rtl;soapmidas;soaprtl;soapserver;tethering;vcl;vclactnband;vcldb;vcldsnap;vclie;vclimg;VCLRESTComponents;vclribbon;VclSmp;vcltouch;vclx;xmlrtl;$(PackageImports) + + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + true + + + false + true + false + true + _DEBUG;$(Defines) + false + None + DEBUG + true + true + true + true + Full + true + true + true + true + true + $(BDSLIB)\$(PLATFORM)\debug;$(ILINK_LibraryPath) + $(BDSLIB)\$(PLATFORM)\debug\$(LANGDIR);$(ILINK_TranslatedLibraryPath) + + + $(BDSLIB)\$(PLATFORM)$(CC_SUFFIX)\debug;$(ILINK_LibraryPath) + + + NDEBUG;$(Defines) + None + + + true + 1033 + + + + CheckBox\CKBox.h + 3 + + + 0 + + + 4 + + + 1 + + + 5 + + + 6 + + + 7 + + + 8 + + + Base + + + Cfg_1 + Base + + + Cfg_2 + Base + + + + CPlusPlusBuilder.Personality.12 + CppPackage + + + + False + True + True + False + + + CheckBox\TCKBox.cpp + + + Embarcadero C++Builder Office 2000 Servers Package + Embarcadero C++Builder Office XP Servers Package + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + + + + + + true + + + + + true + + + + + + + true + + + + + + + + + + + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + + + + + + + + + + + true + + + + + true + + + + + true + + + + + true + + + + + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + + + 1 + + + 0 + + + + + res\xml + 1 + + + res\xml + 1 + + + + + library\lib\armeabi + 1 + + + library\lib\armeabi + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\mips + 1 + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-anydpi-v21 + 1 + + + res\drawable-anydpi-v21 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-v21 + 1 + + + res\values-v21 + 1 + + + + + res\values-v31 + 1 + + + res\values-v31 + 1 + + + + + res\values-v35 + 1 + + + res\values-v35 + 1 + + + + + res\drawable-anydpi-v26 + 1 + + + res\drawable-anydpi-v26 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-anydpi-v33 + 1 + + + res\drawable-anydpi-v33 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-night-v21 + 1 + + + res\values-night-v21 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-small + 1 + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + res\drawable-xlarge + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\drawable-anydpi-v24 + 1 + + + res\drawable-anydpi-v24 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-night-anydpi-v21 + 1 + + + res\drawable-night-anydpi-v21 + 1 + + + + + res\drawable-anydpi-v31 + 1 + + + res\drawable-anydpi-v31 + 1 + + + + + res\drawable-night-anydpi-v31 + 1 + + + res\drawable-night-anydpi-v31 + 1 + + + + + 1 + + + 1 + + + 0 + + + + + 1 + .framework + + + 1 + .framework + + + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 1 + + + 1 + + + + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + + + + 1 + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + Assets + 1 + + + Assets + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + + + + + + + + + + + + + + + True + False + True + + + 12 + + + + + diff --git a/Component/TCapButton.cbproj b/Component/TCapButton.cbproj new file mode 100644 index 0000000..bd8f3af --- /dev/null +++ b/Component/TCapButton.cbproj @@ -0,0 +1,1207 @@ + + + {291E9B21-BDDF-4738-AC18-A31E2EC67F8C} + 20.4 + VCL + CapButton\TCapButton.cpp + True + Release + Win32 + 1048577 + Package + TCapButton + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) + true + TCapButton + CapButton\;E:\Ac_Project\Ac_Windows\AC_Pro\Component\;E:\Ac_Project\Ac_Windows\AC_Pro\Component\CapButton\;$(ILINK_LibraryPath) + CppPackage + E:\Ac_Project\Ac_Windows\AC_Pro\Component\CapButton;$(DCC_UnitSearchPath) + CapButton\;E:\Ac_Project\Ac_Windows\AC_Pro\Component\;E:\Ac_Project\Ac_Windows\AC_Pro\Component\CapButton\;$(IncludePath) + <_TCHARMapping>char + true + JPHNE + true + true + .\$(Platform)\$(Config) + false + true + true + $(BDSLIB)\$(PLATFORM)\release\$(LANGDIR);$(ILINK_TranslatedLibraryPath) + None + 2052 + CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) + + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + adortl;bcbie;bcbsmp;bindcomp;bindcompdbx;bindcompfmx;bindcompvcl;bindengine;CloudService;CustomIPTransport;dbexpress;dbrtl;dbxcds;DbxClientDriver;DbxCommonDriver;DBXInterBaseDriver;DBXMySQLDriver;DBXSqliteDriver;dsnap;dsnapcon;dsnapxml;emsclient;IndyCore;IndyIPClient;IndyIPCommon;IndyIPServer;IndyProtocols;IndySystem;inet;inetdb;inetdbxpress;MetropolisUILiveTile;RESTBackendComponents;RESTComponents;rtl;soapmidas;soaprtl;soapserver;svn;tethering;vcl;vclactnband;vcldb;vcldsnap;vclie;vclimg;VCLRESTComponents;vclribbon;VclSmp;vcltouch;vclx;xmlrtl;$(PackageImports) + $(BDSINCLUDE)\windows\vcl;$(IncludePath) + 1033 + true + CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) + + + $(BDSINCLUDE)\windows\vcl;$(IncludePath) + adortl;bindcomp;bindcompdbx;bindcompfmx;bindcompvcl;bindengine;CloudService;CustomIPTransport;dbexpress;dbrtl;dbxcds;DbxClientDriver;DbxCommonDriver;DBXInterBaseDriver;DBXMySQLDriver;DBXSqliteDriver;dsnap;dsnapcon;dsnapxml;emsclient;IndyCore;IndyIPClient;IndyIPCommon;IndyIPServer;IndyProtocols;IndySystem;inet;inetdb;inetdbxpress;MetropolisUILiveTile;RESTBackendComponents;RESTComponents;rtl;soapmidas;soaprtl;soapserver;tethering;vcl;vclactnband;vcldb;vcldsnap;vclie;vclimg;VCLRESTComponents;vclribbon;VclSmp;vcltouch;vclx;xmlrtl;$(PackageImports) + + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + true + + + false + true + false + true + _DEBUG;$(Defines) + false + None + DEBUG + true + true + true + true + Full + true + true + true + true + true + $(BDSLIB)\$(PLATFORM)\debug;$(ILINK_LibraryPath) + $(BDSLIB)\$(PLATFORM)\debug\$(LANGDIR);$(ILINK_TranslatedLibraryPath) + + + $(BDSLIB)\$(PLATFORM)$(CC_SUFFIX)\debug;$(ILINK_LibraryPath) + + + NDEBUG;$(Defines) + None + + + true + 1033 + + + + CapButton\CapButton.h + 3 + + + 0 + + + 4 + + + 1 + + + 5 + + + 6 + + + 7 + + + 8 + + + Base + + + Cfg_1 + Base + + + Cfg_2 + Base + + + + CPlusPlusBuilder.Personality.12 + CppPackage + + + + False + True + True + False + + + CapButton\TCapButton.cpp + + + Embarcadero C++Builder Office 2000 Servers Package + Embarcadero C++Builder Office XP Servers Package + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + + + + + + true + + + + + true + + + + + + + true + + + + + + + + + + + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + + + + + + + + + + + true + + + + + true + + + + + true + + + + + true + + + + + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + + + 1 + + + 0 + + + + + res\xml + 1 + + + res\xml + 1 + + + + + library\lib\armeabi + 1 + + + library\lib\armeabi + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\mips + 1 + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-anydpi-v21 + 1 + + + res\drawable-anydpi-v21 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-v21 + 1 + + + res\values-v21 + 1 + + + + + res\values-v31 + 1 + + + res\values-v31 + 1 + + + + + res\values-v35 + 1 + + + res\values-v35 + 1 + + + + + res\drawable-anydpi-v26 + 1 + + + res\drawable-anydpi-v26 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-anydpi-v33 + 1 + + + res\drawable-anydpi-v33 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-night-v21 + 1 + + + res\values-night-v21 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-small + 1 + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + res\drawable-xlarge + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\drawable-anydpi-v24 + 1 + + + res\drawable-anydpi-v24 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-night-anydpi-v21 + 1 + + + res\drawable-night-anydpi-v21 + 1 + + + + + res\drawable-anydpi-v31 + 1 + + + res\drawable-anydpi-v31 + 1 + + + + + res\drawable-night-anydpi-v31 + 1 + + + res\drawable-night-anydpi-v31 + 1 + + + + + 1 + + + 1 + + + 0 + + + + + 1 + .framework + + + 1 + .framework + + + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 1 + + + 1 + + + + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + + + + 1 + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + Assets + 1 + + + Assets + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + + + + + + + + + + + + + + + True + False + True + + + 12 + + + + + diff --git a/Component/TComboBoxComponent.cbproj b/Component/TComboBoxComponent.cbproj new file mode 100644 index 0000000..ffd4b1b --- /dev/null +++ b/Component/TComboBoxComponent.cbproj @@ -0,0 +1,1206 @@ + + + {E50F353F-FA65-4B76-8D51-69F5F2225D65} + 20.4 + VCL + ComboBoxComponent\TComboBoxComponent.cpp + True + Release + Win32 + 1048577 + Package + TComboBoxComponent + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) + true + TComboBoxComponent + CppPackage + ComboBoxComponent;$(DCC_UnitSearchPath) + ComboBoxComponent\;$(IncludePath) + <_TCHARMapping>char + true + JPHNE + true + true + .\$(Platform)\$(Config) + false + true + true + $(BDSLIB)\$(PLATFORM)\release\$(LANGDIR);$(ILINK_TranslatedLibraryPath) + 2052 + ComboBoxComponent\;$(ILINK_LibraryPath) + CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) + None + + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + adortl;bcbie;bcbsmp;bindcomp;bindcompdbx;bindcompfmx;bindcompvcl;bindengine;CloudService;CustomIPTransport;dbexpress;dbrtl;dbxcds;DbxClientDriver;DbxCommonDriver;DBXInterBaseDriver;DBXMySQLDriver;DBXSqliteDriver;dsnap;dsnapcon;dsnapxml;emsclient;IndyCore;IndyIPClient;IndyIPCommon;IndyIPServer;IndyProtocols;IndySystem;inet;inetdb;inetdbxpress;MetropolisUILiveTile;RESTBackendComponents;RESTComponents;rtl;soapmidas;soaprtl;soapserver;svn;TCapButton;TCKBox;tethering;vcl;vclactnband;vcldb;vcldsnap;vclie;vclimg;VCLRESTComponents;vclribbon;VclSmp;vcltouch;vclx;xmlrtl;$(PackageImports) + $(BDSINCLUDE)\windows\vcl;$(IncludePath) + 1033 + true + + + $(BDSINCLUDE)\windows\vcl;$(IncludePath) + adortl;bindcomp;bindcompdbx;bindcompfmx;bindcompvcl;bindengine;CloudService;CustomIPTransport;dbexpress;dbrtl;dbxcds;DbxClientDriver;DbxCommonDriver;DBXInterBaseDriver;DBXMySQLDriver;DBXSqliteDriver;dsnap;dsnapcon;dsnapxml;emsclient;IndyCore;IndyIPClient;IndyIPCommon;IndyIPServer;IndyProtocols;IndySystem;inet;inetdb;inetdbxpress;MetropolisUILiveTile;RESTBackendComponents;RESTComponents;rtl;soapmidas;soaprtl;soapserver;tethering;vcl;vclactnband;vcldb;vcldsnap;vclie;vclimg;VCLRESTComponents;vclribbon;VclSmp;vcltouch;vclx;xmlrtl;$(PackageImports) + + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + true + + + false + true + false + true + _DEBUG;$(Defines) + false + None + DEBUG + true + true + true + true + Full + true + true + true + true + true + $(BDSLIB)\$(PLATFORM)\debug;$(ILINK_LibraryPath) + $(BDSLIB)\$(PLATFORM)\debug\$(LANGDIR);$(ILINK_TranslatedLibraryPath) + + + $(BDSLIB)\$(PLATFORM)$(CC_SUFFIX)\debug;$(ILINK_LibraryPath) + + + NDEBUG;$(Defines) + None + + + true + 1033 + + + + ComboBoxComponent\ComboBoxComponent.h + 3 + + + 0 + + + 4 + + + 1 + + + 5 + + + 6 + + + 7 + + + 8 + + + Base + + + Cfg_1 + Base + + + Cfg_2 + Base + + + + CPlusPlusBuilder.Personality.12 + CppPackage + + + + False + True + True + False + + + ComboBoxComponent\TComboBoxComponent.cpp + + + Embarcadero C++Builder Office 2000 Servers Package + Embarcadero C++Builder Office XP Servers Package + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + + + + + + true + + + + + true + + + + + + + true + + + + + + + + + + + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + + + + + + + + + + + true + + + + + true + + + + + true + + + + + true + + + + + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + + + 1 + + + 0 + + + + + res\xml + 1 + + + res\xml + 1 + + + + + library\lib\armeabi + 1 + + + library\lib\armeabi + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\mips + 1 + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-anydpi-v21 + 1 + + + res\drawable-anydpi-v21 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-v21 + 1 + + + res\values-v21 + 1 + + + + + res\values-v31 + 1 + + + res\values-v31 + 1 + + + + + res\values-v35 + 1 + + + res\values-v35 + 1 + + + + + res\drawable-anydpi-v26 + 1 + + + res\drawable-anydpi-v26 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-anydpi-v33 + 1 + + + res\drawable-anydpi-v33 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-night-v21 + 1 + + + res\values-night-v21 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-small + 1 + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + res\drawable-xlarge + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\drawable-anydpi-v24 + 1 + + + res\drawable-anydpi-v24 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-night-anydpi-v21 + 1 + + + res\drawable-night-anydpi-v21 + 1 + + + + + res\drawable-anydpi-v31 + 1 + + + res\drawable-anydpi-v31 + 1 + + + + + res\drawable-night-anydpi-v31 + 1 + + + res\drawable-night-anydpi-v31 + 1 + + + + + 1 + + + 1 + + + 0 + + + + + 1 + .framework + + + 1 + .framework + + + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 1 + + + 1 + + + + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + + + + 1 + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + Assets + 1 + + + Assets + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + + + + + + + + + + + + + + + True + False + True + + + 12 + + + + + diff --git a/Component/TGeneralDialogPanel.cbproj b/Component/TGeneralDialogPanel.cbproj new file mode 100644 index 0000000..f0f4bad --- /dev/null +++ b/Component/TGeneralDialogPanel.cbproj @@ -0,0 +1,1207 @@ + + + {22327E5B-3023-4BD9-BFCF-F91F1B8445A3} + 20.4 + VCL + GenelralDialogPanel\TGeneralDialogPanel.cpp + True + Release + Win32 + 1048577 + Package + TGeneralDialogPanel + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) + true + TGeneralDialogPanel + GenelralDialogPanel\;E:\Ac_Project\Ac_Windows\AC_Pro\Component\;E:\Ac_Project\Ac_Windows\AC_Pro\Component\GenelralDialogPanel\;$(ILINK_LibraryPath) + CppPackage + E:\Ac_Project\Ac_Windows\AC_Pro\Component\GenelralDialogPanel;$(DCC_UnitSearchPath) + GenelralDialogPanel\;E:\Ac_Project\Ac_Windows\AC_Pro\Component\;E:\Ac_Project\Ac_Windows\AC_Pro\Component\GenelralDialogPanel\;$(IncludePath) + <_TCHARMapping>char + true + JPHNE + true + true + .\$(Platform)\$(Config) + false + true + true + $(BDSLIB)\$(PLATFORM)\release\$(LANGDIR);$(ILINK_TranslatedLibraryPath) + None + 2052 + CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) + + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + adortl;bcbie;bcbsmp;bindcomp;bindcompdbx;bindcompfmx;bindcompvcl;bindengine;CloudService;CustomIPTransport;dbexpress;dbrtl;dbxcds;DbxClientDriver;DbxCommonDriver;DBXInterBaseDriver;DBXMySQLDriver;DBXSqliteDriver;dsnap;dsnapcon;dsnapxml;emsclient;IndyCore;IndyIPClient;IndyIPCommon;IndyIPServer;IndyProtocols;IndySystem;inet;inetdb;inetdbxpress;MetropolisUILiveTile;RESTBackendComponents;RESTComponents;rtl;soapmidas;soaprtl;soapserver;svn;TCapButton;TCKBox;TComboBoxComponent;tethering;vcl;vclactnband;vcldb;vcldsnap;vclie;vclimg;VCLRESTComponents;vclribbon;VclSmp;vcltouch;vclx;xmlrtl;$(PackageImports) + $(BDSINCLUDE)\windows\vcl;$(IncludePath) + 1033 + true + CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) + + + $(BDSINCLUDE)\windows\vcl;$(IncludePath) + adortl;bindcomp;bindcompdbx;bindcompfmx;bindcompvcl;bindengine;CloudService;CustomIPTransport;dbexpress;dbrtl;dbxcds;DbxClientDriver;DbxCommonDriver;DBXInterBaseDriver;DBXMySQLDriver;DBXSqliteDriver;dsnap;dsnapcon;dsnapxml;emsclient;IndyCore;IndyIPClient;IndyIPCommon;IndyIPServer;IndyProtocols;IndySystem;inet;inetdb;inetdbxpress;MetropolisUILiveTile;RESTBackendComponents;RESTComponents;rtl;soapmidas;soaprtl;soapserver;tethering;vcl;vclactnband;vcldb;vcldsnap;vclie;vclimg;VCLRESTComponents;vclribbon;VclSmp;vcltouch;vclx;xmlrtl;$(PackageImports) + + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + true + + + false + true + false + true + _DEBUG;$(Defines) + false + None + DEBUG + true + true + true + true + Full + true + true + true + true + true + $(BDSLIB)\$(PLATFORM)\debug;$(ILINK_LibraryPath) + $(BDSLIB)\$(PLATFORM)\debug\$(LANGDIR);$(ILINK_TranslatedLibraryPath) + + + $(BDSLIB)\$(PLATFORM)$(CC_SUFFIX)\debug;$(ILINK_LibraryPath) + + + NDEBUG;$(Defines) + None + + + true + 1033 + + + + 4 + + + GenelralDialogPanel\GeneralDialogPanel.h + 3 + + + 0 + + + 1 + + + 5 + + + 6 + + + 7 + + + 8 + + + Base + + + Cfg_1 + Base + + + Cfg_2 + Base + + + + CPlusPlusBuilder.Personality.12 + CppPackage + + + + False + True + True + False + + + GenelralDialogPanel\TGeneralDialogPanel.cpp + + + Embarcadero C++Builder Office 2000 Servers Package + Embarcadero C++Builder Office XP Servers Package + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + + + + + + true + + + + + true + + + + + + + true + + + + + + + + + + + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + + + + + + + + + + + true + + + + + true + + + + + true + + + + + true + + + + + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + + + 1 + + + 0 + + + + + res\xml + 1 + + + res\xml + 1 + + + + + library\lib\armeabi + 1 + + + library\lib\armeabi + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\mips + 1 + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-anydpi-v21 + 1 + + + res\drawable-anydpi-v21 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-v21 + 1 + + + res\values-v21 + 1 + + + + + res\values-v31 + 1 + + + res\values-v31 + 1 + + + + + res\values-v35 + 1 + + + res\values-v35 + 1 + + + + + res\drawable-anydpi-v26 + 1 + + + res\drawable-anydpi-v26 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-anydpi-v33 + 1 + + + res\drawable-anydpi-v33 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-night-v21 + 1 + + + res\values-night-v21 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-small + 1 + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + res\drawable-xlarge + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\drawable-anydpi-v24 + 1 + + + res\drawable-anydpi-v24 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-night-anydpi-v21 + 1 + + + res\drawable-night-anydpi-v21 + 1 + + + + + res\drawable-anydpi-v31 + 1 + + + res\drawable-anydpi-v31 + 1 + + + + + res\drawable-night-anydpi-v31 + 1 + + + res\drawable-night-anydpi-v31 + 1 + + + + + 1 + + + 1 + + + 0 + + + + + 1 + .framework + + + 1 + .framework + + + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 1 + + + 1 + + + + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + + + + 1 + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + Assets + 1 + + + Assets + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + + + + + + + + + + + + + + + True + False + True + + + 12 + + + + + diff --git a/Component/TLineEdit.cbproj b/Component/TLineEdit.cbproj new file mode 100644 index 0000000..f18bfb8 --- /dev/null +++ b/Component/TLineEdit.cbproj @@ -0,0 +1,1221 @@ + + + {46372BBA-1E26-401C-919F-37DBB4A6AF8F} + 20.4 + None + LineEdit\TLineEdit.cpp + True + Release + Win32 + 1048577 + Package + TLineEdit + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) + true + TLineEdit + LineEdit\;E:\Ac_Project\Ac_Windows\AC_Pro\Component\;E:\Ac_Project\Ac_Windows\AC_Pro\Component\LineEdit\;$(ILINK_LibraryPath) + CppPackage + E:\Ac_Project\Ac_Windows\AC_Pro\Component\LineEdit;$(DCC_UnitSearchPath) + LineEdit\;E:\Ac_Project\Ac_Windows\AC_Pro\Component\;E:\Ac_Project\Ac_Windows\AC_Pro\Component\LineEdit\;$(IncludePath) + <_TCHARMapping>char + true + JPHNE + true + true + .\$(Platform)\$(Config) + false + true + true + $(BDSLIB)\$(PLATFORM)\release\$(LANGDIR);$(ILINK_TranslatedLibraryPath) + None + 2052 + CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) + + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + adortl;bcbie;bcbsmp;bindcomp;bindcompdbx;bindcompfmx;bindcompvcl;bindengine;CloudService;CustomIPTransport;dbexpress;dbrtl;dbxcds;DbxClientDriver;DbxCommonDriver;DBXInterBaseDriver;DBXMySQLDriver;DBXSqliteDriver;dsnap;dsnapcon;dsnapxml;emsclient;IndyCore;IndyIPClient;IndyIPCommon;IndyIPServer;IndyProtocols;IndySystem;inet;inetdb;inetdbxpress;MetropolisUILiveTile;RESTBackendComponents;RESTComponents;rtl;soapmidas;soaprtl;soapserver;svn;TCapButton;TCKBox;TComboBoxComponent;tethering;TGeneralDialogPanel;vcl;vclactnband;vcldb;vcldsnap;vclie;vclimg;VCLRESTComponents;vclribbon;VclSmp;vcltouch;vclx;xmlrtl;$(PackageImports) + CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) + 1033 + true + + + adortl;bindcomp;bindcompdbx;bindcompfmx;bindcompvcl;bindengine;CloudService;CustomIPTransport;dbexpress;dbrtl;dbxcds;DbxClientDriver;DbxCommonDriver;DBXInterBaseDriver;DBXMySQLDriver;DBXSqliteDriver;dsnap;dsnapcon;dsnapxml;emsclient;IndyCore;IndyIPClient;IndyIPCommon;IndyIPServer;IndyProtocols;IndySystem;inet;inetdb;inetdbxpress;MetropolisUILiveTile;RESTBackendComponents;RESTComponents;rtl;soapmidas;soaprtl;soapserver;tethering;vcl;vclactnband;vcldb;vcldsnap;vclie;vclimg;VCLRESTComponents;vclribbon;VclSmp;vcltouch;vclx;xmlrtl;$(PackageImports) + + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + true + + + false + true + false + true + _DEBUG;$(Defines) + false + None + DEBUG + true + true + true + true + Full + true + true + true + true + true + $(BDSLIB)\$(PLATFORM)\debug;$(ILINK_LibraryPath) + $(BDSLIB)\$(PLATFORM)\debug\$(LANGDIR);$(ILINK_TranslatedLibraryPath) + + + $(BDSLIB)\$(PLATFORM)$(CC_SUFFIX)\debug;$(ILINK_LibraryPath) + + + NDEBUG;$(Defines) + None + + + true + 1033 + + + + 4 + + + LineEdit\LineEdit.h + 3 + + + 0 + + + 1 + + + 5 + + + 6 + + + 7 + + + 8 + + + Base + + + Cfg_1 + Base + + + Cfg_2 + Base + + + + CPlusPlusBuilder.Personality.12 + CppPackage + + + + False + True + True + False + + + LineEdit\TLineEdit.cpp + + + Embarcadero C++Builder Office 2000 Servers Package + Embarcadero C++Builder Office XP Servers Package + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + + + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + + + true + + + + + + + + + + + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + + + + + + + + + + + true + + + + + true + + + + + true + + + + + true + + + + + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + + + 1 + + + 0 + + + + + res\xml + 1 + + + res\xml + 1 + + + + + library\lib\armeabi + 1 + + + library\lib\armeabi + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\mips + 1 + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-anydpi-v21 + 1 + + + res\drawable-anydpi-v21 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-v21 + 1 + + + res\values-v21 + 1 + + + + + res\values-v31 + 1 + + + res\values-v31 + 1 + + + + + res\values-v35 + 1 + + + res\values-v35 + 1 + + + + + res\drawable-anydpi-v26 + 1 + + + res\drawable-anydpi-v26 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-anydpi-v33 + 1 + + + res\drawable-anydpi-v33 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-night-v21 + 1 + + + res\values-night-v21 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-small + 1 + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + res\drawable-xlarge + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\drawable-anydpi-v24 + 1 + + + res\drawable-anydpi-v24 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-night-anydpi-v21 + 1 + + + res\drawable-night-anydpi-v21 + 1 + + + + + res\drawable-anydpi-v31 + 1 + + + res\drawable-anydpi-v31 + 1 + + + + + res\drawable-night-anydpi-v31 + 1 + + + res\drawable-night-anydpi-v31 + 1 + + + + + 1 + + + 1 + + + 0 + + + + + 1 + .framework + + + 1 + .framework + + + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 1 + + + 1 + + + + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + + + + 1 + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + Assets + 1 + + + Assets + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + + + + + + + + + + + + + + + True + False + True + + + 12 + + + + + diff --git a/Component/TRadioBtn.cbproj b/Component/TRadioBtn.cbproj new file mode 100644 index 0000000..504b765 --- /dev/null +++ b/Component/TRadioBtn.cbproj @@ -0,0 +1,1207 @@ + + + {3459B1DE-9763-41FB-80DE-1736A0F33859} + 20.4 + VCL + RadioBtn\TRadioBtn.cpp + True + Release + Win32 + 1048577 + Package + TRadioBtn + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) + true + TRadioBtn + RadioBtn\;E:\Ac_Project\Ac_Windows\AC_Pro\Component\;E:\Ac_Project\Ac_Windows\AC_Pro\Component\RadioBtn\;$(ILINK_LibraryPath) + CppPackage + E:\Ac_Project\Ac_Windows\AC_Pro\Component\RadioBtn;$(DCC_UnitSearchPath) + RadioBtn\;E:\Ac_Project\Ac_Windows\AC_Pro\Component\;E:\Ac_Project\Ac_Windows\AC_Pro\Component\RadioBtn\;$(IncludePath) + <_TCHARMapping>char + true + JPHNE + true + true + .\$(Platform)\$(Config) + false + true + true + $(BDSLIB)\$(PLATFORM)\release\$(LANGDIR);$(ILINK_TranslatedLibraryPath) + None + 2052 + CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) + + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + adortl;bcbie;bcbsmp;bindcomp;bindcompdbx;bindcompfmx;bindcompvcl;bindengine;CloudService;CustomIPTransport;dbexpress;dbrtl;dbxcds;DbxClientDriver;DbxCommonDriver;DBXInterBaseDriver;DBXMySQLDriver;DBXSqliteDriver;dsnap;dsnapcon;dsnapxml;emsclient;IndyCore;IndyIPClient;IndyIPCommon;IndyIPServer;IndyProtocols;IndySystem;inet;inetdb;inetdbxpress;MetropolisUILiveTile;RESTBackendComponents;RESTComponents;rtl;soapmidas;soaprtl;soapserver;svn;TCapButton;TCKBox;TComboBoxComponent;tethering;TGeneralDialogPanel;TLineEdit;vcl;vclactnband;vcldb;vcldsnap;vclie;vclimg;VCLRESTComponents;vclribbon;VclSmp;vcltouch;vclx;xmlrtl;$(PackageImports) + $(BDSINCLUDE)\windows\vcl;$(IncludePath) + 1033 + true + CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) + + + $(BDSINCLUDE)\windows\vcl;$(IncludePath) + adortl;bindcomp;bindcompdbx;bindcompfmx;bindcompvcl;bindengine;CloudService;CustomIPTransport;dbexpress;dbrtl;dbxcds;DbxClientDriver;DbxCommonDriver;DBXInterBaseDriver;DBXMySQLDriver;DBXSqliteDriver;dsnap;dsnapcon;dsnapxml;emsclient;IndyCore;IndyIPClient;IndyIPCommon;IndyIPServer;IndyProtocols;IndySystem;inet;inetdb;inetdbxpress;MetropolisUILiveTile;RESTBackendComponents;RESTComponents;rtl;soapmidas;soaprtl;soapserver;tethering;vcl;vclactnband;vcldb;vcldsnap;vclie;vclimg;VCLRESTComponents;vclribbon;VclSmp;vcltouch;vclx;xmlrtl;$(PackageImports) + + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + true + + + false + true + false + true + _DEBUG;$(Defines) + false + None + DEBUG + true + true + true + true + Full + true + true + true + true + true + $(BDSLIB)\$(PLATFORM)\debug;$(ILINK_LibraryPath) + $(BDSLIB)\$(PLATFORM)\debug\$(LANGDIR);$(ILINK_TranslatedLibraryPath) + + + $(BDSLIB)\$(PLATFORM)$(CC_SUFFIX)\debug;$(ILINK_LibraryPath) + + + NDEBUG;$(Defines) + None + + + true + 1033 + + + + 4 + + + RadioBtn\RadioBtn.h + 3 + + + 0 + + + 1 + + + 5 + + + 6 + + + 7 + + + 8 + + + Base + + + Cfg_1 + Base + + + Cfg_2 + Base + + + + CPlusPlusBuilder.Personality.12 + CppPackage + + + + False + True + True + False + + + RadioBtn\TRadioBtn.cpp + + + Embarcadero C++Builder Office 2000 Servers Package + Embarcadero C++Builder Office XP Servers Package + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + + + + + + true + + + + + true + + + + + + + true + + + + + + + + + + + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + + + + + + + + + + + true + + + + + true + + + + + true + + + + + true + + + + + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + + + 1 + + + 0 + + + + + res\xml + 1 + + + res\xml + 1 + + + + + library\lib\armeabi + 1 + + + library\lib\armeabi + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\mips + 1 + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-anydpi-v21 + 1 + + + res\drawable-anydpi-v21 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-v21 + 1 + + + res\values-v21 + 1 + + + + + res\values-v31 + 1 + + + res\values-v31 + 1 + + + + + res\values-v35 + 1 + + + res\values-v35 + 1 + + + + + res\drawable-anydpi-v26 + 1 + + + res\drawable-anydpi-v26 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-anydpi-v33 + 1 + + + res\drawable-anydpi-v33 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-night-v21 + 1 + + + res\values-night-v21 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-small + 1 + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + res\drawable-xlarge + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\drawable-anydpi-v24 + 1 + + + res\drawable-anydpi-v24 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-night-anydpi-v21 + 1 + + + res\drawable-night-anydpi-v21 + 1 + + + + + res\drawable-anydpi-v31 + 1 + + + res\drawable-anydpi-v31 + 1 + + + + + res\drawable-night-anydpi-v31 + 1 + + + res\drawable-night-anydpi-v31 + 1 + + + + + 1 + + + 1 + + + 0 + + + + + 1 + .framework + + + 1 + .framework + + + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 1 + + + 1 + + + + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + + + + 1 + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + Assets + 1 + + + Assets + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + + + + + + + + + + + + + + + True + False + True + + + 12 + + + + + diff --git a/Component/TSkinTrackBar.cbproj b/Component/TSkinTrackBar.cbproj new file mode 100644 index 0000000..2c34267 --- /dev/null +++ b/Component/TSkinTrackBar.cbproj @@ -0,0 +1,1221 @@ + + + {EF60F31A-C077-4A8A-BBFF-A7FB4508142B} + 20.4 + None + SkinTrackBar\TSkinTrackBar.cpp + True + Release + Win32 + 1048577 + Package + TSkinTrackBar + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) + true + TSkinTrackBar + SkinTrackBar\;E:\Ac_Project\Ac_Windows\AC_Pro\Component\;E:\Ac_Project\Ac_Windows\AC_Pro\Component\SkinTrackBar\;$(ILINK_LibraryPath) + CppPackage + E:\Ac_Project\Ac_Windows\AC_Pro\Component\SkinTrackBar;$(DCC_UnitSearchPath) + SkinTrackBar\;E:\Ac_Project\Ac_Windows\AC_Pro\Component\;E:\Ac_Project\Ac_Windows\AC_Pro\Component\SkinTrackBar\;$(IncludePath) + <_TCHARMapping>char + true + JPHNE + true + true + .\$(Platform)\$(Config) + false + true + true + $(BDSLIB)\$(PLATFORM)\release\$(LANGDIR);$(ILINK_TranslatedLibraryPath) + None + 2052 + CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) + + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + adortl;bcbie;bcbsmp;bindcomp;bindcompdbx;bindcompfmx;bindcompvcl;bindengine;CloudService;CustomIPTransport;dbexpress;dbrtl;dbxcds;DbxClientDriver;DbxCommonDriver;DBXInterBaseDriver;DBXMySQLDriver;DBXSqliteDriver;dsnap;dsnapcon;dsnapxml;emsclient;IndyCore;IndyIPClient;IndyIPCommon;IndyIPServer;IndyProtocols;IndySystem;inet;inetdb;inetdbxpress;MetropolisUILiveTile;RESTBackendComponents;RESTComponents;rtl;soapmidas;soaprtl;soapserver;svn;TCapButton;TCKBox;TComboBoxComponent;tethering;TGeneralDialogPanel;TLineEdit;TRadioBtn;vcl;vclactnband;vcldb;vcldsnap;vclie;vclimg;VCLRESTComponents;vclribbon;VclSmp;vcltouch;vclx;xmlrtl;$(PackageImports) + CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) + 1033 + true + + + adortl;bindcomp;bindcompdbx;bindcompfmx;bindcompvcl;bindengine;CloudService;CustomIPTransport;dbexpress;dbrtl;dbxcds;DbxClientDriver;DbxCommonDriver;DBXInterBaseDriver;DBXMySQLDriver;DBXSqliteDriver;dsnap;dsnapcon;dsnapxml;emsclient;IndyCore;IndyIPClient;IndyIPCommon;IndyIPServer;IndyProtocols;IndySystem;inet;inetdb;inetdbxpress;MetropolisUILiveTile;RESTBackendComponents;RESTComponents;rtl;soapmidas;soaprtl;soapserver;tethering;vcl;vclactnband;vcldb;vcldsnap;vclie;vclimg;VCLRESTComponents;vclribbon;VclSmp;vcltouch;vclx;xmlrtl;$(PackageImports) + + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + true + + + false + true + false + true + _DEBUG;$(Defines) + false + None + DEBUG + true + true + true + true + Full + true + true + true + true + true + $(BDSLIB)\$(PLATFORM)\debug;$(ILINK_LibraryPath) + $(BDSLIB)\$(PLATFORM)\debug\$(LANGDIR);$(ILINK_TranslatedLibraryPath) + + + $(BDSLIB)\$(PLATFORM)$(CC_SUFFIX)\debug;$(ILINK_LibraryPath) + + + NDEBUG;$(Defines) + None + + + true + 1033 + + + + 4 + + + 1 + + + SkinTrackBar\SkinTrackBar.h + 3 + + + 0 + + + 5 + + + 6 + + + 7 + + + 8 + + + Base + + + Cfg_1 + Base + + + Cfg_2 + Base + + + + CPlusPlusBuilder.Personality.12 + CppPackage + + + + False + True + True + False + + + SkinTrackBar\TSkinTrackBar.cpp + + + Embarcadero C++Builder Office 2000 Servers Package + Embarcadero C++Builder Office XP Servers Package + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + + + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + + + true + + + + + + + + + + + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + + + + + + + + + + + true + + + + + true + + + + + true + + + + + true + + + + + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + + + 1 + + + 0 + + + + + res\xml + 1 + + + res\xml + 1 + + + + + library\lib\armeabi + 1 + + + library\lib\armeabi + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\mips + 1 + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-anydpi-v21 + 1 + + + res\drawable-anydpi-v21 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-v21 + 1 + + + res\values-v21 + 1 + + + + + res\values-v31 + 1 + + + res\values-v31 + 1 + + + + + res\values-v35 + 1 + + + res\values-v35 + 1 + + + + + res\drawable-anydpi-v26 + 1 + + + res\drawable-anydpi-v26 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-anydpi-v33 + 1 + + + res\drawable-anydpi-v33 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-night-v21 + 1 + + + res\values-night-v21 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-small + 1 + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + res\drawable-xlarge + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\drawable-anydpi-v24 + 1 + + + res\drawable-anydpi-v24 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-night-anydpi-v21 + 1 + + + res\drawable-night-anydpi-v21 + 1 + + + + + res\drawable-anydpi-v31 + 1 + + + res\drawable-anydpi-v31 + 1 + + + + + res\drawable-night-anydpi-v31 + 1 + + + res\drawable-night-anydpi-v31 + 1 + + + + + 1 + + + 1 + + + 0 + + + + + 1 + .framework + + + 1 + .framework + + + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 1 + + + 1 + + + + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + + + + 1 + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + Assets + 1 + + + Assets + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + + + + + + + + + + + + + + + True + False + True + + + 12 + + + + + diff --git a/Component/TTextButton.cbproj b/Component/TTextButton.cbproj new file mode 100644 index 0000000..b8c54da --- /dev/null +++ b/Component/TTextButton.cbproj @@ -0,0 +1,1207 @@ + + + {EA93934D-8BB6-4008-9A43-D04EB0C8C207} + 20.4 + VCL + TextButton\TTextButton.cpp + True + Release + Win32 + 1048577 + Package + TTextButton + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) + true + TTextButton + TextButton\;E:\Ac_Project\Ac_Windows\AC_Pro\Component\;E:\Ac_Project\Ac_Windows\AC_Pro\Component\TextButton\;$(ILINK_LibraryPath) + CppPackage + E:\Ac_Project\Ac_Windows\AC_Pro\Component\TextButton;$(DCC_UnitSearchPath) + TextButton\;E:\Ac_Project\Ac_Windows\AC_Pro\Component\;E:\Ac_Project\Ac_Windows\AC_Pro\Component\TextButton\;$(IncludePath) + <_TCHARMapping>char + true + JPHNE + true + true + .\$(Platform)\$(Config) + false + true + true + $(BDSLIB)\$(PLATFORM)\release\$(LANGDIR);$(ILINK_TranslatedLibraryPath) + None + 2052 + CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) + + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + adortl;bcbie;bcbsmp;bindcomp;bindcompdbx;bindcompfmx;bindcompvcl;bindengine;CloudService;CustomIPTransport;dbexpress;dbrtl;dbxcds;DbxClientDriver;DbxCommonDriver;DBXInterBaseDriver;DBXMySQLDriver;DBXSqliteDriver;dsnap;dsnapcon;dsnapxml;emsclient;IndyCore;IndyIPClient;IndyIPCommon;IndyIPServer;IndyProtocols;IndySystem;inet;inetdb;inetdbxpress;MetropolisUILiveTile;RESTBackendComponents;RESTComponents;rtl;soapmidas;soaprtl;soapserver;svn;TCapButton;TCKBox;TComboBoxComponent;tethering;TGeneralDialogPanel;TLineEdit;TRadioBtn;TSkinTrackBar;vcl;vclactnband;vcldb;vcldsnap;vclie;vclimg;VCLRESTComponents;vclribbon;VclSmp;vcltouch;vclx;xmlrtl;$(PackageImports) + $(BDSINCLUDE)\windows\vcl;$(IncludePath) + 1033 + true + CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) + + + $(BDSINCLUDE)\windows\vcl;$(IncludePath) + adortl;bindcomp;bindcompdbx;bindcompfmx;bindcompvcl;bindengine;CloudService;CustomIPTransport;dbexpress;dbrtl;dbxcds;DbxClientDriver;DbxCommonDriver;DBXInterBaseDriver;DBXMySQLDriver;DBXSqliteDriver;dsnap;dsnapcon;dsnapxml;emsclient;IndyCore;IndyIPClient;IndyIPCommon;IndyIPServer;IndyProtocols;IndySystem;inet;inetdb;inetdbxpress;MetropolisUILiveTile;RESTBackendComponents;RESTComponents;rtl;soapmidas;soaprtl;soapserver;tethering;vcl;vclactnband;vcldb;vcldsnap;vclie;vclimg;VCLRESTComponents;vclribbon;VclSmp;vcltouch;vclx;xmlrtl;$(PackageImports) + + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + true + + + false + true + false + true + _DEBUG;$(Defines) + false + None + DEBUG + true + true + true + true + Full + true + true + true + true + true + $(BDSLIB)\$(PLATFORM)\debug;$(ILINK_LibraryPath) + $(BDSLIB)\$(PLATFORM)\debug\$(LANGDIR);$(ILINK_TranslatedLibraryPath) + + + $(BDSLIB)\$(PLATFORM)$(CC_SUFFIX)\debug;$(ILINK_LibraryPath) + + + NDEBUG;$(Defines) + None + + + true + 1033 + + + + 4 + + + 1 + + + TextButton\TextButton.h + 3 + + + 0 + + + 5 + + + 6 + + + 7 + + + 8 + + + Base + + + Cfg_1 + Base + + + Cfg_2 + Base + + + + CPlusPlusBuilder.Personality.12 + CppPackage + + + + False + True + True + False + + + TextButton\TTextButton.cpp + + + Embarcadero C++Builder Office 2000 Servers Package + Embarcadero C++Builder Office XP Servers Package + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + + + + + + true + + + + + true + + + + + + + true + + + + + + + + + + + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + + + + + + + + + + + true + + + + + true + + + + + true + + + + + true + + + + + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + + + 1 + + + 0 + + + + + res\xml + 1 + + + res\xml + 1 + + + + + library\lib\armeabi + 1 + + + library\lib\armeabi + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\mips + 1 + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-anydpi-v21 + 1 + + + res\drawable-anydpi-v21 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-v21 + 1 + + + res\values-v21 + 1 + + + + + res\values-v31 + 1 + + + res\values-v31 + 1 + + + + + res\values-v35 + 1 + + + res\values-v35 + 1 + + + + + res\drawable-anydpi-v26 + 1 + + + res\drawable-anydpi-v26 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-anydpi-v33 + 1 + + + res\drawable-anydpi-v33 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-night-v21 + 1 + + + res\values-night-v21 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-small + 1 + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + res\drawable-xlarge + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\drawable-anydpi-v24 + 1 + + + res\drawable-anydpi-v24 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-night-anydpi-v21 + 1 + + + res\drawable-night-anydpi-v21 + 1 + + + + + res\drawable-anydpi-v31 + 1 + + + res\drawable-anydpi-v31 + 1 + + + + + res\drawable-night-anydpi-v31 + 1 + + + res\drawable-night-anydpi-v31 + 1 + + + + + 1 + + + 1 + + + 0 + + + + + 1 + .framework + + + 1 + .framework + + + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 1 + + + 1 + + + + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + + + + 1 + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + Assets + 1 + + + Assets + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + + + + + + + + + + + + + + + True + False + True + + + 12 + + + + + diff --git a/Component/TextButton/TTextButton.cpp b/Component/TextButton/TTextButton.cpp new file mode 100644 index 0000000..c2815fb --- /dev/null +++ b/Component/TextButton/TTextButton.cpp @@ -0,0 +1,17 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop +#pragma package(smart_init) +//--------------------------------------------------------------------------- + +// Package source. +//--------------------------------------------------------------------------- + + +#pragma argsused +extern "C" int _libmain(unsigned long reason) +{ + return 1; +} +//--------------------------------------------------------------------------- diff --git a/Component/TextButton/TextButton.cpp b/Component/TextButton/TextButton.cpp new file mode 100644 index 0000000..c1861e5 --- /dev/null +++ b/Component/TextButton/TextButton.cpp @@ -0,0 +1,494 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop + +#pragma package(smart_init) + +#include "TextButton.h" + +//////////////////////////////////////////////////////////////////////////////////// +#define PIXEL_EXTERNAL_FRAME 1 //߽С +#define PIXEL_INTERNAL_FARME 1 //ڱ߽С +#define PIXEL_INTERNAL_BOUND 1 //ԲǴС +#define PIXLE_TEXT_LEFT_OFFSET 3 //ƫƾ +#define PIXEL_TEXT_X Width - 2*PIXLE_TEXT_LEFT_OFFSET + +static const COLORREF + CLR_TXT_NOR = RGB( 156, 170, 189 ), + CLR_TXT_HOT = RGB( 201, 214, 229 ), + CLR_TXT_DIS = RGB( 75, 77, 79 ), + + clrFrameExBound = RGB(65,70,77), + + clrFrameExNormal = RGB(125,128,131), + clrFrameExEnter = RGB(145,156,170), + clrFrameExDisable = RGB(109,114,120), + + clrFrameBoundNormal = RGB(68,70,73), + clrFrameBoundEnter = RGB(70,72,76), + + clrFrameNormal = RGB(44,46,48), + clrLineNormal = RGB(44,46,48), + + clrRectNormal = RGB(74,80,88), + clrRectDisable = RGB(100,106,113), + + //Ǵңϵ + + clrCapArrowOpenBound[10]= + { RGB(50,54,60),RGB(54,58,64),RGB(57,61,67),RGB(58,63,69), + RGB(58,63,69),RGB(62,67,74),RGB(64,69,76), + RGB(66,71,78),RGB(68,74,81), + RGB(71,77,85)}, + + clrCapArrowOpenLine[4] = + { RGB(59,64,70), + RGB(65,70,77), + RGB(69,75,82), + RGB(73,78,86)}, + clrExFrameBound[4] = + { RGB(81,87,94), + RGB(94,100,107), + RGB(113,118,124), + RGB(126,130,136) + }, + clrExFrameBoundDisable[4] = + { RGB(77,83,91), + RGB(86,91,99), + RGB(98,103,110), + RGB(105,110,117) + }; +//--------------------------------------------------------------------------- +static inline void ValidCtrCheck(TTextButton *) +{ + new TTextButton(NULL); +} +//--------------------------------------------------------------------------- +namespace Textbutton +{ + void __fastcall PACKAGE Register() + { + TComponentClass classes[1] = {__classid(TTextButton)}; + RegisterComponents(L"Samples", classes, 0); + } +} +//--------------------------------------------------------------------------- +__fastcall TTextButton::TTextButton(TComponent* Owner) + : TGraphicControl(Owner) +{ + Height = 25; //a default Height + Width = 75; //a default Width + FStateCount = 4; //default state count + FDown = false; + ShowHint = true; +} + +//--------------------------------------------------------------------------- +__fastcall TTextButton::~TTextButton(void) +{ + +} + +//--------------------------------------------------------------------------- +void __fastcall TTextButton::Paint(void) +{ + if( FDown ) EtatBtn = 2; + if( !Enabled ) EtatBtn = 3; + + PaintCustomer(); +} + +//--------------------------------------------------------------------------- +void __fastcall TTextButton::MouseDown(System::Uitypes::TMouseButton Button, + System::Classes::TShiftState Shift, int X, int Y) +{ + TGraphicControl::MouseDown( Button, Shift, X, Y ); + + if( Button==mbLeft && Enabled && FStateCount>2){ + EtatBtn = 2; // Pressed + + Paint(); + Refresh(); + } + + TCustomForm * parentForm = GetParentForm( this ); + if( parentForm && parentForm==Application->MainForm ){ + TPoint pt(X,Y); + pt = ClientToParent( pt, parentForm ); + Application->MainForm->OnMouseDown( NULL, Button, Shift, pt.X, pt.Y ); + } +} + +//--------------------------------------------------------------------------- +void __fastcall TTextButton::MouseUp(System::Uitypes::TMouseButton Button, + System::Classes::TShiftState Shift, int X, int Y) +{ + TGraphicControl::MouseUp( Button, Shift, X, Y ); + + if( Button==mbLeft && Enabled ){ + if( X>=0 && X=0 && YModalResult = FModalResult; + } + + TGraphicControl::Click(); +} + +//--------------------------------------------------------------------------- +void __fastcall TTextButton::SetEnabled(bool Value) +{ + if(FStateCount<4) //can't be disable + Value = true; + + TGraphicControl::SetEnabled(Value); + + if( Enabled ) + EtatBtn = 0; + else + EtatBtn = 3; + + Paint(); +} + +//--------------------------------------------------------------------------- +void __fastcall TTextButton::SetStateCount( int count ) +{ + if( count>4 ) count = 4; + if( count<2 ) count = 2; + + FStateCount = count; +} + +//--------------------------------------------------------------------------- +void __fastcall TTextButton::SetDown(bool value) +{ + if( FStateCount<3 ) + value = false; + + FDown = value; + if( FDown==False ) + EtatBtn = 0; //is the mouse down is false then we reset the component state to normal + + Paint(); + Refresh(); //we repaint the componet) +} + +//--------------------------------------------------------------------------- +void __fastcall TTextButton::SetFontSize( int value ) +{ + Canvas->Font->Size = value; + Paint(); + Refresh(); +} + +//--------------------------------------------------------------------------- +void __fastcall TTextButton::SetFontName(System::Uitypes::TFontName value) +{ + Canvas->Font->Name = value; + Paint(); + Refresh(); +} + +//--------------------------------------------------------------------------- +void __fastcall TTextButton::SetTextFont(String name, int size) +{ + Canvas->Font->Name = name; + Canvas->Font->Size = size; + Paint(); + Refresh(); +} + +//--------------------------------------------------------------------------- +void __fastcall TTextButton::PaintCustomer(void) +{ + TRect rectDraw = GetClientRect(); + TRect tmpRet = rectDraw; + + //================߿ + if(EtatBtn == 0){ + Canvas->Brush->Color = clrFrameExNormal; + Canvas->Pen->Color = clrFrameExNormal; + }else if(EtatBtn == 3){ + Canvas->Brush->Color = clrFrameExDisable; + Canvas->Pen->Color = clrFrameExDisable; + }else { + Canvas->Brush->Color = clrFrameExEnter; + Canvas->Pen->Color = clrFrameExEnter; + } + + + int X,Y; + // + Y = 0; + X = PIXEL_EXTERNAL_FRAME ; + Canvas->MoveTo( X, Y ); + X = Width - PIXEL_EXTERNAL_FRAME ; + Canvas->LineTo( X, Y ); + // + Y = Height - PIXEL_EXTERNAL_FRAME ; + X = PIXEL_EXTERNAL_FRAME ; + Canvas->MoveTo( X, Y ); + X = Width - PIXEL_EXTERNAL_FRAME ; + Canvas->LineTo( X, Y ); + // + X = 0 ; + Y = PIXEL_EXTERNAL_FRAME ; + Canvas->MoveTo( X, Y ); + Y = Height - PIXEL_EXTERNAL_FRAME ; + Canvas->LineTo( X, Y ); + // + X = Width - PIXEL_EXTERNAL_FRAME ; + Y = PIXEL_EXTERNAL_FRAME ; + Canvas->MoveTo( X, Y ); + Y = Height - PIXEL_EXTERNAL_FRAME ; + Canvas->LineTo( X, Y ); + + //߿Բ + int iLPixl, iTPixl, iRPixl, iBPixl ; + TRect tmpRetPic = rectDraw; //ڲ򽥱ͼ + int iDistant = 1; //rightbottom - 1 + for(int i=0;i<4;i++) + { + // 4*4 + iLPixl = tmpRetPic.Left + i; + iTPixl = tmpRetPic.Top; + iRPixl = tmpRetPic.Right - i - iDistant; + iBPixl = tmpRetPic.Bottom - iDistant; + + if(EtatBtn == 3) + Canvas->Pen->Color = clrExFrameBoundDisable[i]; + else + Canvas->Pen->Color = clrExFrameBound[i]; + Canvas->Pixels[iLPixl][iTPixl] = Canvas->Pen->Color; + Canvas->Pixels[iRPixl][iTPixl] = Canvas->Pen->Color; + Canvas->Pixels[iLPixl][iBPixl] = Canvas->Pen->Color; + Canvas->Pixels[iRPixl][iBPixl] = Canvas->Pen->Color; + + if(i>0){ //ÿǶԳ + iLPixl = tmpRetPic.Left; + iTPixl = tmpRetPic.Top + i; + iRPixl = tmpRetPic.Right - iDistant; + iBPixl = tmpRetPic.Bottom - i - iDistant; + Canvas->Pixels[iLPixl][iTPixl] = Canvas->Pen->Color; + Canvas->Pixels[iRPixl][iTPixl] = Canvas->Pen->Color; + Canvas->Pixels[iLPixl][iBPixl] = Canvas->Pen->Color; + Canvas->Pixels[iRPixl][iBPixl] = Canvas->Pen->Color; + } + } + + //=================ڱ߿ + + //Բ + if(EtatBtn == 0) Canvas->Pen->Color = clrFrameBoundNormal; + else Canvas->Pen->Color = clrFrameBoundEnter; + + + tmpRet.Top = PIXEL_EXTERNAL_FRAME; + + tmpRet.left = PIXEL_EXTERNAL_FRAME; + Canvas->Pixels[tmpRet.left][tmpRet.top] = Canvas->Pen->Color; + + tmpRet.left = Width - PIXEL_EXTERNAL_FRAME - PIXEL_INTERNAL_FARME; + Canvas->Pixels[tmpRet.left][tmpRet.top] = Canvas->Pen->Color; + + ////////////// + tmpRet.Top = Height - PIXEL_EXTERNAL_FRAME - PIXEL_INTERNAL_FARME; + + tmpRet.left = PIXEL_EXTERNAL_FRAME; + Canvas->Pixels[tmpRet.left][tmpRet.top] = Canvas->Pen->Color; + + tmpRet.left = Width - PIXEL_EXTERNAL_FRAME - PIXEL_INTERNAL_FARME; + Canvas->Pixels[tmpRet.left][tmpRet.top] = Canvas->Pen->Color; + + // + Canvas->Pen->Color = clrFrameNormal; + +// int X,Y; + // + Y = PIXEL_EXTERNAL_FRAME; + X = PIXEL_EXTERNAL_FRAME + PIXEL_INTERNAL_FARME; + Canvas->MoveTo( X, Y ); + X = Width - PIXEL_EXTERNAL_FRAME - PIXEL_INTERNAL_FARME; + Canvas->LineTo( X, Y ); + // + Y = Height - PIXEL_EXTERNAL_FRAME - PIXEL_INTERNAL_FARME; + X = PIXEL_EXTERNAL_FRAME + PIXEL_INTERNAL_FARME; + Canvas->MoveTo( X, Y ); + X = Width - PIXEL_EXTERNAL_FRAME - PIXEL_INTERNAL_FARME; + Canvas->LineTo( X, Y ); + // + X = PIXEL_EXTERNAL_FRAME ; + Y = PIXEL_EXTERNAL_FRAME + PIXEL_INTERNAL_FARME; + Canvas->MoveTo( X, Y ); + Y = Height - PIXEL_EXTERNAL_FRAME - PIXEL_INTERNAL_FARME; + Canvas->LineTo( X, Y ); + // + X = Width - PIXEL_EXTERNAL_FRAME - PIXEL_INTERNAL_FARME; + Y = PIXEL_EXTERNAL_FRAME + PIXEL_INTERNAL_FARME; + Canvas->MoveTo( X, Y ); + Y = Height - PIXEL_EXTERNAL_FRAME - PIXEL_INTERNAL_FARME; + Canvas->LineTo( X, Y ); + + //==============ڲ + if(3 == EtatBtn){ + Canvas->Brush->Color = clrRectDisable; + Canvas->Pen->Color = clrRectDisable; + }else{ + Canvas->Brush->Color = clrRectNormal; + Canvas->Pen->Color = clrRectNormal; + } + + tmpRet.Left = PIXEL_EXTERNAL_FRAME + PIXEL_INTERNAL_FARME; + tmpRet.Top = PIXEL_EXTERNAL_FRAME + PIXEL_INTERNAL_FARME; + tmpRet.Right = Width - tmpRet.Left; + tmpRet.Bottom = Height - tmpRet.Top; + + Canvas->Rectangle(tmpRet.Left, tmpRet.Top, + tmpRet.Right, tmpRet.Bottom); + if(3 != EtatBtn) + { + if(2 == EtatBtn) // down + { + tmpRetPic = rectDraw; //ڲ򽥱ͼ + iDistant = PIXEL_EXTERNAL_FRAME + PIXEL_INTERNAL_FARME; + tmpRetPic.Left += iDistant; + tmpRetPic.Top += iDistant; + tmpRetPic.Right -= iDistant; + tmpRetPic.Bottom -= iDistant; + + iDistant = 1; //rightbottom - 1 + + int iTmpAdd = 0;//clrCapArrowOpenBound ǰλ + for(int i=0; i<4; i++) + { + // + Canvas->Brush->Color = clrCapArrowOpenLine[i]; + Canvas->FrameRect(tmpRetPic); + + int iadd = 0;//clrCapArrowOpenBound ǰλ + for(int j=0; j<4-i; j++) { + + // 4*4 + iLPixl = tmpRetPic.Left + j; + iTPixl = tmpRetPic.Top; + iRPixl = tmpRetPic.Right - j - iDistant; + iBPixl = tmpRetPic.Bottom - iDistant; + + Canvas->Pen->Color = clrCapArrowOpenBound[iTmpAdd+j]; + Canvas->Pixels[iLPixl][iTPixl] = Canvas->Pen->Color; + Canvas->Pixels[iRPixl][iTPixl] = Canvas->Pen->Color; + Canvas->Pixels[iLPixl][iBPixl] = Canvas->Pen->Color; + Canvas->Pixels[iRPixl][iBPixl] = Canvas->Pen->Color; + + if(j>0){ //ÿǶԳ + iLPixl = tmpRetPic.Left; + iTPixl = tmpRetPic.Top + j; + iRPixl = tmpRetPic.Right - iDistant; + iBPixl = tmpRetPic.Bottom - j - iDistant; + Canvas->Pixels[iLPixl][iTPixl] = Canvas->Pen->Color; + Canvas->Pixels[iRPixl][iTPixl] = Canvas->Pen->Color; + Canvas->Pixels[iLPixl][iBPixl] = Canvas->Pen->Color; + Canvas->Pixels[iRPixl][iBPixl] = Canvas->Pen->Color; + } + + iadd++; + } + + iTmpAdd += iadd; + + tmpRetPic.Left += iDistant; + tmpRetPic.Top += iDistant; + tmpRetPic.Right -= iDistant; + tmpRetPic.Bottom -= iDistant; + } + } + } + + PaintCustomerText(); +} + +//--------------------------------------------------------------------------- +void __fastcall TTextButton::PaintCustomerText(void) +{ + int X,Y; + if( !Text.IsEmpty() ){ + if( EtatBtn==0 ){ + Canvas->Font->Color = CLR_TXT_NOR; + } + else if( EtatBtn==3 ){ + Canvas->Font->Color = CLR_TXT_DIS; + } + else{ + Canvas->Font->Color = CLR_TXT_HOT; + } + + Canvas->Brush->Style = bsClear; + String strText = FText; + TSize size = Canvas->TextExtent( strText ); + int nLen = strText.Length(); + + if( size.Width > PIXEL_TEXT_X) + { + nLen = nLen*(PIXEL_TEXT_X)/size.Width; + nLen -= 1; + + if(nLen <= 0){ + strText = strText.SubString(0, 1); + }else{ + strText = strText.SubString(0, nLen); + strText += ".."; + } + + size = Canvas->TextExtent( strText ); + } + + X = PIXLE_TEXT_LEFT_OFFSET + ( PIXEL_TEXT_X - size.Width )/2; + Y = ( Height -size.Height )/2; + + Canvas->TextOut( X, Y, strText ); + } +} +//--------------------------------------------------------------------------- diff --git a/Component/TextButton/TextButton.h b/Component/TextButton/TextButton.h new file mode 100644 index 0000000..57288e1 --- /dev/null +++ b/Component/TextButton/TextButton.h @@ -0,0 +1,101 @@ +//--------------------------------------------------------------------------- +#ifndef TextButtonH +#define TextButtonH +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include +#include +//--------------------------------------------------------------------------- +class PACKAGE TTextButton : public TGraphicControl +{ +public: + enum TModalResult{ + mrNone = System::Int8(0x0), + mrOk = System::Int8(0x1), + mrCancel = System::Int8(0x2), + mrAbort = System::Int8(0x3), + mrRetry = System::Int8(0x4), + mrIgnore = System::Int8(0x5), + mrYes = System::Int8(0x6), + mrNo = System::Int8(0x7), + mrClose = System::Int8(0x8), + mrHelp = System::Int8(0x9), + mrTryAgain = System::Int8(0xa), + mrContinue = System::Int8(0xb), + mrAll = System::Int8(0xc), + mrNoToAll = System::Int8(0xd), + mrYesToAll = System::Int8(0xe) + }; +private: + + TNotifyEvent FOnMouseEnter;//on mouse enter notify event + TNotifyEvent FOnMouseLeave;//on mouse leave notify event +// System::Uitypes::TModalResult FModalResult; + TModalResult FModalResult; + + MESSAGE void __fastcall CMMouseEnter(Winapi::Messages::TMessage &Msg); // to know when mouse is entered + MESSAGE void __fastcall CMMouseLeave(Winapi::Messages::TMessage &Msg); // to know when mouse is leaved + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(CM_MOUSEENTER, TMessage, CMMouseEnter) + MESSAGE_HANDLER(CM_MOUSELEAVE, TMessage, CMMouseLeave) + END_MESSAGE_MAP(TGraphicControl) + +protected: + + bool FDown; // value to know if we painting mouse down + int EtatBtn; // 0=Normal 1=Mouse entered 2=Pressed 3=Disabled + int FStateCount; + String FText; + + DYNAMIC void __fastcall MouseDown(System::Uitypes::TMouseButton Button, System::Classes::TShiftState Shift, int X, int Y); + DYNAMIC void __fastcall MouseUp(System::Uitypes::TMouseButton Button, System::Classes::TShiftState Shift, int X, int Y); + virtual void __fastcall SetEnabled(bool Value); + +__published: + + __property Action; + __property Anchors = {default=3}; +// __property System::Uitypes::TModalResult ModalResult = {read=FModalResult, write=FModalResult, default=0}; + __property TModalResult ModalResult = {read=FModalResult, write=FModalResult, default=mrNone}; + __property ParentShowHint = {default=1}; + __property PopupMenu; + __property ShowHint; + __property Visible = {default=1}; + __property OnClick; + __property OnContextPopup; + __property OnMouseDown; + __property OnMouseMove; + __property OnMouseUp; + __property System::Classes::TNotifyEvent OnMouseEnter = {read=FOnMouseEnter, write=FOnMouseEnter}; + __property System::Classes::TNotifyEvent OnMouseLeave = {read=FOnMouseLeave, write=FOnMouseLeave}; + __property bool Down = {read=FDown, write=SetDown, default=False}; + __property Enabled = {default=1}; + __property int ImgStates = {read=FStateCount, write=SetStateCount, default=4}; + __property String Text = {read=FText, write=FText}; + __property int FontSize = {write=SetFontSize, default=8}; + __property System::Uitypes::TFontName FontName = {write=SetFontName}; +private: + + void __fastcall PaintCustomer(void); + void __fastcall PaintCustomerText(void); + +public: + + __fastcall virtual TTextButton(System::Classes::TComponent* AOwner); + __fastcall virtual ~TTextButton(void); + + virtual void __fastcall Paint(void); // override the painting of the component + DYNAMIC void __fastcall Click(void); + + void __fastcall SetStateCount( int count ); + void __fastcall SetDown(bool value); // to know if mouse is down or not + void __fastcall SetFontSize( int value ); + void __fastcall SetFontName(System::Uitypes::TFontName value); + void __fastcall SetTextFont(String name, int size); +}; +//--------------------------------------------------------------------------- +#endif diff --git a/Compose.cpp b/Compose.cpp new file mode 100644 index 0000000..72313e8 --- /dev/null +++ b/Compose.cpp @@ -0,0 +1,1043 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop + +#include "GlobalUnit.h" +#include "StyleItem.h" +#include "Compose.h" +#include "Project.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) + +/***************************************************************************************/ +// ȫֱ +/***************************************************************************************/ +int g_iMelodyKey = -1; //ɵ +float g_fMusicVolume = 1; // +bool g_bComposeMute = false; //ྲ + +TTheme g_Theme; //ɶ +TOpus g_Opus; //ȫ +TOpusStageList& g_lstOpusStages = g_Opus.StageList(); //ʽṹ + +vector g_lstPaidStyleIDs; //ǰ̱ʹ֧IDб + +/***************************************************************************************/ +// TComposeຯ +void TCompose::ClearStages() +{ + while( m_lstStages.size()>0 ){ + delete m_lstStages.back(); + m_lstStages.pop_back(); + } + + m_nBarCount = 0; +} + +void TCompose::Clear() +{ + ClearStages(); + + m_idLoc = m_idStyle = -1; +} + +TOpusStage* TCompose::CopyStageAt( int iStage ) +{ + if( iStage<0 || iStage>m_lstStages.size() ) + return NULL; + + TOpusStage *pSrcStage = m_lstStages[iStage], + *pNewStage = new TOpusStage( pSrcStage ); + + for( int j=0; jaBars.size(); j++ ){ + pNewStage->aBars.push_back( new TBar( pSrcStage->aBars[j] )); + } + + for( int j=0; jaTracks.size(); j++ ){ + pNewStage->aTracks.push_back( new TTrack( pSrcStage->aTracks[j] )); + } + + return pNewStage; +} + +void TCompose::WriteProj( LOCSEGLIST& lstLocSeg, FILE* pFile ) +{ + fwrite(&m_idLoc, sizeof(UINT), 1, pFile); + fwrite(&m_idStyle, sizeof(UINT), 1, pFile); + + SaveOpusStages( m_lstStages, lstLocSeg, pFile ); +} + +int TCompose::ReadProj( STYLELIST& aUnsolvedStyles, FILE* pFile, DWORD dwVersion ) +{ + fread(&m_idLoc, sizeof(UINT), 1, pFile); + fread(&m_idStyle, sizeof(UINT), 1, pFile); + + int ret = LoadOpusStages( m_lstStages, aUnsolvedStyles, pFile, dwVersion ); + + if( E_PROJ_FATALERROR>(DWORD)ret ){ + m_nBarCount = ret; + ret = E_PROJ_NOERROR; + } + else{ + Clear(); + } + + return ret; +} + +void TCompose::SetTempStyle( UINT idLoc, UINT idStyle, int idSet ) +{ + if( m_idLoc==idLoc && m_idStyle==idStyle ){ + m_idLoc = -1; + m_idStyle = idSet; + } + + for( int s=0; saTracks.size(); t++ ){ + TTrack* pTrack = pStage->aTracks[t]; + if( pTrack->iStyleLoc==idLoc && pTrack->iStyleId==idStyle ){ + pTrack->iStyleLoc = -1; + pTrack->iStyleId = idSet; + } + } + } +} + +void TCompose::Set( UINT idLoc, UINT idStyle, TOpusStageList& lstStages ) +{ + ClearStages(); + + m_idLoc = idLoc; + m_idStyle = idStyle; + + for( int i=0; iaBars.size(); + for( int j=0; jaBars.push_back( new TBar( pSrcStage->aBars[j] )); + } + + m_nBarCount += nBars; + + for( int j=0; jaTracks.size(); j++ ){ + pNewStage->aTracks.push_back( new TTrack( pSrcStage->aTracks[j] )); + } + + m_lstStages.push_back( pNewStage ); + } +} + +void TCompose::Get( UINT& idLoc, UINT& idStyle, TOpusStageList& lstStages ) +{ + idLoc = m_idLoc; + idStyle = m_idStyle; + + for( int i=0; i& lstBank ) +{ + for( int s=0; saTracks.size(); t++ ){ + TTrack* pTrack = pStage->aTracks[t]; + + if( pTrack->iBank!=0xFF ){ + bool bAdd = true; + + for( int b=0; biBank==lstBank[b] ){ + bAdd = false; + break; + } + } + + if( bAdd ) + lstBank.push_back( pTrack->iBank ); + } + } + } +} + +void TCompose::SetSpecBanks( BANKMAPLIST& lstMap ) +{ + for( int s=0; saTracks.size(); t++ ){ + TTrack* pTrack = pStage->aTracks[t]; + + if( pTrack->iBank!=0xFF ){ + for( int b=0; biBank==pMap->iBankOld ){ + pTrack->iBank = pMap->iBankNew; + break; + } + } + } + } + } +} + +/***************************************************************************************/ +// TThemeຯ +TTheme::TTheme() : TCompose() +{ + m_bWeakup = false; + m_iKey = -1; +} + +void TTheme::Clear() +{ + TCompose::Clear(); + + m_iKey = -1; + m_bWeakup = false; +} + +void TTheme::Set( UINT idLoc, UINT idStyle, TOpusStageList& lstStages ) +{ + TCompose::Set( idLoc, idStyle, lstStages ); + + m_iKey = g_iMelodyKey; + if( lstStages.size()>0 ){ + TOpusStage* pSrcStage = m_lstStages[0]; + + if( m_bWeakup && pSrcStage->aBars.size()>1 ){ + TOpusStage* pWeakStage = new TOpusStage( pSrcStage ); + + pWeakStage->aBars.push_back( pSrcStage->aBars[0] ); + pSrcStage->aBars.erase( pSrcStage->aBars.begin() ); + + for( int j=0; jaTracks.size(); j++ ){ + pWeakStage->aTracks.push_back( new TTrack( pSrcStage->aTracks[j] )); + } + + m_lstStages.insert( m_lstStages.begin(), pWeakStage ); + } + } +} + +void TTheme::Set( TOpusStageList& lstStages ) +{ + TCompose::Set( m_idLoc, m_idStyle, lstStages ); +} + +void TTheme::Build( TBarList& lstBars, vector&lstStages ) +{ + Clear(); + + m_iKey = g_iMelodyKey; + + TStyleItem* pStyItem = g_pPreStyle; + + int nSegNum[4]; + vector aSegments[4]; + memset( nSegNum, 0, sizeof(int)*4 ); + + if( pStyItem ){ + if( pStyItem->pStyle ){ + m_idLoc = pStyItem->pStyle->idLoc; + m_idStyle = pStyItem->pStyle->idStyle; + } + else{ + m_idLoc = -1; + m_idStyle = 0; + } + + if( pStyItem->aItems->Count==0 ){ + TPROSTYLE* info = pStyItem->pStyle; + + for( int s=0; sidLoc==0 ? info->pOrigin->detail.nSegNum[s] + : info->idLoc==1 ? info->pShare->nSegNum[s] + : info->pLocal->nSegNum[s]; + int num = s>4 ); + + if( num>0 ){ + DWORD opts = OPT_DEL | OPT_VOL | (sidLoc==0 ? 100 + : info->idLoc==1 ? info->pShare->nSegVol[s][sn] + : info->pLocal->nSegVol[s][sn]; + TSegmentItem* pSegItem = pStyItem->AddSegment( s, sn, opts, 0, -1, vol, false ); + + DWORD dwTrkOpt = OPT_DEL|OPT_FONTPROG|OPT_VOL; + if( sAddTrack( info, sn, j, dwTrkOpt, true ); + } + + if( pSegItem->aItems->Count>0 ){ + if( s==SEGTYPE_INTRO ){ + pSegItem->nBars = info->idLoc==0 ? info->pOrigin->detail.aIntroBars[sn] + : info->idLoc==1 ? info->pShare->aIEBars[0][sn] + : info->pLocal->aIEBars[0][sn]; + } + else if( s==SEGTYPE_ENDING ){ + pSegItem->nBars = info->idLoc==0 ? info->pOrigin->detail.aEndingBars[sn] + : info->idLoc==1 ? info->pShare->aIEBars[1][sn] + : info->pLocal->aIEBars[1][sn]; + } + + aSegments[s].push_back( pSegItem ); + nSegNum[s]++; + } + else{ + pStyItem->DeleteSegment( pSegItem ); + } + } + } + } + } + } + else{ + for( int i=0; iaItems->Count; i++ ){ + TSegmentItem* pSegment = (TSegmentItem*)pStyItem->aItems->Items[i]; + int stype = pSegment->GetSegType(); + aSegments[stype].push_back( pSegment ); + nSegNum[stype]++; + } + } + } + + if( lstStages.size()>1 && lstStages[0]==0 ) + m_bWeakup = true; + else + m_bWeakup = false; + + int iSegNo = 0, iBar = 0; + for( int i=0; iiSegKey = g_iMelodyKey; + pStage->iSegType = SEGTYPE_VAR; + pStage->nVol = 100; + pStage->iSegNo = -1; + + int nBar = lstStages[i] - iBar + 1; + for( int j=0; jaBars.push_back( lstBars[iBar++] ); + } + + if( nSegNum[SEGTYPE_VAR]==0 ){ + delete pStage; + } + else{ + TSegmentItem* pSegment = aSegments[SEGTYPE_VAR][iSegNo]; + pStage->nVol = pSegment->volume; + pStage->iSegNo = pSegment->iSegNo; + + ProduceTracks( pStage, pSegment ); + m_lstStages.push_back( pStage ); + m_nBarCount += nBar; + + if( nSegNum[SEGTYPE_FILL]>0 && nBar>1 && iiSegKey = g_iMelodyKey; + pFillStage->iSegType = SEGTYPE_FILL; + pFillStage->iSegNo = pSegFill->iSegNo; + pFillStage->nVol = pSegFill->volume; + + pFillStage->aBars.push_back( pStage->aBars.back() ); + pStage->aBars.pop_back(); + + ProduceTracks( pFillStage, pSegFill ); + m_lstStages.push_back( pFillStage ); + } + + if( iBar>1 && iSegNo < nSegNum[SEGTYPE_VAR]-1 ) + iSegNo = (iSegNo + 1) % nSegNum[SEGTYPE_VAR]; + } + } +} + +int TTheme::GetFirstChord() +{ + int iStage = m_bWeakup ? 1 : 0; + + return MAKELONG( m_lstStages[iStage]->aBars[0]->aChords.iType[0], + m_lstStages[iStage]->aBars[0]->aChords.iKey[0] ); +} + +int TTheme::GetLastChord() +{ + return MAKELONG( m_lstStages.back()->aBars.back()->aChords.iType[g_nChordNumPerBar-1], + m_lstStages.back()->aBars.back()->aChords.iKey[g_nChordNumPerBar-1] ); +} + +void TTheme::WriteProj( LOCSEGLIST& lstLocSeg, FILE* pFile ) +{ + fwrite(&m_iKey, sizeof(int), 1, pFile); + fwrite(&m_bWeakup, sizeof(bool), 1, pFile); + + TCompose::WriteProj( lstLocSeg, pFile ); +} + +int TTheme::ReadProj( STYLELIST& aUnsolvedStyles, FILE* pFile, DWORD dwVersion ) +{ + fread(&m_iKey, sizeof(int), 1, pFile); + fread(&m_bWeakup, sizeof(bool), 1, pFile); + + return TCompose::ReadProj( aUnsolvedStyles, pFile, dwVersion ); +} + +/***************************************************************************************/ +// TOpusຯ +TOpus::TOpus() +{ + m_bModified = false; + m_iKeyBk = -1; +} + +TOpus::~TOpus() +{ + ClearBackup(); +} + +void TOpus::ClearBackup() +{ + m_bModified = false; + m_iKeyBk = -1; + + while( m_lstStagesBk.size()>0 ){ + delete m_lstStagesBk.back(); + m_lstStagesBk.pop_back(); + } +} + +void TOpus::Clear() +{ + TCompose::Clear(); + + ClearBackup(); + m_aStageBars.clear(); +} + +void TOpus::Set( UINT idLoc, UINT idStyle, TOpusStageList& lstStages ) +{ + TCompose::Set( idLoc, idStyle, lstStages ); + + CountBars(); +} + +void TOpus::WriteProj( LOCSEGLIST& lstLocSeg, FILE* pFile ) +{ + m_idLoc = (g_pUseStyle && g_pUseStyle->pStyle) ? g_pUseStyle->pStyle->idLoc : 0; + m_idStyle = (g_pUseStyle && g_pUseStyle->pStyle) ? g_pUseStyle->pStyle->idStyle : 0; + + TCompose::WriteProj( lstLocSeg, pFile ); +} + +int TOpus::ReadProj( STYLELIST& aUnsolvedStyles, FILE* pFile, DWORD dwVersion ) +{ + int ret = TCompose::ReadProj( aUnsolvedStyles, pFile, dwVersion ); + + if( ret==E_PROJ_NOERROR ){ + CountBars(); + } + + return ret; +} + +void TOpus::Backup() +{ + ClearBackup(); + + m_iKeyBk = g_iMelodyKey; + + for( int i=0; iiSegKey = pBkStage->iSegKey; + pNewStage->iSegType = pBkStage->iSegType; + pNewStage->iSegNo = pBkStage->iSegNo; + pNewStage->nVol = pBkStage->nVol; + + for( int j=0; jaBars.size(); j++ ){ + TBar* pBar = new TBar; + pBar->iBarKey = pBkStage->aBars[j]->iBarKey; + memcpy( &pBar->aChords, + &pBkStage->aBars[j]->aChords, + sizeof(TBarChords) ); + pNewStage->aBars.push_back( pBar ); + } + + for( int j=0; jaTracks.size(); j++ ){ + TTrack * pTrack = new TTrack; + memcpy( pTrack, pBkStage->aTracks[j], sizeof(TTrack) ); + + pNewStage->aTracks.push_back( pTrack ); + } + + m_lstStagesBk.push_back( pNewStage ); + } + + m_bModified = false; +} + +BOOL TOpus::CheckModified( int iCheckType ) +{ + if( iCheckType==CHECK_GET ){ + return m_bModified; + } + + m_bModified &= ~iCheckType; + + if( iCheckType & CHECK_KEY ){ + if( m_iKeyBk!=g_iMelodyKey ){ + m_bModified |= CHECK_KEY; + } + } + + if( !(m_bModified & CHECK_KEY) && ( iCheckType & CHECK_STAGE) ){ + if( m_lstStagesBk.size()!=m_lstStages.size() ){ + m_bModified |= CHECK_STAGE; + } + } + + if( !(m_bModified & CHECK_STAGE) && (iCheckType & CHECK_STAGE || iCheckType & CHECK_TRACK + || iCheckType & CHECK_CHORD )){ + for( int i=0; iaBars.size()!=pBkStage->aBars.size() + || pOpStage->iSegType!=pBkStage->iSegType + || pOpStage->nVol!=pBkStage->nVol + || pOpStage->iSegKey!=pBkStage->iSegKey ){ + m_bModified |= CHECK_STAGE; + } + else if(iCheckType & CHECK_CHORD && pBkStage->iSegType<=SEGTYPE_FILL ){ + for( int j=0; jaBars.size(); j++ ){ + TBarChords* pOpBar = &pOpStage->aBars[j]->aChords; + TBarChords* pBkBar = &pBkStage->aBars[j]->aChords; + + if( memcmp( pOpBar, pBkBar, sizeof(TBarChords ))){ + m_bModified |= CHECK_CHORD; + break; + } + } + } + } + + if( !(m_bModified & CHECK_TRACK) && (iCheckType & CHECK_TRACK) ){ + if( pOpStage->aTracks.size()!=pBkStage->aTracks.size() ){ + m_bModified |= CHECK_TRACK; + } + else{ + for( int j=0; jaTracks.size(); j++ ){ + TTrack* pOpTrack = pOpStage->aTracks[j]; + TTrack* pBkTrack = pBkStage->aTracks[j]; + + if( pOpTrack->iStyleId!=pBkTrack->iStyleId + || pOpTrack->iStyleLoc!=pBkTrack->iStyleLoc + || pOpTrack->iSegNo!=pBkTrack->iSegNo + || pOpTrack->iChanNo!=pBkTrack->iChanNo + || pOpTrack->iFile!=pBkTrack->iFile + || pOpTrack->iBank!=pBkTrack->iBank + || pOpTrack->iChanSpec!=pBkTrack->iChanSpec ){ + m_bModified |= CHECK_TRACK; + break; + } + + if( (iCheckType & CHECK_PROG) && pOpTrack->iProg!=pBkTrack->iProg ){ + m_bModified |= CHECK_PROG; + break; + } + + if( (iCheckType & CHECK_VOL) && pOpTrack->nVol!=pBkTrack->nVol ){ + m_bModified |= CHECK_VOL; + break; + } + } + } + } + } + } + + return m_bModified; +} + +void TOpus::BuildStyleItem() +{ + if( m_lstStages.empty() ){ + g_pUseStyle = NULL; + return; + } + + TPROSTYLE* info = GetStyleInfo( m_idLoc, m_idStyle ); + TStyleItem* pSty = new TStyleItem( info, 0 ); + + for( int i=0; iiSegType<=SEGTYPE_FILL ){ + ind = pSty->nSegNum[0] + pSty->nSegNum[1]; + opts |= OPT_BRUSH; + } + else + ind = pSty->nSegNum[pStage->iSegType]; + + TSegmentItem* pSegItem = pSty->AddSegment( pStage->iSegType, + pStage->iSegNo, + opts, + pStage->aBars.size(), + ind, + pStage->nVol, + false ); + + opts = OPT_DEL|OPT_FONTPROG|OPT_VOL; + if( pStage->iSegType<=SEGTYPE_FILL ) + opts |= OPT_TEXTURE; + for( int j=0; jaTracks.size(); j++ ){ + TTrack* pTrack = pStage->aTracks[j]; + + int idLoc = pTrack->iStyleLoc, + idStyle = pTrack->iStyleId; + TPROSTYLE* pStyle = GetStyleInfo( idLoc, idStyle ); + + if( !pStyle ){ + DebugPrint( "ļʧЧ\n" ); + + delete pTrack; + pStage->aTracks.erase( pStage->aTracks.begin() + j ); + j--; + + continue; + } + + pSegItem->AddTrack( pStyle, pTrack, opts, false ); + + if( !info ){ + pSty->pStyle = pStyle; + } + } + } + + g_pUseStyle = pSty; +} + +void TOpus::CopyStages( int iStartBar, int iEndBar, TOpusStageList* lstStages ) +{ + int iBar = iStartBar; + int iFirstBar, iSrcStage = FindStage( iBar, &iFirstBar ); + + while( iBar<=iEndBar ){ + int nOffsetBar = iBar-iFirstBar; + TOpusStage* pOriStage = m_lstStages[iSrcStage]; + int nCopyBar = pOriStage->aBars.size() - nOffsetBar; + + if( nCopyBar>iEndBar-iBar+1 ) + nCopyBar = iEndBar-iBar+1; + + TOpusStage* pNewStage = new TOpusStage( pOriStage ); + + int iCopyEndBar = nOffsetBar + nCopyBar; + for( int i=nOffsetBar; iaBars.push_back( new TBar( pOriStage->aBars[i] ) ); + } + + for( int j=0; jaTracks.size(); j++ ){ + pNewStage->aTracks.push_back( new TTrack( pOriStage->aTracks[j] )); + } + + lstStages->push_back( pNewStage ); + + iBar += nCopyBar; + iSrcStage++; + iFirstBar = iBar; + } +} + +void TOpus::ChangeKey( int iBarStart, int iBarEnd, int iKey, int keys[] ) +{ + if( iBarStart<0 ) + iBarStart = 0; + if( iBarEnd<0 ) + iBarEnd = m_nBarCount - 1; + + int iBar = iBarStart, + iFirstKey = -1; + while( iBar<=iBarEnd ){ + int iFirstBar, iStage = FindStage( iBar, &iFirstBar ); + TOpusStage* pStage = m_lstStages[iStage]; + + int iSetKey = keys!=NULL ? keys[iBar-iBarStart] : iKey; + + if( iFirstKey<0 ) + iFirstKey = iSetKey; + + if( pStage->iSegType>=SEGTYPE_INTRO && iBar==iFirstBar ){ + pStage->iSegKey = iSetKey; + iBar += pStage->aBars.size(); + } + else{ + int iStart = max( iBar, iFirstBar ), + iEnd = min( iBarEnd, (int)(iFirstBar + pStage->aBars.size() - 1) ); + + for( int i = iStart; i<=iEnd; i++ ){ + TBar *pBar = pStage->aBars[i-iFirstBar]; + + int iDiff = iSetKey - pBar->iBarKey; + pBar->iBarKey = iSetKey; + + for( int k=0; k<4; k++ ){ + pBar->aChords.iKey[k] += iDiff; + if( pBar->aChords.iKey[k]>0x7F ) + pBar->aChords.iKey[k] += KEY_NUM; + else if( pBar->aChords.iKey[k]>=KEY_NUM ) + pBar->aChords.iKey[k] -= KEY_NUM; + } + } + + iBar = iEnd + 1; + } + } +} + +void TOpus::InsertStage( int iIns, TOpusStage* pStage ) +{ + int nBar = pStage->aBars.size(); + + if( iIns<0 || iIns>=StageCount() ){ + m_lstStages.push_back( pStage ); + + int iBegin = m_nBarCount, + iEnd = iBegin + nBar - 1; + + m_aStageBars.push_back( MAKELONG( iBegin, iEnd ) ); + + m_nBarCount += nBar; + } + else{ + m_lstStages.insert( m_lstStages.begin()+iIns, pStage ); + + int iBegin = iIns==0 ? 0 : HIWORD(m_aStageBars[iIns-1]) + 1, + iEnd = iBegin + nBar - 1; + + m_aStageBars.insert( m_aStageBars.begin()+iIns, MAKELONG( iBegin, iEnd ) ); + + for( int i=iIns+1; iaBars.size(); + + delete pStage; + m_lstStages.erase( m_lstStages.begin() + iDel ); + m_aStageBars.erase( m_aStageBars.begin() + iDel ); + + if( nBar>0 ){ + for( int i=iDel; iiEndBar ) + return; + + TOpusStage* pOriStage = g_lstOpusStages[iStage]; + TOpusStage* pCutStage = new TOpusStage; + + pCutStage->iSegKey = pOriStage->iSegKey; + pCutStage->iSegNo = pOriStage->iSegNo; + pCutStage->iSegType = pOriStage->iSegType; + pCutStage->nVol = pOriStage->nVol; + + for( int i=0; iaTracks.size(); i++ ){ + TTrack * pTrack = new TTrack( pOriStage->aTracks[i] ); + + pCutStage->aTracks.push_back( pTrack ); + } + + int nBarNum = pOriStage->aBars.size()-(iCutBar-iFirstBar); + + for( int i=0; iaBars.insert( pCutStage->aBars.begin(), pOriStage->aBars.back() ); + pOriStage->aBars.pop_back(); + } + + m_lstStages.insert( m_lstStages.begin()+iStage+1, pCutStage ); + m_aStageBars[iStage] = MAKELONG( iFirstBar, iCutBar-1 ); + m_aStageBars.insert( m_aStageBars.begin()+iStage+1, MAKELONG(iCutBar, iEndBar) ); +} + +void TOpus::ChangeStageBar( int iStage, int nBar, bool bCount ) +{ + int iFirstBar = LOWORD(m_aStageBars[iStage]), + iEndBar = HIWORD(m_aStageBars[iStage]) + nBar; + + m_aStageBars[iStage] = MAKELONG( iFirstBar, iEndBar ); + + if( bCount ){ + for( int i=iStage+1; iaBars.size(); + iBegin = iEnd + 1; + iEnd += pStage->aBars.size(); + + m_aStageBars.push_back( MAKELONG( iBegin, iEnd ) ); + } +} + +int TOpus::FindStage( int iBar, int *piFirstBar ) +{ + if( iBar>=0 && iBar=iSBegin && iBar<=iSEnd ){ + if( piFirstBar ) + *piFirstBar = iSBegin; + + return i; + } + } + } + + return -1; +} + +int TOpus::StageFirstBar( int iStage ) +{ + if( iStage>=0 && iStage=0 && iStage=0 && iStage=0 && iBaraBars.size(); + + if( iBar=g_lstOpusStages.size() ) + return -1; + + int nBarCount = 0; + for( int i=0; iaBars.size(); + } + + return nBarCount; +*/ +} + +int GetBarCount() +{ + return g_Opus.BarCount(); +/* int nBarCount = 0; + for( int i=0; iaBars.size(); + } + + return nBarCount; +*/ +} + +int GetBarKey( int iBar ) +{ + int iFirstBar, iStage = FindStage( iBar, &iFirstBar ); + + if( iStage<0 ) + return -1; + + if( g_lstOpusStages[iStage]->iSegType>=SEGTYPE_INTRO ) + return g_lstOpusStages[iStage]->iSegKey; + else + return g_lstOpusStages[iStage]->aBars[iBar-iFirstBar]->iBarKey; +} + +TOpusStage* DuplicateStage( TOpusStage* pSrc ) +{ + TOpusStage* pNew = new TOpusStage( pSrc ); + + for( int j=0; jaBars.size(); j++ ){ + pNew->aBars.push_back( new TBar( pSrc->aBars[j] )); + } + + for( int j=0; jaTracks.size(); j++ ){ + pNew->aTracks.push_back( new TTrack( pSrc->aTracks[j] )); + } + + return pNew; +} + +void ProduceTracks( TOpusStage* pStage, void* pSegItem ) +{ + TSegmentItem* pSeg = (TSegmentItem*)pSegItem; + + for( int i=0; iaItems->Count; i++ ){ + TTrackItem* pTrk = (TTrackItem*)pSeg->aItems->Items[i]; + + TTrack * pTrack = new TTrack( pTrk->pTrack ); + pStage->aTracks.push_back( pTrack ); + } +} + +bool DiffStages( TOpusStage* pStage1, TOpusStage* pStage2, bool bPassSegNo, + bool bPassFile ) +{ + bool bDiff = true; + + if( pStage1->iSegType==pStage2->iSegType + && pStage1->iSegKey==pStage2->iSegKey + && pStage1->nVol==pStage2->nVol + && ( bPassSegNo || pStage1->iSegNo==pStage2->iSegNo ) + && pStage1->aTracks.size()==pStage2->aTracks.size() ){ + bDiff = false; + + if( !pStage1->aTracks.empty() ){ + int num = pStage1->aTracks.size(); + bool* aMatch = new bool[num]; + memset( aMatch, false, sizeof(bool)*num ); + + for( int i=0; iaTracks[i]; + + bool bFound = false; + for( int j=0; jaTracks[j]; + if( !aMatch[j] && pTrk1->iStyleId==pTrk2->iStyleId + && pTrk1->iStyleLoc==pTrk2->iStyleLoc + && pTrk1->iSegNo==pTrk2->iSegNo + && pTrk1->iChanNo==pTrk2->iChanNo + && pTrk1->iBank==pTrk2->iBank + && pTrk1->iProg==pTrk2->iProg + && pTrk1->nVol==pTrk2->nVol + && ( bPassFile || pTrk1->iFile==pTrk2->iFile + || pTrk1->iFile==0xFF + || pTrk2->iFile==0xFF )){ + bFound = true; + aMatch[j] = true; + + break; + } + } + + if( !bFound ){ + bDiff = true; + break; + } + } + + delete[] aMatch; + } + } + + return bDiff; +} + diff --git a/Compose.h b/Compose.h new file mode 100644 index 0000000..7babf54 --- /dev/null +++ b/Compose.h @@ -0,0 +1,247 @@ +//--------------------------------------------------------------------------- +#ifndef ComposeH +#define ComposeH +//--------------------------------------------------------------------------- + +#include +#include "ProCommon.h" +using namespace std; + +#define POINTS_PER_BAR 120 //ÿСڵ + +#define SEGTYPE_VAR 0 +#define SEGTYPE_FILL 1 +#define SEGTYPE_INTRO 2 +#define SEGTYPE_ENDING 3 + +#define CHECK_GET 0x0000 +#define CHECK_STAGE 0x0001 +#define CHECK_TRACK 0x0002 +#define CHECK_CHORD 0x0004 +#define CHECK_KEY 0x0008 +#define CHECK_PROG 0x0010 +#define CHECK_STAGEALL 0x001F +#define CHECK_VOL 0x0020 +#define CHECK_ALL 0x00FF + +/***************************************************************************************/ +// ȫඨ +/***************************************************************************************/ +// TCompose +typedef struct tagBar0 +{ + //ÿСPOINTS_PER_BARֵ + DWORD aVols[POINTS_PER_BAR]; + bool aRecording[POINTS_PER_BAR]; + TBarChords aChords; + bool bInvalid; // ǷЧ + + tagBar0() + { + bInvalid = false; + memset( this, 0, sizeof(tagBar0) ); + } + + tagBar0( tagBar0* pSrc ) + { + memcpy( this, pSrc, sizeof(tagBar0)); + } +} TBarOld, *PTBarOld; + +typedef struct tagBar +{ + TBarChords aChords; // + char iBarKey; // Сڵĵ + char reserved[3]; // ֶΣֽ + + tagBar() + { + memset( this, 0, sizeof(tagBar) ); + iBarKey = -1; + } + + tagBar( tagBar* pSrc ) + { + memcpy( this, pSrc, sizeof(tagBar)); + } +} TBar, *PTBar; + +typedef vector TTrackList; +typedef vector TBarList; + +typedef struct tagOpusStage //ʽֶϢ +{ + char iSegType; //Ƭ 0=VAR, 1=FILL, 2=INTRO, 3=ENDING + char iSegNo; //Ƭκ + char iSegKey; //ֶε + char nVol; // + TBarList aBars; //Сб + TTrackList aTracks; //б + + tagOpusStage(){ + iSegKey = iSegType = iSegNo = -1; + nVol = 100; + } + + tagOpusStage( tagOpusStage* pSrc ){ + iSegType = pSrc->iSegType; + iSegNo = pSrc->iSegNo; + iSegKey = pSrc->iSegKey; + nVol = pSrc->nVol; + } + + ~tagOpusStage(){ + while( !aBars.empty() ){ + delete aBars.back(); + aBars.pop_back(); + } + while( !aTracks.empty() ){ + delete aTracks.back(); + aTracks.pop_back(); + } + } +} TOpusStage, *PTOpusStage; + +typedef vector TOpusStageList; +typedef vector STYLELIST; +typedef vector TStageList; + +typedef struct{ + UINT idLoc; + UINT idStyle; + vector aSegs; +} TLocSegment; + +typedef vector LOCSEGLIST; + +typedef struct{ + BYTE iBankOld; + BYTE iBankNew; +} TBankMap; + +typedef vector BANKMAPLIST; + +class TCompose +{ +protected: + UINT m_idLoc, m_idStyle; + int m_nBarCount; + + TOpusStageList m_lstStages; + void ClearStages(); + +public: + virtual void Clear(); + int StageCount() { return m_lstStages.size(); }; + TOpusStage* CopyStageAt( int iStage ); + TOpusStageList& StageList() { return m_lstStages; }; + virtual void Set( UINT idLoc, UINT idStyle, TOpusStageList& lstStages ); + virtual void Get( UINT& idLoc, UINT& idStyle, TOpusStageList& lstStages ); + int BarCount() { return m_nBarCount; }; + + virtual void WriteProj( LOCSEGLIST& lstLocSeg, FILE* pFile ); + virtual int ReadProj( STYLELIST& aUnsolvedStyles, FILE* pFile, DWORD dwVersion ); + void SetTempStyle( UINT idLoc, UINT idStyle, int idSet ); + void GetSpecBanks( vector& lstBank ); + void SetSpecBanks( BANKMAPLIST& lstMap ); + + TCompose() { + m_idLoc = m_idStyle = -1; + m_nBarCount = 0; + }; + + ~TCompose() { + Clear(); + }; +}; + +class TTheme : public TCompose +{ +private: + bool m_bWeakup; + int m_iKey; + +public: + bool Empty() { return m_lstStages.empty(); }; + bool IsWeadup() { return m_bWeakup; }; + TBar* GetFirstBar() { return m_lstStages[0]->aBars[0]; }; + int GetKey(){ return m_iKey; }; + + virtual void Clear(); + virtual void Set( UINT idLoc, UINT idStyle, TOpusStageList& lstStages ); + virtual void WriteProj( LOCSEGLIST& lstLocSeg, FILE* pFile ); + virtual int ReadProj( STYLELIST& aUnsolvedStyles, FILE* pFile, DWORD dwVersion ); + + void Build( TBarList& lstBars, vector&lstStages ); + int GetFirstChord(); + int GetLastChord(); + void Set( TOpusStageList& lstStages ); + + + TTheme(); +}; + +class TOpus : public TCompose +{ +private: + BOOL m_bModified; + TOpusStageList m_lstStagesBk; + int m_iKeyBk; + vector m_aStageBars; + +public: + TOpus(); + ~TOpus(); + + virtual void Clear(); + virtual void Set( UINT idLoc, UINT idStyle, TOpusStageList& lstStages ); + virtual void WriteProj( LOCSEGLIST& lstLocSeg, FILE* pFile ); + virtual int ReadProj( STYLELIST& aUnsolvedStyles, FILE* pFile, DWORD dwVersion ); + + void ClearBackup(); + void CopyStages( int iStartBar, int iEndBar, TOpusStageList* lstStages ); + void Backup(); + void Restore(); + BOOL CheckModified( int iCheckType ); + void BuildStyleItem(); + void ChangeKey( int iBarStart, int iBarEnd, int iKey, int keys[] ); + void CountBars(); + int FindStage( int iBar, int *piFirstBar ); + int StageFirstBar( int iStage ); + int StageLastBar( int iStage ); + DWORD StageRange( int iStage ); + void InsertStage( int iIns, TOpusStage* pStage ); + void RemoveStage( int iDel ); + void CutStage( int iStage, int iCutBar ); + void ChangeStageBar( int iStage, int nBar, bool bCount ); +}; + + +/***************************************************************************************/ +// ȫֱ +/***************************************************************************************/ +extern int g_iPreStage, // Ԥģʽ + g_iMelodyKey; // ɵ + +extern float g_fMusicVolume; // +extern bool g_bComposeMute; //ྲ + +extern TTheme g_Theme; //ɶ +extern TOpus g_Opus; //ȫ +extern TOpusStageList& g_lstOpusStages; //ʽṹ + +extern vector g_lstPaidStyleIDs; //ǰ̱ʹ֧IDб + +/***************************************************************************************/ +// ȫֺ +/***************************************************************************************/ + +int FindStage( int iBar, int *piFirstBar=NULL ); +int FirstBar( int iStage ); +int GetBarCount(); +int GetBarKey( int iBar ); +TOpusStage* DuplicateStage( TOpusStage* pSrc ); +void ProduceTracks( TOpusStage* pStage, void* pSegItem ); +bool DiffStages( TOpusStage* pStage1, TOpusStage* pStage2, bool bPassSegNo=false, + bool bPassFile=true ); +#endif diff --git a/ContentPanelUnit.cpp b/ContentPanelUnit.cpp new file mode 100644 index 0000000..54bc4da --- /dev/null +++ b/ContentPanelUnit.cpp @@ -0,0 +1,7456 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop + +#include "GlobalUnit.h" +#include "MessageDef.h" +#include "ContentPanelUnit.h" +#include "UseStylePanel.h" +#include "ChordPanel.h" +#include "TrackPanel.h" +#include "MidiTrack.h" +#include "SwitchTextureForm.h" +#include "SwitchProgFormUnit.h" +#include "AudioFxFormUnit.h" +#include "VSTPluginFormUnit.h" +#include "ProgressFormUnit.h" +#include "Undo.h" + +//#define TRK_HDR_WIDTH 120 +#define DOTIP_WIDTH 10 +#define CUR_WIDTH 11 +#define CUR_HEIGHT 8 +#define ABS_POI_PLAY 6 +#define ABS_POI_WAVE 4 +#define SM_TOP 15 +#define SM_SIZE 14 +#define SOLO_LEFT -19//101 +#define MUTE_LEFT -34//86 + +#define HOVER_MUTE 0x10000 +#define HOVER_SOLO 0x20000 +#define TRACK_M_HOVER 0x10 +#define TRACK_S_HOVER 0x20 + +#define IDM_TRKSHOW 0x100 +#define IDM_TRKAUD 0x200 +#define IDM_TRKMID 0x300 + +//--------------------------------------------------------------------------- +#pragma package(smart_init) + +extern TImage * w_imgDrag; //϶ͼƬ +extern bool w_bDraging; +extern int w_iDragMode, //϶ģʽ + w_xImgDrag, //͸ͼƬλ + w_yImgDrag, + w_xOldDrag, //͸ͼƬϴλ + w_yOldDrag, + w_xOffDrag, //ͼƬϽ + w_yOffDrag; + +extern TCursor crBrush, crBrushAdd, crBrushNo; + +const COLORREF clrBackground = RGB(52,56,62), //屳 + clrBackboard = RGB( 29,31,35 ), //߿ + clrBarTitle[17] = { RGB(22,24,27),RGB(64,69,76),RGB(44,48,55), + RGB(42,46,53),RGB(41,44,51),RGB(39,42,48),RGB(37,40,46), + RGB(35,38,43),RGB(33,35,40),RGB(31,32,37),RGB(28,30,34), + RGB(26,28,32),RGB(24,25,29),RGB(23,24,26),RGB(21,22,24), + RGB(19,20,22),RGB(22,24,27) }, //Сɫ + clrBarTitleSel[17] = { RGB(152,152,152),RGB(145,144,144),RGB(135,134,134), + RGB(125,123,123),RGB(112,111,111),RGB(99,98,98),RGB(86,84,84), + RGB(73,71,71),RGB(62,60,60),RGB(50,49,49),RGB(39,37,38), + RGB(32,29,30),RGB(30,28,29),RGB(29,27,28),RGB(29,26,27), + RGB(28,25,26),RGB(27,24,25) }, //Сɫ + clrFocus = RGB(247,246,246), + clrFocback = RGB(225,236,255), + clrSelText = RGB(201,214,229), + clrTitleFont = RGB(156,170,189), + clrHeadFont = RGB(52,56,62), + clrSelCell = RGB(83,109,165), //ѡк + clrPlayLine = RGB(255,0,0), // űʾ + clrInsertLine = RGB(228,123,249),//255,0,255), //Ƶ + clrRecordMask = RGB(226,225,225), //¼ɫ + clrEffectBk = RGB(247,246,246), //Ч򱳾 + clrWaveBk[3] = {RGB(186,185,185), RGB(216,215,215), RGB(226,225,225)}, + clrWave[2] = {RGB(15,229,226), RGB(75,148,147)}, + clrSMState[4] = {RGB(186,185,185), RGB(216,215,215), + RGB(248,235,159), RGB(250,244,213)}; + +//--------------------------------------------------------------------------- + +__fastcall TContentPanel::TContentPanel(TComponent* AOwner) + : Vcl::Extctrls::TPanel(AOwner) +{ + Visible = false; + DoubleBuffered = true; + + m_rgnClip = NULL; + m_pStylePanel = NULL; + m_pItem = NULL; + m_sbVert = m_sbHoriz = NULL; + m_imgPlayCursor = m_imgMidiIcon = m_imgWaveIcon = NULL; + m_pTimer = NULL; + m_PopupMenu = NULL; + + m_bPlaying = m_bDragReady = m_bDraging = m_bBrush = false; + m_iMode = VIEW_INIT; + m_bVertical = true; + + m_nBarWidth = m_nDataWidth = POINTS_PER_BAR; + m_nRowGapHeight = 14; + m_nTitleHeight = 17; + m_nChordHeight = 27; + m_nTrackHeight = 31; + m_nLeftOriBound = m_nLeftBound = 4;//20; + m_nRightBound = 1;//15; + m_nTopBound = 1; + m_nBottomBound = 1; + m_nTrkHdrWidth = MIN_HDR_WIDTH; + + m_nBarDrawHeight = m_nTitleHeight + m_nTrackHeight; + m_nBarHeight = m_nRowGapHeight + m_nBarDrawHeight; + + m_nChordTxtHeight = 18; + + m_iPlayBar = m_iPlayPoint = 0; + m_iDropBar = -1; + m_iCopyAudio = m_iDragAudio = -1; + m_iSelTrackBar = m_iSelTrackPoint = -1; + m_iSelBarStart = m_iSelBarEnd = -1; + m_iSelCellStart = m_iSelCellEnd = -1; + m_iSelPointStart = m_iSelPointEnd = -1; + m_iMouseDownBar = m_iMouseDownPoint = -1; + m_iCopyBarStart = m_iCopyBarEnd = -1; + m_iCopyCellStart = m_iCopyCellEnd = -1; + m_iCopyPointStart = m_iCopyPointEnd = -1; + m_iSelTrack = -1; + m_bCut = false; +} +//--------------------------------------------------------------------------- + +void __fastcall TContentPanel::CreateWnd(void) +{ + Vcl::Extctrls::TPanel::CreateWnd(); + + if( m_ApplicationEvents==NULL ){ + m_ApplicationEvents = new TApplicationEvents(NULL); + m_ApplicationEvents->OnMessage = DoHandleMessage; + } + + OnDblClick = DoubleClick; + + if( !m_imgPlayCursor ){ + m_imgPlayCursor = new TBitmap(); + m_imgPlayCursor->LoadFromResourceName(int(HInstance), L"imgPlayCursor"); + } + + if( !m_imgMidiIcon ){ + m_imgMidiIcon = new TBitmap(); + m_imgMidiIcon->LoadFromResourceName(int(HInstance), L"imgMidiIcon"); + } + + if( !m_imgWaveIcon ){ + m_imgWaveIcon = new TBitmap(); + m_imgWaveIcon->LoadFromResourceName(int(HInstance), L"imgWaveIcon"); + } + + m_pngChordUp = new TPngImage(); + m_pngChordUp->LoadFromResourceName(int(HInstance), "chordUp"); + m_pngChordDown = new TPngImage(); + m_pngChordDown->LoadFromResourceName(int(HInstance), "chordDown"); + m_pngChord2 = new TPngImage(); + m_pngChord2->LoadFromResourceName(int(HInstance), "chord2"); + m_pngChord4 = new TPngImage(); + m_pngChord4->LoadFromResourceName(int(HInstance), "chord4"); + m_pngChord6 = new TPngImage(); + m_pngChord6->LoadFromResourceName(int(HInstance), "chord6"); + m_pngChord7 = new TPngImage(); + m_pngChord7->LoadFromResourceName(int(HInstance), "chord7"); + m_pngChordI = new TPngImage(); + m_pngChordI->LoadFromResourceName(int(HInstance), "chordI"); + m_pngChordV = new TPngImage(); + m_pngChordV->LoadFromResourceName(int(HInstance), "chordV"); + m_pngChordMaj = new TPngImage(); + m_pngChordMaj->LoadFromResourceName(int(HInstance), "chordMaj"); + m_pngChordMin = new TPngImage(); + m_pngChordMin->LoadFromResourceName(int(HInstance), "chordMin"); + m_pngChordSus = new TPngImage(); + m_pngChordSus->LoadFromResourceName(int(HInstance), "chordSus"); + + m_sbVert = new TSkinScrollBar(this); + m_sbVert->Parent = this; + m_sbVert->m_pWndCtrl = this; + m_sbVert->Visible = false; + m_sbVert->Left = ClientWidth - m_sbVert->Width - 1; + m_sbVert->Top = 1; + m_sbVert->Height = ClientHeight - 2; + + m_sbHoriz = new TSkinScrollBar(this, false); + m_sbHoriz->Parent = this; + m_sbHoriz->m_pWndCtrl = this; + m_sbHoriz->Visible = false; + m_sbHoriz->Left = m_nTrkHdrWidth; + m_sbHoriz->Top = ClientHeight - m_sbHoriz->Height - 1; + m_sbHoriz->Width = ClientWidth - m_nTrkHdrWidth - 1; + + //¼ʾ + m_iBeatHint = -1; + for( int i=0; i<4; i++ ){ + m_imgBeatHint[i] = new TPngImage(); + String strHintName = "imgBeatHint" + IntToStr( i+1 ); + m_imgBeatHint[i]->LoadFromResourceName(int(HInstance), strHintName ); + } + m_wBeatHint = m_imgBeatHint[0]->Width; + m_hBeatHint = m_imgBeatHint[0]->Height; + m_lBeatHint = (ClientWidth - m_wBeatHint) / 2; + m_tBeatHint = (ClientHeight - m_hBeatHint) / 2; + + Canvas->Font->Name = "SimHei"; + Canvas->Font->Size = g_szFont8; + + InitialVars(); + g_Midi.InitNoteColor(); +} +//--------------------------------------------------------------------------- + +__fastcall TContentPanel::~TContentPanel() +{ + if( m_ApplicationEvents ) + delete m_ApplicationEvents; + + if( m_rgnClip ) + ::DeleteObject(m_rgnClip); + + if( m_sbVert ) + delete m_sbVert; + + if( m_sbHoriz ) + delete m_sbHoriz; + +// if( m_PopupMenu ) +// delete m_PopupMenu; + + if( m_imgPlayCursor ) + delete m_imgPlayCursor; + + if( m_imgMidiIcon ) + delete m_imgMidiIcon; + + if( m_imgWaveIcon ) + delete m_imgWaveIcon; + + for( int i=0; i<4; i++ ){ + if( m_imgBeatHint[i] ) + delete m_imgBeatHint[i]; + } + + if( m_pngChordUp ) + delete m_pngChordUp; + if( m_pngChordDown ) + delete m_pngChordDown; + if( m_pngChord2 ) + delete m_pngChord2; + if( m_pngChord4 ) + delete m_pngChord4; + if( m_pngChord6 ) + delete m_pngChord6; + if( m_pngChord7 ) + delete m_pngChord7; + if( m_pngChordI ) + delete m_pngChordI; + if( m_pngChordV ) + delete m_pngChordV; + if( m_pngChordMaj ) + delete m_pngChordMaj; + if( m_pngChordMin ) + delete m_pngChordMin; + if( m_pngChordSus ) + delete m_pngChordSus; + + ClearShowTracks(); +} +//--------------------------------------------------------------------------- + +void TContentPanel::ClearShowTracks() +{ + SelectTrack( -1, -1, -1 ); + + while( !m_aTracks.empty() ){ + delete m_aTracks.back(); + m_aTracks.pop_back(); + } +} +//--------------------------------------------------------------------------- + +void TContentPanel::SetMode( int iMode ) +{ + if( m_iMode!=iMode ){ + m_iMode = iMode; + + m_iDropBar = -1; + m_iCopyAudio = m_iDragAudio = -1; + m_iSelTrackBar = m_iSelTrackPoint = -1; + SelectRange( -1, -1, -1, -1 ); + SelectCopyPos( -1, -1, -1, -1 ); + SelectCells( -1, -1, -1, -1 ); + SelectCopyCells( -1, -1, -1, -1 ); + + m_iSelTrack = g_iSelAudio = iMode==MODE_INIT ? 0 : -1; + g_iSelMidiTrack = -1; + + ((TChordPanel*)m_pChordPanel)->EnableChordModify( false, -1, -1, -1 ); + ((TUseStylePanel*)m_pStylePanel)->SetSelectStage( -1 ); + + if( iMode==MODE_INIT && !m_bVertical ) + SetScrollMode( true ); + else + InvalidateRgn( Handle, NULL, false ); + } +} +//--------------------------------------------------------------------------- + +void TContentPanel::SetScrollMode( bool bVertical ) +{ + if( m_bVertical!=bVertical ){ + m_bVertical = bVertical; + + m_iDropBar = -1; + m_iCopyAudio = m_iDragAudio = -1; + m_iSelTrackBar = m_iSelTrackPoint = -1; + + SelectRange( -1, -1, -1, -1 ); + SelectCopyPos( -1, -1, -1, -1 ); + SelectCells( -1, -1, -1, -1 ); + SelectCopyCells( -1, -1, -1, -1 ); + + g_iSelAudio = g_iSelMidiTrack = m_iSelTrack = -1; + + ((TChordPanel*)m_pChordPanel)->EnableChordModify( false, -1, -1, -1 ); + ((TUseStylePanel*)m_pStylePanel)->SetSelectStage( -1 ); + ((TTrackPanel*)m_pTrackPanel)->SetSelTrack( -1, -1 ); + + ClearShowTracks(); + + int nBarDrawHeight = m_nTitleHeight; + + if( g_lstOpusStages.size()>0 ){ + nBarDrawHeight += m_nChordHeight; + } + + if( m_iMode==VIEW_INIT ){ + TShowTrack* pTrk = new TShowTrack( ST_AUDIO, 0, 0 ); + m_aTracks.push_back( pTrk ); + } + else{ + if( !m_bVertical ){ + for( int i=0; iIsHide() ){ + m_aTracks.push_back( new TShowTrack( ST_MIDI, i, g_aMidiTracks[i] ) ); + } + } + } + + for( int i=0; iIsHide() && !g_aAudioTracks[i]->lstBars.empty() ){ + m_aTracks.push_back( new TShowTrack( ST_AUDIO, i, g_aAudioTracks[i] ) ); + } + } + } + + nBarDrawHeight += m_nTrackHeight * m_aTracks.size(); + + if( nBarDrawHeight!=m_nBarDrawHeight ){ + m_nBarDrawHeight = nBarDrawHeight; + m_nBarHeight = m_nRowGapHeight + m_nBarDrawHeight; + } + + CalcViewArea(); + + if( bVertical ){ + if( m_nRowNum>m_nRowShow ){ + m_sbVert->SetRange( 0, m_nRowNum-1 ); + m_sbVert->SetPageSize( m_nRowShow ); + m_sbVert->SetPosition( 0 ); + + /* int iRowScroll = 0; + if( m_iBeginShowBar>0 ){ + iRowScroll = min( m_iBeginShowBar / m_nColumnNum, m_nRowNum-m_nRowShow ); + if( iRowScroll<0 ){ + iRowScroll = 0; + } + } + + ScrollView( iRowScroll ); +*/ + } + else{ + m_sbVert->SetRange( 0, 0, false ); + m_sbVert->SetPageSize( 0, false ); + m_sbVert->SetPosition( 0, false ); + } + + if( m_sbHoriz ){ + m_sbHoriz->SetRange( 0, 0, false ); + m_sbHoriz->SetPageSize( 0, false ); + m_sbHoriz->SetPosition( 0, false ); + } + + m_iBeginShowBar = 0; + m_iBeginShowTrack = 0; + m_nTrackShow = m_aTracks.size(); + } + else{ + GenerateCompose(); + + int nRange = m_nBarNum; + int nDrawWidth = ClientWidth - m_nLeftOriBound - m_nRightBound; + if( nDrawWidth % m_nBarWidth > 0 ) + nRange++; + + if( nRange>m_nColumnNum ){ + m_sbHoriz->SetRange( 0, nRange - 1 ); + m_sbHoriz->SetPageSize( m_nColumnNum ); + m_sbHoriz->SetPosition( 0 ); + +/* if( m_iBeginShowBar>0 ){ + ScrollView( m_iBeginShowBar, false ); + } +*/ + } + else{ + m_sbHoriz->SetRange( 0, 0, false ); + m_sbHoriz->SetPageSize( 0, false ); + m_sbHoriz->SetPosition( 0, false ); + } + + nRange = m_aTracks.size(); + int nDrawHeight = ClientHeight - m_nTopBound - m_nBottomBound + - m_nRowGapHeight - m_nTitleHeight - m_nChordHeight; + if( nDrawHeight % m_nTrackHeight > 0 ) + nRange++; + + if( nRange > m_nTrackShow ){ + m_sbVert->SetRange( 0, nRange-1 ); + m_sbVert->SetPageSize( m_nTrackShow ); + m_sbVert->SetPosition( 0 ); + } + else{ + m_sbVert->SetRange( 0, 0, false ); + m_sbVert->SetPageSize( 0, false ); + m_sbVert->SetPosition( 0, false ); + } + + m_nRowNum = m_nRowShow = 1; + m_iBeginShowRow = 0; + } + + InvalidateRgn( Handle, NULL, true ); + } + + ShowPlayPoint(); +} +//--------------------------------------------------------------------------- + +void TContentPanel::InitialVars( bool bClear ) +{ + ClearShowTracks(); + + int nBarNum = 0; + + if( bClear ){ + m_iDropBar = -1; + m_iCopyAudio = m_iDragAudio = -1; + m_iSelBarStart = m_iSelBarEnd = -1; + m_iSelCellStart = m_iSelCellEnd = -1; + m_iSelPointStart = m_iSelPointEnd = -1; + m_iCopyBarStart = m_iCopyBarEnd = -1; + m_iCopyCellStart = m_iCopyCellEnd = -1; + m_iCopyPointStart = m_iCopyPointEnd = -1; + m_iSelTrackBar = m_iSelTrackPoint = -1; + m_iPlayBar = m_iPlayPoint = 0; + m_bCut = false; + m_iBeginShowBar = m_iBeginShowTrack = 0; + } + else{ + int nBarDrawHeight = m_nTitleHeight; + + if( g_lstOpusStages.size()>0 ){ + nBarDrawHeight += m_nChordHeight; + nBarNum = GetBarCount(); + } + + if( m_iMode==VIEW_INIT && nBarNum==0 ){ + TShowTrack* pTrk = new TShowTrack( ST_AUDIO, 0, 0 ); + m_aTracks.push_back( pTrk ); + } + else{ + if( !m_bVertical ){ + for( int i=0; iIsHide() ){ + m_aTracks.push_back( new TShowTrack( ST_MIDI, i, g_aMidiTracks[i] ) ); + } + } + } + + for( int i=0; iIsHide() && !g_aAudioTracks[i]->lstBars.empty() ){ + m_aTracks.push_back( new TShowTrack( ST_AUDIO, i, g_aAudioTracks[i] ) ); + } + } + } + + nBarDrawHeight += m_nTrackHeight * m_aTracks.size(); + + if( nBarDrawHeight!=m_nBarDrawHeight ){ + m_nBarDrawHeight = nBarDrawHeight; + m_nBarHeight = m_nRowGapHeight + m_nBarDrawHeight; + } + } + + m_nBarNum = nBarNum; + CalcViewArea(); + + m_nChordTxtWidth = m_nDataWidth/g_nChordNumPerBar; + +// m_iBeginShowRow = 0; +// m_iBeginShowTrack = 0; + + SetScrollView( m_iBeginShowBar ); + + InvalidateRgn( Handle, NULL, false ); +} +//--------------------------------------------------------------------------- + +int TContentPanel::GetShowTrackId( int type, int index ) +{ + for( int i=0; itype==type && m_aTracks[i]->index==index ) + return i+1; + } + + return 0; +} +//--------------------------------------------------------------------------- + +bool TContentPanel::SetScrollView( int iFirstShowBar ) +{ + bool bScroll = false; + + m_iBeginShowBar = iFirstShowBar; + m_iBeginShowTrack = 0; + + if( m_bVertical ){ + if( m_nRowNum>m_nRowShow ){ //ʾ + m_sbVert->SetRange( 0, m_nRowNum-1 ); + m_sbVert->SetPageSize( m_nRowShow ); + m_sbVert->SetPosition( 0 ); + + int iRowScroll = 0; + if( iFirstShowBar>0 ){ + iRowScroll = min( iFirstShowBar / m_nColumnNum, m_nRowNum-m_nRowShow ); + if( iRowScroll<0 ){ + iRowScroll = 0; + } + } + + if( iRowScroll!=m_iBeginShowRow ) + bScroll = true; + + ScrollView( iRowScroll ); + } + else { + m_sbVert->SetRange( 0, 0, false ); + m_sbVert->SetPageSize( 0, false ); + m_sbVert->SetPosition( 0, false ); + + if( m_iBeginShowRow!=0 ){ + m_iBeginShowRow = 0; + m_iBeginShowBar = 0; + bScroll = true; + + InvalidateRgn( Handle, NULL, false ); + } + } + } + else{ + int nRange = m_nBarNum; + int nDrawWidth = ClientWidth - m_nLeftOriBound - m_nRightBound; + if( nDrawWidth % m_nBarWidth > 0 ) + nRange++; + + if( nRange>m_nColumnNum ){ //ʾ + m_sbHoriz->SetRange( 0, nRange - 1 ); + m_sbHoriz->SetPageSize( m_nColumnNum ); + m_sbHoriz->SetPosition( 0 ); + + if( m_iBeginShowBar>0 ){ + ScrollView( m_iBeginShowBar, false ); + } + } + else { + m_sbHoriz->SetRange( 0, 0, false ); + m_sbHoriz->SetPageSize( 0, false ); + m_sbHoriz->SetPosition( 0, false ); + } + + nRange = m_aTracks.size(); + int nDrawHeight = ClientHeight - m_nTopBound - m_nBottomBound + - m_nRowGapHeight - m_nTitleHeight - m_nChordHeight; + if( nDrawHeight % m_nTrackHeight > 0 ) + nRange++; + + if( nRange > m_nTrackShow ){ + m_sbVert->SetRange( 0, nRange-1 ); + m_sbVert->SetPageSize( m_nTrackShow ); + m_sbVert->SetPosition( 0 ); + } + else{ + m_sbVert->SetRange( 0, 0, false ); + m_sbVert->SetPageSize( 0, false ); + m_sbVert->SetPosition( 0, false ); + } + } + + return bScroll; +} +//--------------------------------------------------------------------------- + +void __fastcall TContentPanel::DoHandleMessage(MSG &Msg, bool &Handled) +{ + if( !Visible ) + return; + + if( Msg.message==WM_MOUSEMOVE && Msg.wParam==0 ){ + TPoint pt( Msg.pt.x, Msg.pt.y ); + pt = ScreenToClient( pt ); + + if( m_sbVert && m_sbVert->Visible && Msg.hwnd!=m_sbVert->Handle ) //ֱԶ + m_sbVert->Visible = false; + + if( m_sbHoriz && m_sbHoriz->Visible && Msg.hwnd!=m_sbHoriz->Handle ) //ˮƽԶ + m_sbHoriz->Visible = false; + + if( pt.x>=0 && pt.x=0 && pt.yCursor = crHSplit; + m_ApplicationEvents->CancelDispatch(); + } + } + else if( !m_bVertical && m_nLeftBound>=MIN_HDR_WIDTH && pt.yTop + && pt.x>m_nLeftBound-8 && pt.xCursor = crHSplit; + m_ApplicationEvents->CancelDispatch(); + } + else{ + if( Screen->Cursor==crHSplit ) + Screen->Cursor = crDefault; + + if( m_sbVert->IsOperable() && pt.x >= m_sbVert->Left + && pt.y >= m_sbVert->Top ){ //ֱԶʾ + m_sbVert->Visible = true; + m_ApplicationEvents->CancelDispatch(); + } + + if( m_sbHoriz->IsOperable() && pt.x >= m_sbHoriz->Left + && pt.y >= m_sbHoriz->Top ){ //ˮƽԶʾ + m_sbHoriz->Visible = true; + m_ApplicationEvents->CancelDispatch(); + } + } + } + else if( Screen->Cursor==crHSplit && (pt.x<0 || pt.y<0 || pt.y>=Height) ){ + Screen->Cursor = crDefault; + } + } + else if( Msg.message==WM_KEYDOWN && Msg.hwnd==Handle + && Msg.wParam>=VK_PRIOR && Msg.wParam<=VK_DOWN ){ + OnDirectionKey( Msg.wParam ); + } +} +//--------------------------------------------------------------------------- + +void TContentPanel::ShowBeatHint( int iBeat ) +{ + if( m_iBeatHint==iBeat ) + return; + + if( iBeat<0 || iBeat>3 ){ + iBeat = -1; + RECT rectHint; + SetRect( &rectHint, m_lBeatHint, m_tBeatHint, + m_lBeatHint + m_wBeatHint, + m_tBeatHint + m_hBeatHint ); + InvalidateRect( Handle, &rectHint, false ); + } + else{ + Canvas->Draw( m_lBeatHint, m_tBeatHint, m_imgBeatHint[iBeat] ); + } + + m_iBeatHint = iBeat; +} +// --------------------------------------------------------------------------- + +void TContentPanel::SetPlayPoint( int iBar, int iPoint ) +{ + if( m_iPlayBar==iBar && m_iPlayPoint==iPoint ){ + return; + } + + if( m_nBarNum==0 ){ + m_iPlayBar = m_iPlayPoint = 0; + return; + } + + int iRow = m_bVertical ? m_iPlayBar / m_nColumnNum - m_iBeginShowRow : 0; + if( m_nBarNum>0 && iRow>=0 ){ + RECT rect; + int iCol = m_bVertical ? m_iPlayBar % m_nColumnNum : m_iPlayBar - m_iBeginShowBar, + left = iCol * m_nBarWidth + m_iPlayPoint + m_nLeftBound, + top = iRow * m_nBarHeight + m_nTopBound + m_nRowGapHeight; + + SetRect( &rect, left - 5, top - 8, left - 5 + m_imgPlayCursor->Width, + top - 8 + m_imgPlayCursor->Height ); + InvalidateRect( Handle, &rect, false ); + + int nH = m_nBarDrawHeight; + if( top + m_nBarDrawHeight > ClientHeight - m_nBottomBound ) + nH = ClientHeight - m_nBottomBound - top; + + SetRect( &rect, left, top, left + 1, top + nH ); + InvalidateRect( Handle, &rect, false ); + } + + m_iPlayBar = iBar; + m_iPlayPoint = iPoint; + + ShowPlayPoint(); +} +//--------------------------------------------------------------------------- + +void TContentPanel::ShowPlayPoint() +{ + int iRow = m_bVertical ? m_iPlayBar / m_nColumnNum - m_iBeginShowRow : 0, + iCol = m_bVertical ? m_iPlayBar % m_nColumnNum : m_iPlayBar - m_iBeginShowBar; + + if( m_bVertical && iRow<0 ){ + ScrollView( iRow + m_iBeginShowRow ); + } + else if( m_bVertical && ( iRow>=m_nRowShow || m_nRowShow>1 && iRow>=m_nRowShow-1 )){ + //int nRowScroll = min( m_nRowShow+m_iBeginShowRow-1, m_nRowNum-iRow ); // ʾ2 + int nRow1 = iRow+m_iBeginShowRow, + nRow2 = m_nRowNum-m_nRowShow+1; + + if( m_nRowShow>2 ) + nRow1--; + + if( nRow1>=0 && nRow2>=0 ){ + int nRowScroll = min( nRow1, nRow2 ); // ʾ2 + ScrollView( nRowScroll ); + } + } + else if( !m_bVertical && iCol<0 ){ + ScrollView( iCol + m_iBeginShowBar, false ); + } + else if( !m_bVertical && iCol>=m_nColumnNum-1 ){ + //int nColScroll = min( m_iBeginShowBar+m_nColumnNum-2, m_nBarNum-m_nColumnNum+1 ); // ʾ2С + int nColScroll = min( m_iPlayBar-2, m_nBarNum-m_nColumnNum+1 ); // ʾ2С + ScrollView( nColScroll, false ); + } + else if( m_nBarNum>0 ){ + RECT rect; + int left = iCol * m_nBarWidth + m_iPlayPoint + m_nLeftBound, + top = iRow * m_nBarHeight + m_nTopBound + m_nRowGapHeight; + + SetRect( &rect, left - 5, top - 8, left - 5 + m_imgPlayCursor->Width, + top - 8 + m_imgPlayCursor->Height ); + InvalidateRect( Handle, &rect, false ); + + int nH = m_nBarDrawHeight; + if( top + m_nBarDrawHeight > ClientHeight - m_nBottomBound ) + nH = ClientHeight - m_nBottomBound - top; + + SetRect( &rect, left, top, left + 1, top + nH ); + InvalidateRect( Handle, &rect, false ); + } +} + +void TContentPanel::InvalidateBar( int iBar, int iBeginPoint, int iEndPoint, int iArea ) +{ + if( iBar=m_nRowShow || iCol>=m_nColumnNum ) + return; + + rectDraw.left = iCol * m_nBarWidth + m_nLeftBound + iBeginPoint - 1; + rectDraw.right = iCol * m_nBarWidth + m_nLeftBound + iEndPoint + 1; + + if( rectDraw.right>ClientWidth-m_nRightBound ) + rectDraw.right = ClientWidth-m_nRightBound; + + int nBarTop = iRow * m_nBarHeight + m_nTopBound, + nDrawBottom = ClientHeight - m_nBottomBound; + + bool bData = g_lstOpusStages.size()>0; + + if( iArea & BAR_TITLE ){ + rectDraw.top = nBarTop + m_nRowGapHeight; + + if( rectDraw.top < nDrawBottom ){ + rectDraw.bottom = rectDraw.top + m_nTitleHeight; + if( rectDraw.bottom > nDrawBottom ) + rectDraw.bottom = nDrawBottom; + + InvalidateRect( Handle, &rectDraw, false ); + } + } + + if( ( iArea & BAR_DATA ) && bData ){ + rectDraw.top = nBarTop + m_nRowGapHeight + m_nTitleHeight; + + if( rectDraw.top < nDrawBottom ){ + rectDraw.bottom = rectDraw.top + m_nChordHeight; + + if( rectDraw.bottom > nDrawBottom ) + rectDraw.bottom = nDrawBottom; + else if( !( iArea & BAR_TRACK ) ) + rectDraw.bottom++; + + InvalidateRect( Handle, &rectDraw, false ); + } + } + + if( iArea & BAR_TRACK ){ + int iTrack = ( iArea & 0xFF ) - m_iBeginShowTrack; + if( iTrack>=0 && iTrack<=m_nTrackShow ){ + if( iTrack>0 ){ + rectDraw.top = nBarTop + m_nRowGapHeight + m_nTitleHeight + (iTrack - 1) * m_nTrackHeight; + if( bData ) rectDraw.top += m_nChordHeight; + + rectDraw.bottom = rectDraw.top + m_nTrackHeight + 1; + } + else{ + rectDraw.top = nBarTop + m_nRowGapHeight + m_nTitleHeight; + if( bData ) rectDraw.top += m_nChordHeight; + + rectDraw.bottom = rectDraw.top + (m_aTracks.size()-m_iBeginShowTrack) * m_nTrackHeight + 1; + } + + if( rectDraw.top < nDrawBottom ){ + if( rectDraw.bottom > nDrawBottom ) + rectDraw.bottom = nDrawBottom; + + InvalidateRect( Handle, &rectDraw, false ); + } + } + } +} +//--------------------------------------------------------------------------- + +void TContentPanel::InvalidateBars( int iBarStart, int iBarEnd, int iArea ) +{ + for( int i=iBarStart; i<=iBarEnd; i++ ){ + InvalidateBar( i, 0, m_nBarWidth, iArea ); + } +} +//--------------------------------------------------------------------------- + +void TContentPanel::InvalidateStage( int iStage, int iArea ) +{ + if( iStage<0 || iStage>=g_lstOpusStages.size() ) + return; + + int iFirstBar = FirstBar( iStage ); + TOpusStage * pStage = g_lstOpusStages[iStage]; + + InvalidateBars( iFirstBar, iFirstBar + pStage->aBars.size() - 1, iArea ); +} +//--------------------------------------------------------------------------- + +void TContentPanel::InvalidateShowBars( int iArea ) +{ + int iBarS = m_iBeginShowBar, + iBarE = iBarS + m_nRowNum * m_nColumnNum; + + if( iBarE>m_nBarNum ) + iBarE = m_nBarNum-1; + + InvalidateBars( iBarS, iBarE, iArea ); +} +//--------------------------------------------------------------------------- + +void __fastcall TContentPanel::OnDirectionKey( WORD key ) +{ + if( m_nBarNum==0 ) + return; + + int nSBCode = -1; + int nWMCode = -1; + + if( key>=VK_PRIOR && key<=VK_HOME ){ + if( m_bVertical && m_sbVert && m_sbVert->IsOperable() ) + nWMCode = WM_VSCROLL; + else if( !m_bVertical && m_sbHoriz && m_sbHoriz->IsOperable() ) + nWMCode = WM_HSCROLL; + } + else if( key==VK_UP || key==VK_DOWN ){ + if( m_sbVert && m_sbVert->IsOperable() ) + nWMCode = WM_VSCROLL; + } + else if( key==VK_LEFT || key==VK_RIGHT ){ + if( m_sbHoriz && m_sbHoriz->IsOperable() ) + nWMCode = WM_HSCROLL; + } + + if( nWMCode>=0 ){ + if( key==VK_UP || key==VK_LEFT ) nSBCode = SB_LINEUP; + else if( key==VK_DOWN || key==VK_RIGHT ) nSBCode = SB_LINEDOWN; + else if( key==VK_PRIOR ) nSBCode = SB_PAGEUP; + else if( key==VK_NEXT ) nSBCode = SB_PAGEDOWN; + else if( key==VK_HOME ) nSBCode = SB_TOP; + else if( key==VK_END ) nSBCode = SB_BOTTOM; + + Perform( nWMCode, MAKELONG(nSBCode,0), NULL ); + } +} +//--------------------------------------------------------------------------- + +void TContentPanel::ScrollView( int nPos, bool bVertical, bool bRedraw ) +{ + if( bVertical ){ + if( m_bVertical ){ + m_iBeginShowBar = nPos * m_nColumnNum; + + if( m_iBeginShowRow!=nPos ){ + m_iBeginShowRow = nPos; + InvalidateRgn( Handle, NULL , false ); + } + } + else{ + if( m_iBeginShowTrack!=nPos ){ + m_iBeginShowTrack = nPos; + InvalidateRgn( Handle, NULL , false ); + } + } + + if( bRedraw ){ + m_sbVert->SetPosition( nPos ); + } + } + else{ + if( m_iBeginShowBar!=nPos ){ + m_iBeginShowBar = nPos; + + InvalidateRgn( Handle, NULL , false ); + } + + if( bRedraw ){ + m_sbHoriz->SetPosition( nPos ); + } + } +} +//--------------------------------------------------------------------------- +void TContentPanel::CalcViewArea() +{ + if( ClientWidth>0 && ClientHeight>0 ){ + if( m_bVertical ){ + m_nColumnNum = (ClientWidth - m_nLeftOriBound - m_nRightBound) / m_nBarWidth; + + m_nRowNum = m_nBarNum / m_nColumnNum; + if( m_nBarNum % m_nColumnNum > 0 ){ + m_nRowNum++; + } + + int nDrawHeight = ClientHeight - m_nTopBound - m_nBottomBound; + m_nRowShow = nDrawHeight / m_nBarHeight; + if( nDrawHeight % m_nBarHeight > m_nRowGapHeight + m_nTitleHeight ){ + m_nRowShow++; + m_nRowNum++; + } + + m_nLeftBound = m_nLeftOriBound + 3; + m_nTrackShow = m_aTracks.size(); + } + else{ + m_nLeftBound = m_aTracks.empty() ? m_nLeftOriBound + 3 : m_nTrkHdrWidth; + int nDrawWidth = ClientWidth - m_nLeftBound - m_nRightBound; + + m_nColumnNum = nDrawWidth / m_nBarWidth; + if( nDrawWidth % m_nBarWidth > 0 ) + m_nColumnNum++; + + + int nHeight = ClientHeight - m_nTopBound - m_nBottomBound + - m_nRowGapHeight - m_nTitleHeight - m_nChordHeight; + m_nTrackShow = nHeight / m_nTrackHeight; + if( nHeight % m_nTrackHeight > 0 ) + m_nTrackShow++; + + m_sbHoriz->Left = m_nLeftBound; + m_sbHoriz->Width = ClientWidth - m_nLeftBound - 1; + } + } + else{ + DebugPrint( "no area" ); + } +} +//--------------------------------------------------------------------------- + +void TContentPanel::DrawBars() +{ + bool bData = !g_lstOpusStages.empty(); + bool bTrack = !m_aTracks.empty(); + + if( !bData && !bTrack ) + return; + + TRect rtInvalid = Canvas->ClipRect; + + int iBeginRow = m_bVertical ? (rtInvalid.top - m_nTopBound) / m_nBarHeight : 0, + iEndRow = m_bVertical ? (rtInvalid.bottom - m_nTopBound) / m_nBarHeight : 1, + iBeginCol = ( rtInvalid.left - m_nLeftBound ) / m_nBarWidth, + iEndCol = ( rtInvalid.right - m_nLeftBound ) / m_nBarWidth; + +// if( !m_bVertical ){ + if( iBeginCol<0 ) + iBeginCol = 0; + + if( iEndCol<0 ) + iEndCol = 0; +// } + + if( iBeginRow<0 ) + iBeginRow = 0; + if( iEndCol 0 ) + iEndCol++; + if( m_bVertical && (rtInvalid.bottom - m_nTopBound) % m_nBarHeight > 2 ) + iEndRow++; + + int rowTop = m_nTopBound + iBeginRow * m_nBarHeight; + + iBeginRow += m_iBeginShowRow; + iEndRow += m_iBeginShowRow; + + int iSelBarStart = m_iSelBarStart, + iSelBarEnd = m_iSelBarEnd, + iSelPointStart = m_iSelPointStart, + iSelPointEnd = m_iSelPointEnd; + + if( iSelBarEnd>=0 && iSelBarStart<0 ){ + iSelBarStart = 0; + iSelPointStart = 0; + } + else if( iSelBarStart>=0 && iSelBarEnd<0 ){ + iSelBarEnd = m_nBarNum - 1; + iSelPointEnd = m_nDataWidth - 1; + } + + if( m_rgnClip ) + SelectClipRgn( Canvas->Handle, m_rgnClip ); + + int iFirstBar(0), iStage(0), nBarCount(0), iLastKey(g_iMelodyKey); + for( int i=iBeginRow; i0 || iEndCol>0 && iEndCol=m_nBarNum ) + break; + + if( bData && nBarCount>0 && nBarCountiSegType>=SEGTYPE_INTRO ) + iLastKey = pStage->iSegKey; + else + iLastKey = pStage->aBars[nBarCount-1-iFirstBar]->iBarKey; + } + } + + if( m_nBarNum - nBarCount >= m_nColumnNum ){ //ʾ + right = m_nColumnNum * m_nBarWidth + m_nLeftBound; + } + else{ //ʾ + right = (m_nBarNum - nBarCount) * m_nBarWidth + m_nLeftBound; + } + + //ƹ + if( bTrack ){ + int iBeginTrk = 0, + iEndTrk = m_aTracks.size(); + + if( !m_bVertical ){ + int iTrackTop = m_nTopBound + m_nRowGapHeight + m_nTitleHeight + m_nChordHeight; + iBeginTrk = (rtInvalid.top - iTrackTop) / m_nTrackHeight; + iEndTrk = (rtInvalid.bottom - iTrackTop) / m_nTrackHeight; + + if( iBeginTrk<0 ) + iBeginTrk = 0; + + if( iEndTrk<0 ) + iEndTrk = 0; + else if( iEndTrk 0) ) + iEndTrk++; + + iBeginTrk += m_iBeginShowTrack; + iEndTrk += m_iBeginShowTrack; + + if( iBeginTrk>m_aTracks.size() ) + iBeginTrk = m_aTracks.size(); + if( iEndTrk>m_aTracks.size() ) + iEndTrk = m_aTracks.size(); + } + + bool bBreak = bData, + bDrawHead = !m_bVertical && (rtInvalid.left < m_nLeftBound-4); + int topTrack = barTop + m_nTitleHeight + ( bData ? m_nChordHeight : 0 ) + + (iBeginTrk-m_iBeginShowTrack) * m_nTrackHeight, + leftTrack = bDrawHead ? m_nLeftOriBound : iBarLeft, + num = min( m_nBarNum - nBarCount, iEndCol - iBeginCol ); + + Canvas->Pen->Style = psSolid; + + for( int t=iBeginTrk; tPen->Color = clrBarTitle[0]; + + if( bDrawHead ){ + Canvas->MoveTo( leftTrack, topTrack ); + Canvas->LineTo( m_nLeftBound-4, topTrack ); + } + + Canvas->MoveTo( iBarLeft+1, topTrack ); + Canvas->LineTo( right, topTrack ); + + bBreak = false; + } + + DrawTrack( nBarCount, num, leftTrack, topTrack+1, t ); + + topTrack += m_nTrackHeight; + bBreak = true; + } + } + + Canvas->Font->Name = "SimHei"; + Canvas->Font->Size = g_szFont8; + Canvas->Font->Color = clrTitleFont; + + //ƵһС + Canvas->Pen->Color = clrBarTitle[0]; + Canvas->MoveTo( m_nLeftBound, barTop ); + Canvas->LineTo( m_nLeftBound, barBottom ); + + for( int j=iBeginCol; jPen->Style = psSolid; + + if( m_iMode==VIEW_STYLE && m_iSelTrack<0 + && ( m_iSelBarStart==nBarCount || m_iCopyBarStart==nBarCount )){ + Canvas->Pen->Color = clrFocus; + if( m_iCopyBarStart==nBarCount ){ + Canvas->Brush->Color = clBlack; + Canvas->Pen->Style = psDot; + } + + Canvas->MoveTo( iBarLeft, barTop ); + Canvas->LineTo( iBarLeft, barBottom ); + } + + if( ( iSelBarStart<=nBarCount && iSelBarEnd>=nBarCount + || m_iCopyBarStart<=nBarCount && m_iCopyBarEnd>=nBarCount ) + && m_iMode==VIEW_STYLE && m_iSelTrack<0 ){ + int l=iBarLeft+1, r=iBarLeft+m_nBarWidth+1; + + //ƸС + DrawBarTitle( l, r, barTop, true ); + + if( m_iMode==VIEW_STYLE ){ + Canvas->Pen->Color = clrFocus; + if( m_iCopyBarStart<=nBarCount && m_iCopyBarEnd>=nBarCount ){ + Canvas->Brush->Color = clBlack; + Canvas->Pen->Style = psDot; + } + } + else + Canvas->Pen->Color = clrBarTitle[0]; + } + else{ + //С + DrawBarTitle( iBarLeft+1, iBarLeft+m_nBarWidth+1, barTop, false ); + Canvas->Pen->Color = clrBarTitle[0]; + } + + // СϿ + Canvas->MoveTo( iBarLeft+1, barTop ); + Canvas->LineTo( iBarLeft+m_nBarWidth, barTop ); + + //СŻ + bool bDrawKey = false; + if( bData && nBarCountaBars.size() ){ + iStage++; + iFirstBar = nBarCount; + } + + TOpusStage* pStage = g_lstOpusStages[iStage]; + + int iKey = -1; + if( nBarCount==0 ){ + iKey = iLastKey; + bDrawKey = true; + } + else if( pStage->iSegType<=SEGTYPE_FILL ){ + iKey = pStage->aBars[nBarCount-iFirstBar]->iBarKey; + bDrawKey = iKey!=iLastKey; + } + else if( nBarCount==iFirstBar ){ + iKey = pStage->iSegKey; + bDrawKey = iKey!=iLastKey; + } + + if( bDrawKey ){ + strText = "1 = "; + strText += g_strMelodyKey[iKey]; + + iLastKey = iKey; + } + } + + if( !bDrawKey ) + strText = IntToStr(nBarCount+1); + + Canvas->Brush->Style = bsClear; + Canvas->TextOut( iBarLeft + 8, barTop + 4, strText ); + Canvas->Brush->Style = bsSolid; + + int iBarTop = barTop + m_nTitleHeight; + if( bData && nBarCountPen->Style = psSolid; + if( m_iMode==VIEW_STYLE && m_iSelTrack<0 + && ( m_iSelBarEnd==nBarCount || m_iCopyBarEnd==nBarCount )){ + Canvas->Pen->Color = clrFocus; + + if( m_iCopyBarEnd==nBarCount ){ + Canvas->Brush->Color = clBlack; + Canvas->Pen->Style = psDot; + } + } + else{ + Canvas->Pen->Color = clrBarTitle[0]; + } + + //С + Canvas->MoveTo( iBarLeft + m_nBarWidth, barTop ); + Canvas->LineTo( iBarLeft + m_nBarWidth, barTop + m_nTitleHeight ); + + if( j==m_nColumnNum-1 || nBarCount==m_nBarNum-1 ){ + Canvas->MoveTo( iBarLeft + m_nBarWidth, barTop + m_nTitleHeight ); + Canvas->LineTo( iBarLeft + m_nBarWidth, barTop + m_nBarDrawHeight ); + } + else if( bData ){ + Canvas->MoveTo( iBarLeft + m_nBarWidth, barTop + m_nTitleHeight ); + Canvas->LineTo( iBarLeft + m_nBarWidth, barTop + m_nTitleHeight + m_nChordHeight ); + } + + //Ʋ + if( m_iPlayBar==nBarCount ){ + int iPlayPoint = iBarLeft + m_iPlayPoint; + + if( iPlayPoint-5>=rtInvalid.left && iPlayPoint+5=rtInvalid.top ){ + Canvas->Draw( iPlayPoint - 5, barTop - 8, m_imgPlayCursor ); + } + + if( iPlayPoint>=rtInvalid.left && iPlayPointPen->Color; + Canvas->Pen->Color = clrPlayLine; + Canvas->Pen->Style = psSolid; + Canvas->MoveTo( iPlayPoint, barTop+1 ); + Canvas->LineTo( iPlayPoint, barBottom ); + Canvas->Pen->Color = clrOld; + } + } + + //Ƶ + if( g_iSelAudio>=0 && nBarCount==m_iSelTrackBar ){ + int l = iBarLeft + m_iSelTrackPoint, + t = iBarTop + ( GetShowTrackId(ST_AUDIO,g_iSelAudio) - 1 ) * m_nTrackHeight, + b = t + m_nTrackHeight; + + if( l>=rtInvalid.left && lPen->Color = clrInsertLine; + + Canvas->MoveTo( l, t ); + Canvas->LineTo( l, b ); + } + } + + // С¿ + if( barTop+m_nBarDrawHeight <= barBottom ){ + Canvas->Pen->Color = clrBarTitle[0]; + Canvas->MoveTo( iBarLeft, barTop + m_nBarDrawHeight ); + Canvas->LineTo( iBarLeft+m_nBarWidth, barTop + m_nBarDrawHeight ); + } + + if( w_bDraging ){ + Canvas->Pen->Style = psSolid; + + TRect rcTip; + rcTip.left = iBarLeft, + rcTip.top = barTop, + rcTip.right = iBarLeft+m_nBarWidth, + rcTip.bottom = barTop + m_nBarDrawHeight - 1; + + if( rcTip.bottom > barBottom ){ + rcTip.bottom = barBottom; + } + + if( nBarCount==m_iDropBar ){ + rcTip.right = rcTip.left + DOTIP_WIDTH; + + Canvas->Brush->Color = clrFocback; + Canvas->FillRect( rcTip ); + + Canvas->Pen->Color = clrFocus; + + Canvas->MoveTo( rcTip.left, rcTip.top ); + Canvas->LineTo( rcTip.right, rcTip.top ); + + Canvas->MoveTo( rcTip.left, rcTip.bottom ); + Canvas->LineTo( rcTip.right, rcTip.bottom ); + + Canvas->MoveTo( rcTip.right, rcTip.top ); + Canvas->LineTo( rcTip.right, rcTip.bottom ); + } + + if( nBarCount==m_iDropBar-1 ){ + rcTip.left = rcTip.right - DOTIP_WIDTH; + + Canvas->Brush->Color = clrFocback; + Canvas->FillRect( rcTip ); + + Canvas->Pen->Color = clrFocus; + + Canvas->MoveTo( rcTip.left, rcTip.top ); + Canvas->LineTo( rcTip.right, rcTip.top ); + + Canvas->MoveTo( rcTip.left, rcTip.bottom ); + Canvas->LineTo( rcTip.right, rcTip.bottom ); + + Canvas->MoveTo( rcTip.left, rcTip.top ); + Canvas->LineTo( rcTip.left, rcTip.bottom ); + } + } + + nBarCount++; + iBarLeft += m_nBarWidth; + } + + rowTop += m_nBarHeight; + } +} +//--------------------------------------------------------------------------- + +void TContentPanel::DrawBarTitle( int l, int r, int t, bool bSel ) +{ + Canvas->Pen->Style = psSolid; + + for( int i=0; iPen->Color = clrBarTitleSel[i]; + else + Canvas->Pen->Color = clrBarTitle[i]; + Canvas->MoveTo( l, t+i ); + Canvas->LineTo( r, t+i ); + } +} +//--------------------------------------------------------------------------- + +void TContentPanel::DrawBarData( int iBar, int iStage, int iFirstBar, int leftBar, int topBar ) +{ + TColor clrOld = Canvas->Brush->Color; + + // + TRect rectBar; + rectBar.left = leftBar + 1; + rectBar.right = leftBar + m_nDataWidth; + rectBar.top = topBar; + rectBar.bottom = rectBar.top + m_nChordHeight; + + COLORREF clrNormal; + + TOpusStage* pStage = g_lstOpusStages[iStage]; + + { + int ty = pStage->iSegType, + iNo = g_iSegColorMode==0 ? pStage->iSegNo : pStage->aTracks.size(); + bool bInc = g_iSegColorMode==0 ? true + : iNo>0 && pStage->aTracks[0]->iChanNo==9; + + Canvas->Brush->Color = GetSegmentColor( ty, iNo, bInc ); + } + + Canvas->FillRect( rectBar ); + + //ѡп + if( m_iMode==VIEW_CHORD ){ + if ( iBar>=m_iSelBarStart && iBar<=m_iSelBarEnd ){ //ѡкҿ + int l = leftBar, + r = leftBar + m_nDataWidth, + t = topBar, + b = topBar + m_nChordHeight - 1; + + BYTE rF = 227, gF = 24, bF = 19, + rD = 110, gD = 108, bD = 105, + rL = 230, gL = 226, bL = 217; + + if( iBar==m_iSelBarStart ) //λ + l += m_iSelCellStart * m_nChordTxtWidth; + if( iBar==m_iSelBarEnd ){ //ҿλ + r = leftBar + (m_iSelCellEnd+1) * m_nChordTxtWidth; + + if( m_iSelCellEnd==g_nChordNumPerBar-1 ) + r--; + } + + for( int i=0; i<4; i++ ){ + if( i==0 ) + Canvas->Pen->Color = RGB(rF, gF, bF); + + if( i<2 ){ + //¿ + if( i>0 ){ + Canvas->Pen->Color = RGB(rL, gL, bL); + rL -= 10, gL -= 10, bL -= 10; + } + + Canvas->MoveTo( l+i, b-i ); + Canvas->LineTo( r-i+1, b-i ); + + if( iBar==m_iSelBarEnd ){ //ҿ + Canvas->MoveTo( r-i, t+i ); + Canvas->LineTo( r-i, b-i+1 ); + } + } + + if( i>0 ){ + Canvas->Pen->Color = RGB(rD, gD, bD); + rD += 30, gD += 30, bD += 30; + } + //Ͽ + Canvas->MoveTo( l+i, t+i ); + Canvas->LineTo( r-i+1, t+i ); + + if( iBar==m_iSelBarStart ){ // + Canvas->MoveTo( l+i, t+i ); + Canvas->LineTo( l+i, b-i+1 ); + } + } + } + + if( iBar>=m_iCopyBarStart && iBar<=m_iCopyBarEnd ){ + int l = leftBar, + r = leftBar + m_nDataWidth, + t = topBar, + b = topBar + m_nChordHeight - 1; + + Canvas->Brush->Color = clWhite; + Canvas->Pen->Style = psDot; + Canvas->Pen->Color = clRed; + + if( iBar==m_iCopyBarStart ){ // + l += m_iCopyCellStart * m_nChordTxtWidth; + if( m_iCopyCellStart==0 ){ + Canvas->Brush->Color = clBlack; + } + + Canvas->MoveTo( l, t ); + Canvas->LineTo( l, b ); + + if( m_iCopyCellStart==0 ){ + Canvas->Brush->Color = clWhite; + } + } + + if( iBar==m_iCopyBarEnd ){ //ҿ + r = leftBar + (m_iCopyCellEnd+1) * m_nChordTxtWidth; + if( m_iCopyCellEnd==g_nChordNumPerBar-1 ) + r--; + + Canvas->MoveTo( r, t ); + Canvas->LineTo( r, b ); + } + + //¿ + Canvas->MoveTo( l, t ); + Canvas->LineTo( r, t ); + Canvas->MoveTo( l, b ); + Canvas->LineTo( r, b ); + } + } + + // + if( pStage->iSegType>=SEGTYPE_INTRO ) //ǰβƺ + return; + + TBar * pBar = pStage->aBars[iBar-iFirstBar]; + + TRect rectDest; + rectDest.top = topBar + ( m_nChordHeight - m_nChordTxtHeight ) / 2; + rectDest.bottom = rectDest.top + m_nChordTxtHeight; + + int iPreKey = -1, iPreType = -1; + for( int i=0; iaChords.iKey[i] != iPreKey + || pBar->aChords.iType[i] != iPreType ){ + rectDest.left = leftBar + i * m_nChordTxtWidth; + rectDest.right = rectDest.left + m_nChordTxtWidth; + + DrawChord( rectDest, pBar->iBarKey, pBar->aChords.iKey[i], + pBar->aChords.iType[i] ); + + iPreKey = pBar->aChords.iKey[i]; + iPreType = pBar->aChords.iType[i]; + } + } + + //ʻԭ + Canvas->Brush->Color = clrOld; +} +//--------------------------------------------------------------------------- + +void TContentPanel::DrawTrack( int iBarS, int nBarNum, int left, int top, int iTrack ) +{ + bool bDrawHead = !m_bVertical && (left < m_nLeftBound-4); + int leftBar = bDrawHead ? m_nLeftBound : left; + + TColor clrOld = Canvas->Brush->Color; + TShowTrack* pST = m_aTracks[iTrack]; + COLORREF clrUnselect = clrWaveBk[0], + clrSelect = clrWaveBk[1], + clrHigh = clWhite; + + Canvas->Font->Name = "Tohoma"; + Canvas->Font->Size = g_szFont9; +// Canvas->Font->Color = clrHeadFont; + + if( bDrawHead ){ + TRect rectHead( m_nLeftOriBound, top, m_nLeftBound-4, top+m_nTrackHeight-1 ); + + if( m_iSelTrack==iTrack ) + Canvas->Brush->Color = clrSelect; + else + Canvas->Brush->Color = clrUnselect; + + Canvas->FillRect( rectHead ); + + TBitmap* pImg = pST->type==ST_MIDI ? m_imgMidiIcon : m_imgWaveIcon; + + Canvas->Draw( m_nLeftOriBound + 2, top + 2, pImg ); + + String strText; + if( pST->type==ST_MIDI ){ + strText = IntToStr( pST->index + 1 ) + " "; + + TMidiTrack* pMT = (TMidiTrack*)pST->pTrack; + + strText += GetProgName( pMT->bank, pMT->chno, pMT->prog ); + } + else{ + strText = " " + IntToStr( pST->index==0 ? 1 : pST->index ); + } + + //----ַ------ + int nWidth = m_nLeftBound - m_nLeftOriBound - pImg->Width - 12 - 16; + if( Canvas->TextWidth( strText )>nWidth ){ + UnicodeString strShorty = strText; + while( Canvas->TextWidth( strShorty )>nWidth ){ + strShorty = strShorty.SubString( 1, strShorty.Length()-2 ); + } + + strText = strShorty; + strText+="..."; + } + //----------- + Canvas->Brush->Style = bsClear; + Canvas->Font->Color = clrHeadFont; + Canvas->TextOut( m_nLeftOriBound + pImg->Width + 4, top + 2, strText ); + Canvas->Brush->Style = bsSolid; + + if( pST->iHover & TRACK_S_HOVER ){ + if( pST->pTrack->IsSolo() ) + Canvas->Brush->Color = clrSMState[3]; + else + Canvas->Brush->Color = clrSMState[1]; + } + else if( pST->pTrack->IsSolo() ) + Canvas->Brush->Color = clrSMState[2]; + else + Canvas->Brush->Color = clrSMState[0]; + + TRect rtSM( m_nTrkHdrWidth+SOLO_LEFT, top+SM_TOP, m_nTrkHdrWidth+SOLO_LEFT+SM_SIZE, top+SM_TOP+SM_SIZE ); + Canvas->FillRect( rtSM ); + Canvas->Brush->Color = clrHeadFont; + Canvas->FrameRect( rtSM ); + + Canvas->Font->Name = "SimHei"; + Canvas->Font->Size = g_szFont8; + + Canvas->Brush->Style = bsClear; + Canvas->TextOut( rtSM.left + 4, rtSM.top + 2, "S" ); + Canvas->Brush->Style = bsSolid; + + rtSM.left = m_nTrkHdrWidth+MUTE_LEFT; + rtSM.right = m_nTrkHdrWidth+MUTE_LEFT + SM_SIZE; + if( pST->iHover & TRACK_M_HOVER ){ + if( pST->pTrack->IsMute() ) + Canvas->Brush->Color = clrSMState[3]; + else + Canvas->Brush->Color = clrSMState[1]; + } + else if( pST->pTrack->IsMute() ) + Canvas->Brush->Color = clrSMState[2]; + else + Canvas->Brush->Color = clrSMState[0]; + + Canvas->FillRect( rtSM ); + Canvas->Brush->Color = clrHeadFont; + Canvas->FrameRect( rtSM ); + + Canvas->Brush->Style = bsClear; + Canvas->TextOut( rtSM.left + 4, rtSM.top + 2, "M" ); + Canvas->Brush->Style = bsSolid; + } + + if( nBarNum==0 ) + return; + + // + TRect rectBar; + rectBar.left = leftBar; + rectBar.right = rectBar.left + nBarNum * m_nDataWidth; + rectBar.top = top; + rectBar.bottom = rectBar.top + m_nTrackHeight - 1; + + if( rectBar.bottom > ClientHeight - m_nBottomBound ) + rectBar.bottom = ClientHeight - m_nBottomBound; + + int iBarE = iBarS + nBarNum - 1; + + if( m_iMode==VIEW_INIT ){ + if( iBarS==0 ){ + TRect rtNor = rectBar; + rtNor.right = rectBar.left + m_nDataWidth; + + Canvas->Brush->Color = clrSelect; + Canvas->FillRect( rtNor ); + + rectBar.left += m_nDataWidth; + } + + if( rectBar.right>rectBar.left ){ + Canvas->Brush->Color = clrHigh; + + if( rectBar.right > ClientWidth - m_nRightBound ) + rectBar.right = ClientWidth - m_nRightBound; + + Canvas->FillRect( rectBar ); + } + } + else if( m_iMode==VIEW_CHORD || m_iSelBarStart<0 && m_iSelBarEnd<0 || iBarE=0 && iBarS>m_iSelBarEnd ) ){ + if( m_iSelTrack==iTrack ) + Canvas->Brush->Color = clrSelect; + else + Canvas->Brush->Color = clrUnselect; + + if( rectBar.right > ClientWidth - m_nRightBound ) + rectBar.right = ClientWidth - m_nRightBound; + + Canvas->FillRect( rectBar ); + } + else{ + if( m_iSelTrack==iTrack ) + Canvas->Brush->Color = clrSelect; + else + Canvas->Brush->Color = clrUnselect; + + if( iBarS<=m_iSelBarStart ){ + TRect rtNor = rectBar; + rtNor.right = rectBar.left + ( m_iSelBarStart - iBarS ) * m_nDataWidth + + m_iSelPointStart; + if( rtNor.right>rtNor.left ){ + if( rtNor.right > ClientWidth - m_nRightBound ) + rtNor.right = ClientWidth - m_nRightBound; + + Canvas->FillRect( rtNor ); + rectBar.left = rtNor.right; + } + } + + if( m_iSelBarEnd>=0 && iBarE>=m_iSelBarEnd ){ + TRect rtNor = rectBar; + rtNor.left = rectBar.right - ( iBarE - m_iSelBarEnd + 1 ) * m_nDataWidth + + m_iSelPointEnd; + if( rtNor.right>rtNor.left ){ + if( rtNor.right > ClientWidth - m_nRightBound ) + rtNor.right = ClientWidth - m_nRightBound; + + Canvas->FillRect( rtNor ); + rectBar.right = rtNor.left; + } + } + + if( rectBar.right>rectBar.left ){ + if( m_iDragAudio<0 && ( m_iSelTrack==iTrack || m_iSelTrack<0 ) + || pST->type==ST_AUDIO && m_iDragAudio==pST->index ) + Canvas->Brush->Color = clrHigh; + + if( rectBar.right > ClientWidth - m_nRightBound ) + rectBar.right = ClientWidth - m_nRightBound; + + Canvas->FillRect( rectBar ); + } + } + + if( pST->type==ST_AUDIO ) + DrawRowWave( iBarS, nBarNum, leftBar, top, pST->index ); + else + DrawRowMidi( iBarS, nBarNum, leftBar, top, pST->index ); + + //ʻԭ + Canvas->Brush->Color = clrOld; +} +//--------------------------------------------------------------------------- + +void TContentPanel::DrawRowWave( int iBarS, int nBarNum, int left, int top, int iWave ) +{ + //Ʋ + TAudioTrack* pTrack = g_aAudioTracks[iWave]; + + int iBarE = iBarS + nBarNum - 1, + lWave = left, + hE = 1; + + int mid = top + m_nTrackHeight/2 + 1; + + for( int i=0; ilstBars[iWvBar]; + + for( int k=0; kaVols[k]>0 && pBar->aVols[k]<=0x80008000 ){ + DWORD wLeft = LOWORD(pBar->aVols[k]), + wRight = HIWORD(pBar->aVols[k]); + + int yBottom = mid + ((14 * wRight )/0x8000), + yTop = mid - ((14 * wLeft )/0x8000); + + if( yBottom>yTop ){ + if( m_iMode==VIEW_INIT || m_iMode!=VIEW_CHORD + &&( m_iDragAudio==iWave || m_iDragAudio<0 + && ( g_iSelAudio==iWave || m_iSelTrack<0 ) + && m_iSelBarStart>=0 && m_iSelBarEnd>=0 ) + &&( iWvBar>m_iSelBarStart + || iWvBar==m_iSelBarStart && k>=m_iSelPointStart ) + && ( m_iSelBarStart>0 && m_iSelBarEnd<0 + || iWvBarPen->Color = clrWave[0]; + else + Canvas->Pen->Color = clrWave[1]; + + Canvas->MoveTo( lWave+k, yTop ); + Canvas->LineTo( lWave+k, yBottom ); + } + } + } + + lWave += m_nDataWidth; + } + + //ƸƱ߿ + if( m_iCopyAudio==iWave && iBarS<=m_iCopyBarEnd && iBarE>=m_iCopyBarStart ){ + int l = left, + r = left + nBarNum * m_nDataWidth, + t = top, + b = top + m_nTrackHeight - 2; + + Canvas->Pen->Style = psDot; + Canvas->Pen->Color = clRed; + + if( iBarS<=m_iCopyBarStart ){ // + l += ( m_iCopyBarStart - iBarS ) * m_nDataWidth + m_iCopyPointStart; + + Canvas->MoveTo( l, t ); + Canvas->LineTo( l, b ); + } + + if( iBarE>=m_iCopyBarEnd ){ //ҿ + r -= ( iBarE - m_iCopyBarEnd + 1 ) * m_nDataWidth - m_iCopyPointEnd; + + Canvas->MoveTo( r, t ); + Canvas->LineTo( r, b ); + } + + //¿ + Canvas->MoveTo( l, t ); + Canvas->LineTo( r, t ); + Canvas->MoveTo( l, b ); + Canvas->LineTo( r, b ); + + Canvas->Pen->Style = psSolid; + } +} +//--------------------------------------------------------------------------- + +void TContentPanel::DrawRowMidi( int iBarS, int nBarNum, int left, int top, int iTrack ) +{ + //MIDI + TMidiTrack* pTrack = g_aMidiTracks[iTrack]; + + int iBarE = iBarS + nBarNum, + iTickS = iBarS * POINTS_PER_BAR, + iTickE = iBarE * POINTS_PER_BAR, + iSelS = m_iSelBarStart>=iBarS ? (m_iSelBarStart-iBarS) * POINTS_PER_BAR : -1, + iSelE = m_iSelBarEnd>=iBarS ? (m_iSelBarEnd-iBarS) * POINTS_PER_BAR + m_iSelPointEnd: -1; + + int bottom = top + m_nTrackHeight - 3; + + for( int i=0; iaNotes.size(); i++ ){ + if( pTrack->ptMax < pTrack->ptMin ) + continue; + + TMidiNote* pNote = pTrack->aNotes[i]; + int range = pTrack->ptMax - pTrack->ptMin; + if( range<26 ) + range = 26; + + if( pNote->tkOn < pNote->tkOff && pNote->tkOn < iTickE && pNote->tkOff > iTickS ){ + int iL = max( pNote->tkOn, iTickS ) - iTickS, + iR = min( pNote->tkOff, iTickE ) - iTickS, + iH = bottom - 26 * (pNote->pitch - pTrack->ptMin) / range; + + int vol = pNote->volume * pTrack->volume / 100; + Canvas->Pen->Color = g_Midi.GetNoteColor( vol ); + + if( iLiL ){ + Canvas->MoveTo( iL+left, iH ); + Canvas->LineTo( iT+left, iH ); + + iL = iT; + } + } + + if( iSelE>0 && iR>iSelE ){ + int iT = max( iSelE, iL ); + + if( iTMoveTo( iT+left, iH ); + Canvas->LineTo( iR+left, iH ); + + iR = iT; + } + } + + if( iR > iL ){ + if( m_iMode!=VIEW_CHORD && ( iSelS>=0 || iSelE>=0 ) && m_iDragAudio<0 + && ( m_iSelTrack==iTrack || m_iSelTrack<0 ) ) + Canvas->Pen->Color = clrWave[0]; + + Canvas->MoveTo( iL+left, iH ); + Canvas->LineTo( iR+left, iH ); + } + } + } +} + +void __fastcall TContentPanel::Paint() +{ + DrawBars(); + + if( w_bDraging ){ + //ư͸ͼƬ + TBlendFunction Blend; + Blend.BlendOp = AC_SRC_OVER; + Blend.BlendFlags = 0; + Blend.AlphaFormat = 0; + Blend.SourceConstantAlpha =135; + + TPoint pt(w_xImgDrag, w_yImgDrag); + pt = ScreenToClient( pt ); + + ::AlphaBlend (Canvas->Handle, + pt.X, + pt.Y, + w_imgDrag->Width, + w_imgDrag->Height, + w_imgDrag->Canvas->Handle, + 0, + 0, + w_imgDrag->Width, + w_imgDrag->Height, + Blend + ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TContentPanel::WMEraseBkgnd(TWMEraseBkgnd &Message) +{ + TRect rect = GetClientRect(); + + TCanvas* tempCanvas = new TCanvas; + tempCanvas->Handle = Message.DC; + + //Ƶɫ + tempCanvas->Brush->Color = clrBackground; + tempCanvas->FillRect( rect ); + + //߿ + tempCanvas->Brush->Color = clrBackboard; + tempCanvas->FrameRect(rect); + + if( !m_bVertical && m_nLeftBound==m_nTrkHdrWidth ){ + //ƹͷ + TRect rectHead = rect; + rectHead.right = m_nTrkHdrWidth; + +// rectHead.bottom = m_nTopBound+m_nRowGapHeight+m_nTitleHeight+m_nChordHeight; + tempCanvas->Brush->Color = RGB( 58, 62, 69 ); + tempCanvas->FillRect( rectHead ); + +// rectHead.top = rectHead.bottom; +// rectHead.bottom = rect.bottom; +// rectHead.left = TRK_HDR_WIDTH-4; + +// tempCanvas->FillRect( rectHead ); + + tempCanvas->Brush->Color = clrBackboard; + tempCanvas->FrameRect( rectHead ); +// rectHead.top = rect.top; + } + + delete tempCanvas; + + Message.Result = true; +} +//--------------------------------------------------------------------------- + +void __fastcall TContentPanel::WMSize(TWMSize &Message) +{ + DefaultHandler( &Message ); + + CalcViewArea(); + + if( m_rgnClip ){ + ::DeleteObject( m_rgnClip ); + } + + m_rgnClip = ::CreateRectRgn( 0, 0, ClientWidth - m_nRightBound, + ClientHeight - m_nBottomBound ); + + m_lBeatHint = (ClientWidth - m_wBeatHint) / 2; + m_tBeatHint = (ClientHeight - m_hBeatHint) / 2; + + if( !m_sbVert || !m_sbHoriz ) + return; + + m_sbVert->Left = ClientWidth - m_sbVert->Width - 1; + m_sbVert->Height = ClientHeight - 2; + + m_sbHoriz->Top = ClientHeight - m_sbHoriz->Height - 1; + m_sbHoriz->Width = ClientWidth - m_nLeftBound - 1; + + if( m_bVertical ){ + if( m_nRowNum>m_nRowShow ){ + m_sbVert->SetRange( 0, m_nRowNum-1 ); + m_sbVert->SetPageSize( m_nRowShow ); + m_sbVert->SetPosition( 0 ); + + int iRowScroll = 0; + if( m_iBeginShowBar>0 ){ + iRowScroll = min( m_iBeginShowBar / m_nColumnNum, m_nRowNum-m_nRowShow ); + if( iRowScroll<0 ){ + iRowScroll = 0; + } + } + + ScrollView( iRowScroll ); + } + else{ + m_sbVert->SetRange( 0, 0, false ); + m_sbVert->SetPageSize( 0, false ); + m_sbVert->SetPosition( 0, false ); + + if( m_iBeginShowBar>0 ) + ScrollView( 0 ); + } + } + else{ + int nRange = m_aTracks.size(); + int nDrawHeight = ClientHeight - m_nTopBound - m_nBottomBound + - m_nRowGapHeight - m_nTitleHeight - m_nChordHeight; + if( nDrawHeight % m_nTrackHeight > 0 ) + nRange++; + + if( nRange > m_nTrackShow ){ + m_sbVert->SetRange( 0, nRange-1 ); + m_sbVert->SetPageSize( m_nTrackShow ); + m_sbVert->SetPosition( 0 ); + + int iRowScroll = 0; + if( m_iSelTrack-m_iBeginShowTrack>=m_nTrackShow ){ + iRowScroll = m_iSelTrack - m_nTrackShow + 1; + } + else if( m_iBeginShowTrack>0 ){ + iRowScroll = min( m_iBeginShowTrack, nRange-m_nTrackShow ); + if( iRowScroll<0 ){ + iRowScroll = 0; + } + } + + ScrollView( iRowScroll ); + } + else{ + m_sbVert->SetRange( 0, 0, false ); + m_sbVert->SetPageSize( 0, false ); + m_sbVert->SetPosition( 0, false ); + + if( m_iBeginShowTrack>0 ) + ScrollView( 0 ); + } + + nRange = m_nBarNum; + int nDrawWidth = ClientWidth - m_nLeftOriBound - m_nRightBound; + if( nDrawWidth % m_nBarWidth > 0 ) + nRange++; + + if( nRange>m_nColumnNum ){ + m_sbHoriz->SetRange( 0, nRange - 1 ); + m_sbHoriz->SetPageSize( m_nColumnNum ); + m_sbHoriz->SetPosition( 0 ); + + int iRowScroll = 0; + if( m_iBeginShowBar>0 ){ + iRowScroll = min( m_iBeginShowBar, nRange-m_nColumnNum ); + if( iRowScroll<0 ){ + iRowScroll = 0; + } + } + + ScrollView( iRowScroll, false ); + } + else{ + m_sbHoriz->SetRange( 0, 0, false ); + m_sbHoriz->SetPageSize( 0, false ); + m_sbHoriz->SetPosition( 0, false ); + + if( m_iBeginShowBar>0 ) + ScrollView( 0, false ); + } + } +} +//--------------------------------------------------------------------------- + +void __fastcall TContentPanel::WMVScroll(TWMScroll &Message) +{ + if( m_sbVert && m_sbVert->IsOperable() ) + OnWMScroll( Message, true ); +} +//--------------------------------------------------------------------------- + +void __fastcall TContentPanel::WMHScroll(TWMScroll &Message) +{ + if( m_sbHoriz && m_sbHoriz->IsOperable() ) + OnWMScroll( Message, false ); +} +//--------------------------------------------------------------------------- + +void TContentPanel::OnWMScroll(TWMScroll &Message, bool bVertical) +{ + TSkinScrollBar* pSB = bVertical ? m_sbVert : m_sbHoriz; + int minpos, maxpos, page, curpos; + pSB->GetScrollRange(&minpos, &maxpos); + page = pSB->GetPageSize(); + // Get the current position of scroll box. + curpos = pSB->GetScrollPos(); + + // Determine the new position of scroll box. + switch (Message.ScrollCode) + { + case SB_TOP: // Scroll to far top. + curpos = minpos; + break; + + case SB_BOTTOM: // Scroll to far bottom. + curpos = maxpos-page+1; + break; + + case SB_ENDSCROLL: // End scroll. + break; + + case SB_LINEUP: // Scroll left. + if (curpos > minpos) + curpos--; + break; + + case SB_LINEDOWN: // Scroll right. + if (curpos < maxpos-page+1) + curpos++; + break; + + case SB_PAGEUP: // Scroll one page left. + if (curpos > minpos) + curpos = max(minpos, curpos-page); + break; + + case SB_PAGEDOWN: // Scroll one page right. + if( curposHandle ) + pSB->SetPosition(curpos); + + ScrollView(curpos, bVertical, FALSE); + + Message.Result = true; +} +//--------------------------------------------------------------------------- + +void __fastcall TContentPanel::WMMouseWheel(TWMMouseWheel &Message) +{ + if( m_sbVert && m_sbVert->IsOperable() ){ + UINT nSBCode; + + if( Message.WheelDelta>0 ) nSBCode = SB_LINEUP; + else nSBCode = SB_LINEDOWN; + + Perform( WM_VSCROLL, MAKELONG(nSBCode,0), NULL ); + } + else if( m_sbHoriz && m_sbHoriz->IsOperable() ){ + UINT nSBCode; + + if( Message.WheelDelta>0 ) nSBCode = SB_LINEUP; + else nSBCode = SB_LINEDOWN; + + Perform( WM_HSCROLL, MAKELONG(nSBCode,0), NULL ); + } +} +//--------------------------------------------------------------------------- + +DWORD TContentPanel::HitTest( int X, int Y, int& iHitType, bool bHead ) +{ + iHitType = -1; + + if( X<0 || X >= m_nColumnNum*m_nBarWidth+m_nLeftBound || Y <= m_nTopBound + || Y >= ClientHeight - m_nBottomBound + || Y >= (m_nRowNum-m_iBeginShowRow)*m_nBarHeight+m_nTopBound ){ + return -1; + } + else if( X <= m_nLeftBound ){ + if( bHead && Y > m_nTopBound+m_nRowGapHeight+m_nTitleHeight+m_nChordHeight ){ + int nTop = m_nTopBound+m_nRowGapHeight+m_nTitleHeight+m_nChordHeight; + + for( int i=m_iBeginShowTrack; i=nTop && Y<=nBottom ){ + int iBoxType=BAR_LEFT, nSMTop=nTop+SM_TOP, + lBox = 0, tBox = nTop ; + + if( Y>=nSMTop && Y<=nSMTop+SM_SIZE ){ + if( X>=m_nTrkHdrWidth+MUTE_LEFT + && X<=m_nTrkHdrWidth+MUTE_LEFT+SM_SIZE ){ + iBoxType = HOVER_MUTE; + lBox = m_nTrkHdrWidth+MUTE_LEFT; + tBox += SM_TOP; + } + else if( X>=m_nTrkHdrWidth+SOLO_LEFT + && X<=m_nTrkHdrWidth+SOLO_LEFT+SM_SIZE ){ + iBoxType = HOVER_SOLO; + lBox = m_nTrkHdrWidth+SOLO_LEFT; + tBox += SM_TOP; + } + } + + iHitType = i + iBoxType; + + return MAKELONG( lBox, tBox ); + } + else if( Y=0 ){ + if( deltaY0 ){ //½DZ + if( iType==1 ) //m + wTKey = 7; + else if( iType==2 ) //7 + wTKey = 6; + else if( iType==3 || iType==7 ) //m7 M7 + wTKey = 11; + else //s2 s4 s6 + wTKey = 10; + } + + if( !g_bAlphaKey ){ + if( iMainKey==0 ){ + wMKey = iType>0 ? 6 : 8; + } + else if( iMainKey==1 ){ + wIKey = iType>2 ? 5 : 6; + wMKey = iType>0 ? 11 : 14; + } + else if( iMainKey==2 ){ + if( iType==0 ){ + wIKey = 5; + wMKey = 16; + } + else if( iType<=2 ){ + wIKey = 5; + wMKey = 14; + } + else{ + wIKey = 4; + wMKey = 12; + } + } + else if( iMainKey==3 ){ + wMKey = iType>0 ? 13 : 18; + } + else if( iMainKey==4 ){ + wMKey = iType>0 ? 7 : 11; + } + else if( iMainKey==5 ){ + if( iType==0 ){ + wVKey = 8; + wMKey = 17; + } + else if( iType<=2 ){ + wVKey = 7; + wMKey = 14; + } + else{ + wVKey = 6; + wMKey = 12; + } + } + else if( iMainKey==6 ){ + wIKey = 4; + + if( iType==0 ){ + wVKey = 6; + wMKey = 19; + } + else if( iType<=2 ){ + wVKey = 5; + wMKey = 15; + } + else{ + wVKey = 4; + wMKey = 14; + } + } + } + else{ + if( iMainKey==5 ) //Aſ + wAKey = 1; + else if( iMainKey==1 || iMainKey==4) //D GԴ + wMKey = 13; + else if( iMainKey==3 && iType>0 ) //F±꿿 + wMKey = 9; + } + + int wChord = wMKey + wAKey + wTKey; + int iLeft = iOriLeft + ( rcDraw.Width() - wChord ) / 2; + int iTop = iOriTop - 2; + + // + if( iAjustKey!=0 ){ + if( iAjustKey==1 ) + Canvas->Draw( iLeft, iOriTop, m_pngChordUp ); + else + Canvas->Draw( iLeft, iOriTop, m_pngChordDown ); + + iLeft += wAKey; + + if(iMainKey==2 && iType>=3) //bIIIm7ɽЩ + iLeft -= 1; + } + + if( g_bAlphaKey ){ //Ӣĸ + TFont *fntOld = new TFont; + fntOld->Assign( Canvas->Font ); //ԭ + + Canvas->Brush->Style = bsClear; + Canvas->Font->Name = "Times New Roman"; + Canvas->Font->Quality = TFontQuality::fqClearTypeNatural; + Canvas->Font->Color = RGB(60,43,23); + Canvas->Font->Style = TFontStyles()<Font->Size = g_szFont16; //ĸС + + Canvas->TextOut( iLeft, iTop, g_strAlphaTable[iMainKey] ); + + Canvas->Font->Assign( fntOld ); //ָԭ + delete fntOld; + } + else{ + int l = iLeft; + iTop += 5; + + if( iMainKey<4 ){ + Canvas->Draw( l, iTop, m_pngChordI ); //I + l += wIKey; + + if( iMainKey==3 ){ + Canvas->Draw( l, iTop, m_pngChordV ); //IV + } + else if( iMainKey>0 ){ + Canvas->Draw( l, iTop, m_pngChordI ); //II + l += wIKey; + + if( iMainKey==2 ){ + Canvas->Draw( l, iTop, m_pngChordI ); //III + } + } + } + else{ + l += 2; + + Canvas->Draw( l, iTop, m_pngChordV ); //V + l += wVKey; + + if( iMainKey>4 ){ + Canvas->Draw( l, iTop, m_pngChordI ); //VI + l += wIKey; + + if( iMainKey==6 ){ + Canvas->Draw( l, iTop, m_pngChordI ); //VII + l += wIKey; + } + } + } + } + + if( iType>0 ){ + iTop = iOriTop + 11; + iLeft += wMKey; + if(iMainKey!=3 || iType<3) //#IVm7ɽЩ + iLeft += 1; + + //A + if( iType==7 ){ //M + Canvas->Draw( iLeft, iTop, m_pngChordMaj ); + iLeft += 8; + } + else if( iType>=4 ){ //s + Canvas->Draw( iLeft, iTop+1, m_pngChordSus ); + iLeft += 6; + } + else if( iType==1 || iType==3 ){ //m + Canvas->Draw( iLeft, iTop+2, m_pngChordMin ); + iLeft += 8; + } + else if( iType==2 ){ + iLeft += 2; + } + + //N + if( iType==2 ){ //7 + Canvas->Draw( iLeft, iTop, m_pngChord7 ); + } + else if( iType==3 || iType==7 ){ //7 + if( iMainKey==6 && iAjustKey ) //֤bVII + iLeft--; + + Canvas->Draw( iLeft, iTop, m_pngChord7 ); + } + else if( iType==4 ){ //2 + Canvas->Draw( iLeft, iTop, m_pngChord2 ); + } + else if( iType==5 ){ //4 + Canvas->Draw( iLeft, iTop, m_pngChord4 ); + } + else if( iType==6 ){ //6 + Canvas->Draw( iLeft, iTop, m_pngChord6 ); + } + } +} + +//----------------------------------------------------------------------------- + +void TContentPanel::SetSelectRange( int iStartBar, int iStartPoint, + int iEndBar, int iEndPoint, bool bInvalid ) +{ + SelectRange( iStartBar, iStartPoint, iEndBar, iEndPoint, bInvalid ); +} +//----------------------------------------------------------------------------- + +void TContentPanel::GetSelectRange( int& iStartBar, int& iStartPoint, + int& iEndBar, int& iEndPoint ) +{ + iStartBar = m_iSelBarStart; + iStartPoint = m_iSelPointStart; + iEndBar = m_iSelBarEnd; + iEndPoint = m_iSelPointEnd; +} +//----------------------------------------------------------------------------- + +void TContentPanel::AddNewBar( int iBar ) +{ + int iRow, iCol; + + m_nBarNum++; + + if( m_bVertical ){ + m_nRowNum = m_nBarNum / m_nColumnNum; + if( m_nBarNum % m_nColumnNum>0 ){ + m_nRowNum++; + } + + if( m_nRowNum>m_nRowShow ){ + m_sbVert->SetRange( 0, m_nRowNum-1 ); + //m_sbVert->SetPageSize( m_nRowShow ); + } + + iRow = iBar / m_nColumnNum - m_iBeginShowRow; + + if( iRow>(m_nRowShow-1) ){ + int nRowScroll = min( m_nRowShow+m_iBeginShowRow-1, m_nRowNum-iRow ); // ʾ2 + + ScrollView( nRowScroll ); + } + else{ + iCol = iBar % m_nColumnNum; + TRect rectNew(0,0,0,0); + rectNew.left = iCol * m_nBarWidth + m_nLeftBound - 1; + rectNew.right = rectNew.left + m_nBarWidth + 2; //ұ߿ + rectNew.top = iRow * m_nBarHeight + m_nTopBound; + rectNew.bottom = rectNew.top + m_nBarHeight + 2; //±߿ + + InvalidateRect( Handle, &rectNew, FALSE ); + } + } + else{ + if( m_nBarNum > m_nColumnNum ){ + int nRange = m_nBarNum; + int nDrawWidth = ClientWidth - m_nLeftOriBound - m_nRightBound; + if( nDrawWidth % m_nBarWidth > 0 ) + nRange++; + + m_sbHoriz->SetRange( 0, nRange-1 ); + + if( iBar >= m_iBeginShowBar + m_nColumnNum ){ + } + else{ + TRect rectNew(0,0,0,0); + rectNew.left = (iBar-m_iBeginShowBar) * m_nBarWidth + m_nLeftBound - 1; + rectNew.right = rectNew.left + m_nBarWidth + 2; //ұ߿ + rectNew.top = m_nTopBound; + rectNew.bottom = rectNew.top + m_nBarHeight + 2; //±߿ + + InvalidateRect( Handle, &rectNew, FALSE ); + } + } + } +} +//----------------------------------------------------------------------------- + +void TContentPanel::DrawDragImg( int mode ) +{ + w_imgDrag = new TImage(this); + + if( mode==DM_ADJUSTWIDTH || mode==DM_ADJUSTHEADER ){ + COLORREF clrPixel[2] = { clWhite, clBlack }; + + w_imgDrag->Width = 4; + w_imgDrag->Height = Height-2; + + TRect rcDraw( 0, 0, w_imgDrag->Width, w_imgDrag->Height ); + + for( int i=0; iWidth; i++ ){ + for( int j=0; jHeight; j++ ){ + w_imgDrag->Canvas->Pixels[i][j] = clrPixel[(i+j)%2]; + } + } + } + else if( mode==DM_ADJUSTSTAGE ){ + w_imgDrag->Width = m_iSelBarEnd > m_iSelBarStart ? 160 : 120; + w_imgDrag->Height = 24; + + TRect rcDraw( 0, 0, w_imgDrag->Width, w_imgDrag->Height ); + + //Ƶɫ + w_imgDrag->Canvas->Brush->Color = clrBackboard; + w_imgDrag->Canvas->FillRect( rcDraw ); + + //б + w_imgDrag->Canvas->Font->Name = g_strTxtFontName; + w_imgDrag->Canvas->Font->Quality = TFontQuality::fqClearTypeNatural; + w_imgDrag->Canvas->Font->Size = g_szFont9; + w_imgDrag->Canvas->Font->Style = TFontStyles()<Canvas->Font->Color = clrSelText; + + char str[256]; + if( m_iSelBarEnd>m_iSelBarStart ) + sprintf( str, " %d - %d С", m_iSelBarStart+1, m_iSelBarEnd+1 ); + else + sprintf( str, " %d С", m_iSelBarStart+1 ); + + String strCaption = str; + int Y = rcDraw.Top + ( w_imgDrag->Height - Canvas->TextHeight(strCaption) )/2; + rcDraw.Left += (w_imgDrag->Width - Canvas->TextWidth(strCaption))/2; + + w_imgDrag->Canvas->Brush->Style = bsSolid; + w_imgDrag->Canvas->TextRect( rcDraw, rcDraw.Left, Y, strCaption ); + } + else if( mode==DM_ADJUSTAUDIO ){ + int iBarStart = m_iSelBarStart<0 ? 0 : m_iSelBarStart, + iBarEnd = m_iSelBarEnd<0 ? m_nBarNum-1 : m_iSelBarEnd, + iPointStart = m_iSelPointStart<0 ? 0 : m_iSelPointStart, + iPointEnd = m_iSelPointEnd<0 ? 119 : m_iSelPointEnd, + nWidth = ( iBarEnd - iBarStart ) * POINTS_PER_BAR + iPointEnd - iPointStart; + + w_imgDrag->Width = nWidth > POINTS_PER_BAR ? POINTS_PER_BAR : nWidth; + w_imgDrag->Height = 25; + + TRect rcDraw( 0, 0, w_imgDrag->Width, w_imgDrag->Height ); + + //Ƶɫ + w_imgDrag->Canvas->Brush->Color = clrBackboard; + w_imgDrag->Canvas->FillRect( rcDraw ); + + //Ʋ + int mid = w_imgDrag->Height/2 + 1, + gap = nWidth / 120; + if( gap<1 ) + gap = 1; + + w_imgDrag->Canvas->Pen->Color = clrWave[0]; + int iPos = 0, p = iPointStart; + for( int i=iBarStart; i<=iBarEnd && iPos<120; i++ ){ + TWaveBar *pBar = g_aAudioTracks[g_iSelAudio]->lstBars[i]; + + while( paVols[p]>0 && pBar->aVols[p]<0x80000000 ){ + DWORD wLeft = LOWORD(pBar->aVols[p]), + wRight = HIWORD(pBar->aVols[p]), + yBottom = mid + (12 * wRight )/0x8000, + yTop = mid - (12 * wLeft )/0x8000; + + if( yBottom>yTop ){ + w_imgDrag->Canvas->MoveTo( iPos, yTop ); + w_imgDrag->Canvas->LineTo( iPos, yBottom ); + } + } + + iPos++; + p += gap; + } + + if( iPos<120 ) + p -= POINTS_PER_BAR; + } + + m_iDragAudio = g_iSelAudio; + } + + w_bDraging = true; + w_iDragMode = mode; +} +//--------------------------------------------------------------------------- + +bool TContentPanel::ShowDragImg( bool bShow, int iState ) +{ + bool bCanDrop = false; + int w = w_imgDrag->Width, + h = w_imgDrag->Height; + TPoint ptOld( w_xOldDrag, w_yOldDrag ), + ptNew( w_xImgDrag, w_yImgDrag ); + RECT rtInvalid; + + ptOld = ScreenToClient( ptOld ); + ptNew = ScreenToClient( ptNew ); + + if( w_iDragMode==DM_ADJUSTWIDTH || w_iDragMode==DM_ADJUSTHEADER ){ + rtInvalid.left = 0; + rtInvalid.right = 0; + rtInvalid.top = 1; + rtInvalid.bottom = Height-1; + + if( ptOld.X>0 && ptOld.X0 && ptOld.X+w0 && ptNew.X0 && ptNew.X+wWidth ) rtInvalid.right = Width; + + if( rtInvalid.right>rtInvalid.left ){ + InvalidateRect( Handle, &rtInvalid, false ); + } + + if( !bShow && w_iDragMode==DM_ADJUSTHEADER ){ + m_nTrkHdrWidth = ptNew.x; + CalcViewArea(); + InvalidateRgn( Handle, NULL, true ); + } + } + else if( w_iDragMode==DM_ADJUSTSTYLE || w_iDragMode==DM_ADJUSTSTAGE + || w_iDragMode==DM_ADJUSTAUDIO ){ + TPoint ptMouse( ptNew.X + w_xOffDrag, ptNew.Y + w_yOffDrag ); + + rtInvalid.left = Width; + rtInvalid.right = 0; + rtInvalid.top = Height; + rtInvalid.bottom = 0; + + if( ptOld.Y>0 && ptOld.Y0 && ptOld.Y+h0 && ptOld.X0 && ptOld.X+w0 && ptNew.Y0 && ptNew.Y+h0 && ptNew.X0 && ptNew.X+w=0 || m_iDropBar>=0 ) + && ( !m_pItem || (m_pItem->iType!=SEGTYPE_STYLE + && m_pItem->iType!=SEGTYPE_TRACK ))){ //Drop¼ + int iHitType = -1; + DWORD dwHit = HitTest( ptMouse.X, ptMouse.Y, iHitType ); + if( iHitType>=BAR_TITLE ){ + HandleDropEvent( iState ); + SetFocus(); + } + } + else if( w_iDragMode==DM_ADJUSTAUDIO ){ + HandleDropEvent( iState ); + } + + if( m_pTimer ){ + delete m_pTimer; + m_pTimer = NULL; + } + + SetDropBar( -1 ); + m_pItem = NULL; + m_bDraging = false; + } + + if( rtInvalid.top<0 ) rtInvalid.top = 0; + if( rtInvalid.bottom>Height ) rtInvalid.bottom = Height; + if( rtInvalid.left<0 ) rtInvalid.left = 0; + if( rtInvalid.right>Width ) rtInvalid.right = Width; + + if( rtInvalid.bottom>rtInvalid.top && rtInvalid.right>rtInvalid.left ){ + InvalidateRect( Handle, &rtInvalid, false ); + } + + if( bShow ){ + SetScrollTimer( ptMouse ); + } + } + + return bCanDrop; +} +//--------------------------------------------------------------------------- + +void __fastcall TContentPanel::WMMouseDown(TWMMouse &Message) +{ + ptDown.x = ptDown.y = 0; + m_iMouseDownBar = m_iMouseDownPoint = -1; + + if( Message.Keys & MK_RBUTTON ){ + if( m_bBrush ){ + m_bBrush = false; + Screen->Cursor = crDefault; + } + + if( m_bDraging ){ + m_bDraging = false; + + if( m_iMode==VIEW_TRACK ){ + SelectRange( -1, -1, -1, -1 ); + } + else{ + SelectBars( -1, -1 ); + } + } + + ReleaseCapture(); + m_iMouseDownBar = m_iMouseDownPoint = -1; + m_pItem = NULL; + + m_PopupMenu->ClearItems(); + + if( m_iMode==VIEW_INIT || m_nBarNum==0 ) + return; + + CMenuItem* pMenuItem = NULL; + int iHitType = -1; + DWORD dwHit = HitTest( Message.XPos, Message.YPos, iHitType, true ); + + if( iHitType<=BAR_CURSOR ){ + if( !m_bVertical ){ + pMenuItem = m_PopupMenu->CreateMenu( "Ƶ", "", DoTrackAdd, ST_AUDIO ); + pMenuItem->Enabled = g_aAudioTracks.size()CreateMenu( "MIDI...","",DoTrackAdd, ST_MIDI ); + } + else + return; + } + else{ + int iView = VIEW_TRACK; + + if( iHitTypeMainForm->Perform( UM_SETVIEWMODE, iView, 0 ); + } + + int iHitBar = LOWORD(dwHit); + + if( iHitType>=BAR_LEFT ){ + int iHitTrack = -1; + if( iHitType>=HOVER_SOLO ) + iHitTrack = iHitType - HOVER_SOLO; + else if( iHitType>=HOVER_MUTE ) + iHitTrack = iHitType - HOVER_MUTE; + else + iHitTrack = iHitType - BAR_LEFT; + + SelectTrack( iHitTrack, -1, -1 ); + + bool bMute = m_aTracks[iHitTrack]->pTrack->IsMute(), + bSolo = m_aTracks[iHitTrack]->pTrack->IsSolo(); + m_PopupMenu->CreateMenu( bMute ? "ȡ" : "", "", DoTrackMute ); + m_PopupMenu->CreateMenu( bSolo ? "ȡ" : "", "",DoTrackSolo ); + m_PopupMenu->CreateMenu( "ɾù", "", DoTrackDel, IDM_TRKSHOW+iHitTrack ); + m_PopupMenu->CreateMenu( "ظù", "", DoTrackHide, IDM_TRKSHOW+iHitTrack ); + m_PopupMenu->CreateMenu( "Ϊ...","",DoTrackSave ); + + m_PopupMenu->CreateMenu( "-" ); + + pMenuItem = m_PopupMenu->CreateMenu( "Ƶ", "", DoTrackAdd, ST_AUDIO ); + pMenuItem->Enabled = g_aAudioTracks.size()CreateMenu( "MIDI...","",DoTrackAdd, ST_MIDI ); + } + else if( iHitType>=BAR_TRACK ){ + int iHitTrack = iHitType & 0xFF, + iHitPoint = HIWORD(dwHit); + + if( iHitTrack!=m_iSelTrack || m_iSelBarStart<0 && m_iSelBarEnd<0 + || iHitBar=0 && iHitBar>m_iSelBarEnd + || iHitBar==m_iSelBarStart && iHitPointm_iSelPointEnd ){ + SelectTrack( iHitTrack, iHitBar, iHitPoint ); + } + + ptDown.X = Message.XPos; + ptDown.Y = Message.YPos; + + bool bMute = m_aTracks[iHitTrack]->pTrack->IsMute(), + bSolo = m_aTracks[iHitTrack]->pTrack->IsSolo(); + m_PopupMenu->CreateMenu( bMute ? "ȡ" : "", "", DoTrackMute ); + m_PopupMenu->CreateMenu( bSolo ? "ȡ" : "", "",DoTrackSolo ); + m_PopupMenu->CreateMenu( "ɾù", "", DoTrackDel, IDM_TRKSHOW+iHitTrack ); + m_PopupMenu->CreateMenu( "ظù", "", DoTrackHide, IDM_TRKSHOW+iHitTrack ); + m_PopupMenu->CreateMenu( "Ϊ...","",DoTrackSave ); + m_PopupMenu->CreateMenu( "-" ); + m_PopupMenu->CreateMenu( "ȫѡ", "Ctrl+A", DoSelectAll ); + + if( m_aTracks[iHitTrack]->type==ST_AUDIO ){ + pMenuItem = m_PopupMenu->CreateMenu( "ѡƵ", "Ctrl+C", DoAudioCopy ); + pMenuItem->Enabled = m_iSelBarStart>=0 || m_iSelBarEnd>=0; + pMenuItem = m_PopupMenu->CreateMenu( "ѡƵ", "Ctrl+X", DoAudioCut ); + pMenuItem->Enabled = m_iSelBarStart>=0 || m_iSelBarEnd>=0; + pMenuItem = m_PopupMenu->CreateMenu( "ɾѡƵ", "Ctrl+Del", DoAudioDelete ); + pMenuItem->Enabled = m_iSelBarStart>=0 || m_iSelBarEnd>=0; + + if( m_iCopyBarStart>=0 ){ + m_PopupMenu->CreateMenu( "-" ); + + String strText = "ճ"; + strText += m_bCut ? "еƵ" : "ƵƵ"; + pMenuItem = m_PopupMenu->CreateMenu( strText, "Ctrl+V", DoAudioPaste ); + pMenuItem->Enabled = m_iCopyBarStart>=0; + } + + m_PopupMenu->CreateMenu( "-" ); + m_PopupMenu->CreateMenu( "Ϊ¼", "", DoSetSelPosStart ); + m_PopupMenu->CreateMenu( "Ϊ¼յ", "", DoSetSelPosEnd ); + pMenuItem = m_PopupMenu->CreateMenu( "ȡ¼", "", DoDelSelPosStart ); + pMenuItem->Enabled = m_iSelBarStart>=0; + pMenuItem = m_PopupMenu->CreateMenu( "ȡ¼յ", "", DoDelSelPosEnd ); + pMenuItem->Enabled = m_iSelBarEnd>=0; + m_PopupMenu->CreateMenu( "-" ); + m_PopupMenu->CreateMenu( "ƵƬ...","Ctrl+Ins",DoAudioLoad ); + + bool bSP = m_iSelBarStart>=0 || m_iSelBarEnd>=0; + CMenuItem *pMSPFx = NULL, + *pMSPVst = NULL, + *pMSP = m_PopupMenu->CreateMenu( "ֲЧ" ), + *pMAdd = m_PopupMenu->CreateMenu( "ӹЧ" ), + *pMAddFx = pMAdd->AppendMenu( "FxЧ" ), + *pMAddVst = pMAdd->AppendMenu( "VSTЧ" ); + pMSP->Enabled = bSP; + pMAddVst->Enabled = !g_lstVSTFx.empty(); + + if( bSP ){ + pMSPFx = pMSP->AppendMenu( "FxЧ" ); + pMSPVst = pMSP->AppendMenu( "VSTЧ" ); + pMSPVst->Enabled = !g_lstVSTFx.empty(); + } + + for( int i=0; iAppendMenu( g_strEffect[i], "", DoAudioFxProcess, i ); + + if( iAppendMenu( g_strEffect[i], "", DoAudioAddFx, i ); + } + + if( !g_lstVSTFx.empty() ){ + for( int i=0; istrFileName, '\\' )+1, + *ext = strrchr( pVST->strFileName, '.' ); + + if( ext>name ){ + strncpy( fname, name, ext-name ); + fname[ext-name] = '\0'; + } + else + strcpy(fname, name ); + + if( !pVST->aPlugins.empty() ) + strcat( fname, " ..." ); + + if( pMSPVst ) + pMSPVst->AppendMenu( fname, "", DoAudioVstProcess, i ); + pMAddVst->AppendMenu( fname, "", DoAudioAddVst, i ); + } + } + } + else{ + bool bContent=false, bSwitch=false, bInsert=true; + + if( m_iSelBarStart>=0 && m_iSelBarEnd>0 ){ + TMidiTrack* pMT = (TMidiTrack*)m_aTracks[iHitTrack]->pTrack; + int iBStage = FindStage( m_iSelBarStart, NULL ), + iEStage = FindStage( m_iSelBarEnd, NULL ); + + for( int i=iBStage; i<=iEStage; i++ ){ + TOpusStage* pStage = g_lstOpusStages[i]; + if( !bSwitch && pStage->iSegType<=SEGTYPE_FILL ) + bSwitch = true; + + if( bInsert && pMT->IsDrum() && pStage->aTracks[0]->iChanNo==9 ) + bInsert = false; + } + + for( int i=0; iaStages.size(); i++ ){ + int s = pMT->aStages[i]; + + if( s>=iBStage && s<=iEStage ){ + bContent = true; + break; + } + else if( s>iEStage ){ + break; + } + } + } + + pMenuItem = m_PopupMenu->CreateMenu( "֯...", "Ctrl+Ins", DoInsertTexture ); + pMenuItem->Enabled = !bContent && bSwitch && bInsert; + pMenuItem = m_PopupMenu->CreateMenu( "ɾѡ֯", "Ctrl+Del", DoDeleteTexture ); + pMenuItem->Enabled = bContent; + pMenuItem = m_PopupMenu->CreateMenu( "ѡ֯...", "", DoSwitchTexture ); + pMenuItem->Enabled = bContent && bSwitch; + pMenuItem = m_PopupMenu->CreateMenu( "ѡ/ɫ...", "", DoSwitchFontProg ); + pMenuItem->Enabled = bContent; + m_PopupMenu->CreateMenu( "֯...", "", DoTrackSwitchTexture ); + m_PopupMenu->CreateMenu( "/ɫ...", "", DoTrackSwitchFontProg ); + } + } + else if( iHitType==BAR_DATA ){ + int iCell = GetCell( HIWORD(dwHit) ); + + bool bCanCopy = false; + if( m_iSelBarStart<0 || iHitBarm_iSelBarEnd + || iHitBar==m_iSelBarStart && iCellm_iSelCellEnd ){ + int iFirstBar, iHitStage = FindStage( iHitBar, &iFirstBar ); + TOpusStage *pHitStage = g_lstOpusStages[iHitStage]; + + if( pHitStage->iSegType<=SEGTYPE_FILL ){ + int iEndBar = iHitBar, + iEndCell = iCell; + + if( m_iCopyBarStart>=0 ){ + //ѸƺҸ + int nChordRemain = (m_iCopyBarEnd - m_iCopyBarStart) * g_nChordNumPerBar + - m_iCopyCellStart + m_iCopyCellEnd + 1 ; + + int iStage = iHitStage, + iStartBar = iHitBar, + iStartCell = iCell, + iLastBar = iFirstBar + pHitStage->aBars.size() - 1; + + TOpusStage * pStage = pHitStage; + while( true ){ + int nCellCount = ( iLastBar - iStartBar + 1 ) * g_nChordNumPerBar + - iStartCell; + if( nCellCount >= nChordRemain ){ + iEndBar = iStartBar + nChordRemain / g_nChordNumPerBar; + iEndCell = iStartCell + nChordRemain % g_nChordNumPerBar - 1; + if( iEndCell>=g_nChordNumPerBar ){ + iEndBar++; + iEndCell -= g_nChordNumPerBar; + } + else if( iEndCell<0 ){ + iEndBar--; + iEndCell = g_nChordNumPerBar - 1; + } + + break; + } + else{ + iEndBar = iLastBar; + iEndCell = g_nChordNumPerBar - 1; + nChordRemain -= nCellCount; + + iStage++; + if( iStageiSegType<=SEGTYPE_FILL ){ + iStartBar = iLastBar + 1; + iStartCell = 0; + iLastBar = iStartBar + pStage->aBars.size() - 1; + } + else + break; + } + else + break; + } + } + } + + SelectCells( iHitBar, iCell, iEndBar, iEndCell ); + bCanCopy = true; + } + } + else if( ( iHitBar>m_iSelBarStart || iHitBar==m_iSelBarStart + && iCell>=m_iSelCellStart ) + && ( iHitBarCreateMenu( "ƺ","Ctrl+C",DoChordCopy ); + pMenuItem->Enabled = bCanCopy && m_iSelBarStart>=0; + pMenuItem = m_PopupMenu->CreateMenu( "ճ","Ctrl+V",DoChordPaste ); + pMenuItem->Enabled = bCanCopy && m_iCopyBarStart>=0; + m_PopupMenu->CreateMenu( "-" ); + m_PopupMenu->CreateMenu( "ǰһͬ","Ctrl+Del",DoChordDelete ); + + bool bCanDelete = false; + if( bCanCopy ){ + if( m_iSelCellStart>0 ){ + bCanDelete = true; + } + else{ + int iFirstBar, iSelStage = FindStage( m_iSelBarStart, &iFirstBar ); + if( m_iSelBarStart!=iFirstBar ){ + bCanDelete = true; + } + else if( iSelStage>0 ){ + TOpusStage *pPreStage = g_lstOpusStages[iSelStage-1]; + if( pPreStage->iSegType<=SEGTYPE_FILL ){ + bCanDelete = true; + } + } + } + } + + pMenuItem->Enabled = bCanDelete; + + m_PopupMenu->CreateMenu( "-" ); + m_PopupMenu->CreateMenu( "...","",DoTrackSave ); + } + else if( iHitType==BAR_TITLE ){ + bool bCanInsert = m_iCopyBarStart!=-1; + + if( iHitBar>=m_iCopyBarStart && iHitBar<=m_iCopyBarEnd ){ + SelectBars( m_iCopyBarStart, m_iCopyBarEnd ); + } + else if( m_iSelBarStart<0 || iHitBarm_iSelBarEnd ){ + int iFirstBar, + iStage = FindStage( iHitBar, &iFirstBar ); + TOpusStage* pStage = g_lstOpusStages[iStage]; + + if( pStage->iSegType>=SEGTYPE_INTRO ){ + SelectBars( iFirstBar, iFirstBar+pStage->aBars.size()-1 ); + } + else{ + SelectBars( iHitBar, iHitBar ); + } + } + + bool bSel = m_iSelBarStart>=0; + bool bCanCopy = bSel; + + if( m_iSelBarEnd>=0 ){ + int iStage = FindStage( m_iSelBarEnd, NULL ); + if( g_lstOpusStages[iStage]->iSegType==SEGTYPE_ENDING ) + bCanCopy = false; + } + + pMenuItem = m_PopupMenu->CreateMenu( "С","Ctrl+C",DoBarsCopy ); + pMenuItem->Enabled = bCanCopy; + pMenuItem = m_PopupMenu->CreateMenu( "С","Ctrl+X",DoBarsCut ); + pMenuItem->Enabled = bCanCopy; + m_PopupMenu->CreateMenu( "-" ); + pMenuItem = m_PopupMenu->CreateMenu( "С","Ctrl+Ins",DoInsertBlankBar ); + pMenuItem->Enabled = bSel; + + String strText = ""; + if( m_iCopyBarStart>=0 ){ + strText += m_bCut ? "еС" : "ƵС"; + pMenuItem = m_PopupMenu->CreateMenu( strText,"Ctrl+V",DoBarsInsert ); + pMenuItem->Enabled = bSel && m_iCopyBarStart>=0; + } + + pMenuItem = m_PopupMenu->CreateMenu( "ɾѡС","Ctrl+Del",DoBarsDelete ); + pMenuItem->Enabled = bSel; + + m_PopupMenu->CreateMenu( "-" ); + pMenuItem = m_PopupMenu->CreateMenu( "ıѡСڵ" ); + pMenuItem->Enabled = bSel; + if( bSel ){ + for( int i=0; iAppendMenu( g_strMelodyKey[i], "", DoBarsChangeKey, i ); + } + } + + pMenuItem = m_PopupMenu->CreateMenu( "֯...", "", DoInsertTexture ); + + bool bTexture = false; + if( /*!m_bVertical &&*/ bSel ){ + int iBS = FindStage( m_iSelBarStart, NULL ), + iES = FindStage( m_iSelBarEnd, NULL ); + + for( int i=iBS; i<=iES; i++ ){ + if( g_lstOpusStages[i]->iSegTypeEnabled = bTexture; + + m_PopupMenu->CreateMenu( "-" ); + m_PopupMenu->CreateMenu( "ȫѡ", "Ctrl+A", DoSelectAll ); + } + } + + m_PopupMenu->Parent = this; + m_PopupMenu->Show(Message.XPos,Message.YPos); + + return; + } + + if( !(Message.Keys & MK_LBUTTON) ) + return; + + if( Screen->Cursor==crHSplit ){ // + int iMode = Message.XPos0 ){ + int iHitType = -1; + DWORD dwHit = HitTest( Message.XPos, Message.YPos, iHitType, !m_bBrush ); + int iHitBar = LOWORD(dwHit), + iHitPoint = HIWORD(dwHit); + + if( m_bBrush ){ + if( Screen->Cursor!=crBrushNo && iHitType>BAR_CURSOR && iHitTypeMainForm->Perform( UM_SHOWPLAYTIME, iHitBar, iHitPoint ); + + return; + } + + //׼϶ + if( iHitType>=BAR_TITLE ){ // + int iView = VIEW_TRACK; + if( iHitTypeMainForm->Perform( UM_SETVIEWMODE, iView, 0 ); + } + } + + if( iHitType<0 || iHitBar<0 ){ + if( m_iMode==VIEW_STYLE ){ //ģʽ + SelectBars( -1, -1 ); + SelectCopyBars( -1, -1 ); + } + else if( m_iMode==VIEW_CHORD ){ //ģʽ + SelectCells( -1, -1, -1, -1 ); + SelectCopyCells( -1, -1, -1, -1 ); + ((TChordPanel*)m_pChordPanel)->EnableChordModify( false, -1, -1, -1 ); + } + else{ //ģʽ + SelectTrack( -1, -1, -1 ); + SelectRange( -1, -1, -1, -1 ); + SelectCopyPos( -1, -1, -1, -1 ); + } + } + else if( iHitType>=HOVER_MUTE ){ + int iHitTrack = -1, iState = -1; + if( iHitType>=HOVER_SOLO ){ + iHitTrack = iHitType - HOVER_SOLO; + iState = TRACK_SOLO; + } + else{ + iHitTrack = iHitType - HOVER_MUTE; + iState = TRACK_MUTE; + } + + SelectTrack( iHitTrack , -1, -1 ); + + ((TTrackPanel*)m_pTrackPanel)->OnTrackStateChanged( iState ); + + return; + } + else if( iHitType>=BAR_LEFT ){ + int iHitTrack = iHitType & 0xFF; + SelectTrack( iHitTrack , -1, -1 ); + + return; + } + else if( iHitType>=BAR_TRACK ){ + int iHitTrack = iHitType & 0xFF; + if( iHitTrack!=m_iSelTrack || m_iSelBarStart<0 && m_iSelBarEnd<0 + || iHitBar=0 && iHitBar>m_iSelBarEnd + || iHitBar==m_iSelBarStart && iHitPointm_iSelPointEnd ){ + SelectTrack( iHitTrack , iHitBar, iHitPoint ); + //SelectRange( -1, -1, -1, -1 ); + } + + m_bDragReady = true; + } + else if( iHitType==BAR_TITLE ){ + if( m_iSelBarStart<0 && m_iSelBarEnd<0 + || iHitBar=0 && iHitBar>m_iSelBarEnd ){ + SelectBars( iHitBar, iHitBar ); + m_bDraging = true; + } + else{ + m_bDragReady = true; + } + } + else if( iHitType==BAR_DATA ){ + int iHitCell = GetCell( iHitPoint ); + int iFirstBar, iStage = FindStage( iHitBar, &iFirstBar ); + TOpusStage *pStage = g_lstOpusStages[iStage]; + + if( pStage->iSegType<=SEGTYPE_FILL ){ + SelectCells( iHitBar, iHitCell, iHitBar, iHitCell ); + + m_iMinSelBar = iFirstBar; + m_iMaxSelBar = iFirstBar + pStage->aBars.size() - 1; + + for( int i=iStage-1; i>=0; i-- ){ + pStage = g_lstOpusStages[i]; + if( pStage->iSegType<=SEGTYPE_FILL ) + m_iMinSelBar -= pStage->aBars.size(); + else + break; + } + + for( int i=iStage+1; iiSegType<=SEGTYPE_FILL ) + m_iMaxSelBar += pStage->aBars.size(); + else + break; + } + + m_bDraging = true; + } + else{ + SelectCells( -1, -1, -1, -1 ); + } + } + + if( m_bDragReady || m_bDraging ){ + ptDown.X = Message.XPos; + ptDown.Y = Message.YPos; + + m_iMouseDownBar = iHitBar; + m_iMouseDownPoint = iHitPoint; + + SetCapture( Handle ); + } + } + } + } +} +//--------------------------------------------------------------------------- + +void __fastcall TContentPanel::UMMouseMove(TWMMouseMove &Message) +{ + if( m_bDragReady ){ + if( abs(Message.XPos-ptDown.X)>=4 + || abs(Message.YPos-ptDown.Y)>=4 ){ //ʼ϶ + m_bDragReady = false; + + if( m_iMode==VIEW_TRACK ){ + int iHitType = -1; + DWORD dwHit = HitTest( Message.XPos, Message.YPos, iHitType ); + int iHitBar = LOWORD(dwHit), + iHitPoint = HIWORD(dwHit); + + if( iHitTypetype==ST_AUDIO ){ + if( m_iSelBarStart>=0 || m_iSelBarEnd>=0 ){ //ƶƵ + DrawDragImg( DM_ADJUSTAUDIO ); + + int left = ptDown.X, + top = ptDown.Y - 10; + + TPoint pt( left, top ); + pt = ClientToScreen( pt ); + + w_xOldDrag = w_xImgDrag = pt.X; + w_yOldDrag = w_yImgDrag = pt.Y; + + w_xOffDrag = -1; + w_yOffDrag = 10; + + SelectCopyPos( -1, -1, -1, -1 ); + } + else{ + if( iHitBar>m_iMouseDownBar || iHitBar==m_iMouseDownBar + && iHitPoint>m_iMouseDownPoint ) + SelectRange( m_iMouseDownBar, m_iMouseDownPoint, iHitBar, iHitPoint ); + else + SelectRange( iHitBar, iHitPoint, m_iMouseDownBar, m_iMouseDownPoint ); + } + } + else{ + int iStartBar = min( m_iMouseDownBar, iHitBar ), + iEndBar = max( m_iMouseDownBar, iHitBar ); + + if( iStartBar!=m_iSelBarStart || iEndBar!=m_iSelBarEnd ) + SelectRange( iStartBar, 0, iEndBar, m_nBarWidth-1 ); + } + + m_bDraging = true; + } + else if( m_iMode==VIEW_STYLE ){ + if( m_iSelBarStart>=0 ){ // + int iLSBar, iStage = FindStage( m_iSelBarEnd, &iLSBar ); + + if( g_lstOpusStages[iStage]->iSegType==SEGTYPE_ENDING ){ + int iFirstStage = FindStage( m_iSelBarStart, NULL ); + if( iFirstStage!=iStage ){ + if( m_iMouseDownBar < iLSBar ){ + SelectBars( m_iSelBarStart, iLSBar-1 ); + } + else{ + SelectBars( iLSBar, m_iSelBarEnd ); + } + } + } + + DrawDragImg( DM_ADJUSTSTAGE ); + + int left = ptDown.X - 100, + top = ptDown.Y - 20; + + TPoint pt( left, top ); + pt = ClientToScreen( pt ); + + w_xOldDrag = w_xImgDrag = pt.X; + w_yOldDrag = w_yImgDrag = pt.Y; + + w_xOffDrag = 100; + w_yOffDrag = 20; + + m_bDraging = true; + } + } + } + } + else if( m_bDraging ){ + int iHitType = -1; + DWORD dwHit = HitTest( Message.XPos, Message.YPos, iHitType ); + + if( iHitType>=0 ){ + int iHitBar = LOWORD(dwHit); + int iStartBar = min( m_iMouseDownBar, iHitBar ), + iEndBar = max( m_iMouseDownBar, iHitBar ); + + if( m_iMode==VIEW_STYLE ){ + if( iStartBar!=m_iSelBarStart || iEndBar!=m_iSelBarEnd ) + SelectBars( iStartBar, iEndBar ); + } + else if( m_iMode==VIEW_CHORD ){ + int iStartCell = GetCell( m_iMouseDownPoint ), + iEndCell = iStartCell; + + if( iHitBar>m_iMaxSelBar ){ + iStartBar = m_iMouseDownBar; + iEndBar = m_iMaxSelBar; + iEndCell = g_nChordNumPerBar - 1; + } + else if( iHitBartype==ST_AUDIO ){ + int iHitPoint = HIWORD(dwHit); + int iStartPoint = m_iMouseDownPoint, + iEndPoint = m_iMouseDownPoint; + + if( iHitBar==m_iMouseDownBar ){ + iStartPoint = min( iStartPoint, iHitPoint ); + iEndPoint = max( iEndPoint, iHitPoint ); + } + else if( iHitBar0/* g_lstOpusStages.size()>0*/ ){ + if( !Focused() ) + SetFocus(); + + if( m_bBrush ){ + int iCursor = crBrushNo, + iHitType = -1, + iBrushType = m_pItem->iType, + iBrushSegType = m_pItem->GetSegType(); + DWORD dwHit = HitTest( Message.XPos, Message.YPos, iHitType, false ); + + if( iHitType>BAR_CURSOR && iHitTypeiSegType; + + if( iHitSegType<=SEGTYPE_FILL ){ + if( iBrushType==SEGTYPE_SEGMENT && iHitTypepTrack; + + if( pTrack->iChanNo==9 ){ + for( int i=0; iIsDrum() ){ + bAdd = false; + + break; + } + } + } + + if( bAdd ) + iCursor = crBrushAdd; + else + iCursor = crBrush; + } + else{ + int iTrack = iHitType & 0xFF; + TShowTrack* pTrk = m_aTracks[iTrack]; + + if( pTrk->type==ST_MIDI ){ + TMidiTrack* pMT = (TMidiTrack*)pTrk->pTrack; + TTrack* pTrack = ((TTrackItem*)m_pItem)->pTrack; + if( pMT->IsDrum() && pTrack->iChanNo==9 + || !pMT->IsDrum() && pTrack->iChanNo!=9 ) + iCursor = crBrush; + } + } + } + } + } + + Screen->Cursor = iCursor; + } + else if( !m_bVertical && Message.Keys==0 ){ + int iHitType = -1, iTrack = -1, iHover = -1; + DWORD dwHit = HitTest( Message.XPos, Message.YPos, iHitType, true ); + + if( iHitType>=HOVER_SOLO ){ + iTrack = iHitType - HOVER_SOLO; + iHover = TRACK_S_HOVER; + + if( Hint.IsEmpty() ){ + ShowHint = true; + Hint = "࿪"; + } + else if( Hint.Compare("࿪") ){ + ShowHint = false; + Hint = ""; + } + } + else if( iHitType>=HOVER_MUTE ){ + iTrack = iHitType - HOVER_MUTE; + iHover = TRACK_M_HOVER; + + if( Hint.IsEmpty() ){ + ShowHint = true; + Hint = ""; + } + else if( Hint.Compare("") ){ + ShowHint = false; + Hint = ""; + } + } + else{ + ShowHint = false; + Hint = ""; + } + + int nSMTop = m_nTopBound+m_nRowGapHeight+m_nTitleHeight+m_nChordHeight+SM_TOP; + for( int i=m_iBeginShowTrack; iiHover & iHover) ){ + int lBox = LOWORD( dwHit ), + tBox = HIWORD( dwHit ); + + pTrk->iHover |= iHover; + SetRect( &rect, lBox, tBox, lBox+SM_SIZE, tBox+SM_SIZE ); + InvalidateRect( Handle, &rect, false ); + } + + if( (pTrk->iHover & TRACK_S_HOVER) && (iTrack!=i || iHover!=TRACK_S_HOVER) ){ + pTrk->iHover -= TRACK_S_HOVER; + SetRect( &rect, m_nTrkHdrWidth+SOLO_LEFT, nSMTop, + m_nTrkHdrWidth+SOLO_LEFT+SM_SIZE, nSMTop+SM_SIZE ); + InvalidateRect( Handle, &rect, false ); + } + + if( (pTrk->iHover & TRACK_M_HOVER) && (iTrack!=i || iHover!=TRACK_M_HOVER) ){ + pTrk->iHover -= TRACK_M_HOVER; + SetRect( &rect, m_nTrkHdrWidth+MUTE_LEFT, nSMTop, + m_nTrkHdrWidth+MUTE_LEFT+SM_SIZE, nSMTop+SM_SIZE ); + InvalidateRect( Handle, &rect, false ); + } + + nSMTop += m_nTrackHeight; + } + } + } +} +//----------------------------------------------------------------------------- + +void __fastcall TContentPanel::UMMouseUp(TWMMouse &Message) +{ + TShiftState Shift(Message.Keys); + if( !Shift.Contains(ssLeft) ) + return; + + if( m_bDragReady || m_bDraging ){ + if( m_bDragReady ){ + //ѡСڻǰβ + if( m_iMode==VIEW_STYLE ){ + if( m_iSelBarStart<0 || m_iMouseDownBarm_iSelBarEnd ){ + int iFirstBar, + iStage = FindStage( m_iMouseDownBar, &iFirstBar ); + TOpusStage* pStage = g_lstOpusStages[iStage]; + if( pStage->iSegType>=SEGTYPE_INTRO ){ + SelectBars( iFirstBar, iFirstBar+pStage->aBars.size()-1 ); + } + else + SelectBars( m_iMouseDownBar, m_iMouseDownBar ); + } + } + else if( m_iMode==VIEW_CHORD ){ + int iCell = GetCell( m_iMouseDownPoint ); + + if( m_iSelBarStart<0 || m_iMouseDownBarm_iSelBarEnd + || m_iMouseDownBar==m_iSelBarStart && iCellm_iSelCellEnd ){ + int iFirstBar, iDownStage = FindStage( m_iMouseDownBar, &iFirstBar ); + TOpusStage *pDownStage = g_lstOpusStages[iDownStage]; + + if( pDownStage->iSegType<=SEGTYPE_FILL ){ + int iEndBar = m_iMouseDownBar, + iEndCell = iCell; + + if( m_iCopyBarStart>=0 ){ + //ѸƺҸ + int nChordRemain = (m_iCopyBarEnd - m_iCopyBarStart) * g_nChordNumPerBar + - m_iCopyCellStart + m_iCopyCellEnd + 1 ; + + int iStage = iDownStage, + iStartBar = m_iMouseDownBar, + iStartCell = iCell, + iLastBar = iFirstBar + pDownStage->aBars.size() - 1; + + TOpusStage * pStage = pDownStage; + while( true ){ + int nCellCount = ( iLastBar - iStartBar + 1 ) * g_nChordNumPerBar + - iStartCell; + if( nCellCount >= nChordRemain ){ + iEndBar = iStartBar + nChordRemain / g_nChordNumPerBar; + iEndCell = iStartCell + nChordRemain % g_nChordNumPerBar - 1; + if( iEndCell>=g_nChordNumPerBar ){ + iEndBar++; + iEndCell -= g_nChordNumPerBar; + } + else if( iEndCell<0 ){ + iEndBar--; + iEndCell = g_nChordNumPerBar - 1; + } + + break; + } + else{ + iEndBar = iLastBar; + iEndCell = g_nChordNumPerBar - 1; + nChordRemain -= nCellCount; + + iStage++; + if( iStageiSegType<=SEGTYPE_FILL ){ + iStartBar = iLastBar + 1; + iStartCell = 0; + iLastBar = iStartBar + pStage->aBars.size() - 1; + } + else + break; + } + else + break; + } + } + } + + SelectCells( m_iMouseDownBar, iCell, iEndBar, iEndCell ); + } + } + } + else{ + if( m_iSelBarStart<0 || m_iMouseDownBarm_iSelBarEnd + || m_iMouseDownBar==m_iSelBarStart + && m_iMouseDownPointm_iSelPointEnd ){ + SelectRange( -1, -1, -1, -1 ); + } + } + } + else if( m_bDraging && m_iSelBarStart>=0 && m_iSelBarEnd>=0 ){ + if( m_bBrush ){ + if( Message.XPos<0 || Message.XPos>Width + || Message.YPos<0 || Message.YPos>Height ){ + if( m_iMode==VIEW_STYLE ) + SelectBars( -1, -1 ); + } + else + HandleBrush(); + } + else if( m_iMode==VIEW_STYLE || m_iMode==VIEW_TRACK + && m_aTracks[m_iSelTrack]->type==ST_MIDI ){ + int iStartBar = m_iSelBarStart, + iEndBar = m_iSelBarEnd; + + int iFirstBar, + iStage = FindStage( iStartBar, &iFirstBar ); + TOpusStage* pStage1 = g_lstOpusStages[iStage]; + + if( pStage1->iSegType>=SEGTYPE_INTRO ) + iStartBar = iFirstBar; + + iStage = FindStage( iEndBar, &iFirstBar ); + TOpusStage* pStage2 = g_lstOpusStages[iStage]; + + if( pStage1->iSegType>=SEGTYPE_INTRO && pStage1==pStage2 + || pStage2->iSegType>=SEGTYPE_INTRO ) + iEndBar = iFirstBar+pStage2->aBars.size()-1; + + if( iStartBar!=m_iSelBarStart || iEndBar!=m_iSelBarEnd ){ + if( m_iMode==VIEW_STYLE ) + SelectBars( iStartBar, iEndBar ); + else + SelectRange( iStartBar, 0, iEndBar, m_nBarWidth-1, true ); + } + } + else if( m_iMode==VIEW_TRACK ){ + int iStartPoint = m_iSelBarStart * m_nDataWidth + m_iSelPointStart, + iEndPoint = m_iSelBarEnd * m_nDataWidth + m_iSelPointEnd, + deltaPoint = iEndPoint - iStartPoint; + + int minArea = max( 10, (int)(g_nPPB / 4.0 + 0.5) ); + + if( deltaPoint=0 ){ + GetSelectChord( iBarKey, iKey, iType ); + bEnable = iKey!=-1; + } + + ((TChordPanel*)m_pChordPanel)->EnableChordModify( bEnable, iBarKey, iKey, iType ); + } + + ReleaseCapture(); + m_bDragReady = false; + m_bDraging = false; + m_bBrush = false; + + m_iMouseDownBar = m_iMouseDownPoint = -1; + m_pItem = NULL; + } + else if( m_bBrush ){ + SetCapture( Handle ); + } +} +//----------------------------------------------------------------------------- + +bool TContentPanel::HandleHoverEvent(TPoint ptMouse) +{ + if( g_lstOpusStages.size()==0 || !m_bDraging && !m_pItem + || (w_iDragMode==DM_ADJUSTSTYLE || w_iDragMode==DM_ADJUSTSTAGE) + && m_pItem && ( m_pItem->iType==SEGTYPE_STYLE + || m_pItem->iType==SEGTYPE_TRACK ) ){ + return false; + } + + bool bCanDrop = false; + int X = ptMouse.X, + Y = ptMouse.Y; + int iHitType = -1; + DWORD dwHit = HitTest( X, Y, iHitType ); + + if( iHitType>=BAR_TITLE ){ + int iHitBar = LOWORD(dwHit), + iHitPoint = HIWORD(dwHit); + + if( (w_iDragMode==DM_ADJUSTSTYLE || w_iDragMode==DM_ADJUSTSTAGE) && iHitTypeaBars.size() - 1; + int iHitType = pHitStage->iSegType; + if( iHitType==SEGTYPE_FILL ) + iHitType = SEGTYPE_VAR; + + bool bCanInsert = false; + if( m_pItem ){ + int iDropType = m_pItem->GetSegType(); + TOpusStage* pLastStage = g_lstOpusStages.back(); + if( iDropType==SEGTYPE_FILL ) + iDropType = SEGTYPE_VAR; + + if( iDropType==iHitType ){ + // SelectBars( iFirstBar, iLastBar ); + bCanDrop = true; + } + + if( iHitBar==m_nBarNum-1 && iHitPoint>90 ){ + if( pLastStage->iSegType!=SEGTYPE_ENDING && iDropType>=SEGTYPE_INTRO ){ + bCanInsert = true; + } + } + else if( iDropType==SEGTYPE_INTRO ){ + bCanInsert = true; + } + } + else{ + int iStage = FindStage( m_iSelBarStart, NULL ); + TOpusStage* pHoverStage = g_lstOpusStages[iStage]; + + if( pHoverStage->iSegTypem_iSelBarEnd && iHitType90 ) + || iHitType>=SEGTYPE_INTRO && ( iHitBar==iFirstBar && iHitPoint<30 + || iHitBar==iLastBar && iHitPoint>90 ))){ + if( m_pItem ) + SelectBars( -1, -1 ); + SetDropBar( iHitBar + (iHitPoint>90 ? 1 : 0) ); + bCanDrop = true; + } + else{ + SetDropBar( -1 ); + + if( bCanDrop ){ + SelectBars( iFirstBar, iLastBar ); + } + } + } + else if( w_iDragMode==DM_ADJUSTAUDIO && iHitType>=BAR_TRACK && iHitTypetype==ST_AUDIO ){ + SelectTrack( iHitTrack, iHitBar, iHitPoint, false ); + bCanDrop = true; + } + else{ + SelectTrack( -1, -1, -1, false ); + } + } + } + + if( !bCanDrop ){ + if( w_iDragMode==DM_ADJUSTSTYLE || w_iDragMode==DM_ADJUSTSTAGE ){ + if( m_pItem ) + SelectBars( -1, -1 ); + SetDropBar( -1 ); + } + else if( w_iDragMode==DM_ADJUSTAUDIO ){ + SelectTrack( -1, -1, -1, false ); + } + } + + return bCanDrop; +} +//----------------------------------------------------------------------------- + +void TContentPanel::AudioMove( int iSrcTrack, int iSrcBarStart, int iSrcPointStart, + int iSrcBarEnd, int iSrcPointEnd, bool bCut ) +{ + if( m_bPlaying ) + Parent->Perform( UM_STOP, STOP_CONTENT, 0 ); + + int nTotalBars = m_nBarNum; + + if( iSrcBarStart<0 ){ + iSrcBarStart = 0; + iSrcPointStart = 0; + } + if( iSrcBarEnd<0 ){ + iSrcBarEnd = nTotalBars; + iSrcPointEnd = 0; + } + + int iDestBarStart = m_iSelTrackBar, + iDestPointStart = m_iSelTrackPoint, + iDestBarEnd, iDestPointEnd, + nSrcLen = ( iSrcBarEnd * POINTS_PER_BAR + iSrcPointEnd ) + - ( iSrcBarStart * POINTS_PER_BAR + iSrcPointStart ); + + if( m_iDragAudio<0 && m_iSelBarEnd>=0 ){ + iDestBarEnd = m_iSelBarEnd; + iDestPointEnd = m_iSelPointEnd; + } + else{ + int nPointsEnd = ( iDestBarStart * POINTS_PER_BAR + iDestPointStart ) + nSrcLen; + iDestBarEnd = nPointsEnd / POINTS_PER_BAR; + + if( iDestBarEnd>=nTotalBars ){ + iDestBarEnd = nTotalBars; + iDestPointEnd = 0; + } + else{ + iDestPointEnd = nPointsEnd % POINTS_PER_BAR; + } + } + + int nDestLen = ( iDestBarEnd - iDestBarStart ) * POINTS_PER_BAR + + (iDestPointEnd - iDestPointStart ); + + double dblSrcStart = iSrcBarStart + (double)iSrcPointStart / POINTS_PER_BAR, + dblSrcEnd = iSrcBarEnd + (double)iSrcPointEnd / POINTS_PER_BAR, + dblDestStart = iDestBarStart + (double)iDestPointStart / POINTS_PER_BAR, + dblDestEnd = iDestBarEnd + (double)iDestPointEnd / POINTS_PER_BAR; + + //Set Undo + DWORD *aBefore=NULL, *aAfter=NULL, *aExtra=NULL; + int iSrcBarBreak = iSrcBarEnd, + iSrcPointBreak = iSrcPointEnd; + + int nAT = 1, + *aTrks = &g_iSelAudio; + //int iTracks = g_iSelAudio; + if( bCut && iSrcTrack!=g_iSelAudio ){ +// iTracks =-1;//+= ( 1<0 ){ + if( nSrcLen > nDestLen ){ //ܳ + double dblDelStart = dblSrcStart + ( dblDestEnd - dblDestStart ); + + if( bCut ){ //ɾƵIJ + int nDelLen = nSrcLen - nDestLen, + nPointsEnd = ( iSrcBarStart * POINTS_PER_BAR + iSrcPointStart ) + nDelLen; + + iSrcBarBreak = nPointsEnd / POINTS_PER_BAR; + iSrcPointBreak = nPointsEnd % POINTS_PER_BAR; + + // Set Undo + CopyWave( iSrcTrack, iSrcBarBreak, iSrcPointBreak, + iSrcBarEnd, iSrcPointEnd, &aExtra ); + + MoveAudio( iSrcTrack, dblDelStart, dblSrcEnd, -1, 0, MODE_ERASE ); + } + + dblSrcEnd = dblDelStart; + } + + // Set Undo + CopyWave( g_iSelAudio, iDestBarStart, iDestPointStart, + iDestBarEnd, iDestPointEnd, &aBefore ); + } + else{ + TAudioTrack* pAudio = CopyAudioTrack( g_iSelAudio, 0, m_nBarNum ); + g_Undo.AddUndo( bCut ? UNDO_AUDIO_MOVE : UNDO_AUDIO_COPY, + g_iSelAudio, g_iMelodyKey, -1, + (void*)pAudio, NULL ); + } + + MoveAudio( iSrcTrack, dblSrcStart, dblSrcEnd, + g_iSelAudio, dblDestStart, bCut ? MODE_MOVE : MODE_COPY ); + + + if( g_iSelAudio>0 ){ + f_MM_AddUndoAfter( nAT, aTrks ); + + // Set Undo + CopyWave( g_iSelAudio, iDestBarStart, iDestPointStart, + iDestBarEnd, iDestPointEnd, &aAfter ); + + int iBegin = MAKELONG( iDestPointStart, iDestBarStart ), + iEnd = MAKELONG( iDestPointEnd, iDestBarEnd ), + iType = bCut ? UNDO_AUDIO_MOVE : UNDO_AUDIO_COPY; + + g_Undo.AddUndo( iType, g_iSelAudio, iBegin, iEnd, (void*)aBefore, (void*)aAfter ); + + if( bCut ){ + int iSrcBegin = MAKELONG( iSrcPointStart, iSrcBarStart ), + iSrcEnd = MAKELONG( iSrcPointEnd, iSrcBarEnd ); + g_Undo.SetUndoExtra( iSrcTrack, iSrcBegin, iSrcEnd, (void*)aExtra, NULL ); + } + + //ʾ + if( iSrcTrack!=g_iSelAudio ) + InvalidateBars( m_iSelBarStart, m_iSelBarEnd, + BAR_TRACK | GetShowTrackId( ST_AUDIO, iSrcTrack ) ); + + if( m_iDragAudio>0 || m_iSelBarStart<0 ){ +/* if( m_iSelBarStart==iDestBarStart && m_iSelBarEnd==iDestBarEnd + && iDestBarEnd - iDestBarStart > 1 ) + InvalidateBars( iDestBarStart+1, iDestBarEnd-1, + BAR_TRACK | GetShowTrackId( ST_AUDIO, g_iSelAudio ) ); +*/ + SelectRange( iDestBarStart, iDestPointStart, iDestBarEnd, iDestPointEnd, true ); + } + else + InvalidateBars( iDestBarStart, iDestBarEnd, + BAR_TRACK | GetShowTrackId( ST_AUDIO, g_iSelAudio ) ); + } + + if( nAT>1 ) + delete[] aTrks; +} +//----------------------------------------------------------------------------- + +void TContentPanel::HandleDropEvent( int iState ) +{ + TUseStylePanel* pStylePanel = (TUseStylePanel*)m_pStylePanel; + + if( w_iDragMode==DM_ADJUSTAUDIO ){ + if( g_iSelAudio>=0 && m_iSelTrackBar>=0 ){ + if( m_iDragAudio!=g_iSelAudio || m_iSelTrackBar!=m_iSelBarStart + || m_iSelTrackPoint!=m_iSelPointStart ){ + TShiftState Shift( iState ); + bool bCtrl = Shift.Contains( ssCtrl ); + + AudioMove( m_iDragAudio, m_iSelBarStart, m_iSelPointStart, + m_iSelBarEnd, m_iSelPointEnd, !bCtrl ); + } + } + else{ + int iTrack = GetShowTrackId( ST_AUDIO, m_iDragAudio ) - 1; + SelectTrack( iTrack, m_iSelBarStart, m_iSelPointStart, false ); + } + + m_iDragAudio = -1; + } + else if( m_iSelBarStart>=0 && m_pItem ){ //Ӧ÷񵽶 + int iFirstBar, + iStage = FindStage( m_iSelBarStart, &iFirstBar ); + + TSegmentItem* pSegItem = (TSegmentItem*)m_pItem; + TOpusStage* pStage = g_lstOpusStages[iStage]; + int nBar = pStage->aBars.size(); + + if( pSegItem->iSegType>=SEGTYPE_INTRO ) + nBar = pSegItem->nBars; + + if( pStage->aBars.size()!=nBar ){ //䳤ȵ + SetPlayPoint( 0, 0 ); + Application->MainForm->Perform( UM_SHOWPLAYTIME, 0, 0 ); + } + + pStylePanel->ReformStage( iStage, pSegItem ); + + iStage = FindStage( m_iSelBarStart, NULL ); + + SelectStage( iStage ); + } + else if( m_iDropBar>=0 ){ + if( m_pItem ){ //ǰβ + TSegmentItem* pSegItem = (TSegmentItem*)m_pItem; + int nBarNum = 0; + + if( pSegItem->iSegType>=SEGTYPE_INTRO ) + nBarNum = pSegItem->nBars; + + int iStage = FindStage( m_iDropBar, NULL ); + int iPSFirstBar, iPlayStage = FindStage( m_iPlayBar, &iPSFirstBar ); + + if( iStage>=0 && iPlayStage>=iStage ){ + SetPlayPoint( 0, 0 ); + Application->MainForm->Perform( UM_SHOWPLAYTIME, 0, 0 ); + } + + bool bPreChange = g_iPreStage==0; + if( bPreChange ){ + DuplicateRawBars(); + SendMessage( Parent->Handle, UM_STAGECHANGED, 3, 0 ); + } + + f_MM_AddUndoBefore( -1, NULL ); + + pStylePanel->InsertStage( m_iDropBar, pSegItem ); + + iStage = FindStage( m_iDropBar, NULL ); + + SelectBars( m_iDropBar, m_iDropBar+nBarNum-1 ); + + if( bPreChange ) + InitialVars(); + + f_MM_AddUndoAfter( -1, NULL ); + pStylePanel->SetBarsUndo( UNDO_BAR_INSERT, m_iDropBar, nBarNum ); + } + else if( m_iSelBarStart>=0 ){ + TShiftState Shift( iState ); + bool bCtrl = Shift.Contains( ssCtrl ); + + pStylePanel->MoveBars( m_iSelBarStart, m_iSelBarEnd, + m_iDropBar, bCtrl ? MODE_COPY : MODE_MOVE ); + } + } +} +//----------------------------------------------------------------------------- + +void TContentPanel::SelectBars( int iStartBar, int iEndBar ) +{ + int iStart = m_iSelBarStart, iEnd = m_iSelBarEnd; + + if( iStart==iStartBar ){ + if( iEnd==iEndBar ) + return; + else{ + iStart = min( iEndBar, iEnd ); + iEnd = max( iEndBar, iEnd ); + } + } + else if( iEndBar==iEnd ){ + iEnd = max( iStartBar, iStart ); + iStart = min( iStartBar, iStart ); + } + else{ + if( iStart<0 || iStartBar=0 ) + iStart = iStartBar; + if( iEndBar>iEnd ) + iEnd = iEndBar; + } + + m_iSelBarStart = iStartBar; + m_iSelBarEnd = iEndBar; + + if( iStartBar<0 && iEndBar<0 ){ + m_iSelCellStart = m_iSelCellEnd = -1; + m_iSelPointStart = m_iSelPointEnd = -1; + + //DebugPrint( "Select -1, -1" ); + } + else{ + if( iStartBar>=0 && m_iSelPointStart<0 ){ + m_iSelPointStart = 0; + } + + if( iEndBar>=0 && m_iSelPointEnd<0 ){ + m_iSelPointEnd = m_nBarWidth-1; + } + } + + int iArea = 0; + if( m_iMode==VIEW_STYLE ){ + iArea = BAR_TITLE|BAR_DATA|BAR_TRACK; + } + else if( m_iMode==VIEW_CHORD ){ + iArea = BAR_DATA; + } + else{ + iArea = BAR_TRACK; + } + + InvalidateBars( iStart, iEnd, iArea ); +} +//----------------------------------------------------------------------------- + +void TContentPanel::GetSelectBars( int& iStartBar, int& iEndBar ) +{ + iStartBar = m_iSelBarStart; + iEndBar = m_iSelBarEnd; +} +//----------------------------------------------------------------------------- + +void TContentPanel::SelectCells( int iBarStart, int iCellStart, + int iBarEnd, int iCellEnd ) +{ + if( iBarStart==m_iSelBarStart && iCellStart==m_iSelCellStart + && iBarEnd==m_iSelBarEnd && iCellEnd==m_iSelCellEnd ) + return; + + if( iBarStart!=m_iSelBarStart || iBarEnd!=m_iSelBarEnd ){ + m_iSelCellStart = iCellStart; + m_iSelCellEnd = iCellEnd; + + if( iBarStart==m_iSelBarStart ) + InvalidateBar( iBarStart, 0, m_nBarWidth, BAR_DATA ); + if( iBarEnd==m_iSelBarEnd ) + InvalidateBar( iBarEnd, 0, m_nBarWidth, BAR_DATA ); + + SelectBars( iBarStart, iBarEnd ); + } + else if( iBarStart==iBarEnd ){ + m_iSelCellStart = iCellStart; + m_iSelCellEnd = iCellEnd; + + InvalidateBar( iBarStart, 0, m_nBarWidth, BAR_DATA ); + } + else{ + if( iCellStart!=m_iSelCellStart ){ + int l = min( m_iSelCellStart, iCellStart ) * m_nChordTxtWidth, + r = ( max( m_iSelCellStart, iCellStart ) + 1 ) * m_nChordTxtWidth; + + m_iSelCellStart = iCellStart; + InvalidateBar( iBarStart, l, r, BAR_DATA ); + } + + if( iCellEnd!=m_iSelCellEnd ){ + int l = min( m_iSelCellEnd, iCellEnd ) * m_nChordTxtWidth, + r = ( max( m_iSelCellEnd, iCellEnd ) + 1 ) * m_nChordTxtWidth; + + m_iSelCellEnd = iCellEnd; + InvalidateBar( iBarEnd, l, r, BAR_DATA ); + } + } +} +//--------------------------------------------------------------------------- + +void TContentPanel::SelectCopyCells( int iBarStart, int iCellStart, + int iBarEnd, int iCellEnd ) +{ + if( m_iCopyBarStart==iBarStart && m_iCopyCellStart==iCellStart + && m_iCopyBarEnd==iBarEnd && m_iCopyCellEnd==iCellEnd ) + return; + + int iOldBarStart = m_iCopyBarStart, + iOldBarEnd = m_iCopyBarEnd; + //iOldCellSetart = m_iCopyCellStart, + //iOldCellEnd = m_iCopyCellEnd; + + m_iCopyBarStart = iBarStart; + m_iCopyBarEnd = iBarEnd; + m_iCopyCellStart = iCellStart; + m_iCopyCellEnd = iCellEnd; + + if( iOldBarStart>=0 ){ + if( iBarStart>=0 ){ + if( iBarStart<=iOldBarEnd || iBarEnd>=iOldBarStart ){ + int iStart = min( iBarStart, iOldBarStart ), + iEnd = max( iBarEnd, iOldBarEnd ); + + InvalidateBars( iStart, iEnd ); + } + else{ + InvalidateBars( iOldBarStart, iOldBarEnd ); + InvalidateBars( iBarStart, iBarEnd ); + } + } + else{ + InvalidateBars( iOldBarStart, iOldBarEnd ); + } + } + else if( iBarStart>=0 ){ + InvalidateBars( iBarStart, iBarEnd ); + } +} +//--------------------------------------------------------------------------- + +void TContentPanel::SelectCopyPos( int iBarStart, int iPointStart, int iBarEnd, int iPointEnd ) +{ + if( m_iCopyBarStart==iBarStart && m_iCopyPointStart==iPointStart + && m_iCopyBarEnd==iBarEnd && m_iCopyPointEnd==iPointEnd ) + return; + + if( iBarStart<0 ){ + iBarStart = 0; + iPointStart = 0; + } + + if( iBarEnd<0 ){ + iBarEnd = g_Opus.BarCount(); + iPointEnd = 0; + } + + int iOldBarStart = m_iCopyBarStart, + iOldBarEnd = m_iCopyBarEnd; + //iOldPointStart = m_iCopyPointStart, + //iOldPointEnd = m_iCopyPointEnd; + + m_iCopyBarStart = iBarStart; + m_iCopyBarEnd = iBarEnd; + m_iCopyPointStart = iPointStart; + m_iCopyPointEnd = iPointEnd; + + if( iOldBarStart>=0 ){ + int iWave = GetShowTrackId( ST_AUDIO, m_iCopyAudio ); + + if( m_iCopyAudio==g_iSelAudio && iBarStart>=0 ){ + if( iBarStart<=iOldBarEnd || iBarEnd>=iOldBarStart ){ + int iStart = min( iBarStart, iOldBarStart ), + iEnd = max( iBarEnd, iOldBarEnd ); + + InvalidateBars( iStart, iEnd, BAR_TRACK | iWave ); + } + else{ + InvalidateBars( iOldBarStart, iOldBarEnd, BAR_TRACK | iWave ); + InvalidateBars( iBarStart, iBarEnd, BAR_TRACK | iWave ); + } + } + else{ + InvalidateBars( iOldBarStart, iOldBarEnd, BAR_TRACK | iWave ); + } + } + + if( iBarStart>=0 ){ + m_iCopyAudio = g_iSelAudio; + int iWave = GetShowTrackId( ST_AUDIO, g_iSelAudio ); + InvalidateBars( iBarStart, iBarEnd, BAR_TRACK | iWave ); + } + else{ + m_iCopyAudio = -1; + m_bCut = false; + } +} +//--------------------------------------------------------------------------- + +void TContentPanel::SetDropBar( int iBar ) +{ + int iDropOld = m_iDropBar; + + if( iBar!=iDropOld ){ + m_iDropBar = iBar; + + for( int i=1; i>=0; i-- ){ + if( iDropOld>=0 ) + InvalidateBar( iDropOld - i, 0, m_nBarWidth, BAR_TITLE|BAR_DATA|BAR_TRACK ); + if( iBar>=0 ) + InvalidateBar( iBar - i, 0, m_nBarWidth, BAR_TITLE|BAR_DATA|BAR_TRACK ); + } + } +} +//----------------------------------------------------------------------------- + +void TContentPanel::SelectStage( int iStage ) +{ + if( iStage>=0 && iStageaBars.size() - 1; + + SelectBars( iFirstBar, iEndBar ); + } +} +//----------------------------------------------------------------------------- + +void TContentPanel::SetScrollTimer(TPoint ptMouse, bool bVertical) +{ + int X = ptMouse.X, + Y = ptMouse.Y; + + //жǷ + if( m_bVertical ){ + if( m_nRowNum>m_nRowShow && X>m_nLeftBound && XHeight-m_nRowGapHeight && m_iBeginShowRow0 ) + iDirect = -1; + + if( iDirect!=0 ){ + if( !m_pTimer ){ + m_pTimer = new TTimer(this); + m_pTimer->OnTimer = TimerProc; + m_pTimer->Tag = MAKELONG( iDirect, 0 ); + m_pTimer->Interval = 500; + m_pTimer->Enabled = true; + } + } + else if( m_pTimer ){ + delete m_pTimer; + m_pTimer = NULL; + } + } + } + else{ + if( m_aTracks.size()>m_nTrackShow && X>m_nLeftBound && XHeight-m_nRowGapHeight + && m_iBeginShowTrack<(int)(m_aTracks.size()-m_nTrackShow) ) + iDirect = 1; + else if( Y0 ) + iDirect = -1; + + if( iDirect!=0 ){ + if( !m_pTimer ){ + m_pTimer = new TTimer(this); + m_pTimer->OnTimer = TimerProc; + m_pTimer->Tag = MAKELONG( iDirect, 0 ); + m_pTimer->Interval = 500; + m_pTimer->Enabled = true; + } + } + else if( m_pTimer ){ + delete m_pTimer; + m_pTimer = NULL; + } + } + else if( m_nBarNum>m_nColumnNum && Y>m_nTopBound && YWidth-m_nRightBound && ( g_iToolPanelShow!=0 || m_bBrush && X-120 + || w_bDraging && X>-12 ) + && m_iBeginShowBar>0 ) + iDirect = -1; + + if( iDirect!=0 ){ + if( !m_pTimer ){ + m_pTimer = new TTimer(this); + m_pTimer->OnTimer = TimerProc; + m_pTimer->Tag = MAKELONG( iDirect, 1 ); + m_pTimer->Interval = 500; + m_pTimer->Enabled = true; + } + } + else if( m_pTimer ){ + delete m_pTimer; + m_pTimer = NULL; + } + } + } +} +//----------------------------------------------------------------------------- + +void __fastcall TContentPanel::TimerProc(TObject* Sender) +{ + if( w_bDraging || m_bDraging ){ + DebugPrint( "On timer." ); + + if( m_pTimer->Tag!=0 ){ + bool bVertical = HIWORD( m_pTimer->Tag )==0; + short iDirect = (short)(LOWORD( m_pTimer->Tag )); + int &iCurPos = bVertical ? (m_bVertical ? m_iBeginShowRow : m_iBeginShowTrack) + : m_iBeginShowBar, + iMaxPos = bVertical ? (m_bVertical ? m_nRowNum-m_nRowShow : m_aTracks.size()-m_nTrackShow) + : m_nBarNum-m_nColumnNum; + + ScrollView( iCurPos + iDirect, bVertical ); + + if( iCurPos<=0 || iCurPos>=iMaxPos ){ + delete m_pTimer; + m_pTimer = NULL; + } + else if( m_pTimer->Interval>200 ){ + m_pTimer->Interval = 200; + } + } + } + else if( m_pTimer && m_pTimer->Tag!=0 ){ + delete m_pTimer; + m_pTimer = NULL; + } +} +//----------------------------------------------------------------------------- + +void __fastcall TContentPanel::OnStageChanged( int iStage, int iMode ) +{ + if( m_bPlaying ) + Parent->Perform( UM_STOP, STOP_CONTENT | STOP_USESTYLE, 0 ); + + int nBarCount = GetBarCount(); + + if( m_iPlayBar>=nBarCount ){ + SetPlayPoint( 0, 0 ); + Application->MainForm->Perform( UM_SHOWPLAYTIME, 0, 0 ); + } + + if( iMode==MODE_DELETE || m_iSelBarEnd>=nBarCount ) + SelectBars( -1, -1 ); + + if( m_iCopyBarStart>=0 && iMode!=MODE_COPY && iMode!=MODE_MOVE ){ + SelectCopyBars( -1, -1 ); + } + + if( iMode==MODE_INIT ){ + InitialVars(); + //SelectBars( -1, -1 ); + SelectRange( -1, -1, -1, -1 ); + SelectCopyPos( -1, -1, -1, -1 ); + SelectCells( -1, -1, -1, -1 ); + SelectCopyCells( -1, -1, -1, -1 ); + } + else{ + if( iStage>0 ) + iStage--; + + if( nBarCount!=m_nBarNum ){ + if( nBarCount==0 ){ + InvalidateRgn( Handle, NULL, false ); + } + else if( nBarCount 0 ){ + m_nRowNum++; + } + + int nDrawHeight = ClientHeight - m_nTopBound - m_nBottomBound; + if( nDrawHeight % m_nBarHeight > m_nRowGapHeight + m_nTitleHeight ){ + m_nRowNum++; + } + + if( !SetScrollView( iFirstShowBar ) ){ + for( int i=iStage; ipStyle->idLoc, g_pUseStyle->pStyle->idStyle, + g_lstOpusStages ); + PostMessage( Parent->Handle, UM_STAGECHANGED, 0, 0 ); + } + else{ + PostMessage( Parent->Handle, UM_STAGECHANGED, 3, 0 ); + } + } + + if( !m_bVertical ) + GenerateCompose(); +} +//----------------------------------------------------------------------------- + +void __fastcall TContentPanel::OnChangeMelodyKey( int Index ) +{ + g_Undo.AddUndo( UNDO_KEY_MELODY, 0, g_iMelodyKey, Index, NULL, NULL ); + ChangeBarsKey( 0, g_Opus.BarCount()-1, Index, NULL ); +// ChangeMelodyKey( Index ); +} +//--------------------------------------------------------------------------- +/* +void TContentPanel::ChangeMelodyKey( int iKey ) +{ + g_Opus.ChangeKey( -1, -1, iKey, NULL ); + + g_iMelodyKey = iKey; + InvalidateShowBars(); + + if( g_iViewMode==VIEW_CHORD ){ + SelectCells( -1, -1, -1, -1 ); + ((TChordPanel*)m_pChordPanel)->EnableChordModify( false, -1, -1, -1 ); + } +} +//--------------------------------------------------------------------------- +*/ +void TContentPanel::ChangeBarsKey( int iBarStart, int iBarEnd, int iKey, int keys[] ) +{ + g_Opus.ChangeKey( iBarStart, iBarEnd, iKey, keys ); + + if( iBarStart==0 ){ + g_iMelodyKey = keys ? keys[0] : iKey;; + Application->MainForm->Perform( UM_CHANGEKEY, 0, 0 ); + } + + if( g_iPreStage==0 ){ + g_Theme.Set( g_pUseStyle->pStyle->idLoc, + g_pUseStyle->pStyle->idStyle, + g_lstOpusStages ); + } + + if( !m_bVertical ) + GenerateCompose(); + + int opt = BAR_TITLE | BAR_DATA; + if( !m_bVertical ) + opt |= BAR_TRACK; + + InvalidateBars( iBarStart, iBarEnd+1, opt ); + + if( g_iViewMode==VIEW_CHORD ){ + SelectCells( -1, -1, -1, -1 ); + ((TChordPanel*)m_pChordPanel)->EnableChordModify( false, -1, -1, -1 ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TContentPanel::DoubleClick(TObject* sender) +{ + if( m_iMode==VIEW_TRACK ){ + int iHitType = -1; + DWORD dwHit = HitTest( ptDown.X, ptDown.Y, iHitType ); + int iHitBar = LOWORD(dwHit), + iHitPoint = HIWORD(dwHit); + + if( iHitType>=BAR_TRACK && iHitTypetype==ST_AUDIO ) +/* if( iHitType & 0xFF00 ) + SelectRangeByEffect( iHitBar, iHitPoint, ( iHitType & 0xFF00 )>>8 ); + else +*/ + SelectRangeByWave( iHitBar, iHitPoint ); + } + } + else if( m_iSelBarStart>=0 ){ + if( m_iMode==VIEW_STYLE ){ + int iFirstBar, + iStage = FindStage( m_iSelBarStart, &iFirstBar ); + TOpusStage* pStage = g_lstOpusStages[iStage]; + + int iEndBar = iFirstBar + pStage->aBars.size()-1; + + SelectBars( iFirstBar ,iEndBar ); + + ((TUseStylePanel*)m_pStylePanel)->SetSelectStage( iStage ); + } + else if( m_iMode==VIEW_CHORD ){ + int iFirstBar, + iStage = FindStage( m_iSelBarStart, &iFirstBar ); + TOpusStage* pStage = g_lstOpusStages[iStage]; + + TBar * pBar = pStage->aBars[m_iSelBarStart-iFirstBar]; + int iCellStart = m_iSelCellStart, + iCellEnd = iCellStart; + int key = pBar->aChords.iKey[iCellStart], + type = pBar->aChords.iType[iCellStart]; + + for( int i=m_iSelCellStart-1; i>=0; i-- ){ + if( pBar->aChords.iKey[i]==key && pBar->aChords.iType[i]==type ) + iCellStart = i; + else + break; + } + + for( int i=m_iSelCellStart+1; iaChords.iKey[i]==key && pBar->aChords.iType[i]==type ) + iCellEnd = i; + else + break; + } + + SelectCells( m_iSelBarStart, iCellStart, m_iSelBarStart, iCellEnd ); + + } + } +} +//----------------------------------------------------------------------------- + +void TContentPanel::SelectRangeByWave( int iHitBar, int iHitPoint ) +{ + TWaveBarList& list = g_aAudioTracks[g_iSelAudio]->lstBars; + int nMiss = 0; + + //ǰҲ + int iBarS = iHitBar, iPtS = iHitPoint; + while( iBarS>=0 ){ + for( ; iPtS>=0; iPtS-- ){ + DWORD dwValue = list[iBarS]->aVols[iPtS]; + WORD wVol = max( LOWORD( dwValue ), HIWORD(dwValue) ); + if( wVol<1024 ){ + nMiss++; + + if( nMiss>4 ) + break; + } + else + nMiss = 0; + } + + if( nMiss>4 || iBarS==0 ) + break; + else{ + iPtS = POINTS_PER_BAR - 1; + iBarS--; + } + } + + //Ҳյ + nMiss = 0; + int iBarE = iHitBar, iPtE = iHitPoint; + while( iBarEaVols[iPtE]; + WORD wVol = max( LOWORD( dwValue ), HIWORD(dwValue) ); + if( wVol<1024 ){ + nMiss++; + + if( nMiss>4 ) + break; + } + else + nMiss = 0; + } + + if( nMiss>4 || iBarE==m_nBarNum-1 ) + break; + else{ + iPtE = 0; + iBarE++; + } + } + int ptStart = iBarS * POINTS_PER_BAR + iPtS + nMiss, + ptEnd = iBarE * POINTS_PER_BAR + iPtE - nMiss; + + if( ptEnd - ptStart > 4 ){ + iBarS = ptStart / POINTS_PER_BAR; + iPtS = ptStart % POINTS_PER_BAR; + iBarE = ptEnd / POINTS_PER_BAR; + iPtE = ptEnd % POINTS_PER_BAR; + + SelectRange( iBarS, iPtS, iBarE, iPtE ); + } +} +//----------------------------------------------------------------------------- +/* +void TContentPanel::SelectRangeByEffect( int iHitBar, int iHitPoint , int delta ) +{ + TAudioTrack* pTrack = g_aAudioTracks[g_iSelAudio]; + int nEffects = 0, + hE = 1; + + if( pTrack->iEffectShow>0 ){ + for( int i=0; ilstEffects[i] ){ + nEffects++; + } + } + + if( nEffects>0 ){ + hE = 14 / nEffects; + if( hE>4 ) + hE = 4; + } + } + + int hEffects = nEffects * hE; + if( delta >= hEffects ) + return; + + if( pTrack->iEffectShow==1 ){ + delta = hEffects - delta; + } + + int y = 0; + for( int j=0; jlstEffects[j] ){ + y += hE; + } + + if( delta < y ){ + TEffect* pAE = pTrack->lstEffects[j]; + + while( pAE ){ + if( pAE->iBarEnd>iHitBar || pAE->iBarEnd==iHitBar && pAE->iPointEnd>=iHitPoint ){ + if( pAE->iBarStartiBarStart==iHitBar + && pAE->iPointStart<=iHitPoint ){ + SelectRange( pAE->iBarStart, pAE->iPointStart, pAE->iBarEnd, pAE->iPointEnd ); + } + + break; + } + + pAE = pAE->pNext; + } + + break; + } + } + +} +//----------------------------------------------------------------------------- +*/ +void TContentPanel::BeginBrush( TCommonItem* pBrushItem ) +{ + if( m_iMode==VIEW_STYLE ){ + m_pItem = pBrushItem; + + SelectTrack( -1, -1, -1 ); + + if( m_bVertical ) + SelectBars( -1, -1 ); + else + SelectRange( -1, -1, -1, -1 ); + } + + m_bBrush = true; + SetCapture( Handle ); +} +//----------------------------------------------------------------------------- + +void TContentPanel::CancelBrush() +{ + m_bBrush = false; + m_pItem = NULL; +} +//----------------------------------------------------------------------------- + +void TContentPanel::HandleBrush() +{ + if( m_iMode==VIEW_STYLE ){ + if( !m_pItem ) + return; + + if( m_bPlaying ) + Parent->Perform( UM_STOP, STOP_CONTENT, 0 ); + + // ʵЧֹλ + int iStartBar = m_iSelBarStart, + iEndBar = m_iSelBarEnd, + iFStage = g_Opus.FindStage( iStartBar, NULL ), + iLStage = g_Opus.FindStage( iEndBar, NULL ); + + iStartBar = -1; + iEndBar = -1; + for( int i=iFStage; i<=iLStage; i++ ){ + if( m_pItem->iType==SEGTYPE_TRACK && g_lstOpusStages[i]->iSegType==((TTrackItem*)m_pItem)->GetSegType() + || m_pItem->iType==SEGTYPE_SEGMENT && g_lstOpusStages[i]->iSegType<=SEGTYPE_FILL ){ + int iFBar = g_Opus.StageFirstBar( i ); + if( iFBar > m_iSelBarStart ) + iStartBar = iFBar; + else + iStartBar = m_iSelBarStart; + + break; + } + } + + if( iStartBar>=0 ){ + for( int i=iLStage; i>=iFStage; i-- ){ + if( m_pItem->iType==SEGTYPE_TRACK && g_lstOpusStages[i]->iSegType==((TTrackItem*)m_pItem)->GetSegType() + || m_pItem->iType==SEGTYPE_SEGMENT && g_lstOpusStages[i]->iSegType<=SEGTYPE_FILL ){ + int iLBar = g_Opus.StageLastBar( i ); + if( iLBar > m_iSelBarEnd ) + iEndBar = m_iSelBarEnd; + else + iEndBar = iLBar; + + break; + } + } + } + + if( iStartBar<0 || iEndBar<0 || iStartBar>iEndBar ){ + SelectBars( -1, -1 ); + return; + } + + if( iStartBar!=m_iSelBarStart || iEndBar!=m_iSelBarEnd ) + SelectBars( iStartBar, iEndBar ); + + if( m_pItem->iType==SEGTYPE_TRACK ){ + int iTrack = -1; + TTrackItem* pTrkItem = (TTrackItem*)m_pItem; + TTrack subTrk( pTrkItem->pTrack ); + + if( m_iSelTrack<0 ){ + bool bAdd = true; + if( subTrk.iChanNo==9 ){ + for( int i=0; iIsDrum() ){ + subTrk.iFile = pMT->file; + subTrk.iBank = pMT->bank; + subTrk.iChanSpec = pMT->chno; + subTrk.iProg = pMT->prog; + + iTrack = i; + bAdd = false; + + break; + } + } + } + + if( bAdd ){ + subTrk.iFile = 0xFF; + subTrk.iChanSpec = subTrk.iChanNo; + } + } + else if( m_aTracks[m_iSelTrack]->type==ST_MIDI ){ + TMidiTrack* pMT = (TMidiTrack*)m_aTracks[m_iSelTrack]->pTrack; + + subTrk.iFile = pMT->file; + subTrk.iBank = pMT->bank; + subTrk.iChanSpec = pMT->chno; + subTrk.iProg = pMT->prog; + + iTrack = m_aTracks[m_iSelTrack]->index; + } + + ((TUseStylePanel*)m_pStylePanel)->ChangeTexture( iStartBar, iEndBar, pTrkItem->GetSegType(), + iTrack, &subTrk, SEGTYPE_TRACK ); + } + else + ((TUseStylePanel*)m_pStylePanel)->ReformBars( m_iSelBarStart, m_iSelBarEnd, + (TSegmentItem*)m_pItem ); + } +} +//----------------------------------------------------------------------------- + +void TContentPanel::GetSelectChord( int& iBarKey, int& iChordKey, int& iChordType ) +{ + int key=-1, type=-1, barKey=-1; + + if( m_iSelBarStart>=0 && m_iSelCellStart>=0 ){ + int iFirstBar, iStage = FindStage( m_iSelBarStart, &iFirstBar ); + TOpusStage* pStage = g_lstOpusStages[iStage]; + TBar* pBar = pStage->aBars[m_iSelBarStart-iFirstBar]; + type = pBar->aChords.iType[m_iSelCellStart]; + key = pBar->aChords.iKey[m_iSelCellStart]; + barKey = pBar->iBarKey; + + if( m_iSelBarEnd>m_iSelBarStart || m_iSelCellEnd>m_iSelCellStart ){ + int iBar = m_iSelBarStart, + iCell = m_iSelCellStart; + + while( iBar=g_nChordNumPerBar ){ + iCell = 0; + iBar++; + + if( iBar>=iFirstBar+pStage->aBars.size() ){ + iStage = FindStage( iBar, &iFirstBar ); + pStage = g_lstOpusStages[iStage]; + } + + pBar = pStage->aBars[iBar-iFirstBar]; + + if( barKey!=pBar->iBarKey ){ + barKey = key = type = -1; + break; + } + } + + if( key!=pBar->aChords.iKey[iCell] || type!=pBar->aChords.iType[iCell] ){ + barKey = key = type = -1; + break; + } + } + } + } + + iChordKey = key; + iChordType = type; + iBarKey = barKey; +} +//--------------------------------------------------------------------------- + +bool TContentPanel::SetSelectChord( int iKey, int iChordType ) +{ + if( m_iSelBarStart>=0 && m_iSelCellStart>=0 && ( m_iSelBarEnd>m_iSelBarStart + || m_iSelBarEnd==m_iSelBarStart && m_iSelCellEnd>=m_iSelCellStart )){ + int iFirstBar, iStage = FindStage( m_iSelBarStart, &iFirstBar ); + TOpusStage* pStage = g_lstOpusStages[iStage]; + int iBar = m_iSelBarStart, + iCell = m_iSelCellStart, + iEndBar = m_iSelBarEnd, + iCellEnd = m_iSelCellEnd; + + if( iBar==m_iSelBarEnd && iCell==m_iSelCellEnd //ѡ1 + && iCellaBars[iBar-iFirstBar]->aChords.iKey[iCell], + iOriType = pStage->aBars[iBar-iFirstBar]->aChords.iType[iCell]; + if( pStage->aBars[iBar-iFirstBar]->aChords.iKey[i]==iOriKey + && pStage->aBars[iBar-iFirstBar]->aChords.iType[i]==iOriType ) + iCellEnd++; + else + break; + } + } + int iUndo = 0, + iSelChordNum = (iEndBar - iBar - 1) * g_nChordNumPerBar + + (g_nChordNumPerBar - iCell) + (iCellEnd + 1); + BYTE *pBefore = new BYTE[iSelChordNum], + *pAfter = new BYTE[iSelChordNum]; + + while( iBaraBars[iSBar]->aChords.iKey[iCell]<<4) + + pStage->aBars[iSBar]->aChords.iType[iCell]; + pAfter[iUndo] = (iKey<<4) + iChordType; + iUndo++; + + pStage->aBars[iSBar]->aChords.iKey[iCell] = iKey; + pStage->aBars[iSBar]->aChords.iType[iCell] = iChordType; + + if( g_iPreStage==0 ){ //ʼģʽʱ޸ԭʼ + TOpusStage* pRawStage = g_Theme.StageList()[iStage]; + pRawStage->aBars[iSBar]->aChords.iKey[iCell] = iKey; + pRawStage->aBars[iSBar]->aChords.iType[iCell] = iChordType; + } + + iCell++; + if( iCell>=g_nChordNumPerBar ){ + InvalidateBar( iBar, 0, m_nBarWidth, BAR_DATA ); + + iCell = 0; + iBar++; + + iStage = FindStage( iBar, &iFirstBar ); + pStage = g_lstOpusStages[iStage]; + } + } + + if( iBar==iEndBar && iCell=0 ){ + pTrack = m_aTracks[iTrack]; + + if( pTrack->type==ST_AUDIO && iBar<0 ){ + iBar = 0; + iPoint = 0; + } + } + + if( m_iSelTrack==iTrack && m_iSelTrackBar==iBar && m_iSelTrackPoint==iPoint ) + return; + + int iAudio = pTrack && pTrack->type==ST_AUDIO ? pTrack->index : -1, + iMidi = pTrack && pTrack->type==ST_MIDI ? pTrack->index : -1; + + if( m_iSelTrack!=iTrack ){ + if( m_iSelTrack>=m_iBeginShowTrack && m_iSelTrack-m_iBeginShowTrack ClientHeight - m_nBottomBound ) + nH = ClientHeight - m_nBottomBound - top; + + RECT rectOld; + SetRect( &rectOld, m_nLeftOriBound, top, m_nLeftBound-4, top + nH ); + InvalidateRect( Handle, &rectOld, false ); + } + } + + m_iSelTrack = iTrack; + g_iSelAudio = iAudio; + g_iSelMidiTrack = iMidi; + + if( iTrack>=0 ){ + if( iTrack=m_nTrackShow ){ + if( !m_bVertical ){ + int nPos = iTrack ClientHeight - m_nBottomBound ) + nH = ClientHeight - m_nBottomBound - top; + + RECT rectNew; + SetRect( &rectNew, m_nLeftOriBound, top, m_nLeftBound-4, top + nH ); + InvalidateRect( Handle, &rectNew, false ); + } + } + } + + if( ( !w_bDraging || m_iDragAudio>=0 ) && m_pTrackPanel && m_pTrackPanel->Visible ){ + ((TTrackPanel*)m_pTrackPanel)->SetSelTrack( pTrack ? pTrack->type : -1, + pTrack ? pTrack->index : -1 ); + } + } + else if( pTrack && pTrack->type==ST_AUDIO ){ + if( m_iSelTrackBar>=0 ){ + int iRow = m_bVertical ? m_iSelTrackBar / m_nColumnNum - m_iBeginShowRow : 0, + iCol = m_bVertical ? m_iSelTrackBar % m_nColumnNum : m_iSelTrackBar - m_iBeginShowBar; + + if( iRow>=0 && iRow=0 && iCol ClientHeight - m_nBottomBound ) + nH = ClientHeight - m_nBottomBound - top; + + RECT rectOld; + SetRect( &rectOld, left, top, left + 1, top + nH ); + InvalidateRect( Handle, &rectOld, false ); + } + } + + if( iBar>=0 ){ + int iRow = m_bVertical ? iBar / m_nColumnNum - m_iBeginShowRow : 0, + iCol = m_bVertical ? iBar % m_nColumnNum : iBar - m_iBeginShowBar; + + if( iRow>=0 && iRow=0 && iCol ClientHeight - m_nBottomBound ) + nH = ClientHeight - m_nBottomBound - top; + + for( int i=0; iPixels[left][top + i] = clrInsertLine; + } + } + } + } + + m_iSelTrackBar = iBar; + m_iSelTrackPoint = iPoint; + } +//--------------------------------------------------------------------------- + +void TContentPanel::SelectRange( int iBarStart, int iPointStart, int iBarEnd, int iPointEnd, bool bInvalid ) +{ + if( iBarStart==0 && iPointStart<5 ){ + iPointStart = 0; + } + + if( (m_iDragAudio<0 || g_iSelAudio==m_iDragAudio) + && m_iSelBarStart==iBarStart && m_iSelPointStart==iPointStart + && m_iSelBarEnd==iBarEnd && m_iSelPointEnd==iPointEnd){ + if( bInvalid && m_iSelTrack>=0 ){ + InvalidateBars( iBarStart, iBarEnd, BAR_TRACK | (m_iSelTrack+1) ); + } + + return; + } + + if( m_iSelTrack<0 ){ + m_iSelTrackBar = m_iSelTrackPoint = -1; + return; + } + + int iTrack = m_iSelTrack + 1;// GetShowTrackId( ST_AUDIO, g_iSelAudio )<<8; + + if( iBarStart>=0 ){ + m_iSelTrackBar = iBarStart; + m_iSelTrackPoint = iPointStart; + } + else if( iBarEnd>=0 ){ + m_iSelTrackBar = m_iSelTrackPoint = 0; + } + + if( m_iDragAudio>0 && g_iSelAudio!=m_iDragAudio || bInvalid ){ + m_iSelPointStart = iPointStart; + m_iSelPointEnd = iPointEnd; + SelectBars( iBarStart, iBarEnd ); + + InvalidateBars( iBarStart, iBarEnd, BAR_TRACK | iTrack ); + } + else if( iBarStart!=m_iSelBarStart || iBarEnd!=m_iSelBarEnd ){ + int iOldBarStart = m_iSelBarStart, + iOldBarEnd = m_iSelBarEnd; + + m_iSelPointStart = iPointStart; + m_iSelPointEnd = iPointEnd; + SelectBars( iBarStart, iBarEnd ); + + int iInvBarEnd = min( iOldBarStart, iBarStart ); + if( iInvBarEnd<0 ) + iInvBarEnd = max( iOldBarStart, iBarStart ); + + if( iInvBarEnd>=0 ) + InvalidateBars( 0, iInvBarEnd, BAR_TRACK | iTrack ); + + int iInvBarStart = max( iOldBarEnd, iBarEnd ); + if( iInvBarStart<0 ) + iInvBarStart = iInvBarEnd; + + if( iInvBarStart>=0 ) + InvalidateBars( iInvBarStart, m_nBarNum-1, BAR_TRACK | iTrack ); + } + else if( iBarStart==iBarEnd ){ + m_iSelPointStart = iPointStart; + m_iSelPointEnd = iPointEnd; + + InvalidateBar( iBarStart, 0, m_nBarWidth, BAR_TRACK | iTrack ); + } + else{ + if( iPointStart!=m_iSelPointStart ){ + int l = min( m_iSelPointStart, iPointStart ), + r = max( m_iSelPointStart, iPointStart ); + + m_iSelPointStart = iPointStart; + InvalidateBar( iBarStart, l, r, BAR_TRACK | iTrack ); + } + + if( iPointEnd!=m_iSelPointEnd ){ + int l = min( m_iSelPointEnd, iPointEnd ), + r = max( m_iSelPointEnd, iPointEnd ); + + m_iSelPointEnd = iPointEnd; + InvalidateBar( iBarEnd, l, r, BAR_TRACK | iTrack ); + } + } +} +//--------------------------------------------------------------------------- + +void __fastcall TContentPanel::DoSelectAll(System::TObject* Sender) +{ + if( m_nBarNum==0 ) + return; + + if( m_iMode==VIEW_TRACK ){ + SelectRange( 0, 0, m_nBarNum-1, m_nDataWidth-1 ); + } + else if( m_iMode==VIEW_STYLE ){ + SelectBars( 0, m_nBarNum-1 ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TContentPanel::DoCancelAll(System::TObject* Sender) +{ + if( m_iMode==VIEW_CHORD ){ + SelectCells( -1, -1, -1, -1 ); + SelectCopyCells( -1, -1, -1, -1 ); + } + else if( m_iMode==VIEW_TRACK ){ + SelectRange( -1, -1, -1, -1 ); + SelectCopyPos( -1, -1, -1, -1 ); + } + else if( m_iMode==VIEW_STYLE ){ + SelectBars( -1, -1 ); + SelectCopyBars( -1, -1 ); + } + + ReleaseCapture(); + m_bDragReady = false; + m_bDraging = false; + m_bBrush = false; + m_iMouseDownBar = m_iMouseDownPoint = -1; + m_pItem = NULL; +} +//--------------------------------------------------------------------------- + +// +void __fastcall TContentPanel::DoBarsCopy(System::TObject* Sender) +{ + if( !m_bDraging && m_iSelBarEnd>=0 ){ + bool bSetCopy = false; + int iLSBar, iStage = FindStage( m_iSelBarEnd, &iLSBar ); + + if( g_lstOpusStages[iStage]->iSegType==SEGTYPE_ENDING ){ + int iFirstStage = FindStage( m_iSelBarStart, NULL ); + if( iFirstStage!=iStage ){ + SelectBars( m_iSelBarStart, iLSBar-1 ); + bSetCopy = true; + } + } + else{ + bSetCopy = true; + } + + if( bSetCopy ) + SelectCopyBars( m_iSelBarStart, m_iSelBarEnd, false ); + } +} +//--------------------------------------------------------------------------- + +// +void __fastcall TContentPanel::DoBarsCut(System::TObject* Sender) +{ + if( !m_bDraging && m_iSelBarEnd>=0 ){ + bool bSetCopy = false; + int iLSBar, iStage = FindStage( m_iSelBarEnd, &iLSBar ); + + if( g_lstOpusStages[iStage]->iSegType==SEGTYPE_ENDING ){ + int iFirstStage = FindStage( m_iSelBarStart, NULL ); + if( iFirstStage!=iStage ){ + SelectBars( m_iSelBarStart, iLSBar-1 ); + bSetCopy = true; + } + } + else{ + bSetCopy = true; + } + + if( bSetCopy ) + SelectCopyBars( m_iSelBarStart, m_iSelBarEnd, true ); + } +} +//--------------------------------------------------------------------------- + +// +void __fastcall TContentPanel::DoBarsInsert(System::TObject* Sender) +{ + if( !m_bDraging && m_iSelBarStart>=0 && m_iCopyBarStart>=0 ){ + int iSelStart = m_iSelBarStart, + //iSelEnd = m_iSelBarEnd, + iCopyStart = m_iCopyBarStart, + iCopyEnd = m_iCopyBarEnd; + + ((TUseStylePanel*)m_pStylePanel)->MoveBars( iCopyStart, iCopyEnd, + iSelStart, m_bCut ? MODE_MOVE : MODE_COPY ); + + SelectCopyBars( m_iSelBarStart, m_iSelBarEnd ); + } +} +//--------------------------------------------------------------------------- + +// ɾ +void __fastcall TContentPanel::DoBarsDelete(System::TObject* Sender) +{ + if( !m_bDraging && m_iSelBarStart>=0 ){ + ((TUseStylePanel*)m_pStylePanel)->MoveBars( m_iSelBarStart, + m_iSelBarEnd, -1, MODE_DELETE ); + } +} +//--------------------------------------------------------------------------- + +// +void __fastcall TContentPanel::DoBarsChangeKey(System::TObject* Sender) +{ + if( !m_bDraging ){ + int iKey = (int)Sender; + + if( iKey<0 ) + return; + + int* arrKeys = new int[m_iSelBarEnd-m_iSelBarStart+1]; + GetBarKeys( m_iSelBarStart, m_iSelBarEnd, arrKeys ); + g_Undo.AddUndo( UNDO_KEY_BARS, 0, m_iSelBarStart, m_iSelBarEnd, arrKeys, (void*)iKey ); + + ChangeBarsKey( m_iSelBarStart, m_iSelBarEnd, iKey, NULL ); + } +} +//--------------------------------------------------------------------------- + +void TContentPanel::GetBarKeys( int iBarStart, int iBarEnd, int arrKeys[] ) +{ +/* if( g_iPreStage==0 ){ + for( int i=iBarStart; i<=iBarEnd; i++ ){ + arrKeys[i] = g_lstRawBars[i]->iBarKey; + } + } + else{ +*/ int iBar = iBarStart; + while( iBar<=iBarEnd ){ + int iFirstBar, iStage = FindStage( iBar, &iFirstBar ); + TOpusStage* pStage = g_lstOpusStages[iStage]; + + int iStart = max( iBar, iFirstBar ), + iEnd = min( iBarEnd, (int)(iFirstBar + pStage->aBars.size() - 1) ); + + for( int i = iStart; i<=iEnd; i++ ){ + arrKeys[iBar-iBarStart] = pStage->iSegType>=SEGTYPE_INTRO ? pStage->iSegKey + : pStage->aBars[i-iFirstBar]->iBarKey; + } + + iBar = iEnd + 1; + } +// } +} +//--------------------------------------------------------------------------- + +void TContentPanel::SelectCopyBars( int iBarStart, int iBarEnd, bool bCut ) +{ + m_bCut = bCut; + + if( m_iCopyBarStart==iBarStart && m_iCopyBarEnd==iBarEnd ) + return; + + int iOldBarStart = m_iCopyBarStart, + iOldBarEnd = m_iCopyBarEnd; + + m_iCopyBarStart = iBarStart; + m_iCopyBarEnd = iBarEnd; + + if( iBarStart<0 && iBarEnd<0 ){ + m_iCopyCellStart = m_iCopyCellEnd = -1; + m_iCopyPointStart = m_iCopyPointEnd = -1; + } + + if( iOldBarStart>=0 ){ + if( iBarStart>=0 ){ + if( iBarStart<=iOldBarEnd || iBarEnd>=iOldBarStart ){ + int iStart = min( iBarStart, iOldBarStart ), + iEnd = max( iBarEnd, iOldBarEnd ); + + InvalidateBars( iStart, iEnd, BAR_TITLE|BAR_DATA|BAR_TRACK ); + } + else{ + InvalidateBars( iOldBarStart, iOldBarEnd, BAR_TITLE|BAR_DATA|BAR_TRACK ); + InvalidateBars( iBarStart, iBarEnd, BAR_TITLE|BAR_DATA|BAR_TRACK ); + } + } + else{ + InvalidateBars( iOldBarStart, iOldBarEnd, BAR_TITLE|BAR_DATA|BAR_TRACK ); + } + } + else if( iBarStart>=0 ){ + InvalidateBars( iBarStart, iBarEnd, BAR_TITLE|BAR_DATA|BAR_TRACK ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TContentPanel::DoChordCopy(System::TObject* Sender) +{ + if( !m_bDraging && m_iSelBarStart>=0 ){ + SelectCopyCells( m_iSelBarStart, m_iSelCellStart, m_iSelBarEnd, m_iSelCellEnd ); + } +} +//--------------------------------------------------------------------------- + +void TContentPanel::ChordPaste( int key[], int type[], int len, bool bAddUndo ) +{ + BYTE *pBefore=NULL, *pAfter=NULL; + int iSelChordNum = (m_iSelBarEnd - m_iSelBarStart - 1) * g_nChordNumPerBar + + (g_nChordNumPerBar - m_iSelCellStart) + (m_iSelCellEnd + 1); + + int iCell, iStage, iBarCount, iBar, iBarFirst, index = 0, iUndo=0; + iCell = m_iSelCellStart; + iBar = m_iSelBarStart; + + iStage = FindStage(iBar, &iBarFirst); + TOpusStage *pStage = g_lstOpusStages[iStage]; + iBarCount = pStage->aBars.size(); + + int iSBar = iBar - iBarFirst; + TBar *pBar = pStage->aBars[iSBar]; + + if( bAddUndo ){ + pBefore = new BYTE[iSelChordNum]; + pAfter = new BYTE[iSelChordNum]; + } + + while(iSelChordNum--){ + if( pBefore && pAfter ){ + pBefore[iUndo] = ( pBar->aChords.iKey[iCell]<<4 ) + pBar->aChords.iType[iCell]; + pAfter[iUndo] = ( key[index]<<4 ) + type[index]; + iUndo++; + } + + pBar->aChords.iKey[iCell] = key[index]; + pBar->aChords.iType[iCell] = type[index]; + + if( g_iPreStage==0 ){ //ʼģʽʱ޸ԭʼ + TOpusStage* pRawStage = g_Theme.StageList()[iStage]; + pRawStage->aBars[iSBar]->aChords.iKey[iCell] = key[index]; + pRawStage->aBars[iSBar]->aChords.iType[iCell] = type[index]; + } + + index++; + if(index == len) index = 0; // ظճ + + iCell++; + if(iCell >= g_nChordNumPerBar){ + iCell = 0; + iBar++; + + if((iBar - iBarFirst) >= iBarCount){ + if( ++iStage>=g_lstOpusStages.size() ) + break; + + iBarFirst = FirstBar(iStage); + pStage = g_lstOpusStages[iStage]; + iBarCount = pStage->aBars.size(); + } + + iSBar = iBar - iBarFirst; + + pBar = pStage->aBars[iSBar]; + } + } + + if( bAddUndo ){ + int iBegin = MAKELONG( m_iSelCellStart, m_iSelBarStart ), + iEnd = MAKELONG( m_iSelCellEnd, m_iSelBarEnd ); + + g_Undo.AddUndo( UNDO_CHORD, 0, iBegin, iEnd, (void*)pBefore, (void*)pAfter ); + } + + InvalidateBars( m_iSelBarStart, m_iSelBarEnd ); +} +//--------------------------------------------------------------------------- + +void __fastcall TContentPanel::DoChordPaste(System::TObject* Sender) +{ + if( m_bDraging || m_iSelBarStart<0 || m_iCopyBarStart<0 ) + return; + else if( m_iCopyBarStart==m_iSelBarStart && m_iCopyCellStart==m_iSelCellStart )// ճ + return; + + int iChordNum = (m_iCopyBarEnd - m_iCopyBarStart - 1) * g_nChordNumPerBar + + (g_nChordNumPerBar - m_iCopyCellStart) + (m_iCopyCellEnd + 1); + + int *iKey = new int[iChordNum]; + int *iType = new int[iChordNum]; + + int iCell, iStage, iBarCount, iBar, iBarFirst; + + TOpusStage *pStage = NULL; + TBar *pBar = NULL; + + iCell = m_iCopyCellStart; + iBar = m_iCopyBarStart; + + iStage = FindStage(iBar, &iBarFirst); + pStage = g_lstOpusStages[iStage]; + iBarCount = pStage->aBars.size(); + pBar = pStage->aBars[iBar - iBarFirst]; + + for(int i = 0; i < iChordNum; i++) { + iKey[i] = pBar->aChords.iKey[iCell]; + iType[i] = pBar->aChords.iType[iCell]; + + iCell++; + + if(iCell >= g_nChordNumPerBar){ + iCell = 0; + iBar++; + + if((iBar - iBarFirst) >= iBarCount){ + if( ++iStage>=g_lstOpusStages.size() ) + break; + + iBarFirst = FirstBar(iStage); + pStage = g_lstOpusStages[iStage]; + iBarCount = pStage->aBars.size(); + } + + pBar = pStage->aBars[iBar - iBarFirst]; + } + } + + ChordPaste(iKey, iType, iChordNum); + + delete[] iKey; + delete[] iType; +} +//--------------------------------------------------------------------------- + +void __fastcall TContentPanel::DoChordDelete(System::TObject* Sender) +{ + if( m_bDraging || m_iSelBarStart<0 ) + return; + + int iBar = -1, iCell = -1; + + TOpusStage *pStage = NULL; + TBar *pBar = NULL; + + if(m_iSelCellStart > 0) + { + iBar = m_iSelBarStart; + iCell = m_iSelCellStart - 1; + } + else + { + iBar = m_iSelBarStart - 1; + iCell = g_nChordNumPerBar - 1; + } + + if( iBar>=0 ){ + int iBarFirst, iStage = FindStage(iBar, &iBarFirst); + + if( iStage>=0 ){ + pStage = g_lstOpusStages[iStage]; + if( pStage->iSegType<=SEGTYPE_FILL ){ + pBar = pStage->aBars[iBar - iBarFirst]; + + int iKey = pBar->aChords.iKey[iCell], + iType = pBar->aChords.iType[iCell]; + + SetSelectChord( iKey, iType ); + } + } + } +} +//--------------------------------------------------------------------------- + +void __fastcall TContentPanel::CreateEditMenu(TMenuPanel *Menu, bool bEnabled) +{ + if( g_Opus.BarCount()==0 || !bEnabled ) + return; + + if(m_iMode == VIEW_CHORD){ + Menu->CreateMenu("-"); + + CMenuItem* pMenuItem = Menu->CreateMenu( "ƺ", "Ctrl+C", DoChordCopy ); + pMenuItem->Enabled = m_iSelBarStart>=0; + pMenuItem = Menu->CreateMenu( "ճ", "Ctrl+V", DoChordPaste ); + pMenuItem->Enabled = m_iSelBarStart>=0 && m_iCopyBarStart>=0; + Menu->CreateMenu("-"); + pMenuItem = Menu->CreateMenu( "ǰһͬ", "Ctrl+Del", DoChordDelete ); + + bool bCanDelete = false; + if( m_iSelCellStart != -1 ){ + int iFirstBar, iSelStage = FindStage( m_iSelBarStart, &iFirstBar ); + + if( m_iSelBarStart!=iFirstBar ){ + bCanDelete = true; + } + else if(m_iSelBarStart==iFirstBar && m_iSelCellStart > 0){ + bCanDelete = true; + } + else if(iSelStage > 0){ + TOpusStage *pPreStage = g_lstOpusStages[iSelStage-1]; + if( pPreStage->iSegType<=SEGTYPE_FILL ){ + bCanDelete = true; + } + } + } + pMenuItem->Enabled = bCanDelete; + } + else if(m_iMode == VIEW_STYLE){ + Menu->CreateMenu("-"); + + bool bSel = m_iSelBarStart>=0; + bool bCanCopy = bSel; + + if( m_iSelBarEnd>=0 ){ + int iStage = FindStage( m_iSelBarEnd, NULL ); + if( g_lstOpusStages[iStage]->iSegType==SEGTYPE_ENDING ) + bCanCopy = false; + } + + CMenuItem* pMenuItem = Menu->CreateMenu( "С", "Ctrl+C", DoBarsCopy ); + pMenuItem->Enabled = bSel && bCanCopy; + pMenuItem = Menu->CreateMenu( "С", "Ctrl+X", DoBarsCut ); + pMenuItem->Enabled = bSel && bCanCopy; + Menu->CreateMenu( "-" ); + + pMenuItem = Menu->CreateMenu( "С","Ctrl+Ins",DoInsertBlankBar ); + pMenuItem->Enabled = bSel; + + if( m_iCopyBarStart>=0 ){ + String strText = ""; + strText += m_bCut ? "еС" : "ƵС"; + + pMenuItem = Menu->CreateMenu( strText,"Ctrl+V",DoBarsInsert ); + pMenuItem->Enabled = bSel && m_iCopyBarStart>=0; + } + + pMenuItem = Menu->CreateMenu( "ɾѡС", "Ctrl+Del", DoBarsDelete ); + pMenuItem->Enabled = bSel; + + Menu->CreateMenu("-"); + + pMenuItem = Menu->CreateMenu( "ıѡСڵ" ); + pMenuItem->Enabled = bSel; + if( bSel ){ + for( int i=0; iAppendMenu( g_strMelodyKey[i], "", DoBarsChangeKey, i ); + } + } + + Menu->CreateMenu("-"); + + pMenuItem = Menu->CreateMenu( "ȫѡ", "Ctrl+A", DoSelectAll ); + pMenuItem->Enabled = m_nBarNum>0; + } + else{ + Menu->CreateMenu("-"); + + String strMute = "ѡ", + strSolo = "ѡ"; + if( m_iSelTrack>=0 ){ + bool bMute = m_aTracks[m_iSelTrack]->pTrack->IsMute(), + bSolo = m_aTracks[m_iSelTrack]->pTrack->IsSolo(); + + if( bMute ) + strMute = "ȡ" + strMute; + + if( bSolo ) + strSolo = "ȡ" + strSolo; + } + + CMenuItem* pMenuItem = Menu->CreateMenu( strMute, "", DoTrackMute ); + pMenuItem->Enabled = m_iSelTrack>=0; + pMenuItem = Menu->CreateMenu( strSolo, "",DoTrackSolo ); + pMenuItem->Enabled = m_iSelTrack>=0; + pMenuItem = Menu->CreateMenu( "ɾѡ", "", DoTrackDel, IDM_TRKSHOW+m_iSelTrack ); + pMenuItem->Enabled = m_iSelTrack>=0; + pMenuItem = Menu->CreateMenu( "ѡ", "", DoTrackHide, IDM_TRKSHOW+m_iSelTrack ); + pMenuItem->Enabled = m_iSelTrack>=0; + + Menu->CreateMenu("-"); + + pMenuItem = Menu->CreateMenu( "ȫѡ", "Ctrl+A", DoSelectAll ); + pMenuItem->Enabled = m_iSelTrack>=0; + + if( m_iSelTrack>=0 ){ + if( m_aTracks[m_iSelTrack]->type==ST_AUDIO ){ + pMenuItem = Menu->CreateMenu( "ѡƵ", "Ctrl+C", DoAudioCopy ); + pMenuItem->Enabled = m_iSelBarStart>=0 || m_iSelBarEnd>=0; + pMenuItem = Menu->CreateMenu( "ѡƵ", "Ctrl+X", DoAudioCut ); + pMenuItem->Enabled = m_iSelBarStart>=0 || m_iSelBarEnd>=0; + pMenuItem = Menu->CreateMenu( "ɾѡƵ", "Ctrl+Del", DoAudioDelete ); + pMenuItem->Enabled = m_iSelBarStart>=0 || m_iSelBarEnd>=0; + + if( m_iCopyBarStart>=0 ){ + Menu->CreateMenu("-"); + String strText = "ճ"; + strText += m_bCut ? "еƵ" : "ƵƵ"; + pMenuItem = Menu->CreateMenu( strText, "Ctrl+V", DoAudioPaste ); + } + + Menu->CreateMenu("-"); + Menu->CreateMenu( "Ϊ¼", "", DoSetSelPosStart ); + Menu->CreateMenu( "Ϊ¼յ", "", DoSetSelPosEnd ); + pMenuItem = Menu->CreateMenu( "ȡ¼", "", DoDelSelPosStart ); + pMenuItem->Enabled = m_iSelBarStart>=0; + pMenuItem = Menu->CreateMenu( "ȡ¼յ", "", DoDelSelPosEnd ); + pMenuItem->Enabled = m_iSelBarEnd>=0; + + Menu->CreateMenu("-"); + Menu->CreateMenu( "ƵƬ...", "Ctrl+Ins", DoAudioLoad ); + + bool bSP = m_iSelBarStart>=0 || m_iSelBarEnd>=0; + + CMenuItem *pMSPFx = NULL, + *pMSPVst = NULL, + *pMSP = Menu->CreateMenu( "ֲЧ" ), + *pMAdd = Menu->CreateMenu( "ӹЧ" ), + *pMAddFx = pMAdd->AppendMenu( "FxЧ" ), + *pMAddVst = pMAdd->AppendMenu( "VSTЧ" ); + pMSP->Enabled = bSP; + pMAddVst->Enabled = !g_lstVSTFx.empty(); + + if( bSP ){ + pMSPFx = pMSP->AppendMenu( "FxЧ" ); + pMSPVst = pMSP->AppendMenu( "VSTЧ" ); + pMSPVst->Enabled = !g_lstVSTFx.empty(); + } + + for( int i=0; iAppendMenu( g_strEffect[i], "", DoAudioFxProcess, i ); + + if( iAppendMenu( g_strEffect[i], "", DoAudioAddFx, i ); + } + + if( !g_lstVSTFx.empty() ){ + for( int i=0; istrFileName, '\\' )+1, + *ext = strrchr( pVST->strFileName, '.' ); + + if( ext>name ){ + strncpy( fname, name, ext-name ); + fname[ext-name] = '\0'; + } + else + strcpy(fname, name ); + + if( !pVST->aPlugins.empty() ) + strcat( fname, " ..." ); + + if( pMSPVst ) + pMSPVst->AppendMenu( fname, "", DoAudioVstProcess, i ); + pMAddVst->AppendMenu( fname, "", DoAudioAddVst, i ); + } + } + } + else{ + bool bContent=false, bSwitch=false, bInsert=true; + + if( m_iSelBarStart>=0 && m_iSelBarEnd>0 ){ + TMidiTrack* pMT = (TMidiTrack*)m_aTracks[m_iSelTrack]->pTrack; + int iBStage = FindStage( m_iSelBarStart, NULL ), + iEStage = FindStage( m_iSelBarEnd, NULL ); + + for( int i=iBStage; i<=iEStage; i++ ){ + TOpusStage* pStage = g_lstOpusStages[i]; + if( !bSwitch && pStage->iSegType<=SEGTYPE_FILL ) + bSwitch = true; + + if( bInsert && pMT->IsDrum() && pStage->aTracks[0]->iChanNo==9 ) + bInsert = false; + } + + for( int i=0; iaStages.size(); i++ ){ + int s = pMT->aStages[i]; + + if( s>=iBStage && s<=iEStage ){ + bContent = true; + break; + } + else if( s>iEStage ){ + break; + } + } + } + + pMenuItem = Menu->CreateMenu( "֯...", "Ctrl+Ins", DoInsertTexture ); + pMenuItem->Enabled = !bContent && bSwitch && bInsert; + pMenuItem = Menu->CreateMenu( "ɾѡ֯", "Ctrl+Del", DoDeleteTexture ); + pMenuItem->Enabled = bContent; + pMenuItem = Menu->CreateMenu( "ѡ֯...", "", DoSwitchTexture ); + pMenuItem->Enabled = bContent && bSwitch; + pMenuItem = Menu->CreateMenu( "ѡ/ɫ...", "", DoSwitchFontProg ); + pMenuItem->Enabled = bContent; + pMenuItem = Menu->CreateMenu( "֯...", "", DoTrackSwitchTexture ); + pMenuItem->Enabled = bContent && bSwitch; + pMenuItem = Menu->CreateMenu( "/ɫ...", "", DoTrackSwitchFontProg ); + } + } + } +} +//--------------------------------------------------------------------------- + +void __fastcall TContentPanel::CreateTrackMenu(TMenuPanel *pMenu, bool bEnabled) +{ + CMenuItem* pMenuItem = pMenu->CreateMenu( "" ); + pMenuItem->Enabled = bEnabled && m_nBarNum; + if( pMenuItem->Enabled ){ + CMenuItem* pSubMenu = pMenuItem->AppendMenu( "Ƶ", "", DoTrackAdd, ST_AUDIO ); + pSubMenu->Enabled = g_aAudioTracks.size()AppendMenu( "MIDI...", "", DoTrackAdd, ST_MIDI ); + pSubMenu->Enabled = !m_bVertical; + } + + pMenuItem = pMenu->CreateMenu( "ɾ" ); + pMenuItem->Enabled = bEnabled && m_nBarNum; + if( pMenuItem->Enabled ){ + CMenuItem* pSubMenu = pMenuItem->AppendMenu( "ȫƵ", "", DoTrackDel, ST_AUDIO ); + pSubMenu->Enabled = g_iPreStage==0 && !g_aAudioTracks[0]->lstBars.empty() + || g_iPreStage!=0 && g_aAudioTracks.size()>1; + + pSubMenu = pMenuItem->AppendMenu( "ȫMIDI", "", DoTrackDel, ST_MIDI ); + pSubMenu->Enabled = !m_bVertical && !g_Midi.IsEmpty(); + } + + pMenuItem = pMenu->CreateMenu( "" ); + pMenuItem->Enabled = bEnabled && m_nBarNum; + if( pMenuItem->Enabled ){ + CMenuItem* pSubMenu = pMenuItem->AppendMenu( "ȫƵ", "", DoTrackHide, ST_AUDIO ); + bool bCanDo = false; + if( g_iPreStage==0 ){ + if( !g_aAudioTracks[0]->lstBars.empty() && !g_aAudioTracks[0]->IsHide() ) + bCanDo = true; + } + else{ + for( int i=1; iIsHide() ){ + bCanDo = true; + break; + } + } + } + pSubMenu->Enabled = bCanDo; + + pSubMenu = pMenuItem->AppendMenu( "ȫMIDI", "", DoTrackHide, ST_MIDI ); + bCanDo = false; + if( !m_bVertical ){ + for( int i=0; iIsHide() ){ + bCanDo = true; + break; + } + } + } + pSubMenu->Enabled = bCanDo; + } + + pMenuItem = pMenu->CreateMenu( "ʾ" ); + pMenuItem->Enabled = bEnabled && m_nBarNum; + if( pMenuItem->Enabled ){ + bool bHasSubAudio = false, + bHasSubMidi = false; + String strText; + + CMenuItem *pAudioMenu = pMenuItem->AppendMenu( "ȫƵ", "", DoTrackShow, ST_AUDIO ), + *pMidiMenu = pMenuItem->AppendMenu( "ȫMIDI", "", DoTrackShow, ST_MIDI ); +/*////////////////////////////////////////////////// +// test code + pMenuItem->AppendMenu( "-" ); + for( int i=0; i<25; i++ ){ + strText = "Ƶ " + IntToStr( i ); + pMenuItem->AppendMenu( strText ); + } + pMenuItem->AppendMenu( "-" ); + for( int i=0; i<25; i++ ){ + strText = "MIDI " + IntToStr( i ); + pMenuItem->AppendMenu( strText ); + } + pMenuItem->AppendMenu( "-" ); + for( int i=0; i<25; i++ ){ + strText = "Other " + IntToStr( i ); + pMenuItem->AppendMenu( strText ); + } + +// +/*/////////////////////////////////////////////////// +/* for( int i=0; ipTrack->IsHide() ){ + if( pST->type==ST_AUDIO ){ + if( !bHasSubAudio ){ + pMenuItem->AppendMenu( "-" ); + bHasSubAudio = true; + } + + int iTrk = pST->index==0 ? 1 : pST->index; + strText = "Ƶ " + IntToStr( iTrk ); + pMenuItem->AppendMenu( strText, "", DoTrackShow, IDM_TRKSHOW+i ); + } + else{ + if( !bHasSubMidi ){ + pMenuItem->AppendMenu( "-" ); + bHasSubMidi = true; + } + + strText = "MIDI " + IntToStr( pST->index+1 ); + pMenuItem->AppendMenu( strText, "", DoTrackShow, IDM_TRKMID+i ); + } + } + } +*/ + if( g_iPreStage!=0 && g_aAudioTracks.size()>1 ){ + for (int i = 1; i < g_aAudioTracks.size(); i++) { + if( g_aAudioTracks[i]->IsHide() ){ + if( !bHasSubAudio ){ + pMenuItem->AppendMenu( "-" ); + bHasSubAudio = true; + } + + strText = "Ƶ " + IntToStr( i ); + pMenuItem->AppendMenu( strText, "", DoTrackShow, IDM_TRKAUD+i ); + } + } + } + else if( g_iPreStage==0 && g_aAudioTracks[0]->IsHide() && !g_aAudioTracks[0]->lstBars.empty() ){ + pMenuItem->AppendMenu( "-" ); + bHasSubAudio = true; + + strText = "Ƶ " + IntToStr( 1 ); + pMenuItem->AppendMenu( strText, "", DoTrackShow, IDM_TRKAUD ); + } + + if( !m_bVertical ){ + for (int i = 0; i < g_aMidiTracks.size(); i++) { + if( g_aMidiTracks[i]->IsHide() ){ + if( !bHasSubMidi ){ + pMenuItem->AppendMenu( "-" ); + bHasSubMidi = true; + } + + strText = "MIDI " + IntToStr( i+1 ); + pMenuItem->AppendMenu( strText, "", DoTrackShow, IDM_TRKMID+i ); + } + } + } + + pAudioMenu->Enabled = bHasSubAudio; + pMidiMenu->Enabled = bHasSubMidi; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TContentPanel::DoSetSelPosStart(System::TObject* Sender) +{ + int iHitType = -1; + DWORD dwHit = HitTest( ptDown.X, ptDown.Y, iHitType ); + + int iBarStart = LOWORD(dwHit), + iPointStart = HIWORD(dwHit), + iBarEnd = m_iSelBarEnd, + iPointEnd = m_iSelPointEnd; + + int iMaxPoint = m_nBarNum * m_nDataWidth - 1, + iStartPoint = iBarStart * m_nDataWidth + iPointStart; + int minArea = max( 10, (int)( g_nPPB / 4.0 + 0.5 )); + + if( iStartPoint > iMaxPoint - minArea ){ + iStartPoint = iMaxPoint - minArea; + iBarStart = iStartPoint / m_nDataWidth; + iPointStart = iStartPoint % m_nDataWidth; + } + + if( iBarEnd>=0 ){ + int iEndPoint = iBarEnd * m_nDataWidth + iPointEnd; + if( iEndPoint > iStartPoint ){ + if( iEndPoint < iStartPoint + minArea ){ + iEndPoint = iStartPoint + minArea; + iBarEnd = iEndPoint / m_nDataWidth; + iPointEnd = iEndPoint % m_nDataWidth; + } + } + else{ + iBarEnd = -1; + iPointEnd = -1; + } + } + + SelectRange( iBarStart, iPointStart, iBarEnd, iPointEnd ); +} +//--------------------------------------------------------------------------- + +void __fastcall TContentPanel::DoSetSelPosEnd(System::TObject* Sender) +{ + int iHitType = -1; + DWORD dwHit = HitTest( ptDown.X, ptDown.Y, iHitType ); + + int iBarStart = m_iSelBarStart, + iPointStart = m_iSelPointStart, + iBarEnd = LOWORD(dwHit), + iPointEnd = HIWORD(dwHit); + + int iMinPoint = 0, + iEndPoint = iBarEnd * m_nDataWidth + iPointEnd; + int minArea = max( 10, (int)( g_nPPB / 4.0 + 0.5 )); + + if( iEndPoint < iMinPoint + minArea ){ + iEndPoint = iMinPoint + minArea; + iBarEnd = iEndPoint / m_nDataWidth; + iPointEnd = iEndPoint % m_nDataWidth; + } + + if( iBarStart>=0 ){ + int iStartPoint = iBarStart * m_nDataWidth + iPointStart; + if( iEndPoint > iStartPoint ){ + if( iEndPoint < iStartPoint + minArea ){ + iStartPoint = iEndPoint - minArea; + iBarStart = iStartPoint / m_nDataWidth; + iPointStart = iStartPoint % m_nDataWidth; + } + } + else{ + iBarStart = -1; + iPointStart = -1; + } + } + + SelectRange( iBarStart, iPointStart, iBarEnd, iPointEnd ); +} +//--------------------------------------------------------------------------- + +void __fastcall TContentPanel::DoDelSelPosStart(System::TObject* Sender) +{ + if( m_iSelBarStart>=0 ){ + SelectRange( -1, -1, m_iSelBarEnd, m_iSelPointEnd ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TContentPanel::DoDelSelPosEnd(System::TObject* Sender) +{ + if( m_iSelBarEnd>=0 ){ + SelectRange( m_iSelBarStart, m_iSelPointStart, -1, -1 ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TContentPanel::DoInsertBlankBar(System::TObject* Sender) +{ + if( !m_bDraging && m_iSelBarStart>=0 ){ + bool bPreChange = g_iPreStage==0; + if( bPreChange ){ + DuplicateRawBars(); + PostMessage( Parent->Handle, UM_STAGECHANGED, 3, 0 ); + } + + f_MM_AddUndoBefore( -1, NULL ); + + ((TUseStylePanel*)m_pStylePanel)->InsertBlankBar( m_iSelBarStart ); + + if( bPreChange ) + InitialVars(); + + SelectBars( m_iSelBarStart, m_iSelBarStart ); + + f_MM_AddUndoAfter( -1, NULL ); + ((TUseStylePanel*)m_pStylePanel)->SetBarsUndo( UNDO_BAR_INSERT, m_iSelBarStart, 1 ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TContentPanel::DoTrackAdd(System::TObject* Sender) +{ + Parent->Perform( UM_STOP, STOP_CONTENT, 0 ); + + if( (int)Sender==ST_AUDIO ){ + if( g_iPreStage==0 ){ + DuplicateRawBars(); + PostMessage( Parent->Handle, UM_STAGECHANGED, 3, 0 ); + } + + TAudioTrack* pTrack = NewAudioTrack( g_Opus.BarCount() ); + if( pTrack ){ + if( VIEW_TRACK!=m_iMode ) + Application->MainForm->Perform( UM_SETVIEWMODE, VIEW_TRACK, 0 ); + + InitialVars(); + + SelectTrack( m_aTracks.size()-1, -1, -1 ); + ShowPlayPoint(); + } + } + else{ + Parent->Perform( UM_STOP, STOP_USESTYLE, 0 ); + ChangeMidiTrack(); + ShowPlayPoint(); + } +} +//--------------------------------------------------------------------------- +/* +void __fastcall TContentPanel::DoTrackAddAudio(System::TObject* Sender) +{ + Parent->Perform( UM_STOP, STOP_CONTENT | STOP_USESTYLE, 0 ); + + if( g_iPreStage==0 ){ + DuplicateRawBars(); + PostMessage( Parent->Handle, UM_STAGECHANGED, 3, 0 ); +// Parent->Perform( UM_STAGECHANGED, 3, 0 ); + } + + TAudioTrack* pTrack = NewAudioTrack( g_Opus.BarCount() ); + if( pTrack ){ + if( VIEW_TRACK!=m_iMode ) + Application->MainForm->Perform( UM_SETVIEWMODE, VIEW_TRACK, 0 ); + + InitialVars(); + + SelectTrack( m_aTracks.size()-1, -1, -1 ); + ShowPlayPoint(); +// Application->MainForm->Perform( UM_ENABLERECORD, 0, 0 ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TContentPanel::DoTrackAddMidi(System::TObject* Sender) +{ + ChangeMidiTrack(); + ShowPlayPoint(); +} +//--------------------------------------------------------------------------- +*/ +void __fastcall TContentPanel::DoTrackDel(System::TObject* Sender) +{ + if( m_nBarNum==0 ) + return; + + Parent->Perform( UM_STOP, STOP_CONTENT, 0 ); + + int iType = (int)Sender, + index = iTypelstBars.empty() ){ + if( g_aAudioTracks[0]->IsSolo() ) + bSolo = true; + } + else if( g_aAudioTracks.size()>1 ){ + for (int i = 1; i < g_aAudioTracks.size(); i++) { + if( g_aAudioTracks[i]->IsSolo() ) + bSolo = true; + } + } + + DeleteAudioTrack(-1); + InitialVars(); + } + } + else{ + Parent->Perform( UM_STOP, STOP_USESTYLE, 0 ); + + if( !m_bVertical && g_aMidiTracks.size()>0 ){ + ((TUseStylePanel*)m_pStylePanel)->DeleteAllTexture(); + } + } + } + else{ + TShowTrack* pST = m_aTracks[index]; + bSolo = pST->pTrack->IsSolo(); + + if( pST->type==ST_AUDIO ){ + DeleteAudioTrack( pST->index ); + InitialVars(); + } + else{ + Parent->Perform( UM_STOP, STOP_USESTYLE, 0 ); + ((TUseStylePanel*)m_pStylePanel)->ChangeTexture( -1, -1, -1, pST->index, NULL, ST_MIDI ); + } + } + + if( bSolo ) + SetTrackParams(); + + SelectTrack( -1, -1, -1 ); + ShowPlayPoint(); +} +//--------------------------------------------------------------------------- + +void __fastcall TContentPanel::DoTrackShow(System::TObject* Sender) +{ + int iType = (int)Sender, + index = -1; + vector* arrIndex = new vector; + + if( iType>=IDM_TRKMID ){ + index = iType - IDM_TRKMID; + iType = ST_MIDI; + } + else if( iType>=IDM_TRKAUD ){ + index = iType - IDM_TRKAUD; + iType = ST_AUDIO; + } + + if( iType==ST_AUDIO ){ + if( g_iPreStage!=0 && g_aAudioTracks.size()>1 ){ + for (int i = 1; i < g_aAudioTracks.size(); i++) { + if( (index<0 || index==i) && g_aAudioTracks[i]->IsHide() ){ + g_aAudioTracks[i]->Hide( false ); + arrIndex->push_back( (BYTE)i ); + } + } + } + else if( g_iPreStage==0 && index<=0 && g_aAudioTracks[0]->IsHide() + && !g_aAudioTracks[0]->lstBars.empty() ){ + g_aAudioTracks[0]->Hide( false ); + arrIndex->push_back( (BYTE)0 ); + } + } + else{ + for (int i = 0; i < g_aMidiTracks.size(); i++) { + if( ( index<0 || index==i ) && g_aMidiTracks[i]->IsHide() ){ + g_aMidiTracks[i]->Hide( false ); + arrIndex->push_back( (BYTE)i ); + } + } + } + + if( arrIndex->empty() ){ + delete arrIndex; + } + else{ + if( index<0 ){ + if( iType==ST_AUDIO ) + g_Undo.AddUndo( UNDO_TRKAUD_SHOWALL, 0, -1, -1, (void*)arrIndex, NULL ); + else + g_Undo.AddUndo( UNDO_TRKMID_SHOWALL, 0, -1, -1, (void*)arrIndex, NULL ); + } + else{ + if( iType==ST_AUDIO ) + g_Undo.AddUndo( UNDO_TRKAUD_SHOW, 0, -1, -1, (void*)arrIndex, NULL ); + else + g_Undo.AddUndo( UNDO_TRKMID_SHOW, 0, -1, -1, (void*)arrIndex, NULL ); + } + + InitialVars(); + ShowPlayPoint(); + + if( arrIndex->size()==1 ){ + int iShowTrk = (*arrIndex)[0], + id = GetShowTrackId( iType, iShowTrk ) - 1; + SelectTrack( id, -1, -1 ); + } + else{ + SelectTrack( -1, -1, -1 ); + } + + if( iType==ST_AUDIO ) + Application->MainForm->Perform( UM_ENABLERECORD, 0, 0 ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TContentPanel::DoTrackHide(System::TObject* Sender) +{ + int iType = (int)Sender, + index = iType* arrIndex = new vector; + bool bUnselect = false; + + if( index<0 ){ + for( int i=0; itype==iType && !pST->pTrack->IsHide() ){ + pST->pTrack->Hide(true); + arrIndex->push_back( pST->index ); + + if( m_iSelTrack==i ) + bUnselect = true; + } + } + } + else{ + TShowTrack* pST = m_aTracks[index]; + iType = pST->type; + + if( !pST->pTrack->IsHide() ){ + pST->pTrack->Hide(true); + arrIndex->push_back( pST->index ); + + if( m_iSelTrack==index ) + bUnselect = true; + } + } + + if( arrIndex->empty() ){ + delete arrIndex; + } + else{ + if( index<0 ){ + if( iType==ST_AUDIO ) + g_Undo.AddUndo( UNDO_TRKAUD_HIDEALL, 0, -1, -1, (void*)arrIndex, NULL ); + else + g_Undo.AddUndo( UNDO_TRKMID_HIDEALL, 0, -1, -1, (void*)arrIndex, NULL ); + } + else{ + if( iType==ST_AUDIO ) + g_Undo.AddUndo( UNDO_TRKAUD_HIDE, 0, -1, -1, (void*)arrIndex, NULL ); + else + g_Undo.AddUndo( UNDO_TRKMID_HIDE, 0, -1, -1, (void*)arrIndex, NULL ); + } + + if( bUnselect ) + SelectTrack( -1, -1, -1 ); + + InitialVars(); + ShowPlayPoint(); + + if( iType==ST_AUDIO ) + Application->MainForm->Perform( UM_ENABLERECORD, 0, 0 ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TContentPanel::DoTrackMute(System::TObject* Sender) +{ + ((TTrackPanel*)m_pTrackPanel)->OnTrackStateChanged( TRACK_MUTE ); +} +//--------------------------------------------------------------------------- + +void __fastcall TContentPanel::DoTrackSolo(System::TObject* Sender) +{ + ((TTrackPanel*)m_pTrackPanel)->OnTrackStateChanged( TRACK_SOLO ); +} +//--------------------------------------------------------------------------- + +void __fastcall TContentPanel::DoAudioDelete(System::TObject* Sender) +{ + if( m_bDraging || m_iSelBarStart<0 && m_iSelBarEnd<0 ) + return; + + if( m_bPlaying ) + Parent->Perform( UM_STOP, STOP_CONTENT, 0 ); + + if( m_iSelBarStart<0 ){ + m_iSelBarStart = 0; + m_iSelPointStart = 0; + } + + if( m_iSelBarEnd<0 ){ + m_iSelBarEnd = m_nBarNum-1; + m_iSelPointEnd = m_nDataWidth-1; + } + + double dblStartPoint = m_iSelBarStart + (double)m_iSelPointStart / POINTS_PER_BAR, + dblEndPoint = m_iSelBarEnd + (double)m_iSelPointEnd / POINTS_PER_BAR; +// TAudioTrack* pTrack = g_aAudioTracks[g_iSelAudio]; + + //Set Undo + DWORD* aWave = NULL; + if( g_iSelAudio>0 ){ + CopyWave( g_iSelAudio, m_iSelBarStart, m_iSelPointStart, + m_iSelBarEnd, m_iSelPointEnd, &aWave ); + g_Undo.AddUndo( UNDO_AUDIO_ERASE, g_iSelAudio, + MAKELONG( m_iSelPointStart, m_iSelBarStart ), + MAKELONG( m_iSelPointEnd, m_iSelBarEnd ), + (void*)aWave, NULL ); + } + else{ + TAudioTrack* pAudio = CopyAudioTrack( g_iSelAudio, 0, m_nBarNum ); + g_Undo.AddUndo( UNDO_AUDIO_ERASE, g_iSelAudio, g_iMelodyKey, -1, + (void*)pAudio, NULL ); + } + + f_MM_AddUndoBefore( 1, &g_iSelAudio ); + MoveAudio( g_iSelAudio, dblStartPoint, dblEndPoint, -1, -1, MODE_ERASE ); + + if( g_iSelAudio>0 ){ + f_MM_AddUndoAfter( 1, &g_iSelAudio ); + InvalidateBars( m_iSelBarStart, m_iSelBarEnd, + BAR_TRACK | GetShowTrackId(ST_AUDIO,g_iSelAudio) ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TContentPanel::DoAudioCopy(System::TObject* Sender) +{ + if( m_bDraging || m_iSelBarStart<0 && m_iSelBarEnd<0 ) + return; + + SelectCopyPos( m_iSelBarStart, m_iSelPointStart, m_iSelBarEnd, m_iSelPointEnd ); + m_bCut = false; +} +//--------------------------------------------------------------------------- + +void __fastcall TContentPanel::DoAudioCut(System::TObject* Sender) +{ + if( m_bDraging || m_iSelBarStart<0 && m_iSelBarEnd<0 ) + return; + + SelectCopyPos( m_iSelBarStart, m_iSelPointStart, m_iSelBarEnd, m_iSelPointEnd ); + m_bCut = true; +} +//--------------------------------------------------------------------------- + +void __fastcall TContentPanel::DoAudioPaste(System::TObject* Sender) +{ + if( m_bDraging || g_iSelAudio<0 || m_iSelTrackBar<0 + || m_iCopyAudio<0 || m_iCopyBarStart<0 ) + return; + else if( m_iCopyAudio==g_iSelAudio && m_iCopyBarStart==m_iSelTrackBar + && m_iCopyPointStart==m_iSelTrackPoint )// ճ + return; + + AudioMove( m_iCopyAudio, m_iCopyBarStart, m_iCopyPointStart, + m_iCopyBarEnd, m_iCopyPointEnd, m_bCut ); + + if( m_bCut ){ + SelectCopyPos( -1, -1, -1, -1 ); +// m_bCut = false; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TContentPanel::DoAudioLoad(System::TObject* Sender) +{ + PostMessage( Application->MainForm->Handle, UM_AUDIOLOAD, m_iSelTrackBar, m_iSelTrackPoint ); +} +//--------------------------------------------------------------------------- + +void __fastcall TContentPanel::DoTrackSave(System::TObject* Sender) +{ + if( g_iSelAudio>=0 ){ // + PostMessage( Application->MainForm->Handle, UM_SAVEPROJECT, SAVE_AUDIO, g_iSelAudio+1 ); + } + else{ // + PostMessage( Application->MainForm->Handle, UM_SAVEPROJECT, SAVE_COMPOSE, g_iSelMidiTrack+1 ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TContentPanel::DoAudioFxProcess(System::TObject* Sender) +{ + int ind = (int)Sender; + OnAudioEffectProcess( g_aAudioEffectTypes[ind] ); +} +//--------------------------------------------------------------------------- + +void __fastcall TContentPanel::DoAudioVstProcess(System::TObject* Sender) +{ + int ind = (int)Sender; + OnAudioEffectProcess( FX_VST + ind ); +} +//--------------------------------------------------------------------------- + +void __fastcall TContentPanel::DoAudioAddFx(System::TObject* Sender) +{ + int ind = (int)Sender; + + PostMessage( m_pTrackPanel->Handle, UM_AUDIOFX, 0, g_aAudioEffectTypes[ind] ); +} +//--------------------------------------------------------------------------- + +void __fastcall TContentPanel::DoAudioAddVst(System::TObject* Sender) +{ + int ind = (int)Sender; + PostMessage( m_pTrackPanel->Handle, UM_AUDIOFX, 0, FX_VST+ind ); +} +//--------------------------------------------------------------------------- + +void TContentPanel::OnAudioEffectProcess( int iFxType ) +{ + Parent->Perform( UM_STOP, STOP_ALL, 0 ); + + double dblEditStartBar = 0, + dblEditEndBar = m_nBarNum; + + int iModifyBeginBar = m_iSelBarStart, + iModifyBeginPoint = m_iSelPointStart, + iModifyEndBar = m_iSelBarEnd, + iModifyEndPoint = m_iSelPointEnd; + + if( iModifyBeginBar>=0 ){ + dblEditStartBar = iModifyBeginBar + (double)iModifyBeginPoint/POINTS_PER_BAR; + } + else{ + iModifyBeginBar = 0; + iModifyBeginPoint = 0; + } + + if( iModifyEndBar>=0 ){ + dblEditEndBar = iModifyEndBar + (double)iModifyEndPoint/POINTS_PER_BAR; + } + else{ + iModifyEndBar = g_Opus.BarCount(); + iModifyEndPoint = 0; + } + + int iPlugin = -1; + UINT pluginID = 0; + char* strVSTFile = NULL; + + if( iFxType>=FX_VST ){ + VSTINFO* pVST = g_lstVSTFx[iFxType-FX_VST]; + strVSTFile = pVST->strFileName; + + if( !pVST->aPlugins.empty() ){ + TVSTPluginForm* pPlugForm = new TVSTPluginForm( NULL, pVST ); + if( pPlugForm->ShowModal()==mrOk ){ + iPlugin = pPlugForm->m_iSel; + pluginID = pVST->aPlugins[iPlugin]->id; + } + + delete pPlugForm; + + if( iPlugin<0 ) + return; + } + } + + HRESULT hr = f_MM_AudioAddFx( g_iSelAudio, iFxType, strVSTFile, pluginID, true ); + + if( hr!=S_OK ){ + return; + } + + GenerateCompose(); + + TAudioFxForm * pForm = new TAudioFxForm(NULL, g_iSelAudio, dblEditStartBar, dblEditEndBar, + -1, iFxType, iPlugin ); + + if( pForm->ShowModal()==mrOk ){ + // 洦ǰ + DWORD *aBefore = NULL; + CopyWave( g_iSelAudio, iModifyBeginBar, iModifyBeginPoint, + iModifyEndBar, iModifyEndPoint, &aBefore ); + + f_MM_AddUndoBefore( 1, &g_iSelAudio ); + + TProgressForm * frmProgress = new TProgressForm(NULL); + int ret = frmProgress->MM_AudioFxApply( dblEditStartBar, dblEditEndBar ); + int eExtra = frmProgress->GetOpertaionResult(); + + if( ret==mrOk ){ + delete frmProgress; + + f_MM_AddUndoAfter( 1, &g_iSelAudio ); + + // ȡ + int iVolBar = iModifyBeginBar, + iVolPoint = iModifyBeginPoint, + nPoints = ( iModifyEndBar * POINTS_PER_BAR + iModifyEndPoint ) + - ( iModifyBeginBar * POINTS_PER_BAR + iModifyBeginPoint ), + iPoint = 0; + + DWORD *aAfter = new DWORD[nPoints]; + + while( iPoint0 ){ + iSP = iVolPoint; + + if( iSP + nPoints - iPoint < POINTS_PER_BAR ) + iEP = iSP + nPoints - iPoint; + } + else if( nPoints-iPoint < POINTS_PER_BAR ){ + iEP = nPoints - iPoint; + } + + if( iEP > iSP ){ + TWaveBar* pBar = g_aAudioTracks[g_iSelAudio]->lstBars[iVolBar]; + + for( int i=iSP; iaVols[i] = f_MM_GetAudioVolume( g_iSelAudio, iVolBar + i/(double)POINTS_PER_BAR ); + } + + if( aAfter ){ + memcpy( aAfter + iPoint, pBar->aVols + iSP, sizeof(DWORD)*(iEP-iSP) ); + } + + iVolPoint = 0; + iVolBar++; + iPoint += iEP - iSP; + } + else{ + break; + } + } + + g_Undo.AddUndo( UNDO_AUDIO_FX, g_iSelAudio, + MAKELONG( iModifyBeginPoint, iModifyBeginBar ), + MAKELONG( iModifyEndPoint, iModifyEndBar ), + (void*)aBefore, (void*)aAfter ); + + InvalidateBars( iModifyBeginBar, iModifyEndBar, BAR_TRACK | (m_iSelTrack+1) ); + } + else{ + f_MM_CancelAddUndo(); + + if( eExtra!=e_UserCanceled ){ + MessageForm->ShowMessage( "ֲЧδɹ!", MB_ICONERROR|MB_OK ); + } + } + } + + delete pForm; + + f_MM_AudioMoveFx( g_iSelAudio, -1, -1 ); +} +//--------------------------------------------------------------------------- + +void __fastcall TContentPanel::OnTrackStateChanged( int iType, int iIndex, BYTE iState, bool bUnset ) +{ + if( m_bVertical || m_aTracks.empty() ) + return; + + int iShowTrack = GetShowTrackId( iType, iIndex ); + + if( iShowTrack>0 ){ + RECT rect; + int lBox = iState==TRACK_MUTE ? m_nTrkHdrWidth+MUTE_LEFT : m_nTrkHdrWidth+SOLO_LEFT, + tBox = m_nTopBound + m_nRowGapHeight + m_nTitleHeight + m_nChordHeight + SM_TOP + + ( iShowTrack - m_iBeginShowTrack - 1 ) * m_nTrackHeight; + + SetRect( &rect, lBox, tBox, lBox + SM_SIZE, tBox + SM_SIZE ); + + if( bUnset ){ + if( iState==TRACK_MUTE ) + rect.right = m_nTrkHdrWidth+SOLO_LEFT + SM_SIZE; + else + rect.left = m_nTrkHdrWidth+MUTE_LEFT; + } + + InvalidateRect( Handle, &rect, false ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TContentPanel::DoInsertTexture(TObject* Sender) +{ + if( !Sender ){ + bool bContent=false, bSwitch=false, bInsert=true; + + if( m_iSelTrack>=0 && m_iSelBarStart>=0 && m_iSelBarEnd>0 ){ + TMidiTrack* pMT = (TMidiTrack*)m_aTracks[m_iSelTrack]->pTrack; + int iBStage = FindStage( m_iSelBarStart, NULL ), + iEStage = FindStage( m_iSelBarEnd, NULL ); + + for( int i=iBStage; i<=iEStage; i++ ){ + TOpusStage* pStage = g_lstOpusStages[i]; + if( !bSwitch && pStage->iSegType<=SEGTYPE_FILL ) + bSwitch = true; + + if( bInsert && pMT->IsDrum() && pStage->aTracks[0]->iChanNo==9 ) + bInsert = false; + } + + for( int i=0; iaStages.size(); i++ ){ + int s = pMT->aStages[i]; + + if( s>=iBStage && s<=iEStage ){ + bContent = true; + break; + } + else if( s>iEStage ){ + break; + } + } + } + + if( bContent || !bSwitch || !bInsert ) + return; + } + + ChangeMidiTrack( m_iSelTrack>=0 ? m_aTracks[m_iSelTrack]->index : -1, + m_iSelBarStart, m_iSelBarEnd ); +} +//--------------------------------------------------------------------------- + +void __fastcall TContentPanel::DoDeleteTexture(TObject* Sender) +{ + if( m_iSelTrack>=0 && m_aTracks[m_iSelTrack]->type==ST_MIDI ){ + if( !Sender ){ + bool bContent=false; + + if( m_iSelBarStart>=0 && m_iSelBarEnd>0 ){ + TMidiTrack* pMT = (TMidiTrack*)m_aTracks[m_iSelTrack]->pTrack; + int iBStage = FindStage( m_iSelBarStart, NULL ), + iEStage = FindStage( m_iSelBarEnd, NULL ); + + for( int i=0; iaStages.size(); i++ ){ + int s = pMT->aStages[i]; + + if( s>=iBStage && s<=iEStage ){ + bContent = true; + break; + } + else if( s>iEStage ){ + break; + } + } + } + + if( !bContent ) + return; + } + + Parent->Perform( UM_STOP, STOP_CONTENT | STOP_USESTYLE, 0 ); + ((TUseStylePanel*)m_pStylePanel)->ChangeTexture( m_iSelBarStart, m_iSelBarEnd, + -1, m_aTracks[m_iSelTrack]->index, NULL, ST_MIDI ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TContentPanel::DoSwitchTexture(TObject* Sender) +{ + if( m_iSelTrack>=0 && m_aTracks[m_iSelTrack]->type==ST_MIDI ){ + int iSBar = Sender==NULL ? -1 : m_iSelBarStart, + iEBar = Sender==NULL ? -1 : m_iSelBarEnd; + + ChangeMidiTrack( m_aTracks[m_iSelTrack]->index, iSBar, iEBar ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TContentPanel::DoTrackSwitchTexture(TObject* Sender) +{ + DoSwitchTexture( NULL ); +} +//--------------------------------------------------------------------------- + +void __fastcall TContentPanel::DoSwitchFontProg(TObject* Sender) +{ + if( m_iSelTrack>=0 && m_aTracks[m_iSelTrack]->type==ST_MIDI ){ + Parent->Perform( UM_STOP, STOP_ALL, 0 ); + + TShowTrack* pST = m_aTracks[m_iSelTrack]; + TMidiTrack* pMT = g_aMidiTracks[pST->index]; + TSwitchProgForm *sPf = new TSwitchProgForm( NULL, pMT->bank, pMT->prog, pMT->chno ); + + BYTE data[100000]; + int len = 100000; + int iSBar = Sender==NULL ? -1 : m_iSelBarStart, + iEBar = Sender==NULL ? -1 : m_iSelBarEnd; + GetMidiTrackData( len, data, pST->index, iSBar, iEBar, &sPf->m_iStartBar, &sPf->m_lenBar ); + f_MM_LoadDemo( data, len ); + + if( sPf->ShowModal() == mrOk ){ + BYTE iBank = sPf->m_iFont==g_idFont ? 0xFF : sPf->m_iFont; + char iProg = sPf->m_iProg, + iChno = sPf->m_iChno; + + if( iBank!=pMT->bank || iProg!=pMT->prog || iChno!=pMT->chno ){ + ((TUseStylePanel*)m_pStylePanel)->ChangeFont( iSBar, iEBar, + pST->index, iBank, iProg, iChno, ST_MIDI ); + } + } + + delete sPf; + f_MM_LoadDemo( NULL, 0 ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TContentPanel::DoTrackSwitchFontProg(TObject* Sender) +{ + DoSwitchFontProg( NULL ); +} +//--------------------------------------------------------------------------- + +void __fastcall TContentPanel::OnMidiSwitch(TMessage &msg) +{ + if( msg.WParam==0 ) + DoSwitchFontProg( NULL ); + else if( msg.WParam==1 ) + DoSwitchTexture( NULL ); +} +//--------------------------------------------------------------------------- + +void TContentPanel::ChangeMidiTrack( int iMT, int iSBar, int iEBar ) +{ + Parent->Perform( UM_STOP, STOP_CONTENT | STOP_USESTYLE, 0 ); + + TMidiTrack* pMT = iMT<0 ? NULL : g_aMidiTracks[iMT]; + + TStageList lstStages; + char progOri(-1), chanOri(-1), segNoOri(-1); + TPROSTYLE *pStyleOri = NULL; + bool bOriSet = iMT>=0, + bHasDrum = bOriSet && !pMT->IsDrum(); + + if( pMT ){ + progOri = pMT->prog; + + if( pMT->IsDrum() ) + chanOri = 9; + } + + int iEndBar = iEBar<0 ? g_Opus.BarCount()-1 : m_iSelBarEnd, + iStartBar = iSBar<0 ? 0 : m_iSelBarStart, +// lenBar = iEndBar - iStartBar + 1, + iDropMask = 0; + + int iFBar, iStage = FindStage( iStartBar, &iFBar ), + iLBar = iFBar; + + while( iStageiSegType = pStage->iSegType; + pDemoStage->iSegKey = pStage->iSegKey; + pDemoStage->nBarNum = pStage->aBars.size(); + + if( pStage->iSegType<=SEGTYPE_FILL ){ + pDemoStage->aChords = new TBarChords[pDemoStage->nBarNum]; + for( int j=0; jnBarNum; j++ ){ + memcpy( &pDemoStage->aChords[j], &pStage->aBars[j]->aChords, + sizeof(TBarChords) ); + } + + if( bOriSet ){ + for( int i=0; iaTracks.size(); i++ ){ + TTrack* pTrack = pStage->aTracks[i]; + + if( pTrack->iFile==pMT->file && pTrack->iChanSpec==pMT->chno ){ + char st = pDemoStage->iSegType, + sn = pTrack->iSegNo, + cn = pTrack->iChanNo, + pg = pTrack->iProgOrig;// -1; + + TPROSTYLE* pStyTemp = GetStyleInfo( pTrack->iStyleLoc, pTrack->iStyleId ); + + /* if( pTrack->iStyleLoc==0 ){ + for( int t=0; t<16; t++ ){ + if( pStyTemp->pOrigin->detail.tracks[st][sn][t].no==cn ){ + pg = pStyTemp->pOrigin->detail.tracks[st][sn][t].prog; + break; + } + } + } + else if( pTrack->iStyleLoc!=1 ){ + for( int t=0; t<16; t++ ){ + if( pStyTemp->pLocal->trkRef[st][sn][t].chan==cn ){ + pg = pStyTemp->pLocal->trkRef[st][sn][t].prog; + break; + } + } + } +*/ + if( !pStyleOri ){ + pStyleOri = pStyTemp; + segNoOri = sn; + chanOri = cn; + progOri = pg; + } + else{ + if( pStyleOri!=pStyTemp || segNoOri!=sn || chanOri!=cn || progOri!=pg ){ + pStyleOri = NULL; + segNoOri = -1; + progOri = -1; + + if( chanOri!=9 ) + chanOri = -1; + + bOriSet = false; + } + } + + break; + } + } + } + else if( !bHasDrum && !pStage->aTracks.empty() ){ + if( pStage->aTracks[0]->iChanNo==9 ) + bHasDrum = true; + } + + DWORD iT = ( 1 << pStage->iSegType ); + + if( !(iDropMask & iT ) ) + iDropMask |= iT; + } + + iLBar += pStage->aBars.size(); + if( iLBar>iEndBar ){ + pDemoStage->nBarNum -= iLBar - iEndBar - 1; + break; + } + else{ + iStage++; + } + } + + if( !bHasDrum ) + iDropMask |= 0x80; + + TSwitchTextureForm *pProgPar = new TSwitchTextureForm(NULL, iDropMask, progOri, + pMT ? pMT->bank : -1, pMT ? pMT->prog : -1, + pStyleOri, chanOri, segNoOri, &lstStages, iStartBar-iFBar); + + if( pProgPar->ShowModal() == mrOk ){ + TTrack subTrk; + + subTrk.iStyleLoc = pProgPar->m_pSetStyle->idLoc; + subTrk.iStyleId = pProgPar->m_pSetStyle->idStyle; + subTrk.iSegNo = pProgPar->m_cSetSegNo; + subTrk.iChanNo = pProgPar->m_cSetchan; + subTrk.nVol = pProgPar->m_cSetVol; + subTrk.nVolOrig = pProgPar->m_cSetVolOri; + subTrk.iProgOrig = pProgPar->m_cSetProgOri; + + if( !pProgPar->m_bSetCur || pMT && pMT->bank==0xFF + && pProgPar->m_cSetProg==pMT->prog ){ + subTrk.iFile = pMT->file; + subTrk.iBank = pMT->bank; + subTrk.iChanSpec = pMT->chno; + subTrk.iProg = pMT->prog; + } + else{ + subTrk.iFile = 0xFF; + subTrk.iBank = 0xFF; + subTrk.iChanSpec =subTrk.iChanNo; + subTrk.iProg = pProgPar->m_cSetProg; + } + + int iSegType = pProgPar->m_cSetSegType, + op = m_bVertical ? SEGTYPE_TRACK : ST_MIDI; + ((TUseStylePanel*)m_pStylePanel)->ChangeTexture( iSBar, iEBar, iSegType, iMT, &subTrk, op ); + } + + delete pProgPar; + + for( int i=0; iiType; + + if( iType<=UNDO_TRKAUD_DELALL ) + Parent->Perform( UM_STOP, STOP_CONTENT | STOP_USESTYLE, 0 ); + + if( iType==UNDO_KEY_MELODY ){ + TOpusStageList* lstStages = (TOpusStageList*)(bUndo ? pLite->pBefore : pLite->pAfter); + int iKey = bUndo ? pLite->iBegin : pLite->iEnd; + + if( !lstStages ){ + ChangeBarsKey( 0, g_Opus.BarCount()-1, iKey, NULL ); + } + else{ + g_Theme.Set( *lstStages ); + g_iMelodyKey = iKey; + + ((TUseStylePanel*)m_pStylePanel)->InitOpus( g_pPreStyle, g_iPreStage ); + } + + Parent->Perform( UM_CHANGEKEY, 0, 0 ); + } + else if( iType==UNDO_KEY_BARS ){ + if( VIEW_STYLE!=m_iMode ) + Application->MainForm->Perform( UM_SETVIEWMODE, VIEW_STYLE, 0 ); + + int iKey = bUndo ? -1 : (int)pLite->pAfter, + *aKey = bUndo ? (int*)pLite->pBefore : NULL; + + ChangeBarsKey( pLite->iBegin, pLite->iEnd, iKey, aKey ); + SelectBars( pLite->iBegin, pLite->iEnd ); + } + else if(iType==UNDO_CHORD ){ + if( VIEW_CHORD!=m_iMode ){ + Application->MainForm->Perform( UM_SETVIEWMODE, VIEW_CHORD, 0 ); + } + + BYTE* aParam = (BYTE*)( bUndo ? pLite->pBefore : pLite->pAfter ); + int iBarStart = HIWORD(pLite->iBegin), + iCellStart = LOWORD(pLite->iBegin), + iBarEnd = HIWORD(pLite->iEnd), + iCellEnd = LOWORD(pLite->iEnd), + nCellNum = (iBarEnd - iBarStart - 1) * g_nChordNumPerBar + + (g_nChordNumPerBar - iCellStart) + (iCellEnd + 1), + *keys = new int[nCellNum], + *types = new int[nCellNum]; + + for( int i=0; i>4; + types[i] = aParam[i] & 0x0F; + } + + SelectCells( iBarStart, iCellStart, iBarEnd, iCellEnd ); + + ChordPaste( keys, types, nCellNum, false ); + + int iKey = -1, iType = -1, iBarKey = -1; + bool bEnable = false; + if( m_iSelBarStart>=0 ){ + GetSelectChord( iBarKey, iKey, iType ); + bEnable = iKey!=-1; + } + + ((TChordPanel*)m_pChordPanel)->EnableChordModify( bEnable, iBarKey, iKey, iType ); + } + else if( iType>=UNDO_TRKAUD_ADD && iType<=UNDO_TRKAUD_HIDEALL + || iType>=UNDO_TRKMID_SHOW && iType<=UNDO_TRKMID_HIDEALL ){ + short iShowTrk = -1, + iTrkType = ST_AUDIO; + bool bSolo = false; + bool bInit = true; + + if( iType<=UNDO_TRKAUD_DELALL ){ + f_MM_Undo( bUndo ); + + short iTrk = pLite->iCode; + if( iType==UNDO_TRKAUD_ADD ){ + if( bUndo ){ + if( g_aAudioTracks[iTrk]->IsSolo() ) + bSolo = true; + + DeleteAudioTrack( iTrk, false ); + + if( iTrkMainForm->Perform( UM_SETVIEWMODE, VIEW_TRACK, 0 ); + + if( g_iPreStage==0 ){ + DuplicateRawBars(); + PostMessage( Parent->Handle, UM_STAGECHANGED, 3, 0 ); + } + + NewAudioTrack( g_Opus.BarCount(), false ); + + iShowTrk = g_aAudioTracks.size()-1; + } + } + else if( iType<=UNDO_TRKAUD_DELALL ){ + TAudioTrackList* aTracks = (TAudioTrackList*)pLite->pBefore; + int num = aTracks->size(); + bInit = false; + int iTrack = iTrk<0 ? 1 : iTrk; + iShowTrk = bUndo ? iTrk : -1; + + if( bUndo ){ + for( int i=0; iIsSolo() ) + bSolo = true; + + if( !pTrack->IsHide() ) + bInit = true; + + iTrack++; + } + } + else{ + for( int i=0; iIsSolo() ) + bSolo = true; + + if( !g_aAudioTracks[iTrack]->IsHide() ) + bInit = true; + + DeleteAudioTrack( iTrack, false ); + } + + if( iTrk<0 || iTrk==g_iSelAudio ) + SelectTrack( -1, -1 ,-1 ); + else if( iTrk=UNDO_TRKAUD_SHOW && iType<=UNDO_TRKAUD_HIDEALL ) ? ST_AUDIO : ST_MIDI; + vector* arrIndex = (vector*)pLite->pBefore; + + for( int i=0; isize(); i++ ){ + int iTrk = (*arrIndex)[i]; + TBaseTrack* pBT = NULL; + + if( iTrkType==ST_AUDIO ) + pBT = g_aAudioTracks[iTrk]; + else + pBT = g_aMidiTracks[iTrk]; + + pBT->Hide( bUndo && ( iType==UNDO_TRKAUD_SHOW || iType==UNDO_TRKAUD_SHOWALL + || iType==UNDO_TRKMID_SHOW || iType==UNDO_TRKMID_SHOWALL ) + || !bUndo && ( iType==UNDO_TRKAUD_HIDE || iType==UNDO_TRKAUD_HIDEALL + || iType==UNDO_TRKMID_HIDE || iType==UNDO_TRKMID_HIDEALL )); + + if( arrIndex->size()==1 && !pBT->IsHide() ) + iShowTrk = iTrk; + } + } + + if( bInit ) + InitialVars(); + if( bSolo ) + SetTrackParams(); + + if( iShowTrk>=0 ){ + int id = GetShowTrackId( iTrkType, iShowTrk ) - 1; + SelectTrack( id, -1, -1 ); + } + else{ + SelectTrack( -1, -1, -1 ); + } + + Application->MainForm->Perform( UM_ENABLERECORD, 0, 0 ); + } + else if( iType>=UNDO_AUDIO_ERASE && iType<=UNDO_AUDIO_FX ){ + int iTrack = pLite->iCode; + int iBarStart = HIWORD( pLite->iBegin ), + iPointStart = LOWORD( pLite->iBegin ), + iBarEnd = HIWORD( pLite->iEnd ), + iPointEnd = LOWORD( pLite->iEnd ), + iSelAudio = iTrack, + iSelBarStart = iBarStart, + iSelPointStart = iPointStart, + iSelBarEnd = iBarEnd, + iSelPointEnd = iPointEnd; + + if( g_aAudioTracks[iTrack]->IsHide() ){ + g_aAudioTracks[iTrack]->Hide(false); + InitialVars(); + } + + if( VIEW_TRACK!=m_iMode ){ + Application->MainForm->Perform( UM_SETVIEWMODE, VIEW_TRACK, 0 ); + } + else{ + SelectCopyPos( -1, -1, -1, -1 ); + } + + f_MM_Undo( bUndo ); + + if( bUndo ){ + DWORD* aWave = (DWORD*)pLite->pBefore; + CopyWave( iTrack, iBarStart, iPointStart, iBarEnd, iPointEnd, &aWave ); + + if( iType==UNDO_AUDIO_MOVE ){ + int iDelTrack = pLite->iExt1; + int iDelBarStart = HIWORD( pLite->iExt2 ), + iDelPointStart = LOWORD( pLite->iExt2 ), + iDelBarEnd = HIWORD( pLite->iExt3 ), + iDelPointEnd = LOWORD( pLite->iExt3 ), + iDelBarBreak = iDelBarEnd, + iDelPointBreak = iDelPointEnd; + + if( g_aAudioTracks[iDelTrack]->IsHide() ){ + g_aAudioTracks[iDelTrack]->Hide(false); + InitialVars(); + } + + if( pLite->pExt1 ){ + int len = ( iBarEnd * POINTS_PER_BAR + iPointEnd ) + - ( iBarStart * POINTS_PER_BAR + iPointStart ), + nPointsBreak = iDelBarStart * POINTS_PER_BAR + iDelPointStart + len; + + iDelBarBreak = nPointsBreak / POINTS_PER_BAR; + iDelPointBreak = nPointsBreak % POINTS_PER_BAR; + + aWave = (DWORD*)pLite->pExt1; + CopyWave( iDelTrack, iDelBarBreak, iDelPointBreak, + iDelBarEnd, iDelPointEnd, &aWave ); + } + + aWave = (DWORD*)pLite->pAfter; + CopyWave( iDelTrack, iDelBarStart, iDelPointStart, + iDelBarBreak, iDelPointBreak, &aWave ); + + iSelAudio = iDelTrack; + iSelBarStart = iDelBarStart; + iSelPointStart = iDelPointStart; + iSelBarEnd = iDelBarEnd; + iSelPointEnd = iDelPointEnd; + + InvalidateBars( iBarStart, iBarEnd, BAR_TRACK | GetShowTrackId(ST_AUDIO,iTrack) ); + } + } + else{ + int iDelBarStart, iDelPointStart, iDelBarEnd, iDelPointEnd, + iDelTrack = -1; + + if( iType==UNDO_AUDIO_ERASE ){ + iDelTrack = iTrack; + iDelBarStart = iBarStart; + iDelPointStart = iPointStart; + iDelBarEnd = iBarEnd; + iDelPointEnd = iPointEnd; + } + else if( iType==UNDO_AUDIO_MOVE ){ + iDelTrack = pLite->iExt1; + iDelBarStart = HIWORD( pLite->iExt2 ); + iDelPointStart = LOWORD( pLite->iExt2 ); + iDelBarEnd = HIWORD( pLite->iExt3 ); + iDelPointEnd = LOWORD( pLite->iExt3 ); + } + + if( iDelTrack>0 ){ + double dblStart = iDelBarStart + (double)iDelPointStart / POINTS_PER_BAR, + dblEnd = iDelBarEnd + (double)iDelPointEnd / POINTS_PER_BAR; + + MoveAudio( iDelTrack, dblStart, dblEnd, -1, -1, MODE_ERASE ); + } + + if( iType>UNDO_AUDIO_ERASE ){ + DWORD* aWave = (DWORD*)pLite->pAfter; + CopyWave( iTrack, iBarStart, iPointStart, iBarEnd, iPointEnd, &aWave ); + } + } + + int iSelTrack = GetShowTrackId( ST_AUDIO, iSelAudio ); + + if( iSelTrack>0 ) + SelectTrack( iSelTrack-1, iSelBarStart, iSelPointStart ); + //SelectTrack( iSelAudio, iSelBarStart, iSelPointStart ); + SelectRange( iSelBarStart, iSelPointStart, iSelBarEnd, iSelPointEnd, true ); +// InvalidateBars( iSelBarStart, iSelBarEnd, BAR_TRACK | GetShowTrackId(ST_AUDIO,iSelAudio) ); + } +} +//--------------------------------------------------------------------------- + diff --git a/ContentPanelUnit.h b/ContentPanelUnit.h new file mode 100644 index 0000000..06d601f --- /dev/null +++ b/ContentPanelUnit.h @@ -0,0 +1,326 @@ +//--------------------------------------------------------------------------- + +#ifndef ContentPanelUnitH +#define ContentPanelUnitH + +#include "SkinScrollBarUnit.h" +#include "ToolpalPanel.h" +#include "StyleItem.h" +#include "MenuUnit.h" +#include "BaseTrack.h" + +#define BAR_CURSOR 0x00 +#define BAR_TITLE 0x100 +#define BAR_DATA 0x200 +#define BAR_TRACK 0x400 +#define BAR_LEFT 0x1000 +#define MIN_HDR_WIDTH 120 +#define MAX_HDR_WIDTH 240 + +typedef struct tagShowTrack +{ + BYTE type; + BYTE index; + BYTE iHover; + TBaseTrack* pTrack; + + tagShowTrack( BYTE ty, BYTE ind, TBaseTrack* p ) + { + type = ty; + index = ind; + iHover = 0; + pTrack = p; + }; +}TShowTrack, *PTShowTrack; + +typedef vector TShowTrackList; +//--------------------------------------------------------------------------- +class TContentPanel : public Extctrls::TPanel +{ +private: + //ʾ + HRGN m_rgnClip; + bool m_bVertical; /// + + int m_iMode, //0=Ƶģʽ 1=ģʽ 2=ģʽ + m_nRowShow, + m_nTrackShow, + m_nColumnNum, + m_nRowNum, + m_nBarNum, + m_iBeginShowRow, + m_iBeginShowBar, + m_iBeginShowTrack, + + m_nBarWidth, + m_nBarHeight, + m_nDataWidth, + m_nBarDrawHeight, + m_nRowGapHeight, // + m_nTitleHeight, //С + m_nChordHeight, // + m_nTrackHeight, // + m_nTrkHdrWidth, //ͷ + + m_nLeftBound, + m_nLeftOriBound, + m_nRightBound, + m_nTopBound, + m_nBottomBound; + + TShowTrackList m_aTracks; //ʾĹ + + TSkinScrollBar *m_sbVert, + *m_sbHoriz; + TToolpalPanel *m_pStylePanel, // + *m_pChordPanel, // + *m_pTrackPanel; // + + //ѡ + int m_iSelBarStart, + m_iSelBarEnd, + m_iSelPointStart, + m_iSelPointEnd, + m_iSelTrackBar, + m_iSelTrackPoint, + m_iSelTrack; + + //¼/ + bool m_bPlaying; + int m_iPlayBar, + m_iPlayPoint; + TBitmap *m_imgPlayCursor, + *m_imgMidiIcon, + *m_imgWaveIcon; + + TPngImage * m_imgBeatHint[4], + *m_pngChordUp, + *m_pngChordDown, + *m_pngChord2, + *m_pngChord4, + *m_pngChord6, + *m_pngChord7, + *m_pngChordI, + *m_pngChordV, + *m_pngChordMaj, + *m_pngChordMin, + *m_pngChordSus; + int m_iBeatHint, + m_lBeatHint, + m_tBeatHint, + m_wBeatHint, + m_hBeatHint; + + // + int m_nChordTxtWidth, + m_nChordTxtHeight, + m_iMinSelBar, + m_iMaxSelBar, + m_iSelCellStart, + m_iSelCellEnd; + + //Ƽ + int m_iCopyBarStart, + m_iCopyBarEnd, + m_iCopyCellStart, + m_iCopyCellEnd, + m_iCopyPointStart, + m_iCopyPointEnd, + m_iCopyAudio; + bool m_bCut; + + //϶ + int m_iDropBar, + m_iMouseDownBar, + m_iMouseDownPoint, + m_iDragingStage, + m_iDragAudio; //϶Ƶ + bool m_bDragReady, //϶ѡ + m_bDraging, + m_bBrush; + TPoint ptDown; + TCommonItem *m_pItem; + + TTimer *m_pTimer; //Զʱ + + TMenuPanel *m_PopupMenu; //Ҽ˵ //add + TApplicationEvents *m_ApplicationEvents; + + void ChordPaste( int key[], int type[], int len, bool bAddUndo=true ); +// void ChangeMelodyKey( int Index ); + void ChangeBarsKey( int iBarStart, int iBarEnd, int iKey, int keys[] ); + void AudioMove( int iSrcTrack, int iBarStart, int iPointStart, + int iBarEnd, int iPointEnd, bool bCut ); + void GetBarKeys( int iBarStart, int iBarEnd, int keys[] ); + void ChangeMidiTrack( int iMT=-1, int iSBar=-1, int iEBar=-1 ); + + void ClearShowTracks(); + void ShowTrackChangeState( int iTrack, int iType ); + void ShowPlayPoint(); + + void CalcViewArea(); + bool SetScrollView( int iFirstShowBar ); + + void DrawBars(); + void DrawBarTitle( int l, int r, int t, bool bSel ); + void DrawBarData( int iBar, int iStage, int iFirstBar, int left, int top ); + void DrawTrack( int iBar, int nBarNum, int left, int top, int iTrack ); + void DrawRowWave( int iBar, int nBarNum, int left, int top, int iWave ); + void DrawRowMidi( int iBar, int nBarNum, int left, int top, int iMidi ); + void DrawChord( TRect& rcDraw, int iBarKey, int iKey, int iType ); + + //HitTestiHitTypeֵ -1=Ч 0=мհ 1=С 2= >=3 + DWORD HitTest( int X, int Y, int& iHitType, bool bHead=false ); + + void SelectRange( int iBarStart, int iPointStart, int iBarEnd, int iPointEnd, bool bInvalid=false ); + void SelectCopyBars( int iBarStart, int iBarEnd, bool bCut=false ); + void SelectCopyCells( int iBarStart, int iCellStart, int iBarEnd, int iCellEnd ); + void SelectCopyPos( int iBarStart, int iPointStart, int iBarEnd, int iPointEnd ); + void SetDropBar( int iBar ); + void SelectRangeByWave( int iHitBar, int iHitPoint ); + + int GetCell( int iPoint ); + void GetSelectChord( int& iBarKey, int& iChordKey, int& iChordType ); + + void DrawDragImg( int mode ); + void SetScrollTimer(TPoint ptMouse, bool bVertical=true); + void HandleDropEvent( int iState=0 ); + bool HandleHoverEvent(TPoint ptMouse); + void HandleBrush(); + + void OnAudioEffectProcess( int iFxType ); + void OnAudioEffectAdd( int iFxType ); + void OnWMScroll(TWMScroll &Message, bool bVertical); + + void __fastcall DoHandleMessage(MSG &Msg, bool &Handled); //Ϣ + void __fastcall TimerProc(TObject* Sender); + void __fastcall DoubleClick(TObject* sender); + void __fastcall DoSetSelPosStart(System::TObject* Sender); + void __fastcall DoSetSelPosEnd(System::TObject* Sender); + void __fastcall DoDelSelPosStart(System::TObject* Sender); + void __fastcall DoDelSelPosEnd(System::TObject* Sender); + void __fastcall DoAudioFxProcess(System::TObject* Sender); + void __fastcall DoAudioVstProcess(System::TObject* Sender); + void __fastcall DoAudioAddFx(System::TObject* Sender); + void __fastcall DoAudioAddVst(System::TObject* Sender); + + MESSAGE void __fastcall OnMidiSwitch(TMessage &msg); + MESSAGE void __fastcall UMMouseMove(TWMMouse &Message); + MESSAGE void __fastcall UMMouseUp(TWMMouse &Message); + MESSAGE void __fastcall WMEraseBkgnd(TWMEraseBkgnd &Message); + MESSAGE void __fastcall WMSize(TWMSize &Message); + MESSAGE void __fastcall WMVScroll(TWMScroll &Message); + MESSAGE void __fastcall WMHScroll(TWMScroll &Message); + MESSAGE void __fastcall WMMouseWheel(TWMMouseWheel &Message); + MESSAGE void __fastcall WMMouseDown(TWMMouse &Message); + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(WM_ERASEBKGND, TWMEraseBkgnd, WMEraseBkgnd) + MESSAGE_HANDLER(WM_SIZE, TWMSize, WMSize) + MESSAGE_HANDLER(WM_VSCROLL, TWMVScroll, WMVScroll) + MESSAGE_HANDLER(WM_HSCROLL, TWMHScroll, WMHScroll) + MESSAGE_HANDLER(WM_MOUSEWHEEL, TWMMouseWheel, WMMouseWheel) + MESSAGE_HANDLER(WM_LBUTTONDOWN, TWMMouse, WMMouseDown) + MESSAGE_HANDLER(WM_RBUTTONDOWN, TWMMouse, WMMouseDown) + MESSAGE_HANDLER(UM_MOUSEMOVE, TWMMouseMove, UMMouseMove) + MESSAGE_HANDLER(UM_MOUSEUP, TWMMouse, UMMouseUp) + MESSAGE_HANDLER(UM_MIDISWITCH, TMessage, OnMidiSwitch) + END_MESSAGE_MAP(Vcl::Extctrls::TPanel) + +protected: + virtual void __fastcall CreateWnd(); + virtual void __fastcall Paint(void); + +public: + inline void SetStylePanel( TToolpalPanel* pPanel ){ m_pStylePanel=pPanel; }; + inline void SetChordPanel( TToolpalPanel* pPanel ){ m_pChordPanel=pPanel; }; + inline void SetTrackPanel( TToolpalPanel* pPanel ){ m_pTrackPanel=pPanel; }; + inline void SetPopMenu( TMenuPanel* pMenu ){ m_PopupMenu = pMenu; }; + + void InitialVars( bool bClear = false ); + inline int GetBarNum(){ return m_nBarNum; }; + void AddNewBar( int iBar ); + void ShowBeatHint( int iBeat ); + + void SetMode( int iMode ); + void SetScrollMode( bool bVertical=true ); + inline bool IsVertical() { return m_bVertical; }; + inline void Play( bool bPlay ) { m_bPlaying=bPlay; }; + inline bool IsPlaying() { return m_bPlaying; }; + void SetPlayPoint( int iBar, int iPoint ); + + int GetShowTrackId( int type, int index ); + void SelectTrack( int iTrack, int iBar, int iPoint, bool bClear=true ); + void ShowTrack( int type, int index, bool bShow ); + void DeleteTrack( int type, int index ); + + void SetSelectRange( int iStartBar, int iStartPoint, int iEndBar, int iEndPoint, bool bInvalid=false ); + void GetSelectRange( int& iStartBar, int& iStartPoint, int& iEndBar, int& iEndPoint ); + inline bool IsModifyMode() { return !(m_iSelBarStart<0 && m_iSelBarEnd<0); }; + + bool SetSelectChord( int iKey, int iChordType ); + void GetChordDispalyKey( int iKey, int iBarKey, int& iMainKey, int& iAjustKey ); + + void SelectCells( int iBarStart, int iCellStart, int iBarEnd, int iCellEnd ); + void SelectStage( int iStage ); + void SelectBars( int iStartBar, int iEndBar ); + void GetSelectBars( int& iStartBar, int& iEndBar ); + + void InvalidateBar( int iBar, int iBeginPoint, int iEndPoint, int iArea=BAR_DATA ); + void InvalidateBars( int iBarStart, int iBarEnd, int iArea=BAR_DATA ); + void InvalidateShowBars( int iArea=BAR_TITLE|BAR_DATA|BAR_TRACK ); + void InvalidateStage( int iStage, int iArea=BAR_DATA ); + void ScrollView( int nPos, bool bVertical=true, bool bRedraw=true ); + + bool ShowDragImg( bool bShow=true, int iState=0 ); + TCommonItem* GetDropItem(){ return m_pItem; }; + void SetDropItem( TCommonItem* pItem ){ m_pItem = pItem; }; + void BeginBrush( TCommonItem* pBrushItem ); + void CancelBrush(); + bool IsStyleBrush() { return m_bBrush; }; + + void Undo( bool bUndo ); + + void __fastcall OnTrackStateChanged( int iType, int iIndex, BYTE iState, bool bUnset ); + void __fastcall OnStageChanged( int iStage, int iMode ); + void __fastcall OnChangeMelodyKey( int Index ); + void __fastcall OnDirectionKey( WORD key ); + + void __fastcall DoCancelAll(System::TObject* Sender); + void __fastcall DoSelectAll(System::TObject* Sender); + void __fastcall DoInsertBlankBar(System::TObject* Sender); + void __fastcall DoBarsCopy(System::TObject* Sender); + void __fastcall DoBarsCut(System::TObject* Sender); + void __fastcall DoBarsDelete(System::TObject* Sender); + void __fastcall DoBarsInsert(System::TObject* Sender); + void __fastcall DoBarsChangeKey(System::TObject* Sender); + void __fastcall DoChordCopy(System::TObject* Sender); + void __fastcall DoChordPaste(System::TObject* Sender); + void __fastcall DoChordDelete(System::TObject* Sender); + void __fastcall DoAudioDelete(System::TObject* Sender); + void __fastcall DoAudioCopy(System::TObject* Sender); + void __fastcall DoAudioCut(System::TObject* Sender); + void __fastcall DoAudioPaste(System::TObject* Sender); + void __fastcall DoAudioLoad(System::TObject* Sender); + void __fastcall DoTrackAdd(System::TObject* Sender); + void __fastcall DoTrackDel(System::TObject* Sender); + void __fastcall DoTrackShow(System::TObject* Sender); + void __fastcall DoTrackHide(System::TObject* Sender); + void __fastcall DoTrackSave(System::TObject* Sender); + void __fastcall DoTrackMute(System::TObject* Sender); + void __fastcall DoTrackSolo(System::TObject* Sender); + void __fastcall DoInsertTexture(TObject* Sender); + void __fastcall DoDeleteTexture(TObject* Sender); + void __fastcall DoSwitchTexture(TObject* Sender); + void __fastcall DoSwitchFontProg(TObject* Sender); + void __fastcall DoTrackSwitchTexture(TObject* Sender); + void __fastcall DoTrackSwitchFontProg(TObject* Sender); + + void __fastcall CreateEditMenu(TMenuPanel *Menu, bool bEnabled); + void __fastcall CreateTrackMenu(TMenuPanel *Menu, bool bEnabled); + + __fastcall virtual TContentPanel(System::Classes::TComponent* AOwner); + __fastcall ~TContentPanel(); +}; + +#endif diff --git a/CustomerSettingFormUnit.cpp b/CustomerSettingFormUnit.cpp new file mode 100644 index 0000000..5b94bbb --- /dev/null +++ b/CustomerSettingFormUnit.cpp @@ -0,0 +1,53 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop + +#include "CustomerSettingFormUnit.h" +#include "GlobalUnit.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma link "GeneralDialogPanel" +#pragma link "TextButton" +#pragma resource "*.dfm" +TCustomerSettingForm *CustomerSettingForm; +//--------------------------------------------------------------------------- +__fastcall TCustomerSettingForm::TCustomerSettingForm(TComponent* Owner) + : TForm(Owner) +{ + m_pBKGGeneralDialogPanel->Font->Size = g_szFont9; + + m_pCSPanel = new TCustmerSettingPanel(m_pBKGGeneralDialogPanel); + m_pCSPanel->Font->Size = g_szFont9; + + m_pCSPanel->Parent = m_pBKGGeneralDialogPanel; + int nHeightTmp = m_pTextButtonOK->Top - PANEL_START - PANEL_HEIGHT; + m_pCSPanel->SetBounds( PANEL_LEFT, + PANEL_START + nHeightTmp/2, + Width - PANEL_LEFT - PANEL_RIGHT, + PANEL_HEIGHT ); + + m_pTextButtonOK->FontSize = g_szFont9; + m_pTextButtonCancel->FontSize = g_szFont9; +} +//--------------------------------------------------------------------------- + +__fastcall TCustomerSettingForm::~TCustomerSettingForm() +{ + if( m_pCSPanel ){ + delete m_pCSPanel; + m_pCSPanel = NULL; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TCustomerSettingForm::FormShow(TObject *Sender) +{ + m_bAlphaKeyOrig = g_bAlphaKey; + m_iSegColorOrig = g_iSegColorMode; + + m_pCSPanel->SetContent(); +} +//--------------------------------------------------------------------------- + + diff --git a/CustomerSettingFormUnit.dfm b/CustomerSettingFormUnit.dfm new file mode 100644 index 0000000..3c3dfdd --- /dev/null +++ b/CustomerSettingFormUnit.dfm @@ -0,0 +1,49 @@ +object CustomerSettingForm: TCustomerSettingForm + Left = 0 + Top = 0 + BorderStyle = bsNone + Caption = 'CustomerSettingForm' + ClientHeight = 351 + ClientWidth = 433 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + Position = poMainFormCenter + Scaled = False + OnShow = FormShow + TextHeight = 14 + object m_pBKGGeneralDialogPanel: TGeneralDialogPanel + Left = 0 + Top = 0 + Width = 433 + Height = 351 + Caption = #20559#22909#35774#32622 + Color = 5064257 + ParentBackground = False + TabOrder = 0 + object m_pTextButtonOK: TTextButton + Left = 149 + Top = 315 + Width = 56 + Height = 25 + ModalResult = mrYes + ParentShowHint = False + ShowHint = True + Text = #30830#23450 + end + object m_pTextButtonCancel: TTextButton + Left = 224 + Top = 315 + Width = 56 + Height = 25 + ModalResult = mrCancel + ParentShowHint = False + ShowHint = True + Text = #21462#28040 + end + end +end diff --git a/CustomerSettingFormUnit.h b/CustomerSettingFormUnit.h new file mode 100644 index 0000000..27b1221 --- /dev/null +++ b/CustomerSettingFormUnit.h @@ -0,0 +1,40 @@ +//--------------------------------------------------------------------------- + +#ifndef CustomerSettingFormUnitH +#define CustomerSettingFormUnitH +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include "GeneralDialogPanel.h" +#include +#include "CustomerSettingPanelUnit.h" +#include "TextButton.h" +//--------------------------------------------------------------------------- +class TCustomerSettingForm : public TForm +{ + +__published: // IDE-managed Components + + TGeneralDialogPanel *m_pBKGGeneralDialogPanel; + TTextButton *m_pTextButtonOK; + TTextButton *m_pTextButtonCancel; + void __fastcall FormShow(TObject *Sender); + +private: // User declarations + +public: // User declarations + TCustmerSettingPanel *m_pCSPanel; + + bool m_bAlphaKeyOrig; + int m_iSegColorOrig; + + __fastcall TCustomerSettingForm(TComponent* Owner); + __fastcall ~TCustomerSettingForm(); + +}; +//--------------------------------------------------------------------------- +extern PACKAGE TCustomerSettingForm *CustomerSettingForm; +//--------------------------------------------------------------------------- +#endif diff --git a/CustomerSettingPanelUnit.cpp b/CustomerSettingPanelUnit.cpp new file mode 100644 index 0000000..8dffa36 --- /dev/null +++ b/CustomerSettingPanelUnit.cpp @@ -0,0 +1,420 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop + +#include "CustomerSettingPanelUnit.h" +#include "GlobalUnit.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +//--------------------------------------------------------------------------- +#define SCOLLBAR_WIDTH (14) +#define TOP_BUTTOM (10) +#define LEFT_RIGHT (SCOLLBAR_WIDTH + 20) + +const static COLORREF + CLR_TXT_HOT = RGB(171, 186, 207), +// CLR_BKG_INTERNAL = RGB(65, 70, 77), + CLR_BKG_INTERNAL = RGB(47, 50, 56), + CLR_BKG_INTERNAL_LIGHT = RGB(73, 77, 86), + CLR_CONTENT_DB_LINE_DARK = RGB(32, 35, 39), + CLR_CONTENT_DB_LINE_LIGHT = RGB(76, 81, 87); + +//--------------------------------------------------------------------------- + +__fastcall TCustmerSettingPanel::TCustmerSettingPanel( TComponent* Owner) + : Vcl::Extctrls::TPanel( Owner ) +{ + Color = CLR_BKG_INTERNAL; + + m_ScrollBar = NULL; + m_iTopLine =0; + m_iShowLine = 1; +} +//--------------------------------------------------------------------------- + +void __fastcall TCustmerSettingPanel::CreateWnd() +{ + Vcl::Extctrls::TPanel::CreateWnd(); + + m_ckInitProject = new TCKBox(this); + m_ckDownloadStyle = new TCKBox(this); + m_ckPreBeat = new TCKBox(this); + m_ckSegColor = new TCKBox(this); + m_cbChordMode = new TComboBoxComponent(this); + m_cbPreStage = new TComboBoxComponent(this); + + m_ckInitProject->Parent = this; + m_ckDownloadStyle->Parent = this; + m_ckPreBeat->Parent = this; + m_ckSegColor->Parent = this; + m_cbChordMode->Parent = this; + m_cbPreStage->Parent = this; + + m_ckInitProject->Font->Size = g_szFont9; + m_ckDownloadStyle->Font->Size = g_szFont9; + m_ckPreBeat->Font->Size = g_szFont9; + m_ckSegColor->Font->Size = g_szFont9; + m_cbChordMode->SetFontSize(g_szFont9); + m_cbPreStage->SetFontSize(g_szFont9); + + m_ckInitProject->Font->Color = CLR_TXT_HOT; + m_ckDownloadStyle->Font->Color = CLR_TXT_HOT; + m_ckPreBeat->Font->Color = CLR_TXT_HOT; + m_ckSegColor->Font->Color = CLR_TXT_HOT; + + Canvas->Font->Assign(m_ckPreBeat->Font); + + m_ckInitProject->Caption = L"ʱԶϴι"; + m_ckDownloadStyle->Caption = L"Զط"; + m_ckPreBeat->Caption = L"¼ʱʹԤʾ"; + m_ckSegColor->Caption = L"ʾɫ"; + + m_ckInitProject->Width = 180; + m_ckDownloadStyle->Width = 120; + m_ckPreBeat->Width = 180; + m_ckSegColor->Width = 180; + + m_cbChordMode->AddItem(L""); + m_cbChordMode->AddItem(L"Ӣ"); + m_cbChordMode->Height = 24; + + m_cbPreStage->AddItem(L"M"); + m_cbPreStage->AddItem(L"IME"); + m_cbPreStage->AddItem(L"IMIME"); + m_cbPreStage->Height = 24; + + m_ckInitProject->OnChange = CKBoxChange; + m_ckDownloadStyle->OnChange = CKBoxChange; + m_ckPreBeat->OnChange = CKBoxChange; + m_ckSegColor->OnChange = CKBoxChange; + m_cbChordMode->OnChange = ChordModeChange; + m_cbPreStage->OnChange = PreStageChange; + + if( SOFTWARE_ID==e_Pro_Lite ) + m_ckDownloadStyle->Enabled = false; + + SetShowLine(); +} +//--------------------------------------------------------------------------- + +__fastcall TCustmerSettingPanel::~TCustmerSettingPanel() +{ + if( m_ScrollBar ){ + delete m_ScrollBar; + m_ScrollBar = NULL; + } + + if( m_ckInitProject ){ + delete m_ckInitProject; + m_ckInitProject = NULL; + } + + if( m_ckDownloadStyle ){ + delete m_ckDownloadStyle; + m_ckDownloadStyle = NULL; + } + + if( m_ckPreBeat ){ + delete m_ckPreBeat; + m_ckPreBeat = NULL; + } + + if( m_ckSegColor ){ + delete m_ckSegColor; + m_ckSegColor = NULL; + } + + if( m_cbChordMode ){ + delete m_cbChordMode; + m_cbChordMode = NULL; + } + + if( m_cbPreStage ){ + delete m_cbPreStage; + m_cbPreStage = NULL; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TCustmerSettingPanel::WMEraseBkgnd(TWMEraseBkgnd &Message) +{ + TRect rect = GetClientRect(); + + TCanvas* tempCanvas = new TCanvas; + tempCanvas->Handle = Message.DC; + + tempCanvas->Brush->Color = CLR_BKG_INTERNAL; //ɫ + tempCanvas->FillRect( rect ); + tempCanvas->Brush->Color = CLR_CONTENT_DB_LINE_DARK; + tempCanvas->FrameRect( rect ); + + delete tempCanvas; + tempCanvas = NULL; + +// DefaultHandler( &Message ); +} +//--------------------------------------------------------------------------- + +void __fastcall TCustmerSettingPanel::WMVScroll(Winapi::Messages::TWMScroll &Message) +{ + int minpos, maxpos, page, curpos; + m_ScrollBar->GetScrollRange(&minpos, &maxpos); + page = m_ScrollBar->GetPageSize(); + // Get the current position of scroll box. + curpos = m_ScrollBar->GetScrollPos(); + + // Determine the new position of scroll box. + switch (Message.ScrollCode) + { + case SB_TOP: // Scroll to far top. + curpos = minpos; + break; + + case SB_BOTTOM: // Scroll to far bottom. + curpos = maxpos-page+1; + break; + + case SB_ENDSCROLL: // End scroll. + break; + + case SB_LINEUP: // Scroll left. + if (curpos > minpos) + curpos--; + break; + + case SB_LINEDOWN: // Scroll right. + if (curpos < maxpos-page+1) + curpos++; + break; + + case SB_PAGEUP: // Scroll one page left. + if (curpos > minpos) + curpos = (minpos > curpos-page) ? minpos : curpos-page; + //max(minpos, curpos-page); + break; + + case SB_PAGEDOWN: // Scroll one page right. + if( curposHandle ){ + m_ScrollBar->SetPosition(curpos); +// Paint(); + } + if( m_iTopLine != curpos ){ + m_iTopLine = curpos; + Invalidate(); + } + + Message.Result = true; +} +//--------------------------------------------------------------------------- + +void __fastcall TCustmerSettingPanel::WMMouseWheel(TWMMouseWheel &Message) +{ + if( m_ScrollBar && m_ScrollBar->Visible ){ + UINT nSBCode; + + if( Message.WheelDelta>0 ) nSBCode = SB_LINEUP; + else nSBCode = SB_LINEDOWN; + + Perform( WM_VSCROLL, MAKELONG(nSBCode,0), NULL ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TCustmerSettingPanel::SetShowLine() +{ + int totalLine = LINE_NUM; + m_iShowLine = Height/LINE_HEIGHT; + + if( totalLine>m_iShowLine ){ + m_ScrollBar = new TSkinScrollBar(this); + m_ScrollBar->m_pWndCtrl = this; + m_ScrollBar->Parent = this; + m_ScrollBar->Height = Height-2; + m_ScrollBar->Left = Width - m_ScrollBar->Width - 1; + m_ScrollBar->Top = 1; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TCustmerSettingPanel::SetContent() +{ +/* m_ckInitProject->Width = 155; + m_ckDownloadStyle->Width = 95; + m_ckPreBeat->Width = 180; +*/ + m_bAutoOpenProject = g_bAutoOpenProject; + m_bDownloadStyle = g_bAutoDownloadStyle; + m_bPreBeat = g_bPrebeat; + m_bAlphaKey = g_bAlphaKey; + m_bSegColor = g_iSegColorMode==1; + m_cPreStage = g_iPreStageDefault; + + m_ckInitProject->Checked = m_bAutoOpenProject; + m_ckDownloadStyle->Checked = m_bDownloadStyle; + m_ckPreBeat->Checked = m_bPreBeat; + m_ckSegColor->Checked = m_bSegColor; + m_cbChordMode->DefItemIndex = g_bAlphaKey; + m_cbPreStage->DefItemIndex = g_iPreStageDefault; + + if(m_ScrollBar) { + m_ScrollBar->SetRange( 0,LINE_NUM-1 ); + m_ScrollBar->SetPageSize(m_iShowLine); + m_ScrollBar->SetPosition( m_iTopLine ); + m_ScrollBar->Visible = true; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TCustmerSettingPanel::Paint(void) +{ + int curX = 0; + int curY = 0; + int contentHeight = LINE_HEIGHT; + int contentStart = -m_iTopLine*LINE_HEIGHT; + TSize sizeFont; + String strText; + + Canvas->Font->Color = CLR_TXT_HOT; + Canvas->Brush->Style = bsClear; + + ///////////////////////////////////////////////// + curX = LEFT_RIGHT; + curY = contentStart; + m_ckInitProject->Left = curX; + m_ckInitProject->Top = curY + (contentHeight - m_ckInitProject->Height)/2 + 2; + + ///////////////////////////////////////////////// + contentStart += LINE_HEIGHT; + curY = contentStart; + + m_ckDownloadStyle->Left = curX; + m_ckDownloadStyle->Top = curY + (contentHeight - m_ckDownloadStyle->Height)/2; + + ///////////////////////////////////////////////// + contentStart += LINE_HEIGHT; + curY = contentStart; + + m_ckPreBeat->Left = curX; + m_ckPreBeat->Top = curY + (contentHeight - m_ckPreBeat->Height)/2; + + ///////////////////////////////////////////////// + contentStart += LINE_HEIGHT; + curY = contentStart; + + m_ckSegColor->Left = curX; + m_ckSegColor->Top = curY + (contentHeight - m_ckSegColor->Height)/2; + + ///////////////////////////////////////////////// + contentStart += LINE_HEIGHT; + curX = LEFT_RIGHT + 5; + + strText = L"ʾʽ"; + sizeFont = Canvas->TextExtent(strText); + curY = contentStart + (contentHeight - sizeFont.Height)/2; + Canvas->TextOutW(curX, curY, strText); + + curX += sizeFont.Width + 10; + curY = contentStart; + m_cbChordMode->Left = curX; + m_cbChordMode->Top = curY + (contentHeight - m_cbChordMode->Height)/2; + + strText = L" * ʾ"; + sizeFont = Canvas->TextExtent(strText); + curX += m_cbChordMode->Width + 10; + curY = contentStart + (contentHeight - sizeFont.Height)/2; + Canvas->TextOutW(curX, curY, strText); + + curX += sizeFont.Width; + + TFont *fntOld = new TFont; + fntOld->Assign( Canvas->Font ); + + Canvas->Font->Name = "Times New Roman"; + Canvas->Font->Quality = TFontQuality::fqClearTypeNatural; + Canvas->Font->Color = CLR_TXT_HOT; + Canvas->Font->Style = TFontStyles()<Font->Size = g_szFont16; + + + strText = m_bAlphaKey ? L"A" : L"VI"; + sizeFont = Canvas->TextExtent(strText); + curY = contentStart + (contentHeight - sizeFont.Height)/2; + Canvas->TextOutW(curX, curY, strText); + + curX += sizeFont.Width; + curY += 7; + strText = L"m"; + Canvas->Font->Size = g_szFont9; + Canvas->TextOutW(curX, curY, strText); + + Canvas->Font->Assign( fntOld ); + delete fntOld; + + ///////////////////////////////////////////////// + contentStart += LINE_HEIGHT; + curX = LEFT_RIGHT + 5; + + strText = L"Ԥṹ"; + sizeFont = Canvas->TextExtent(strText); + curY = contentStart + (contentHeight - sizeFont.Height)/2; + Canvas->TextOutW(curX, curY, strText); + + curX += sizeFont.Width + 10; + curY = contentStart; + m_cbPreStage->Left = curX; + m_cbPreStage->Top = curY + (contentHeight - m_cbPreStage->Height)/2; + + strText = L" * I-ǰࡢM-ɡE-β"; + sizeFont = Canvas->TextExtent(strText); + curX += m_cbPreStage->Width + 10; + curY = contentStart + (contentHeight - sizeFont.Height)/2; + Canvas->TextOutW(curX, curY, strText); +} +//--------------------------------------------------------------------------- +void __fastcall TCustmerSettingPanel::CKBoxChange(TObject* Sender) +{ + TCKBox *tmpCK = (TCKBox *)Sender; + + if( tmpCK == m_ckInitProject ) + m_bAutoOpenProject = tmpCK->Checked; + else if( tmpCK == m_ckDownloadStyle ) + m_bDownloadStyle = m_ckDownloadStyle->Checked; + else if( tmpCK == m_ckPreBeat ) + m_bPreBeat = m_ckPreBeat->Checked; + else if( tmpCK == m_ckSegColor ){ + m_bSegColor = m_ckSegColor->Checked; + Application->MainForm->Perform( UM_PREFERCHANGED, 0, m_bSegColor ? 1 : 0 ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TCustmerSettingPanel::ChordModeChange(TComboBoxItem* Sender, int Index) +{ + m_bAlphaKey = Index!=0; + this->Invalidate(); + + Application->MainForm->Perform( UM_PREFERCHANGED, 1, m_bAlphaKey ); +} +//--------------------------------------------------------------------------- + +void __fastcall TCustmerSettingPanel::PreStageChange(TComboBoxItem* Sender, int Index) +{ + m_cPreStage = Index; +} +//--------------------------------------------------------------------------- + diff --git a/CustomerSettingPanelUnit.h b/CustomerSettingPanelUnit.h new file mode 100644 index 0000000..7b5809d --- /dev/null +++ b/CustomerSettingPanelUnit.h @@ -0,0 +1,68 @@ +//--------------------------------------------------------------------------- + +#ifndef CustomerSettingPanelUnitH +#define CustomerSettingPanelUnitH +#include "SkinScrollBarUnit.h" +#include "CKBox.h" +#include "ComboBoxComponent.h" +//#include "GlobalUnit.h" +//--------------------------------------------------------------------------- +#define LINE_NUM (5) +#define LINE_HEIGHT (40) +#define PANEL_START (26) +#define PANEL_LEFT (10) +#define PANEL_RIGHT (PANEL_LEFT) +#define PANEL_HEIGHT (260) + +//--------------------------------------------------------------------------- +class TCustmerSettingPanel : public Vcl::Extctrls::TPanel +{ + +private: + + int m_iShowLine; + int m_iTopLine; + + TSkinScrollBar *m_ScrollBar; + + TCKBox *m_ckInitProject; + TCKBox *m_ckDownloadStyle; + TCKBox *m_ckPreBeat; + TCKBox *m_ckSegColor; + + TComboBoxComponent *m_cbChordMode; + TComboBoxComponent *m_cbPreStage; + + void __fastcall CKBoxChange(TObject* Sender); + void __fastcall ChordModeChange(TComboBoxItem* Sender, int Index); + void __fastcall PreStageChange(TComboBoxItem* Sender, int Index); + void __fastcall SetShowLine(); + + virtual void __fastcall CreateWnd(); + virtual void __fastcall Paint(void); + + MESSAGE void __fastcall WMEraseBkgnd(TWMEraseBkgnd &Message); + MESSAGE void __fastcall WMVScroll(Winapi::Messages::TWMScroll &Message); + MESSAGE void __fastcall WMMouseWheel(TWMMouseWheel &Message); + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(WM_ERASEBKGND, TWMEraseBkgnd, WMEraseBkgnd) + MESSAGE_HANDLER(WM_VSCROLL, TWMVScroll, WMVScroll) + MESSAGE_HANDLER(WM_MOUSEWHEEL, TWMMouseWheel, WMMouseWheel) + END_MESSAGE_MAP( Vcl::Extctrls::TPanel ) + +public: + bool m_bAutoOpenProject; + bool m_bDownloadStyle; + bool m_bPreBeat; + bool m_bAlphaKey; + bool m_bSegColor; + char m_cPreStage; + + void __fastcall SetContent(); + + __fastcall TCustmerSettingPanel( TComponent* Owner); + __fastcall ~TCustmerSettingPanel(); +}; +//--------------------------------------------------------------------------- +#endif diff --git a/FavorTextureUnit.cpp b/FavorTextureUnit.cpp new file mode 100644 index 0000000..978ad36 --- /dev/null +++ b/FavorTextureUnit.cpp @@ -0,0 +1,279 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop + +#include "FavorTextureUnit.h" +#include "GlobalUnit.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +//--------------------------------------------------------------------------- + +#define TCF_VERSION 0x01 + +typedef struct tTextureCollectionFileHeader{ + char head[4]; + UINT idNum; + + tTextureCollectionFileHeader(){ + head[0] = 'T'; + head[1] = 'X'; + head[2] = 'T'; + head[3] = TCF_VERSION; + + idNum = 0; + } +} TTCFHEADER; //֯ղļͷ + +typedef struct tagFavorTexture +{ + UINT idLoc; + UINT idStyle; + char segType; //Ƭ + char segNo; //Ƭκ + char chan; //ͨ + char iTS; //ĺ + + tagFavorTexture() + { + idLoc = 0; + idStyle = 0; + segType = segNo = chan = -1; + }; + + tagFavorTexture( UINT loc, UINT sty, char st, char sn, char cn, char ts ) + { + idLoc = loc; + idStyle = sty; + segType = st; + segNo = sn; + chan = cn; + iTS = ts; + }; +} TFavorTexture; //֯ղ + +typedef vector FAVORTXTRLIST; + +FAVORTXTRLIST u_lstFavorTextures, + u_lstFTSItems; + +////////////////////////////////////////////////////////////////////////////////////// +void WriteFTSItems() +{ + AnsiString strPath = g_strUserPath.c_str(); + strPath += L"\\profile\\dt_eerp\\colIns.daj"; + + //ȡղб + FILE* fp = fopen( strPath.c_str(), "wb" ); + + if( fp ){ + TTCFHEADER header; + header.idNum = u_lstFTSItems.size(); + + fseek( fp, 0, SEEK_SET ); + fwrite( (void*)&header, sizeof(header), 1, fp ); + + for( int i=0; iidNum; + + for( int i=0; iidLoc, pItem->idStyle ); + if( !pStyle ){ + delete pItem; + bChanged = true; + } + else{ + u_lstFTSItems.push_back( pItem ); + } + } + } + + fclose( fp ); + + if( bChanged ) + WriteFTSItems(); + } +} +////////////////////////////////////////////////////////////////////////////////////// + +int FindListItem( UINT idLoc, UINT idStyle, char sType, char sNo, char cno, bool bAll ) +{ + TFavorTexture *pTemp = NULL; + FAVORTXTRLIST& lstItems = bAll ? u_lstFTSItems : u_lstFavorTextures; + int middle, front = 0, + rear = lstItems.size() - 1; + + while( front<=rear ){ + pTemp = lstItems[front]; + if( pTemp->idLoc==idLoc && pTemp->idStyle==idStyle && pTemp->segType==sType + && pTemp->segNo==sNo && pTemp->chan==cno ) + return front; + + pTemp = lstItems[rear]; + if( pTemp->idLoc==idLoc && pTemp->idStyle==idStyle && pTemp->segType==sType + && pTemp->segNo==sNo && pTemp->chan==cno ) + return rear; + + middle = (front+rear)/2; + + pTemp = lstItems[middle]; + if( pTemp->idLoc==idLoc && pTemp->idStyle==idStyle && pTemp->segType==sType + && pTemp->segNo==sNo && pTemp->chan==cno ) + return middle; + else if( pTemp->idLoc>idLoc || pTemp->idLoc==idLoc && pTemp->idStyle>idStyle + || pTemp->idLoc==idLoc && pTemp->idStyle==idStyle + && pTemp->segType>sType + || pTemp->idLoc==idLoc && pTemp->idStyle==idStyle + && pTemp->segType==sType + && pTemp->segNo>sNo + || pTemp->idLoc==idLoc && pTemp->idStyle==idStyle + && pTemp->segType==sType + && pTemp->segNo==sNo + && pTemp->chan>cno ) + front=middle+1; + else + rear=middle-1; + } + + if( front>rear ){ + return front; + } + + return -1; +} +////////////////////////////////////////////////////////////////////////////////////// + +void ClearFavorTextures( bool bAll ) +{ + u_lstFavorTextures.clear(); + + if( bAll ){ + for( int i=0; iiTS==g_iMelodyTimeSignature ){ + u_lstFavorTextures.push_back( u_lstFTSItems[i] ); + } + } +} +////////////////////////////////////////////////////////////////////////////////////// + +bool IsFavorTexture( UINT idLoc, UINT idStyle, char sType, char sNo, char cno ) +{ + int ind = FindListItem( idLoc, idStyle, sType, sNo, cno ); + if( ind>=0 && indidLoc==idLoc && pTemp->idStyle==idStyle && pTemp->segType==sType + && pTemp->segNo==sNo && pTemp->chan==cno ) + return true; + } + + return false; +} +////////////////////////////////////////////////////////////////////////////////////// + +void AddFavorTextures( UINT idLoc, UINT idStyle, char sType, char sNo, char cno ) +{ + int ind = FindListItem( idLoc, idStyle, sType, sNo, cno ); + TFavorTexture * pItem = NULL; + + if( u_lstFavorTextures.empty() || ind<0 || ind>=u_lstFavorTextures.size() ){ + pItem = new TFavorTexture( idLoc, idStyle, sType, sNo, cno, g_iMelodyTimeSignature ); + u_lstFavorTextures.push_back( pItem ); + } + else{ + TFavorTexture * pTemp = u_lstFavorTextures[ind]; + + if( pTemp->idLoc==idLoc && pTemp->idStyle==idStyle && pTemp->segType==sType + && pTemp->segNo==sNo && pTemp->chan==cno ) + return; //ղ + else{ + pItem = new TFavorTexture( idLoc, idStyle, sType, sNo, cno, g_iMelodyTimeSignature ); + u_lstFavorTextures.insert( u_lstFavorTextures.begin()+ind, pItem); + } + } + + if( pItem ){ + ind = FindListItem( idLoc, idStyle, sType, sNo, cno, true ); + u_lstFTSItems.insert( u_lstFTSItems.begin()+ind, pItem ); + + WriteFTSItems(); + } +} +////////////////////////////////////////////////////////////////////////////////////// + +void DelFavorTextures( UINT idLoc, UINT idStyle, char sType, char sNo, char cno ) +{ + if( !u_lstFavorTextures.empty() ){ + int ind = FindListItem( idLoc, idStyle, sType, sNo, cno ); + + if( ind>=0 && indidLoc==idLoc && pTemp->idStyle==idStyle && pTemp->segType==sType + && pTemp->segNo==sNo && pTemp->chan==cno ){ + u_lstFavorTextures.erase( u_lstFavorTextures.begin()+ind ); + + ind = FindListItem( idLoc, idStyle, sType, sNo, cno, true ); + + delete u_lstFTSItems[ind]; + u_lstFTSItems.erase( u_lstFTSItems.begin()+ind ); + + WriteFTSItems(); + } + } + } +} +////////////////////////////////////////////////////////////////////////////////////// + +void SetFavorTexture( UINT idLoc, UINT idStyle, char sType, char sNo, char cno, bool bSet ) +{ + if( bSet ){ + AddFavorTextures( idLoc, idStyle, sType, sNo, cno ); + } + else{ + DelFavorTextures( idLoc, idStyle, sType, sNo, cno ); + } +} +////////////////////////////////////////////////////////////////////////////////////// + diff --git a/FavorTextureUnit.h b/FavorTextureUnit.h new file mode 100644 index 0000000..db6f889 --- /dev/null +++ b/FavorTextureUnit.h @@ -0,0 +1,15 @@ +//--------------------------------------------------------------------------- + +#ifndef FavorTextureUnitH +#define FavorTextureUnitH +//--------------------------------------------------------------------------- + +int FindListItem( UINT idLoc, UINT idStyle, char sType, char sNo, char cno, bool bAll=false ); +void ClearFavorTextures( bool bAll=false ); +void GetFavorTextures(); +void AddFavorTextures( UINT idLoc, UINT idStyle, char sType, char sNo, char cno ); +void DelFavorTextures( UINT idLoc, UINT idStyle, char sType, char sNo, char cno ); +bool IsFavorTexture( UINT idLoc, UINT idStyle, char sType, char sNo, char cno ); +void SetFavorTexture( UINT idLoc, UINT idStyle, char sType, char sNo, char cno, bool bSet=true ); + +#endif diff --git a/FxDef.cpp b/FxDef.cpp new file mode 100644 index 0000000..f923f77 --- /dev/null +++ b/FxDef.cpp @@ -0,0 +1,1311 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop + +#include "GlobalUnit.h" +#include "FxDef.h" +#include "AudioTrack.h" +#include "Compose.h" +#include "ContentPanelUnit.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +/***************************************************************************************/ +// ȫֳ +/***************************************************************************************/ +const char *g_strEffect[MAX_FX_NUM] = { + "", "ʧ", "ת", "", "ѹ", + "", "ϳ", "", "", "" }, + *g_strEffectPreset[MAX_FX_NUM][3] = { + { "С", "", "" }, { "Ĭ", "", "" }, + { "", "", "" }, { "С", "", "" }, + { "С", "", "" }, { "С", "", "" }, + { "С", "", "" }, { "", "绰", "Ͳ" }, + { "С", "", "" }, { "Ĭ", "Ͱ˶", "߰˶" } }, + *g_strEffectParamName[MAX_FX_NUM][6] = { +/* { "WetDryMix", "Feedback", "LeftDelay", "RightDelay", "", "" }, + { "Gain", "Frequency", "Bandwidth", "Edge", "CutOff", "" }, + { "Rate", "", "", "", "", "" }, + { "InGain", "ReverbMix", "ReverbTime", "RTRatio", "", "" }, + { "Gain", "Threshold", "Ratio", "Attack", "Release", "" }, + { "DryMix", "WetMix", "Feedback", "Rate", "Range", "Frequency" }, + //{ "DryMix", "WetMix", "Feedback", "Rate", "MinDelay", "MaxDelay" }, + { "WetDryMix", "Depth", "Feedback", "Frequency", "Delay", "" }, + { "Center", "Bandwidth", "Gain", "", "", "" }, + { "DryMix", "WetMix", "Feedback", "Rate", "Range", "Frequency" }, +*/ + { "ʪ", "", "ӳ", "ӳ", "", "" }, + { "", "Ƶ", "", "߽", "ٽֵ", "" }, + { "", "", "", "", "", "" }, + { "", "", "ʱ", "", "", "" }, + { "", "ֵ", "", "", "ͷ", "" }, + { "", "ʪ", "", "", "Χ", "Ƶ" }, + { "ʪ", "", "", "Ƶ", "ӳ", "" }, + { "ĵ", "", "", "", "", "" }, + { "", "ʪ", "", "", "Χ", "Ƶ" }, + { "", "", "", "", "", "" } }; + +const DWORD g_aAudioEffectTypes[MAX_FX_NUM] ={ + FX_ECHO, FX_DISTORTION, FX_ROTATE, FX_REVERB, FX_COMPRESSOR, + FX_WAH, FX_CHORUS, FX_PARAMEQ, FX_PHASER, FX_PITCH }; //Ч + +const float g_aEffectParamLimit[MAX_FX_NUM][6][2] = { + { {0,100}, {0,100}, {1,2000}, {1,2000}, {0,0}, {0,0} }, + { {-60,0}, {0,100}, {100,8000}, {100,8000}, {100,8000}, {0,0} }, + { {0,5}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0} }, + { {-96,0}, {-96,0}, {0.001,3000}, {0.001,0.999}, {0,0}, {0,0} }, + { {-60,60}, {-60,0}, {1,20}, {0.01,1000}, {0.01,5000}, {0,0} }, + { {-2,2}, {-2,2}, {-1,1}, {0.001,9.999}, {0.001,9.999}, {1,999} }, + //{ {-2,2}, {-2,2}, {-1,1}, {1,6000}, {1,6000}, {1,1000} }, + { {0,100}, {0,100}, {-99,99}, {0,10}, {0,20}, {0,0} }, + { {80,16000}, {1,36}, {-15,15}, {0,0}, {0,0}, {0,0} }, + { {-2,2}, {-2,2}, {-1,1}, {0.001,9.999}, {0.001,9.999}, {1,999} }, + { {-36,36}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0} } }; + +/***************************************************************************************/ +// ȫֱ +/***************************************************************************************/ +/*PTEffect //g_aAudioEffects[MAX_FX_NUM], + //g_aAudioEffects_SVD[MAX_FX_NUM], + g_aAudioEffects_Clipboard[MAX_FX_NUM]; +*/ +/***************************************************************************************/ +// ȫֺ +/***************************************************************************************/ +int GetFxPresetCount( int iFxType ) +{ + if( iFxType==FX_DISTORTION ) + return 1; + + return 3; +} + +void GetFxPreset( int iFxType, int iPreset, float fParams[] ) +{ + if( iFxType==FX_ROTATE ){ + if( iPreset==0 ){ + fParams[0] = 0.2; + } + else if( iPreset==1 ){ + fParams[0] = 1.0; + } + else if( iPreset==2 ){ + fParams[0] = 2.28; + } + } + else if( iFxType==FX_WAH ){ + fParams[0] = 0.5; + fParams[1] = 1.5; + fParams[2] = 0.5; + + if( iPreset==0 ){ + fParams[3] = 2; + fParams[4] = 4.3; + fParams[5] = 50; + } + else if( iPreset==1 ){ + + fParams[3] = 5; + fParams[4] = 5.3; + fParams[5] = 50; + } + else if( iPreset==2 ){ + fParams[3] = 5; + fParams[4] = 4.3; + fParams[5] = 500; + } + } + else if( iFxType==FX_PHASER ){ + fParams[0] = 0.999; + fParams[1] = 0.999; + fParams[3] = 1; + + if( iPreset==0 ){ + fParams[2] = 0.0; + fParams[4] = 4.0; + fParams[5] = 100; + } + else if( iPreset==1 ){ + fParams[2] = 0.6; + fParams[4] = 4.0; + fParams[5] = 40; + } + else if( iPreset==2 ){ + fParams[2] = 0.6; + fParams[4] = 4.0; + fParams[5] = 60; + } + } + else if( iFxType==FX_CHORUS ){ + /* + fParams[2] = 0.5; + fParams[3] = 1; + + if( iPreset==0 ){ + fParams[0] = 1; + fParams[1] = 0.3; + fParams[4] = 5; + fParams[5] = 1; + } + else if( iPreset==1 ){ + fParams[0] = 0.9; + fParams[1] = -0.4; + fParams[4] = 2; + fParams[5] = 1; + } + else if( iPreset==2 ){ + fParams[0] = 0.3; + fParams[1] = 0.4; + fParams[4] = 10; + fParams[5] = 5; + } +*/ + if( iPreset==0 ){ + fParams[0] = 25; + fParams[1] = 10; + fParams[2] = 10; + fParams[3] = 1.1; + fParams[4] = 10; + } + else if( iPreset==1 ){ + fParams[0] = 50; + fParams[1] = 10; + fParams[2] = 25; + fParams[3] = 1.1; + fParams[4] = 16; + } + else if( iPreset==2 ){ + fParams[0] = 65; + fParams[1] = 20; + fParams[2] = 45; + fParams[3] = 5; + fParams[4] = 16; + } + } + else if( iFxType==FX_DISTORTION ){ + fParams[0] = -60; + fParams[1] = 60; + fParams[2] = 6466; + fParams[3] = 1327; + fParams[4] = 7080; + } + else if( iFxType==FX_REVERB ){ + fParams[0] = 0; + fParams[3] = 0.001; + + if( iPreset==0 ){ + fParams[1] = -44; + fParams[2] = 1428; + } + else if( iPreset==1 ){ + fParams[1] = -21; + fParams[2] = 1573; + } + else if( iPreset==2 ){ + fParams[1] = -9; + fParams[2] = 1573; + } + } + else if( iFxType==FX_COMPRESSOR ){ + if( iPreset==0 ){ + fParams[0] = 0; + fParams[1] = -12; + fParams[2] = 6; + } + else if( iPreset==1 ){ + fParams[0] = 8; + fParams[1] = -13; + fParams[2] = 4; + } + else if( iPreset==2 ){ + fParams[0] = 15; + fParams[1] = -15; + fParams[2] = 2; + } + + fParams[3] = 10; + fParams[4] = 200; + } + else if( iFxType==FX_ECHO ){ + fParams[0] = 20; + fParams[1] = 6; + + if( iPreset==0 ){ + if( g_iMelodyTimeSignature==3 ) + fParams[2] = fParams[3] = g_dblTimePerBar / g_nChordNumPerBar / 3; + else + fParams[2] = fParams[3] = g_dblTimePerBar / g_nChordNumPerBar / 2; + } + else if( iPreset==1 ){ + if( g_iMelodyTimeSignature==3 ) + fParams[2] = g_dblTimePerBar / g_nChordNumPerBar / 3; + else + fParams[2] = g_dblTimePerBar / g_nChordNumPerBar / 2; + + fParams[3] = g_dblTimePerBar / g_nChordNumPerBar; + } + else if( iPreset==2 ){ + fParams[2] = g_dblTimePerBar / g_nChordNumPerBar; + fParams[3] = g_dblTimePerBar / g_nChordNumPerBar * 2; + } + + if( fParams[2]>2000 ) + fParams[2] = 2000; +// fParams[3] = 500; + } + else if( iFxType==FX_PARAMEQ ){ + if( iPreset==0 ){ + fParams[0] = 2220; + fParams[1] = 14; + fParams[2] = 10; + } + else if( iPreset==1 ){ + fParams[0] = 932; + fParams[1] = 20; + fParams[2] = 6; + } + else if( iPreset==2 ){ + fParams[0] = 1110; + fParams[1] = 11; + fParams[2] = 6; + } + } + else if( iFxType==FX_PITCH ){ + if( iPreset==1 ) + fParams[0] = -12; + else if( iPreset==2 ) + fParams[0] = 12; + else + fParams[0] = 0; + } +} + +int GetFxParamNum( int iFxType ) +{ + int num = 0; + + switch( iFxType ){ + case FX_ROTATE: + case FX_PITCH: + num = 1; + break; +/* + case FX_VOLUME: + num = 2; + break; +*/ + case FX_PARAMEQ: + num = 3; + break; + + case FX_REVERB: + case FX_ECHO: + num = 4; + break; + + case FX_DISTORTION: + case FX_COMPRESSOR: + case FX_CHORUS: + num = 5; + break; + + case FX_WAH: + case FX_PHASER: + num = 6; + break; + } + + return num; +} + +float Pos2Param( int iFx, int iParam, int Pos ) +{ + float fMin = g_aEffectParamLimit[iFx][iParam][0], + fMax = g_aEffectParamLimit[iFx][iParam][1]; + + return fMin + ( fMax - fMin ) * ( Pos / 100.0 ); +} + +int Param2Pos( int iFx, int iParam, float fParam ) +{ + float fMin = g_aEffectParamLimit[iFx][iParam][0], + fMax = g_aEffectParamLimit[iFx][iParam][1]; + + return (int)( (fParam-fMin) / ( fMax-fMin ) * 100); +} + +void AudioEffectsClear( int iWave, bool bApply ) +{ + TAudioTrack* pAT = g_aAudioTracks[iWave]; + + while( !pAT->lstFxs.empty() ){ + TAudioFx* pFx = pAT->lstFxs.back(); + + if( bApply ) + f_MM_AudioMoveFx( iWave, pAT->lstFxs.size()-1, -1 ); + + delete pFx; + pAT->lstFxs.pop_back(); + } +} + +HRESULT AudioApplyEffect( int iWave, int ind, TAudioFx* pFx ) +{ + UINT pluginID = 0; + char* strVSTFile = NULL; + + if( pFx->iFx>=FX_VST ){ + VSTINFO* pVST = g_lstVSTFx[pFx->iFx-FX_VST]; + strVSTFile = pVST->strFileName; + + if( pFx->iPreset>=0 && !pVST->aPlugins.empty() ){ + pluginID = pVST->aPlugins[pFx->iPreset]->id; + } + } + + Screen->Cursor = crHourGlass; + + HRESULT hr = f_MM_AudioAddFx( iWave, pFx->iFx, strVSTFile, pluginID, false ); + if( hr==S_OK ){ + if( !pFx->bBypass || pFx->iFx>=FX_VST ) + f_MM_AudioSetFxParam( iWave, ind, pFx->pParam, pFx->nParamSize ); + + if( pFx->bBypass ) + f_MM_AudioSetFxParam( iWave, ind, NULL, 0 ); + } + + Screen->Cursor = crDefault; + + return hr; +} + +void AudioEffectsDefault( int iWave, bool bApply ) +{ + AudioEffectsClear( iWave, bApply ); + + TAudioTrack* pTrack = g_aAudioTracks[iWave]; + + int nBarCount = pTrack->lstBars.size(); + + if( nBarCount>0 ){ + int nSize = GetFxParamNum( FX_REVERB ); + float* pParams = new float[nSize]; + + GetFxPreset( FX_REVERB, 1, pParams ); + + TAudioFx* pFx = new TAudioFx( FX_REVERB, 1, pParams, nSize ); + pTrack->lstFxs.push_back( pFx ); + + if( bApply ) + AudioEffectsSet( iWave ); + } +} + +void AudioEffectsSet( int iWave ) +{ + TAudioTrack* pAT = g_aAudioTracks[iWave]; + + for( int i=0; ilstFxs.size(); i++ ){ + TAudioFx* pFx = pAT->lstFxs[i]; + + if( S_OK!=AudioApplyEffect( iWave, i, pFx ) ){ + delete pFx; + pAT->lstFxs.erase( pAT->lstFxs.begin()+i ); + i--; + } + } +} + +/* +void AudioEffectsDefault( int iWave, bool bApply ) +{ + AudioEffectsClear( iWave, bApply ); + + TAudioTrack* pTrack = g_aAudioTracks[iWave]; + + int nBarCount = pTrack->lstBars.size(); + + if( nBarCount>0 ){ + TEffect* pAE = new TEffect; + pAE->iBarStart = 0; + pAE->iPointStart = 0; + pAE->iBarEnd = nBarCount; + pAE->iPointEnd = 0; + pAE->bOn = true; + pAE->iPreset = 1; //е + pAE->aParams = new float[6]; + GetFxPreset( g_aAudioEffectTypes[3], 1, pAE->aParams ); + + pTrack->lstEffects[3] = pAE; + + if( bApply ){ + f_MM_AudioFx( iWave, 0, -1, g_aAudioEffectTypes[3], pAE->aParams ); + } + } +} + +void AudioEffectsClear( int iWave, bool bApply ) +{ + TAudioTrack* pTrack = g_aAudioTracks[iWave]; + + //Ч + for( int i=0; ilstEffects[i]; + + if( pE ){ + if( bApply ) + f_MM_AudioFx( iWave, 0, -1, g_aAudioEffectTypes[i], NULL ); + + while( pE ){ + TEffect *pTemp = pE->pNext; + delete pE; + pE = pTemp; + } + + pTrack->lstEffects[i] = NULL; + } + } +} + +bool AudioEffectsSort( int iWave, int iFx ) +{ + TAudioTrack* pTrack = g_aAudioTracks[iWave]; + + int nBarCount = pTrack->lstBars.size(); + int iFxStart = iFx, iFxEnd = iFx; + if( iFx<0 ){ + iFxStart = 0; + iFxEnd = MAX_FX_NUM-1; + } + + bool bCountDown = false; + for( int i=iFxStart; i<=iFxEnd; i++ ){ + TEffect *pAE = pTrack->lstEffects[i], + *pHead = pAE, + *pPrev = NULL; + + bool bHead = pHead!=NULL; + while( pAE ){ + DWORD dwStart = pAE->iBarStart * POINTS_PER_BAR + pAE->iPointStart, + dwEnd = pAE->iBarEnd * POINTS_PER_BAR + pAE->iPointEnd; + + //رջʱЧ + if( !pAE->bOn || dwStart+4 >= dwEnd ){ + TEffect* pNext = pAE->pNext; + + if( pPrev ) pPrev->pNext = pNext; + if( pHead==pAE ) pHead = pNext; + + delete pAE; + pAE = pNext; + + continue; + } + + if( pAE->pNext ){ + DWORD dwNextStart = pAE->pNext->iBarStart * POINTS_PER_BAR + + pAE->pNext->iPointStart, + dwNextEnd = pAE->pNext->iBarEnd * POINTS_PER_BAR + + pAE->pNext->iPointEnd; + + //رջʱЧ + if( !pAE->pNext->bOn || dwNextStart+4 >= dwNextEnd ){ + TEffect *pTemp = pAE->pNext; + pAE->pNext = pTemp->pNext; + delete pTemp; + + continue; + } + else{ + if( dwNextStart - dwEnd <= 4 ){ + if( !memcmp( pAE->aParams, pAE->pNext->aParams, 6*sizeof(float) )){ + pAE->iBarEnd = pAE->pNext->iBarEnd; + pAE->iPointEnd = pAE->pNext->iPointEnd; + + TEffect *pTemp = pAE->pNext; + pAE->pNext = pTemp->pNext; + delete pTemp; + + continue; + } + else{ + pAE->iBarEnd = (dwNextStart - 1) / POINTS_PER_BAR; + pAE->iPointEnd = (dwNextStart - 1) % POINTS_PER_BAR; + } + } + } + } + + if( pAE->iBarEnd==nBarCount-1 && pAE->iPointEnd==POINTS_PER_BAR-1 ){ + pAE->iBarEnd = nBarCount; + pAE->iPointEnd = 0; + } + + pPrev = pAE; + pAE = pAE->pNext; + } + + pTrack->lstEffects[i] = pHead; + + if( bHead && !pHead ) + bCountDown = true; + } + + return bCountDown; +} + +void AudioEffectsSet( int iWave, bool bOn ) +{ + TAudioTrack* pTrack = g_aAudioTracks[iWave]; + + for( int i=0; ilstEffects[i]; + int iFxType = g_aAudioEffectTypes[i]; + + if( bOn ){ + while( pE ){ + double dblStart = pE->iBarStart + (double)pE->iPointStart / POINTS_PER_BAR, + dblEnd = -1; + + if( pE->iBarEndlstBars.size() ) + dblEnd = pE->iBarEnd + (double)pE->iPointEnd / POINTS_PER_BAR; + + f_MM_AudioFx( iWave, dblStart, dblEnd, iFxType, pE->aParams ); + + pE = pE->pNext; + } + } + else{ + f_MM_AudioFx( iWave, 0, -1, iFxType, NULL ); + } + } +} + +bool AudioEffectsMove( int iSrc, double dblStart, double dblEnd, int iDest, double dblInsert, int iMode ) +{ + int iStartBar = (int)dblStart, + iEndBar = (int)dblEnd, + iInsertBar = (int)dblInsert, + iStartPoint = (int)( (dblStart-iStartBar) * POINTS_PER_BAR + 0.5 ), + iEndPoint = (int)( (dblEnd-iEndBar) * POINTS_PER_BAR + 0.5 ), + iInsertPoint = (int)( (dblInsert-iInsertBar) * POINTS_PER_BAR + 0.5 ); + + int iDelStartBar = iStartBar, + iDelStartPoint = iStartPoint, + iDelEndBar = iEndBar, + iDelEndPoint = iEndPoint, + iDelStart = iStartBar * POINTS_PER_BAR + iStartPoint, + iDelEnd = iEndBar * POINTS_PER_BAR + iEndPoint; + + if( iMode==MODE_MOVE && ( iInsertBar=0 ) + AudioEffectsSet( iDest, false ); + if( iSrc>=0 && iSrc!=iDest ) + AudioEffectsSet( iSrc, false ); + + bool bCountDown = false; + for(int i = 0; i < MAX_FX_NUM; i++){ + PTEffect pBackupHead = NULL, // ¼ͷַ + pBackupLast = NULL; // ¼βַ + + if( iMode==MODE_MOVE || iMode==MODE_COPY || iMode==MODE_INSERT ){ + if( pSrcTrack ){ + PTEffect pAE = pSrcTrack->lstEffects[i]; + // + while( pAE ) { + if(pAE->iBarStart > iEndBar || pAE->iBarStart==iEndBar + && pAE->iPointStart>=iEndPoint ){ + break; + } + else if(pAE->iBarEnd > iStartBar || pAE->iBarEnd==iStartBar + && pAE->iPointEnd > iStartPoint ) { + TEffect *pNewLast = new TEffect( pAE ); + + if(pBackupHead == NULL) { + pBackupHead = pNewLast; + pBackupLast = pNewLast; + } + else { + pBackupLast->pNext = pNewLast; + pBackupLast = pNewLast; + } + + if(pAE->iBarStart < iStartBar || pAE->iBarStart==iStartBar + && pAE->iPointStart < iStartPoint ) { + // λ + pNewLast->iBarStart = iInsertBar; + pNewLast->iPointStart = iInsertPoint; + } + else { + pNewLast->iBarStart = pAE->iBarStart - iStartBar + iInsertBar; + pNewLast->iPointStart = pAE->iPointStart - iStartPoint + iInsertPoint; + + if( pNewLast->iPointStart<0 ){ + pNewLast->iPointStart += POINTS_PER_BAR; + pNewLast->iBarStart--; + } + else if( pNewLast->iPointStart>=POINTS_PER_BAR ){ + pNewLast->iPointStart -= POINTS_PER_BAR; + pNewLast->iBarStart++; + } + } + + int iEB = iInsertBar - iStartBar, + iEP = iInsertPoint - iStartPoint; + + if( pAE->iBarEnd < iEndBar || pAE->iBarEnd==iEndBar + && pAE->iPointEnd < iEndPoint ){ + iEB += pAE->iBarEnd; + iEP += pAE->iPointEnd; + } + else{ + iEB += iEndBar; + iEP += iEndPoint; + } + + pNewLast->iBarEnd = iEB; + pNewLast->iPointEnd = iEP; + + if( pNewLast->iPointEnd < 0 ){ + pNewLast->iPointEnd += POINTS_PER_BAR; + pNewLast->iBarEnd--; + } + else if( pNewLast->iPointEnd >= POINTS_PER_BAR ){ + pNewLast->iPointEnd -= POINTS_PER_BAR; + pNewLast->iBarEnd++; + } + } + + pAE = pAE->pNext; + } + } + + // 벢¼ + PTEffect pAE = pDestTrack->lstEffects[i], + pPrev = NULL, + pNext = NULL; + + while(pAE) { + if( iInsertBar < pAE->iBarStart || iInsertBar==pAE->iBarStart + && iInsertPoint<=pAE->iPointStart ){ + pNext = pAE; + break; + } + else if( iInsertBar > pAE->iBarEnd || iInsertBar==pAE->iBarEnd + && iInsertPoint > pAE->iPointEnd ){ + pPrev = pAE; + } + else{ + // + TEffect *pNewEffect = new TEffect( pAE ); + pNewEffect->iBarStart = iInsertBar; + pNewEffect->iPointStart = iInsertPoint; + pNewEffect->pNext = pAE->pNext; + + pAE->iBarEnd = iInsertBar; + pAE->iPointEnd = iInsertPoint - 1; + pAE->pNext = pNewEffect; + + if( pAE->iPointEnd<0 ){ + pAE->iPointEnd += POINTS_PER_BAR; + pAE->iBarEnd--; + } + + pPrev = pAE; + pNext = pNewEffect; + + break; + } + + pAE = pAE->pNext; + } + + if( pBackupHead ){ + if( pPrev ){ + pPrev->pNext = pBackupHead; + } + else{ + pDestTrack->lstEffects[i] = pBackupHead; + } + + pBackupLast->pNext = pNext; + } + + // + int nBar = iEndBar - iStartBar, + nPoint = iEndPoint - iStartPoint; + pAE = pNext; + while(pAE) { + if( !(iMode==MODE_INSERT && pAE==pNext && !pBackupHead && pAE->iBarStart==iInsertBar + && pAE->iPointStart==iInsertPoint )){ + pAE->iBarStart += nBar; + pAE->iPointStart += nPoint; + + if( pAE->iPointStart<0 ){ + pAE->iPointStart += POINTS_PER_BAR; + pAE->iBarStart--; + } + else if( pAE->iPointStart>=POINTS_PER_BAR ){ + pAE->iPointStart -= POINTS_PER_BAR; + pAE->iBarStart++; + } + } + + pAE->iBarEnd += nBar; + pAE->iPointEnd += nPoint; + + if( pAE->iPointEnd < 0 ){ + pAE->iPointEnd += POINTS_PER_BAR; + pAE->iBarEnd--; + } + else if( pAE->iPointEnd >= POINTS_PER_BAR ){ + pAE->iPointEnd -= POINTS_PER_BAR; + pAE->iBarEnd++; + } + + pAE = pAE->pNext; + } + } + + // ɾ + if( iMode==MODE_DELETE || iMode==MODE_MOVE ){ + PTEffect pAE = pSrcTrack->lstEffects[i], + pPrev = NULL, + pNext = NULL; + + while( pAE ) { + int iAEStart = pAE->iBarStart * POINTS_PER_BAR + pAE->iPointStart, + iAEEnd = pAE->iBarEnd * POINTS_PER_BAR + pAE->iPointEnd; + + if( iAEStart>=iDelStart && iAEEnd<=iDelEnd ){ + if( pPrev ) + pPrev->pNext = pAE->pNext; + else + pSrcTrack->lstEffects[i] = pAE->pNext; + + PTEffect pTemp = pAE; + pAE = pAE->pNext; + delete pTemp; + + continue; + } + else if( iAEStart < iDelStart ){ + pPrev = pAE; + + if( iAEEnd > iDelStart ){ + if( iAEEnd > iDelEnd ){ // + TEffect* pBreak = new TEffect( pAE ); + pBreak->iBarStart = iDelEndBar; + pBreak->iPointStart = iDelEndPoint; + + pBreak->pNext = pAE->pNext; + pAE->pNext = pBreak; + } + + pAE->iBarEnd = iDelStartBar; + pAE->iPointEnd = iDelStartPoint; + } + } + else if( iAEEnd > iDelStart ){ + if( iAEStart < iDelEnd ){ + pAE->iBarStart = iDelEndBar; + pAE->iPointStart = iDelEndPoint; + } + + pNext = pAE; + break; + } + + pAE = pAE->pNext; + } + + if( pNext ){ + // + int nBar = iEndBar - iStartBar, + nPoint = iEndPoint - iStartPoint; + pAE = pNext; + while(pAE) { + pAE->iBarStart -= nBar; + pAE->iPointStart -= nPoint; + + if( pAE->iPointStart<0 ){ + pAE->iPointStart += POINTS_PER_BAR; + pAE->iBarStart--; + } + else if( pAE->iPointStart>=POINTS_PER_BAR ){ + pAE->iPointStart -= POINTS_PER_BAR; + pAE->iBarStart++; + } + + pAE->iBarEnd -= nBar; + pAE->iPointEnd -= nPoint; + + if( pAE->iPointEnd < 0 ){ + pAE->iPointEnd += POINTS_PER_BAR; + pAE->iBarEnd--; + } + else if( pAE->iPointEnd >= POINTS_PER_BAR ){ + pAE->iPointEnd -= POINTS_PER_BAR; + pAE->iBarEnd++; + } + + pAE = pAE->pNext; + } + } + else if( !pPrev ){ + pSrcTrack->lstEffects[i] = NULL; + } + } + + if( iDest>=0 ) + bCountDown |= AudioEffectsSort( iDest, i ); + if( iSrc>=0 && iSrc!=iDest ) + bCountDown |= AudioEffectsSort( iSrc, i ); + } + + if( iDest>=0 ) + AudioEffectsSet( iDest, true ); + if( iSrc>=0 && iSrc!=iDest ) + AudioEffectsSet( iSrc, true ); + + return bCountDown; +} + +void ClearAudioEffects( TEffect* lstEffects[] ) +{ + //Ч + for( int i=0; ipNext; + delete pE; + pE = pTemp; + } + + lstEffects[i] = NULL; + } + } +} + +void CopyAudioEffects( TEffect* lstDest[], TEffect* lstSrc[], double dblStart, double dblEnd ) +{ + int iStartBar = (int)dblStart, + iEndBar = (int)dblEnd, + iStartPoint = (int)( (dblStart-iStartBar) * POINTS_PER_BAR + 0.5 ), + iEndPoint = (int)( (dblEnd-iEndBar) * POINTS_PER_BAR + 0.5 ); + + if( !lstDest || !lstSrc || iEndBariBarStart > iEndBar || pAE->iBarStart==iEndBar + && pAE->iPointStart>=iEndPoint ){ + break; + } + else if(pAE->iBarEnd > iStartBar || pAE->iBarEnd==iStartBar + && pAE->iPointEnd > iStartPoint ) { + TEffect *pNewLast = new TEffect( pAE ); + + if( pBackupHead == NULL ){ + pBackupHead = pNewLast; + pBackupLast = pNewLast; + } + else{ + pBackupLast->pNext = pNewLast; + pBackupLast = pNewLast; + } + + if( pAE->iBarStart < iStartBar || pAE->iBarStart==iStartBar + && pAE->iPointStart < iStartPoint ){ + // λ + pNewLast->iBarStart = 0; + pNewLast->iPointStart = 0; + } + else { + pNewLast->iBarStart = pAE->iBarStart - iStartBar; + pNewLast->iPointStart = pAE->iPointStart - iStartPoint; + + if( pNewLast->iPointStart<0 ){ + pNewLast->iPointStart += POINTS_PER_BAR; + pNewLast->iBarStart--; + } + else if( pNewLast->iPointStart>=POINTS_PER_BAR ){ + pNewLast->iPointStart -= POINTS_PER_BAR; + pNewLast->iBarStart++; + } + } + + if( pAE->iBarEnd < iEndBar || pAE->iBarEnd==iEndBar + && pAE->iPointEnd < iEndPoint ){ + pNewLast->iBarEnd = pAE->iBarEnd - iStartBar; + pNewLast->iPointEnd = pAE->iPointEnd - iStartPoint; + } + else{ + pNewLast->iBarEnd = iEndBar - iStartBar; + pNewLast->iPointEnd = iEndPoint - iStartPoint; + } + + if( pNewLast->iPointEnd < 0 ){ + pNewLast->iPointEnd += POINTS_PER_BAR; + pNewLast->iBarEnd--; + } + else if( pNewLast->iPointEnd >= POINTS_PER_BAR ){ + pNewLast->iPointEnd -= POINTS_PER_BAR; + pNewLast->iBarEnd++; + } + } + + pAE = pAE->pNext; + } + + lstDest[i] = pBackupHead; + } +} + +void InsertAudioEffetcts( TEffect* lstDest[], TEffect* lstSrc[], double dblInsert, double dblLen ) +{ + if( !lstDest ) + return; + + int iInsertBar = (int)dblInsert, + iInsertPoint = (int)( (dblInsert-iInsertBar) * POINTS_PER_BAR + 0.5 ), + nLenBar = (int)dblLen, + nLenPoint = (int)( (dblLen-nLenBar) * POINTS_PER_BAR + 0.5 ); + + for(int i = 0; i < MAX_FX_NUM; i++){ + PTEffect pSetHead = NULL, // ¼ͷַ + pSetTail = NULL; // ¼βַ + + if( lstSrc && lstSrc[i] ){ + PTEffect pTemp = lstSrc[i]; + while( pTemp ){ + TEffect *pAE = new TEffect( pTemp ); + + pAE->iBarStart += iInsertBar; + pAE->iPointStart += iInsertPoint; + + if( pAE->iPointStart<0 ){ + pAE->iPointStart += POINTS_PER_BAR; + pAE->iBarStart--; + } + else if( pAE->iPointStart>=POINTS_PER_BAR ){ + pAE->iPointStart -= POINTS_PER_BAR; + pAE->iBarStart++; + } + + pAE->iBarEnd += iInsertBar; + pAE->iPointEnd += iInsertPoint; + + if( pAE->iPointEnd < 0 ){ + pAE->iPointEnd += POINTS_PER_BAR; + pAE->iBarEnd--; + } + else if( pAE->iPointEnd >= POINTS_PER_BAR ){ + pAE->iPointEnd -= POINTS_PER_BAR; + pAE->iBarEnd++; + } + + if( pSetHead == NULL ){ + pSetHead = pAE; + pSetTail = pAE; + } + else{ + pSetTail->pNext = pAE; + pSetTail = pSetTail->pNext; + } + + pTemp = pTemp->pNext; + } + } + + // 벢¼ + PTEffect pAE = lstDest[i], + pPrev = NULL, + pNext = NULL; + + while(pAE) { + if( iInsertBar < pAE->iBarStart || iInsertBar==pAE->iBarStart + && iInsertPoint<=pAE->iPointStart ){ + pNext = pAE; + break; + } + else if( iInsertBar > pAE->iBarEnd || iInsertBar==pAE->iBarEnd + && iInsertPoint > pAE->iPointEnd ){ + pPrev = pAE; + } + else{ + // + TEffect *pNewEffect = new TEffect( pAE ); + pNewEffect->iBarStart = iInsertBar; + pNewEffect->iPointStart = iInsertPoint; + pNewEffect->pNext = pAE->pNext; + + pAE->iBarEnd = iInsertBar; + pAE->iPointEnd = iInsertPoint; + pAE->pNext = pNewEffect; + + if( pAE->iPointEnd<0 ){ + pAE->iPointEnd += POINTS_PER_BAR; + pAE->iBarEnd--; + } + + pPrev = pAE; + pNext = pNewEffect; + + break; + } + + pAE = pAE->pNext; + } + + if( pSetHead ){ + if( pPrev ) + pPrev->pNext = pSetHead; + else + lstDest[i] = pSetHead; + + pSetTail->pNext = pNext; + } + + // + pAE = pNext; + while(pAE) { + pAE->iBarStart += nLenBar; + pAE->iPointStart += nLenPoint; + + if( pAE->iPointStart<0 ){ + pAE->iPointStart += POINTS_PER_BAR; + pAE->iBarStart--; + } + else if( pAE->iPointStart>=POINTS_PER_BAR ){ + pAE->iPointStart -= POINTS_PER_BAR; + pAE->iBarStart++; + } + + pAE->iBarEnd += nLenBar; + pAE->iPointEnd += nLenPoint; + + if( pAE->iPointEnd < 0 ){ + pAE->iPointEnd += POINTS_PER_BAR; + pAE->iBarEnd--; + } + else if( pAE->iPointEnd >= POINTS_PER_BAR ){ + pAE->iPointEnd -= POINTS_PER_BAR; + pAE->iBarEnd++; + } + + pAE = pAE->pNext; + } + + SortAudioEffects( &lstDest[i] ); + } +} + +void SortAudioEffects( TEffect** lstEffect ) +{ + TEffect *pAE = *lstEffect, + *pHead = pAE, + *pPrev = NULL; + + while( pAE ){ + DWORD dwStart = pAE->iBarStart * POINTS_PER_BAR + pAE->iPointStart, + dwEnd = pAE->iBarEnd * POINTS_PER_BAR + pAE->iPointEnd; + + //رջʱЧ + if( !pAE->bOn || dwStart+4 >= dwEnd ){ + TEffect* pNext = pAE->pNext; + + if( pPrev ) pPrev->pNext = pNext; + if( pHead==pAE ) pHead = pNext; + + delete pAE; + pAE = pNext; + + continue; + } + + if( pAE->pNext ){ + DWORD dwNextStart = pAE->pNext->iBarStart * POINTS_PER_BAR + + pAE->pNext->iPointStart, + dwNextEnd = pAE->pNext->iBarEnd * POINTS_PER_BAR + + pAE->pNext->iPointEnd; + + //رջʱЧ + if( !pAE->pNext->bOn || dwNextStart+4 >= dwNextEnd ){ + TEffect *pTemp = pAE->pNext; + pAE->pNext = pTemp->pNext; + delete pTemp; + + continue; + } + else{ + if( dwNextStart - dwEnd <= 4 ){ + if( !memcmp( pAE->aParams, pAE->pNext->aParams, 6*sizeof(float) )){ + pAE->iBarEnd = pAE->pNext->iBarEnd; + pAE->iPointEnd = pAE->pNext->iPointEnd; + + TEffect *pTemp = pAE->pNext; + pAE->pNext = pTemp->pNext; + delete pTemp; + + continue; + } + else{ + pAE->iBarEnd = (dwNextStart - 1) / POINTS_PER_BAR; + pAE->iPointEnd = (dwNextStart - 1) % POINTS_PER_BAR; + } + } + } + } + + pPrev = pAE; + pAE = pAE->pNext; + } + + *lstEffect = pHead; +} + +void RemoveAudioEffects( TEffect* lstEffects[], double dblStart, double dblEnd ) +{ + int iStartBar = (int)dblStart, + iEndBar = (int)dblEnd, + iStartPoint = (int)( (dblStart-iStartBar) * POINTS_PER_BAR + 0.5 ), + iEndPoint = (int)( (dblEnd-iEndBar) * POINTS_PER_BAR + 0.5 ), + iDelStart = iStartBar * POINTS_PER_BAR + iStartPoint, + iDelEnd = iEndBar * POINTS_PER_BAR + iEndPoint; + + for(int i = 0; i < MAX_FX_NUM; i++){ + PTEffect pAE = lstEffects[i], + pPrev = NULL, + pNext = NULL; + + while( pAE ) { + int iAEStart = pAE->iBarStart * POINTS_PER_BAR + pAE->iPointStart, + iAEEnd = pAE->iBarEnd * POINTS_PER_BAR + pAE->iPointEnd; + + if( iAEStart>=iDelStart && iAEEnd<=iDelEnd ){ + if( pPrev ) + pPrev->pNext = pAE->pNext; + else + lstEffects[i] = pAE->pNext; + + PTEffect pTemp = pAE; + pAE = pAE->pNext; + delete pTemp; + + continue; + } + else if( iAEStart < iDelStart ){ + pPrev = pAE; + + if( iAEEnd > iDelStart ){ + if( iAEEnd > iDelEnd ){ // + TEffect* pBreak = new TEffect( pAE ); + pBreak->iBarStart = iEndBar; + pBreak->iPointStart = iEndPoint; + + pBreak->pNext = pAE->pNext; + pAE->pNext = pBreak; + } + + pAE->iBarEnd = iStartBar; + pAE->iPointEnd = iStartPoint; + } + } + else if( iAEEnd > iDelStart ){ + if( iAEStart < iDelEnd ){ + pAE->iBarStart = iEndBar; + pAE->iPointStart = iEndPoint; + } + + pNext = pAE; + break; + } + + pAE = pAE->pNext; + } + + if( pNext ){ + // + int nBar = iEndBar - iStartBar, + nPoint = iEndPoint - iStartPoint; + pAE = pNext; + while(pAE) { + pAE->iBarStart -= nBar; + pAE->iPointStart -= nPoint; + + if( pAE->iPointStart<0 ){ + pAE->iPointStart += POINTS_PER_BAR; + pAE->iBarStart--; + } + else if( pAE->iPointStart>=POINTS_PER_BAR ){ + pAE->iPointStart -= POINTS_PER_BAR; + pAE->iBarStart++; + } + + pAE->iBarEnd -= nBar; + pAE->iPointEnd -= nPoint; + + if( pAE->iPointEnd < 0 ){ + pAE->iPointEnd += POINTS_PER_BAR; + pAE->iBarEnd--; + } + else if( pAE->iPointEnd >= POINTS_PER_BAR ){ + pAE->iPointEnd -= POINTS_PER_BAR; + pAE->iBarEnd++; + } + + pAE = pAE->pNext; + } + } + else if( !pPrev ){ + lstEffects[i] = NULL; + } + } +} + +TEffect* DuplicateEffects( TEffect* pSrcHead ) +{ + TEffect *pDestHead = NULL, + *pAE = pSrcHead, + *pPrev = NULL; + + while( pAE ){ + TEffect* pNew = new TEffect( pAE ); + if( !pPrev ){ + pDestHead = pPrev = pNew; + } + else{ + pPrev->pNext = pNew; + pPrev = pNew; + } + + pAE = pAE->pNext; + } + + return pDestHead; +} +*/ diff --git a/FxDef.h b/FxDef.h new file mode 100644 index 0000000..dfe3043 --- /dev/null +++ b/FxDef.h @@ -0,0 +1,105 @@ +//--------------------------------------------------------------------------- +#ifndef FxDefH +#define FxDefH +//--------------------------------------------------------------------------- + +#define MAX_FX_NUM 10 +#define FX_ECHO 0x00 +#define FX_DISTORTION 0x01 +#define FX_ROTATE 0x02 +#define FX_REVERB 0x03 +#define FX_COMPRESSOR 0x04 +#define FX_WAH 0x05 +#define FX_CHORUS 0x06 +#define FX_PARAMEQ 0x07 +#define FX_PHASER 0x08 +#define FX_PITCH 0x100 +//#define FX_APR 0x101 +//#define FX_VOLUME 0x102 +#define FX_VST 0x10000 + +/***************************************************************************************/ +// ȫֽṹ +/***************************************************************************************/ +#include +typedef struct tagAudioFx +{ + int iFx; + int iPreset;//iPlugins + WORD bBypass; + WORD nParamSize; + void* pParam; + + tagAudioFx( int iF, int iP, void* pP, int nSize, bool bB=false ){ + iFx = iF; + iPreset = iP; + nParamSize = nSize; + pParam = pP; + bBypass = bB; + } + + tagAudioFx( tagAudioFx* pSrc ){ + memcpy( this, pSrc, sizeof(tagAudioFx) ); + + if( pSrc->nParamSize ){ + pParam = new float[pSrc->nParamSize]; + memcpy( pParam, pSrc->pParam, sizeof(float)*nParamSize ); + } + } + + ~tagAudioFx(){ + if( pParam ) + delete[] pParam; + } + +} TAudioFx; + +/***************************************************************************************/ +// ȫֳ +/***************************************************************************************/ +extern const char *g_strEffect[MAX_FX_NUM], + *g_strEffectPreset[MAX_FX_NUM][3], + *g_strEffectParamName[MAX_FX_NUM][6]; +extern const DWORD g_aAudioEffectTypes[MAX_FX_NUM]; //Ч +extern const float g_aEffectParamLimit[MAX_FX_NUM][6][2];//Чӳ +/***************************************************************************************/ +// ȫֱ +/***************************************************************************************/ +//extern PTEffect g_aAudioEffects[MAX_FX_NUM], //õЧ +// g_aAudioEffects_SVD[MAX_FX_NUM];//湤̱Ƚ + +/***************************************************************************************/ +// ȫֺ +/***************************************************************************************/ +int GetFxPresetCount( int iFxType ); +void GetFxPreset( int iFxType, int iPreset, float fParams[] ); +int GetFxParamNum( int iFxType ); +float Pos2Param( int iFx, int iParam, int Pos ); +int Param2Pos( int iFx, int iParam, float fParam ); + +HRESULT AudioApplyEffect( int iWave, int ind, TAudioFx* pFx ); +void AudioEffectsClear( int iWave, bool bApply=true ); +void AudioEffectsDefault( int iWave, bool bApply=true ); +void AudioEffectsSet( int iWave ); + +/* +void SetAudioEffects( bool bOn=true ); +void ResetAudioEffects( int nLastBarNum=0 ); +void SortAudioEffects( int iFx=-1 ); +void ClearAudioEffects( TEffect** aEffects ); +void MoveAudioEffects( int iStartBar, int iEndBar, int iInsertBar, int iMode ); + +void AudioEffectsDefault( int iWave, bool bApply=true ); +void AudioEffectsClear( int iWave, bool bApply=true ); +bool AudioEffectsSort( int iWave, int iFx=-1 ); +void AudioEffectsSet( int iWave, bool bOn=true ); +bool AudioEffectsMove( int iSrc, double dblStart, double dblEnd, int iDest, double dblInsert, int iMode ); + +void ClearAudioEffects( TEffect* lstDest[] ); +void CopyAudioEffects( TEffect* lstDest[], TEffect* lstSrc[], double dblStart, double dblEnd ); +void InsertAudioEffetcts( TEffect* lstDest[], TEffect* lstSrc[], double dblInsert, double dblLen ); +void SortAudioEffects( TEffect** lstEffect ); +void RemoveAudioEffects( TEffect* lstEffects[], double dblStart, double dblEnd ); +TEffect* DuplicateEffects( TEffect* lstSrc ); +*/ +#endif diff --git a/GeneralDialogPanel.h b/GeneralDialogPanel.h new file mode 100644 index 0000000..7abd787 --- /dev/null +++ b/GeneralDialogPanel.h @@ -0,0 +1,54 @@ +//--------------------------------------------------------------------------- +///////////////////////////////// +////////װ ǵɱĹ̺ʹùмͼƬ Res\System\close.png -->L"PngImage_Close" +///////////////////////////////// + +#ifndef GeneralDialogPanelH +#define GeneralDialogPanelH +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include +#include +#include +//--------------------------------------------------------------------------- +class CBTPNButton; +#define LEN_BKG_EXTERNAL_ROUND 1 +#define LEN_BKG_EXTERNAL_FRMAE 1 +#define LEN_BKG_INTERNAL_LINE 23 +//--------------------------------------------------------------------------- +class PACKAGE TGeneralDialogPanel : public TPanel +{ +private: + TNotifyEvent FOnCanceled; // رմ¼ + + TPngImage *m_imgClose; + CBTPNButton *m_btnClose; + + void __fastcall CloseClick(TObject *Sender); + + MESSAGE void __fastcall WMEraseBkgnd(Winapi::Messages::TWMEraseBkgnd &Message); + MESSAGE void __fastcall WMSize(Winapi::Messages::TWMSize &Message); + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(WM_ERASEBKGND, TWMEraseBkgnd, WMEraseBkgnd) + MESSAGE_HANDLER(WM_SIZE, TWMSize, WMSize) + END_MESSAGE_MAP(Vcl::Extctrls::TPanel) + +protected: + + virtual void __fastcall Paint(void); + virtual void __fastcall CreateWnd(); + DYNAMIC void __fastcall MouseDown(System::Uitypes::TMouseButton Button, + System::Classes::TShiftState Shift, int X, int Y); +public: + __fastcall TGeneralDialogPanel(TComponent* Owner); + __fastcall ~TGeneralDialogPanel(); + +__published: + __property TNotifyEvent OnCanceled = {write = FOnCanceled, read = FOnCanceled}; +}; +//--------------------------------------------------------------------------- +#endif + diff --git a/GlobalUnit.cpp b/GlobalUnit.cpp new file mode 100644 index 0000000..ad6b7d1 --- /dev/null +++ b/GlobalUnit.cpp @@ -0,0 +1,2822 @@ +// --------------------------------------------------------------------------- +#include +#pragma hdrstop + +#include +#include "GlobalUnit.h" +#include "MessageDef.h" +#include "FxDef.h" +#include "StyleItem.h" +#include "Project.h" +#include "Undo.h" +#include "MidiTrack.h" +#include +#pragma comment(lib, "iphlpapi.lib") +// --------------------------------------------------------------------------- +#pragma package(smart_init) + +#define EX_NULL = NULL +#define MAX_STYLE_CACHE 32 + +typedef struct tagTempStyleMap //ʱӳ +{ + UINT idTemp; + UINT idLoc; + UINT idStyle; +} TTempStyleMap, *PTTempStyleMap; + +/*************************************************************************************** / + // ȫֳ +/************************************************************************************** */ +const char *g_strDefaultSoundSet = "Pro default", + *g_strCZFont[18] = { "CZ ", "CZ ɫʴ", "CZ ", "CZ ", "CZ ˾", + "CZ ", "CZ ϳ", "CZ ͭ", "CZ ɹ", "CZ ", "CZ ϳ", + "CZ ϳɱ", "CZ ϳЧ", "CZ ", "CZ ", "CZ Ч", + "CZ ", "CZ й" }, + *g_strMelodyKey[KEY_NUM] = { + "C", "bD", "D", "bE", "E", "F", "#F", "G", "bA", "A", "bB", "B"}, // ʾ + *g_strTimeSignature[4] = {"4/4", "3/4", "2/4", "6/8"}, // ĺ + *g_strTSName[4] = {"44", "43", "42", "86"}, // ĺ + *g_strSegment[4] = { "", "ӻ", "ǰ/", "β" }, + *NAME_SEG[] = { {"V"}, {"F"}, {"I"}, {"E"}, }, + *g_strIntro[MAX_INTRO_NUM] = {"ǰ/-1", "ǰ/-2", "ǰ/-3", + "ǰ/-4" }, // ʾ + *g_strEnding[MAX_ENDING_NUM] = {"β-1", "β-2", "β-3", "β-4"}, + *g_strFill[STAGE_FILL_NUM] = {"ӻ-1", "ӻ-2", "ӻ-3", "ӻ-4"}, // ӻСʾ + *g_strStageVar[STAGE_VAR_NUM] = {"-1","-2","-3","-4"}, // ֶΰ + *g_strStage = "%c"; // ɶʾ + +const String g_strTable[7] = { L"", L"", L"", L"", L"", L"", L"" }, + g_strAlphaTable[7] = { L"C", L"D", L"E", L"F", L"G", L"A", L"B" }; + +/* +const TColor g_clrSegment[4][8] = {{RGB(250,244,213),RGB(248,235,159), // ɫ + RGB(247,224,128),RGB(244,205,100), + RGB(246,187,95),RGB(246,172,82), + RGB(244,149,64),RGB(234,132,59)}, + {RGB(254,214,247),RGB(246,193,241), // ӻɫ + RGB(240,172,236),RGB(238,149,234), + RGB(236,111,231),RGB(236,75,231), + RGB(236,47,231),RGB(224,15,231)}, + {RGB(196,230,147),RGB(179,215,176), // ǰɫ + RGB(164,200,161),RGB(148,185,145)}, + {RGB(203,219,247),RGB(189,206,230), // βɫ + RGB(177,193,220),RGB(164,180,205)}}; +*/ + +/*************************************************************************************** / + // ȫֱ +/************************************************************************************** */ +FONTINFOLIST g_lstFonts; // ɫб +FONTINFO* g_lstCZFonts[18]; //չɫ +VSTINFOLIST g_lstVSTFx, //VSTЧб + g_lstVSTi; //VSTiɫб + +STYLELIST g_aOriginStyles, // ߷б + g_aLocalStyles, // طб + g_aShareStyles, // б + g_aTempStyles, // ʱб + g_aCollectStyles, // ղطб + g_aRecomStyles, // Ƽб + u_aCacheStyles; // б + +wstring g_strVSTPath, // VST· + g_strVSTiPath, // VSTi· + g_strLastSavePath, // ϴαļ + g_strLastImportFile, // ϴεļ + g_strExecutePath, // ִļ· + g_strUserPath, // û· + g_strExtFontsPath, //չɫ· + g_strSegImportPath; // Ƭ· + +string g_strSelectedStyleName; // ѡз +vectorg_lstStyleSelected; // ѡзͼ +DWORD g_iSelectedStyleType = 0; // ѡ + +char g_strTxtFontName[20] = "Tahoma", + g_strSoundFont[80] = "", //ȫɫ + g_strCurrentVersion[20] = "", + g_strServerURL[256] = "", + g_strPlaybackDevice[256] = "", + g_strRecordDevice[256] = ""; + +int g_arrIntroBarNum[MAX_INTRO_NUM], // ȫַǰС + g_arrEndingBarNum[MAX_ENDING_NUM], // ȫַβС + + g_idFont = -1, // ѡɫ + g_iFontType = 0, // ɫ SF2/VST + g_iMelodyTimeSignature = 0, // ĺ + g_nMelodyTempo = 75, // ٶ + g_nChordNumPerBar = 4, //ÿСں + g_nBPM = 4, // ÿС + g_nPPB = 30, // ÿĵ + + g_iPlaybackDevice = -1, // ָ豸 + g_iPlaybackOutput = -1, // ָԴ + g_iRecordDevice = -1, //ָ¼豸 + g_iRecordInput = -1, //¼Դ + g_nRecordChannels = 1, //ȱʡͨ¼ + g_iToolPanelShow = 0, // ʾʽ0=ұߣ1=, 2=أ + g_iLastSaveOption = SAVE_COMPOSE | SAVE_AUDIO, // ϴαѡȱʡΪȫ + g_iLastSaveType = FILETYPE_MP3, // ϴαļʽȱʡΪMP3 + g_iViewMode = 0, // ͼģʽȱʡΪ + g_iPreStage = 2, // ԤģʽȱʡΪIMIME + g_iPreStageDefault = 2, // ûԤģʽȱʡΪIMIME + g_iSegColorMode = 1, // ɫģʽ0=κţ1= + + g_iWindowState = wsNormal; + +float g_fRecordVolume = -1, // ¼ + g_fSpeakerVolume = -1; // + +double g_dblStep = 0, g_dblTimePerBar = 0; + +TUSERINFO g_infoUser; +TSOFTWAREINFO g_infoSoftwareUpdate; +TSONGINFO g_infoSong; + +bool + g_bRecordAutoAdjust = true, //¼Զ + g_bRecordMoniter = false, //¼ + g_bShowRecordHint = true, // + g_bUpdateMandatory = false, // ͻҪǿƸ + g_bMidiMelody = false, //MIDI + g_bWeakup = false, // + g_bShowPlayTick = true, // ʾСڽĻʱ + g_bAutoLogin = true, + g_bLogon = false, + g_bPredefine = false, // Ԥ蹤̣Զ/ӳ + g_bRecProtect = false, // ¼ + g_bShowProtectMsg = true, //ʾ¼Ϣ + g_bShowVSTPath = true, //ǷʾVST· +// g_bSongSaved = false, //ȫѱ + g_bAudioChanged = false, // ʼ¼޸ + g_bSongChanged = false, // ȫ¼޸ + +// g_bRightPanelShow = true, //Ƿʾұ + g_bAlphaKey = false, // false,trueӢ + g_bAutoSave = false, //Զ + g_bAutoDownloadStyle = false, //Զط + g_bAutoOpenProject = false, //Զϴι + g_bAutoOpenProjectEnable = false,//Զϴιʹ + g_bProjStylePaid = false, //̷֧ + g_bPrebeat = false, //ʹԤʾ + g_bExtFontUsable = false, //չɫ + g_bExtFont = false; //ʹչɫ + +//DWORD g_iMacAddressNum = 0; //macַ +vector g_lstMacAddress; //macַ +//vector g_lstMacAddressNew; + +UINT g_xDpi=96, g_yDpi=96; //High DPI Ӧ +int g_szFont7 = 7, + g_szFont8 = 8, + g_szFont9 = 9, + g_szFont10 = 10, + g_szFont11 = 11, + g_szFont12 = 12, + g_szFont16 = 16; +/*************************************************************************************** / + // ȫֺ +/************************************************************************************** */ +CM_GetVersion f_CM_GetVersion EX_NULL; +CM_Initialize f_CM_Initialize EX_NULL; +CM_Release f_CM_Release EX_NULL; +CM_CheckStyle f_CM_CheckStyle EX_NULL; +CM_GetStyleRecomIDs f_CM_GetStyleRecomIDs EX_NULL; +CM_GetStyleInfo f_CM_GetStyleInfo EX_NULL; +CM_GetStyleInfos f_CM_GetStyleInfos EX_NULL; +CM_SetMelodyNotes f_CM_SetMelodyNotes EX_NULL; +CM_AutoChords f_CM_AutoChords EX_NULL; +CM_Compose f_CM_Compose EX_NULL; +CM_GetNextLocalID f_CM_GetNextLocalID EX_NULL; +CM_SaveLocalStyle f_CM_SaveLocalStyle EX_NULL; +CM_ChangeLocalStyle f_CM_ChangeLocalStyle EX_NULL; +CM_DeleteLocalStyle f_CM_DeleteLocalStyle EX_NULL; +CM_AddTempSegment f_CM_AddTempSegment EX_NULL; +CM_DeleteTempSegment f_CM_DeleteTempSegment EX_NULL; +CM_DeleteTempStyle f_CM_DeleteTempStyle EX_NULL; +CM_ProjBackupStyle f_CM_ProjBackupStyle EX_NULL; +CM_ProjRestoreStyle f_CM_ProjRestoreStyle EX_NULL; +CM_GetCollectionIDs f_CM_GetCollectionIDs EX_NULL; +CM_SetCollectionStyle f_CM_SetCollectionStyle EX_NULL; +CM_MakeStyle f_CM_MakeStyle EX_NULL; + +MM_GetVersion f_MM_GetVersion EX_NULL; +MM_InitialObjects f_MM_InitialObjects EX_NULL; +MM_DestroyObjects f_MM_DestroyObjects EX_NULL; +MM_GetFontInfo f_MM_GetFontInfo EX_NULL; +MM_SetDefaultFont f_MM_SetDefaultFont EX_NULL; +MM_GetVSTInfo f_MM_GetVSTInfo EX_NULL; +MM_LoadVSTi f_MM_LoadVSTi EX_NULL; +MM_HandleVSTiPreset f_MM_HandleVSTiPreset EX_NULL; +MM_GetVSTiPrograms f_MM_GetVSTiPrograms EX_NULL; +MM_LoadMidiMelody f_MM_LoadMidiMelody EX_NULL; +MM_LoadCompose f_MM_LoadCompose EX_NULL; +MM_FreeComposes f_MM_FreeComposes EX_NULL; +MM_LoadPrebeat f_MM_LoadPrebeat EX_NULL; +MM_Play f_MM_Play EX_NULL; +MM_Stop f_MM_Stop EX_NULL; +MM_CheckIODevice f_MM_CheckIODevice EX_NULL; +MM_SetIODevice f_MM_SetIODevice EX_NULL; +MM_GetPlaybackDeviceInfo f_MM_GetPlaybackDeviceInfo EX_NULL; +MM_GetPlaybackOutputInfo f_MM_GetPlaybackOutputInfo EX_NULL; +MM_GetRecordDeviceInfo f_MM_GetRecordDeviceInfo EX_NULL; +MM_GetRecordInputInfo f_MM_GetRecordInputInfo EX_NULL; +MM_RecordTest f_MM_RecordTest EX_NULL; +MM_SetRecordAutoAdjust f_MM_SetRecordAutoAdjust EX_NULL; +MM_SetRecordMoniter f_MM_SetRecordMoniter EX_NULL; +MM_GetMidiInBuffer f_MM_GetMidiInBuffer EX_NULL; +MM_SetMidiInBuffer f_MM_SetMidiInBuffer EX_NULL; +MM_SetRecordProtect f_MM_SetRecordProtect EX_NULL; +MM_ShowAsioPanel f_MM_ShowAsioPanel EX_NULL; +MM_RestartAsioDevice f_MM_RestartAsioDevice EX_NULL; +MM_LoadAudio f_MM_LoadAudio EX_NULL; +MM_GetMelodyInfo f_MM_GetMelodyInfo EX_NULL; +MM_GetMelodyBars f_MM_GetMelodyBars EX_NULL; +MM_GetMelodyNotes f_MM_GetMelodyNotes EX_NULL; +MM_CreateRealTimeMIDIStream f_MM_CreateRealTimeMIDIStream EX_NULL; +MM_FreeRealTimeMIDIStream f_MM_FreeRealTimeMIDIStream EX_NULL; +MM_RealTimeMIDINoteOn f_MM_RealTimeMIDINoteOn EX_NULL; +MM_RealTimeMIDINoteOff f_MM_RealTimeMIDINoteOff EX_NULL; +MM_LoadDemo f_MM_LoadDemo EX_NULL; +MM_PlayDemo f_MM_PlayDemo EX_NULL; +MM_ChangeDemoParam f_MM_ChangeDemoParam EX_NULL; +MM_SetTempo f_MM_SetTempo EX_NULL; +MM_SetTimeSignature f_MM_SetTimeSignature EX_NULL; +MM_GetAudioVolume f_MM_GetAudioVolume EX_NULL; +MM_GetStreamVolume f_MM_GetStreamVolume EX_NULL; +MM_SetStreamVolume f_MM_SetStreamVolume EX_NULL; +MM_GetLatency f_MM_GetLatency EX_NULL; +MM_Save f_MM_Save EX_NULL; +MM_SaveMidi f_MM_SaveMidi EX_NULL; +MM_SaveProject f_MM_SaveProject EX_NULL; +MM_LoadProject f_MM_LoadProject EX_NULL; +MM_ResetProject f_MM_ResetProject EX_NULL; +MM_UserCanceled f_MM_UserCanceled EX_NULL; +MM_ActiveAPR f_MM_ActiveAPR EX_NULL; +MM_SetTrackEvent f_MM_SetTrackEvent EX_NULL; +MM_ShowVSTEditor f_MM_ShowVSTEditor EX_NULL; +MM_SaveVSTParams f_MM_SaveVSTParams EX_NULL; +MM_AudioNewTrack f_MM_AudioNewTrack EX_NULL; +MM_AudioDeleteTrack f_MM_AudioDeleteTrack EX_NULL; +MM_AudioRecord f_MM_AudioRecord EX_NULL; +MM_AudioMove f_MM_AudioMove EX_NULL; +MM_AudioFx f_MM_AudioFx EX_NULL; +MM_AudioLoad f_MM_AudioLoad EX_NULL; +MM_AudioGetLength f_MM_AudioGetLength EX_NULL; +MM_AddUndoBefore f_MM_AddUndoBefore EX_NULL; +MM_AddUndoAfter f_MM_AddUndoAfter EX_NULL; +MM_CancelAddUndo f_MM_CancelAddUndo EX_NULL; +MM_Undo f_MM_Undo EX_NULL; +MM_AudioAddFx f_MM_AudioAddFx EX_NULL; +MM_AudioGetFxParam f_MM_AudioGetFxParam EX_NULL; +MM_AudioSetFxParam f_MM_AudioSetFxParam EX_NULL; +MM_AudioMoveFx f_MM_AudioMoveFx EX_NULL; +MM_AudioFxProcess f_MM_AudioFxProcess; +MM_SetMidiTrackParam f_MM_SetMidiTrackParam EX_NULL; +MM_SetAudioTrackParam f_MM_SetAudioTrackParam EX_NULL; + +CS_GetVersion f_CS_GetVersion EX_NULL; +CS_InitialService f_CS_InitialService EX_NULL; +CS_DestroyService f_CS_DestroyService EX_NULL; +CS_Register f_CS_Register EX_NULL; +CS_Login f_CS_Login EX_NULL; +CS_Logoff f_CS_Logoff EX_NULL; +CS_CheckPayment f_CS_CheckPayment EX_NULL; +CS_ConfirmPayment f_CS_ConfirmPayment EX_NULL; +CS_CancelOperation f_CS_CancelOperation EX_NULL; +CS_DownloadStyle f_CS_DownloadStyle EX_NULL; +CS_GetQnA f_CS_GetQnA EX_NULL; +CS_SubmitQnA f_CS_SubmitQnA EX_NULL; +CS_GetNotice f_CS_GetNotice EX_NULL; +CS_GetNewNoticeNum f_CS_GetNewNoticeNum EX_NULL; +CS_UploadSong f_CS_UploadSong EX_NULL; +CS_GetWebPageURL f_CS_GetWebPageURL EX_NULL; +CS_GetStyleNumsEx f_CS_GetStyleNumsEx EX_NULL; +CS_StyleScore f_CS_StyleScore EX_NULL; +CS_AutoDownloadStyle f_CS_AutoDownloadStyle EX_NULL; +CS_SaveProject f_CS_SaveProject EX_NULL; +CS_LoadProject f_CS_LoadProject EX_NULL; +CS_ResetProject f_CS_ResetProject EX_NULL; +CS_UploadStyle f_CS_UploadStyle EX_NULL; + +QR_Encode f_QR_Encode EX_NULL; + +/*************************************************************************************** / + // ȫֺʵ +/************************************************************************************** */ +HRESULT GetCMFunctions(HINSTANCE hDll) { + // VERIFY( hDll ); + + f_CM_GetVersion = (CM_GetVersion)GetProcAddress(hDll, "CM_GetVersion"); + f_CM_Initialize = (CM_Initialize)GetProcAddress(hDll, "CM_Initialize"); + f_CM_Release = (CM_Release)GetProcAddress(hDll, "CM_Release"); + f_CM_CheckStyle = (CM_CheckStyle)GetProcAddress(hDll, "CM_CheckStyle"); + f_CM_GetStyleRecomIDs = (CM_GetStyleRecomIDs)GetProcAddress(hDll,"CM_GetStyleRecomIDs"); + f_CM_GetStyleInfo = (CM_GetStyleInfo)GetProcAddress(hDll, "CM_GetStyleInfo"); + f_CM_GetStyleInfos = (CM_GetStyleInfos)GetProcAddress(hDll, "CM_GetStyleInfos"); + f_CM_SetMelodyNotes = (CM_SetMelodyNotes)GetProcAddress(hDll, "CM_SetMelodyNotes"); + f_CM_AutoChords = (CM_AutoChords)GetProcAddress(hDll, "CM_AutoChords"); + f_CM_Compose = (CM_Compose)GetProcAddress(hDll, "CM_Compose"); + f_CM_GetNextLocalID = (CM_GetNextLocalID)GetProcAddress(hDll, "CM_GetNextLocalID"); + f_CM_SaveLocalStyle = (CM_SaveLocalStyle)GetProcAddress(hDll, "CM_SaveLocalStyle"); + f_CM_ChangeLocalStyle = (CM_ChangeLocalStyle)GetProcAddress(hDll, "CM_ChangeLocalStyle"); + f_CM_DeleteLocalStyle = (CM_DeleteLocalStyle)GetProcAddress(hDll, "CM_DeleteLocalStyle"); + f_CM_AddTempSegment = (CM_AddTempSegment)GetProcAddress(hDll,"CM_AddTempSegment"); + f_CM_DeleteTempSegment = (CM_DeleteTempSegment)GetProcAddress(hDll, "CM_DeleteTempSegment"); + f_CM_DeleteTempStyle = (CM_DeleteTempStyle)GetProcAddress(hDll,"CM_DeleteTempStyle"); + f_CM_ProjBackupStyle = (CM_ProjBackupStyle)GetProcAddress(hDll, "CM_ProjBackupStyle"); + f_CM_ProjRestoreStyle = (CM_ProjRestoreStyle)GetProcAddress(hDll,"CM_ProjRestoreStyle"); + f_CM_GetCollectionIDs = (CM_GetCollectionIDs)GetProcAddress(hDll,"CM_GetCollectionIDs"); + f_CM_SetCollectionStyle = (CM_SetCollectionStyle)GetProcAddress(hDll, "CM_SetCollectionStyle"); + f_CM_MakeStyle = (CM_MakeStyle)GetProcAddress(hDll, "CM_MakeStyle"); + + if (!(f_CM_Initialize && f_CM_Release && f_CM_CheckStyle && f_CM_GetStyleInfo && + f_CM_GetStyleInfos && f_CM_GetStyleRecomIDs && f_CM_SetMelodyNotes && + f_CM_AutoChords && f_CM_Compose && f_CM_GetNextLocalID && f_CM_SaveLocalStyle && + f_CM_DeleteLocalStyle && f_CM_AddTempSegment && f_CM_DeleteTempSegment && + f_CM_DeleteTempStyle && f_CM_ProjBackupStyle && f_CM_ProjRestoreStyle && + f_CM_GetCollectionIDs && f_CM_SetCollectionStyle && f_CM_MakeStyle && + f_CM_ChangeLocalStyle && f_CM_GetVersion )){ + return S_FALSE; + } + + HRESULT hResult = f_CM_GetVersion(); + if( hResult!=CM_VERSION || f_CM_Initialize()!= S_OK ){ + return S_FALSE; + } + + return S_OK; +} + +HRESULT GetMMFunctions(HINSTANCE hDll) { + // VERIFY( hDll ); + + f_MM_GetVersion = (MM_GetVersion)GetProcAddress(hDll, "MM_GetVersion"); + f_MM_InitialObjects = (MM_InitialObjects)GetProcAddress(hDll, "MM_InitialObjects"); + f_MM_DestroyObjects = (MM_DestroyObjects)GetProcAddress(hDll, "MM_DestroyObjects"); + f_MM_GetFontInfo = (MM_GetFontInfo)GetProcAddress(hDll, "MM_GetFontInfo"); + f_MM_SetDefaultFont = (MM_SetDefaultFont)GetProcAddress(hDll, "MM_SetDefaultFont"); + f_MM_GetVSTInfo = (MM_GetVSTInfo)GetProcAddress(hDll, "MM_GetVSTInfo"); + f_MM_LoadVSTi = (MM_LoadVSTi)GetProcAddress(hDll, "MM_LoadVSTi"); + f_MM_GetVSTiPrograms = (MM_GetVSTiPrograms)GetProcAddress(hDll, "MM_GetVSTiPrograms"); + f_MM_HandleVSTiPreset = (MM_HandleVSTiPreset)GetProcAddress(hDll, "MM_HandleVSTiPreset"); + f_MM_LoadMidiMelody = (MM_LoadMidiMelody)GetProcAddress(hDll, "MM_LoadMidiMelody"); + f_MM_LoadCompose = (MM_LoadCompose)GetProcAddress(hDll, "MM_LoadCompose"); + f_MM_FreeComposes = (MM_FreeComposes)GetProcAddress(hDll, "MM_FreeComposes"); + f_MM_LoadPrebeat = (MM_LoadPrebeat)GetProcAddress(hDll, "MM_LoadPrebeat"); + f_MM_Play = (MM_Play)GetProcAddress(hDll, "MM_Play"); + f_MM_Stop = (MM_Stop)GetProcAddress(hDll, "MM_Stop"); + f_MM_CheckIODevice = (MM_CheckIODevice)GetProcAddress(hDll, "MM_CheckIODevice"); + f_MM_SetIODevice = (MM_SetIODevice)GetProcAddress(hDll, "MM_SetIODevice"); + f_MM_GetPlaybackDeviceInfo = (MM_GetPlaybackDeviceInfo)GetProcAddress(hDll, "MM_GetPlaybackDeviceInfo"); + f_MM_GetPlaybackOutputInfo = (MM_GetPlaybackOutputInfo)GetProcAddress(hDll, "MM_GetPlaybackOutputInfo"); + f_MM_GetRecordDeviceInfo = (MM_GetRecordDeviceInfo)GetProcAddress(hDll, "MM_GetRecordDeviceInfo"); + f_MM_GetRecordInputInfo = (MM_GetRecordInputInfo)GetProcAddress(hDll, "MM_GetRecordInputInfo"); + f_MM_RecordTest = (MM_RecordTest)GetProcAddress(hDll, "MM_RecordTest"); + f_MM_SetRecordAutoAdjust = (MM_SetRecordAutoAdjust)GetProcAddress(hDll, "MM_SetRecordAutoAdjust"); + f_MM_SetRecordMoniter = (MM_SetRecordMoniter)GetProcAddress(hDll, "MM_SetRecordMoniter"); + f_MM_GetMidiInBuffer = (MM_GetMidiInBuffer)GetProcAddress(hDll, "MM_GetMidiInBuffer"); + f_MM_SetMidiInBuffer = (MM_SetMidiInBuffer)GetProcAddress(hDll, "MM_SetMidiInBuffer"); + f_MM_SetRecordProtect = (MM_SetRecordProtect)GetProcAddress(hDll, "MM_SetRecordProtect"); + f_MM_ShowAsioPanel = (MM_ShowAsioPanel)GetProcAddress(hDll, "MM_ShowAsioPanel"); + f_MM_RestartAsioDevice = (MM_RestartAsioDevice)GetProcAddress(hDll, "MM_RestartAsioDevice"); + f_MM_LoadAudio = (MM_LoadAudio)GetProcAddress(hDll, "MM_LoadAudio"); + f_MM_GetMelodyInfo = (MM_GetMelodyInfo)GetProcAddress(hDll, "MM_GetMelodyInfo"); + f_MM_GetMelodyBars = (MM_GetMelodyBars)GetProcAddress(hDll, "MM_GetMelodyBars"); + f_MM_GetMelodyNotes = (MM_GetMelodyNotes)GetProcAddress(hDll, "MM_GetMelodyNotes"); + f_MM_CreateRealTimeMIDIStream = (MM_CreateRealTimeMIDIStream)GetProcAddress(hDll, "MM_CreateRealTimeMIDIStream"); + f_MM_FreeRealTimeMIDIStream = (MM_FreeRealTimeMIDIStream)GetProcAddress(hDll, "MM_FreeRealTimeMIDIStream"); + f_MM_RealTimeMIDINoteOn = (MM_RealTimeMIDINoteOn)GetProcAddress(hDll, "MM_RealTimeMIDINoteOn"); + f_MM_RealTimeMIDINoteOff = (MM_RealTimeMIDINoteOff)GetProcAddress(hDll, "MM_RealTimeMIDINoteOff"); +// f_MM_PlayStyleDemo = (MM_PlayStyleDemo)GetProcAddress(hDll, "MM_PlayStyleDemo"); + f_MM_LoadDemo = (MM_LoadDemo)GetProcAddress(hDll, "MM_LoadDemo"); + f_MM_PlayDemo = (MM_PlayDemo)GetProcAddress(hDll, "MM_PlayDemo"); + f_MM_ChangeDemoParam = (MM_ChangeDemoParam)GetProcAddress(hDll, "MM_ChangeDemoParam"); + f_MM_SetTempo = (MM_SetTempo)GetProcAddress(hDll, "MM_SetTempo"); + f_MM_SetTimeSignature = (MM_SetTimeSignature)GetProcAddress(hDll, "MM_SetTimeSignature"); + f_MM_GetAudioVolume = (MM_GetAudioVolume)GetProcAddress(hDll, "MM_GetAudioVolume"); + f_MM_GetStreamVolume = (MM_GetStreamVolume)GetProcAddress(hDll, "MM_GetStreamVolume"); + f_MM_SetStreamVolume = (MM_SetStreamVolume)GetProcAddress(hDll, "MM_SetStreamVolume"); + f_MM_GetLatency = (MM_GetLatency)GetProcAddress(hDll, "MM_GetLatency"); + f_MM_Save = (MM_Save)GetProcAddress(hDll, "MM_Save"); + f_MM_SaveMidi = (MM_SaveMidi)GetProcAddress(hDll, "MM_SaveMidi"); + f_MM_UserCanceled = (MM_UserCanceled)GetProcAddress(hDll, "MM_UserCanceled"); + f_MM_SaveProject = (MM_SaveProject)GetProcAddress(hDll, "MM_SaveProject"); + f_MM_LoadProject = (MM_LoadProject)GetProcAddress(hDll, "MM_LoadProject"); + f_MM_ResetProject = (MM_ResetProject)GetProcAddress(hDll, "MM_ResetProject"); + f_MM_ActiveAPR = (MM_ActiveAPR)GetProcAddress(hDll, "MM_ActiveAPR"); + f_MM_SetTrackEvent = (MM_SetTrackEvent)GetProcAddress(hDll, "MM_SetTrackEvent"); + f_MM_ShowVSTEditor = (MM_ShowVSTEditor)GetProcAddress(hDll, "MM_ShowVSTEditor"); + f_MM_SaveVSTParams = (MM_SaveVSTParams)GetProcAddress(hDll, "MM_SaveVSTParams"); + f_MM_AudioNewTrack = (MM_AudioNewTrack)GetProcAddress(hDll, "MM_AudioNewTrack"); + f_MM_AudioDeleteTrack = (MM_AudioDeleteTrack)GetProcAddress(hDll, "MM_AudioDeleteTrack"); + f_MM_AudioRecord = (MM_AudioRecord)GetProcAddress(hDll, "MM_AudioRecord"); + f_MM_AudioMove = (MM_AudioMove)GetProcAddress(hDll, "MM_AudioMove"); + f_MM_AudioFx = (MM_AudioFx)GetProcAddress(hDll, "MM_AudioFx"); + f_MM_AudioLoad = (MM_AudioLoad)GetProcAddress(hDll, "MM_AudioLoad"); + f_MM_AudioGetLength = (MM_AudioGetLength)GetProcAddress(hDll, "MM_AudioGetLength"); + f_MM_AddUndoBefore = (MM_AddUndoBefore)GetProcAddress(hDll, "MM_AddUndoBefore"); + f_MM_AddUndoAfter = (MM_AddUndoAfter)GetProcAddress(hDll, "MM_AddUndoAfter"); + f_MM_CancelAddUndo = (MM_CancelAddUndo)GetProcAddress(hDll, "MM_CancelAddUndo"); + f_MM_Undo = (MM_Undo)GetProcAddress(hDll, "MM_Undo"); + f_MM_AudioAddFx = (MM_AudioAddFx)GetProcAddress(hDll, "MM_AudioAddFx"); + f_MM_AudioGetFxParam = (MM_AudioGetFxParam)GetProcAddress(hDll, "MM_AudioGetFxParam"); + f_MM_AudioSetFxParam = (MM_AudioSetFxParam)GetProcAddress(hDll, "MM_AudioSetFxParam"); + f_MM_AudioMoveFx = (MM_AudioMoveFx)GetProcAddress(hDll, "MM_AudioMoveFx"); + f_MM_AudioFxProcess = (MM_AudioFxProcess)GetProcAddress(hDll, "MM_AudioFxProcess"); + f_MM_SetMidiTrackParam = (MM_SetMidiTrackParam)GetProcAddress(hDll, "MM_SetMidiTrackParam"); + f_MM_SetAudioTrackParam = (MM_SetAudioTrackParam)GetProcAddress(hDll, "MM_SetAudioTrackParam"); + + if (!(f_MM_InitialObjects && f_MM_DestroyObjects && f_MM_GetFontInfo && f_MM_SetDefaultFont && + f_MM_LoadMidiMelody && f_MM_LoadCompose && f_MM_LoadAudio && f_MM_Play && f_MM_GetVersion && + f_MM_Stop && f_MM_Save && f_MM_UserCanceled && f_MM_GetMelodyInfo && f_MM_GetVSTInfo && + f_MM_CreateRealTimeMIDIStream && f_MM_FreeRealTimeMIDIStream && f_MM_ShowVSTEditor && + f_MM_RealTimeMIDINoteOn && f_MM_RealTimeMIDINoteOff && f_MM_SetRecordMoniter && + f_MM_SetTempo && f_MM_SetTimeSignature && f_MM_LoadDemo && f_MM_PlayDemo && + f_MM_ActiveAPR && f_MM_GetAudioVolume && f_MM_GetStreamVolume && f_MM_SetStreamVolume && + f_MM_SaveProject && f_MM_LoadProject && f_MM_GetLatency && f_MM_SetTrackEvent && + f_MM_CheckIODevice &&f_MM_SetIODevice && f_MM_GetPlaybackDeviceInfo && f_MM_FreeComposes && + f_MM_GetPlaybackOutputInfo && f_MM_GetRecordDeviceInfo && f_MM_GetRecordInputInfo && + f_MM_RecordTest && f_MM_SetRecordAutoAdjust && f_MM_SetRecordProtect && f_MM_SaveVSTParams && + f_MM_ShowAsioPanel && f_MM_RestartAsioDevice && f_MM_AudioLoad && f_MM_ResetProject && + f_MM_GetMidiInBuffer && f_MM_SetMidiInBuffer && f_MM_LoadPrebeat && f_MM_AudioNewTrack && + f_MM_AudioDeleteTrack && f_MM_AudioRecord && f_MM_AudioMove && f_MM_AudioFx && + f_MM_AddUndoBefore && f_MM_AddUndoAfter && f_MM_CancelAddUndo && f_MM_Undo && f_MM_AudioGetLength && + f_MM_AudioAddFx && f_MM_AudioGetFxParam && f_MM_AudioSetFxParam && f_MM_AudioMoveFx && f_MM_AudioFxProcess && + f_MM_ChangeDemoParam && f_MM_GetVSTiPrograms && f_MM_LoadVSTi && f_MM_HandleVSTiPreset && + f_MM_SetMidiTrackParam && f_MM_SetAudioTrackParam && f_MM_SaveMidi)) + { + return S_FALSE; + } + + return S_OK; +} + +HRESULT GetCSFunctions(HINSTANCE hDll) { + // VERIFY( hDll ); + + f_CS_GetVersion = (CS_GetVersion)GetProcAddress(hDll, "CS_GetVersion"); + f_CS_InitialService = (CS_InitialService)GetProcAddress(hDll,"CS_InitialService"); + f_CS_DestroyService = (CS_DestroyService)GetProcAddress(hDll,"CS_DestroyService"); + f_CS_Register = (CS_Register)GetProcAddress(hDll, "CS_Register"); + f_CS_Login = (CS_Login)GetProcAddress(hDll, "CS_Login"); + f_CS_Logoff = (CS_Logoff)GetProcAddress(hDll, "CS_Logoff"); + f_CS_CheckPayment = (CS_CheckPayment)GetProcAddress(hDll, "CS_CheckPayment"); + f_CS_ConfirmPayment = (CS_ConfirmPayment)GetProcAddress(hDll, "CS_ConfirmPayment"); + f_CS_CancelOperation = (CS_CancelOperation)GetProcAddress(hDll, "CS_CancelOperation"); + f_CS_DownloadStyle = (CS_DownloadStyle)GetProcAddress(hDll, "CS_DownloadStyle"); + f_CS_GetQnA = (CS_GetQnA)GetProcAddress(hDll, "CS_GetQnA"); + f_CS_SubmitQnA = (CS_SubmitQnA)GetProcAddress(hDll, "CS_SubmitQnA"); + f_CS_GetNotice = (CS_GetNotice)GetProcAddress(hDll, "CS_GetNotice"); + f_CS_GetNewNoticeNum = (CS_GetNewNoticeNum)GetProcAddress(hDll, "CS_GetNewNoticeNum"); + f_CS_UploadSong = (CS_UploadSong)GetProcAddress(hDll, "CS_UploadSong"); + f_CS_GetWebPageURL = (CS_GetWebPageURL)GetProcAddress(hDll, "CS_GetWebPageURL"); + f_CS_GetStyleNumsEx = (CS_GetStyleNumsEx)GetProcAddress(hDll, "CS_GetStyleNumsEx"); + f_CS_StyleScore = (CS_StyleScore)GetProcAddress(hDll, "CS_StyleScore"); + f_CS_AutoDownloadStyle = (CS_AutoDownloadStyle)GetProcAddress(hDll, "CS_AutoDownloadStyle"); + f_CS_SaveProject = (CS_SaveProject)GetProcAddress(hDll, "CS_SaveProject"); + f_CS_LoadProject = (CS_LoadProject)GetProcAddress(hDll, "CS_LoadProject"); + f_CS_ResetProject = (CS_ResetProject)GetProcAddress(hDll, "CS_ResetProject"); + f_CS_UploadStyle = (CS_UploadStyle)GetProcAddress(hDll, "CS_UploadStyle"); + + if (!(f_CS_InitialService && f_CS_DestroyService && f_CS_Login && f_CS_Login + && f_CS_CheckPayment && f_CS_ConfirmPayment && f_CS_CancelOperation + && f_CS_GetQnA && f_CS_SubmitQnA && f_CS_Register && f_CS_UploadSong + && f_CS_GetWebPageURL && f_CS_GetStyleNumsEx && f_CS_GetNotice + && f_CS_DownloadStyle && f_CS_GetNewNoticeNum && f_CS_StyleScore + && f_CS_AutoDownloadStyle && f_CS_SaveProject && f_CS_LoadProject + && f_CS_ResetProject && f_CS_UploadStyle && f_CS_GetVersion)) { + return S_FALSE; + } + + return S_OK; +} + +HRESULT GetQRFunctions(HINSTANCE hDll) { + f_QR_Encode = (QR_Encode)GetProcAddress(hDll, "QR_Encode"); + + return S_OK; +} + +void SetMelodyTempo(int nTempo, bool bInit) { + if (bInit || g_nMelodyTempo != nTempo) { + g_dblTimePerBar = (double)g_nBPM * 60000.0 / nTempo; + g_dblStep = TIMER_PLAY_INTERVAL * POINTS_PER_BAR / g_dblTimePerBar;//* (double)nTempo / g_nBPM / 60000.0; + + f_MM_SetTempo(nTempo); + g_nMelodyTempo = nTempo; + + f_CS_ResetProject(); + g_bProjStylePaid = false; + + if( g_aAudioTracks.size()>1 ){ + ClearGlobalVars( LIST_OPUSAUDIOS ); + } + + if( !g_Theme.Empty() ){ + ClearGlobalVars( LIST_RAWAUDIO ); + g_bPredefine = true; + } + + ClearGlobalVars( LIST_UNDO ); + } +} + +void SetMelodyTS(int iTS, bool bInit) +{ + if (bInit || g_iMelodyTimeSignature != iTS) { + g_nBPM = iTS==0 ? 4 : ( iTS==2 ? 2 : 3 ); + g_nPPB = POINTS_PER_BAR / g_nBPM; + if( iTS==3 ) g_nPPB /= 2; + + g_dblTimePerBar = (double)g_nBPM * 60000.0 / g_nMelodyTempo; + g_dblStep = TIMER_PLAY_INTERVAL * POINTS_PER_BAR / g_dblTimePerBar;//* (double)g_nMelodyTempo / (double)g_nBPM / 60000.0; + g_nChordNumPerBar = iTS==0 ? 4 : ( iTS==1 ? 3 : 2 ); + + f_MM_SetTimeSignature( iTS ); + g_iMelodyTimeSignature = iTS; + } +} + +int ActiveAPR( bool bActive ) +{ + if( f_MM_ActiveAPR ){ + return f_MM_ActiveAPR( bActive ); + } + + return S_FALSE; +} + +void SetMelodyNotes( int nBarNum ) { + int nNotesNum = f_MM_GetMelodyNotes( NULL, NULL, &g_iMelodyKey );//f_MM_GetMelodyInfo(NULL, NULL, NULL); + if( nNotesNum>0 ) { + BYTE *aNotes = new BYTE[nNotesNum]; + WORD *aTicks = new WORD[nNotesNum]; + + f_MM_GetMelodyNotes( aNotes, aTicks, NULL ); + //f_MM_GetMelody( aNotes, aTicks, g_iMelodyKey ); + + // //(g_nMelodyTempo >= 125) ? 24 : (g_nMelodyTempo >= 83) ? 48 : 72; + + DebugPrint("CM_SetMelodyNotes"); + f_CM_SetMelodyNotes(nNotesNum, aNotes, aTicks, 192, + (BYTE)g_iMelodyTimeSignature, g_nMelodyTempo ); + + // + g_bWeakup = nBarNum>1 && aNotes[0] == 128 && aTicks[0]>192 * g_nBPM / 2; + + delete[]aNotes; + delete[]aTicks; + } +} + +void SetPlayTimer(bool bStart, UINT& tTimer, UINT& tAccuracy, void* pUser, int tInterval) { + if (bStart) { // 򿪶ʱ + // öʱ + TIMECAPS tc; + MMRESULT mrError; + + // útimeGetDevCapsȡϵͳֱʵȡֵΧд˳ + memset(&tc, 0, sizeof(TIMECAPS)); + mrError = timeGetDevCaps(&tc, sizeof(TIMECAPS)); + if (!mrError == TIMERR_NOERROR) { + DebugPrint("Get system accuracy failed! code = %x", mrError); + } + + // ֱʵֵܳϵͳȡֵΧ + tAccuracy = tc.wPeriodMin > TIMER_ACCURACY ? tc.wPeriodMin : TIMER_ACCURACY; + tAccuracy = tAccuracy < tc.wPeriodMax ? tAccuracy : tc.wPeriodMax; + + // timeBeginPeriodöʱķֱ + timeBeginPeriod(tAccuracy); + + tTimer = timeSetEvent(tInterval, tAccuracy, + (LPTIMECALLBACK)OnMediaTimer, (DWORD_PTR)pUser, TIME_PERIODIC); + + } + else { // رնʱ + timeKillEvent(tTimer); + timeEndPeriod(tAccuracy); + tTimer = 0; + } +} + +void GetPlayTime(int iStartBar, double dblStartPoint, int iTime[3] ) +{ + if (g_bShowPlayTick) { + int iBeat = dblStartPoint / g_nPPB, + iTick = 120 * (dblStartPoint - iBeat * g_nPPB) / g_nPPB; + iTime[0] = iStartBar + 1; + iTime[1] = iBeat + 1; + iTime[2] = iTick; + } + else { + UINT tStartTime = (INT)((iStartBar + dblStartPoint / POINTS_PER_BAR) + * (double)g_nBPM * 60000.0 / g_nMelodyTempo); + iTime[0] = tStartTime / 60000; + iTime[1] = (tStartTime % 60000) / 1000; + iTime[2] = tStartTime % 1000; + } +} + +void CALLBACK OnMediaTimer(UINT tTimerID, UINT msg, DWORD dwUser, DWORD dwl, DWORD dw2) { + PostMessage((HWND)dwUser, MSG_MEDIATIME, tTimerID, 0); +} + +void InitCZFontList( String strPath ) +{ + UnicodeString strWildcard[2] = { L"\\ext\\*.", L"\\ext\\*.sf2" }; + + TSearchRec sr; + int iAttr = 0; + int nInst, nDrum; + FONTPRESET setInst[128], setDrum[128]; + + for( int w=0; w<2; w++ ){ + if (FindFirst(strPath + strWildcard[w], iAttr, sr) == 0) { + do { + AnsiString strFileName = strPath + "\\ext\\" + sr.Name; + char strFontName[80] = ""; + + if( f_MM_GetFontInfo(strFileName.c_str(), strFontName, &nInst, setInst, + &nDrum, setDrum )==S_OK ){ + SetCZFonts( strFileName.c_str(), strFontName, nInst, setInst, + nDrum, setDrum ); + } + } + while( FindNext(sr)==0 ); + + FindClose(sr); + } + else { + iAttr = GetLastError(); + } + } +} + +void InitFontList() +{ + UnicodeString strPath = g_strExecutePath.c_str(), + strFontPath = L"Fonts", + strWildcard[2] = { L"\\*.", L"\\*.sf2" };//, L"\\*.sfz" }; + + strPath += strFontPath; + + //ɨչɫ + memset( g_lstCZFonts, 0, sizeof(g_lstCZFonts) ); + + if( !g_strExtFontsPath.empty() ){ + UnicodeString strExtFontPath = g_strExtFontsPath.c_str(); + + if( strExtFontPath.CompareIC( strPath ) ) + InitCZFontList( strExtFontPath ); + } + + InitCZFontList( strPath ); + + g_bExtFontUsable = true; + for( int i=0; i<18; i++ ){ + if( g_lstCZFonts[i]!=NULL ){ + g_lstFonts.push_back( g_lstCZFonts[i] ); + } + else if( i<17 ){ + g_bExtFontUsable = false; + break; + } + } + + // ɨGMɫ + TSearchRec sr; + int iAttr = 0; + int nInst, nDrum; + FONTPRESET setInst[128], setDrum[128]; + + for( int w=0; w<2 && g_lstFonts.size()strFontName ); + + if( iComp < 0 ){ + iInsert = j; + break; + } + else if( iComp==0 ){ + bAdd = false; + break; + } + } + + if( bAdd ){ + FONTINFO * pNewFI = new FONTINFO( strFileName.c_str(), strFontName, + nInst, setInst, nDrum, setDrum ); + if( iInsert<0 ){ + g_lstFonts.push_back(pNewFI); + } + else{ + g_lstFonts.insert( g_lstFonts.begin()+iInsert, pNewFI ); + } + } + } + } + while( FindNext(sr)==0 && g_lstFonts.size()strFontName, g_strSoundFont )==0 ){ + bLastFontFound = true; + g_idFont = i; + break; + } + + if( idDefaultFont<0 && strcmp( pFI->strFontName, g_strDefaultSoundSet )==0 ){ + idDefaultFont = i; + } + + if( idDefaultFont<0 && idFirstGM<0 && pFI->nInstCount>0 && pFI->nDrumCount>0 ){ + idFirstGM = i; + } + } + + if( !bLastFontFound ){ + if( idDefaultFont!=-1 ) { + g_idFont = idDefaultFont; + } + else if( idFirstGM ){ + g_idFont = idFirstGM; + } + else{ + g_idFont = 0; + } + } + + strcpy( g_strSoundFont, g_lstFonts[g_idFont]->strFontName ); + + if( g_bExtFont ){ + if( !g_bExtFontUsable ){ + g_bExtFont = false; + bLastFontFound = false; + } + else + bLastFontFound = true; + } + + char aFiles[17][256]; + int num = 0; + if( g_bExtFont ){ + for( int i=0; i<17; i++ ){ + strcpy( aFiles[i], g_lstCZFonts[i]->strFileName ); + } + num = 17; + } + else{ + num = 1; + strcpy( aFiles[0], g_lstFonts[g_idFont]->strFileName ); + } + + f_MM_SetDefaultFont( num, aFiles ); + + return bLastFontFound; +} +// --------------------------------------------------------------------------- + +void ClearFontList() +{ +/* for( int i=0; i<18; i++ ){ + if( g_lstCZFonts[i]!=NULL ) + delete g_lstCZFonts[i]; + } +*/ + FONTINFOLIST::iterator iFI = g_lstFonts.begin(); + while( iFI != g_lstFonts.end() ){ + FONTINFO* pF = *iFI; + + if( pF->nInstCount>0 ) + delete[] pF->aInsts; + if( pF->nDrumCount>0 ) + delete[] pF->aDrums; + + delete pF; + iFI = g_lstFonts.erase(iFI); + } +} +// --------------------------------------------------------------------------- +#define MAX_VST_PLUGINS 1024 +#include "SplashFormUnit.h" +void InitVSTList() +{ + String strVSTPath, strVSTiPath; + int rpt = 0; + + if( !g_strVSTPath.empty() ){ + strVSTPath = g_strVSTPath.c_str(); + rpt++; + } + + if( !g_strVSTiPath.empty() ){ + strVSTiPath = g_strVSTiPath.c_str(); + + if( strVSTPath.CompareIC( strVSTiPath ) ) + rpt++; + } + + for( int r=0; r0) ? strVSTPath : strVSTiPath; + strPath += "\\"; + + if( strPath==strVSTPath ) + SetVSTScanReg( 1 ); + else + SetVSTScanReg( 2 ); + + AnsiString strFileName = strPath.c_str(); + strFileName += L"*.dll"; + + if (FindFirst(strFileName, iAttr, sr) == 0) { + do { + char strEffName[32] = "", + strPlugins[MAX_VST_PLUGINS][64]; + DWORD uniqueID = 0; + UINT idPlugins[MAX_VST_PLUGINS]; + int nPlugins = MAX_VST_PLUGINS; + + strFileName = strPath.c_str() + sr.Name; + + if( SplashForm ){ + String strMsg = "ɨVST: " + sr.Name; + SplashForm->ShowProgress( strMsg ); + } + + int ret = f_MM_GetVSTInfo( strFileName.c_str(), strEffName, uniqueID, + nPlugins, strPlugins, idPlugins ); + + if( ret>0 ){ + VSTINFOLIST& lstVST = (ret & VSTeffect) ? g_lstVSTFx : g_lstVSTi; + bool bAdd = true; + + for( int i=0; iuniqueID==uniqueID ){ + bAdd = false; + break; + } + } + + if( bAdd && lstVST.size()id = idPlugins[i]; + strcpy( pPlugin->name, strPlugins[i] ); + pVI->aPlugins.push_back( pPlugin ); + } + } + } + } + while( FindNext(sr)==0 ); + + FindClose(sr); + } + else { + iAttr = GetLastError(); + } + } + + SetVSTScanReg( 0 ); +} +// --------------------------------------------------------------------------- + +void ClearVSTList() +{ + while( !g_lstVSTFx.empty() ){ + delete g_lstVSTFx.back(); + g_lstVSTFx.pop_back(); + } + + while( !g_lstVSTi.empty() ){ + delete g_lstVSTi.back(); + g_lstVSTi.pop_back(); + } +} +// --------------------------------------------------------------------------- + +void SelectStyle() +{ + ClearStyleList(); + g_pPreStyle = NULL; + + //ȡղб + int nCollects = 0; + UINT (*idCollects)[2] = NULL; + f_CM_GetCollectionIDs( g_iMelodyTimeSignature, nCollects, NULL ); + if( nCollects>0 ){ + idCollects = new UINT[nCollects][2]; + f_CM_GetCollectionIDs( g_iMelodyTimeSignature, nCollects, idCollects ); + } + + //ȡƼб + int nRecomNum = 50; + DWORD idRecoms[50]; + + f_CM_GetStyleRecomIDs( g_iMelodyTimeSignature, idRecoms, &nRecomNum ); + + //ȡǰз + int nStyleNum = 0; + TPROSTYLE * aStyleInfos = NULL; + + if( 0==f_CM_GetStyleInfos( e_ST_Origin, g_iMelodyTimeSignature, NULL, &nStyleNum ) + && nStyleNum>0 ){ + aStyleInfos = new TPROSTYLE[nStyleNum]; + for( int i=0; ipOrigin = new TSTYLEORIGIN; + memcpy( pInfo->pOrigin, aStyleInfos[i].pOrigin, sizeof(TSTYLEORIGIN) ); + + g_aOriginStyles.push_back( pInfo ); + + for( int j=0; jidLoc && idCollects[j][1]==pInfo->idStyle ){ + g_aCollectStyles.push_back( pInfo ); + break; + } + } + + for( int j=0; jidStyle ){ + g_aRecomStyles.push_back( pInfo ); + break; + } + } + } + + delete[] aStyleInfos; + + if( 0==f_CM_GetStyleInfos( e_ST_Share, g_iMelodyTimeSignature, NULL, &nStyleNum ) + && nStyleNum>0 ){ + aStyleInfos = new TPROSTYLE[nStyleNum]; + for( int i=0; ipShare = new TSTYLESHARE; + memcpy( pInfo->pShare, aStyleInfos[i].pLocal, sizeof(TSTYLESHARE) ); + + g_aShareStyles.push_back( pInfo ); + + for( int j=0; jidLoc && idCollects[j][1]==pInfo->idStyle ){ + g_aCollectStyles.push_back( pInfo ); + break; + } + } + } + + delete[] aStyleInfos; + } + + if( 0==f_CM_GetStyleInfos( e_ST_Temp, g_iMelodyTimeSignature, NULL, &nStyleNum ) + && nStyleNum>0 ){ + aStyleInfos = new TPROSTYLE[nStyleNum]; + for( int i=0; ipLocal = new TSTYLELOCAL; + memcpy( pInfo->pLocal, aStyleInfos[i].pLocal, sizeof(TSTYLELOCAL) ); + + g_aLocalStyles.push_back( pInfo ); + + for( int j=0; jidLoc && idCollects[j][1]==pInfo->idStyle ){ + g_aCollectStyles.push_back( pInfo ); + break; + } + } + } + + delete[] aStyleInfos; + } + } + else{ + DebugPrint("ȡʧ"); + } + + if( idCollects ) + delete[] idCollects; +} + +void ClearStyleList() +{ + for( int i=0; i=0; i-- ){ + if( g_aTempStyles[i]->idStyle!=0 ){ + f_CM_DeleteTempStyle( g_aTempStyles[i]->idStyle ); + delete g_aTempStyles[i]; + g_aTempStyles.erase( g_aTempStyles.begin() + i ); + } + } +} + +TPROSTYLE* GetStyleInfo( UINT idLoc, UINT idStyle ) +{ + if( idLoc==0 && idStyle==0 ) + return NULL; + + for( int i=u_aCacheStyles.size()-1; i>=0; i-- ){ + if( u_aCacheStyles[i]->idLoc==idLoc && u_aCacheStyles[i]->idStyle==idStyle ){ + return u_aCacheStyles[i]; + } + } + + TPROSTYLE* pStyle = NULL; + if( idLoc==0 ){ + for( int i=0; iidStyle==idStyle ){ + pStyle = g_aOriginStyles[i]; + break; + } + } + } + else if( idLoc==1 ){ + for( int i=0; iidStyle==idStyle ){ + pStyle = g_aShareStyles[i]; + break; + } + } + } + else if( idLoc==(UINT)-1 ){ + for( int i=0; iidStyle==idStyle ){ + pStyle = g_aTempStyles[i]; + break; + } + } + } + else{ + for( int i=0; iidLoc==idLoc + && g_aLocalStyles[i]->idStyle==idStyle ){ + pStyle = g_aLocalStyles[i]; + break; + } + } + } + + if( pStyle ){ + u_aCacheStyles.push_back( pStyle ); + if( u_aCacheStyles.size()>MAX_STYLE_CACHE ){ + u_aCacheStyles.erase( u_aCacheStyles.begin() ); + } + } + + return pStyle; +} + +bool IsCollectedStyle( UINT idLoc, UINT idStyle ) +{ + for( int i=0; iidLoc==idLoc && g_aCollectStyles[i]->idStyle==idStyle ){ + return true; + } + } + + return false; +} + +void DeleteStyleInfo( UINT idLoc, UINT idStyle ) +{ + if( idLoc==0 && idStyle==0 ) + return; + + for( int i=0; iidLoc==idLoc && u_aCacheStyles[i]->idStyle==idStyle ){ + u_aCacheStyles.erase( u_aCacheStyles.begin()+i ); + break; + } + } + + for( int i=0; iidLoc==idLoc && g_aCollectStyles[i]->idStyle==idStyle ){ + g_aCollectStyles.erase( g_aCollectStyles.begin()+i ); + break; + } + } + + if( idLoc==0 ){ + for( int i=0; iidStyle==idStyle ){ + delete g_aOriginStyles[i]; + g_aOriginStyles.erase( g_aOriginStyles.begin()+i ); + break; + } + } + } + else if( idLoc==1 ){ + for( int i=0; iidStyle==idStyle ){ + delete g_aShareStyles[i]; + g_aShareStyles.erase( g_aShareStyles.begin()+i ); + break; + } + } + } + else if( idLoc==(UINT)-1 ){ + for( int i=0; iidStyle==idStyle ){ + delete g_aTempStyles[i]; + g_aTempStyles.erase( g_aTempStyles.begin()+i ); + break; + } + } + } + else{ + for( int i=g_aLocalStyles.size()-1; i>=0; i-- ){ + if( g_aLocalStyles[i]->idLoc==idLoc + && g_aLocalStyles[i]->idStyle==idStyle ){ + delete g_aLocalStyles[i]; + g_aLocalStyles.erase( g_aLocalStyles.begin()+i ); + } + else{ + int ret = DeleteTrkRef( *g_aLocalStyles[i]->pLocal, idLoc, idStyle ); + if( ret==-1 ){ + for( int j=0; jidLoc==g_aLocalStyles[i]->idLoc + && u_aCacheStyles[j]->idStyle==g_aLocalStyles[i]->idStyle ){ + u_aCacheStyles.erase( u_aCacheStyles.begin()+j ); + break; + } + } + + delete g_aLocalStyles[i]; + g_aLocalStyles.erase( g_aLocalStyles.begin()+i ); + } + } + } + } +} + +int DeleteTrkRef( TSTYLELOCAL& origin, UINT idLocDel, UINT idStyleDel ) +{ + int ret = 0; + + bool bChanged = false; + for( int s=0; s<4; s++ ){ + int rep = s<2 ? 1 : 2; + for( int r=0; r>4 )); + + for( int n=iStart; n>4 )); + + int segCount = 0; + for( int n=iStart; n0 ){ + if( s>=2 ) + update.aIEBars[s-2][iStart+segCount] = origin.aIEBars[s-2][n]; + + segCount++; + } + } + + if( segCount>0 ){ + if( r==0 ) + update.nSegNum[s] += segCount; + else + update.nSegNum[s] += (segCount<<4); + + if( ret==-1 ) + ret = 1; + } + } + } + + if( ret==1 ){ + memcpy( &origin.trkRef, &update.trkRef, sizeof(TTRACKREF)*4*8*16 ); + memcpy( &origin.nSegNum, &update.nSegNum, sizeof(char)*4 ); + memcpy( &origin.aIEBars, &update.aIEBars, sizeof(char)*2*8 ); + } + } + + return ret; +} + +void ClearGlobalVars(int iOperation) { +// g_bSongSaved = false; + + if( iOperation & LIST_OPUSSTAGES ){ + g_Midi.ClearMidiTracks(); + + while( g_lstOpusStages.size()>0 ){ + delete g_lstOpusStages.back(); + g_lstOpusStages.pop_back(); + } + + g_Opus.Backup(); + } + + if( iOperation & LIST_OPUSAUDIOS ){ + for( int i=g_aAudioTracks.size()-1; i>0; i-- ){ + f_MM_AudioDeleteTrack( i ); + delete g_aAudioTracks.back(); + g_aAudioTracks.pop_back(); + } + } + + if( iOperation & LIST_RAWAUDIO ){ + f_MM_AudioDeleteTrack( 0 ); + delete g_aAudioTracks[0]; + g_aAudioTracks[0] = new TAudioTrack; + } + + if( iOperation & LIST_THEME ){ + g_Theme.Clear(); + } + + if( iOperation & LIST_UNDO ){ + g_Undo.ClearUndoList(); + } +} + + + +#include +#include +#include +#include + +#define MAX_DEBUG_PRINT 10240 + +string wstr2str(const wstring& _src) { + int nBufSize = WideCharToMultiByte(GetACP(), 0, _src.c_str(), -1, NULL, 0, + 0, FALSE); + + char *szBuf = new char[nBufSize]; + + WideCharToMultiByte(GetACP(), 0, _src.c_str(), -1, szBuf, nBufSize, + 0, FALSE); + + string strRet(szBuf); + + delete[]szBuf; + + return strRet; +} + +wstring str2wstr(const string& _src) { + int nBufSize = MultiByteToWideChar(GetACP(), 0, _src.c_str(), -1, NULL, 0); + + wchar_t *wsBuf = new wchar_t[nBufSize]; + + MultiByteToWideChar(GetACP(), 0, _src.c_str(), -1, wsBuf, nBufSize); + + wstring wstrRet(wsBuf); + + delete[]wsBuf; + + return wstrRet; +} + +string UTF8ToMBCS(const char *pcUtf8) { + + // wchar_t pcUnicode[CHAR_BUFSIZE]; + + int nUnicodeLen = MultiByteToWideChar(CP_UTF8, 0, pcUtf8, -1, NULL, 0); + + wchar_t * pcUnicode = new wchar_t[nUnicodeLen + 1]; + memset(pcUnicode, 0, nUnicodeLen * 2 + 2); + + // utf8 to unicode + + MultiByteToWideChar(CP_UTF8, 0, pcUtf8, -1, pcUnicode, nUnicodeLen); + + // unicode to gb2312 + + int nMBCSLen = WideCharToMultiByte(CP_ACP, 0, pcUnicode, -1, NULL, 0, + NULL, NULL); + + char *pcMBCS = new char[nMBCSLen + 1]; + memset(pcMBCS, 0, nMBCSLen + 1); + + WideCharToMultiByte(CP_ACP, 0, pcUnicode, -1, pcMBCS, nMBCSLen, NULL, NULL); + + string strMBCS = pcMBCS; + delete[]pcMBCS; + delete[]pcUnicode; + + return strMBCS; +} + +string GBToUTF8(const char* str) +{ + string result; + WCHAR *strSrc; + char *szRes; + + //ʱĴС + int i = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0); + strSrc = new WCHAR[i+1]; + MultiByteToWideChar(CP_ACP, 0, str, -1, strSrc, i); + + //ʱĴС + i = WideCharToMultiByte(CP_UTF8, 0, strSrc, -1, NULL, 0, NULL, NULL); + szRes = new char[i+1]; + i = WideCharToMultiByte(CP_UTF8, 0, strSrc,-1, szRes, i, NULL, NULL); + + result = szRes; + delete []strSrc; + delete []szRes; + + return result; +} + +void DebugPrint(const char * fmt, ...) { +#ifdef _DEBUG + char sDebug[MAX_DEBUG_PRINT]; + sDebug[0] = '\0'; + + char tbuffer[9]; + _strtime(tbuffer); + + sprintf(sDebug, "[%s] ", tbuffer); + + va_list vaParams; + va_start(vaParams, fmt); + + vsprintf(sDebug + strlen(sDebug), fmt, vaParams); + OutputDebugStringA(sDebug); +#endif +} + +void SetInitVar(BOOL bClose) { + HKEY hComposerKey; + DWORD dwDisposition; + long lResult; + lResult = RegCreateKeyEx(HKEY_CURRENT_USER, (TCHAR*)REGKEY_SOFTWARE, 0, + NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hComposerKey, + &dwDisposition); + + if (lResult == ERROR_SUCCESS) { + if (bClose) { + DWORD dwValue = TRUE; + lResult = RegSetValueEx(hComposerKey, L"NormalClosed", 0, REG_DWORD, + (LPBYTE) & dwValue, sizeof(DWORD)); + } + if( strlen(g_strSoundFont)>0 ) + lResult = RegSetValueEx(hComposerKey, L"FontName", 0, REG_SZ, + (LPBYTE)g_strSoundFont, strlen(g_strSoundFont)+1 ); + + lResult = RegSetValueEx(hComposerKey, L"TimeSignature", 0, REG_DWORD, + (LPBYTE) &g_iMelodyTimeSignature, sizeof(DWORD)); + lResult = RegSetValueEx(hComposerKey, L"Tempo", 0, REG_DWORD, + (LPBYTE) &g_nMelodyTempo, sizeof(DWORD)); + lResult = RegSetValueEx(hComposerKey, L"PlaybackDevice", 0, REG_DWORD, + (LPBYTE) &g_iPlaybackDevice, sizeof(DWORD)); + lResult = RegSetValueEx(hComposerKey, L"PlaybackOutput", 0, REG_DWORD, + (LPBYTE) &g_iPlaybackOutput, sizeof(DWORD)); + if( strlen(g_strPlaybackDevice)>0 ) + lResult = RegSetValueEx(hComposerKey, L"PlaybackDeviceName", 0, REG_SZ, + (LPBYTE)g_strPlaybackDevice, strlen(g_strPlaybackDevice)+1); + lResult = RegSetValueEx(hComposerKey, L"RecordDevice", 0, REG_DWORD, + (LPBYTE) &g_iRecordDevice, sizeof(DWORD)); + lResult = RegSetValueEx(hComposerKey, L"RecordInput", 0, REG_DWORD, + (LPBYTE) &g_iRecordInput, sizeof(DWORD)); + lResult = RegSetValueEx(hComposerKey, L"RecordDeviceName", 0, REG_SZ, + (LPBYTE)g_strRecordDevice, strlen(g_strRecordDevice)+1); + lResult = RegSetValueEx(hComposerKey, L"RecordAutoAdjust", 0, REG_DWORD, + (LPBYTE) &g_bRecordAutoAdjust, sizeof(DWORD)); + lResult = RegSetValueEx(hComposerKey, L"RecordVolume", 0, REG_BINARY, + (LPBYTE) &g_fRecordVolume, sizeof(float)); + lResult = RegSetValueEx(hComposerKey, L"SpeakerVolume", 0, REG_BINARY, + (LPBYTE) &g_fSpeakerVolume, sizeof(float)); + lResult = RegSetValueEx(hComposerKey, L"LastSaveOption2", 0, REG_DWORD, + (LPBYTE) &g_iLastSaveOption, sizeof(DWORD)); + lResult = RegSetValueEx(hComposerKey, L"WindowState", 0, REG_DWORD, + (LPBYTE) &g_iWindowState, sizeof(DWORD)); + lResult = RegSetValueEx(hComposerKey, L"LastSaveType", 0, REG_DWORD, + (LPBYTE) &g_iLastSaveType, sizeof(DWORD)); + + if( !g_strLastSavePath.empty() ) + lResult = RegSetValueEx(hComposerKey, L"LastSavePath", 0, REG_SZ, + (LPBYTE)g_strLastSavePath.c_str(), g_strLastSavePath.length()*sizeof(WCHAR)+1); + if( !g_strLastImportFile.empty() ) + lResult = RegSetValueEx(hComposerKey, L"LastImportFile", 0, REG_SZ, + (LPBYTE)g_strLastImportFile.c_str(), g_strLastImportFile.length()*sizeof(WCHAR)+1); + if( !g_strSegImportPath.empty() ) + lResult = RegSetValueEx(hComposerKey, L"SegImportPath", 0, REG_SZ, + (LPBYTE)g_strSegImportPath.c_str(), g_strSegImportPath.length()*sizeof(WCHAR)+1); +// if( !g_strVSTPath.empty() ) + lResult = RegSetValueEx(hComposerKey, L"VSTPluginsPath", 0, REG_SZ, + (LPBYTE)g_strVSTPath.c_str(), g_strVSTPath.length()*sizeof(WCHAR)+1); +// if( !g_strVSTPath.empty() ) + lResult = RegSetValueEx(hComposerKey, L"VSTiPluginsPath", 0, REG_SZ, + (LPBYTE)g_strVSTiPath.c_str(), g_strVSTiPath.length()*sizeof(WCHAR)+1); + + DWORD dwRegValue = g_bShowRecordHint ? 1 : 0; + lResult = RegSetValueEx(hComposerKey, L"ShowRecordHint", 0, REG_DWORD, + (LPBYTE) &dwRegValue, sizeof(DWORD)); + dwRegValue = g_bAlphaKey ? 1 : 0; + lResult = RegSetValueEx(hComposerKey, L"ChordDisplayType", 0, REG_DWORD, + (LPBYTE) &dwRegValue, sizeof(DWORD)); + dwRegValue = g_bAutoOpenProject ? 1 : 0; + lResult = RegSetValueEx(hComposerKey, L"AutoOpenProject", 0, REG_DWORD, + (LPBYTE) &dwRegValue, sizeof(DWORD)); + dwRegValue = g_bAutoOpenProjectEnable ? 1 : 0; + lResult = RegSetValueEx(hComposerKey, L"AutoOpenProjectEnable", 0, REG_DWORD, + (LPBYTE) &dwRegValue, sizeof(DWORD)); + dwRegValue = g_bAutoDownloadStyle ? 1 : 0; + lResult = RegSetValueEx(hComposerKey, L"AutoDownloadStyle", 0, REG_DWORD, + (LPBYTE) &dwRegValue, sizeof(DWORD)); + dwRegValue = g_bShowProtectMsg ? 1 : 0; + lResult = RegSetValueEx(hComposerKey, L"ShowProtectMessage", 0, REG_DWORD, + (LPBYTE) &dwRegValue, sizeof(DWORD)); + dwRegValue = g_bShowVSTPath ? 1 : 0; + lResult = RegSetValueEx(hComposerKey, L"ShowVSTPathHint", 0, REG_DWORD, + (LPBYTE) &dwRegValue, sizeof(DWORD)); + dwRegValue = g_bPrebeat ? 1 : 0; + lResult = RegSetValueEx(hComposerKey, L"Prebeat", 0, REG_DWORD, + (LPBYTE) &dwRegValue, sizeof(DWORD)); + dwRegValue = g_bExtFont ? 1 : 0; + lResult = RegSetValueEx(hComposerKey, L"ExtendFont", 0, REG_DWORD, + (LPBYTE) &dwRegValue, sizeof(DWORD)); + dwRegValue = g_iToolPanelShow & 0x1; + lResult = RegSetValueEx(hComposerKey, L"ToolPanelShow", 0, REG_DWORD, + (LPBYTE) &dwRegValue, sizeof(DWORD)); + + lResult = RegSetValueEx(hComposerKey, L"PreStageMode", 0, REG_DWORD, + (LPBYTE) &g_iPreStageDefault, sizeof(DWORD)); + + lResult = RegSetValueEx(hComposerKey, L"SegColorMode", 0, REG_DWORD, + (LPBYTE) &g_iSegColorMode, sizeof(DWORD)); + + int index; + for( index=0; index 1) { + strcpy( g_strSoundFont, szBuffer ); + } + + dwSize = MAX_PATH; + lResult = RegQueryValueEx(hComposerKey, L"LastSavePath", NULL, NULL, + szBuffer, &dwSize); + if (lResult == ERROR_SUCCESS && dwSize > 1) { + g_strLastSavePath = (TCHAR*)szBuffer; + } + + dwSize = MAX_PATH; + lResult = RegQueryValueEx(hComposerKey, L"LastImportFile", NULL, NULL, + szBuffer, &dwSize); + if (lResult == ERROR_SUCCESS && dwSize > 1) { + g_strLastImportFile = (TCHAR*)szBuffer; + } + + dwSize = MAX_PATH; + lResult = RegQueryValueEx(hComposerKey, L"SegImportPath", NULL, NULL, + szBuffer, &dwSize); + if (lResult == ERROR_SUCCESS && dwSize > 1) { + g_strSegImportPath = (TCHAR*)szBuffer; + } + + dwSize = MAX_PATH; + lResult = RegQueryValueEx(hComposerKey, L"VSTPluginsPath", NULL, NULL, + szBuffer, &dwSize); + if (lResult == ERROR_SUCCESS && dwSize > 1) { + g_strVSTPath = (TCHAR*)szBuffer; + } + + dwSize = MAX_PATH; + lResult = RegQueryValueEx(hComposerKey, L"VSTiPluginsPath", NULL, NULL, + szBuffer, &dwSize); + if (lResult == ERROR_SUCCESS && dwSize > 1) { + g_strVSTiPath = (TCHAR*)szBuffer; + } + + dwSize = MAX_PATH; + lResult = RegQueryValueEx(hComposerKey, L"ExtFontsDir", NULL, NULL, + szBuffer, &dwSize); + if (lResult == ERROR_SUCCESS && dwSize > 1) { + g_strExtFontsPath = (TCHAR*)szBuffer; + } + + int nValue; + dwSize = sizeof(int); + lResult = RegQueryValueEx(hComposerKey, L"ToolPanelShow", NULL, + &dwType, (LPBYTE) & nValue, &dwSize); + if (lResult == ERROR_SUCCESS && dwSize > 0) { + if( nValue<0 || nValue>1 ) + nValue = 0; + g_iToolPanelShow = nValue; + } + lResult = RegQueryValueEx(hComposerKey, L"TimeSignature", NULL, + &dwType, (LPBYTE) & nValue, &dwSize); + if (lResult == ERROR_SUCCESS && dwSize > 0) { + if( nValue<0 || nValue>3 ) + nValue = 0; + g_iMelodyTimeSignature = nValue; + } + lResult = RegQueryValueEx(hComposerKey, L"Tempo", NULL, &dwType, + (LPBYTE) & nValue, &dwSize); + if (lResult == ERROR_SUCCESS && dwSize > 0) { + if( nValue<50 || nValue>200 ) + nValue = 75; + g_nMelodyTempo = nValue; + } + lResult = RegQueryValueEx(hComposerKey, L"PlaybackDevice", NULL, &dwType, + (LPBYTE) & nValue, &dwSize); + if (lResult == ERROR_SUCCESS && dwSize > 0) { + g_iPlaybackDevice = nValue; + } + lResult = RegQueryValueEx(hComposerKey, L"PlaybackOutput", NULL, &dwType, + (LPBYTE) & nValue, &dwSize); + if (lResult == ERROR_SUCCESS && dwSize > 0) { + g_iPlaybackOutput = nValue; + } + dwSize = MAX_PATH; + lResult = RegQueryValueEx(hComposerKey, L"PlaybackDeviceName", NULL, NULL, + szBuffer, &dwSize); + if (lResult == ERROR_SUCCESS && dwSize > 1) { + strcpy( g_strPlaybackDevice, szBuffer ); + } + lResult = RegQueryValueEx(hComposerKey, L"RecordDevice", NULL, &dwType, + (LPBYTE) & nValue, &dwSize); + if (lResult == ERROR_SUCCESS && dwSize > 0) { + g_iRecordDevice = nValue; + } + lResult = RegQueryValueEx(hComposerKey, L"RecordInput", NULL, &dwType, + (LPBYTE) & nValue, &dwSize); + if (lResult == ERROR_SUCCESS && dwSize > 0) { + g_iRecordInput = nValue; + } + dwSize = MAX_PATH; + lResult = RegQueryValueEx(hComposerKey, L"RecordDeviceName", NULL, NULL, + szBuffer, &dwSize); + if (lResult == ERROR_SUCCESS && dwSize > 1) { + strcpy( g_strRecordDevice, szBuffer ); + } + lResult = RegQueryValueEx(hComposerKey, L"RecordAutoAdjust", NULL, &dwType, + (LPBYTE) &nValue, &dwSize); + if (lResult == ERROR_SUCCESS && dwSize > 0) { + g_bRecordAutoAdjust = nValue; + } + lResult = RegQueryValueEx(hComposerKey, L"LastSaveOption2", NULL, + &dwType, (LPBYTE) &nValue, &dwSize); + if (lResult == ERROR_SUCCESS && dwSize > 0) { + g_iLastSaveOption = nValue; + } + + lResult = RegQueryValueEx(hComposerKey, L"WindowState", NULL, + &dwType, (LPBYTE) &nValue, &dwSize); + if (lResult == ERROR_SUCCESS && dwSize > 0) { + g_iWindowState = nValue; + } + + lResult = RegQueryValueEx(hComposerKey, L"LastSaveType", NULL, + &dwType, (LPBYTE) &nValue, &dwSize); + if (lResult == ERROR_SUCCESS && dwSize > 0) { + g_iLastSaveType = nValue; + } + + lResult = RegQueryValueEx(hComposerKey, L"ShowRecordHint", NULL, + &dwType, (LPBYTE) &nValue, &dwSize); + if (lResult == ERROR_SUCCESS && dwSize > 0) { + g_bShowRecordHint = nValue ? true : false; + } + + dwSize = sizeof(int); + lResult = RegQueryValueEx(hComposerKey, L"AutoSave", NULL, + &dwType, (LPBYTE) & nValue, &dwSize); + if (lResult == ERROR_SUCCESS && dwSize > 0) { + g_bAutoSave = nValue; + } + + lResult = RegQueryValueEx(hComposerKey, L"AutoOpenProject", NULL, + &dwType, (LPBYTE) & nValue, &dwSize); + if (lResult == ERROR_SUCCESS && dwSize > 0) { + g_bAutoOpenProject = nValue; + } + + lResult = RegQueryValueEx(hComposerKey, L"AutoOpenProjectEnable", NULL, + &dwType, (LPBYTE) & nValue, &dwSize); + if (lResult == ERROR_SUCCESS && dwSize > 0) { + g_bAutoOpenProjectEnable = nValue; + } + + lResult = RegQueryValueEx(hComposerKey, L"AutoDownloadStyle", NULL, + &dwType, (LPBYTE) & nValue, &dwSize); + if (lResult == ERROR_SUCCESS && dwSize > 0) { + g_bAutoDownloadStyle = nValue; + } + + lResult = RegQueryValueEx(hComposerKey, L"ShowProtectMessage", NULL, + &dwType, (LPBYTE) & nValue, &dwSize); + if (lResult == ERROR_SUCCESS && dwSize > 0) { + g_bShowProtectMsg = nValue; + } + + lResult = RegQueryValueEx(hComposerKey, L"ShowVSTPathHint", NULL, + &dwType, (LPBYTE) & nValue, &dwSize); + if (lResult == ERROR_SUCCESS && dwSize > 0) { + g_bShowVSTPath = nValue; + } + + lResult = RegQueryValueEx(hComposerKey, L"Prebeat", NULL, + &dwType, (LPBYTE) & nValue, &dwSize); + if (lResult == ERROR_SUCCESS && dwSize > 0) { + g_bPrebeat = nValue; + } + + lResult = RegQueryValueEx(hComposerKey, L"ExtendFont", NULL, + &dwType, (LPBYTE) & nValue, &dwSize); + if (lResult == ERROR_SUCCESS && dwSize > 0) { + g_bExtFont = nValue; + } + + lResult = RegQueryValueEx(hComposerKey, L"ChordDisplayType", NULL, + &dwType, (LPBYTE) &nValue, &dwSize); + if (lResult == ERROR_SUCCESS && dwSize > 0) { + g_bAlphaKey = nValue ? true : false; + } + + lResult = RegQueryValueEx(hComposerKey, L"PreStageMode", NULL, + &dwType, (LPBYTE) &nValue, &dwSize); + if (lResult == ERROR_SUCCESS && dwSize > 0) { + g_iPreStageDefault = nValue; + if( g_iPreStageDefault>2 ) + g_iPreStageDefault = 2; + g_iPreStage = g_iPreStageDefault; + } + + lResult = RegQueryValueEx(hComposerKey, L"SegColorMode", NULL, + &dwType, (LPBYTE) &nValue, &dwSize); + if (lResult == ERROR_SUCCESS && dwSize > 0) { + if( nValue>1 || nValue<0 ) + nValue = 1; + + g_iSegColorMode = nValue; + } + + float fValue; + dwSize = sizeof(float); + lResult = RegQueryValueEx(hComposerKey, L"RecordVolume", NULL, + &dwType, (LPBYTE) & fValue, &dwSize); + if (lResult == ERROR_SUCCESS && dwSize > 0) { + if( fValue<0 || fValue>1 ) + fValue = 1; + + g_fRecordVolume = fValue; + } + lResult = RegQueryValueEx(hComposerKey, L"SpeakerVolume", NULL, + &dwType, (LPBYTE) & fValue, &dwSize); + if (lResult == ERROR_SUCCESS && dwSize > 0) { + if( fValue<0 || fValue>1 ) + fValue = 1; + + g_fSpeakerVolume = fValue; + } + + for (int i = 0; i < MAX_RECENT_PROJECT; i++) { + wstring strValueName = L"RecentProject"; + strValueName += IntToStr(i + 1).c_str(); + + dwSize = MAX_PATH; + lResult = RegQueryValueEx(hComposerKey, strValueName.c_str(), + NULL, NULL, szBuffer, &dwSize); + if (lResult == ERROR_SUCCESS && dwSize > 0) { + g_lstRecentProject.push_back((LPCTSTR)szBuffer); + } + } + + if( !g_lstRecentProject.empty() ){ + g_strLastProjSavePath = ExtractFilePath( g_lstRecentProject[0].c_str() ).c_str(); + } + + //mac address + lResult = RegQueryValueEx(hComposerKey, L"deviceNum", NULL, + &dwType, (LPBYTE) & nValue, &dwSize); + if (lResult == ERROR_SUCCESS && dwSize>0 && nValue>0 ) { + for(int index=0; index 0 && szBuffer[0]!=0) { + g_lstMacAddress.push_back(szBuffer); + }else{ + SAFE_DELETE(szBuffer) + } + } + } + } + RegCloseKey(hComposerKey); + } +} + +void SetAutoLogin(bool bAuto, LPCSTR strName, LPCSTR strPwd) { + HKEY hComposerKey; + DWORD dwDisposition; + long lResult; + lResult = RegCreateKeyEx(HKEY_CURRENT_USER, REGKEY_SOFTWARE, 0, NULL, + REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hComposerKey, + &dwDisposition); + if (lResult == ERROR_SUCCESS) { + BYTE strText[100]; + int nNameLen = strlen(strName), nRegLen = nNameLen + 1; + strText[0] = nNameLen; + for (int i = 0; i < nNameLen; i++) { + strText[i + 1] = strName[i] - 0x63; + } + strText[nNameLen + 1] = '\0'; + + if (bAuto) { + int nMaxPwdLen = 16, nPwdLen = strlen(strPwd); + strText[nNameLen + 1] = nPwdLen; + + for (int i = 0; i < nMaxPwdLen; i++) { + if (i < nPwdLen) + strText[i + nNameLen + 2] = strPwd[i] - 0x4B; + else + strText[i + nNameLen + 2] = Random(256); + } + strText[nNameLen + nMaxPwdLen + 2] = '\0'; + + nRegLen += 17; + } + + lResult = RegSetValueEx(hComposerKey, REGKEY_AUTOLOG, 0, REG_BINARY, + strText, nRegLen); + + RegCloseKey(hComposerKey); + } +} + +bool GetAutoLogin(char* strName, char* strPwd) { + HKEY hComposerKey; + DWORD dwDisposition; + bool bAuto = false; + strName[0] = strPwd[0] = 0; + + long lResult = RegCreateKeyEx(HKEY_CURRENT_USER, REGKEY_SOFTWARE, 0, NULL, + REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hComposerKey, + &dwDisposition); + if (lResult == ERROR_SUCCESS) { + DWORD dwSize; + BYTE szBuffer[MAX_PATH]; + if (dwDisposition == REG_OPENED_EXISTING_KEY) { + dwSize = MAX_PATH; + lResult = RegQueryValueEx(hComposerKey, REGKEY_AUTOLOG, NULL, NULL, + szBuffer, &dwSize); + if (lResult == ERROR_SUCCESS && dwSize > 0) { + int nTextLen = dwSize; + int nNameLen = szBuffer[0]; + for (int i = 0; i < nNameLen; i++) { + strName[i] = szBuffer[i + 1] + 0x63; + } + strName[nNameLen] = '\0'; + + if (nNameLen == nTextLen - 18) { + bAuto = true; + int nPwdLen = szBuffer[nNameLen + 1]; + for (int i = 0; i < nPwdLen; i++) { + strPwd[i] = szBuffer[i + nNameLen + 2] + 0x4B; + } + strPwd[nPwdLen] = '\0'; + } + } + } + + RegCloseKey(hComposerKey); + } + + return bAuto; +} + +void GetAutoSaveReg() +{ + HKEY hComposerKey; + DWORD dwDisposition; + long lResult; + + lResult = RegCreateKeyEx(HKEY_CURRENT_USER, REGKEY_SOFTWARE, 0, NULL, + REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hComposerKey, + &dwDisposition); + + if (lResult == ERROR_SUCCESS) { + if (dwDisposition == REG_OPENED_EXISTING_KEY) { + DWORD dwSize = MAX_PATH; + BYTE szBuffer[MAX_PATH]; + + lResult = RegQueryValueEx(hComposerKey, L"AutoSaveProj", NULL, NULL, szBuffer, &dwSize); + if (lResult == ERROR_SUCCESS && dwSize > 1) { + g_strProjectName = (TCHAR*)szBuffer; + } + } + + RegCloseKey(hComposerKey); + } +} + +void SetAutoSaveReg( bool bAuto ) +{ + HKEY hComposerKey; + DWORD dwDisposition; + long lResult; + lResult = RegCreateKeyEx(HKEY_CURRENT_USER, (TCHAR*)REGKEY_SOFTWARE, 0, + NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hComposerKey, + &dwDisposition); + + if (lResult == ERROR_SUCCESS) { + DWORD dwValue = bAuto; + lResult = RegSetValueEx(hComposerKey, L"AutoSave", 0, REG_DWORD, + (LPBYTE) & dwValue, sizeof(DWORD)); + + if( bAuto ) + lResult = RegSetValueEx(hComposerKey, L"AutoSaveProj", 0, REG_SZ, + (LPBYTE)g_strProjectName.c_str(), + g_strProjectName.length()*sizeof(WCHAR) + 1); + else + lResult = RegSetValueEx(hComposerKey, L"AutoSaveProj", 0, REG_SZ, + NULL, 0 ); + + RegCloseKey(hComposerKey); + } + + g_bAutoSave = bAuto; +} + +void DisableAutoOpen() +{ + HKEY hComposerKey; + DWORD dwDisposition; + long lResult; + lResult = RegCreateKeyEx(HKEY_CURRENT_USER, (TCHAR*)REGKEY_SOFTWARE, 0, + NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hComposerKey, + &dwDisposition); + + if (lResult == ERROR_SUCCESS) { + DWORD dwValue = 0; + lResult = RegSetValueEx(hComposerKey, L"AutoOpenProjectEnable", 0, REG_DWORD, + (LPBYTE) & dwValue, sizeof(DWORD)); + + RegCloseKey(hComposerKey); + } + + g_bAutoOpenProjectEnable = false; +} + +void CheckVSTScanReg() +{ + HKEY hComposerKey; + DWORD dwDisposition; + long lResult; + + lResult = RegCreateKeyEx(HKEY_CURRENT_USER, REGKEY_SOFTWARE, 0, NULL, + REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hComposerKey, + &dwDisposition); + + if (lResult == ERROR_SUCCESS) { + if (dwDisposition == REG_OPENED_EXISTING_KEY) { + DWORD iScanning = 0, dwType, dwSize = sizeof(int); + lResult = RegQueryValueEx(hComposerKey, L"VSTScanning", 0, &dwType, (LPBYTE)&iScanning, &dwSize); + if (lResult == ERROR_SUCCESS && dwSize > 0) { + if( iScanning==1 && !g_strVSTPath.empty() ){ + g_strVSTPath.clear(); + lResult = RegSetValueEx(hComposerKey, L"VSTPluginsPath", 0, REG_SZ, + (LPBYTE)g_strVSTPath.c_str(), g_strVSTPath.length()*sizeof(WCHAR)+1); + } + else if( iScanning==2 && !g_strVSTiPath.empty() ){ + g_strVSTiPath.clear(); + lResult = RegSetValueEx(hComposerKey, L"VSTiPluginsPath", 0, REG_SZ, + (LPBYTE)g_strVSTiPath.c_str(), g_strVSTiPath.length()*sizeof(WCHAR)+1); + } + + if( iScanning!=0 ){ + iScanning = 0; + lResult = RegSetValueEx(hComposerKey, L"VSTScanning", 0, REG_DWORD, + (LPBYTE)&iScanning, sizeof(DWORD)); + } + } + } + + RegCloseKey(hComposerKey); + } +} + +void SetVSTScanReg( int iScanning ) +{ + HKEY hComposerKey; + DWORD dwDisposition; + long lResult; + lResult = RegCreateKeyEx(HKEY_CURRENT_USER, (TCHAR*)REGKEY_SOFTWARE, 0, + NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hComposerKey, + &dwDisposition); + + if (lResult == ERROR_SUCCESS) { + lResult = RegSetValueEx(hComposerKey, L"VSTScanning", 0, REG_DWORD, + (LPBYTE)&iScanning, sizeof(DWORD)); + + RegCloseKey(hComposerKey); + } +} + +int GetMidiTrackData( int &nLen, BYTE* pData, int iMT, int iSBar, int iEBar, int* piPlayBar, int* piLenBar ) +{ + int ret = 0; + + TMidiTrack* pMT = g_aMidiTracks[iMT]; + TStage* aStages = new TStage[g_Opus.StageCount()]; + int nStageNum = 0; + + int iEndBar = iEBar<0 ? g_Opus.BarCount()-1 : iEBar; + int iStartBar = iSBar<0 ? 0 : iSBar; + if( piLenBar ) + *piLenBar = iEndBar - iStartBar + 1; + + int iFBar, iStage = FindStage( iStartBar, &iFBar ), + iLBar = iFBar; + + int iPlayBar = -1; + while( iStageiSegType; + aStages[nStageNum].iSegKey = pStage->iSegKey; + aStages[nStageNum].nBarNum = pStage->aBars.size(); + + for( int i=0; iaTracks.size(); i++ ){ + TTrack* pTrack = pStage->aTracks[i]; + + if( pTrack->iFile==pMT->file && pTrack->iChanSpec==pMT->chno ){ + aStages[nStageNum].nTrkNum = 1; + aStages[nStageNum].aTracks = new TComposeTrack[1]; + + TComposeTrack& track = aStages[nStageNum].aTracks[0]; + track.iStyleLoc = pTrack->iStyleLoc; + track.iStyleId = pTrack->iStyleId; + track.iChanNo = pTrack->iChanNo; + track.iChanSpec = pTrack->iChanSpec; + track.iProg = pTrack->iProg; + track.nVol = pTrack->nVol < 0 ? 0 + : pTrack->nVol * ( pStage->nVol / 100.0 ) * ( pMT->volume / 100.0 ); + + if( pStage->iSegType<=SEGTYPE_FILL ){ + track.iSegNo = pTrack->iSegNo; + + aStages[nStageNum].aChords = new TBarChords[aStages[nStageNum].nBarNum]; + for( int j=0; jaBars[j]->aChords, + sizeof(TBarChords) ); + } + } + else{ + int cType = (pTrack->iSegNo / 4 + 1) << 4; + int sno = pTrack->iSegNo % 4; + track.iSegNo = sno + cType; + } + + if( iPlayBar<0 ){ + iPlayBar = iLBar; + } + + break; + } + } + + bool bMerge = false; + if( bMerge ){ + int barBefore = aStages[nStageNum-1].nBarNum, + barAfter = barBefore + aStages[nStageNum].nBarNum; + aStages[nStageNum-1].nBarNum = barAfter; + + if( aStages[nStageNum-1].aChords && aStages[nStageNum].aChords ){ + aStages[nStageNum-1].aChords = (TBarChords*)realloc( aStages[nStageNum-1].aChords, + sizeof(TBarChords) * barAfter ); + memcpy( &aStages[nStageNum-1].aChords[barBefore], aStages[nStageNum].aChords, + sizeof(TBarChords) * ( barAfter - barBefore )); + + delete[] aStages[nStageNum].aChords; + aStages[nStageNum].aChords = NULL; + } + + if( aStages[nStageNum].aTracks ){ + delete[] aStages[nStageNum].aTracks; + aStages[nStageNum].aTracks = NULL; + } + } + else + nStageNum++; + + iLBar += pStage->aBars.size(); + if( iLBar>iEndBar ){ + aStages[nStageNum-1].nBarNum -= iLBar - iEndBar - 1; + break; + } + else{ + iStage++; + } + } + + if( piPlayBar ){ + if( iPlayBar>iStartBar ) + iStartBar = iPlayBar; + + iStartBar -= iFBar; + *piPlayBar = iStartBar; + } + + ret = f_CM_Compose( &nLen, pData, g_iMelodyTimeSignature, g_nMelodyTempo, + nStageNum, aStages, false, NULL, NULL ); + + SAFE_DELETE_ARRAY(aStages); + + return ret; +} + +int GetComposeData( TOpusStageList lstOpusStages, int iKey, int& nDataSize, + LPBYTE lpData, bool bSave ) +{ + DebugPrint("//////////////////ʽֶ/////////////////////"); + + int nStageNum = lstOpusStages.size(), + count = 0; + TStage* aStages = NULL; + if (nStageNum > 0) { + aStages = new TStage[nStageNum]; + + for( int i = 0; i0 && lstOpusStages[i]->iSegType<=SEGTYPE_FILL + && lstOpusStages[i-1]->iSegType==lstOpusStages[i]->iSegType + && !DiffStages( lstOpusStages[i-1], lstOpusStages[i], true ) ){ + int last = count - 1, + nBefore = aStages[last].nBarNum, + nAfter = nBefore + lstOpusStages[i]->aBars.size(); + aStages[last].nBarNum = nAfter; + aStages[last].aChords = (TBarChords*)realloc( aStages[last].aChords, + sizeof(TBarChords) * nAfter ); + for( int j=0; jaBars.size(); j++ ){ + memcpy( &aStages[last].aChords[nBefore+j], + &lstOpusStages[i]->aBars[j]->aChords, + sizeof(TBarChords) ); + } + } + else{ + aStages[count].iSegType = lstOpusStages[i]->iSegType; + aStages[count].iSegKey = lstOpusStages[i]->iSegKey; + + aStages[count].nTrkNum = lstOpusStages[i]->aTracks.size(); + if( aStages[count].nTrkNum>0 ){ + aStages[count].aTracks = new TComposeTrack[aStages[count].nTrkNum]; + for( int j=0; jaTracks[j]; + TComposeTrack& pCompTrack = aStages[count].aTracks[j]; + + pCompTrack.iStyleLoc = pTrack->iStyleLoc; + pCompTrack.iStyleId = pTrack->iStyleId; + pCompTrack.iSegNo = pTrack->iSegNo; + pCompTrack.iChanNo = pTrack->iChanNo; + pCompTrack.iChanSpec = pTrack->iChanSpec; + pCompTrack.iProg = pTrack->iProg; + pCompTrack.iFile = pTrack->iFile; + pCompTrack.nVol = pTrack->nVol<0 ? 0 : pTrack->nVol * lstOpusStages[i]->nVol / 100.0; + + if( pCompTrack.nVol>0 && bSave ){ + TMidiTrack* pMT = g_Midi.FindMidiTrack( pTrack->iFile, pTrack->iChanSpec ); + pCompTrack.nVol *= pMT->volume / 100.0; + } + + if( aStages[count].iSegType>=SEGTYPE_INTRO ){ + char cType = (pTrack->iSegNo / 4 + 1) << 4; + char sno = pTrack->iSegNo % 4; + pCompTrack.iSegNo = sno + cType; + } + } + } + + aStages[count].nBarNum = lstOpusStages[i]->aBars.size(); + if( aStages[count].iSegType<=SEGTYPE_FILL ){ + aStages[count].aChords = new TBarChords[aStages[count].nBarNum]; + for( int j=0; jaBars[j]->aChords, + sizeof(TBarChords) ); + } + } + + count++; + } + } + } + + HRESULT ret = f_CM_Compose( &nDataSize, lpData, g_iMelodyTimeSignature, g_nMelodyTempo, + count, aStages, bSave, NULL, NULL ); + + DebugPrint("Compose return buffer size = %d.\n", nDataSize); + + SAFE_DELETE_ARRAY(aStages); + + return ret; +} + +bool GenerateCompose() +{ + HRESULT hr = S_OK; + + SaveAutoProj(); + + if( !g_Opus.CheckModified(CHECK_STAGEALL) ){ + return true; + } + + f_MM_Stop(); + f_MM_FreeComposes(); + g_Midi.ClearMidiTrackNotes(); + g_Opus.Backup(); +// g_bSongSaved = false; + + if( g_Opus.StageCount()==0 ) + return true; + + int nStageNum = g_Opus.StageCount(); + BYTE *pData = new BYTE[2000000], + *notesBuff = new BYTE[1000000]; + + vector arrFiles; + arrFiles.push_back( 0 ); + + for( int b=0; b0 && g_lstOpusStages[i]->iSegType<=SEGTYPE_FILL + && g_lstOpusStages[i-1]->iSegType==g_lstOpusStages[i]->iSegType + && !DiffStages( g_lstOpusStages[i-1], g_lstOpusStages[i], true, false ) ){ + int last = count - 1, + nBefore = aStages[last].nBarNum, + nAfter = nBefore + g_lstOpusStages[i]->aBars.size(); + aStages[last].nBarNum = nAfter; + aStages[last].aChords = (TBarChords*)realloc( aStages[last].aChords, + sizeof(TBarChords) * nAfter ); + for( int j=0; jaBars.size(); j++ ){ + memcpy( &aStages[last].aChords[nBefore+j], + &g_lstOpusStages[i]->aBars[j]->aChords, + sizeof(TBarChords) ); + } + } + else{ + TOpusStage* pOpusStage = g_lstOpusStages[i]; + + aStages[count].iSegType = pOpusStage->iSegType; + aStages[count].iSegKey = pOpusStage->iSegKey; + + vector arrTracks; + for( int j=0; jaTracks.size(); j++ ){ + TTrack* pTrack = pOpusStage->aTracks[j]; + + if( pTrack->iFile==iFile ){ + arrTracks.push_back( pTrack ); + if( iBank!=pTrack->iBank ) + iBank = pTrack->iBank; + } + else if( iFile==0 ){ + bool bNewFile = true; + for( int k=1; kiFile ){ + bNewFile = false; + break; + } + } + + if( bNewFile ) + arrFiles.push_back( pTrack->iFile ); + } + } + + if( !arrTracks.empty() ){ + bCompose = true; + int nTrackNum = arrTracks.size(); + aStages[count].nTrkNum = nTrackNum; + aStages[count].aTracks = new TComposeTrack[ nTrackNum ]; + + for( int j=0; jiStyleLoc; + pCompTrack.iStyleId = pTrack->iStyleId; + pCompTrack.iSegNo = pTrack->iSegNo; + pCompTrack.iChanNo = pTrack->iChanNo; + pCompTrack.iChanSpec = pTrack->iChanSpec; + pCompTrack.iProg = pTrack->iProg; + pCompTrack.iFile = pTrack->iFile; + pCompTrack.nVol = pTrack->nVol<0 ? 0 : pTrack->nVol * pOpusStage->nVol / 100.0; + + if( aStages[count].iSegType>=SEGTYPE_INTRO ){ + char cType = (pTrack->iSegNo / 4 + 1) << 4; + char sno = pTrack->iSegNo % 4; + pCompTrack.iSegNo = sno + cType; + } + } + } + + aStages[count].nBarNum = pOpusStage->aBars.size(); + if( aStages[count].iSegType<=SEGTYPE_FILL ){ + aStages[count].aChords = new TBarChords[aStages[count].nBarNum]; + for( int j=0; jaBars[j]->aChords, + sizeof(TBarChords) ); + } + } + + count++; + } + } + + if( bCompose || iFile==0 ){ + int lenNotes = 1000000; + + HRESULT ret = f_CM_Compose( &nDataSize, pData, g_iMelodyTimeSignature, g_nMelodyTempo, + count, aStages, false, &lenNotes, notesBuff ); + + if( ret==0 ){ + DebugPrint("File %d(Bank %d) compose return buffer size = %d.\n", iFile, iBank, nDataSize); + + char* strFile = NULL; + if( iBank==0xFF || iBank<0x80 ){ + strFile = iBank==0xFF ? NULL : g_lstFonts[iBank]->strFileName; + } + else{ + strFile = g_lstVSTi[iBank-0x80]->strFileName; + } + + if( S_OK==f_MM_LoadCompose( iFile, pData, nDataSize, iBank, strFile ) ){ + DebugPrint("Load File %d(bank %d) compose ok.\n", iFile, iBank); + + if( lenNotes>0 ){ + int iPos = 0, + nTrackSize = notesBuff[iPos++]; + double dblTPM = 192.0 * g_nBPM; + for( int t=0; t=0 ){ + TOpusStage* pStage = g_lstOpusStages[iStage]; + for( int trk=0; trkaTracks.size(); trk++ ){ + TTrack* pTrack = pStage->aTracks[trk]; + if( pTrack->iFile==iFile && pTrack->iChanSpec==chNo ){ + vol = pTrack->nVol<0 ? 0 : pTrack->nVol * pStage->nVol / 100.0; + break; + } + } + } + } + + WORD noteSize = *(WORD*)(notesBuff + iPos); + iPos += 2; + + for( WORD n=0; n0 ){ + pMT->aNotes.push_back( new TMidiNote( pt, vel, vol, tkShow )); + if( pMT->ptMin>pt ) + pMT->ptMin = pt; + if( pMT->ptMaxptMax = pt; + } + else{ + for( int r=pMT->aNotes.size()-1; r>=0; r-- ){ + TMidiNote* pNote = pMT->aNotes[r]; + if( pNote->pitch==pt && pNote->tkOff<0 ){ + pNote->tkOff = tkShow; + + if( pNote->tkOff==pNote->tkOn ) + pNote->tkOff++; + + break; + } + } + } + } + } + } + + for( int n=pMT->aNotes.size()-1; n>=0; n-- ){ + TMidiNote* pNote = pMT->aNotes[n]; + if( pNote->tkOff<0 ){ + delete pNote; + pMT->aNotes.erase( pMT->aNotes.begin()+n ); + } + } + } + } + } + else{ + hr = S_FALSE; + + DebugPrint("Load bank %d compose error.\n", iBank); + } + } + else{ + hr = S_FALSE; + + DebugPrint("Bank %d compose error.\n", iBank ); + } + } + + SAFE_DELETE_ARRAY(aStages); + } + + delete[] pData; + delete[] notesBuff; + +// g_Opus.Backup(); +// g_bSongSaved = false; + + if( hr==S_OK ){ + SetTrackParams(); + g_bRecProtect = IsProtected(); + f_MM_SetRecordProtect( g_bRecProtect ); + } + + return hr == S_OK; +} + +bool IsProtected() +{ + if( g_iPreStage==0 || SOFTWARE_ID==e_Pro_Lite + || g_bLogon && g_infoUser.accountInfo.vipPeriod!=0 ) + return false; + + //δѷ + vector aStyleID; + + for( int i=0; iaTracks.size(); j++ ){ + TTrack* pTrack = pStage->aTracks[j]; + + if( pTrack->iStyleLoc==0 ){ + bool bChecked = false; + for( int k=0; kiStyleId ){ + bChecked = true; + break; + } + } + + if( !bChecked ){ + bool bPaied = false; + if( g_bLogon ){ + for( int c=0; ciStyleId ){ + bPaied = true; + break; + } + } + } + + if( !bPaied ){ + TPROSTYLE infoStyle; + infoStyle.pOrigin = new TSTYLEORIGIN; + f_CM_GetStyleInfo( pTrack->iStyleLoc, pTrack->iStyleId, &infoStyle); + if( infoStyle.pOrigin->cost > 0 ){ + return true; + } + } + + aStyleID.push_back( pTrack->iStyleId ); + } + } + } + } + + return false; +} +/* +int CanSaveProj() +{ +// int ret = E_PROJ_NOERROR; + + bool bHasUnlocalStyle = false; + for( int i=0; !bHasUnlocalStyle && iaTracks.size(); j++ ){ + if( pStage->aTracks[j]->iStyleLoc==(UINT)-1 + && pStage->aTracks[j]->iStyleId!=0 ){ + bHasUnlocalStyle = true; + break; + } + } + } + + if( bHasUnlocalStyle ) + return E_PROJ_NOLOCALTEMPSTYLE; + + if( !g_pUseStyle->pStyle || GetStyleInfo( -1, 0 ) ) + return E_PROJ_UNSAVEDTEMPSTYLE; + + + return E_PROJ_NOERROR; +} +*/ +void SetTransparent( TComponent* pCtrl ) +{ + if( pCtrl->ClassNameIs( TLabel::ClassName() ) ){ + ((TLabel*)pCtrl)->ControlStyle>>csOpaque; + } +/* else if( pCtrl->ClassNameIs( TCheckBox::ClassName() ) ){ + ((TCheckBox*)pCtrl)->Color = RGB(230, 204, 179); + } + else if( pCtrl->ClassNameIs( TRadioButton::ClassName() ) ){ + ((TRadioButton*)pCtrl)->Color = RGB(230, 204, 179); + } +*/ else{ + for( int i=0; iComponentCount; i++ ){ + SetTransparent( pCtrl->Components[i] ); + } + } +} + +char* GetMacAdress() +{ + //ѡԭid + if(!g_lstMacAddress.empty()) + return g_lstMacAddress[0]; + + char *idDevice = new char[6]; + *(UINT*)idDevice = time(NULL); + *(USHORT*)(idDevice+4) = Random(65536); + g_lstMacAddress.push_back(idDevice); + + return g_lstMacAddress[0]; +// PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO(); +// unsigned long stSize = sizeof(IP_ADAPTER_INFO); +// int nRes = GetAdaptersInfo(pIpAdapterInfo, &stSize); +// +// if( ERROR_BUFFER_OVERFLOW==nRes ){ +// +// SAFE_DELETE(pIpAdapterInfo) +// pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize]; +// nRes=GetAdaptersInfo(pIpAdapterInfo, &stSize); +// } +// +// if( ERROR_SUCCESS==nRes ){ +// +// while( pIpAdapterInfo ) +// { +// char *idDevice = new char[6]; +// for(int index=0; indexAddressLength; index++) { +// +// idDevice[index] = pIpAdapterInfo->Address[index]; +// } +// +// g_lstMacAddressNew.push_back(idDevice); +// +// pIpAdapterInfo = pIpAdapterInfo->Next; +// } +// } +// SAFE_DELETE(pIpAdapterInfo) +// +// int nEqualIndex = -1; +// for(int indexNew=0; indexNew=0 ) { +// +// for(int i=0; i11 ) + iNo = 11; + + return u_clrSegment[iSegType][iNo]; +} + diff --git a/GlobalUnit.h b/GlobalUnit.h new file mode 100644 index 0000000..9886a9a --- /dev/null +++ b/GlobalUnit.h @@ -0,0 +1,1630 @@ +//--------------------------------------------------------------------------- +#ifndef GlobalUnitH +#define GlobalUnitH + +//--------------------------------------------------------------------------- +#include "ProCommon.h" +#include "Instruments.h" +#include "MessageDef.h" +#include "Compose.h" +#include "AudioTrack.h" + +/***************************************************************************************/ +// ȫֶ +/***************************************************************************************/ +#ifdef _LITE_ +#define SOFTWARE_ID e_Pro_Lite +#else +#define SOFTWARE_ID e_Pro_Windows +#endif +#define APPNAME "ħרҵ\0" +#define MAX_PATH 260 + +#define DLLAPI __stdcall + +#define CS_VERSION MAKELONG( 3, 4 ) +#define MM_VERSION MAKELONG( 2, 2 ) +#define CM_VERSION MAKELONG( 3, 1 ) + +#define STATE_HEIGHT 40 //Mainڵײ߶ +#define PANEL_TOP 74 //Mainڶ߶ + +#define URL_HOMEPAGE 0 //վҳ +#define URL_USERCENTER 1 //ûҳ +#define URL_SONGMANAGE 2 //ҳ +#define URL_SOFTWARE 3 //ҳ +#define URL_USERNOTICE 4 //ûϢҳ +#define URL_TECHFORUM 5 //̳ +#define URL_SHAREPLAY 6 //ҳ +#define URL_JASONQUERY 7 //JASON +#define URL_RECHARGE 8 //ֵҳ +#define URL_VIPMEMBER 9 //VIPԱҳ +#define URL_SONGPLAY 10 //ҳ +#define URL_COINSPEC 11 //˵ҳ +#define URL_EXTFONT 12 //չɫҳ +#define URL_USERAGREEMENT 13 //ûЭҳ +#define URL_REGCODE 14 //ע֤ӿ +#define URL_RESETPASS 15 //ҳ + +#define CELL_ABSORB_WIDTH 5 +#define CHORD_WHOLE_BAR 1 +#define CHORD_HALF_BAR 0 +#define ID_INITIAL_BAR 1 +//#define CHORD_TYPE_NUM 4 +#define KEY_NUM 12 + +#define COMPOSE_INTRO_1 0x100 //ǰ1 +#define COMPOSE_ENDING_1 0x110 //β1 + +#define MAX_INTRO_NUM 4 +#define MAX_ENDING_NUM 4 +#define STAGE_FILL_NUM 4 +#define STAGE_VAR_NUM 4 + +#define PAGE_RECORDONLY 0x2 +#define PAGE_SETUPRECORD 0x3 +#define PAGE_COMPLETEONLY 0x10 +#define PAGE_ALL 0x1F + +#define LIST_RAWAUDIO 0x01 +#define LIST_OPUSAUDIOS 0x02 +#define LIST_THEME 0x10 +#define LIST_OPUSSTAGES 0x20 +#define LIST_UNDO 0x40 +#define LIST_ALL 0xFF + +#define TIMER_ACCURACY 1 +#define TIMER_PLAY_INTERVAL 25 //ýʱ +#define POINT_RECORD_BLANK 2 //¼ӳ2(50ms) +#define TIME_HINT 500 +#define CHANNEL_MELODY 0 +#define MELODY_DEF_VOLUMN 90 +#define MIDI_EVENT_INSTRUMENT 2 +#define MIDI_EVENT_VOLUME 12 + +#define INPUT_TYPE_UNDEF 0x00 +#define INPUT_TYPE_DIGITAL 0x01 +#define INPUT_TYPE_LINE 0x02 +#define INPUT_TYPE_MIC 0x03 +#define INPUT_TYPE_SYNTH 0x04 +#define INPUT_TYPE_CD 0x05 +#define INPUT_TYPE_PHONE 0x06 +#define INPUT_TYPE_SPEAKER 0x07 +#define INPUT_TYPE_WAVE 0x08 +#define INPUT_TYPE_AUX 0x09 +#define INPUT_TYPE_ANALOG 0x0a + +#define SAVE_PROJECT 0x100 +#define SAVE_COMPOSE 0x200 +#define SAVE_AUDIO 0x400 +#define SAVE_ALL 0x700 + +#define TYPE_BASECOMPOSE 0x01 +#define TYPE_COMPOSE 0x02 +#define TYPE_AUDIO 0x04 +#define TYPE_SONG 0x08 +#define TYPE_BEAT 0x10 +#define TYPE_AUDIO_BASECOMPOSE 0x05 +#define TYPE_SONG_COMPOSE 0x0A +#define TYPE_MUTEBEAT 0x100 +#define TYPE_LOOPPLAY 0x200 +#define TYPE_PREDEFINE 0x400 +#define TYPE_AUDIOFX 0x800 + +#define MAX_RECENT_PROJECT 6 +#define MAX_MENU_STRLEN 80 + +#define AUTOSAVE_FILENAME "temp\\~last.sav" + +#define FILETYPE_CPJ 0 +#define FILETYPE_MP3 1 +#define FILETYPE_WAVE 2 +#define FILETYPE_MIDI 3 + +#define VIEW_INIT 0 +#define VIEW_TRACK 1 +#define VIEW_CHORD 2 +#define VIEW_STYLE 3 + +#define STOP_SELF 0x00 +#define STOP_CONTENT 0x01 +#define STOP_USESTYLE 0x02 +#define STOP_PRESTYLE 0x04 +#define STOP_AUDSTYLE 0x08 +#define STOP_ALL 0x0F + +#define SAFE_FREE(p) { if(p) { free(p); (p)=NULL; } } +#define SAFE_DELETE(p) { if(p) { delete (p); (p)=NULL; } } +#define SAFE_DELETE_ARRAY(p) { if(p) { delete[] (p); (p)=NULL; } } +#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } } + +#ifdef _LITE_ +#define REGKEY_SOFTWARE L"SOFTWARE\\iChangzuo\\AC_ProLite" +#else +#define REGKEY_SOFTWARE L"SOFTWARE\\iChangzuo\\AC_Pro" +#endif +#define REGKEY_AUTOLOG L"{0DF44EAA-FF21-4412-828E-260A8728E7F1}" + +#define VST_DIRNAME L"VSTPlugins\\" + +/***************************************************************************************/ +// ȫֳ +/***************************************************************************************/ +extern const char *g_strDefaultSoundSet, + *g_strSoundSetExt, + *g_strMelodyKey[KEY_NUM], + *g_strTimeSignature[4], + *g_strTSName[4], + *g_strSegment[4], + *NAME_SEG[4], + *g_strIntro[MAX_INTRO_NUM], + *g_strEnding[MAX_ENDING_NUM], + *g_strStage, + *g_strStageVar[STAGE_VAR_NUM], + *g_strFill[STAGE_FILL_NUM]; + +/***************************************************************************************/ +// ȫֱ +/***************************************************************************************/ +#define MAX_FONTS_NUM 128 +#define MAX_VST_NUM 64 + +extern STYLELIST g_aOriginStyles, + g_aLocalStyles, + g_aShareStyles, + g_aTempStyles, + g_aCollectStyles, + g_aRecomStyles; + +extern FONTINFOLIST g_lstFonts; //ͨɫб +extern FONTINFO* g_lstCZFonts[18]; //չɫ +extern VSTINFOLIST g_lstVSTFx, //VSTЧб + g_lstVSTi; //VSTiɫб + +extern wstring g_strVSTPath, // VST· + g_strVSTiPath, // VSTi· + g_strLastSavePath, // ϴαļ· + g_strLastImportFile, // ϴεļ + g_strExecutePath, // ִļ· + g_strUserPath, // û· + g_strExtFontsPath, // չɫ· + g_strSegImportPath; // Ƭ· + + +extern char g_strTxtFontName[20], //ȱʡ + g_strSoundFont[80], //ȫɫ + g_strCurrentVersion[20], + g_strServerURL[256], + g_strPlaybackDevice[256], //ָ豸 + g_strRecordDevice[256]; //ָ¼豸 + +extern int g_idFont, // ѡɫ + g_iMelodyTimeSignature, // ĺ + g_nMelodyTempo, // ٶ + g_nChordNumPerBar, // ÿСں + g_nBPM, // ÿС + g_nPPB, // ÿĵ + + g_iToolPanelShow, // ʾʽ0=ұߣ1=, 2=أ + g_iLastSaveOption, // ϴαѡ + g_iLastSaveType, // ϴαļʽ + g_iViewMode, // ͼģʽ + g_iWindowState, // ϴδģʽ + g_iPlaybackDevice, // ָ豸 + g_iPlaybackOutput, // ָԴ + g_iRecordDevice, // ָ¼豸 + g_iRecordInput, // ָ豸Դ + g_nRecordChannels, // ¼ͨ + g_iPreStageDefault, // ûԤģʽ + g_iSegColorMode, // ɫģʽ0=κţ1= + + g_arrIntroBarNum[MAX_INTRO_NUM],//ȫַǰС + g_arrEndingBarNum[MAX_ENDING_NUM]; //ȫַβС + +extern float g_fRecordVolume, //¼ + g_fSpeakerVolume; // + +extern double g_dblStep, //Ų + g_dblTimePerBar; //ÿСʱ() + +extern bool g_bRecordAutoAdjust, //¼Զ + g_bRecordMoniter, //¼ + g_bShowRecordHint, //ʾ + g_bUpdateMandatory, //ͻҪǿƸ + g_bMidiMelody, //MIDI + g_bWeakup, // + g_bShowPlayTick, //ʾСڽĻʱ + g_bPredefine, //Ԥ蹤̣Զ/ӳ +// g_bSongSaved, //ȫѱ + g_bRecProtect, //¼ + g_bShowProtectMsg, //Ƿʾ¼Ϣ + g_bShowVSTPath, //ǷʾVST· + g_bAlphaKey, //false,trueӢ + g_bAutoSave, //Զ + g_bAutoDownloadStyle, //Զط + g_bAutoOpenProject, //Զϴι + g_bAutoOpenProjectEnable,//Զϴιʹ + g_bProjStylePaid, //̷֧ + g_bPrebeat, //ʹԤʾ + g_bExtFontUsable, //չɫ + g_bExtFont; //ʹչɫ + +//extern int g_aAudioEffects[MAX_FX_NUM], //õЧ +// +//extern DWORD g_iMacAddressNum; //macַ +extern vector g_lstMacAddress; //macַregedit +//extern vector g_lstMacAddressNew; + +extern const String g_strTable[], + g_strAlphaTable[]; + +extern UINT g_xDpi, g_yDpi; //High DPI Ӧ +extern int g_szFont7, + g_szFont8, + g_szFont9, + g_szFont10, + g_szFont11, + g_szFont12, + g_szFont16; +/***************************************************************************************/ +// ȫֺ +/***************************************************************************************/ +///////////////////////////////////////////////////////////////////////////////////////// +// +// +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*CM_GetVersion)(); +// ܣȡ汾Ϣ +// 룺 +//ֵ汾 LOWORD=major, HIWORD=minor +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI int (*CM_Initialize)(); +//: Initialize +// : ģʼ +// ֵ: ɹ0, 򷵻ش +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI int (*CM_Release)(); +// ܣͷŶ +// 룺 +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI bool (*CM_CheckStyle) ( UINT idLoc, UINT idStyle ); +//: CheckStyle +// : ģĿ +// : ID +// : ɹtrueʧܷfalse +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*CM_GetStyleRecomIDs)( int iTS, DWORD aStyleIDs[], int *nIDNum ); +//: GetStyleRecomIDs +// : ȡƼ +// : +// : ɹ0Ϊ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*CM_GetStyleInfo)( UINT idLoc, UINT idStyle, TPROSTYLE* tStyle ); +//: GetStyleInfo +// : ȡָIDϢ +// : +// : ɹ0Ϊ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*CM_GetStyleInfos)( int iType, int iTS, TPROSTYLE aStyleInfos[], int *nInfoNum ); +//: GetStyleInfos +// : ȡָĵķϢб +// : +// iType 1= 2= 3= +// : ɹ0Ϊ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*CM_SetMelodyNotes)( int nNoteNum, BYTE aNotes[], WORD aTicks[], + int nTPB, int iTS, int nTempo ); +// : 룬顢ĺšTPB +// : +// nNoteNum С +// aNotes +// aTicks ʱ +// nTPB ÿtick +// iTS ĺ +// nTempo ٶ +// : +//--------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------- +typedef DLLAPI HRESULT (*CM_AutoChords)( int iKey, int* nBarNum, void* aChords, + int* nStageNum, int aStages[]); +// ܣԶö估 +// 룺iKey ָ +// nBarNum/aChordsС +// nStageNum/aStages +//ֵ +//--------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------- +typedef DLLAPI HRESULT (*CM_Compose)( int* buffLen, BYTE buffer[], int ts, int tempo, + int nStageNum, void* aStages, + bool bSave, int* lenNotes, BYTE notes[] ); +//: Compose +// : ָʽṹ +// : +// buffLen/buffer ڴ泤/ַ +// ts/tempoָٶ +// nStageNum ʽֶ +// aStages ʽֶ TStage +// bSave ڲ/ +// lenNotes/notes ȡij/ַ +// bSave ڲ/ +// : ɹ0, 򷵻ش +//--------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------- +typedef DLLAPI UINT (*CM_GetNextLocalID)(); +//: GetNextLocalID +// : ȡһط +// : +// : +//--------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------- +typedef DLLAPI int (*CM_SaveLocalStyle)( TPROSTYLE* pInfo ); +//: SaveLocalStyle +// : 汾ط +// : +// pStyleINfo Ϣ idLoc/idStyle=0ԶID, 򸲸 +// : ɹ0Ϊ +//--------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------- +typedef DLLAPI int (*CM_ChangeLocalStyle)( TPROSTYLE* pInfo ); +//: ChangeLocalStyle +// : ޸ıطϢ +// : +// pStyleINfo Ϣ +// : ɹ0Ϊ +//--------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------- +typedef DLLAPI int (*CM_DeleteLocalStyle)( UINT idLoc, UINT idStyle ); +//: DeleteLocalStyle +// : ɾط +// : idLoc/idStyle ָID0=ԶID +// : ɹ0Ϊ +//--------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------- +typedef DLLAPI int (*CM_AddTempSegment)( UINT idLoc, UINT idStyle, char* strFileName, + int iTS, int iTempo, int iSegType, + int& iSegNo, int& errCode, char tracks[16][3] ); +//: AddTempSegment +// : ʱƬ +// : idLoc/idStyle ܸǵķID +// strFileName MIDIļ +// iTS +// iTempo ٶ +// iSegType Ƭ +// iSegNo [in][out]Ƭκ +// errCode [out]ļ +// tracks [out]ƬιϢ +// : ɹС򷵻-1 +//--------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------- +typedef DLLAPI void (*CM_DeleteTempSegment)( UINT idLoc, UINT idStyle, int iSegType, int iSegNo ); +//: DeleteTempSegment +// : ɾʱƬ +// : idLoc/idStyle ID +// iSegType Ƭ +// iSegNo Ƭκ +// : +//--------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------- +typedef DLLAPI void (*CM_DeleteTempStyle)( UINT idStyle ); +//: DeleteTempStyle +// : ɾʱ +// : idStyle ID +// : +//--------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------- +typedef DLLAPI int (*CM_ProjBackupStyle)( UINT idLoc, UINT idStyle, int nSegNum, WORD aSeg[][2], + int& lenMem, BYTE* pMem ); +//: BackupProjStyle +// : ط񹤳̱ +// : idLoc/idStyle ID +// nSegNo Ƭ +// aSeg[] Ƭ飨LOWORDƬͣHIWORDƬκţ +// lenMem/pMen ڴС +// : ɹ0ʧܷش +//--------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------- +typedef DLLAPI int (*CM_ProjRestoreStyle)( int lenMem, BYTE* pMem ); +//: BackupProjStyle +// : ָ̻Ϊʱ +// : idLoc/idStyle ָķID +// nSegNo Ƭ +// aSeg[] Ƭ飨LOWORDƬͣHIWORDƬκţ +// lenMem/pMen ڴС +// : ɹʱIDʧܷظ +//--------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------- +typedef DLLAPI int (*CM_GetCollectionIDs)( int iTS, int& nIDNum, UINT aID[][2] ); +//: GetCollectionIDs +// : ȡղصȷID +// : +// iTS +// nIDNum ط +// aIDsŷID +// : ɹ0Ϊ +//--------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------- +typedef DLLAPI int (*CM_SetCollectionStyle)( bool bSet, UINT idLoc, UINT idStyle ); +//: SetCollectionStyle +// : ղط +// : +// bSet /ȡղ +//--------------------------------------------------------------------------------------------- + +/////////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (* CM_MakeStyle)( UINT idLoc, UINT idStyle, TMAKESTYLEINFO *pStyleInfo, + int &nBufferLen, BYTE* pBuffer ); +//: ɷļ. +// : +// idLoc/idStyle طID +// stAuthorInfo Ϣ +// nBufferLen طļ +// pBuffer շļݵĻⲿ䣬ⲿͷ +// ֵ: ɹ0, 򷵻ش +///////////////////////////////////////////////////////////////////////////////////////// + +extern CM_GetVersion f_CM_GetVersion; +extern CM_Initialize f_CM_Initialize; +extern CM_Release f_CM_Release; +extern CM_CheckStyle f_CM_CheckStyle ; +extern CM_GetStyleRecomIDs f_CM_GetStyleRecomIDs; +extern CM_GetStyleInfo f_CM_GetStyleInfo; +extern CM_GetStyleInfos f_CM_GetStyleInfos; +extern CM_SetMelodyNotes f_CM_SetMelodyNotes; +extern CM_AutoChords f_CM_AutoChords; +extern CM_Compose f_CM_Compose; +extern CM_GetNextLocalID f_CM_GetNextLocalID; +extern CM_SaveLocalStyle f_CM_SaveLocalStyle; +extern CM_ChangeLocalStyle f_CM_ChangeLocalStyle; +extern CM_DeleteLocalStyle f_CM_DeleteLocalStyle; +extern CM_AddTempSegment f_CM_AddTempSegment; +extern CM_DeleteTempSegment f_CM_DeleteTempSegment; +extern CM_DeleteTempStyle f_CM_DeleteTempStyle; +extern CM_ProjBackupStyle f_CM_ProjBackupStyle; +extern CM_ProjRestoreStyle f_CM_ProjRestoreStyle; +extern CM_GetCollectionIDs f_CM_GetCollectionIDs; +extern CM_SetCollectionStyle f_CM_SetCollectionStyle; +extern CM_MakeStyle f_CM_MakeStyle; +///////////////////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////////////////// +// MediaModule +// +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_GetVersion)(); +// ܣȡģ汾 +// 룺 +//ֵ汾 LOWORD=major, HIWORD=minor +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_InitialObjects) ( HWND hWnd, char* strRoot ); +// ܣʼDirectMusic +// 룺hWnd ôھ +// strRoot ӦóĿ¼ +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_DestroyObjects) (); +// ܣͷŶ +// 룺 +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +typedef DLLAPI HRESULT (*MM_GetFontInfo)( char* strFileName, char* strFontName, + int* nInst, void* setInsts, + int* nDrum, void* setDrums ); +// ܣȡɫϢ +// 룺[IN] strFileName ɫļ +// [OUT]strFontName ɫ +// [OUT]nInst ɫ(bank=0) +// [OUT]setInsts ɫϢ +// [OUT]nDrum ɫ(bank=128) +// [OUT]setDrums ɫϢ +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +/*typedef DLLAPI HRESULT (*MM_SetFont)( char* strFileName ); +// ܣɫ +// 룺strFileName ɫļ +//ֵ +*/ +typedef DLLAPI HRESULT (*MM_SetDefaultFont)( int num, char strFiles[][256] ); +// ܣȱʡɫ +// 룺 +// num ļ +// strFile ɫļ +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI int (*MM_GetVSTInfo)( char* strFileName, char* strEffName, DWORD& uniqueID, + int& nPlugins, char strPlugins[][64], UINT idPlugins[] ); +// ܣȡVSTϢ +// 룺[IN] strFileName VSTļ +// [OUT]strVSTName VST +// [OUT]uniqueID VST id +// [INOUT]nPlugins, strPlugins, idPlugins ShellpluginϢ +//ֵVST 1=VST, 2=VSTi, 4=Shell, 0=Ч +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_LoadVSTi)( int iBank, char* strFontFile ); +// ܣVSTiɫ +// 룺 +// iBank Դ +// strFontFile Դļ +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI int (*MM_GetVSTiPrograms)( int iBank, char chan[], char name[][64] ); +// ܣȡVSTiɫɫ +// 룺 +// iBank Դ +// chan Чͨ +// name Чɫ +//ֵЧɫ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_HandleVSTiPreset)( int iBank, int& len, BYTE* mem, bool bLoad ); +// ܣVSTiɫĵǰãѹ +// 룺 +// iBank Դ +// len ݳ +// mem ݿ +// bLoad ػ򱣴 +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_LoadMidiMelody)( HWND hNotifyWnd, LPCSTR strFileName ); +// ܣMIDIļȡ +// 룺hNotifyWnd սϢĴھ +// strFileName MIDIļ +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_LoadCompose)( int iFile, LPBYTE lpData, DWORD dwDataSize, int iFont, char* strFontFile ); +// ܣر +// 룺 +// iFile MIDIļ +// lpData MIDI +// dwDataSize ݴС +// iFont Դ +// strFontFile Դļ +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI void (*MM_FreeComposes)(); +// ܣձ +// 룺 +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_LoadPrebeat) ( LPBYTE lpData, DWORD dwDataSize ); +// ܣ׼ʾ +// 룺lpData +// dwDataSize ݴС +//ֵ󷵻0 +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_Play)( HWND hNotifyWnd, DOUBLE dblStartPoint, int iType ); +// ܣ +// 룺hNotifyWnd ղϢĴھ +// dwStartPoint ʼλ +// iChans ŵͨ +// TYPE_BASECOMPOSE=0x01, TYPE_COMPOSE=0x02, TYPE_AUDIO=0x04, TYPE_SONG=0x08 +// TYPE_BEAT=0x10 TYPE_AUDIO_BASECOMPOSE=0x05, TYPE_SONG_COMPOSE=0x0A, +// TYPE_AUDIOFX=0x800 +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_Stop)(); +// ܣֹͣ +// 룺 +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_CheckIODevice)( int& iOutDevice, char* strOutName, + int& iInDevice, char* strInName ); +// ܣ豸 +// 룺 +// iOutDevice 豸 +// strOutName 豸 +// iInDevice 豸 +// strInName 豸 +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_SetIODevice)( int& iPlayDevice, int& iOutput, + int& iRecDevice, int& iInput ); +// ܣõǰ¼豸ʧ򷵻ȱʡ豸 +// 룺 +// iPlayDevice 豸 +// iOutput Դ +// iRecDevice ¼豸 +// iInput ¼Դ +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI int (*MM_GetPlaybackDeviceInfo)( int nSize, PVOID arrInfo ); +// ܣȡ豸Ϣ +// 룺nSize С +// arrInfo 豸Ϣ +//ֵ豸 +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI int (*MM_GetPlaybackOutputInfo)( int nSize, PVOID arrInfo ); +// ܣȡԴϢ +// 룺iDevice 豸 +// nSize С +// arrInfo ԴϢ +//ֵ豸 +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI int (*MM_GetRecordDeviceInfo)( int nSize, PVOID arrInfo ); +// ܣȡ¼豸Ϣ +// 룺nSize С +// arrInfo 豸Ϣ +//ֵ豸 +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI int (*MM_GetRecordInputInfo)( int nSize, PVOID arrInfo ); +// ܣȡԴϢ +// 룺iDevice 豸 +// nSize С +// arrInfo ԴϢ +//ֵ豸 +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_RecordTest)( HWND hNotifyWnd ); +// ܣ¼ +// 룺 +// hNotifyWnd Դ +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_SetRecordAutoAdjust)( bool bAutoAdjust ); +// ܣԶ¼ +// 룺bAutoAdjust Զ +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_SetRecordMoniter)( bool bMoniter ); +// ܣ¼ +// 룺bMoniter Ƿ +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI int (*MM_GetMidiInBuffer)(); +// ܣȡMIDI뻺С +// 룺 +//ֵǰ(ms) +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_SetMidiInBuffer)( int msLen ); +// ܣMIDI뻺С +// 룺 +// msLen С(ms) +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_SetRecordProtect)( bool bProtect ); +// ܣ¼ +// 룺bProtect ¼ +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_SetRecordChannels)( int nChannels ); +// ܣ¼ͨ +// 룺nChannels ͨ 2=, other=ͨ +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_ShowAsioPanel)(); +// ܣʾASIO +// 룺 +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_RestartAsioDevice)(); +// ܣASIO豸 +// 룺 +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_LoadAudio) ( HWND hNotifyWnd, LPCSTR strAudioFile, int iFileType, + int iTS, int iTempo ); +// ܣWAVļȡ +// 룺strAudioFile ļ +// iFileType ļ(FILETYPE_WAVE/FILETYPE_MP3) +// iTS ĺ +// iTempo ٶ +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_Save)( HWND hNotifyWnd, int iSaveType, LPCSTR strFileName, int iFileType ); +// ܣ浽ļ +// 룺hNotifyWnd ϢĴھ +// iSaveType (Ƶ//) +// strFileName ļ +// iFileType ļ +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_SaveMidi)( HWND hNotifyWnd, LPBYTE lpData, DWORD dwDataSize, int iFont, + char* strName, int iFileType ); +// ܣMIDIļ +// 룺hNotifyWnd ϢĴھ +// lpData MIDI +// dwDataSize ݴС +// iFont Դ +// strName ļ +// iFileType ļ(MIDI/WAV/MP3) +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_GetMelodyInfo)( OUT int* iTimeSignature, OUT int* nTempo ); +// ܣȡϢ +// 룺iMelodyKey ɵ +// iTimeSignature ĺ +// nTempo ٶ +//ֵС +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI int (*MM_GetMelodyBars)( OUT int* iOffsetBar, OUT int* nValidBar ); +// ܣȡɳ +// 룺 +// iOffsetBars һֹȡС +// nValidBars ЧС +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI int (*MM_GetMelodyNotes)( OUT BYTE keys[], OUT WORD delay[], int* iKey); +// ܣȡ +// 룺Keys +// delay ʱ +// iKey [in,out] -1=ȡȱʡ>0ָ +// ɵģ鸺ķͷ +//ֵС +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_CreateRealTimeMIDIStream)( bool bDrum ); +// ܣʵʱMIDI +// 룺bDrum ͨ +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_FreeRealTimeMIDIStream)(); +// ܣͷʵʱMIDI +// 룺 +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_RealTimeMIDINoteOn)(unsigned char iNote); +// ܣʵʱMIDI +// 룺iNote +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_RealTimeMIDINoteOff)(unsigned char iNote); +// ܣʵʱMIDIر +// 룺iNote +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +//typedef DLLAPI HRESULT (*MM_PlayStyleDemo)( LPBYTE lpStyleDemoData, DWORD dwDataSize, int nTempo ); +// ܣŷ +// 룺lpStyleDemoData +// dwDataSize ݳ +// nTempo ŵٶ 0=ԭ +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_LoadDemo)( LPBYTE lpDemoData, DWORD dwDataSize ); +// ܣͨ +// 룺 +// lpDemoData +// dwDataSize ݳ +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_PlayDemo)( HWND hNotifyWnd, double dblBarPlay, int iChno, int iProg, + int iBank, char* strFontFile ); +// ܣͨ +// 룺hNotifyWnd ղϢĴھ +// dblBarPlay ʼС -1=ѭ +// iChno ͨ -1=ı +// iProg -1=ı +// iBank Դ -1=ȱʡԴ +// strFontFile Դļ +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_ChangeDemoParam)( int iChno, int iProg ); +// ܣʵʱı +// 룺 +// iChno ͨ -1=ı +// iProg -1=ı +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_SetTempo)( int nTempo ); +// ܣٶ +// 룺nTempo ٶ(/) +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_SetTimeSignature)( int nTimeSignature ); +// ܣý +// 룺nTimeSignature (0=4/4, 1=3/4, 2=2/4, 3=6/8 +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI DWORD (*MM_GetAudioVolume)( int iTrack, double dblPoint ); +// ܣļʱȡAudio +// 룺 +// iTrack Ƶ +// dblPoint ָȡСλ +//ֵǰ LOWORDHIWORD +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI DWORD (*MM_GetStreamVolume)( int iStreamType ); +// ܣȡƵ +// 룺iStreamType Ƶͣ0=master; 1=Record; 2=Audio; 3=BaseCompose; +// 4=Compose; 5=Song; 6=Output +//ֵǰ LOWORDHIWORD +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_SetStreamVolume)( int iStreamType, float fVolume ); +// ܣƵ +// 룺iStreamType Ƶͣ0=master; 1=Record; 2=Audio; 3=BaseCompose; +// 4=Compose; 5=Song +// fVolume С +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI float (*MM_GetLatency)( bool bCountIn ); +// ܣȡ¼ӳʱ +// 룺bCountIn Ƿӳ +//ֵӳʱ(ms) +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_ActiveAPR)( BOOL bActive ); +// ܣAPR +// 룺bActive /ر +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_SetTrackEvent)( int iEvent, int iStartBar, int iEndBar, + int iChan, int nValue, int iStream ); +// ܣͨ¼ +// 룺iEvent ¼ +// iFirstBar ʼС +// iLastBar С +// iChan ͨ +// nValue ֵ +// iStream -2=Demo, other=Դ +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_SetMidiTrackParam)( int iStream, int iChan, int iParam, int nValue ); +// ܣMIDIͨ +// 룺 +// iStream Դ +// iChan ͨ +// iParam 0=vol 1=pan 2=gain +// nValue ֵ + +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI long (*MM_SaveProject)( int iMode, HWND hNotifyWnd, LPCSTR strFileName ); +// ܣ湤ļ +// 룺iMode ģʽ0=Auto, 1=Normal, 2=Upload +// hNotifyWnd ϢĴھ iMode==1 ʱЧ +// strFileName ļ +//ֵдֽ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI DWORD (*MM_LoadProject)( int iMode, HWND hNotifyWnd, LPCSTR strFileName, LONG lBeginPos, + DWORD dwVersion ); +// ܣ빤ļ +// 룺iMode ģʽ0=Auto, 1=Normal, 2=Upload +// hNotifyWnd ϢĴھ iMode==1 ʱЧ +// strFileName ļ +// lBeginPos ʼȡλ +// dwVersion ļİ汾 +//ֵȫ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI void (*MM_ResetProject)(); +// ܣù̲ +// 룺 +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_UserCanceled)(); +// ܣûȡýļ +// 룺 +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_ShowVSTEditor)( HWND hNotifyWnd, HWND parentWnd, int* width, int* height, + int iTrack, int iVST, char* strFileName ); +// ܣʾVST +// 룺 +// hNotifyWnd Ϣ +// parentWnd NULL= +// width, height ڴС +// iTrack ţ -1=VSTi +// iVST iTrack<0 ΪVSTi ΪЧ +// strFileName VSTiļ +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_SaveVSTParams)( int iTrack, int iVST, bool bSave ); +// ܣVST +// 룺 +// iTrack ţ -1=VSTi +// iVST iTrack<0 ΪVSTi ΪЧ +// bSave true=, false= +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_AudioNewTrack)(); +// ܣƵ +// 룺 +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_AudioDeleteTrack)( int iTrack ); +// ܣɾƵ +// 룺 +// iTrack 0=ԭʼ¼ +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_AudioRecord)( HWND hNotifyWnd, int iTrack, DOUBLE dblPlayStart, + DOUBLE dblRecStart, DOUBLE dblRecEnd, int iOption ); +// ܣ¼ +// 룺hNotifyWnd ϢĴھ +// iTrack 0=ԭʼ¼ +// dblPlayStart ԭ¼Сλ +// dblRecStart ¼Сλ +// dblRecEnd ¼޸յСλ +// iOption 0=¼1=࣬2=ʽ࣬0x10=Զ壬 +// 0x100=ľ +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_AudioMove)( int iDestTrack, DOUBLE dblPosInsert, int iSrcTrack, + DOUBLE dblSrcBegin, DOUBLE dblSrcEnd, int iMode ); +// ܣƶƵ +// 룺 +// iDestTrack Ŀ +// dblPosInsert λ +// iSrcTrack Դ +// dblSrcBegin/dblSrcEnd ƶʼλ +// iMode ƶģʽ INSERT/COPY/MOVE/DELETE/ERASE +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_AudioFx)( int iTrack, double dblStart, double dblEnd, + DWORD iFxType, float fParams[] ); +// ܣЧ +// 룺 +// iTrack +// dblStart ʼСλ +// dblEnd Сλ +// iFxType Ч +// fParams Ч +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI DOUBLE (*MM_AudioLoad)( int iTrack, DOUBLE dblEditStart, DOUBLE dblEditEnd, LPCSTR strFile ); +// ܣƵƬ +// 룺 +// iTrack 0=ԭʼ¼ +// dblEdiStart ʼλ +// dblEditEnd λ +// strFile ļ +//ֵ޸ij +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI int (*MM_AudioGetLength)( int iTrack ); +// ܣȡƵ +// 룺 +// iTrack 0=ԭʼ¼ +//ֵֽ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_AddUndoBefore)( int num, int* trks ); +// ܣUNDOǰ +// 룺 +// num <0Ϊȫ=0Ϊ>0Ϊֵ +// trks +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_AddUndoAfter)( int num, int* trks ); +// ܣUNDO +// 룺 +// num <0Ϊȫ=0Ϊɾ>0Ϊֵ +// trks +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_CancelAddUndo)(); +// ܣȡUNDO +// 룺 +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_Undo)( bool bUndo ); +// ܣ +// 룺 +// bUndo true=false= +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI HRESULT (*MM_AudioAddFx)( int iTrack, DWORD iFxType, char* strVstFile, + int idPlugin, bool bSP ); +// ܣ׼ֲЧ +// 룺 +// iTrack +// iFxType Ч +// strVstFile VSTЧļ +// idPlugin VSTID +// bSP ֲЧ +//ֵ +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// +typedef DLLAPI int (*MM_AudioGetFxParam)( int iTrack, int index, void* params, int nSize ); +// ܣƶЧ˳ +// 룺 +// iTrack +// index Ч +// params Ч NULL=ȡ +// nSize Ч iFx +#pragma hdrstop + +#include "HelpFormUnit.h" +#include "GlobalUnit.h" +#include "MessageDef.h" +#include "MessageFormUnit.h" +#include "ProgressFormUnit.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma link "GeneralDialogPanel" +#pragma link "PNGButton" +#pragma link "CapButton" +#pragma resource "*.dfm" +THelpForm *HelpForm; +//--------------------------------------------------------------------------- +#define WINDOW_MAX 0 +#define WINDOW_NORMAL 1 +#define WINDOW_MIN 2 +#define WNDOW_CLOSE 3 + +//--------------------------------------------------------------------------- +__fastcall TTabButton::TTabButton(System::Classes::TComponent* AOwner) + : TPNGButton( AOwner ) +{ + Caption = ""; +} +//--------------------------------------------------------------------------- + +__fastcall TTabButton::~TTabButton(void) +{ + +} +//--------------------------------------------------------------------------- + +void __fastcall TTabButton::SetFontSize(int sz) +{ + Canvas->Font->Size = sz; +} +//--------------------------------------------------------------------------- + +void __fastcall TTabButton::Paint(void) +{ + TPNGButton::Paint(); + + Canvas->Brush->Style = bsClear; + Canvas->Font->Color = RGB( 184,188,189 ); + Canvas->Font->Name = g_strTxtFontName; + Canvas->Font->Quality = TFontQuality::fqClearTypeNatural; +// if( !strcmp( g_strTxtFontName, "微软雅黑" ) ){ +// Canvas->Font->Size = 10; +// } +// else{ +// Canvas->Font->Size = 9; +// } + + int nLength = Canvas->TextWidth( Caption ); + int nHeight = Canvas->TextHeight( Caption ); + Canvas->TextOutW( Width/2 - nLength/2 - 5,Height/2 - nHeight/2,Caption ); +} + +//--------------------------------------------------------------------------- + +__fastcall THelpForm::THelpForm(TComponent* Owner) + : TForm(Owner) +{ + Window_state = WINDOW_NORMAL; + m_nUserNoticeNum = 0; + m_PngImage = new TPngImage(); + m_PngImage->LoadFromResourceName(int(HInstance), L"HelpPNG"); + m_PanelShow = NULL; +} +//--------------------------------------------------------------------------- + + +void __fastcall THelpForm::FormClose(TObject *Sender, TCloseAction &Action) +{ + PostMessage( Application->MainForm->Handle, UM_SHOWHELP, false, 0 ); +} +//--------------------------------------------------------------------------- + + +void __fastcall THelpForm::RestClick(TObject *Sender) +{ + + SetSize( HLP_WINDOW_NORMAL ); +} +//--------------------------------------------------------------------------- + +void __fastcall THelpForm::MinClick(TObject *Sender) +{ + SetSize( HLP_WINDOW_MIN ); +} +//--------------------------------------------------------------------------- + +void __fastcall THelpForm::MaxClick(TObject *Sender) +{ + SetSize( HLP_WINDOW_MAX ); +} +//--------------------------------------------------------------------------- + +void __fastcall THelpForm::SetSize( int iState ) +{ + Window_state = iState; + + switch( iState ) + { + case HLP_WINDOW_MAX: + SetBounds( Application->MainForm->Left, Application->MainForm->Top + 44, + Application->MainForm->Width, Application->MainForm->Height - 44 ); + break; + + case HLP_WINDOW_MIN: + SetBounds( Application->MainForm->Left + Application->MainForm->Width - 160, + Application->MainForm->Top + Application->MainForm->Height - 34, + 150, 24 ); + break; + + case HLP_WINDOW_NORMAL: + SetBounds( Application->MainForm->Left + Application->MainForm->Width/2 - 389, + Application->MainForm->Top + Application->MainForm->Height/2 - 220, + 778, 440 ); + break; + } + + m_btnMax->Visible = iState==HLP_WINDOW_NORMAL; + m_btnMin->Visible = iState!= HLP_WINDOW_MIN; + m_btnRest->Visible = iState!=HLP_WINDOW_NORMAL; +} +//--------------------------------------------------------------------------- + +void __fastcall THelpForm::FormResize(TObject *Sender) +{ + switch( Window_state ){ + case HLP_WINDOW_MIN: + m_lblGroupLabel->Top = 50; + m_lblGroup->Top = 50; + m_lblVideoLabel->Top = 50; + m_lblVideo->Top = 50; + m_lblUrlLabel->Top = 50; + m_lblUrl->Top = 50; + break; + + case HLP_WINDOW_MAX: + case HLP_WINDOW_NORMAL: + m_PanelShow->SetBounds( 40, 67, Width - 80, Height - 120 ); + m_memMsg->SetBounds( 15, 15, m_PanelShow->Width - 45, 130 ); + + m_btnSubmit->Top = m_memMsg->Top + m_memMsg->Height + 5; + m_btnSubmit->Left = m_memMsg->Left + m_memMsg->Width - m_btnSubmit->Width; + + m_lblGroupLabel->Top = Height - 35; + m_lblGroup->Top = m_lblGroupLabel->Top; + m_lblVideoLabel->Top = m_lblGroupLabel->Top; + m_lblVideo->Top = m_lblGroupLabel->Top; + m_lblUrlLabel->Top = m_lblGroupLabel->Top; + m_lblUrl->Top = m_lblGroupLabel->Top; + break; + } +} +//--------------------------------------------------------------------------- + +void __fastcall THelpForm::FormCreate(TObject *Sender) +{ + m_GenerPanel->Font->Size = g_szFont9; + + for( int i=0;iParent = m_GenerPanel; + m_arrTabs[i]->ImgStates = 4; + m_arrTabs[i]->PngImg = m_PngImage;//LoadFromResourceName( int(HInstance), L"HelpPNG" ); + m_arrTabs[i]->Top = 40; + m_arrTabs[i]->SetFontSize(g_szFont10); + m_arrTabs[i]->OnClick = TabClick; + m_arrTabs[i]->Tag = i; + + if(i==2){ + m_arrTabs[i]->Left = 78; + m_arrTabs[i]->Visible = false; + } + else if(i>2) + m_arrTabs[i]->Left = 78 + 70*(i-1); + else + m_arrTabs[i]->Left = 78 + 70*i; + + + +// if( i<=TAB_SW ) +// m_arrTabs[i]->OnClick = TabClick; +// else if( i==TAB_MN ) +// m_arrTabs[i]->OnClick = HelpClick; +// else if ( i==TAB_AB ) +// m_arrTabs[i]->OnClick = AboutClick; + + m_arrTabs[i]->SendToBack(); + } + + m_arrTabs[TAB_QA]->Caption = "常见问题"; + m_arrTabs[TAB_FB]->Caption = "我要提问"; + m_arrTabs[TAB_NT]->Caption = "网站消息"; + m_arrTabs[TAB_CN]->Caption = "唱作音符"; + m_arrTabs[TAB_SW]->Caption = "更多软件"; + m_arrTabs[TAB_MN]->Caption = "用户手册"; + m_arrTabs[TAB_AB]->Caption = "关于"; + m_arrTabs[TAB_QA]->Down = true; + + m_PanelShow = new THelpPanel(this); + m_PanelShow->Parent = this; + m_PanelShow->Left = 40; + m_PanelShow->Top = 67; + m_PanelShow->Width = 697; + m_PanelShow->Height = 320; + m_PanelShow->OnClick = panelShowClick; + m_PanelShow->Visible = true; + m_PanelShow->SetTextFontSize(m_memMsg->Font->Size); + + m_memMsg->Parent = m_PanelShow; + m_memMsg->Left = 15; + m_memMsg->Top = 15; + m_memMsg->Width = m_PanelShow->Width - 45; + m_memMsg->Height = 130; + m_memMsg->Enabled = !g_bUpdateMandatory; + + m_btnSubmit->Parent = m_PanelShow; + m_btnSubmit->Left = m_memMsg->Left + m_memMsg->Width - m_btnSubmit->Width; + m_btnSubmit->Top = m_memMsg->Top + m_memMsg->Height + 5; + m_btnSubmit->FontSize = m_memMsg->Font->Size; + + m_lblMsgHead->Parent = m_PanelShow; + m_lblMsgHead->Left = m_PanelShow->Left + 15; + m_lblMsgHead->Top = 15; + + m_lblMsgNum->Parent = m_PanelShow; + m_lblMsgNum->Left = m_lblMsgHead->Left + m_lblMsgHead->Width+1; + m_lblMsgNum->Top = 15; + + m_lblMsgMiddle->Parent = m_PanelShow; + m_lblMsgMiddle->Left = m_lblMsgNum->Left + m_lblMsgNum->Width+1; + m_lblMsgMiddle->Top = 15; + + m_lblMsgURL->Parent = m_PanelShow; + m_lblMsgURL->Left = m_lblMsgMiddle->Left + m_lblMsgMiddle->Width+1; + m_lblMsgURL->Top = 15; + + m_lblMsgTail->Parent = m_PanelShow; + m_lblMsgTail->Left = m_lblMsgURL->Left + m_lblMsgURL->Width+1; + m_lblMsgTail->Top = 15; + + m_pImgNoticeTip = new TPngImage(); + m_pImgNoticeTip->LoadFromResourceName(int(HInstance), "NoticeBK"); + + m_PanelShow->SetMode(0); + + SetTransparent( this ); +} +//--------------------------------------------------------------------------- + +void __fastcall THelpForm::FormActivate(TObject *Sender) +{ +// m_lblUrl->Caption = g_strServerURL; + +// m_pbUserNoticeNum->Visible = (m_nUserNoticeNum>0); + + m_PanelShow->InitialVars(); + m_PanelShow->SetFocus(); +} +//--------------------------------------------------------------------------- + +void __fastcall THelpForm::FormDeactivate(TObject *Sender) +{ +// m_PanelShow->SaveFirstRow(); +} +//--------------------------------------------------------------------------- + +void __fastcall THelpForm::panelShowClick(TObject *Sender) +{ + m_PanelShow->SetFocus(); +} +//--------------------------------------------------------------------------- + +void __fastcall THelpForm::SetNoticeNum( int num, int iType ) +{ +// if( iType==1 && m_nUserNoticeNum!=num ){ +// m_nUserNoticeNum = num; +// +// m_pbUserNoticeNum->Visible = (num>0); +// if( num>0 ){ +// m_pbUserNoticeNum->Invalidate(); +// } +// +// if( m_arrTabs[TAB_NT]->Down ){ +// m_lblMsgNum->Caption = m_nUserNoticeNum; +// +// m_lblMsgHead->Visible = (num>0); +// m_lblMsgMiddle->Visible = (num>0); +// m_lblMsgNum->Visible = (num>0); +// m_lblMsgURL->Visible = (num>0); +// m_lblMsgTail->Visible = (num>0); +// +// m_PanelShow->InitialVars(); +// } +// } +} +//--------------------------------------------------------------------------- + +int __fastcall THelpForm::GetNoticeNum( int iType ) +{ + if( iType!=0 ) + return m_nUserNoticeNum; + + return 0; +} +//--------------------------------------------------------------------------- + +void __fastcall THelpForm::SetPage( int iPage ) +{ + for( int i=0; iDown = true; + m_arrTabs[i]->BringToFront(); + } + else{ + if( m_arrTabs[i]->Down ) + m_arrTabs[i]->Down = false; + m_arrTabs[i]->SendToBack(); + } + } + +// m_pbUserNoticeNum->BringToFront(); + + if( iPage==TAB_NT ){ + m_lblMsgNum->Caption = m_nUserNoticeNum; + } + else if( iPage==TAB_FB && ( m_memMsg->Text.IsEmpty() + || m_memMsg->Font->Color==clGray )){ + m_bMemoHint = true; + m_memMsg->Text = "请在此处输入您的问题"; + m_memMsg->Font->Color = clGray; + } + + m_lblMsgHead->Visible = (iPage==TAB_NT && m_nUserNoticeNum>0); + m_lblMsgMiddle->Visible = (iPage==TAB_NT && m_nUserNoticeNum>0); + m_lblMsgNum->Visible = (iPage==TAB_NT && m_nUserNoticeNum>0); + m_lblMsgURL->Visible = (iPage==TAB_NT && m_nUserNoticeNum>0); + m_lblMsgTail->Visible = (iPage==TAB_NT && m_nUserNoticeNum>0); + + m_btnSubmit->Visible = (iPage==TAB_FB); + m_memMsg->Visible = (iPage==TAB_FB); + + m_PanelShow->SetMode( iPage ); +} +//--------------------------------------------------------------------------- + +void __fastcall THelpForm::NoticeNumPaint(TObject *Sender) +{ + TPaintBox* pPB = (TPaintBox*)Sender; + String strText = IntToStr( m_nUserNoticeNum ); + + pPB->Canvas->Draw(0, 0, m_pImgNoticeTip); + pPB->Canvas->Brush->Style = bsClear; + pPB->Canvas->Font->Color = clWhite; + + int txtWidth = pPB->Canvas->TextWidth( strText ); + int txtHeight = pPB->Canvas->TextHeight( strText ); + + pPB->Canvas->TextOut( (pPB->Width - txtWidth)/2.0+0.5, + (pPB->Height -txtHeight)/2.0, + strText ); +} +//--------------------------------------------------------------------------- + +void __fastcall THelpForm::TabClick(TObject *Sender) +{ + int mode = ((TTabButton*)Sender)->Tag; + + if(mode==TAB_SW){ + PostMessage(Application->MainForm->Handle, UM_SHOWMORE, 0, 0); + } + else if(mode==TAB_MN){ + PostMessage(Application->MainForm->Handle, UM_OPENMANUAL, 0, 0); + } + else if(mode==TAB_AB){ + PostMessage(Application->MainForm->Handle, UM_SHOWABOUT, 0, 0); + } + else{ + SetPage( mode ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall THelpForm::UrlClick(TObject *Sender) +{ + if( Sender==m_lblUrl && m_lblUrl->Caption.Length()>0 ){ + ShellExecute(Handle,NULL, m_lblUrl->Caption.c_str(), NULL,NULL,SW_SHOWNORMAL); + } + else if( Sender==m_lblVideo ){ + ShellExecute(Handle,NULL, L"http://v.qq.com/boke/page/t/8/p/t01266qkg8p.html", + NULL,NULL,SW_SHOWNORMAL); + } +} +//--------------------------------------------------------------------------- + +void __fastcall THelpForm::SubmitClick(TObject *Sender) +{ + TProgressForm *frmProgress = new TProgressForm(NULL); + + int ret = frmProgress->User_SubmitQuestin( GBToUTF8(AnsiString(m_memMsg->Text.Trim().c_str()).c_str()).c_str() ); + int eExtra = frmProgress->GetOpertaionResult(); + delete frmProgress; + + if( ret==mrOk && eExtra==0 ){ + m_PanelShow->AddFeedback( m_memMsg->Text.Trim().c_str() ); + m_memMsg->Text = ""; + } + else if( eExtra!=0 && eExtra!=e_UserCanceled ){ + MessageForm->ShowMessage( "由于网络故障,信息提交失败。\n\n请稍后重试!", + MB_ICONERROR|MB_OK ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall THelpForm::MemoMsgChange(TObject *Sender) +{ +// + if( !m_bMemoHint && !m_memMsg->Text.Trim().IsEmpty() ){ + m_btnSubmit->Enabled = true; + } + else{ + m_btnSubmit->Enabled = false; + } +} +//--------------------------------------------------------------------------- + +void __fastcall THelpForm::MemoMsgClick(TObject *Sender) +{ +// + if( m_bMemoHint ){ + m_memMsg->Text = ""; + m_memMsg->Font->Color = clBlack; + m_bMemoHint = false; + } +} +//--------------------------------------------------------------------------- + +void __fastcall THelpForm::MsgURLClick(TObject *Sender) +{ + char strURL[256]; + f_CS_GetWebPageURL( URL_USERNOTICE, strURL ); + ShellExecute(Handle, NULL, ((String)strURL).c_str(), NULL, NULL, SW_SHOWNORMAL); +} +//--------------------------------------------------------------------------- + +void __fastcall THelpForm::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) +{ + switch( Key ){ + case VK_ESCAPE: + { + PostMessage( Application->MainForm->Handle, UM_SHOWHELP, false, 0 ); + } + break; + } +} +//--------------------------------------------------------------------------- + +void __fastcall THelpForm::WMNCLButtonDown(Winapi::Messages::TWMNCLButtonDown &Message) +{ + if( Window_state==HLP_WINDOW_NORMAL ) + TForm::Dispatch( &Message ); +} +//--------------------------------------------------------------------------- + + + +void __fastcall THelpForm::GenerPanelMouseEnter(TObject *Sender) +{ + THelpForm::SetFocus(); + Screen->Cursor = crDefault; +} +//--------------------------------------------------------------------------- + + diff --git a/HelpFormUnit.dfm b/HelpFormUnit.dfm new file mode 100644 index 0000000..f5b97e1 --- /dev/null +++ b/HelpFormUnit.dfm @@ -0,0 +1,673 @@ +object HelpForm: THelpForm + Left = 0 + Top = 0 + BorderIcons = [] + BorderStyle = bsNone + ClientHeight = 440 + ClientWidth = 777 + Color = 5064257 + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Position = poMainFormCenter + Scaled = False + Visible = True + OnActivate = FormActivate + OnClose = FormClose + OnCreate = FormCreate + OnDeactivate = FormDeactivate + OnKeyDown = FormKeyDown + OnResize = FormResize + DesignSize = ( + 777 + 440) + TextHeight = 13 + object m_GenerPanel: TGeneralDialogPanel + Left = 0 + Top = 0 + Width = 777 + Height = 440 + Anchors = [akLeft, akTop, akRight, akBottom] + BevelEdges = [beLeft, beRight] + BevelOuter = bvNone + Caption = #24110#21161 + Color = 5064257 + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentBackground = False + ParentDoubleBuffered = False + ParentFont = False + TabOrder = 0 + OnMouseEnter = GenerPanelMouseEnter + DesignSize = ( + 777 + 440) + object m_lblGroupLabel: TLabel + Left = 77 + Top = 405 + Width = 90 + Height = 14 + Align = alCustom + AutoSize = False + Caption = #25216#26415#20132#27969'QQ'#32676#65306 + Font.Charset = DEFAULT_CHARSET + Font.Color = 12434616 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object m_lblGroup: TLabel + Left = 171 + Top = 405 + Width = 63 + Height = 14 + Align = alCustom + AutoSize = False + Caption = '271573952' + Font.Charset = DEFAULT_CHARSET + Font.Color = 12434616 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearType + ParentFont = False + ShowAccelChar = False + end + object m_lblVideoLabel: TLabel + Left = 545 + Top = 405 + Width = 60 + Height = 14 + Align = alCustom + AutoSize = False + Caption = #35270#39057#25945#31243#65306 + Font.Charset = DEFAULT_CHARSET + Font.Color = 12434616 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object m_lblVideo: TLabel + Left = 611 + Top = 405 + Width = 59 + Height = 14 + Cursor = crHandPoint + Align = alCustom + AutoSize = False + BiDiMode = bdLeftToRight + Caption = #22312#32447#35266#30475 + Font.Charset = DEFAULT_CHARSET + Font.Color = 15299907 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearType + ParentBiDiMode = False + ParentFont = False + ShowAccelChar = False + OnClick = UrlClick + end + object m_lblUrlLabel: TLabel + Left = 278 + Top = 405 + Width = 72 + Height = 14 + Align = alCustom + AutoSize = False + BiDiMode = bdLeftToRight + Caption = #21809#20316#32593#35770#22363#65306 + Font.Charset = DEFAULT_CHARSET + Font.Color = 12434616 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentBiDiMode = False + ParentFont = False + Visible = False + end + object m_lblUrl: TLabel + Left = 356 + Top = 405 + Width = 157 + Height = 14 + Cursor = crHandPoint + Align = alCustom + AutoSize = False + BiDiMode = bdLeftToRight + Caption = 'http://bbs.iChangzuo.com' + Font.Charset = GB2312_CHARSET + Font.Color = 15299907 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearType + ParentBiDiMode = False + ParentFont = False + ShowAccelChar = False + Visible = False + OnClick = UrlClick + end + object m_btnMin: TPNGButton + Left = 701 + Top = 6 + Width = 23 + Height = 13 + ParentCustomHint = False + Anchors = [akTop, akRight] + ImgStates = 3 + ParentShowHint = False + PngImg.Data = { + 89504E470D0A1A0A0000000D49484452000000450000000D0806000000FF86A3 + 28000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F330000018D4944415478DAED97CB4AC34018 + 852769ED458D552BD28D5DD69550C4B50FE0C28775E103B81629B8D2A56E44BC + D5A8BD99C4F39B3332849A964C2A54FAC3E10CB3383DF93A4D52278A22358B09 + 82402F1DC8355CAF9D2962222AA422C35522C735D6D3662B23F3E7F31C138A71 + 21798D942B4045AA6CAC0B13CA4B3129F4490D8C7590C8778D4C0D7ED268D0FA + 33F47AE650A4E412612C43ABF432F7D3CA4BC911617C406FF401F72303788999 + A5049CB46C0D63C8CCA1069E842285EB503503801EF4C8E27AA46005F2A07568 + 8BEE71BF98922705FB900FBD400F749FFB21C156D8D7B300EEB3BFE48E925076 + DAFB073719807C4FE7E2BC09BB35B64A2CBB0935907D66917D08BB839E781121 + 01AC4035645F5B64B7605DE85D4025A1B4107E6511BE0B33CBC9B7B8066D4302 + FCD422FB48C5C0EFA157151F7F9DBF81EC4B8BEC3DD83373FB7F01A50635A026 + B24F2CB28F61728AE5B47409A54A287564772CB2DB2AFEE90B94DEE2A4A8C927 + 65714F19734F593C7DC63C7DB2C2FE6DFEC57B4ADE50E6FF8D36CF99E7FF3E5F + B19A31A2907770F30000000049454E44AE426082} + ShowHint = False + OnClick = MinClick + end + object m_btnMax: TPNGButton + Left = 728 + Top = 4 + Width = 21 + Height = 18 + ParentCustomHint = False + Anchors = [akTop, akRight] + ImgStates = 3 + ParentShowHint = False + PngImg.Data = { + 89504E470D0A1A0A0000000D494844520000003F000000120806000000EC6D06 + 37000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F330000029D4944415478DAED98CB4F534114 + C66F4B0BC5DA4041C4F7A2822ED8106835F11F30C68D3182AC4C342A2C5918B7 + C62D71E1529448C20AC11837C6F80F98688B61E342C52E7CE30B0D8F8278BD7E + C7FB8D39DE78C15E6051CB245F663A9D7EF7FCCE9C195A428EE358ABD56CDBD6 + 2F435058F5661C5AC2C2A17E508EEA2DCFE7C36ABC9CA7A5BC7E3F27A4E13DC1 + AFA44930155084AA52E30A9F60251009E03BB5A0C6B6C737ACBC4C62FD9A49A4 + F136E3358397A0A284AE86E2500CAA54F0BAE4CC6B09E01B340FCD4205266191 + EF9B841AEFA84A809FA7815D545EBF12EA85DF80AE9E01FF6B93003F41736A2E + 42D88D500D94E4B84AED92CDE0CC6E9A5D920067A029E82BC7F37CCF9B505351 + 61F579E3A9E74C25FD91502FFCCED6B6F48B62B779FC516E17BA976A4A763841 + E80678DE0FE07900DD0726619A10022B1B9480E7F3009EBBE9251BB5E085DF03 + D327014CF7A27BAAA664D765C737435BE1792F80E741746FA1F7965B015229D5 + 4C6A0D3C1F07F06CA19724A0E00BDFDCD474777464F82233EF6DC98ECEAE0BCF + 26260EF9C04B9075D01668073C6FCB6426937E78ADFFCA301F2E41C8F9AE64A2 + 1267BA7BBAB2D9DC3E7A1E41F70A7A077DB6DCD28D736D2D3CC7655D2A95BA73 + EBE6C865CB3D1A05AE8B3086D8D1639DBDF97CFE303D5BD17DE1B36797833F89 + E1E45FE01B013FB804BC94E626681BE14765329D6E7F3070B57F88301F19708C + 6BEB4E9FED3E91CB8DEDA76707E1DF70AD40C9BD514BF831057FC972CFB3DC0F + 72A145B9360EF8730ABE9DF0A299B5846F80B613FE8682BF4E984905DF280900 + FC29057F9CF0AF2DF7EC1B78B94792F0CC2AF83E56D3B4AA26391E09C09F57F0 + 1956F2D43AFC7AD9FBC397E785574CFB5FFED495F5979CB2FE7A5B6C32FD5A49 + FEB0592DF8D2FB49BBD2566AFFCCF80990017597BCE4EA990000000049454E44 + AE426082} + ShowHint = False + OnClick = MaxClick + end + object m_btnRest: TPNGButton + Left = 729 + Top = 2 + Width = 22 + Height = 22 + ParentCustomHint = False + Anchors = [akTop, akRight] + ImgStates = 3 + ParentShowHint = False + PngImg.Data = { + 89504E470D0A1A0A0000000D4948445200000042000000160806000000744B4A + 09000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F33000005D84944415478DACD98596C546514 + C7CFEC4B67A69556B08D1A7868AB8911A10B2856D29652048AB410E3B3FAA4AF + FAE2032F2E212A2E0F466254822F060D04DBB2D4053586D46E208440AD0FB884 + D20296765A8AED6C9E33FD7F9D6FBEDE990E50083739F9BEB973EFFF9EFBBBE7 + 9C6FB1251209BA13472C1693C6C666D75AD5B7199727607158426BC9E17058E9 + 2A0DBBD6B7D2254D6FF659B63B08429C923770C23C5ADFA1392D0EC9DB456153 + 5A5FCE270C100A8203109C5ADF6EB8A1C02A7DD55F7810F842568738E76273B3 + F9D8F2D0BA34C795B3221261BBCE760DED34CE990FB0E37E07B43D86A60E58D7 + 9E82A6FC8E6505C12FE5E7A6100E673BC4D17FD926B35C235FCA0B0021B67BD0 + 77E33FDDE1289C140857D9C2E8FF87FF4C102E00107D3FA5A2CD0A848AB249E8 + 493F321F88071E5B59F937E570FC76A2F7416EFE314EEB35C10B00056C45ACFB + 738EBAABB8B9C236C6360E407A4D706B00F258772047DD65802B40A6D2405884 + 75190BFF9EA3703937BA13664D10088B0402DB62D6DD97A36E1D379734185394 + 5E13549A05E419ACDB9DA3EE43003BC1763D67107CE33A9AFBC52562BECF00C2 + AC090261B1CD662BE2674A44ECC67DAFD3CC57D60BA28DFFDF85FF377033CC76 + 996D0420F49A200082CAF8BE63B86F3BA58AA2B4C95187FFEFC0FF8FD04CCA09 + 8C6B2608B3262CD56E6CE4E64F9C5735E17E0D9409C2AC094B0484E8338C82E5 + 2B2ADE968B4E9DECDB4933B91A615FA4884500E23DE86EE6660820AEE05ABD26 + 88763E8004F8BE76E83E074D05380ADDA3D07D540331618248AB092525253438 + 3838A70F21A909BE2C20DCF84AE26451F5EA27BAFC7E3F0503010A068374F6DC + B9E445D5D555343D3D4D0C873C6E0FEDFEF8A357E53CEBBE03DD2644C425C098 + 0684644DA8A85A75DEE3F1909897EDE2D0505277D9D2A5B311EE743AE9C0FEAF + 3721220E4377394084AD40A4D5047138140A25FBE17098C6C7C77510E5703813 + 08AF8220915059BDFA98D7EB25311F5B3C1E279BDD96FC1D8D4693CE0618D2DE + 3D9FBFC63EC5597767061011446C3225565656F7BB5C2E5226BA76D6753A5D94 + 903ECF393C6E37B5B77DB385750544DB0D81404D18ECEDED9354A1CACA0A4985 + 12A3266403A1EAC2BD9216ECF05171B4ABF3F82BF2288E2E1F4781BDB8B85872 + DEFD4CF3B6370BF2F3E98BBD7B7600C41B195223827493680BB1EE19BBDD4EBD + DDBF4A2D490C0C0C0424BCCA4A4B653470D637AC6FF5F97C74A8ADB519200EE6 + 921A65C68BFD41E9E370D9E36B6AFA254A3A8E1C5ACFBFE3598AA51FD12020EE + 6387DBE1F04BA83112B7768479B0B965FBBB858585F4D9A79FBC2579CDBA3BA0 + 6B16CB18A50A64684545D56949AB13BDDDB5949A70A9B9856F5D43E3913C8EB4 + D683079E65DD18EBEE876ED6625996E50BCBF1F0868D9BCF8E8C8C24F35A3F32 + 801008522097B0C36D70F8053C5C9C76E0EB2EDADAB2EDFD0B170629128998BA + E6F0190708C959192E4F89EEC9BE9E1A2BC0F50D8D1DA3A3A37346C4F986CF5B + 01614EA8D240486EC2E1E7F125D430282F55D4B465EB0743C3C35620CC091599 + 2070DD930011256D025757DFF0ED18D7370B10592754F381283752E32F9CB79A + 62A7A5861AD658F7453810A1D484A8E0E94D4D1F86B8387FB5EF4BA92161F66B + 14297191D2A7D8763D3558F734746B28B540936B64D4CA5B5B5BF79DD7EB137F + 37C2CF09401DA34C536C8B6279231328F3482B96DAF8FD321EAEE7725E6D7DC3 + 2E296A87DB5B05D45580BD8C565F74C93DB3C59275CF40B796522B4AB510F3AC + A979AAC3C523C84F3FFEB01630553A4C50A64597397C663B741016FB0344C6F0 + A9667CFA21C553D2C5C9F73B5D4E82C32D7879B11138AECF3A9DA40D9FACDB6F + EA8AA698E83BD86408ED3CFE4B8506621270AD97E137BBC8CA00226D42C5BA5D + 563AE2AC725EFA3D5D9D358020A12B2921E1AB6FCCA8BD0CB5C83A6FA5AB60A8 + 7E5F4F572900A855A72A727337666E76D99D01C45DBDECA6D40ED50CAC79165D + 391D1940DCD51B310A84F2FD768258B0AD39E3710BB23547C6FEE7EDDEAA5B90 + CD5A8BE396376BCD8FF83F04188E95BC34C8D60000000049454E44AE426082} + ShowHint = False + Visible = False + OnClick = RestClick + end + object m_pbUserNoticeNum: TPaintBox + Left = 270 + Top = 36 + Width = 20 + Height = 20 + ParentCustomHint = False + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -9 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + Visible = False + OnPaint = NoticeNumPaint + end + object m_btnSubmit: TTextButton + Left = 582 + Top = 219 + Width = 83 + Height = 30 + ParentShowHint = False + ShowHint = True + Visible = False + OnClick = SubmitClick + Text = #25552#20132 + end + object m_lblMsgHead: TLabel + Left = 76 + Top = 81 + Width = 30 + Height = 18 + Anchors = [] + Caption = #24744#26377 + Font.Charset = DEFAULT_CHARSET + Font.Color = 13158340 + Font.Height = -15 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearType + ParentFont = False + Visible = False + end + object m_lblMsgNum: TLabel + Left = 106 + Top = 81 + Width = 24 + Height = 18 + Alignment = taCenter + Anchors = [] + AutoSize = False + Caption = '000' + Font.Charset = DEFAULT_CHARSET + Font.Color = 327893 + Font.Height = -15 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearType + ParentFont = False + Visible = False + end + object m_lblMsgMiddle: TLabel + Left = 130 + Top = 81 + Width = 105 + Height = 18 + Anchors = [] + Caption = #26465#26410#35835#28040#24687#65292#35831 + Font.Charset = DEFAULT_CHARSET + Font.Color = 13158340 + Font.Height = -15 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearType + ParentFont = False + Visible = False + end + object m_lblMsgURL: TLabel + Left = 238 + Top = 81 + Width = 90 + Height = 18 + Cursor = crHandPoint + Anchors = [] + Caption = #36827#20837#20010#20154#31354#38388 + Font.Charset = DEFAULT_CHARSET + Font.Color = 15299907 + Font.Height = -15 + Font.Name = 'Tahoma' + Font.Style = [fsUnderline] + Font.Quality = fqClearType + ParentFont = False + Visible = False + OnClick = MsgURLClick + end + object m_lblMsgTail: TLabel + Left = 330 + Top = 81 + Width = 45 + Height = 18 + Anchors = [] + Caption = #26597#38405#12290 + Font.Charset = DEFAULT_CHARSET + Font.Color = 13158340 + Font.Height = -15 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearType + ParentFont = False + Visible = False + end + object m_memMsg: TMemo + Left = 78 + Top = 115 + Width = 587 + Height = 130 + Font.Charset = DEFAULT_CHARSET + Font.Color = clGray + Font.Height = -15 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearType + ImeName = #20013#25991'('#31616#20307') - '#25628#29399#25340#38899#36755#20837#27861 + Lines.Strings = ( + #35831#22312#27492#22788#36755#20837#24744#30340#38382#39064) + MaxLength = 106 + ParentFont = False + ParentShowHint = False + ShowHint = False + TabOrder = 0 + Visible = False + OnChange = MemoMsgChange + OnClick = MemoMsgClick + end + end +end diff --git a/HelpFormUnit.h b/HelpFormUnit.h new file mode 100644 index 0000000..c259089 --- /dev/null +++ b/HelpFormUnit.h @@ -0,0 +1,118 @@ +//--------------------------------------------------------------------------- + +#ifndef HelpFormUnitH +#define HelpFormUnitH + +#define HLP_WINDOW_MAX 0 +#define HLP_WINDOW_NORMAL 1 +#define HLP_WINDOW_MIN 2 + +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include +#include "GeneralDialogPanel.h" +#include "PNGButton.hpp" +#include "MessageDef.h" +#include "HelpPanelUnit.h" +#include "TextButton.h" +#include "CapButton.h" + +#define TAB_NUM 7 + +#define TAB_QA 0 +#define TAB_FB 1 +#define TAB_NT 2 +#define TAB_CN 3 +#define TAB_SW 4 +#define TAB_MN 5 +#define TAB_AB 6 +//--------------------------------------------------------------------------- +class TTabButton : public TPNGButton +{ +private: + virtual void __fastcall Paint(void); +public: + String Caption; + void __fastcall SetFontSize(int sz); + __fastcall virtual TTabButton(System::Classes::TComponent* AOwner); + __fastcall virtual ~TTabButton(void); +}; + + +class THelpForm : public TForm +{ +__published: // IDE-managed Components + TGeneralDialogPanel *m_GenerPanel; + TLabel *m_lblGroupLabel; + TLabel *m_lblGroup; + TLabel *m_lblVideoLabel; + TLabel *m_lblVideo; + TLabel *m_lblUrlLabel; + TLabel *m_lblUrl; + TPNGButton *m_btnMin; + TPNGButton *m_btnMax; + TPNGButton *m_btnRest; + TPaintBox *m_pbUserNoticeNum; + TMemo *m_memMsg; + TTextButton *m_btnSubmit; + TLabel *m_lblMsgHead; + TLabel *m_lblMsgNum; + TLabel *m_lblMsgMiddle; + TLabel *m_lblMsgURL; + TLabel *m_lblMsgTail; + + void __fastcall FormClose(TObject *Sender, TCloseAction &Action); + void __fastcall RestClick(TObject *Sender); + void __fastcall MinClick(TObject *Sender); + void __fastcall MaxClick(TObject *Sender); + void __fastcall FormResize(TObject *Sender); + void __fastcall FormCreate(TObject *Sender); + void __fastcall FormActivate(TObject *Sender); + void __fastcall FormDeactivate(TObject *Sender); + void __fastcall NoticeNumPaint(TObject *Sender); + void __fastcall UrlClick(TObject *Sender); + void __fastcall SubmitClick(TObject *Sender); + void __fastcall MemoMsgChange(TObject *Sender); + void __fastcall MemoMsgClick(TObject *Sender); + void __fastcall MsgURLClick(TObject *Sender); + void __fastcall FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift); + void __fastcall GenerPanelMouseEnter(TObject *Sender); +private: +// void __fastcall AboutClick(TObject *Sender); +// void __fastcall HelpClick(TObject *Sender); + void __fastcall TabClick(TObject *Sender); + void __fastcall panelShowClick(TObject *Sender); + +private: // User declarations + THelpPanel* m_PanelShow; + TPngImage* m_PngImage; + + bool m_bMemoHint; + int m_nUserNoticeNum; + + TTabButton* m_arrTabs[8]; //8ťָ + TPngImage * m_pImgNoticeTip; + + MESSAGE void __fastcall WMNCLButtonDown(Winapi::Messages::TWMNCLButtonDown &Message); + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(WM_NCLBUTTONDOWN, TWMNCLButtonDown, WMNCLButtonDown) + END_MESSAGE_MAP(TForm) + +public: // User declarations + int Window_state; + + void __fastcall SetSize( int iState ); + void __fastcall SetNoticeNum( int num, int iType ); //iTyp: 0=public, 1=user + int __fastcall GetNoticeNum( int iType ); //iTyp: -1=all, 0=public, 1=user + void __fastcall SetPage( int iPage ); + + __fastcall THelpForm(TComponent* Owner); +}; +//--------------------------------------------------------------------------- +extern PACKAGE THelpForm *HelpForm; +//--------------------------------------------------------------------------- +#endif diff --git a/HelpPanelUnit.cpp b/HelpPanelUnit.cpp new file mode 100644 index 0000000..2d4bf72 --- /dev/null +++ b/HelpPanelUnit.cpp @@ -0,0 +1,769 @@ +//--------------------------------------------------------------------------- + +#pragma hdrstop + +#include "HelpPanelUnit.h" +#include "GlobalUnit.h" + +char u_strURLAndroid[256] = "/ichangzuo/File/Software/App/Ac/Android/Ac_Android.apk", + u_strURLiOS[256] = "http://itunes.apple.com/cn/app/id928747575"; + +const static COLORREF clrEnter = RGB( 100,180,236 ), + clrLeave = RGB( 67,117,233 ); +//--------------------------------------------------------------------------- +#pragma package(smart_init) + +__fastcall THelpPanel::THelpPanel(TComponent* AOwner) + : Vcl::Extctrls::TPanel(AOwner) +{ + m_sbVert = NULL; + + m_nLeftBound = 15; + m_nRightBound = 48; + m_nTopBound = 15; + m_nBottomBound = 25; + + m_nRowWidth = 0; + m_nRowHight = 22; + + m_iMode = 0; + m_nBeginShowRow = 0; + + for( int i=0; iFont->Size = 11; //ĸС + Canvas->Font->Quality = TFontQuality::fqClearTypeNatural; + + for( int i=0; iParent = this; + m_sbVert->m_pWndCtrl = this; + m_sbVert->Visible = false; + m_sbVert->Left = Width - m_sbVert->Width - 1; //change + m_sbVert->Top = 1; + m_sbVert->Height = Height-2; + m_sbVert->Visible = false; + + CalcViewArea(); + + m_lblCoinPage = new TLabel( NULL ); + m_lblCoinPage->Visible = false; + m_lblCoinPage->Parent = this; + m_lblCoinPage->Font->Name = "Tahoma"; + m_lblCoinPage->Font->Size = Canvas->Font->Size; + m_lblCoinPage->Font->Style = TFontStyles()<Font->Color = clrLeave; + m_lblCoinPage->Caption = "ϸ˵"; + m_lblCoinPage->OnClick = LinkClick; + m_lblCoinPage->OnMouseEnter = LinkMouseEnter; + m_lblCoinPage->OnMouseLeave = LinkMouseLeave; + + m_lblCoinPage->Left = m_nLeftBound + 20; +// m_lblCoinPage->Top = 1; + + for( int i=0; iVisible = false; + m_aLblSWName[i]->Parent = this; + m_aLblSWName[i]->Font->Name = g_strTxtFontName; + m_aLblSWName[i]->Font->Color = COLOR_ANSWER; +// if( !strcmp( g_strTxtFontName, "΢ź" ) ) +// m_aLblSWName[i]->Font->Size = 11; +// else +// m_aLblSWName[i]->Font->Size = 10; + m_aLblSWName[i]->Font->Size = g_szFont10; + m_aLblSWName[i]->Left = m_nLeftBound + 10; + + if( i==0 ){ + m_aLblSWName[i]->Top = m_nTopBound + 10; + } + else if( i==1 ){ + m_aLblSWName[i]->Top = m_aLblSWName[i-1]->Top + 90; + } + else{ + m_aLblSWName[i]->Top = m_aLblSWName[i-1]->Top + 110; + } + + m_aLblSWLink[i] = new TLabel( NULL ); + + m_aLblSWLink[i]->Visible = false; + m_aLblSWLink[i]->Parent = this; + m_aLblSWLink[i]->Tag = i; + m_aLblSWLink[i]->Font->Name = "Tahoma"; + m_aLblSWLink[i]->Font->Size = g_szFont9; + m_aLblSWLink[i]->Font->Style = TFontStyles()<Font->Color = clrLeave; + m_aLblSWLink[i]->Caption = ""; + m_aLblSWLink[i]->OnClick = LinkClick; + m_aLblSWLink[i]->OnMouseEnter = LinkMouseEnter; + m_aLblSWLink[i]->OnMouseLeave = LinkMouseLeave; + + m_aLblSWLink[i]->Left = 250; + m_aLblSWLink[i]->Top = m_aLblSWName[i]->Top + 1; + } + + m_aLblSWName[0]->Caption = "ħ for Windows"; + m_aLblSWName[1]->Caption = "ħApp for Android"; + m_aLblSWName[2]->Caption = "ħApp for iOS"; + + if( f_QR_Encode ){ + char strURL[256] = ""; + f_CS_GetWebPageURL( URL_HOMEPAGE, strURL ); + strcat( strURL, u_strURLAndroid ); + + m_pQRdataAndroid = new unsigned char[100*100]; + m_pQRdataiOS = new unsigned char[100*100]; + int qrWidthA = f_QR_Encode( strURL, m_pQRdataAndroid ), + qrWidthI = f_QR_Encode( u_strURLiOS, m_pQRdataiOS ); + + m_pQRPanelAndroid = new TQRcodePanel( NULL, "ɨ" ); + if( m_pQRPanelAndroid ){ + m_pQRPanelAndroid->Hide(); + m_pQRPanelAndroid->Parent = this; + m_pQRPanelAndroid->SetBounds( 350, 75, 100, 100 ); + m_pQRPanelAndroid->SetQRData( qrWidthA, m_pQRdataAndroid ); + } + + m_pQRPaneliOS = new TQRcodePanel( NULL, "ɨ" ); + if( m_pQRPaneliOS ){ + m_pQRPaneliOS->Hide(); + m_pQRPaneliOS->Parent = this; + m_pQRPaneliOS->SetBounds( 350, 195, 100, 100 ); + m_pQRPaneliOS->SetQRData( qrWidthI, m_pQRdataiOS ); + } + } +} +//--------------------------------------------------------------------------- + +__fastcall THelpPanel::~THelpPanel() +{ + for( int i=0; iFont->Size = sz; + + if( m_lblCoinPage ) + m_lblCoinPage->Font->Size = sz; +} +//--------------------------------------------------------------------------- + +void THelpPanel::InitialVars() +{ + RefreshTextLines(); + CalcViewArea(); + Invalidate(); +} +//--------------------------------------------------------------------------- + +void THelpPanel::ScrollView( int nPos, bool bRedraw ) +{ + if( m_nBeginShowRow!=nPos ){ + m_nBeginShowRow = nPos; + + Invalidate(); + } + + if( bRedraw ){ + m_sbVert->SetPosition( nPos ); + } +} +//--------------------------------------------------------------------------- + +void THelpPanel::CalcViewArea() +{ + if( !m_sbVert ) + return; + + m_nRowNum = m_lstLines.size(); + + if( m_nRowNum>0 ){ + int iFirstRow = m_aFirstRow[m_iMode]; + if( iFirstRow<0 ){ + int iFirstTitle = m_aFirstTitle[m_iMode]; + for( iFirstRow=0; iFirstRow0; iFirstRow++ ){ + if( m_lstLines[iFirstRow]->strText.empty() ){ + iFirstTitle--; + } + } + } + + m_nBeginShowRow = iFirstRow; + } + + if( m_nRowNum>m_nRowShow ){ //ʾ + m_sbVert->Visible = true; + m_sbVert->SetRange( 0, m_nRowNum-1 ); + m_sbVert->SetPageSize( m_nRowShow ); + m_sbVert->SetPosition( 0 ); + + //ʾĵһ + + int iRowScroll = 0; + if( m_nBeginShowRow>0 ){ + iRowScroll = min( m_nBeginShowRow, m_nRowNum-m_nRowShow ); + if( iRowScroll<0 ){ + iRowScroll = 0; + } + } + + ScrollView( iRowScroll ); + } + else{ + m_nBeginShowRow = 0; + m_sbVert->Visible = false; + } +} +//--------------------------------------------------------------------------- + +void __fastcall THelpPanel::Paint() +{ + if( m_iMode<5 && !m_lstLines.empty() ){ + int xPos = m_nLeftBound, + yPos = m_nTopBound; + TColor clrOld = Canvas->Font->Color; + Canvas->Brush->Style = bsClear; + + int flag = 0; + for( int i=0; iflag>0 && pLine->flag!=flag ){ + flag = pLine->flag; + if( flag==1 ){ + Canvas->Font->Color = COLOR_QUESTION; + + if( m_iMode<2 ) + Canvas->Font->Style = TFontStyles()<Font->Color = COLOR_ANSWER; + Canvas->Font->Style = TFontStyles(); + } + } + + if( i>=m_nBeginShowRow ){ + char strFlag[10]; + if( pLine->flag==1 ){ + if( m_iMode<2 ) + strcpy( strFlag, "Q:" ); + else{ + strcpy( strFlag, "" ); + } + + Canvas->TextOut( xPos, yPos, strFlag ); + } + else if( pLine->flag==2 ){ + if( m_iMode<2 ) + strcpy( strFlag, "A:" ); + else{ + strcpy( strFlag, " " ); + } + + Canvas->TextOut( xPos, yPos, strFlag ); + } + else if(pLine->flag == 3) + { + strcpy( strFlag, "" ); + Canvas->Font->Color = RGB( 207,169,207 ); //question Color + Canvas->Font->Style = TFontStyles() << fsBold; + Canvas->TextOut( xPos, yPos, strFlag ); + //Canvas->Font->Color = RGB(0, 0, 255); + } + + Canvas->TextOut( xPos+20, yPos, pLine->strText.c_str() ); + + yPos += m_nRowHight; + } + + if( i-m_nBeginShowRow >= m_nRowShow ){ + break; + } + } + + Canvas->Font->Color = clrOld; + Canvas->Font->Style = TFontStyles(); + } + + Canvas->Pen->Color = RGB( 53,56,63 ); + Canvas->MoveTo( 39 + m_iMode*70 ,0 ); + Canvas->LineTo( 39 + m_iMode*70 + 78,0 ); +} +//--------------------------------------------------------------------------- + +void __fastcall THelpPanel::WMEraseBkgnd(Winapi::Messages::TWMEraseBkgnd &Message) +{ + TCanvas* tempCanvas = new TCanvas; + tempCanvas->Handle = Message.DC; + TRect rect = GetClientRect(); + //Ƶͼ + tempCanvas->Brush->Color = RGB( 53,56,63 ); + tempCanvas->FillRect(rect); + + //߿ + tempCanvas->Brush->Color = RGB( 43,47,50 ); + + tempCanvas->FrameRect(rect); + + delete tempCanvas; + + Message.Result = true; +} +//--------------------------------------------------------------------------- +void __fastcall THelpPanel::WMSize(Winapi::Messages::TWMSize &Message) +{ + DefaultHandler( &Message ); + + if( m_sbVert ){ + m_sbVert->Left = Width - m_sbVert->Width - 1; + m_sbVert->Top = 1; + m_sbVert->Height = Height - 2; + } + + m_nRowWidth = Width - m_nLeftBound - m_nRightBound; + m_nRowShow = (Height - m_nTopBound - m_nBottomBound) / m_nRowHight; + + SaveFirstRow(); + for(int i=0; iGetScrollRange(&minpos, &maxpos); + page = m_sbVert->GetPageSize(); + // Get the current position of scroll box. + curpos = m_sbVert->GetScrollPos(); + + // Determine the new position of scroll box. + switch (Message.ScrollCode) + { + case SB_TOP: // Scroll to far top. + curpos = minpos; + break; + + case SB_BOTTOM: // Scroll to far bottom. + curpos = maxpos-page+1; + break; + + case SB_ENDSCROLL: // End scroll. + break; + + case SB_LINEUP: // Scroll left. + if (curpos > minpos) + curpos--; + break; + + case SB_LINEDOWN: // Scroll right. + if (curpos < maxpos-page+1) + curpos++; + break; + + case SB_PAGEUP: // Scroll one page left. + if (curpos > minpos) + curpos = (minpos > curpos-page) ? minpos : curpos-page; + //max(minpos, curpos-page); + break; + + case SB_PAGEDOWN: // Scroll one page right. + if( curposHandle ) + m_sbVert->SetPosition(curpos); + + ScrollView(curpos, FALSE); + + Message.Result = true; +} +//--------------------------------------------------------------------------- + +void __fastcall THelpPanel::WMMouseWheel(TWMMouseWheel &Message) +{ + if( m_sbVert->Visible ){ + UINT nSBCode; + + if( Message.WheelDelta>0 ) nSBCode = SB_LINEUP; + else nSBCode = SB_LINEDOWN; + + Perform( WM_VSCROLL, MAKELONG(nSBCode,0), NULL ); + } +} +//--------------------------------------------------------------------------- + +void THelpPanel::SetMode( int iMode ) +{ + if( iMode>4 ) + return; + + if( m_iMode != iMode ){ + SaveFirstRow(); + + if( iMode==0 || iMode==3){ + m_nTopBound = 15; + } + else if( iMode==2 ){ + m_nTopBound = 60; + } + else{ + m_nTopBound = 160; + } + + m_nRowShow = (ClientHeight - m_nTopBound - m_nBottomBound) / m_nRowHight; + + m_iMode = iMode; + + RefreshTextLines(); + CalcViewArea(); + + Invalidate(); + } + + if( m_pQRPanelAndroid ) + m_pQRPanelAndroid->Visible = m_iMode==4; + if( m_pQRPaneliOS ) + m_pQRPaneliOS->Visible = m_iMode==4; + + for( int i=0; iVisible = m_iMode==4; + if( m_aLblSWLink[i] ) + m_aLblSWLink[i]->Visible = m_iMode==4; + } + + m_lblCoinPage->Visible = m_iMode==3; +} +//--------------------------------------------------------------------------- + +void THelpPanel::RefreshTextLines() +{ + int i; + //б + for( i=0; i0 ){ + TSTRINGPAIR* arrString = new TSTRINGPAIR[num]; + bool bRevert = true; + + if( m_iMode==0 ){ + f_CS_GetQnA( num, arrString, false, 0 ); + bRevert = false; + } + else if( m_iMode==1 ) + f_CS_GetQnA( num, arrString, true, idUser ); + else if( m_iMode==2 ) + f_CS_GetNotice( num, arrString, idUser ); + + for( i=(bRevert?num-1:0); bRevert?i>=0:iflag = 1; //question + int nWidth = 0; + int iStart = 0; + for(int j=0; jTextWidth( strQ[j] ); + if( nWidth>=m_nRowWidth || strQ[j]=='\n' ){ + pLine->strText = strQ.substr( iStart, j-iStart ); + + if( strQ[j]=='\n' ) j++; + + iStart = j; + nWidth = 0; + + m_lstLines.push_back( pLine ); + + if( iStartstrText = strQ.substr( iStart, strQ.size()-iStart ); + m_lstLines.push_back( pLine ); + } + + wstring strA; + if( m_iMode==2 ){ + AnsiString strSpace= L" "; + AnsiString anStr = arrString[i].str2; + int pos = 0; + while( pos = anStr.Pos( strSpace ) ){ + anStr.Delete( pos, strSpace.Length() ); + anStr.Insert( L" ", pos ); + } + strA = str2wstr( UTF8ToMBCS( anStr.c_str() ) ); + } + else{ + strA = str2wstr( UTF8ToMBCS( arrString[i].str2 ) ); + } + + pLine = new TLineString; + pLine->flag = 2; //answer + if( strA.size()>0 ){ + nWidth = 0; + iStart = 0; + for(int j=0; jTextWidth( strA[j] ); + if( nWidth>=m_nRowWidth || strA[j]=='\n' ){ + pLine->strText = strA.substr( iStart, j-iStart ); + + if( strA[j]=='\n' ) j++; + + iStart = j; + nWidth = 0; + + m_lstLines.push_back( pLine ); + + if( iStartstrText = strA.substr( iStart, strA.size()-iStart ); + m_lstLines.push_back( pLine ); + } + } + else{ + if( m_iMode==2 ){ + pLine->strText = L""; + } + else{ + pLine->strText = L"ʱûд"; + } + m_lstLines.push_back( pLine ); + } + + if( bRevert ? i>0 : istrText.empty() ){ + iFirstTitle++; + } + } + + m_aFirstRow[m_iMode] = iFirstRow; + m_aFirstTitle[m_iMode] = iFirstTitle; +} +//--------------------------------------------------------------------------- + +void THelpPanel::ReadData() +{ + String str = L"@˵\n dzңڳħʹл\ + õ\n@ȡ;\n ҪԴֱӳֵһڳ\ + Ҳɻȡ\n ⣬עûʱҲһ\n"; + //String(m_CharBuf); + + wchar_t *data = str.c_str(); + + TLineString *pLine = new TLineString; + + int nWidth = 0; + int iStart = 0; + + for(int i = 0; i < str.Length(); i++) + { + nWidth += Canvas->TextWidth(String(data[i])); + + if( nWidth >= m_nRowWidth || data[i] == '\n' ){ + if(data[iStart] == L'@'){ + pLine->strText = (str.SubString(iStart + 2, i - iStart + 1)).c_str(); + pLine->flag = 3; + } + else{ + pLine->flag = 4; + pLine->strText = (str.SubString(iStart + 1, i - iStart + 1)).c_str(); + } + + + if(data[i] == '\n'){ + i++; + } + + iStart = i; + + nWidth = 0; + m_lstLines.push_back(pLine); + pLine = new TLineString; + } + } + + pLine->strText = (str.SubString(iStart, str.Length() - iStart + 1)).c_str(); + pLine->flag = 4; + m_lstLines.push_back(pLine); + + m_lblCoinPage->Top = m_nTopBound + ( m_lstLines.size() + 1 ) * m_nRowHight; +} +//--------------------------------------------------------------------------- + +bool THelpPanel::HasScrollBar() +{ + return m_sbVert?m_sbVert->Visible:0; +} +//--------------------------------------------------------------------------- + +void __fastcall THelpPanel::LinkClick(TObject *Sender) +{ + char strURL[256]; + + if( m_iMode==4 ){ + char strPage[256], os[16]; + f_CS_GetWebPageURL( URL_SOFTWARE, strPage ); + + TLabel* pLabel = (TLabel*)Sender; + switch( pLabel->Tag ){ + case 0: + strcpy( os, "pc" ); + break; + case 1: + strcpy( os, "android" ); + break; + case 2: + strcpy( os, "ios" ); + break; + } + + sprintf( strURL, "%s?id=2&os=%s", strPage, os ); + } + else if( m_iMode==3 ){ + f_CS_GetWebPageURL( URL_COINSPEC, strURL ); + } + + ShellExecute(Handle, NULL, ((String)strURL).c_str(), NULL, NULL, SW_SHOWNORMAL); +} +//--------------------------------------------------------------------------- + +void __fastcall THelpPanel::LinkMouseEnter(TObject *Sender) +{ + ((TLabel*)Sender)->Font->Color = clrEnter; + Screen->Cursor = crHandPoint; +} +//--------------------------------------------------------------------------- + +void __fastcall THelpPanel::LinkMouseLeave(TObject *Sender) +{ + ((TLabel*)Sender)->Font->Color = clrLeave; + Screen->Cursor = crDefault; +} +//--------------------------------------------------------------------------- + diff --git a/HelpPanelUnit.h b/HelpPanelUnit.h new file mode 100644 index 0000000..78ff4a7 --- /dev/null +++ b/HelpPanelUnit.h @@ -0,0 +1,123 @@ +//--------------------------------------------------------------------------- + +#ifndef HelpPanelUnitH +#define HelpPanelUnitH +//--------------------------------------------------------------------------- +#include + +#include +//------------------------ +#include "SkinScrollBarUnit.h" +#include +#include "QRcodePanel.h" + +#define MODE_NUM 6 +#define SOFTWARE_NUM 3 +#define COLOR_BORDER RGB(164,115,70) +#define COLOR_QUESTION RGB( 207,169,207 ) +#define COLOR_ANSWER RGB( 249,246,229 ) + +#include +using namespace std; + +typedef struct{ + wstring str1; + wstring str2; +} TWSPAIR; + +typedef vector< TWSPAIR* > TWSPAIRLIST; + +typedef struct tagLineString{ + int flag; + wstring strText; + + tagLineString(){ + flag = 0; + } +} TLineString; + +typedef vector< TLineString* > TTEXTLINE; +//-------- + +class THelpPanel : public Extctrls::TPanel +{ + +private: + TQRcodePanel *m_pQRPanelAndroid, *m_pQRPaneliOS; + unsigned char *m_pQRdataAndroid, *m_pQRdataiOS; + TLabel *m_aLblSWName[SOFTWARE_NUM], + *m_aLblSWLink[SOFTWARE_NUM], + *m_lblCoinPage; + + TTEXTLINE m_lstLines; + + int m_iMode; //ʾģʽ 0=⣬1=Ҫʣ2=վ棬3=ռϢ + int m_iLastMode; //ϴʾģʽ + +// char m_CharBuf[2048]; + + void CalcViewArea(); + void ReadData(); + + void __fastcall LinkClick(TObject *Sender); + void __fastcall LinkMouseEnter(TObject *Sender); + void __fastcall LinkMouseLeave(TObject *Sender); + + MESSAGE void __fastcall WMEraseBkgnd(Winapi::Messages::TWMEraseBkgnd &Message); + MESSAGE void __fastcall WMSize(Winapi::Messages::TWMSize &Message); + MESSAGE void __fastcall WMVScroll(Winapi::Messages::TWMScroll &Message); + MESSAGE void __fastcall WMMouseWheel(TWMMouseWheel &Message); + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(WM_ERASEBKGND, TWMEraseBkgnd, WMEraseBkgnd) + MESSAGE_HANDLER(WM_SIZE, TWMSize, WMSize) + MESSAGE_HANDLER(WM_VSCROLL, TWMVScroll, WMVScroll) + MESSAGE_HANDLER(WM_MOUSEWHEEL, TWMMouseWheel, WMMouseWheel) + END_MESSAGE_MAP(Vcl::Extctrls::TPanel) + +//protected: + //ʾ + int m_nRowShow, + m_nBeginShowRow, + m_nRowNum, + + m_nPosFlag, + m_nPosText, + +/* m_iFirstRowMode0, + m_iFirstRowMode1, + m_iFirstQAMode0, + m_iFirstQAMode1, +*/ + m_aFirstRow[MODE_NUM], + m_aFirstTitle[MODE_NUM], + + m_nRowWidth, + m_nRowHight, + + m_nLeftBound, + m_nRightBound, + m_nTopBound, + m_nBottomBound; + + TSkinScrollBar *m_sbVert; +// TMemo* m_memoMsg; + + virtual void __fastcall CreateWnd(); + virtual void __fastcall Paint(void); + + void RefreshTextLines(); + +public: + void ScrollView( int nPos, bool bRedraw=true ); + void SetMode( int iMode ); + void AddFeedback( wstring str ); + void SaveFirstRow(); + void InitialVars(); + bool HasScrollBar(); + void SetTextFontSize(int sz); + + __fastcall virtual THelpPanel(System::Classes::TComponent* AOwner); + __fastcall ~THelpPanel(); +}; +#endif diff --git a/ImgCopperExUnit.cpp b/ImgCopperExUnit.cpp new file mode 100644 index 0000000..3da86de --- /dev/null +++ b/ImgCopperExUnit.cpp @@ -0,0 +1,379 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop + +#include +#include "GlobalUnit.h" +#include "ImgCopperExUnit.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) + +//--------------------------------------------------------------------------- +bool GetPicType(String &name, TMemoryStream *tmpMemoryStream, bool bBac) +{ + bool bReturn = true; + + tmpMemoryStream->Position = 0; + WORD wType = 0; + tmpMemoryStream->ReadBuffer(&wType, 2); + + String tmpName = name; + + if( wType==0x4D42 ){ //bmp + + if( bBac ) + name = ChangeFileExt(name, L".bmp"); + + }else if( wType==0x5089 ){ //png + + if( bBac ) + name = ChangeFileExt(name, L".png"); + + }else if( wType==0xD8FF ) { //jpg + + if( bBac ) + name = ChangeFileExt(name, L".jpg"); + + }else bReturn = false; + + if( bReturn && bBac ) + CopyFile(tmpName.c_str(), name.c_str(), false); + + return bReturn; +} +//--------------------------------------------------------------------------- +VCBMPEDGE g_VCBMPEDGE; +TBitmap* resizableImage(TBitmap *imgDest, TRect rectDest, + int tagSrc, String resourceNameSrc, + UIEdgeInsets insetsSrc, + System::Uitypes::TColor TransparentColor) +{ + // ------judge the image is handled + bool bFindBMPEDGE = false; + BMPEDGE *pBMPEDGE = NULL; + for( VCBMPEDGE::iterator vc_pFindVCBMPEDGE = g_VCBMPEDGE.begin(); + vc_pFindVCBMPEDGE != g_VCBMPEDGE.end(); + vc_pFindVCBMPEDGE++ ) + { + if( tagSrc==(*vc_pFindVCBMPEDGE)->iTag ) { + + pBMPEDGE = *vc_pFindVCBMPEDGE; + bFindBMPEDGE = true; + break; + } + } + // ------l r t b cl cr ct cb c cn get bitmap + if( NULL==pBMPEDGE ) { + + pBMPEDGE = new BMPEDGE(tagSrc, resourceNameSrc); + pBMPEDGE->pImgLeftT = new TBitmap(); + pBMPEDGE->pImgLeftB = new TBitmap(); + pBMPEDGE->pImgRightT = new TBitmap(); + pBMPEDGE->pImgRightB = new TBitmap(); + pBMPEDGE->pImgCenterL = new TBitmap(); + pBMPEDGE->pImgCenterR = new TBitmap(); + pBMPEDGE->pImgCenterT = new TBitmap(); + pBMPEDGE->pImgCenterB = new TBitmap(); + pBMPEDGE->pImgCenter = new TBitmap(); + + pBMPEDGE->pImgBMPSrc = new TBitmap(); + pBMPEDGE->pImgBMPSrc->LoadFromResourceName(int(HInstance), resourceNameSrc); + } + TBitmap *imgSrc = pBMPEDGE->pImgBMPSrc; + + // ------ l r t b cl cr ct cb c cn rect + int iLeft, iTop, iWidth, iHeight; + int iLeftNew, iTopNew, iWidthNew, iHeightNew; + + iLeft = 0; + iTop = 0; + iWidth = imgSrc->Width; + iHeight = imgSrc->Height; + TRect rectSrc = TRect(0, 0, iWidth, iHeight); + + iLeftNew = 0; + iTopNew = 0; + iWidthNew = rectDest.Width(); + iHeightNew = rectDest.Height(); + + + UIEdgeInsets insets; + if( !bFindBMPEDGE ) { + + pBMPEDGE->insetsDest.left = insetsSrc.left; + pBMPEDGE->insetsDest.right = insetsSrc.right; + pBMPEDGE->insetsDest.top = insetsSrc.top; + pBMPEDGE->insetsDest.bottom = insetsSrc.bottom; + insets = insetsSrc; + + }else{ + + insets = pBMPEDGE->insetsDest; + } + int LEFTT_WIDTH = insets.left; + int LEFTT_HEIGHT = insets.top; + int LEFTB_WIDTH = insets.left; + int LEFTB_HEIGHT = insets.bottom; + int RIGHTT_WIDTH = insets.right; + int RIGHTT_HEIGHT = insets.top; + int RIGHTB_WIDTH = insets.right; + int RIGHTB_HEIGHT = insets.bottom; + + int CENTERL_WIDTH = insets.left; + int CENTERL_HEIGHT = rectSrc.Height() - (LEFTT_HEIGHT+LEFTB_HEIGHT); + int CENTERR_WIDTH = insets.right; + int CENTERR_HEIGHT = iHeight - (RIGHTT_HEIGHT+RIGHTB_HEIGHT); + int CENTERT_WIDTH = iWidth - (LEFTT_WIDTH+RIGHTT_WIDTH); + int CENTERT_HEIGHT = insets.top; + int CENTERB_WIDTH = iWidth - (LEFTB_WIDTH+RIGHTB_WIDTH); + int CENTERB_HEIGHT = insets.bottom; + + int CENTER_WIDTH = CENTERT_WIDTH; + int CENTER_HEIGHT = iHeight - (CENTERT_HEIGHT+CENTERB_HEIGHT); + + int CENTERL_NEW_WIDTH = insets.left; + int CENTERL_NEW_HEIGHT = iHeightNew - (LEFTT_HEIGHT+LEFTB_HEIGHT); + int CENTERR_NEW_WIDTH = insets.right; + int CENTERR_NEW_HEIGHT = CENTERL_NEW_HEIGHT; + int CENTERT_NEW_WIDTH = iWidthNew - (LEFTT_WIDTH+RIGHTT_WIDTH); + int CENTERT_NEW_HEIGHT = insets.top; + int CENTERB_NEW_WIDTH = CENTERT_NEW_WIDTH; + int CENTERB_NEW_HEIGHT = insets.bottom; + + int CENTER_NEW_WIDTH = CENTERT_NEW_WIDTH; + int CENTER_NEW_HEIGHT = CENTERL_NEW_HEIGHT; + + // ------ size transparent + TBitmap *pImgLeftT = pBMPEDGE->pImgLeftT; + TBitmap *pImgLeftB = pBMPEDGE->pImgLeftB; + TBitmap *pImgRightT = pBMPEDGE->pImgRightT; + TBitmap *pImgRightB = pBMPEDGE->pImgRightB; + TBitmap *pImgCenterL = pBMPEDGE->pImgCenterL; + TBitmap *pImgCenterR = pBMPEDGE->pImgCenterR; + TBitmap *pImgCenterT = pBMPEDGE->pImgCenterT; + TBitmap *pImgCenterB = pBMPEDGE->pImgCenterB; + TBitmap *pImgCenter = pBMPEDGE->pImgCenter; + + if( !bFindBMPEDGE ) { + + pImgLeftT->SetSize( LEFTT_WIDTH, LEFTT_HEIGHT ); + pImgLeftB->SetSize( LEFTB_WIDTH, LEFTB_HEIGHT ); + pImgRightT->SetSize( RIGHTT_WIDTH, RIGHTT_HEIGHT ); + pImgRightB->SetSize( RIGHTB_WIDTH, RIGHTB_HEIGHT ); + pImgCenterL->SetSize( CENTERL_WIDTH, CENTERL_HEIGHT); + pImgCenterR->SetSize( CENTERR_WIDTH, CENTERR_HEIGHT); + pImgCenterT->SetSize( CENTERT_WIDTH, CENTERT_HEIGHT); + pImgCenterB->SetSize( CENTERB_WIDTH, CENTERB_HEIGHT); + pImgCenter->SetSize( CENTER_WIDTH, CENTER_HEIGHT ); + + pBMPEDGE->SetTransparent(TransparentColor); + } + + if( NULL==imgDest ) { + imgDest = new TBitmap(); + imgDest->SetSize(iWidthNew, iHeightNew); + } + imgDest->Transparent = true; + imgDest->TransparentColor = clWhite; + + + // ------new bitmap + if( !bFindBMPEDGE ) { +// ----- +StretchBlt(pImgLeftT->Canvas->Handle, 0, 0, LEFTT_WIDTH, LEFTT_HEIGHT, + imgSrc->Canvas->Handle, 0, 0, LEFTT_WIDTH, LEFTT_HEIGHT, + SRCCOPY); +StretchBlt(pImgLeftB->Canvas->Handle, 0, 0, LEFTB_WIDTH, LEFTB_HEIGHT, + imgSrc->Canvas->Handle, 0, iHeight-LEFTB_HEIGHT, LEFTB_WIDTH, LEFTB_HEIGHT, + SRCCOPY); +StretchBlt(pImgRightT->Canvas->Handle, 0, 0, RIGHTT_WIDTH, RIGHTT_HEIGHT, + imgSrc->Canvas->Handle, iWidth-RIGHTT_WIDTH, 0, RIGHTT_WIDTH, RIGHTT_HEIGHT, + SRCCOPY); +StretchBlt(pImgRightB->Canvas->Handle, 0, 0, RIGHTB_WIDTH, RIGHTB_HEIGHT, + imgSrc->Canvas->Handle, iWidth-RIGHTB_WIDTH, iHeight-RIGHTB_HEIGHT, RIGHTB_WIDTH, RIGHTB_HEIGHT, + SRCCOPY); + +StretchBlt(pImgCenterL->Canvas->Handle, 0, 0, CENTERL_WIDTH, CENTERL_HEIGHT, + imgSrc->Canvas->Handle, 0, LEFTT_HEIGHT, CENTERL_WIDTH, CENTERL_HEIGHT, + SRCCOPY); +StretchBlt(pImgCenterR->Canvas->Handle, 0, 0, CENTERR_WIDTH, CENTERR_HEIGHT, + imgSrc->Canvas->Handle, iWidth-RIGHTT_WIDTH, RIGHTT_HEIGHT, CENTERR_WIDTH, CENTERR_HEIGHT, + SRCCOPY); +StretchBlt(pImgCenterT->Canvas->Handle, 0, 0, CENTERT_WIDTH, CENTERT_HEIGHT, + imgSrc->Canvas->Handle, LEFTT_WIDTH, 0, CENTERT_WIDTH, CENTERT_HEIGHT, + SRCCOPY); +StretchBlt(pImgCenterB->Canvas->Handle, 0, 0, CENTERB_WIDTH, CENTERB_HEIGHT, + imgSrc->Canvas->Handle, LEFTB_WIDTH, iHeight-LEFTB_HEIGHT, CENTERB_WIDTH, CENTERB_HEIGHT, + SRCCOPY); + +StretchBlt(pImgCenter->Canvas->Handle, 0, 0, CENTER_WIDTH, CENTER_HEIGHT, + imgSrc->Canvas->Handle, LEFTT_WIDTH, LEFTT_HEIGHT, CENTER_WIDTH, CENTER_HEIGHT, + SRCCOPY); + } + +// ----- +StretchBlt(imgDest->Canvas->Handle, 0, 0, LEFTT_WIDTH, LEFTT_HEIGHT, + pImgLeftT->Canvas->Handle, 0, 0, LEFTT_WIDTH, LEFTT_HEIGHT, + SRCCOPY); +StretchBlt(imgDest->Canvas->Handle, 0, iHeightNew-LEFTB_HEIGHT, LEFTB_WIDTH, LEFTB_HEIGHT, + pImgLeftB->Canvas->Handle, 0, 0, LEFTB_WIDTH, LEFTB_HEIGHT, + SRCCOPY); +StretchBlt(imgDest->Canvas->Handle, iWidthNew-RIGHTT_WIDTH, 0, RIGHTT_WIDTH, RIGHTT_HEIGHT, + pImgRightT->Canvas->Handle, 0, 0, RIGHTT_WIDTH, RIGHTT_HEIGHT, + SRCCOPY); +StretchBlt(imgDest->Canvas->Handle, iWidthNew-RIGHTB_WIDTH, iHeightNew-RIGHTB_HEIGHT, RIGHTB_WIDTH, RIGHTB_HEIGHT, + pImgRightB->Canvas->Handle, 0, 0, RIGHTB_WIDTH, RIGHTB_HEIGHT, + SRCCOPY); + +StretchBlt(imgDest->Canvas->Handle, 0, LEFTT_HEIGHT, CENTERL_NEW_WIDTH, CENTERL_NEW_HEIGHT, + pImgCenterL->Canvas->Handle,0, 0, CENTERL_WIDTH, CENTERL_HEIGHT, + SRCCOPY); +StretchBlt(imgDest->Canvas->Handle, iWidthNew-RIGHTT_WIDTH, RIGHTT_HEIGHT, CENTERR_NEW_WIDTH, CENTERR_NEW_HEIGHT, + pImgCenterR->Canvas->Handle,0, 0, CENTERR_WIDTH, CENTERR_HEIGHT, + SRCCOPY); +StretchBlt(imgDest->Canvas->Handle, LEFTT_WIDTH, 0, CENTERT_NEW_WIDTH, CENTERT_NEW_HEIGHT, + pImgCenterT->Canvas->Handle,0, 0, CENTERT_WIDTH, CENTERT_HEIGHT, + SRCCOPY); +StretchBlt(imgDest->Canvas->Handle, LEFTT_WIDTH, iHeightNew-LEFTB_HEIGHT, CENTERB_NEW_WIDTH, CENTERB_NEW_HEIGHT, + pImgCenterB->Canvas->Handle,0, 0, CENTERB_WIDTH, CENTERB_HEIGHT, + SRCCOPY); +StretchBlt(imgDest->Canvas->Handle, LEFTT_WIDTH, LEFTT_HEIGHT, CENTER_NEW_WIDTH, CENTER_NEW_HEIGHT, + pImgCenter->Canvas->Handle, 0, 0, CENTER_WIDTH, CENTER_HEIGHT, + SRCCOPY); + + if( !bFindBMPEDGE ) { + g_VCBMPEDGE.push_back(pBMPEDGE); + } + + return imgDest; +} +//--------------------------------------------------------------------------- + + +TThreadMusciCover *g_pTThreadMusciCover = NULL; +__fastcall TThreadMusciCover::TThreadMusciCover(bool CreateSuspended, TForm *Form) + : TThread(CreateSuspended) +{ + m_pForm = Form; +} +//--------------------------------------------------------------------------- +void __fastcall TThreadMusciCover::Execute() +{ + TStringStream *strStream = new TStringStream(NULL, 65001); + + String strUrl = g_strServerURL; + strUrl += L"/index.php/Client/getUserMusicCover/userId/"; + strUrl += IntToStr(g_infoUser.accountInfo.ID); + + String dir = MUSIC_COVER_DIR; + String file = L"tmp"; + HRESULT result = GetUrlData(strUrl, dir, file, strStream, true, UrlDown_ImageCover); + strUrl = strStream->DataString; + delete strStream; + + if( !(result==S_OK && strUrl.Length() > 1) ){ + return; + } + + file = MUSIC_COVER_FILE; + if( S_OK==GetUrlData(strUrl, dir, file, NULL, false, UrlDown_ImageCover) ) { + PostMessage(m_pForm->Handle, UM_MUSICCOVER, 0, 0 ); + } +} +//--------------------------------------------------------------------------- + + +TThreadHttpPostUsrIcon *g_pTThreadHttpPostUsrIcon = NULL; +__fastcall TThreadHttpPostUsrIcon::TThreadHttpPostUsrIcon(bool CreateSuspended, TWinControl *pWnCtrl, String strPath) + : TThread(CreateSuspended) +{ + m_pWnCtrl = pWnCtrl; + m_strPath = strPath; +} +//--------------------------------------------------------------------------- +void __fastcall TThreadHttpPostUsrIcon::Execute() +{ + String strFileName = L""; + bool bSucess = true; + + String strUrl = g_strServerURL; + strUrl += L"/index.php/Client/uploadUserPortrait"; + String struserId = IntToStr(g_infoUser.accountInfo.ID); + String strusername = g_infoUser.strUserName; + String strpassword = g_infoUser.strPassword; + String strCopperPath = m_strPath; + + TIdMultiPartFormDataStream *stream = new TIdMultiPartFormDataStream(); + stream->AddFormField(L"userId", struserId); + stream->AddFormField(L"username", strusername, L"UTF-8")->ContentTransfer = L"8bit"; + stream->AddFormField(L"password", strpassword, L"UTF-8")->ContentTransfer = L"8bit"; + stream->AddFile(L"Filedata", strCopperPath, L"image/jpg"); + + + String strResJson; + TIdHTTP *httpPost = NULL; + try{ + + httpPost = new TIdHTTP(); + httpPost->Request->ContentType = L"multipart/form-data;"; + strResJson = httpPost->Post(strUrl, stream); + + }catch(Exception &e) { + + SAFE_DELETE(httpPost); + SAFE_DELETE(stream); + return; + } + + + TJSONObject *jsonOri = NULL; + int nState = -1; + try + { + jsonOri = GetJsonContext(strResJson); + if( jsonOri!=NULL ) { + + TJSONObject *ValueState = GetJsonValue(jsonOri, 0); + if( ValueState!=NULL ) { + + nState = StrToInt(ValueState->Value()); + if( 1==nState ) { + + TJSONObject *ValueFileName = GetJsonValue(jsonOri, 1); + if( ValueFileName!=NULL ) + strFileName = ValueFileName->Value(); + } + } + } + + SAFE_DELETE(jsonOri); + + }catch(Exception &e){ + + SAFE_DELETE(jsonOri); + SAFE_DELETE(httpPost); + SAFE_DELETE(stream); + return; + } + + + SAFE_DELETE(httpPost); + SAFE_DELETE(stream); + + m_strFileName = strFileName; + +// PostMessage(m_pWnCtrl->Handle, UM_UPLOADUSRICON, 0, 0 ); + + if( m_strFileName.Length() ) { + + String strHeaderPath = g_strUserPath.c_str(); + strHeaderPath += L"header\\"; + strHeaderPath += strFileName; + + CopyFile(strCopperPath.c_str(), strHeaderPath.c_str(), true); + DeleteFile(strCopperPath); + strcpy(g_infoUser.strIconFile, wstr2str(strFileName.c_str()).c_str()); + + } +} +//--------------------------------------------------------------------------- diff --git a/ImgCopperExUnit.h b/ImgCopperExUnit.h new file mode 100644 index 0000000..7094635 --- /dev/null +++ b/ImgCopperExUnit.h @@ -0,0 +1,126 @@ +//--------------------------------------------------------------------------- +#ifndef ImgCopperExUnitH +#define ImgCopperExUnitH +#include "NotificationExUnit.h" + +#define SAFE_DELETE(p) { if(p) { delete (p); (p)=NULL; } } +#define MUSIC_COVER_DIR L"MusicCover\\" +#define MUSIC_COVER_FILE L"MusicCover" +#define MUSIC_COVER_COPPER L"MusicCoverCopper.jpg" +//--------------------------------------------------------------------------- +bool GetPicType(String &name, TMemoryStream *tmpMemoryStream, bool bBac); +//--------------------------------------------------------------------------- +typedef struct UIEdgeInsets { + + int left, right, top, bottom; + + UIEdgeInsets(int ileft, int iright, int itop, int ibottom) { + + left = ileft; + right = iright; + top = itop; + bottom = ibottom; + } + + UIEdgeInsets(){ + left = -1; + right = -1; + top = -1; + bottom = -1; + } + +} UIEdgeInsets; + +typedef struct tagUIEdgeInsetsBMP{ + + TBitmap *pImgLeftT,*pImgLeftB,*pImgRightT,*pImgRightB; + + TBitmap *pImgCenterL, *pImgCenterR, *pImgCenterT, *pImgCenterB, *pImgCenter; + + TBitmap *pImgBMPSrc; + + UIEdgeInsets insetsDest; + int iTag; + String strResourceName; + + tagUIEdgeInsetsBMP(int tag, String resourceName) { + + iTag = tag; + strResourceName = resourceName; + pImgLeftT = pImgLeftB = pImgRightT = pImgRightB = NULL; + pImgCenterL = pImgCenterR = pImgCenterT = pImgCenterB = pImgCenter = NULL; + pImgBMPSrc = NULL; + } + + ~tagUIEdgeInsetsBMP() { + + SAFE_DELETE(pImgLeftT) + SAFE_DELETE(pImgLeftB) + SAFE_DELETE(pImgRightT) + SAFE_DELETE(pImgRightB) + + SAFE_DELETE(pImgCenterL) + SAFE_DELETE(pImgCenterR) + SAFE_DELETE(pImgCenterT) + SAFE_DELETE(pImgCenterB) + SAFE_DELETE(pImgCenter) + + SAFE_DELETE(pImgBMPSrc) + } + + void SetTransparent(System::Uitypes::TColor TransparentColor) { + + pImgLeftT->Transparent = true; + pImgLeftT->TransparentColor = TransparentColor; + pImgLeftB->Transparent = true; + pImgLeftB->TransparentColor = TransparentColor; + pImgRightT->Transparent = true; + pImgRightT->TransparentColor = TransparentColor; + pImgRightB->Transparent = true; + pImgRightB->TransparentColor = TransparentColor; + pImgCenterL->Transparent = true; + pImgCenterL->TransparentColor = TransparentColor; + pImgCenterR->Transparent = true; + pImgCenterR->TransparentColor = TransparentColor; + pImgCenterT->Transparent = true; + pImgCenterT->TransparentColor = TransparentColor; + pImgCenterB->Transparent = true; + pImgCenterB->TransparentColor = TransparentColor; + pImgCenter->Transparent = true; + pImgCenter->TransparentColor = TransparentColor; + } + +}BMPEDGE; +typedef vector VCBMPEDGE; +TBitmap* resizableImage(TBitmap *imgDest, TRect rectDest, + int tagSrc, String resourceNameSrc, + UIEdgeInsets insetsSrc, + System::Uitypes::TColor TransparentColor=clWhite); +//--------------------------------------------------------------------------- +class TThreadMusciCover : public TThread +{ +private: + TForm *m_pForm; +protected: + void __fastcall Execute(); +public: + __fastcall TThreadMusciCover(bool CreateSuspended, TForm *Form); +}; +extern TThreadMusciCover *g_pTThreadMusciCover; +//--------------------------------------------------------------------------- +class TThreadHttpPostUsrIcon : public TThread +{ +private: + TWinControl *m_pWnCtrl; + String m_strPath; + +protected: + void __fastcall Execute(); + +public: + String m_strFileName; + __fastcall TThreadHttpPostUsrIcon(bool CreateSuspended, TWinControl *pWnCtrl, String strPath); +}; +extern TThreadHttpPostUsrIcon *g_pTThreadHttpPostUsrIcon; +//--------------------------------------------------------------------------- +#endif diff --git a/ImgCopperFormUnit.cpp b/ImgCopperFormUnit.cpp new file mode 100644 index 0000000..f66ae2a --- /dev/null +++ b/ImgCopperFormUnit.cpp @@ -0,0 +1,562 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop + +#include "ImgCopperFormUnit.h" +#include "GlobalUnit.h" +#include +//--------------------------------------------------------------------------- +static const COLORREF CLR_LINE_D = RGB( 18, 19, 21 ), + CLR_LINE_L = RGB( 140, 141, 145 ); +#define TOP_LEFT 0 +#define TOP_RIGHT 1 +#define BOTTOM_LEFT 2 +#define BOTTOM_RIGHT 3 +#define TOP 4 +#define BOTTOM 5 +#define LEFT 6 +#define RIGHT 7 +#define CENTER 8 +#define SAFE_DELETE(p) { if(p) { delete (p); (p)=NULL; } } +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma link "PNGButton" +#pragma link "GeneralDialogPanel" +#pragma link "TextButton" +#pragma resource "*.dfm" +TImgCopperForm *ImgCopperForm; +//--------------------------------------------------------------------------- +__fastcall TImgCopperForm::TImgCopperForm(TComponent* Owner, TRect rtCopper, TPicture *pPicSrc) + : TForm(Owner) +{ + m_rtCopper = rtCopper; + + m_pPicSrc = new TPicture(); + if(pPicSrc && pPicSrc->Graphic->Width && pPicSrc->Graphic->Height ) { + m_pPicSrc->Assign(pPicSrc); + } + + m_pTBitmapLine = new TBitmap(); + m_pTBitmapLine->SetSize(4, 4); + m_pTBitmapLine->Canvas->Brush->Style = bsClear; + + for( int indexY=0; indexY<4; indexY++ ) + { + bool bLine = (indexY%2==0)?true:false; + for( int indexX=0; indexX<4; indexX++ ) + { + bool bEven = (indexX%2==0)?true:false; + if(bLine) bEven = !bEven; + + m_pTBitmapLine->Canvas->Pixels[indexX][indexY] = + (bEven==true)?CLR_LINE_D:CLR_LINE_L; + } + } + + // ----- + m_bPicDown = false; + m_nResize = 1; + + DragAcceptFiles(this->Handle, true); + + m_pTransSkinScollBar = new TTransSkinScollBar(m_pPanelBKG); + m_pTransSkinScollBar->Parent = m_pPanelBKG; + m_pTransSkinScollBar->SetBounds(0, 0, 14, 100); + m_pTransSkinScollBar->Vertial = false; + m_pTransSkinScollBar->ThumbWidth = 12; + m_pTransSkinScollBar->OnChangePos = SizeChange; + m_pTransSkinScollBar->BringToFront(); + +} +//--------------------------------------------------------------------------- +void __fastcall TImgCopperForm::FormCreate(TObject *Sender) +{ + //ԲǴ + FormResize(NULL); +} +//--------------------------------------------------------------------------- +void __fastcall TImgCopperForm::FormClose(TObject *Sender, TCloseAction &Action) +{ + SAFE_DELETE(m_pTBitmapLine) + SAFE_DELETE(m_pPicSrc) + SAFE_DELETE(m_pTransSkinScollBar) +} +//--------------------------------------------------------------------------- +void __fastcall TImgCopperForm::FormResize(TObject *Sender) +{ + m_pPanelBKG->Width = Width; + m_pPanelBKG->Height = Height; + m_pPanelBKG->Left = 0; + m_pPanelBKG->Top = 0; + + // ----- + TRect rtBKG = TRect(1, 26, Width-1, 26+(Height-68)); + m_rtBKG = rtBKG; + + m_pPaintBoxSrc->Left = 1; + m_pPaintBoxSrc->Top = rtBKG.Top; + m_pPaintBoxSrc->Width = Width-2; + m_pPaintBoxSrc->Height = rtBKG.Height(); + + + m_rtCopperEdge.Left = rtBKG.Left+(rtBKG.Width()-m_rtCopper.Width())/2-4; + m_rtCopperEdge.Top = rtBKG.Top+(rtBKG.Height()-m_rtCopper.Height())/2-4; + m_rtCopperEdge.Right = m_rtCopperEdge.Left+m_rtCopper.Width()+8; + m_rtCopperEdge.Bottom = m_rtCopperEdge.Top+m_rtCopper.Height()+8; + + m_pTransSkinScollBar->Width = Width/3; + m_pTransSkinScollBar->Left + = m_pPaintBoxSrc->Left+(m_pPaintBoxSrc->Width-m_pTransSkinScollBar->Width)/2; + m_pTransSkinScollBar->Top + = m_pPaintBoxSrc->Top+m_pPaintBoxSrc->Height - + m_pTransSkinScollBar->Height-8; + HRGN hRgnSize = + CreateRoundRectRgn( 0, 0, + m_pTransSkinScollBar->Width+1, + m_pTransSkinScollBar->Height+1, + 3, 3 ); + SetWindowRgn( m_pTransSkinScollBar->Handle, hRgnSize, false ); + DeleteObject( hRgnSize ); + + m_pBtnCancel->Left = Width-m_pBtnCancel->Width-10; + m_pBtnCancel->Top = Height-m_pBtnCancel->Height-10; + m_pBtnOk->Left = m_pBtnCancel->Left-m_pBtnOk->Width-10; + m_pBtnOk->Top = m_pBtnCancel->Top; + + m_btnChoose->Left = 10; + m_btnChoose->Top = + m_pBtnCancel->Top+(m_pBtnCancel->Height-m_btnChoose->Height)/2; + + m_pPanelBKG->Caption = Caption; + + SetSrcPicRect(); +} +//--------------------------------------------------------------------------- +void __fastcall TImgCopperForm::SetCaption(String strCaption) +{ + m_pPanelBKG->Caption = strCaption; +} +//--------------------------------------------------------------------------- +void __fastcall TImgCopperForm::m_pPaintBoxSrcPaint(TObject *Sender) +{ + int nWidth = m_pPaintBoxSrc->Width; + int nHeight = m_pPaintBoxSrc->Height; + + // һʾ豸ݵڴ豸 + HDC BufDC = CreateCompatibleDC(m_pPaintBoxSrc->Canvas->Handle); + // һʾ豸ݵλͼ + HBITMAP BufBitmap = CreateCompatibleBitmap(m_pPaintBoxSrc->Canvas->Handle, nWidth, nHeight); + // 豸λͼ + SelectObject(BufDC, BufBitmap); + // CreateCompatibleBitmapλͼݳʼΪ0RGB(0,0,0)ʾǺɫ + // ҪɫʹΪ͸ + PerformEraseBackground(this, BufDC); + // ʱCanvasͼãDZģֱʹGDIͼ + TCanvas *CanvasDraw = new TCanvas(); + // ڴ豸 + CanvasDraw->Handle = BufDC; + + //-------------------------------------- + CanvasDraw->Brush->Color = RGB(52, 56, 63); + CanvasDraw->FillRect(TRect(0, 0, nWidth, nHeight)); + CanvasDraw->StretchDraw(m_rtSrc, m_pPicSrc->Graphic); + + int iLeft, iTop, iWidth, iHeight; + CanvasDraw->Brush->Bitmap = m_pTBitmapLine; + + //left + iLeft = m_rtCopperEdge.Left-m_rtBKG.Left; + iTop = m_rtCopperEdge.Top-m_rtBKG.Top; + iWidth = 4; + iHeight = m_rtCopperEdge.Height(); + CanvasDraw->FillRect( TRect(iLeft, iTop, iLeft+iWidth, iTop+iHeight) ); + + //right + iLeft = m_rtCopperEdge.Left+m_rtCopperEdge.Width()-4-m_rtBKG.Left; + iTop = m_rtCopperEdge.Top-m_rtBKG.Top; + iWidth = 4; + iHeight = m_rtCopperEdge.Height(); + CanvasDraw->FillRect( TRect(iLeft, iTop, iLeft+iWidth, iTop+iHeight) ); + + //top + iLeft = m_rtCopperEdge.Left-m_rtBKG.Left; + iTop = m_rtCopperEdge.Top-m_rtBKG.Top; + iWidth = m_rtCopperEdge.Width(); + iHeight = 4; + CanvasDraw->FillRect( TRect(iLeft, iTop, iLeft+iWidth, iTop+iHeight) ); + + //bottom + iLeft = m_rtCopperEdge.Left-m_rtBKG.Left; + iTop = m_rtCopperEdge.Top+m_rtCopperEdge.Height()-4-m_rtBKG.Top; + iWidth = m_rtCopperEdge.Width(); + iHeight = 4; + CanvasDraw->FillRect( TRect(iLeft, iTop, iLeft+iWidth, iTop+iHeight) ); + + // һԽڴͼݸǹȥΪ˲̣Ա˸ + BitBlt(m_pPaintBoxSrc->Canvas->Handle, 0, 0, nWidth, nHeight, + CanvasDraw->Handle, 0, 0, SRCCOPY); + // ͷԴ + DeleteDC(BufDC); + DeleteObject(BufBitmap); + SAFE_DELETE(CanvasDraw) +} +//--------------------------------------------------------------------------- +void __fastcall TImgCopperForm::m_pPaintBoxSrcMouseDown(TObject *Sender, TMouseButton Button, + TShiftState Shift, int X, int Y) +{ + m_bPicDown = true; + m_ptDown = TPoint(X, Y); + m_rtSrcMove = m_rtSrc; +} +//--------------------------------------------------------------------------- +void __fastcall TImgCopperForm::m_pPaintBoxSrcMouseMove(TObject *Sender, TShiftState Shift, + int X, int Y) +{ + if( m_bPicDown ) { + + int nLeft, nTop, nWidth, nHeight; + + nWidth = m_rtSrcMove.Width(); + nHeight = m_rtSrcMove.Height(); + nLeft = m_rtSrcMove.Left+X-m_ptDown.X; + nTop = m_rtSrcMove.Top+Y-m_ptDown.Y; + + m_rtSrc.Left = nLeft; + m_rtSrc.Top = nTop; + m_rtSrc.Right = m_rtSrc.Left+nWidth; + m_rtSrc.Bottom = m_rtSrc.Top+nHeight; + + m_pPaintBoxSrcPaint(NULL); + } +} +//--------------------------------------------------------------------------- +void __fastcall TImgCopperForm::m_pPaintBoxSrcMouseUp(TObject *Sender, TMouseButton Button, + TShiftState Shift, int X, int Y) +{ + m_bPicDown = false; + m_rtSrcMove = m_rtSrc; + m_pTransSkinScollBar->Invalidate(); +} +//--------------------------------------------------------------------------- +void __fastcall TImgCopperForm::SizeChange(TObject *Sender) +{ + int nSize = m_pTransSkinScollBar->SBTop + 1; + if(m_nResize==nSize) return; + m_nResize = nSize; + + int nLMove, nTMove, nWMove, nHMove; + nLMove = m_rtSrcMove.Left; + nTMove = m_rtSrcMove.Top; + nWMove = m_rtSrcMove.Width(); + nHMove = m_rtSrcMove.Height(); + + int nLBac, nTBac, nWBac, nHBac; + nLBac = m_rtSrcBac.Left; + nTBac = m_rtSrcBac.Top; + nWBac = m_rtSrcBac.Width(); + nHBac = m_rtSrcBac.Height(); + + // + int nStatusLoc; + TPoint ptCenterSrcMove = TPoint(nLMove+nWMove/2, nTMove+nHMove/2); + if( ptCenterSrcMove.X>m_rtSrcBac.Right && + ptCenterSrcMove.Ym_rtSrcBac.Right && + ptCenterSrcMove.Y>m_rtSrcBac.Bottom ) + { + nStatusLoc = BOTTOM_RIGHT; + + }else if( ptCenterSrcMove.Xm_rtSrcBac.Bottom ) + { + nStatusLoc = BOTTOM_LEFT; + + }else if( ptCenterSrcMove.Xm_rtSrcBac.Right && + ptCenterSrcMove.Y>m_rtSrcBac.Top && + ptCenterSrcMove.Ym_rtSrcBac.Top && + ptCenterSrcMove.Ym_rtSrcBac.Bottom && + ptCenterSrcMove.X>m_rtSrcBac.Left && + ptCenterSrcMove.Xm_rtSrcBac.Left && + ptCenterSrcMove.XRefresh(); +} +//--------------------------------------------------------------------------- +void __fastcall TImgCopperForm::SetSrcPicRect() +{ + int nLeft, nTop, nWidth, nHeight; + if( m_pPicSrc ) { + + int nWidthLarge = -1; + int nWidthCopper = m_rtCopper.Width(); + int nHeightCopper = m_rtCopper.Height(); + nWidth = m_pPicSrc->Width; + nHeight = m_pPicSrc->Height; + + if( nWidthLeft)+4; + m_rtSrc.Top = nTop+(m_rtCopperEdge.Top-m_pPaintBoxSrc->Top)+4; + m_rtSrc.Right = m_rtSrc.Left+nWidth; + m_rtSrc.Bottom = m_rtSrc.Top+nHeight; + m_rtSrcBac = m_rtSrc; + m_rtSrcMove = m_rtSrc; + + if( -1!=nWidthLarge ) + m_pTransSkinScollBar->SBTotal = m_pPicSrc->Width*5/m_rtSrc.Width(); + else + m_pTransSkinScollBar->SBTotal = 5; + m_pTransSkinScollBar->SBShow = 2; + m_pTransSkinScollBar->SBTop = 0; + m_nResize = 1; + } +} +//--------------------------------------------------------------------------- +bool __fastcall TImgCopperForm::SetSrcPic(String fileName) +{ + TMemoryStream *memoryStream = new TMemoryStream(); + memoryStream->Position = 0; + memoryStream->LoadFromFile(fileName); + + if( !GetPicType(fileName, memoryStream, true) ){ + SAFE_DELETE(memoryStream) + return false; + }else { + + TPicture *pTPicture = new TPicture(); + try{ + pTPicture->LoadFromFile(fileName); + }catch(Exception &e){ + SAFE_DELETE(pTPicture) + SAFE_DELETE(memoryStream) + return false; + } + + if( m_pPicSrc ) { + + m_pPicSrc->Assign(pTPicture); + SetSrcPicRect(); + m_pPaintBoxSrcPaint(NULL); + m_pTransSkinScollBar->Invalidate(); + SAFE_DELETE(pTPicture) + } + } + + SAFE_DELETE(memoryStream) +} +//--------------------------------------------------------------------------- +void __fastcall TImgCopperForm::WMDRopFiles (TMessage& Msg) +{ + wchar_t wcFileName[256]; + int iCount = DragQueryFile((HDROP)Msg.WParam, 0xffffffff, wcFileName , 256); + + for (int index=0; indexTitle = "ͼƬ"; + pDlg->Options << ofFileMustExist; +// pDlg->FileName = ExtractFileName(L""); +// pDlg->InitialDir = ExtractFilePath(L""); + pDlg->Filter = "jpgļ (*.jpg)|*.JPG|pngļ (*.png)|*.PNG|bmpļ (*.bmp)|*.BMP"; + pDlg->DefaultExt = "jpg"; + if ( pDlg->Execute(Handle) ) { + strPicPath = pDlg->FileName.c_str(); + } + SAFE_DELETE(pDlg); + + if( !strPicPath.IsEmpty() ){ + SetSrcPic(strPicPath); + } +} +//--------------------------------------------------------------------------- +void __fastcall TImgCopperForm::m_pBtnOkClick(TObject *Sender) +{ + int iLeft, iTop, iWidth, iHeight; + iLeft = 0; + iTop = 0; + iWidth = m_rtCopper.Width(); + iHeight = m_rtCopper.Height(); + + TBitmap *pTBitmapCopper = new TBitmap(); + pTBitmapCopper->SetSize(iWidth, iHeight); + pTBitmapCopper->Canvas->Brush->Color = RGB(0, 0, 0); + pTBitmapCopper->Canvas->FillRect(TRect(iLeft, iTop, iLeft+iWidth, iTop+iHeight)); + + iWidth = m_rtSrc.Width(); + iHeight = m_rtSrc.Height(); + + m_rtSrc.Left -= m_rtCopperEdge.Left-m_pPaintBoxSrc->Left+4; + m_rtSrc.Top -= m_rtCopperEdge.Top-m_pPaintBoxSrc->Top+4; + m_rtSrc.Right = m_rtSrc.Left+iWidth; + m_rtSrc.Bottom = m_rtSrc.Top+iHeight; + pTBitmapCopper->Canvas->StretchDraw(m_rtSrc, m_pPicSrc->Graphic); + m_strCopperPath = g_strUserPath.c_str(); + m_strCopperPath += L"temp\\"; + if(!DirectoryExists(m_strCopperPath, false)) + ForceDirectories(m_strCopperPath); + m_strCopperPath += L"copper.jpg"; + + TJPEGImage *pTJPEGImage = new TJPEGImage(); + pTJPEGImage->Assign(pTBitmapCopper); + pTJPEGImage->SaveToFile( m_strCopperPath ); + SAFE_DELETE(pTJPEGImage); + SAFE_DELETE(pTBitmapCopper); +} +//--------------------------------------------------------------------------- + + + + diff --git a/ImgCopperFormUnit.dfm b/ImgCopperFormUnit.dfm new file mode 100644 index 0000000..3068cbb --- /dev/null +++ b/ImgCopperFormUnit.dfm @@ -0,0 +1,71 @@ +object ImgCopperForm: TImgCopperForm + Left = 0 + Top = 0 + BorderStyle = bsNone + Caption = #32534#36753#23553#38754 + ClientHeight = 338 + ClientWidth = 309 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Position = poMainFormCenter + Scaled = False + OnClose = FormClose + OnCreate = FormCreate + OnResize = FormResize + TextHeight = 13 + object m_pPanelBKG: TGeneralDialogPanel + Left = 0 + Top = 1 + Width = 309 + Height = 337 + Caption = #32534#36753#23553#38754 + Color = 5064257 + ParentBackground = False + TabOrder = 0 + object m_pPaintBoxSrc: TPaintBox + Left = 0 + Top = 29 + Width = 309 + Height = 252 + OnMouseDown = m_pPaintBoxSrcMouseDown + OnMouseMove = m_pPaintBoxSrcMouseMove + OnMouseUp = m_pPaintBoxSrcMouseUp + OnPaint = m_pPaintBoxSrcPaint + end + object m_pBtnOk: TTextButton + Left = 167 + Top = 300 + Width = 52 + Height = 25 + ModalResult = mrOk + ParentShowHint = False + ShowHint = True + OnClick = m_pBtnOkClick + Text = #30830#23450 + end + object m_pBtnCancel: TTextButton + Left = 240 + Top = 300 + Width = 52 + Height = 25 + ModalResult = mrCancel + ParentShowHint = False + ShowHint = True + Text = #21462#28040 + end + object m_btnChoose: TTextButton + Left = 21 + Top = 300 + Width = 56 + Height = 25 + ParentShowHint = False + ShowHint = True + OnClick = m_btnChooseClick + Text = #36873#21462#22270#29255 + end + end +end diff --git a/ImgCopperFormUnit.h b/ImgCopperFormUnit.h new file mode 100644 index 0000000..2d51c4c --- /dev/null +++ b/ImgCopperFormUnit.h @@ -0,0 +1,79 @@ +//--------------------------------------------------------------------------- + +#ifndef ImgCopperFormUnitH +#define ImgCopperFormUnitH +//--------------------------------------------------------------------------- +#include "ImgCopperExUnit.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include "PNGButton.hpp" +#include "TransSkinScrollBar.h" +#include "GeneralDialogPanel.h" +#include "TextButton.h" +//--------------------------------------------------------------------------- +class TImgCopperForm : public TForm +{ +__published: // IDE-managed Components + TGeneralDialogPanel *m_pPanelBKG; + TTextButton *m_pBtnOk; + TTextButton *m_pBtnCancel; + TPaintBox *m_pPaintBoxSrc; + TTextButton *m_btnChoose; + void __fastcall FormCreate(TObject *Sender); + void __fastcall FormClose(TObject *Sender, TCloseAction &Action); + void __fastcall m_pPaintBoxSrcMouseMove(TObject *Sender, TShiftState Shift, int X, + int Y); + void __fastcall m_pPaintBoxSrcMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, + int X, int Y); + void __fastcall m_pPaintBoxSrcMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, + int X, int Y); + void __fastcall m_pPaintBoxSrcPaint(TObject *Sender); + void __fastcall m_pBtnOkClick(TObject *Sender); + void __fastcall FormResize(TObject *Sender); + void __fastcall m_btnChooseClick(TObject *Sender); + + +private: // User declarations + + TRect m_rtBKG; + TRect m_rtCopper; + TRect m_rtCopperEdge; + + TBitmap *m_pTBitmapLine; + + TPicture *m_pPicSrc; + TRect m_rtSrc; + TRect m_rtSrcBac; + TRect m_rtSrcMove; + bool m_bPicDown; + TPoint m_ptDown; + int m_nResize; + TTransSkinScollBar *m_pTransSkinScollBar; + void __fastcall SizeChange(TObject *Sender); + + bool __fastcall SetSrcPic(String fileName); + void __fastcall SetSrcPicRect(); + + MESSAGE void __fastcall WMDRopFiles (TMessage& Msg); + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(WM_DROPFILES, TMessage, WMDRopFiles) + END_MESSAGE_MAP(TForm) + +public: // User declarations + + __fastcall TImgCopperForm(TComponent* Owner, TRect rtCopper, TPicture *pPicSrc); + + String m_strCopperPath; + void __fastcall SetCaption(String strCaption); +}; +//--------------------------------------------------------------------------- +extern PACKAGE TImgCopperForm *ImgCopperForm; +//--------------------------------------------------------------------------- +#endif diff --git a/ImportFormUnit.cpp b/ImportFormUnit.cpp new file mode 100644 index 0000000..4401035 --- /dev/null +++ b/ImportFormUnit.cpp @@ -0,0 +1,258 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop + +#include "GlobalUnit.h" +#include "ImportFormUnit.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma link "GeneralDialogPanel" +#pragma link "LineEdit" +#pragma link "TextButton" +#pragma link "ComboBoxComponent" +#pragma link "SkinTrackBar" +#pragma link "CapButton" +#pragma resource "*.dfm" +TImportForm *ImportForm; +//--------------------------------------------------------------------------- +__fastcall TImportForm::TImportForm(TComponent* Owner, String DefaultFile, + int TS, int Tempo, int iMode) + : TForm(Owner) +{ + m_iMode = iMode; + m_MediaFilePath->Text = DefaultFile; + + MediaFilePath = DefaultFile; + + DoFilePathChange(NULL); + + m_RetrunValue = 0; + + this->TS = TS; + this->Tempo = Tempo; + + this->m_TSTrackBar->Position = TS; + this->m_TempoTrackBar->Position = Tempo; + + if( iMode==1 ) + m_panGeneral->Caption = "ƵƬ"; + + for( int i=0; iClassNameIs( TLabel::ClassName() ) ) + ((TLabel*)Components[i])->ControlStyle>>csOpaque; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TImportForm::DoBrows(TObject *Sender) +{ + TOpenDialog * pDlg = new TOpenDialog(NULL); + pDlg->Options << ofFileMustExist; + pDlg->Title = L""; + pDlg->FileName = ExtractFileName(m_MediaFilePath->Text); + pDlg->InitialDir = ExtractFilePath(m_MediaFilePath->Text); + + pDlg->Filter = "mp3ļ (*.mp3)|*.MP3|Waveļ (*.wav)|*.WAV"; + + if( m_iMode==0 ) + pDlg->Filter += "|midiļ (*.mid)|*.MID"; + + if(ExtractFileExt(m_MediaFilePath->Text).CompareIC(".mid") == 0) + { + pDlg->FilterIndex = 3; + } + else if(ExtractFileExt(m_MediaFilePath->Text).CompareIC(".wav") == 0) + { + pDlg->FilterIndex = 2; + } + else + { + pDlg->FilterIndex = 1; + } + + if(pDlg->Execute(Handle)) + { + m_MediaFilePath->Text = pDlg->FileName; + MediaFilePath = pDlg->FileName; + //DoFilePathChange(NULL); + } + + delete pDlg; +} +//--------------------------------------------------------------------------- + +void __fastcall TImportForm::DoFilePathChange(TObject *Sender) +{ + UnicodeString var_FilePath(m_MediaFilePath->Text); + + MediaFilePath = var_FilePath; + + //ļǷ + if(System::Ioutils::TFile::Exists(MediaFilePath)) + m_OKButton->Enabled = true; + else + m_OKButton->Enabled = false;; + + if( m_iMode==0 && ( ExtractFileExt(var_FilePath).CompareIC(".wav") == 0 + || ExtractFileExt(var_FilePath).CompareIC(".mp3") == 0)){ + /////////// + m_panGeneral->Height = 206; + Height = 206; + + m_TipsLabel->Top = 162; + m_OKButton->Top = 155; + m_CancelButton->Top = 155; + + m_TSTrackBar->Visible = true; + m_TempoTrackBar->Visible = true; + + m_TSLabel->Visible = true; + m_TempoLabel->Visible = true; + + m_TipsLabel->Visible = true; + + m_ShowTempo->Visible = true; + + ts_44->Visible = true; + ts_34->Visible = true; + ts_24->Visible = true; + ts_68->Visible = true; + + m_ShowTempoMin->Visible = true; + m_ShowTempoMax->Visible = true; + m_TempoUpDown->Visible = true; + } + else{ + m_TSTrackBar->Visible = false; + m_TempoTrackBar->Visible = false; + m_ShowTempo->Visible = false; + + m_TSLabel->Visible = false; + m_TempoLabel->Visible = false; + + m_TipsLabel->Visible = false; + + ts_44->Visible = false; + ts_34->Visible = false; + ts_24->Visible = false; + ts_68->Visible = false; + + m_ShowTempoMin->Visible = false; + m_ShowTempoMax->Visible = false; + m_TempoUpDown->Visible = false; + + /////////// + m_panGeneral->Height = 140; + Height = 140; + + m_TipsLabel->Top = 96; + m_OKButton->Top = 89; + m_CancelButton->Top = 89; + } +} +//--------------------------------------------------------------------------- + +int __fastcall TImportForm::ShowModal() +{ + int var_Result = TForm::ShowModal(); + + TS = m_TSTrackBar->Position; + Tempo = m_TempoTrackBar->Position; + MediaFilePath = m_MediaFilePath->Text; + + return var_Result; +} +//--------------------------------------------------------------------------- + + +void __fastcall TImportForm::DoOK(TObject *Sender) +{ + m_RetrunValue = 1; + Close(); +} +//--------------------------------------------------------------------------- + + +void __fastcall TImportForm::DoTempoTrackBar(TObject *Sender) +{ + String var_Tempo(m_TempoTrackBar->Position); + m_ShowTempo->Text = var_Tempo; + //m_ShowTempo->Caption = var_Tempo; +} +//--------------------------------------------------------------------------- + +void __fastcall TImportForm::DoTSTrackBar(TObject *Sender) +{ + TS = m_TSTrackBar->Position; +} +//--------------------------------------------------------------------------- + + +void __fastcall TImportForm::DoCancel(TObject *Sender) +{ + Close(); +} +//--------------------------------------------------------------------------- +void __fastcall TImportForm::DoShowTempoChange(TObject *Sender) +{ + if(m_ShowTempo->Text == "") + { + return; + } + + int var_Tempo = m_ShowTempo->Text.ToInt(); + + if(var_Tempo < 50/*m_TSTrackBar->Min*/ || var_Tempo > 200/*m_TSTrackBar->Max*/) + { + //m_ShowTempo->Text = String(m_TSTrackBar->Position); + } + else + { + m_TempoTrackBar->Position = var_Tempo; + m_TempoUpDown->Position = var_Tempo; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TImportForm::DoTempoUpDown(TObject *Sender, TUDBtnType Button) +{ + if(Button == btNext) + { + m_TempoUpDown->Position += 1; + m_TempoTrackBar->Position += 1; + } + else + { + m_TempoUpDown->Position -= 1; + m_TempoTrackBar->Position -= 1; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TImportForm::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) +{ + switch( Key ){ + case VK_RETURN: + if(m_OKButton->Enabled) + ModalResult = mrOk; + break; + + case VK_ESCAPE: + ModalResult = mrCancel; + break; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TImportForm::FormCreate(TObject *Sender) +{ + m_panGeneral->Font->Size = g_szFont9; + m_BrowsButton->FontSize = g_szFont9; + m_OKButton->FontSize = g_szFont9; + m_CancelButton->FontSize = g_szFont9; + m_MediaFilePath->SetTextFont(g_strTxtFontName, g_szFont9); + m_ShowTempo->SetTextFont(g_strTxtFontName, g_szFont9); +} +//--------------------------------------------------------------------------- + diff --git a/ImportFormUnit.dfm b/ImportFormUnit.dfm new file mode 100644 index 0000000..400a9d8 --- /dev/null +++ b/ImportFormUnit.dfm @@ -0,0 +1,286 @@ +object ImportForm: TImportForm + Left = 0 + Top = 0 + BorderStyle = bsNone + Caption = 'ImportForm' + ClientHeight = 206 + ClientWidth = 410 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = 12569562 + Font.Height = -13 + Font.Name = 'Tahoma' + Font.Style = [] + KeyPreview = True + Position = poMainFormCenter + Scaled = False + OnCreate = FormCreate + OnKeyDown = FormKeyDown + TextHeight = 16 + object m_panGeneral: TGeneralDialogPanel + Left = 0 + Top = 0 + Width = 410 + Height = 206 + ParentCustomHint = False + Caption = #23548#20837#21333#26059#24459#25991#20214 + Color = 5064257 + UseDockManager = False + Font.Charset = DEFAULT_CHARSET + Font.Color = 12569562 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentBackground = False + ParentFont = False + ParentShowHint = False + ShowHint = False + TabOrder = 0 + object m_MediaFilePathLabel: TLabel + Left = 29 + Top = 53 + Width = 36 + Height = 14 + Caption = #25991#20214#21517 + Font.Charset = DEFAULT_CHARSET + Font.Color = 14339007 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object m_TSLabel: TLabel + Left = 29 + Top = 113 + Width = 24 + Height = 14 + Caption = #33410#25293 + Font.Charset = DEFAULT_CHARSET + Font.Color = 14339007 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object m_TempoLabel: TLabel + Left = 158 + Top = 113 + Width = 24 + Height = 14 + Caption = #36895#24230 + Font.Charset = DEFAULT_CHARSET + Font.Color = 14339007 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object m_TipsLabel: TLabel + Left = 29 + Top = 162 + Width = 132 + Height = 14 + Caption = #25552#31034#65306#35831#35774#32622#36895#24230#19982#33410#25293 + Font.Charset = DEFAULT_CHARSET + Font.Color = 14339007 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object m_BrowsButton: TTextButton + Left = 313 + Top = 50 + Width = 60 + Height = 25 + ParentShowHint = False + ShowHint = True + OnClick = DoBrows + Text = #27983#35272 + end + object m_CancelButton: TTextButton + Left = 298 + Top = 157 + Width = 75 + Height = 27 + ModalResult = mrCancel + ParentShowHint = False + ShowHint = True + Text = #21462#28040 + end + object m_OKButton: TTextButton + Left = 217 + Top = 157 + Width = 75 + Height = 27 + ModalResult = mrOk + ParentShowHint = False + ShowHint = True + Text = #30830#23450 + end + object ts_44: TLabel + Left = 60 + Top = 90 + Width = 19 + Height = 16 + Caption = '4/4' + Font.Charset = DEFAULT_CHARSET + Font.Color = 14339007 + Font.Height = -13 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object ts_34: TLabel + Left = 82 + Top = 90 + Width = 19 + Height = 16 + Caption = '3/4' + Font.Charset = DEFAULT_CHARSET + Font.Color = 14339007 + Font.Height = -13 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object ts_24: TLabel + Left = 104 + Top = 90 + Width = 19 + Height = 16 + Caption = '2/4' + Font.Charset = DEFAULT_CHARSET + Font.Color = 14339007 + Font.Height = -13 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object ts_68: TLabel + Left = 127 + Top = 90 + Width = 19 + Height = 16 + Caption = '6/8' + Font.Charset = DEFAULT_CHARSET + Font.Color = 14339007 + Font.Height = -13 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object m_ShowTempoMin: TLabel + Left = 190 + Top = 90 + Width = 14 + Height = 16 + Caption = '50' + Font.Charset = DEFAULT_CHARSET + Font.Color = 14339007 + Font.Height = -13 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object m_ShowTempoMax: TLabel + Left = 295 + Top = 90 + Width = 21 + Height = 16 + Caption = '200' + Font.Charset = DEFAULT_CHARSET + Font.Color = 14339007 + Font.Height = -13 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object m_MediaFilePath: TLineEdit + Left = 80 + Top = 50 + Width = 230 + Height = 23 + OnChange = DoFilePathChange + HintText = #35831#36873#25321#25991#20214 + NumberMax = -1 + NumberMin = -1 + Color = 15591652 + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + TabOrder = 0 + end + object m_ShowTempo: TLineEdit + Left = 325 + Top = 110 + Width = 33 + Height = 24 + OnChange = DoShowTempoChange + Alignment = taCenter + NumbersOnly = True + NumberMax = 200 + NumberMin = 50 + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + TabOrder = 1 + end + object m_TempoTrackBar: TSkinTrackBar + Left = 187 + Top = 112 + Width = 132 + Height = 20 + Hint = '50' + Caption = 'm_TempoTrackBar' + FullRepaint = False + Font.Charset = DEFAULT_CHARSET + Font.Color = 12569562 + Font.Height = -13 + Font.Name = 'Tahoma' + Font.Style = [] + ParentColor = True + ParentFont = False + TabOrder = 2 + OnChange = DoTempoTrackBar + Max = 200 + Min = 50 + Position = 50 + end + object m_TSTrackBar: TSkinTrackBar + Left = 60 + Top = 112 + Width = 85 + Height = 20 + Hint = '2' + Caption = 'm_TSTrackBar' + FullRepaint = False + Font.Charset = DEFAULT_CHARSET + Font.Color = 12569562 + Font.Height = -13 + Font.Name = 'Tahoma' + Font.Style = [] + ParentColor = True + ParentFont = False + TabOrder = 3 + OnChange = DoTSTrackBar + Max = 3 + Position = 2 + end + object m_TempoUpDown: TUpDown + Left = 357 + Top = 111 + Width = 16 + Height = 22 + Min = 50 + Max = 200 + Position = 50 + TabOrder = 4 + OnClick = DoTempoUpDown + end + end +end diff --git a/ImportFormUnit.h b/ImportFormUnit.h new file mode 100644 index 0000000..4ea6a0f --- /dev/null +++ b/ImportFormUnit.h @@ -0,0 +1,70 @@ +//--------------------------------------------------------------------------- + +#ifndef ImportFormUnitH +#define ImportFormUnitH +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include +#include +#include +#include "GeneralDialogPanel.h" +#include "LineEdit.h" +#include "SkinTrackBar.h" +#include "TextButton.h" +#include "CapButton.h" +#include "ComboBoxComponent.h" +#include "UpDownUnit.h" +//--------------------------------------------------------------------------- +class TImportForm : public TForm +{ +__published: // IDE-managed Components + TGeneralDialogPanel *m_panGeneral; + TLabel *m_MediaFilePathLabel; + TLabel *m_TSLabel; + TLabel *m_TempoLabel; + TLabel *m_TipsLabel; + TTextButton *m_BrowsButton; + TTextButton *m_CancelButton; + TTextButton *m_OKButton; + TLineEdit *m_MediaFilePath; + TLabel *ts_44; + TLabel *ts_34; + TLabel *ts_24; + TLabel *ts_68; + TLineEdit *m_ShowTempo; + TSkinTrackBar *m_TempoTrackBar; + TSkinTrackBar *m_TSTrackBar; + TLabel *m_ShowTempoMin; + TLabel *m_ShowTempoMax; + UpDownUnit::TUpDown *m_TempoUpDown; + + void __fastcall DoBrows(TObject *Sender); + void __fastcall DoFilePathChange(TObject *Sender); + void __fastcall DoOK(TObject *Sender); + void __fastcall DoCancel(TObject *Sender); + void __fastcall DoTempoTrackBar(TObject *Sender); + void __fastcall DoTSTrackBar(TObject *Sender); + void __fastcall DoShowTempoChange(TObject *Sender); + void __fastcall DoTempoUpDown(TObject *Sender, TUDBtnType Button); + void __fastcall FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift); + void __fastcall FormCreate(TObject *Sender); +private: // User declarations + int m_RetrunValue; + int m_iMode; //0 = 뵥ļ 1 = Ƭ + int m_TopOk, m_TopCancel, m_TopTips, m_Height; +public: // User declarations + String MediaFilePath; + int TS; + int Tempo; + + __fastcall TImportForm(TComponent* Owner, String DefaultFile, + int TS=-1, int Tempo=-1, int iMode=1 ); + virtual int __fastcall ShowModal(); +}; +//--------------------------------------------------------------------------- +extern PACKAGE TImportForm *ImportForm; +//--------------------------------------------------------------------------- +#endif diff --git a/ImportSegmentFormUnit.cpp b/ImportSegmentFormUnit.cpp new file mode 100644 index 0000000..e1c41f2 --- /dev/null +++ b/ImportSegmentFormUnit.cpp @@ -0,0 +1,263 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop + +#include "ImportSegmentFormUnit.h" +#include "MessageFormUnit.h" + +#define E_WrongMIDIFormat 0x00000001 //MIDI汾 +#define E_FileFormatError 0x00000002 //﷨ʽ +#define E_TSConflict 0x00000004 //ƥ +#define E_TempoConfilict 0x00000008 //ٶƥ +#define E_LessBarsNum 0x00000010 //С +#define E_MoreBarsNum 0x00000020 //С +#define E_EmptySegment 0x00000040 //ƬЧ + +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma link "ComboBoxComponent" +#pragma link "GeneralDialogPanel" +#pragma link "LineEdit" +#pragma link "TextButton" +#pragma resource "*.dfm" +TImportSegmentForm *ImportSegmentForm; +//--------------------------------------------------------------------------- +__fastcall TImportSegmentForm::TImportSegmentForm(TComponent* Owner, TPreStylePanel* pStylePanel) + : TForm(Owner) +{ + m_pStylePanel = pStylePanel; + + SetSegType(); + + SetTransparent( this ); +} +//--------------------------------------------------------------------------- + +void TImportSegmentForm::SetSegType() +{ + int iOldIndex = m_cbSegType->DefItemIndex; + + m_cbSegType->Clear(); + m_aParams.clear(); + + TStyleItem* pStyItem = m_pStylePanel->GetStyleItem(); + DWORD dwParam = 0; + if( pStyItem->nSegNum[0]<8 ){ + m_cbSegType->AddItem( "" ); + m_aParams.push_back( MAKELONG(pStyItem->nSegNum[0], SEGTYPE_VAR) ); + } + if( pStyItem->nSegNum[1]<8 ){ + m_cbSegType->AddItem( "ӻ" ); + m_aParams.push_back( MAKELONG(pStyItem->nSegNum[1], SEGTYPE_FILL) ); + } + + int count = m_pStylePanel->GetIECount( 0, 0 ); + if( count < 4 ){ + m_cbSegType->AddItem( "ǰ()" ); + m_aParams.push_back( MAKELONG(count, SEGTYPE_INTRO) ); + } + count = m_pStylePanel->GetIECount( 0, 1 ); + if( count < 4 ){ + m_cbSegType->AddItem( "ǰ(С)" ); + m_aParams.push_back( MAKELONG(count+4, SEGTYPE_INTRO) ); + } + count = m_pStylePanel->GetIECount( 1, 0 ); + if( count < 4 ){ + m_cbSegType->AddItem( "β()" ); + m_aParams.push_back( MAKELONG(count, SEGTYPE_ENDING) ); + } + count = m_pStylePanel->GetIECount( 1, 1 ); + if( count < 4 ){ + m_cbSegType->AddItem( "β(С)" ); + m_aParams.push_back( MAKELONG(count+4, SEGTYPE_ENDING) ); + } + + count = m_cbSegType->ItemsCount; + if( count>0 ){ + if( iOldIndex<0 || iOldIndex>=count ) + m_cbSegType->DefItemIndex = 0; + else + m_cbSegType->DefItemIndex = iOldIndex; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TImportSegmentForm::OkClick(TObject *Sender) +{ + String strTips[] = {L"ʾѡMIDIļƬ", + L"ʾƬѴ", + L"ѡļDZ׼MIDI(1)ʽ", + L"MIDI﷨", + L"MIDIIJһ", + L"MIDIٶȲһ", + L"󣺰Ƭβ2С", + L"󣺼ӻƬβó1С", + L"Ƭβó16С", + L"ƬȱЧ" }; + int iTip = 0; + + if( m_editFileName->Text.Length()==0 ){ + m_editFileName->SetFocus(); + } + else{ + string strName = AnsiString(m_editFileName->Text.Trim().c_str()).c_str(); + DWORD dwParam = m_aParams[m_cbSegType->DefItemIndex]; + int segType = HIWORD( dwParam ), + segNo = LOWORD( dwParam ), + errCode = 0; + char tracks[16][3]; + memset( tracks, -1, sizeof(tracks) ); + TStyleItem* pStyItem = m_pStylePanel->GetStyleItem(); + + UINT idLoc = -1, idStyle = 0; + TPROSTYLE* pStyle = pStyItem->pStyle; + if( pStyle && pStyle->idLoc!=0 && pStyle->idLoc!=(UINT)-1 ){ + for( int i=0; iaItems->Count; i++ ){ + TSegmentItem* pSeg = (TSegmentItem*)pStyItem->aItems->Items[i]; + for( int j=0; jaItems->Count; j++ ){ + TTrackItem* pTrk = (TTrackItem*)pSeg->aItems->Items[j]; + if( pTrk->pStyle==pStyle ){ + idLoc = pStyle->idLoc; + idStyle = pStyle->idStyle; + break; + } + } + } + } + + int nBars = f_CM_AddTempSegment( idLoc, idStyle, (char*)strName.c_str(), g_iMelodyTimeSignature, + g_nMelodyTempo, segType, segNo, errCode, tracks ); + + if( nBars<0 ){ //ʧ + if( errCode & E_FileFormatError ) + iTip = 2; + else if( errCode & E_WrongMIDIFormat ) + iTip = 3; + else if( errCode & E_TSConflict ) + iTip = 4; + else if( errCode & E_TempoConfilict ) + iTip = 5; + else if( errCode & E_LessBarsNum ) + iTip = 6; + else if( errCode & E_MoreBarsNum ){ + if( segType==SEGTYPE_FILL ) + iTip = 7; + else + iTip = 8; + } + else if( errCode & E_EmptySegment ) + iTip = 9; + } + else{ //ӳɹ + TPROSTYLE* pTmpStyle = GetStyleInfo( -1, 0 ); + if( !pTmpStyle ){ + pTmpStyle = new TPROSTYLE; + pTmpStyle->idLoc = -1; + pTmpStyle->idStyle = 0; + g_aTempStyles.push_back( pTmpStyle ); + } + + DWORD opts = OPT_DEL | OPT_VOL | (segType=0 ){ + pSegItem->AddTrack( pTmpStyle, segNo, + tracks[i][0], + tracks[i][1], + tracks[i][2], + opts ); + } + else + break; + } + + if( pStyle && pStyle->idLoc!=0 && pStyle->idLoc!=(UINT)-1 ){ + for( int i=0; iaItems->Count; i++ ){ + TSegmentItem* pSeg = (TSegmentItem*)pStyItem->aItems->Items[i]; + for( int j=0; jaItems->Count; j++ ){ + TTrackItem* pTrk = (TTrackItem*)pSeg->aItems->Items[j]; + if( pTrk->pStyle==pStyle ){ + pTrk->pStyle = pTmpStyle; + } + } + } + } + + if( segType>=SEGTYPE_INTRO ){ + pSegItem->nBars = nBars; + } + + g_strSegImportPath = ExtractFilePath( m_editFileName->Text ).c_str(); + + m_pStylePanel->AddTempSegment( pSegItem ); + + SetSegType(); + + if( m_cbSegType->ItemsCount==0 ){ + iTip = 1; + m_btnBrowse->Enabled = false; + m_btnOk->Enabled = false; + } + } + } + + m_lblTips->Font->Color = iTip<2 ? 0x00DACBBF : 0x004040FF; + m_lblTips->Caption = strTips[iTip]; +} +//--------------------------------------------------------------------------- + +void __fastcall TImportSegmentForm::BrowseClick(TObject *Sender) +{ + TOpenDialog * pDlg = new TOpenDialog(NULL); + pDlg->Options << ofFileMustExist; + pDlg->Title = L""; + if( m_editFileName->Text.Length()>0 ){ + pDlg->FileName = ExtractFileName(m_editFileName->Text); + pDlg->InitialDir = ExtractFilePath(m_editFileName->Text); + } + else{ + pDlg->InitialDir = g_strSegImportPath.c_str(); + } + + + pDlg->Filter = "midiļ (*.mid)|*.MID"; + + if(pDlg->Execute(Handle)){ + m_editFileName->Text = pDlg->FileName; + } + + delete pDlg; +} +//--------------------------------------------------------------------------- + + +void __fastcall TImportSegmentForm::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) +{ + switch( Key ){ + case VK_RETURN: + if(m_btnOk->Enabled) + OkClick(NULL); + break; + + case VK_ESCAPE: + ModalResult = mrCancel; + break; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TImportSegmentForm::FormCreate(TObject *Sender) +{ + m_panelBk->Font->Size = g_szFont9; + m_btnBrowse->FontSize = g_szFont9; + m_btnCancel->FontSize = g_szFont9; + m_btnOk->FontSize = g_szFont9; + m_cbSegType->SetFont(g_strTxtFontName, g_szFont9); + m_editFileName->SetTextFont(g_strTxtFontName, g_szFont9); +} +//--------------------------------------------------------------------------- + diff --git a/ImportSegmentFormUnit.dfm b/ImportSegmentFormUnit.dfm new file mode 100644 index 0000000..b8a3e8d --- /dev/null +++ b/ImportSegmentFormUnit.dfm @@ -0,0 +1,131 @@ +object ImportSegmentForm: TImportSegmentForm + Left = 0 + Top = 0 + BorderIcons = [] + BorderStyle = bsNone + ClientHeight = 184 + ClientWidth = 423 + Color = clBtnFace + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + KeyPreview = True + Position = poMainFormCenter + Scaled = False + OnCreate = FormCreate + OnKeyDown = FormKeyDown + TextHeight = 13 + object m_panelBk: TGeneralDialogPanel + Left = 0 + Top = 0 + Width = 423 + Height = 184 + Align = alClient + Caption = #23548#20837'MIDI'#29255#27573 + Color = 5064257 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentBackground = False + ParentFont = False + TabOrder = 0 + object m_lblFileName: TLabel + Left = 32 + Top = 53 + Width = 61 + Height = 14 + Caption = 'MIDI'#25991#20214#65306 + Font.Charset = DEFAULT_CHARSET + Font.Color = 14339007 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + Layout = tlCenter + end + object m_btnBrowse: TTextButton + Left = 325 + Top = 48 + Width = 60 + Height = 24 + ParentShowHint = False + ShowHint = True + OnClick = BrowseClick + Text = #27983#35272 + end + object m_btnCancel: TTextButton + Left = 310 + Top = 134 + Width = 75 + Height = 24 + ModalResult = mrCancel + ParentShowHint = False + ShowHint = True + Text = #36864#20986 + end + object m_btnOk: TTextButton + Left = 310 + Top = 97 + Width = 75 + Height = 24 + ParentShowHint = False + ShowHint = True + OnClick = OkClick + Text = #28155#21152 + end + object m_lblTips: TLabel + Left = 32 + Top = 144 + Width = 238 + Height = 14 + Caption = #25552#31034#65306#35831#36873#25321#23548#20837#30340'MIDI'#25991#20214#21644#29255#27573#31867#22411 + Font.Charset = DEFAULT_CHARSET + Font.Color = 14339007 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentFont = False + ShowAccelChar = False + Layout = tlCenter + end + object m_lblSegType: TLabel + Left = 32 + Top = 100 + Width = 60 + Height = 14 + Caption = #29255#27573#31867#22411#65306 + Font.Charset = DEFAULT_CHARSET + Font.Color = 14339007 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + Layout = tlCenter + end + object m_cbSegType: TComboBoxComponent + Left = 99 + Top = 97 + Width = 102 + Height = 24 + ParentShowHint = False + ShowHint = True + ItemHeight = 18 + ShowItemCount = 6 + Parent = m_panelBk + end + object m_editFileName: TLineEdit + Left = 97 + Top = 48 + Width = 220 + Height = 24 + NumberMax = -1 + NumberMin = -1 + TabOrder = 0 + end + end +end diff --git a/ImportSegmentFormUnit.h b/ImportSegmentFormUnit.h new file mode 100644 index 0000000..0212348 --- /dev/null +++ b/ImportSegmentFormUnit.h @@ -0,0 +1,52 @@ +//--------------------------------------------------------------------------- + +#ifndef ImportSegmentFormUnitH +#define ImportSegmentFormUnitH +//--------------------------------------------------------------------------- +#include +#include +#include +#include + +#include "GlobalUnit.h" +#include "StyleItem.h" +#include "ComboBoxComponent.h" +#include "GeneralDialogPanel.h" +#include "LineEdit.h" +#include "TextButton.h" +#include "PreStylePanel.h" +#include +//#include +//--------------------------------------------------------------------------- +class TImportSegmentForm : public TForm +{ +__published: // IDE-managed Components + TLabel *m_lblFileName; + TLabel *m_lblSegType; + TGeneralDialogPanel *m_panelBk; + TLineEdit *m_editFileName; + TTextButton *m_btnBrowse; + TTextButton *m_btnCancel; + TTextButton *m_btnOk; + TLabel *m_lblTips; + TComboBoxComponent *m_cbSegType; + void __fastcall OkClick(TObject *Sender); + void __fastcall BrowseClick(TObject *Sender); + void __fastcall FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift); + void __fastcall FormCreate(TObject *Sender); +private: // User declarations +// TStyleItem* m_pStyItem; +// TSegmentItem* m_pSegItem; + TPreStylePanel* m_pStylePanel; + vector m_aParams; + + void SetSegType(); +public: // User declarations + __fastcall TImportSegmentForm(TComponent* Owner, TPreStylePanel* pStylePanel ); + +// TSegmentItem* GetTempSegment() { return m_pSegItem; }; +}; +//--------------------------------------------------------------------------- +extern PACKAGE TImportSegmentForm *ImportSegmentForm; +//--------------------------------------------------------------------------- +#endif diff --git a/Instruments.cpp b/Instruments.cpp new file mode 100644 index 0000000..0a345a1 --- /dev/null +++ b/Instruments.cpp @@ -0,0 +1,374 @@ +//--------------------------------------------------------------------------- + +#pragma hdrstop + +#include "Instruments.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) + +char *GM_GROUP[] = { + "", + "״", + "", + "", + "˾", + "", + "/ϳ", + "ͭ", + "ɹ", + "ľ", + "ϳ", + "ϳɱ", + "ϳЧ", + "", + "", + "Ч" +}; + +char * GM_INSTRUMENT[] = { +// + "" +,"" +,"" +,"ưɸ" +,"͵" +,"ϳ" +,"ҹŸ" +,"ҹŸ" + +// +,"Ƭ" +,"" +,"" +,"" +,"ְ" +,"ľ" +,"" +,"" + +// +,"˷" +,"ʽ" +,"ҡ" +,"÷" +,"ɹܷ" +,"ַ" +,"" +,"ַ̽" + +// +,"Ҽ" +,"Ҽ" +,"ʿ缪" +,"缪" +,"缪" +,"缪" +,"ʧ缪" +,"" + +//˾ +,"ԭ˾" +,"ָ籴˾" +,"Ƭ籴˾" +,"Ʒ˾" +,"ƻ˾1" +,"ƻ˾2" +,"ϳɱ˾1" +,"ϳɱ˾2" + +// +,"С" +,"" +,"" +,"" +,"" +,"" +,"" +,"" + +///ϳ +,"ֺ1" +,"ֺ2" +,"ϳֺ1" +,"ϳֺ2" +,"ϳ()" +,"ϳ()" +,"ϳ" +,"" + +//ͭ +,"С" +,"" +,"" +,"С" +,"Բ" +,"ͭ" +,"ϳͭ1" +,"ϳͭ2" + +//Ƭ +,"˹" +,"˹" +,"˹" +,"˹" +,"˫ɹ" +,"Ӣ" +,"()" +,"ɹ(ڹ)" + +//ľ +,"̵" +,"" +,"" +,"" +,"ƿ" +,"ձ߰" +,"" +,"յ()" + +//ϳ +,"ϳ1()" +,"ϳ2(ݲ)" +,"ϳ3" +,"ϳ4" +,"ϳ5" +,"ϳ6()" +,"ϳ7(ƽ)" +,"ϳ8(˾)" + +//ϳɱ +,"ϳɱ1(ʱ)" +,"ϳɱ2(ů)" +,"ϳɱ3" +,"ϳɱ4(ϳ)" +,"ϳɱ5()" +,"ϳɱ6()" +,"ϳɱ7(⻷)" +,"ϳɱ8" + +//ϳЧ +,"Ч()" +,"Ч()" +,"Ч(ˮ)" +,"Ч()" +,"Ч()" +,"Ч()" +,"Ч()" +,"Ч(ƻ)" + +// +,"" +,"׿" +,"" +,"ʮ" +,"ְ" +,"" +,"" +,"ɽ" + +// +,"" +,"" +,"ֹ" +,"ľ" +,"̫" +,"ͨͨ" +,"ϳɹ" +,"" + +//Ч +,"" +,"" +,"" +,"" +,"绰" +,"ֱɻ" +,"" +,"ǹ" +}; + +char * LSZ_STYLTYPES[24] = +{ +"", +"ҥ", +"ҡ", +"", +"ʿ", +"", +"ɣ", +"ŵ", +"Բ", +"", +"", +"R&B", +"", +"Сҹ", +"", +"", +"˵", +"", +"", +"׹", +"", +"ҡ", +"", +"FUNKY" +} ; + +char * CNS_INSTRUMENT[] = { +// +"", +"", +"С", +"", +"", +"2", +"", +"2", +"", + +// +"", +"ߺ", +"", +"", + +// +"1", +"2", +"", +"", +"", + +"", +"", +"", +"", +"", +"", +"", +"", +"", +"", +"", +"", +"", + +// +"ʹ", +"", +"1", +"2", +"", +"", +"", +"Ϸ", +"", +"", +"Ź", +"", +"Ź", +"", +"" +}; + +FONTINFO::FONTINFO() +{ + memset( this, 0, sizeof(FONTINFO) ); +} + +FONTINFO::FONTINFO( char* strFile, char* strFont, int nInst, FONTPRESET* setInst, + int nDrum, FONTPRESET* setDrum ) +{ + strcpy(strFileName, strFile); + + if( strlen(strFont) > 0 ) + strcpy(strFontName, strFont); + else{ + char *name = strrchr( strFile, '\\' )+1, + *ext = strrchr( strFile, '.' ); + + if( ext>name ){ + strncpy( strFontName, name, ext-name ); + strFontName[ext-name] = '\0'; + } + else + strcpy(strFontName, name ); + } + + nInstCount = nInst; + if( nInst>0 ){ + aInsts = new FONTPRESET[nInst]; + memcpy( aInsts, setInst, sizeof(FONTPRESET) * nInst ); + } + else{ + aInsts = NULL; + } + + nDrumCount = nDrum; + if( nDrum>0 ){ + aDrums = new FONTPRESET[nDrum]; + memcpy( aDrums, setDrum, sizeof(FONTPRESET) * nDrum ); + } + else{ + aDrums = NULL; + } +} + +VSTINFO::VSTINFO() +{ + memset( this, 0, sizeof(VSTINFO) ); +} + +VSTINFO::VSTINFO( char* strFile, char* strEff, unsigned int id ) +{ + uniqueID = id; + strcpy(strFileName, strFile); + + if( strlen(strEff) > 0 && stricmp(strEff, "container") ) + strcpy(strVSTName, strEff); + else{ + char *name = strrchr( strFile, '\\' )+1, + *ext = strrchr( strFile, '.' ); + + if( ext>name ){ + strncpy( strVSTName, name, ext-name ); + strVSTName[ext-name] = '\0'; + } + else + strcpy(strVSTName, name ); + } +} + +VSTINFO::~VSTINFO() +{ + while( !aPlugins.empty() ){ + delete aPlugins.back(); + aPlugins.pop_back(); + } +} + +char AutoTransCNS( char prog ) +{ + char ret = -1; + + if( prog>=8 && prog<=15 ) + ret = 17; + else if( prog>=16 && prog<=23 ) + ret = 9;//3; + else if( prog>=40 && prog<=45 ) + ret = 9; + else if( prog==46 ) + ret = 13; + else if( prog==47 ) + ret = 31; + else if( prog>=56 && prog<=63 ) + ret = 1; + else if( prog>=64 && prog<=71 ) + ret = 4; + else if( prog>=72 && prog<=79 ) + ret = 6; + + return ret; +} + diff --git a/Instruments.h b/Instruments.h new file mode 100644 index 0000000..309802d --- /dev/null +++ b/Instruments.h @@ -0,0 +1,61 @@ +//--------------------------------------------------------------------------- + +#ifndef InstrumentsH +#define InstrumentsH +//--------------------------------------------------------------------------- + +struct FONTPRESET{ + char text[40]; + int id; +}; + +class FONTINFO +{ +public: + char strFileName[256]; + char strFontName[80]; + FONTPRESET* aInsts; + int nInstCount; + FONTPRESET* aDrums; + int nDrumCount; + + FONTINFO(); + FONTINFO( char* strFile, char* strFont, int nInst, FONTPRESET* setInst, + int nDrum, FONTPRESET* setDrum ); +}; +#include +using namespace std; + +#define VSTeffect 1 +#define VSTinstrument 2 +#define VSTshell 4 + +struct VSTPLUGIN{ + char name[64]; + unsigned int id; +}; + +class VSTINFO +{ +public: + char strFileName[256]; + char strVSTName[80]; + unsigned int uniqueID; + vector aPlugins; + + VSTINFO(); + VSTINFO( char* strFile, char* strEff, unsigned int id ); + ~VSTINFO(); +}; + +typedef vector FONTINFOLIST; +typedef vector VSTINFOLIST; + +extern char * GM_GROUP[]; +extern char * GM_INSTRUMENT[]; +extern char * LSZ_STYLTYPES[]; +extern char * CNS_INSTRUMENT[]; + +char AutoTransCNS( char prog ); + +#endif diff --git a/KeyBoard.cpp b/KeyBoard.cpp new file mode 100644 index 0000000..4777334 --- /dev/null +++ b/KeyBoard.cpp @@ -0,0 +1,325 @@ +//--------------------------------------------------------------------------- + +#pragma hdrstop + +#include "KeyBoard.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) + +__fastcall TKeyBoard::TKeyBoard(TComponent* Owner) + : Vcl::Extctrls::TPanel(Owner) +{ + Height = 145; + Width = 430; + Left = 150; + Top = 500; + + m_pBmpWhiteDDown = new TBitmap(); + m_pBmpWhiteDDown->LoadFromResourceName(int(HInstance), "KBWhiteDDown"); + m_pBmpWhiteLDown = new TBitmap(); + m_pBmpWhiteLDown->LoadFromResourceName(int(HInstance), "KBWhiteLDown"); + m_pBmpWhiteRDown = new TBitmap(); + m_pBmpWhiteRDown->LoadFromResourceName(int(HInstance), "KBWhiteRDown"); + m_pBmpBlackDown = new TBitmap(); + m_pBmpBlackDown->LoadFromResourceName(int(HInstance), "KBBlackDown"); + m_nBlackWidth = m_pBmpBlackDown->Width; + m_nBlackHeight = m_pBmpBlackDown->Height; + m_nWhiteWidth = m_pBmpWhiteDDown->Width; + m_nGroupWidth = m_nWhiteWidth * 7; + + m_aBlackHitTest[0].x1 = 12; + m_aBlackHitTest[0].iKey = 1; + m_aBlackHitTest[1].x1 = 32; + m_aBlackHitTest[1].iKey = 3; + m_aBlackHitTest[2].x1 = 72; + m_aBlackHitTest[2].iKey = 6; + m_aBlackHitTest[3].x1 = 92; + m_aBlackHitTest[3].iKey = 8; + m_aBlackHitTest[4].x1 = 112; + m_aBlackHitTest[4].iKey = 10; + + for (int i = 0; i < 5; i++) + m_aBlackHitTest[i].x2 = m_aBlackHitTest[i].x1 + m_pBmpBlackDown->Width; + + m_aKey[0].xPos = -1; + m_aKey[0].pBmp = m_pBmpWhiteRDown; + m_aKey[1].xPos = 12; + m_aKey[1].pBmp = m_pBmpBlackDown; + m_aKey[2].xPos = 19; + m_aKey[2].pBmp = m_pBmpWhiteDDown; + m_aKey[3].xPos = 32; + m_aKey[3].pBmp = m_pBmpBlackDown; + m_aKey[4].xPos = 39; + m_aKey[4].pBmp = m_pBmpWhiteLDown; + m_aKey[5].xPos = 59; + m_aKey[5].pBmp = m_pBmpWhiteRDown; + m_aKey[6].xPos = 72; + m_aKey[6].pBmp = m_pBmpBlackDown; + m_aKey[7].xPos = 79; + m_aKey[7].pBmp = m_pBmpWhiteDDown; + m_aKey[8].xPos = 92; + m_aKey[8].pBmp = m_pBmpBlackDown; + m_aKey[9].xPos = 99; + m_aKey[9].pBmp = m_pBmpWhiteDDown; + m_aKey[10].xPos = 112; + m_aKey[10].pBmp = m_pBmpBlackDown; + m_aKey[11].xPos = 119; + m_aKey[11].pBmp = m_pBmpWhiteLDown; + + m_iPressGroup = m_iPressKey = -1; + + // + m_ImgBrk = new TPngImage(); + m_ImgBrk->LoadFromResourceName(int(HInstance), "KeyBoard"); + + m_imgKeyboard = new TImage(this); + m_imgKeyboard->Parent = this; + m_imgKeyboard->Picture->Assign(m_ImgBrk); + m_imgKeyboard->Left = 0; + m_imgKeyboard->Top = 0; + m_imgKeyboard->Width = Width; + m_imgKeyboard->Height = Height; + + m_imgKeyboard->Visible = true; + + //PaintBox + m_pbKeyboard = new TPaintBox(this); + m_pbKeyboard->Parent = this; + m_pbKeyboard->Left = 6; + m_pbKeyboard->Top = 19; // Will be Change! + m_pbKeyboard->Width = 420; + m_pbKeyboard->Height = 121; + m_pbKeyboard->OnPaint = KeyboardPaint; + m_pbKeyboard->OnMouseDown = KeyboardMouseDown; + m_pbKeyboard->OnMouseEnter = KeyboardMouseEnter; + m_pbKeyboard->OnMouseLeave = KeyboardMouseLeave; + m_pbKeyboard->OnMouseMove = KeyboardMouseMove; + m_pbKeyboard->OnMouseUp = KeyboardMouseUp; + m_pbKeyboard->Visible = true; + + //PNG Close + m_ImgClose = new TPngImage(); + m_ImgClose->LoadFromResourceName(int(HInstance), "imgClose"); + + m_PngClose = new TPNGButton(this); + m_PngClose->Parent = this; + m_PngClose->OnClick = CloseClick; + m_PngClose->ImgStates = 3; + m_PngClose->PngImg = m_ImgClose; + m_PngClose->Top = 0; + m_PngClose->Left = Width - 23; + m_PngClose->Visible = true; +} + +__fastcall TKeyBoard::~TKeyBoard() +{ + delete m_PngClose; + m_PngClose = NULL; + + delete m_imgKeyboard; + m_imgKeyboard = NULL; + + delete m_pbKeyboard; + m_pbKeyboard = NULL; + + delete m_pBmpWhiteDDown; + m_pBmpWhiteDDown = NULL; + + delete m_pBmpWhiteLDown; + m_pBmpWhiteLDown = NULL; + + delete m_pBmpWhiteRDown; + m_pBmpWhiteRDown = NULL; + + delete m_pBmpBlackDown; + m_pBmpBlackDown = NULL; + + delete m_imgFirst; + m_imgFirst = NULL; + + delete m_imgSecond; + m_imgSecond = NULL; + + delete m_imgThird; + m_imgThird = NULL; + + delete m_imgForth; + m_imgForth = NULL; + + delete m_ImgClose; //ر + m_ImgClose = NULL; + + delete m_ImgBrk; //ٱ + m_ImgBrk = NULL; +} + +// ģ +int TKeyBoard::KeyboardGetPressKey(int X, int Y) { + short iPressKey = -1, iPressGroup = X / m_nGroupWidth; + int xInGroup = X % m_nGroupWidth; + + int iWhite = xInGroup / m_nWhiteWidth; + if (iWhite < 3) + iPressKey = iWhite * 2; + else + iPressKey = iWhite * 2 - 1; + + if (Y < m_nBlackHeight) { + for (int i = 0; i < 5; i++) { + if (xInGroup >= m_aBlackHitTest[i].x1 && xInGroup < + m_aBlackHitTest[i].x2) { + iPressKey = m_aBlackHitTest[i].iKey; + break; + } + } + } + + return MAKELONG(iPressKey, iPressGroup); +} + + +void __fastcall TKeyBoard::KeyboardPaint(TObject *Sender) +{ + // + if (m_bKeyDown) { + int xPos = m_iPressGroup * m_nGroupWidth + m_aKey[m_iPressKey].xPos; + m_pbKeyboard->Canvas->Draw(xPos, 0, m_aKey[m_iPressKey].pBmp); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TKeyBoard::KeyboardMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, + int X, int Y) +{ + //mouseup + if (Button == mbLeft && m_bKeyDown) { + m_bKeyDown = false; + + f_MM_RealTimeMIDINoteOff(m_iPressGroup*12 + m_iPressKey + 48); + + TRect rect; + rect.init(m_iPressGroup * m_nGroupWidth + m_aKey[m_iPressKey].xPos + 6, + 19, + m_iPressGroup * m_nGroupWidth + m_aKey[m_iPressKey].xPos + 26, + m_pbKeyboard->Height+19); + + m_iPressGroup = m_iPressKey = -1; + + InvalidateRect(m_pbKeyboard->Parent->Handle,&rect,true); +// m_pbKeyboard->Invalidate(); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TKeyBoard::KeyboardMouseMove(TObject *Sender, TShiftState Shift, int X, + int Y) +{ + if (m_bKeyDown && X >= 0 && Y >= 0 && X < m_pbKeyboard->Width && Y < + m_pbKeyboard->Height) { + int iKey = KeyboardGetPressKey(X, Y); + int iPressGroup = HIWORD(iKey); + int iPressKey = LOWORD(iKey); + + if (iPressGroup != m_iPressGroup || iPressKey != m_iPressKey) { + HRESULT hRet = f_MM_RealTimeMIDINoteOff(m_iPressGroup * 12 + m_iPressKey + 48); + hRet = f_MM_RealTimeMIDINoteOn( iPressGroup * 12 + iPressKey + 48); + + TRect rect; + + //ԭ + rect.init(m_iPressGroup * m_nGroupWidth + m_aKey[m_iPressKey].xPos + 6, + 19, + m_iPressGroup * m_nGroupWidth + m_aKey[m_iPressKey].xPos + 26, + m_pbKeyboard->Height+19); + + InvalidateRect(m_pbKeyboard->Parent->Handle,&rect,true); + + m_iPressGroup = iPressGroup; + m_iPressKey = iPressKey; + + // + rect.init(m_iPressGroup * m_nGroupWidth + m_aKey[m_iPressKey].xPos + 6, + 19, + m_iPressGroup * m_nGroupWidth + m_aKey[m_iPressKey].xPos + 26, + m_pbKeyboard->Height+19); + + InvalidateRect(m_pbKeyboard->Parent->Handle,&rect,true); + +// m_pbKeyboard->Invalidate(); + } + } +} +//--------------------------------------------------------------------------- + +void __fastcall TKeyBoard::KeyboardMouseLeave(TObject *Sender) +{ + // + Screen->Cursor = crDefault; +} +//--------------------------------------------------------------------------- + +void __fastcall TKeyBoard::KeyboardMouseEnter(TObject *Sender) +{ + // + Screen->Cursor = crHandPoint; +} +//--------------------------------------------------------------------------- + +void __fastcall TKeyBoard::KeyboardMouseDown(TObject *Sender, TMouseButton Button, + TShiftState Shift, int X, int Y) +{ + // TMouseButton Button, TShiftState Shift, int X, int Y) { + if (Sender == m_pbKeyboard && Button == mbLeft) { + m_bKeyDown = true; + + int iKey = KeyboardGetPressKey(X, Y); + int iPressGroup = HIWORD(iKey); + int iPressKey = LOWORD(iKey); + + if (iPressGroup != m_iPressGroup || iPressKey != m_iPressKey) { + m_iPressGroup = iPressGroup; + m_iPressKey = iPressKey; + + HRESULT hRet = + f_MM_RealTimeMIDINoteOn(m_iPressGroup * 12 + m_iPressKey + 48); + + TRect rect; + rect.init(m_iPressGroup * m_nGroupWidth + m_aKey[m_iPressKey].xPos + 6, + 19, + m_iPressGroup * m_nGroupWidth + m_aKey[m_iPressKey].xPos + 26, + m_pbKeyboard->Height+19); + + InvalidateRect(m_pbKeyboard->Parent->Handle,&rect,true); + } + } +} +//--------------------------------------------------------------------------- + +void __fastcall TKeyBoard::ShowKeyboard( bool bShow ) +{ + if( bShow ){ + // ģ豸 + HRESULT hResult = f_MM_CreateRealTimeMIDIStream( false ); + if (hResult != S_OK) { + DebugPrint("Create realtime midi stream error.\n"); + } + else{ + this->Show(); + } + } + else if( !bShow ){ + this->Hide(); + + // ͷģ豸 + HRESULT hResult = f_MM_FreeRealTimeMIDIStream(); + if (hResult != S_OK) { + DebugPrint("Free realtime midi stream error.\n"); + } + } +} + +void __fastcall TKeyBoard::CloseClick(System::TObject* Sender) +{ +// ShowKeyboard( false ); + Application->MainForm->Perform( UM_SHOW_KB, NULL, NULL ); +} diff --git a/KeyBoard.h b/KeyBoard.h new file mode 100644 index 0000000..58d461b --- /dev/null +++ b/KeyBoard.h @@ -0,0 +1,65 @@ +//--------------------------------------------------------------------------- + +#ifndef KeyBoardH +#define KeyBoardH +#include +#include "PNGButton.hpp" +#include "GlobalUnit.h" +//--------------------------------------------------------------------------- +class TKeyBoard : public TPanel +{ + +private: + TPNGButton *m_PngClose; + TImage *m_imgKeyboard; + TPaintBox *m_pbKeyboard; + + struct { + int xPos; + TBitmap * pBmp; + } m_aKey[12]; + struct { + int x1; + int x2; + int iKey; + } m_aBlackHitTest[5]; + + bool m_bKeyDown; + int m_nGroupWidth, + m_nWhiteWidth, + m_nBlackWidth, + m_nBlackHeight, + m_iPressGroup, + m_iPressKey; + + TBitmap * m_pBmpWhiteDDown, + * m_pBmpWhiteLDown, + * m_pBmpWhiteRDown, + * m_pBmpBlackDown; + + TPngImage * m_imgFirst, + * m_imgSecond, + * m_imgThird, + * m_imgForth, + * m_ImgClose, //ر + * m_ImgBrk; //ٱ +private: + int KeyboardGetPressKey(int X, int Y); + void __fastcall CloseClick(System::TObject* Sender); + + void __fastcall KeyboardPaint(TObject *Sender); + void __fastcall KeyboardMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, + int X, int Y); + void __fastcall KeyboardMouseMove(TObject *Sender, TShiftState Shift, int X, int Y); + void __fastcall KeyboardMouseLeave(TObject *Sender); + void __fastcall KeyboardMouseEnter(TObject *Sender); + void __fastcall KeyboardMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, + int X, int Y); + +public: + void __fastcall ShowKeyboard( bool bShow ); + + __fastcall TKeyBoard(TComponent* Owner); + __fastcall ~TKeyBoard(); +}; +#endif diff --git a/LineEdit.h b/LineEdit.h new file mode 100644 index 0000000..6aa18f7 --- /dev/null +++ b/LineEdit.h @@ -0,0 +1,186 @@ +//--------------------------------------------------------------------------- + +#ifndef LineEditH +#define LineEditH +//--------------------------------------------------------------------------- +#include +//--------------------------------------------------------------------------- +class PACKAGE TLineEdit : public TWinControl +{ +private: + TEditCharCase FCharCase; + TColor FBorderColor, // ߿ɫ + FShadowColor; // Ӱɫ + TAlignment FAlignment; + WideChar FPasswordChar; + String FText; + String FHintText; + TColor FHintColor; + bool FHideSelection, + FNumbersOnly, + FOEMConvert, + FReadOnly; + int FMaxLength, + FNumberMax, + FNumberMin; + TNotifyEvent FOnChange; + + TControlCanvas *m_Canvas; + int m_ShadowColorArray[4]; // Ӱɫ + int m_FontHeight; // ߶ + bool m_IsCreated; + TLabel *m_HintLabel; + TColor m_FontColor; // ɫ + TRect m_TextRect; + WCHAR m_TextBuf[512]; + + void __fastcall AdjustThisSize(); + + int __fastcall CalcColorValue(TColor BgColor, TColor FrColor, int Level, int Alpha); + int __fastcall CalcFontHeight(); + void __fastcall CreateShadowColor(); // Ӱɫ + + void __fastcall SetBorderColor(TColor Color); + void __fastcall SetOnChange(TNotifyEvent OnChange); + void __fastcall SetShadowColor(TColor Color); + + void __fastcall ShowHintText(); + +/******************************************************************************/ +// ༭ +/******************************************************************************/ + void __fastcall DoHintLabelMouseDown(TObject *Sender, + TMouseButton Button, + TShiftState Shift, int X, int Y); + + UnicodeString __fastcall GetText(); + + bool __fastcall GetCanUndo(); + int __fastcall GetSelLength(); + int __fastcall GetSelStart(); + String __fastcall GetSelText(); + + void __fastcall SetAlignment(TAlignment Value); + void __fastcall SetCharCase(TEditCharCase Value); + void __fastcall SetHideSelection(bool Value); + void __fastcall SetHintText(String Value); + void __fastcall SetHintColor(TColor Value); + void __fastcall SetNumbersOnly(bool Value); + void __fastcall SetOEMConvert(bool Value); + void __fastcall SetPasswordChar(WideChar Value); + void __fastcall SetReadOnly(bool Value); + void __fastcall SetText(UnicodeString Value); + + void __fastcall SetMaxLength(int Value); + void __fastcall SetSelLength(int Value); + void __fastcall SetSelStart(int Value); + + void __fastcall SetNumberMax(int Value); + void __fastcall SetNumberMin(int Value); +/******************************************************************************/ + + MESSAGE void __fastcall CMColorChanged(TMessage &Message); + MESSAGE void __fastcall CMFontChanged(TWMFontChange &Message); + MESSAGE void __fastcall WMChar(TWMChar &Message); + MESSAGE void __fastcall WMCommand(TWMCommand &Message); + MESSAGE void __fastcall WMCtlColorEdit(TWMCtlColorEdit &Message); + MESSAGE void __fastcall WMCtlColorStatic(TWMCtlColorStatic &Message); + MESSAGE void __fastcall WMEraseBkgnd(TWMEraseBkgnd &Message); + MESSAGE void __fastcall WMKeyDown(TWMKeyDown &Message); + MESSAGE void __fastcall WMKillFocus(TWMKillFocus &Message); + MESSAGE void __fastcall WMPaint(TWMPaint &Message); + MESSAGE void __fastcall WMSetFocus(TWMSetFocus &Message); + MESSAGE void __fastcall WMSize(TWMSize &Message); + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(CM_COLORCHANGED, TMessage, CMColorChanged) + MESSAGE_HANDLER(CM_FONTCHANGED, TWMFontChange, CMFontChanged) + MESSAGE_HANDLER(CN_COMMAND, TWMCommand, WMCommand) + MESSAGE_HANDLER(CN_CTLCOLOREDIT, TWMCtlColorEdit, WMCtlColorEdit) + MESSAGE_HANDLER(CN_CTLCOLORSTATIC, TWMCtlColorStatic, WMCtlColorStatic) + MESSAGE_HANDLER(WM_CHAR, TWMChar, WMChar) + MESSAGE_HANDLER(WM_ERASEBKGND, TWMEraseBkgnd, WMEraseBkgnd) + MESSAGE_HANDLER(WM_KEYDOWN, TWMKeyDown, WMKeyDown) + MESSAGE_HANDLER(WM_KILLFOCUS, TWMKillFocus, WMKillFocus) + MESSAGE_HANDLER(WM_PAINT, TWMPaint, WMPaint) + MESSAGE_HANDLER(WM_SETFOCUS, TWMSetFocus, WMSetFocus) + MESSAGE_HANDLER(WM_SIZE, TWMSize, WMSize) + END_MESSAGE_MAP(TWinControl) + + __property Hint; + +protected: + virtual void __fastcall CreateParams(TCreateParams &Params); + virtual void __fastcall CreateWindowHandle(const TCreateParams &Params); + virtual void __fastcall CreateWnd(); + +public: + __fastcall TLineEdit(TComponent* Owner); + __fastcall ~TLineEdit(); + + void __fastcall SetFocus(); + void __fastcall SetCursorPos(int Pos); + void __fastcall SetTextFont(String name, int size); + +/******************************************************************************/ +// ༭ +/******************************************************************************/ + void __fastcall Clear(); + void __fastcall ClearSelection(); + void __fastcall CopyToClipboard(); + void __fastcall CutToClipboard(); + + void __fastcall PasteFromClipboard(); + void __fastcall Undo(); + void __fastcall ClearUndo(); + void __fastcall SelectAll(); + + __property bool CanUndo = {read = GetCanUndo, nodefault}; + __property int SelLength = {read = GetSelLength, write = SetSelLength, nodefault}; + __property int SelStart = {read = GetSelStart, write = SetSelStart, nodefault}; + __property String SelText = {read = GetSelText}; + + __property AlignWithMargins = {default = false}; + __property HelpContext; + __property HelpKeyword; + __property HelpType; + __property Margins; + __property Cursor; +/******************************************************************************/ + +__published: + __property TColor BorderColor = {read = FBorderColor, write = SetBorderColor, default = TColor(0x5F5954)}; + __property TColor ShadowColor = {read = FShadowColor, write = SetShadowColor, default = TColor(0x4C463F)}; + + __property TNotifyEvent OnChange = {read = FOnChange, write = SetOnChange}; + + + __property TAlignment Alignment = {read = FAlignment, write = SetAlignment}; + __property TEditCharCase CharCase = {read = FCharCase, write = SetCharCase}; + + __property bool HideSelection = {read = FHideSelection, write = SetHideSelection}; + __property String HintText = {read = FHintText, write = SetHintText}; + __property TColor HintColor = {read = FHintColor, write = SetHintColor, default = TColor(0x594D43)}; + __property int MaxLength = {read = FMaxLength, write = SetMaxLength, default = 500}; + __property bool NumbersOnly = {read = FNumbersOnly, write = SetNumbersOnly}; + __property bool OEMConvert = {read = FOEMConvert, write = SetOEMConvert}; + __property WideChar PasswordChar = {read = FPasswordChar, write = SetPasswordChar}; + __property bool ReadOnly = {read = FReadOnly, write = SetReadOnly}; + + __property int NumberMax = {read = FNumberMax, write = SetNumberMax}; + __property int NumberMin = {read = FNumberMin, write = SetNumberMin}; + + __property UnicodeString Text = {read = GetText, write = SetText}; + + __property Color = {default = TColor(0xC4B4A8)}; + __property Font; + + __property TabOrder = {default = -1}; + __property TabStop = {default = true}; + + __property OnKeyDown; + __property OnKeyPress; + __property OnKeyUp; +}; +//--------------------------------------------------------------------------- +#endif diff --git a/ListPanel.cpp b/ListPanel.cpp new file mode 100644 index 0000000..26c77aa --- /dev/null +++ b/ListPanel.cpp @@ -0,0 +1,567 @@ +//--------------------------------------------------------------------------- + +#pragma hdrstop + +#include "ListPanel.h" +#include "GlobalUnit.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) + +#define LP_ITEM_OVER RGB(67, 73, 80) +#define LP_ITEM_SELECTED RGB(29, 31, 35) +#define LP_ITEM_DEF RGB(47, 50, 57) + +#define IS_OVER 1 +#define IS_SELECTED 2 +#define IS_UNSELECTED 3 +//--------------------------------------------------------------------------- +__fastcall TListPanelItem::TListPanelItem(String Caption, TListPanelItemClick OnItemClick) +{ + FCaption = Caption; + FOnItemClick = OnItemClick; + Tag = 0; +} +//--------------------------------------------------------------------------- +void __fastcall TListPanelItem::DrawItem(TCanvas *Canvas, TRect Rect, int flag) +{ + switch (flag) { + case IS_OVER: + Canvas->Brush->Color = LP_ITEM_OVER; + break; + + case IS_SELECTED: + Canvas->Brush->Color = LP_ITEM_SELECTED; + break; + + default: + Canvas->Brush->Color = LP_ITEM_DEF; + } + + /* Ʊ */ + Canvas->FillRect(Rect); + + Canvas->Font->Color = TColor(RGB(201, 214, 229)); + + /* */ + int var_TextRectTop = Rect.Top + (Rect.Height() - Canvas->TextHeight(FCaption)) / 2; + + TRect var_TextRect(4, var_TextRectTop, Rect.Right - 4, Rect.Bottom); + + Canvas->TextRect(var_TextRect, FCaption); +} +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +#define LP_BORDER RGB(106, 111, 117) +#define LP_BACKGRND RGB(47, 50, 57)//39, 42, 47) + +#define LP_BORDER_HL RGB(30, 32, 36) +#define LP_BACKGRND_HL RGB(67, 73, 80) + +#define LP_TXT_NOR RGB(213, 221, 232) +#define LP_TXT_DISABLE RGB(100, 108, 119) +#define LP_BREAK RGB(100, 108, 119) +#define LP_BOARD_FILL RGB(76, 82, 91) + +#define MIN(x, y) ((x) < (y) ? (x) : (y)) +#define MAX(x, y) ((x) > (y) ? (x) : (y)) + +#define MARGIN 2 +//--------------------------------------------------------------------------- +__fastcall TListPanel::TListPanel(TComponent *Owner) : TPanel(Owner) +{ +// m_ItemRectList = new TList(); + m_ItemList = new TList(); + + Canvas->Font->Color = LP_TXT_NOR; + + FItemHeight = 20; + FSelectedItemIndex = -1; + + m_CurrentItemIndex = -1; + m_RealShowCount = 0; + + m_BeginIndex = 0; + m_EndIndex = 0; + + m_IsLButtonDown = false; + + m_ScrollBar = new TSkinScrollBar(NULL); + m_ScrollBar->Visible = false; +} +//--------------------------------------------------------------------------- +__fastcall TListPanel::~TListPanel() +{ +/* if(m_ItemRectList) + { + for( int i=0; iCount; i++ ){ + delete m_ItemRectList->Items[i]; + } + + m_ItemRectList->Clear(); + delete m_ItemRectList; + m_ItemRectList = NULL; + } +*/ + for( int i=0; iCount; i++ ){ + delete m_ItemList->Items[i]; + } + + m_ItemList->Clear(); + delete m_ItemList; + m_ItemList = NULL; + + if(m_ScrollBar) + { + delete m_ScrollBar; + m_ScrollBar = NULL; + } +} +//--------------------------------------------------------------------------- +void __fastcall TListPanel::AddItem(TListPanelItem* Item) +{ + m_ItemList->Add(Item); + +/* if(HandleAllocated()) { + Reset(); + } +*/ +} +//--------------------------------------------------------------------------- +void __fastcall TListPanel::Clear() +{ + for( int i=0; iCount; i++ ){ + delete m_ItemList->Items[i]; + } + m_ItemList->Clear(); + + FSelectedItemIndex = -1; + m_CurrentItemIndex = -1; + + m_BeginIndex = 0; + m_EndIndex = 0; + + ResetScroll(); +// if(HandleAllocated()) { +// Reset(); + +// Repaint(); +// } +} +//--------------------------------------------------------------------------- +void __fastcall TListPanel::CreateWnd() +{ + TPanel::CreateWnd(); + + // ù + m_ScrollBar->Height = Height - 2; + m_ScrollBar->Top = 1; + m_ScrollBar->Left = Width - m_ScrollBar->Width - 1; + m_ScrollBar->Parent = this; + m_ScrollBar->m_pWndCtrl = this; + + //ʾ + m_ShowCount = (Height - 2 * MARGIN) / FItemHeight; + + // ¼ʾ +/* m_ItemRectList->Clear(); + m_ItemRectList->Add(new TRect(MARGIN, MARGIN, Width - MARGIN, FItemHeight + MARGIN)); + for(int i = 1; i < m_ShowCount; i++) + { + int var_ItemTop = i * FItemHeight + MARGIN; + int var_ItemBottom = var_ItemTop + FItemHeight; + + m_ItemRectList->Add(new TRect(MARGIN, var_ItemTop, Width - MARGIN, var_ItemBottom)); + } +*/ + // ¼Item + m_ItemArea = TRect(MARGIN, MARGIN, Width - MARGIN, m_ShowCount * FItemHeight + MARGIN); + + ResetScroll(); +} +//--------------------------------------------------------------------------- +int __fastcall TListPanel::GetItemsCount() +{ + if(m_ItemList) + return m_ItemList->Count; + else + return -1; +} +//--------------------------------------------------------------------------- +//void __fastcall TListPanel::SetTextFontSize(int sz) +//{ +// Canvas->Font->Size = sz; +//} +//--------------------------------------------------------------------------- +void __fastcall TListPanel::SetTextFont(String name, int size) +{ + Canvas->Font->Name = name; + Canvas->Font->Size = size; +} +//--------------------------------------------------------------------------- +TListPanelItem *__fastcall TListPanel::GetItem(int Index) +{ + if(ItemsCount == 0 || Index < 0 || Index > ItemsCount) + return NULL; + else + return (TListPanelItem *)m_ItemList->Items[Index]; +} +/*/--------------------------------------------------------------------------- +TRect *__fastcall TListPanel::GetItemRect(int Index) +{ + return (TRect *)m_ItemRectList->Items[Index]; +} +*/ +//--------------------------------------------------------------------------- +void __fastcall TListPanel::MouseDown(TMouseButton Button, TShiftState Shift, int X, int Y) +{ + TPanel::MouseDown(Button, Shift, X, Y); + + if(m_ScrollBar->Visible && Button == 0) { + m_IsLButtonDown = true; + m_ScrollBar->Enabled = false; + } + + int areaRight = 0; + + m_ScrollBar->Visible ? areaRight = m_ItemArea.Right - m_ScrollBar->Width - 1 + : areaRight = m_ItemArea.Right; + + if(Button == 0 && X >= m_ItemArea.Left && X < areaRight && Y >= m_ItemArea.Top + && Y < m_ItemArea.Bottom && ItemsCount > 0) + { + int index = (Y - MARGIN) / FItemHeight + m_BeginIndex; + + if(index < m_ItemList->Count && m_ItemList->Count != 0) + { + if(FSelectedItemIndex != index) + { + if(FSelectedItemIndex >= m_BeginIndex && FSelectedItemIndex < m_EndIndex) + SetItemStatus(FSelectedItemIndex, IS_UNSELECTED); + + FSelectedItemIndex = index; + + SetItemStatus(FSelectedItemIndex, IS_SELECTED); + } + + GetItem(FSelectedItemIndex)->OnItemClicked(this, FSelectedItemIndex); + } + } +} +//--------------------------------------------------------------------------- +void __fastcall TListPanel::MouseMove(TShiftState Shift, int X, int Y) +{ + TPanel::MouseMove(Shift, X, Y); + + if(m_IsLButtonDown) return; + + if(m_MouseX == X && m_MouseY == Y) return; + + m_MouseX = X; + m_MouseY = Y; + + int areaRight = 0, index = -1; + + m_ScrollBar->Visible ? areaRight = m_ItemArea.Right - m_ScrollBar->Width - 1 + : areaRight = m_ItemArea.Right; + + if(X >= m_ItemArea.Left && X < areaRight && Y >= m_ItemArea.Top + && Y < m_ItemArea.Bottom && ItemsCount > 0) + { + index = (Y - MARGIN) / FItemHeight + m_BeginIndex; + + if(index < m_ItemList->Count && m_ItemList->Count != 0) + { + if(index != m_CurrentItemIndex) + { + /* ԭһѡ */ + if(m_CurrentItemIndex >= m_BeginIndex && m_CurrentItemIndex < m_EndIndex) + { + m_CurrentItemIndex == FSelectedItemIndex ? SetItemStatus(m_CurrentItemIndex, IS_SELECTED) + : SetItemStatus(m_CurrentItemIndex, IS_UNSELECTED); + } + /* µǰѡ */ + m_CurrentItemIndex = index; + /* ػѡ */ + m_CurrentItemIndex == FSelectedItemIndex ? SetItemStatus(m_CurrentItemIndex, IS_SELECTED) + : SetItemStatus(m_CurrentItemIndex, IS_OVER); + } + } + } + + if( ( index<0 || index>m_ItemList->Count ) + && m_CurrentItemIndex >= m_BeginIndex + && m_CurrentItemIndex < m_EndIndex ){ + m_CurrentItemIndex==FSelectedItemIndex ? SetItemStatus(m_CurrentItemIndex, IS_SELECTED) + : SetItemStatus(m_CurrentItemIndex, IS_UNSELECTED); + m_CurrentItemIndex = -1; + } +} +//--------------------------------------------------------------------------- +void __fastcall TListPanel::MouseUp(TMouseButton Button, TShiftState Shift, int X, int Y) +{ + TPanel::MouseUp(Button, Shift, X, Y); + + if(m_ScrollBar->Visible && Button == 0) { + m_IsLButtonDown = false; + m_ScrollBar->Enabled = true; + } +} +//--------------------------------------------------------------------------- +void __fastcall TListPanel::SetItemStatus(int Index, int flag) +{ + int var_ItemTop = ( Index - m_BeginIndex ) * FItemHeight + MARGIN; + TRect rtDraw( MARGIN, var_ItemTop, Width - MARGIN, var_ItemTop + FItemHeight ); + + GetItem(Index)->DrawItem(Canvas, rtDraw, flag); +} +//--------------------------------------------------------------------------- +void __fastcall TListPanel::SetSelectedItemIndex(int Index) +{ + if(FSelectedItemIndex != Index) { + if( FSelectedItemIndex>=m_BeginIndex && FSelectedItemIndex=m_ItemList->Count ){ + FSelectedItemIndex = -1; + } + else{ + FSelectedItemIndex = Index; + + int posScroll = m_BeginIndex; + if( Index=m_EndIndex ){ + posScroll = Index - m_ShowCount + 1; + } + + if( posScroll==m_BeginIndex ){ + SetItemStatus( FSelectedItemIndex-m_BeginIndex, IS_SELECTED ); + } + else if( m_ScrollBar->Visible ){ + ScrollPos( posScroll ); + m_ScrollBar->SetPosition(posScroll); + } + } + } +} +//--------------------------------------------------------------------------- +void __fastcall TListPanel::Paint() +{ + Canvas->Lock(); + for(int Index = m_BeginIndex; Index < m_EndIndex; Index++) + { + if(Index == FSelectedItemIndex) + SetItemStatus(Index, IS_SELECTED); + else if(Index == m_CurrentItemIndex) + SetItemStatus(Index, IS_OVER); + else + SetItemStatus(Index, IS_UNSELECTED); + } + + if( m_ShowCount > ItemsCount ){ + int var_Top = ItemsCount * FItemHeight + MARGIN, + var_Bottom = var_Top + ( m_ShowCount - ItemsCount ) * FItemHeight; + TRect rtDraw( MARGIN, var_Top, Width - MARGIN, var_Bottom ); + + Canvas->Brush->Color = LP_BACKGRND; + Canvas->FillRect(rtDraw); + } + + Canvas->Unlock(); +} +//--------------------------------------------------------------------------- +void __fastcall TListPanel::ResetScroll() +{ + m_RealShowCount = MIN(ItemsCount, m_ShowCount); + + if( FSelectedItemIndex>=0 ){ + if( FSelectedItemIndex < m_BeginIndex ){ + m_BeginIndex = FSelectedItemIndex; + } + else if( FSelectedItemIndex >= m_BeginIndex + m_ShowCount ){ + m_BeginIndex = FSelectedItemIndex - m_ShowCount + 1; + } + } + + m_EndIndex = min( m_BeginIndex + m_RealShowCount, ItemsCount ); + + if( ItemsCount > m_ShowCount) { + m_ScrollBar->Visible = true; + m_ScrollBar->SetRange(0, ItemsCount - 1); + m_ScrollBar->SetPageSize(m_ShowCount); + m_ScrollBar->SetPosition(m_BeginIndex); + } + else { + m_ScrollBar->Visible = false; + } + + Paint(); +} +//--------------------------------------------------------------------------- +void __fastcall TListPanel::ScrollPos(int Pos) +{ + if(Pos >= 0 && Pos < ItemsCount){ + int var_bIndex = Pos; + int var_eIndex = Pos + m_RealShowCount; + + if(var_eIndex > ItemsCount) + { + var_eIndex = ItemsCount; + var_bIndex = var_eIndex - m_RealShowCount; + } + + if(var_bIndex != m_BeginIndex) + { + m_BeginIndex = var_bIndex; + m_EndIndex = var_eIndex; + + Paint(); + } + } +} +//--------------------------------------------------------------------------- +void __fastcall TListPanel::WMEraseBkgnd(TWMEraseBkgnd &Message) +{ + TCanvas* var_BKCanvas = new TCanvas(); + var_BKCanvas->Handle = Message.DC; + + TRect var_Rect = GetClientRect(); + + var_BKCanvas->Brush->Color = LP_BACKGRND; // Ƶɫ + var_BKCanvas->FillRect(var_Rect); + + var_BKCanvas->Brush->Color = LP_BORDER; // Ʊ߿ + var_BKCanvas->FrameRect(var_Rect); + + delete var_BKCanvas; + var_BKCanvas = NULL; +} +//--------------------------------------------------------------------------- +void __fastcall TListPanel::WMMouseWheel(TWMMouseWheel &Message) +{ + UINT nSBCode; + + if(m_IsLButtonDown) return; + + if(Message.WheelDelta < 0) + { + nSBCode = SB_LINEDOWN; + } + else + { + nSBCode = SB_LINEUP; + } + + if(m_ScrollBar->Visible) + Perform(WM_VSCROLL, MAKELONG(nSBCode, 0), NULL); +} +//--------------------------------------------------------------------------- +void __fastcall TListPanel::CMMouseLeave(TMessage &Message) +{ + m_CurrentItemIndex = -1; + + Repaint(); +} +//--------------------------------------------------------------------------- +void __fastcall TListPanel::WMVScroll(TWMScroll &Message) +{ + int minpos, maxpos, page, curpos; + + m_ScrollBar->GetScrollRange(& minpos, & maxpos); + + page = m_ScrollBar->GetPageSize(); + curpos = m_ScrollBar->GetScrollPos(); + + switch(Message.ScrollCode) + { + case SB_TOP: + curpos = minpos; + break; + + case SB_BOTTOM: + curpos = maxpos - page + 1; + break; + + case SB_ENDSCROLL: + break; + + case SB_LINEUP: + if(curpos > minpos) + { + curpos--; + } + break; + + case SB_LINEDOWN: + if(curpos < maxpos - page + 1) + { + curpos++; + } + break; + + case SB_PAGEUP: + if(curpos > minpos) + { + curpos = MAX(minpos, curpos - page); + } + break; + + case SB_PAGEDOWN: + if(curpos < maxpos) + { + curpos = MIN(maxpos - page + 1, curpos + page); + } + break; + + case SB_THUMBPOSITION: + curpos = Message.Pos; + break; + + case SB_THUMBTRACK: + curpos = Message.Pos; + break; + } + + if(Message.ScrollBar != m_ScrollBar->Handle) + { + m_ScrollBar->SetPosition(curpos); + } + + ScrollPos(curpos); +} +//--------------------------------------------------------------------------- +int __fastcall TListPanel::TextWidth(String text) +{ + return Canvas->TextWidth(text); +} +//--------------------------------------------------------------------------- + +void __fastcall TListPanel::WMSize(Winapi::Messages::TWMSize &Message) +{ + DefaultHandler( &Message ); + + m_ScrollBar->Height = Height - 2; + m_ScrollBar->Top = 1; + m_ScrollBar->Left = Width - m_ScrollBar->Width - 1; + + //ʾ + m_ShowCount = (Height - 2 * MARGIN) / FItemHeight; + // ¼ʾ +/* m_ItemRectList->Clear(); + m_ItemRectList->Add(new TRect(MARGIN, MARGIN, Width - MARGIN, FItemHeight + MARGIN)); + for(int i = 1; i < m_ShowCount; i++) + { + int var_ItemTop = i * FItemHeight + MARGIN; + int var_ItemBottom = var_ItemTop + FItemHeight; + + m_ItemRectList->Add(new TRect(MARGIN, var_ItemTop, Width - MARGIN, var_ItemBottom)); + } +*/ + // ¼Item + m_ItemArea = TRect(MARGIN, MARGIN, Width - MARGIN, m_ShowCount * FItemHeight + MARGIN); + +// ResetScroll(); +} +//--------------------------------------------------------------------------- diff --git a/ListPanel.h b/ListPanel.h new file mode 100644 index 0000000..fb37959 --- /dev/null +++ b/ListPanel.h @@ -0,0 +1,109 @@ +// --------------------------------------------------------------------------- + +#ifndef ListPanelH +#define ListPanelH + +#include +#include "SkinScrollBarUnit.h" +// --------------------------------------------------------------------------- + +class TListPanel; +class TListPanelItem; + +/* б¼ */ +typedef void __fastcall(__closure * TListPanelItemClick)(TListPanel *Sender, int Index); + +class TListPanelItem : public TObject { + +private: + int FTag; + String FCaption; + TListPanelItemClick FOnItemClick; + + void __fastcall SetCaption(String Caption); + +public: + + __fastcall TListPanelItem(String Caption, TListPanelItemClick OnItemClick); + + void __fastcall DrawItem(TCanvas *Canvas, TRect Rect, int flag); + +__published: + __property String Caption = {read = FCaption, write = FCaption}; + __property int Tag = {read = FTag, write = FTag}; + __property TListPanelItemClick OnItemClicked = {read = FOnItemClick, write = FOnItemClick}; +}; + +class TListPanel : public TPanel { +private: + int FItemHeight, + FSelectedItemIndex; + + bool m_IsLButtonDown; + + TRect m_ItemArea; + + TList //*m_ItemRectList, + *m_ItemList; + + TSkinScrollBar *m_ScrollBar; + + int m_BeginIndex, + m_EndIndex, + m_CurrentItemIndex, + m_ShowCount, + m_RealShowCount, + m_MouseX, + m_MouseY, + m_ItemWidth; + + void __fastcall DoKeyUpDown(int Index); + void __fastcall DoShowItemsChange(); + + void __fastcall SetItemStatus(int Index, int flag); + void __fastcall SetSelectedItemIndex(int Index); + + int __fastcall GetItemsCount(); +// TRect *__fastcall GetItemRect(int Index); + + MESSAGE void __fastcall WMSize(Winapi::Messages::TWMSize &Message); + MESSAGE void __fastcall WMEraseBkgnd(TWMEraseBkgnd &Message); + MESSAGE void __fastcall WMMouseWheel(TWMMouseWheel &Message); + MESSAGE void __fastcall CMMouseLeave(TMessage &Message); + MESSAGE void __fastcall WMVScroll(TWMScroll &Message); + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(WM_SIZE, TWMSize, WMSize) + MESSAGE_HANDLER(WM_ERASEBKGND, TWMEraseBkgnd, WMEraseBkgnd) + MESSAGE_HANDLER(WM_MOUSEWHEEL, TWMMouseWheel, WMMouseWheel) + MESSAGE_HANDLER(CM_MOUSELEAVE, TMessage, CMMouseLeave) + MESSAGE_HANDLER(WM_VSCROLL, TWMScroll, WMVScroll) + END_MESSAGE_MAP(TPanel) + +protected: + virtual void __fastcall CreateWnd(); + virtual void __fastcall Paint(); + + DYNAMIC void __fastcall MouseDown(TMouseButton Button, TShiftState Shift, int X, int Y); + DYNAMIC void __fastcall MouseMove(TShiftState Shift, int X, int Y); + DYNAMIC void __fastcall MouseUp(TMouseButton Button, TShiftState Shift, int X, int Y); + +public: + __fastcall TListPanel(TComponent *Owner); + __fastcall ~TListPanel(); + void __fastcall AddItem(TListPanelItem* Item); + void __fastcall Clear(); + TListPanelItem *__fastcall GetItem(int Index); + void __fastcall ScrollPos(int Pos); + int __fastcall TextWidth(String text); + void __fastcall ResetScroll(); +// void __fastcall SetTextFontSize(int sz); + void __fastcall SetTextFont(String name, int size); + +__published: + __property int ItemHeight = {write = FItemHeight, read = FItemHeight, default = 16}; + __property int SelectedItemIndex = {read = FSelectedItemIndex, write = SetSelectedItemIndex}; + __property int ItemsCount = {read = GetItemsCount}; +}; + +#endif diff --git a/ListViewBase.cpp b/ListViewBase.cpp new file mode 100644 index 0000000..ab91eed --- /dev/null +++ b/ListViewBase.cpp @@ -0,0 +1,276 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop + +#include "ListViewBase.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +//--------------------------------------------------------------------------- +__fastcall TListViewBase::TListViewBase(TComponent* Owner) + : TTableView( Owner ) +{ + OnDrawBKG = DoDrawBKG; + OnTitle = DoTitle; + OnBottom = DoBottom; + + OnCellHgt = DoCellHgt; + OnClickL = DoClickL; + OnClickLP = DoClickLP; + OnClickR = DoClickR; + OnClickRP = DoClickRP; + + OnMDCell = DoMDCell; + OnMDNum = DoMDNum; + OnMDTop = DoMDTop; + OnMDBottom = DoMDBottom; + OnMDMOV = DoMDMOV; + + FRightCellChange = false; + OnDrawCell = DoCellDraw; + OnCellData = DoCellData; + OnCellLClick = DoCellLClick; + OnCellRClick = DoCellRClick; + OnCellLDClick = DoCellDBClick; + + FRightIconChange = false; + FIconChange = false; + OnDrawIcon = DoIconDraw; + OnIconData = DoIconData; + OnIconsNum = DoIconsNum; + OnIconsBounds = DoIconsBounds; + OnIconLClick = DoIconLClick; + OnIconRClick = DoIconRClick; + OnIconLDClick = DoIconDBClick; + + m_MoveTimer = new TTimer(this); + m_MoveTimer->Enabled = false; + m_MoveTimer->Interval = 100; + m_MoveTimer->OnTimer = MoveTimerProc; +} +//--------------------------------------------------------------------------- +__fastcall TListViewBase::~TListViewBase() +{ + SAFE_DELETE(m_MoveTimer) +} +//--------------------------------------------------------------------------- +void __fastcall TListViewBase::BtnDown(TStateBtn *pCur, TPoint pt, bool bLeft) +{ + NULL_RETURN(pCur) + + TStateBtn *pCurTmp = pCur; + + if(bLeft || FRightCellChange ) { + + TStateBtn *pBtn = NULL; + if( pCur && pCur->m_PAR ) { + bool bIconChange = true; + if( !bLeft && !FRightIconChange) bIconChange = false; + if( bIconChange ) { + pCur->Down = true; + pCur = pCur->m_PAR; + } + } + + BTNLST::iterator lst_FBTNLST; + for( lst_FBTNLST = m_LstBtn.begin(); + lst_FBTNLST!= m_LstBtn.end(); + lst_FBTNLST++ ) + { + pBtn = *lst_FBTNLST; + if( pBtn==pCur ) { + pBtn->Down = true; + IndSel = pBtn->Index; + pBtn->Paint(); + } + else if( pBtn->Down ) { + pBtn->Down = false; + pBtn->Enter = false; + pBtn->Paint(); + } + } + } + + if( bLeft && OnClickL ) { + + OnClickL(pCurTmp, pt); + } + else if( !bLeft && OnClickR ) { + + OnClickR(pCurTmp, pt); + } +} +//--------------------------------------------------------------------------- +void __fastcall TListViewBase::BtnUp(TStateBtn *pCur, TStateBtn *pSel, TPoint pt, bool bLeft) +{ + if( pSel && pSel->m_PAR ) { + bool bIconChange = true; + if( !bLeft && !FRightIconChange) bIconChange = false; + if( bIconChange ) { + pSel->Down = false; + pSel->Enter = false; + pSel->Paint(); + } + } + + if( bLeft && OnClickLP ) { + OnClickLP(pCur, pt); + } + else if( !bLeft && OnClickRP ) { + OnClickRP(pCur, pt); + } + + m_MoveTimer->Enabled = false; +} +//--------------------------------------------------------------------------- +void __fastcall TListViewBase::BtnMove(TStateBtn *pCur, TPoint pt) +{ + TStateBtn *pCurTmp = pCur; + + TStateBtn *pBtn = NULL; + if( !pCur ) IndFocus = -1; + + if( pCur!=m_BtnFocus && m_BtnFocus && m_BtnFocus->m_PAR ) { + m_BtnFocus->Enter = false; + m_BtnFocus->Paint(); + } + + if( pCur && pCur->m_PAR ) { + pCur->Enter = true; + pCur = pCur->m_PAR; + } + + if( pCur!=m_BtnFocus ) { + + BTNLST::iterator lst_FBTNLST; + for( lst_FBTNLST = m_LstBtn.begin(); + lst_FBTNLST!= m_LstBtn.end(); + lst_FBTNLST++ ) + { + pBtn = *lst_FBTNLST; + if( pBtn==pCur ) { + pBtn->Enter = true; + IndFocus = pBtn->Index; + pBtn->Paint(); + } + else if( pBtn->State==Bs_ENTER ) { + pBtn->Enter = false; + pBtn->Paint(); + } + } + } + + if( m_bLeft && OnMDMOV ) { + OnMDMOV(m_BtnSel, pCurTmp, pt); + } + + m_ptTimer = pt; + if( m_bLeft && m_BtnSel && NULL==m_BtnSel->m_PAR && (!PtInRect( m_RtContent, pt ) || pCurTmp==NULL) ) { + if(!m_MoveTimer->Enabled) + m_MoveTimer->Enabled = true; + } + else if( m_MoveTimer->Enabled ){ + m_MoveTimer->Enabled = false; + } +} +//--------------------------------------------------------------------------- +void __fastcall TListViewBase::MoveTimerProc(System::TObject* Sender) +{ + if( m_ptTimer.X<0||m_ptTimer.Y<0 ) { + SetSBPos(SBS_POS, GetCellBeg()-1); + } + else { + SetSBPos(SB_LINEDOWN, GetCellBeg()+1); + } +} +//--------------------------------------------------------------------------- +int __fastcall TListViewBase::DoMouseWheel(TObject *Sender) +{ + if(m_BtnFocus && m_BtnFocus->Enter) { + m_BtnFocus->Enter = false; + m_BtnFocus->Paint(); + } +} +//--------------------------------------------------------------------------- +int __fastcall TListViewBase::DoMDCell(TTableView *Sender, int iCellIndex) +{ + if( iCellIndex<0 || iCellIndex>=GetCellNum() ) + return 0; + + TStateBtn *rowCell = (TStateBtn *)GetCellAds(iCellIndex); + + if(!rowCell) { + rowCell = new TStateBtn(this); + rowCell->OnNotifyDraw = OnDrawCell; + rowCell->OnClick = OnCellLClick; + rowCell->OnClickR = OnCellRClick; + rowCell->OnDBClick = OnCellLDClick; + rowCell->Index = iCellIndex; + + if(OnIconsNum) { + int iconNum = OnIconsNum(rowCell); + for(int i=0; iOnNotifyDraw = OnDrawIcon; + pBtnCol->OnClick = OnIconLClick; + pBtnCol->OnClickR = OnIconRClick; + pBtnCol->OnDBClick = OnIconLDClick; + pBtnCol->Index = i; + rowCell->SetSub(pBtnCol); + + if(!FIconChange) { + DoIconDataAndBounds(pBtnCol); + } + } + } + } + + rowCell->Index = iCellIndex; + if( OnCellData ) + OnCellData(rowCell); + + if(FIconChange) { + + BTNLST *pLstSub = rowCell->GetSub(); + BTNLST::iterator lst_FBTNLST; + for(lst_FBTNLST = pLstSub->begin(); + lst_FBTNLST != pLstSub->end(); + lst_FBTNLST++ ) + { + DoIconDataAndBounds(*lst_FBTNLST); + } + } + + if( IndSel==rowCell->Index ) + rowCell->Down = true; + else if( rowCell->Down ) + rowCell->Down = false; + + if( IndFocus==rowCell->Index ) + rowCell->Enter = true; + else if( rowCell->Enter ) + rowCell->Enter = false; + + return ((int)(rowCell)); +} +//--------------------------------------------------------------------------- +void __fastcall TListViewBase::DoIconDataAndBounds(TStateBtn *pBtnCol) +{ + if( OnIconData ) + OnIconData(pBtnCol); + + TRect rtBounds; + if(OnIconsBounds) { + OnIconsBounds(pBtnCol, rtBounds); + pBtnCol->SetBounds(rtBounds.Left, rtBounds.Top, rtBounds.Width(), rtBounds.Height()); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TListViewBase::SetTextFontSize(int sz) +{ + Canvas->Font->Size = sz; + m_CanvasDr->Font->Size = sz; +} +//--------------------------------------------------------------------------- + diff --git a/ListViewBase.h b/ListViewBase.h new file mode 100644 index 0000000..c2ee334 --- /dev/null +++ b/ListViewBase.h @@ -0,0 +1,123 @@ +//--------------------------------------------------------------------------- + +#ifndef ListViewBaseH +#define ListViewBaseH +//--------------------------------------------------------------------------- +#include "TableViewUnit.h" +//--------------------------------------------------------------------------- +class TListViewBase: public TTableView +{ + +private: + + TPoint m_ptTimer; + TTimer *m_MoveTimer; + void __fastcall MoveTimerProc(System::TObject* Sender); + + bool FRightCellChange; + TNotifyDraw FOnDrawCell; + TNotiCell FOnCellData; + TNotifyBtn FOnCellLClick, + FOnCellRClick, + FOnCellLDClick; + + bool FRightIconChange; + bool FIconChange; + TNotifyDraw FOnDrawIcon; + TNotiCell FOnIconData; + TNotiIconsNum FOnIconsNum; + TNotiIconsBounds FOnIconsBounds; + TNotifyBtn FOnIconLClick, + FOnIconRClick, + FOnIconLDClick; + + void __fastcall DoIconDataAndBounds(TStateBtn *pBtnCol); + +protected: + + //TStateBtn has "Index" property connect to data + virtual void __fastcall BtnDown(TStateBtn *pCur, TPoint pt, bool bLeft=true); + virtual void __fastcall BtnUp(TStateBtn *pCur, TStateBtn *pSel, TPoint pt, bool bLeft=true); + virtual void __fastcall BtnMove(TStateBtn *pCur, TPoint pt); + + virtual void __fastcall DoDrawBKG(TPanelDB *Sender, TCanvas *pCanvas, TRect rtBKG){} + virtual int __fastcall DoTitle(TTableView *Sender){return 0;} + virtual int __fastcall DoBottom(TTableView *Sender){return 0;} + + virtual int __fastcall DoCellHgt(TTableView *Sender, int iCellIndex){return 0;} + virtual int __fastcall DoClickL(TStateBtn *Sender, TPoint pt){return 0;} + virtual int __fastcall DoClickLP(TStateBtn *Sender, TPoint pt){return 0;} + virtual int __fastcall DoClickR(TStateBtn *Sender, TPoint pt){return 0;} + virtual int __fastcall DoClickRP(TStateBtn *Sender, TPoint pt){return 0;} + + virtual int __fastcall DoMDCell(TTableView *Sender, int iCellIndex); + virtual int __fastcall DoMDNum(TTableView *Sender){return 0;} + virtual int __fastcall DoMDTop(TTableView *Sender){return 0;} + virtual int __fastcall DoMDBottom(TTableView *Sender){return 0;} + virtual int __fastcall DoMDMOV(TStateBtn *Src, TStateBtn *Des, TPoint pt){return 0;} + + virtual int __fastcall DoCellData(TStateBtn *sender){return 0;} + virtual void __fastcall DoCellDraw(TStateBtn *sender, int BsTmp, TRect rtTmp, TCanvas *pCanvas){} + virtual void __fastcall DoCellLClick(TStateBtn *sender){} + virtual void __fastcall DoCellRClick(TStateBtn *sender){} + virtual void __fastcall DoCellDBClick(TStateBtn *sender){} + + virtual int __fastcall DoIconData(TStateBtn *sender){return 0;} + virtual int __fastcall DoIconsNum(TStateBtn *parent){return 0;} + virtual int __fastcall DoIconsBounds(TStateBtn *sender, TRect &rtBounds){return 0;} + virtual void __fastcall DoIconDraw(TStateBtn *sender, int BsTmp, TRect rtTmp, TCanvas *pCanvas){} + virtual void __fastcall DoIconLClick(TStateBtn *sender){} + virtual void __fastcall DoIconRClick(TStateBtn *sender){} + virtual void __fastcall DoIconDBClick(TStateBtn *sender){} + + virtual int __fastcall DoMouseWheel(TObject *Sender); + +public: + void __fastcall SetTextFontSize(int sz); + + __fastcall TListViewBase(TComponent* Owner); + __fastcall ~TListViewBase(); + +__published: + + __property OnDrawBKG; + + __property OnCellHgt; + __property OnTitle; + __property OnBottom; + __property OnClickL; + __property OnClickLP; + __property OnClickR; + __property OnClickRP; + + __property OnMDCell; + __property OnMDNum; + __property OnMDTop; + __property OnMDBottom; + __property OnMDMOV; + + __property IndFocus; + __property IndSel; + __property HgtSmall; + __property OnChange; + + __property TNotiCell OnCellData = {read=FOnCellData, write=FOnCellData }; + __property TNotifyDraw OnDrawCell = {read=FOnDrawCell, write=FOnDrawCell }; + __property TNotifyBtn OnCellLClick = {read=FOnCellLClick, write=FOnCellLClick }; + __property TNotifyBtn OnCellRClick = {read=FOnCellRClick, write=FOnCellRClick }; + __property TNotifyBtn OnCellLDClick = {read=FOnCellLDClick, write=FOnCellLDClick }; + __property bool RightCellChange = {read=FRightCellChange, write=FRightCellChange, default=false }; + + __property TNotiCell OnIconData = {read=FOnIconData, write=FOnIconData }; + __property TNotiIconsNum OnIconsNum = {read=FOnIconsNum, write=FOnIconsNum }; + __property TNotiIconsBounds OnIconsBounds = {read=FOnIconsBounds, write=FOnIconsBounds }; + __property TNotifyDraw OnDrawIcon = {read=FOnDrawIcon, write=FOnDrawIcon }; + __property TNotifyBtn OnIconLClick = {read=FOnIconLClick, write=FOnIconLClick }; + __property TNotifyBtn OnIconRClick = {read=FOnIconRClick, write=FOnIconRClick }; + __property TNotifyBtn OnIconLDClick = {read=FOnIconLDClick, write=FOnIconLDClick }; + __property bool IconChange = {read=FIconChange, write=FIconChange, default=false }; + __property bool RightIconChange = {read=FRightIconChange, write=FRightIconChange, default=false }; + +}; +#endif + diff --git a/ListViewMove.cpp b/ListViewMove.cpp new file mode 100644 index 0000000..f3f41c5 --- /dev/null +++ b/ListViewMove.cpp @@ -0,0 +1,547 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop +#include "ListViewMove.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#define LINE_LEN 2 + +#define LP_ITEM_OVER RGB(67, 73, 80) +#define LP_ITEM_SELECTED RGB(0, 0, 0) +#define LP_ITEM_DEF RGB(39, 42, 47) + +#define FontClolor TColor(0xBDAA9C) +#define FramColor RGB(23, 23, 23) + +static const COLORREF CLR_LINE_D = RGB( 18, 19, 21 ), + CLR_LINE_L = RGB( 140, 141, 145 ); +//--------------------------------------------------------------------------- +__fastcall TListViewMove::TListViewMove(TComponent* Owner) + : TListViewBase( Owner ) +{ + m_LstData = new TList();; + + m_pMovLine = new TBitmap(); + m_pMovLine->SetSize(LINE_LEN, LINE_LEN); + m_pMovLine->Canvas->Brush->Style = bsClear; + for( int indexY=0; indexYCanvas->Pixels[indexX][indexY] = + (bEven==true)?CLR_LINE_D:CLR_LINE_L; + } + } + m_iSrc = m_iDes = -1; + m_pMovBmp = new TBitmap(); + m_pMovPanel = new TPanelDB(this); + m_pMovPanel->Parent = this; + m_pMovPanel->OnPaintBKG = DoMovPaint; + m_pMovPanel->Visible = false; + + RightCellChange = true; + bMovBottom = false; +} +//--------------------------------------------------------------------------- +__fastcall TListViewMove::~TListViewMove() +{ + SAFE_DELETE(m_pMovLine); + SAFE_DELETE(m_pMovBmp); + SAFE_DELETE(m_pMovPanel); + + NULL_RETURN(m_LstData) + for( int i=0; iCount; i++ ) { + + DATAInfo *pInfo = (DATAInfo *)(m_LstData->Items[i]); + SAFE_DELETE(pInfo) + } + m_LstData->Clear(); + SAFE_DELETE(m_LstData); +} +//--------------------------------------------------------------------------- +int __fastcall TListViewMove::DoCellHgt(TTableView *Sender, int index) +{ + return CELL_HEIGHT; +} +//--------------------------------------------------------------------------- +int __fastcall TListViewMove::DoMDNum(TTableView *Sender) +{ + NULL_RETURN0(m_LstData) + + return m_LstData->Count; +} +//--------------------------------------------------------------------------- +void __fastcall TListViewMove::DoDrawBKG(TPanelDB *Sender, TCanvas *pCanvas, TRect rtBKG) +{ + pCanvas->Brush->Color = LP_ITEM_DEF; + pCanvas->FillRect(rtBKG); + rtBKG = TRect(0, 0, Sender->Width, Sender->Height); + pCanvas->Brush->Color = FramColor; + pCanvas->Pen->Color = FramColor; + pCanvas->FrameRect(rtBKG); +} +//--------------------------------------------------------------------------- +int __fastcall TListViewMove::DoTitle(TTableView *Sender) +{ + TPanelDB *pTitle = new TPanelDB(this); + pTitle->SetBounds(0, 0, Width, 1); + pTitle->Color = FramColor; + return (int)pTitle; +} +//--------------------------------------------------------------------------- +int __fastcall TListViewMove::DoBottom(TTableView *Sender) +{ + TPanelDB *pBottom = new TPanelDB(this); + pBottom->SetBounds(0, Height-1, Width, 1); + pBottom->Color = FramColor; + return (int)pBottom; +} +//--------------------------------------------------------------------------- +void __fastcall TListViewMove::DoCellDraw(TStateBtn *sender, int BsTmp, TRect rtTmp, TCanvas *pCanvas) +{ + NULL_RETURN(sender) + + DATAInfo *pInfo = (DATAInfo *)sender->m_Data; + String strCaption = pInfo->caption; + TSize szFont = pCanvas->TextExtent(strCaption); + + if( Bs_NORMAL==BsTmp ) { + pCanvas->Brush->Color = LP_ITEM_DEF; + }else if( Bs_ENTER==BsTmp ){ + pCanvas->Brush->Color = LP_ITEM_OVER; + }else if( Bs_DOWN==BsTmp ){ + pCanvas->Brush->Color = LP_ITEM_SELECTED; + } + + if( BsTmp==Bs_ENTER || + BsTmp==Bs_DOWN ) + { + pCanvas->FillRect(rtTmp); + } + pCanvas->Brush->Style = bsClear; + pCanvas->Font->Color = FontClolor; + + //----ַ------ + int nBorder = 4; + int nWidth = m_nCapWidth-nBorder*2; + if( nWidth>0 ){ + szFont = pCanvas->TextExtent(strCaption); + if( szFont.Width>nWidth ){ + UnicodeString strShorty = strCaption; + while( pCanvas->TextWidth( strShorty )>nWidth ){ + strShorty = strShorty.SubString( 1, strShorty.Length()-2 ); + } + + strCaption = strShorty; + strCaption+="..."; + szFont = pCanvas->TextExtent(strCaption); + } + //----------- + pCanvas->TextOutW( m_nCapLeft+nBorder+(nWidth-szFont.Width)/2, + rtTmp.Top+(rtTmp.Height()-szFont.Height)/2, + strCaption); + } +} +//--------------------------------------------------------------------------- +int __fastcall TListViewMove::DoCellData(TStateBtn *sender) +{ + NULL_RETURN0(m_LstData) + NULL_RETURN0(sender) + + sender->SetData(m_LstData->Items[sender->Index]); +} +//--------------------------------------------------------------------------- +void __fastcall TListViewMove::DoCellDBClick(TStateBtn *sender) +{ + NULL_RETURN(sender) + + if(FOnItemDBLClick) { + + DATAInfo *pInfo = (DATAInfo *)sender->m_Data; + FOnItemDBLClick(sender->Index, pInfo->bOn); + } +} +//--------------------------------------------------------------------------- +void __fastcall TListViewMove::DoIconDraw(TStateBtn *sender, int BsTmp, TRect rtTmp, TCanvas *pCanvas) +{ + NULL_RETURN(sender) + + TGraphic *pIMG = (TGraphic *)sender->m_Data; + int iWidth = pIMG->Width/3; + + int nTrans = + BsTmp==Bs_NORMAL ? 0: + BsTmp==Bs_ENTER ? (-iWidth): + BsTmp==Bs_DOWN ? (-2*iWidth):(-3*iWidth); + + if( 0==sender->Index ) { + DATAInfo *pInfo = (DATAInfo *)(sender->m_PAR->m_Data); + if( pInfo->bOn ) { + pIMG = m_pImgOn; + } + } + + if( Bs_NORMAL==BsTmp || + Bs_ENTER==BsTmp || + Bs_DOWN==BsTmp ) + { + HRGN rgnClip = CreateRectRgn( rtTmp.Left, rtTmp.Top, + rtTmp.Left+rtTmp.Width(), rtTmp.Top+rtTmp.Height() ); + + SelectClipRgn( pCanvas->Handle, rgnClip ); + pCanvas->Draw(rtTmp.Left+nTrans, rtTmp.Top, pIMG); + SelectClipRgn( pCanvas->Handle, NULL ); + DeleteObject(rgnClip); + } +} +//--------------------------------------------------------------------------- +int __fastcall TListViewMove::DoIconData(TStateBtn *sender) +{ + NULL_RETURN0(sender) + + if( 0==sender->Index ) { + sender->SetData(m_pImgOff); + } + else if(1==sender->Index) { + sender->SetData(m_pImgDel); + } +} +//--------------------------------------------------------------------------- +int __fastcall TListViewMove::DoIconsNum(TStateBtn *parent) +{ + return 2; +} +//--------------------------------------------------------------------------- +int __fastcall TListViewMove::DoIconsBounds(TStateBtn *sender, TRect &rtBounds) +{ + NULL_RETURN0(sender) + + TGraphic *pTmp = (TGraphic *)sender->m_Data; + + int iLeft, iTop, iWidth, iHeight; + iWidth = pTmp->Width/3; + iHeight = pTmp->Height; + iTop = (CELL_HEIGHT-pTmp->Height)/2; + if( 0==sender->Index ) { + iLeft = 5; + m_nCapLeft = iLeft+iWidth; + } + else if(1==sender->Index) { + iLeft = m_RtContent.Left + m_RtContent.Width() - pTmp->Width/3 - 5; + m_nCapWidth = iLeft - m_nCapLeft; + } + + rtBounds = TRect(iLeft, iTop, iLeft+iWidth, iTop+iHeight); + + return 0; +} +//--------------------------------------------------------------------------- +void __fastcall TListViewMove::DoIconLClick(TStateBtn *sender) +{ + NULL_RETURN(sender) + + TStateBtn *parent = sender->m_PAR; + int index = parent->Index; + + DATAInfo *pInfo = (DATAInfo *)parent->m_Data; + bool bOn = pInfo->bOn; + + if( 0==sender->Index ) { + + pInfo->bOn = !bOn; + if(FOnItemStateChange) FOnItemStateChange( index, !bOn ); + } + else if(1==sender->Index) { + + if(FOnItemDelete && FOnItemDelete( index, -1 ) ) { + + DeleteItem(index); + } + else { + sender->Enter = false; + sender->Down = false; + sender->Paint(); + TRect rt = sender->GetBounds(); + RECT rtInvalid; + rtInvalid.left = rt.Left; + rtInvalid.top = rt.Top; + rtInvalid.right = rt.Right; + rtInvalid.left = rt.Bottom; + InvalidateRect(this->Handle, &rtInvalid, false); + } + } +} +//--------------------------------------------------------------------------- +int __fastcall TListViewMove::DoClickL(TStateBtn *Sender, TPoint pt) +{ + if(Sender && Sender->m_PAR) + Sender = Sender->m_PAR; + + m_pMovBmp->SetSize(Sender->Width, Sender->Height); + StretchBlt(m_pMovBmp->Canvas->Handle, + 0, 0, Sender->Width, Sender->Height, + m_CanvasDr->Handle, + Sender->Left, Sender->Top, Sender->Width, Sender->Height, + SRCCOPY); + m_pMovPanel->SetBounds(Sender->Left, Sender->Top, Sender->Width, Sender->Height); + + return 0; +} +//--------------------------------------------------------------------------- +int __fastcall TListViewMove::DoClickLP(TStateBtn *Sender, TPoint pt) +{ + if( m_iSrc!=-1 && m_iDes!=-1 ) { + + m_pMovPanel->Visible = false; + + if( OnItemMoveEnd && OnItemMoveEnd( m_iSrc, m_iDes ) ) { + + if( m_iSrcMove(m_iSrc, m_iDes); + this->IndSel = m_iDes; + this->ReloadData( GetCellBeg() ); + } + } + + m_iSrc = m_iDes = -1; + Screen->Cursor = crDefault; + bMovBottom = false; + + return 0; +} +//--------------------------------------------------------------------------- +int __fastcall TListViewMove::DoMDMOV(TStateBtn *Src, TStateBtn *Des, TPoint pt) +{ + if( Src && NULL!=Src->m_PAR ) + return 0; + + if(Des && Des->m_PAR) + Des = Des->m_PAR; + + if(Src && Des && (Src!=Des||Src->Index!=IndSel) && PtInRect( m_RtContent, pt ) ) { + + m_iSrc = IndSel; + m_iDes = Des->Index; + TRect rtLine; + rtLine.Left = Des->Left; + rtLine.Top = Des->Top; + rtLine.Right = Des->Left+Des->Width; + rtLine.Bottom = Des->Top+LINE_LEN; + Canvas->Brush->Bitmap = m_pMovLine; + Canvas->FillRect(rtLine); + + m_pMovPanel->Top = pt.Y; + m_pMovPanel->Visible = true; + + if( OnItemMoveIng ) { + if( OnItemMoveIng( m_iSrc, m_iDes ) ) { + Screen->Cursor = crDrag; + } + else { + Screen->Cursor = crNoDrop; + m_iDes = -1; + } + } + else { + Screen->Cursor = crDrag; + } + bMovBottom = false; + } + else if( !bMovBottom ){ + m_iDes = -1; + m_pMovPanel->Visible = false; + if( -1!=m_iSrc ) + Screen->Cursor = crNoDrop; + if(!Src && !Des) { + Screen->Cursor = crDefault; + m_iSrc = m_iDes = -1; + } + } + + return 0; +} +//--------------------------------------------------------------------------- +int __fastcall TListViewMove::DoMDBottom(TTableView *Sender) +{ + if( -1!=m_iSrc ) + { + TStateBtn *Des = GetCellAds(Count-1); + if( Des && Des->Index!=IndSel ) + { + bMovBottom = true; + + m_iSrc = IndSel; + m_iDes = Des->Index+1; + TRect rtLine; + rtLine.Left = Des->Left; + rtLine.Top = Des->Top+Des->Height-LINE_LEN; + rtLine.Right = Des->Left+Des->Width; + rtLine.Bottom = rtLine.Top+LINE_LEN; + Canvas->Brush->Bitmap = m_pMovLine; + Canvas->FillRect(rtLine); + + m_pMovPanel->Top = Des->Top+Des->Height; + m_pMovPanel->Visible = true; + + if( OnItemMoveIng ) { + if( OnItemMoveIng( m_iSrc, m_iDes ) ) { + Screen->Cursor = crDrag; + } + else { + Screen->Cursor = crNoDrop; + m_iDes = -1; + } + } + else { + Screen->Cursor = crDrag; + } + } + } + return 0; +} +//--------------------------------------------------------------------------- +void __fastcall TListViewMove::DoMovPaint(TPanelDB *Sender, TCanvas *pCanvas, TRect rtBKG) +{ + TPanel *panel = (TPanel *)Sender; + TRect rtThis = TRect(0, 0, panel->Width, panel->Height); + SetBkMode( pCanvas->Handle, TRANSPARENT); + StyleServices()->DrawParentBackground( panel->Handle, pCanvas->Handle, NULL, false, rtThis); + + BLENDFUNCTION BFun; + BFun.BlendOp = AC_SRC_OVER; + BFun.BlendFlags = 0; + BFun.SourceConstantAlpha = 100; + BFun.AlphaFormat = 0; + + ::AlphaBlend( pCanvas->Handle, + 0, 0, rtThis.Width(), rtThis.Height(), + m_pMovBmp->Canvas->Handle, + 0, 0, m_pMovBmp->Width, m_pMovBmp->Height, + BFun); +} +//--------------------------------------------------------------------------- +int __fastcall TListViewMove::DoClickR(TStateBtn *Sender, TPoint pt) +{ + NULL_RETURN0(Sender) + + if(FOnItemRightClick && !Sender->m_PAR) { + + DATAInfo *pInfo = (DATAInfo *)Sender->m_Data; + FOnItemRightClick(Sender->Index, pInfo->bOn, pt); + } + return 0; +} +//--------------------------------------------------------------------------- +void __fastcall TListViewMove::AddIcon(TPngImage *pImgDel, TPngImage *pImgOff, TPngImage *pImgOn) +{ + m_pImgDel = pImgDel; + m_pImgOff = pImgOff; + m_pImgOn = pImgOn; +} +//--------------------------------------------------------------------------- +void __fastcall TListViewMove::AddItem(String caption, bool bOn, bool bPaint, int insertIndex) +{ + NULL_RETURN(m_LstData) + + DATAInfo *pInfo = new DATAInfo(caption, bOn); + if( insertIndex<0 || insertIndex>m_LstData->Count ) + insertIndex = m_LstData->Count; + if(0<=insertIndex && insertIndex<=m_LstData->Count ) + m_LstData->Insert(insertIndex, pInfo); + + if( bPaint ) { + + IndSel = insertIndex; + if( IsCellVisible(insertIndex) ) + ReloadData( GetCellBeg() ); + else + ReloadData( insertIndex ); + } +} +//--------------------------------------------------------------------------- +void __fastcall TListViewMove::DeleteItem(int index, bool bPaint) +{ + NULL_RETURN(m_LstData) + + if( 0<=index && indexCount ) { + + DATAInfo *pInfo = (DATAInfo *)(m_LstData->Items[index]); + SAFE_DELETE(pInfo) + m_LstData->Delete(index); + + if( bPaint ) { + IndSel = NOSET; + if( IsCellVisible(index) ) + ReloadData( GetCellBeg() ); + else + ReloadData( index-1 ); + } + } +} +//--------------------------------------------------------------------------- +void __fastcall TListViewMove::MoveItems(int srcIndex, int desIndex) +{ + NULL_RETURN(m_LstData) + + if(srcIndex<0) srcIndex = 0; + else if(srcIndex>=m_LstData->Count ) { + srcIndex = m_LstData->Count-1; + } + if(desIndex<0) desIndex = 0; + else if(desIndex>=m_LstData->Count ) { + desIndex = m_LstData->Count-1; + } + + if( srcIndex==desIndex ) return; + + if( 0<=srcIndex && srcIndexCount && + 0<=desIndex && desIndexCount ) { + m_LstData->Move(srcIndex, desIndex); + IndSel = desIndex; + ReloadData( desIndex ); + } +} +//--------------------------------------------------------------------------- +void __fastcall TListViewMove::ClearAllItems() +{ + NULL_RETURN(m_LstData) + + for( int i=0; iCount; i++ ) { + + DATAInfo *pInfo = (DATAInfo *)(m_LstData->Items[i]); + SAFE_DELETE(pInfo) + } + m_LstData->Clear(); + + this->ReloadData(); +} +//--------------------------------------------------------------------------- +void __fastcall TListViewMove::SetItemState(int index, bool bOn, bool bPaint) +{ + if( 0<=index && indexCount ) { + + DATAInfo *pInfo = (DATAInfo *)(m_LstData->Items[index]); + pInfo->bOn = bOn; + + if( bPaint ) { + if( IsCellVisible(index) ) ReloadData( GetCellBeg() ); + else ReloadData( index ); + } + } +} +//--------------------------------------------------------------------------- +int __fastcall TListViewMove::GetItemState(int index) +{ + if( 0<=index && indexCount ) { + DATAInfo *pInfo = (DATAInfo *)(m_LstData->Items[index]); + return pInfo->bOn; + } + return -1; +} +//--------------------------------------------------------------------------- + diff --git a/ListViewMove.h b/ListViewMove.h new file mode 100644 index 0000000..ae1979e --- /dev/null +++ b/ListViewMove.h @@ -0,0 +1,98 @@ +//--------------------------------------------------------------------------- + +#ifndef ListViewMoveH +#define ListViewMoveH +//--------------------------------------------------------------------------- +#include "ListViewBase.h" +//--------------------------------------------------------------------------- +typedef bool __fastcall (__closure *TNotifyItemClick)(int index, bool bOn); +typedef bool __fastcall (__closure *TNotifyItemChange)(int indSrc, int indDes); +typedef bool __fastcall (__closure *TNotifyItemClickPt)(int index, bool bOn, TPoint pt); +#define CELL_HEIGHT 18 +typedef struct tagDataInfo{ + String caption; + bool bOn; + tagDataInfo(String captionTmp, bool bOnTmp){ + caption = captionTmp; + bOn = bOnTmp ; + } + tagDataInfo(){ + caption = L""; + bOn = true; + } +}DATAInfo; +//--------------------------------------------------------------------------- +class TListViewMove: public TListViewBase +{ + +private: + + bool bMovBottom; + TNotifyItemClick FOnItemDBLClick, FOnItemStateChange; + TNotifyItemChange FOnItemDelete, FOnItemMoveIng, FOnItemMoveEnd; + TNotifyItemClickPt FOnItemRightClick; + + virtual void __fastcall DoDrawBKG(TPanelDB *Sender, TCanvas *pCanvas, TRect rtBKG); + virtual int __fastcall DoTitle(TTableView *Sender); + virtual int __fastcall DoBottom(TTableView *Sender); + + virtual int __fastcall DoCellHgt(TTableView *Sender, int iCellIndex); + virtual int __fastcall DoClickL(TStateBtn *Sender, TPoint pt); + virtual int __fastcall DoClickLP(TStateBtn *Sender, TPoint pt); + virtual int __fastcall DoClickR(TStateBtn *Sender, TPoint pt); + virtual int __fastcall DoMDNum(TTableView *Sender); + virtual int __fastcall DoMDBottom(TTableView *Sender); + virtual int __fastcall DoMDMOV(TStateBtn *Src, TStateBtn *Des, TPoint pt); + + virtual void __fastcall DoCellDraw(TStateBtn *sender, int BsTmp, TRect rtTmp, TCanvas *pCanvas); + virtual int __fastcall DoCellData(TStateBtn *sender); + virtual void __fastcall DoCellDBClick(TStateBtn *sender); + + virtual void __fastcall DoIconDraw(TStateBtn *sender, int BsTmp, TRect rtTmp, TCanvas *pCanvas); + virtual int __fastcall DoIconData(TStateBtn *sender); + virtual int __fastcall DoIconsNum(TStateBtn *parent); + virtual int __fastcall DoIconsBounds(TStateBtn *sender, TRect &rtBounds); + virtual void __fastcall DoIconLClick(TStateBtn *sender); + + int m_nCapLeft; + int m_nCapWidth; + + TList *m_LstData; + + int m_iSrc, m_iDes; + TBitmap *m_pMovLine; + TBitmap *m_pMovBmp; + TPanelDB *m_pMovPanel; + void __fastcall DoMovPaint(TPanelDB *Sender, TCanvas *pCanvas, TRect rtBKG); + + TPngImage *m_pImgDel; + TPngImage *m_pImgOff; + TPngImage *m_pImgOn; + +public: + + void __fastcall AddIcon(TPngImage *pImgDel, TPngImage *pImgOff, TPngImage *pImgOn); + void __fastcall AddItem(String caption, bool bOn=true, bool bPaint=true, int insertIndex=-1); + void __fastcall DeleteItem(int index, bool bPaint=true); + void __fastcall MoveItems(int srcIndex, int desIndex); + void __fastcall ClearAllItems(); + int __fastcall GetItemState(int index); + void __fastcall SetItemState(int index, bool bOn=true, bool bPaint=true); + + __fastcall TListViewMove(TComponent* Owner); + __fastcall ~TListViewMove(); + +__published: + + __property IndSel; + __property Count; + + __property TNotifyItemClick OnItemDBLClick = {read=FOnItemDBLClick, write=FOnItemDBLClick }; + __property TNotifyItemClickPt OnItemRightClick = {read=FOnItemRightClick, write=FOnItemRightClick }; + __property TNotifyItemClick OnItemStateChange = {read=FOnItemStateChange, write=FOnItemStateChange }; + __property TNotifyItemChange OnItemDelete = {read=FOnItemDelete, write=FOnItemDelete }; + __property TNotifyItemChange OnItemMoveIng = {read=FOnItemMoveIng, write=FOnItemMoveIng }; + __property TNotifyItemChange OnItemMoveEnd = {read=FOnItemMoveEnd, write=FOnItemMoveEnd }; +}; +#endif + diff --git a/ListViewPattern.cpp b/ListViewPattern.cpp new file mode 100644 index 0000000..6fee5fc --- /dev/null +++ b/ListViewPattern.cpp @@ -0,0 +1,442 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop + +#include "ListViewPattern.h" +#include "GlobalUnit.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +//--------------------------------------------------------------------------- +#define LP_ITEM_OVER RGB(67, 73, 80) +#define LP_ITEM_SELECTED RGB(0, 0, 0) +#define LP_ITEM_DEF RGB(39, 42, 47) +#define CELL_HEIGHT 18 + +#define LINE_COLOR RGB(123, 123, 123) +#define FontClolor TColor(0xBDAA9C) + +const BYTE u_arrChordPreset[2][4][4] = { //Ԥ + {{0,37,9,30},{0,37,20,28},{0,9,20,28},{0,17,37,30}}, + {{37,9,28,16},{37,17,20,28},{37,0,9,17},{37,28,20,16}} }; + +TPngImage *pngCol = NULL; +TPngImage *pngUnCol = NULL; +TPngImage *pngCharge = NULL; +void LoadImg() +{ + if( !pngCol ) pngCol = new TPngImage(); + if( !pngUnCol ) pngUnCol = new TPngImage(); + if( !pngCharge ) pngCharge = new TPngImage(); + + pngCol->LoadFromResourceName(int(HInstance), L"imgCollect"); + pngUnCol->LoadFromResourceName(int(HInstance), L"imgUnCollect"); + pngCharge->LoadFromResourceName(int(HInstance), L"imgStyleCharge"); +} +void ReleaseImg() +{ + SAFE_DELETE(pngCol); + SAFE_DELETE(pngUnCol); + SAFE_DELETE(pngCharge); +} +//--------------------------------------------------------------------------- +__fastcall TListViewPattern::TListViewPattern(TComponent* Owner, bool bChan9, + TStageList* lstStages, int iPlayBar) + : TListViewBase( Owner ) +{ + m_nPlayIndex = -1; + m_iFont = -1; + m_iProg = -1; + m_pPtInfo = NULL; + + m_bChan9 = bChan9; + m_iPlayBar = iPlayBar; + m_lstStages = lstStages; + FOnTextureChanged = NULL; + + ShowHint = true; + m_btnHint = NULL; + + LoadImg(); +} +//--------------------------------------------------------------------------- +__fastcall TListViewPattern::~TListViewPattern() +{ + ReleaseImg(); +} +//--------------------------------------------------------------------------- +int __fastcall TListViewPattern::DoCellHgt(TTableView *Sender, int iCellIndex) +{ + return CELL_HEIGHT; +} +//--------------------------------------------------------------------------- +int __fastcall TListViewPattern::DoMDNum(TTableView *Sender) +{ + NULL_RETURN0(m_LstParttern) + return m_LstParttern->size(); +} +//--------------------------------------------------------------------------- +int __fastcall TListViewPattern::DoCellData(TStateBtn *sender) +{ + NULL_RETURN0(m_LstParttern) + sender->SetData((void *)((*m_LstParttern)[sender->Index])); +} +//--------------------------------------------------------------------------- +void __fastcall TListViewPattern::DoCellDraw(TStateBtn *sender, int BsTmp, TRect rtTmp, TCanvas *pCanvas) +{ + TStateBtn *pBtn = (TStateBtn *)sender; + TTextureInfo *pPtInfo = (TTextureInfo*)pBtn->m_Data; + + if( Bs_NORMAL==BsTmp ) { + pCanvas->Brush->Color = LP_ITEM_DEF; + }else if( Bs_ENTER==BsTmp ){ + pCanvas->Brush->Color = LP_ITEM_OVER; + }else if( Bs_DOWN==BsTmp ){ + pCanvas->Brush->Color = LP_ITEM_SELECTED; + } + + if( BsTmp==Bs_NORMAL || BsTmp==Bs_ENTER || BsTmp==Bs_DOWN ) { + pCanvas->FillRect(rtTmp); + + int iLeft, iTop; + TSize sizeFont; + String strText; + + pCanvas->Brush->Style = bsClear; + pCanvas->Font->Color = GetSegmentColor( pPtInfo->segType, 0, false ); + + // + if( !m_bChan9 ) strText = GM_INSTRUMENT[pPtInfo->prog]; + else strText = L"GM"; + sizeFont = pCanvas->TextExtent( strText ); + iLeft = LEFT_CAPTION+(WIDTH_PROG(Width)-sizeFont.Width)/2; + iTop = rtTmp.Top+(rtTmp.Height()-sizeFont.Height)/2; + pCanvas->TextOutW(iLeft, iTop, strText); + pCanvas->Pen->Color = LINE_COLOR; + pCanvas->MoveTo( LEFT_CAPTION+WIDTH_PROG(Width)+WIDTH_LINE/2 , rtTmp.Top); + pCanvas->LineTo( LEFT_CAPTION+WIDTH_PROG(Width)+WIDTH_LINE/2, rtTmp.Bottom); + + String oriFontName = pCanvas->Font->Name; + pCanvas->Font->Name = "Times New Roman"; + + //Ʒid + char styleID[256]; + if( pPtInfo->idLoc==0 ) + sprintf(styleID, "[%d]", pPtInfo->idStyle); + else if( pPtInfo->idLoc==1 ) + sprintf(styleID, "[S%d]", pPtInfo->idStyle); + else if( pPtInfo->idLoc!=(UINT)-1 ) + sprintf( styleID, "[L%d] ", LOWORD(pPtInfo->idStyle) ); + + iLeft = LEFT_STYLE(Width); + strText = styleID; + sizeFont = pCanvas->TextExtent( strText ); + iLeft = LEFT_STYLE(Width)+(WIDTH_STYLE(Width)-sizeFont.Width)/2; + iTop = rtTmp.Top+(rtTmp.Height()-sizeFont.Height)/2; + pCanvas->TextOutW(iLeft, iTop, strText); + + pCanvas->Pen->Color = LINE_COLOR; + pCanvas->MoveTo( LEFT_STYLE(Width)+WIDTH_STYLE(Width)+WIDTH_LINE/2 , rtTmp.Top); + pCanvas->LineTo( LEFT_STYLE(Width)+WIDTH_STYLE(Width)+WIDTH_LINE/2 , rtTmp.Bottom); + + //ư + char segName[256]; + sprintf(segName, "[%s-%d]", NAME_SEG[pPtInfo->segType], pPtInfo->segNo+1); + strText = segName; + sizeFont = pCanvas->TextExtent( strText ); + iLeft = LEFT_SEG(Width)+(WIDTH_SEG(Width)-sizeFont.Width)/2; + iTop = rtTmp.Top+(rtTmp.Height()-sizeFont.Height)/2; + + pCanvas->TextOutW(iLeft, iTop, strText); + + pCanvas->Pen->Color = LINE_COLOR; + pCanvas->MoveTo( LEFT_SEG(Width)+WIDTH_SEG(Width)+WIDTH_LINE/2 , rtTmp.Top); + pCanvas->LineTo( LEFT_SEG(Width)+WIDTH_SEG(Width)+WIDTH_LINE/2 , rtTmp.Bottom); + + pCanvas->Font->Name = oriFontName; + } +} +//--------------------------------------------------------------------------- +void __fastcall TListViewPattern::DoIconDraw(TStateBtn *sender, int BsTmp, TRect rtTmp, TCanvas *pCanvas) +{ + TStateBtn *pBtn = (TStateBtn *)sender; + TStateBtn *pCell = pBtn->m_PAR; + TTextureInfo *info = (TTextureInfo*)pCell->m_Data; + TPngImage *pIMG = NULL; + String sHint; + + if(sender->Index==0) { + pIMG = info->bCollected?pngCol:pngUnCol; + if(BsTmp==Bs_ENTER ) { + sHint = info->bCollected ? "ȡղ" : "ղ"; + } + } + else if(sender->Index==1) { + TPROSTYLE* styleInfo = GetStyleInfo( info->idLoc, info->idStyle ); + if( styleInfo && styleInfo->idLoc==0 && styleInfo->pOrigin->cost>0 ) { + pIMG = pngCharge; + if(BsTmp==Bs_ENTER ) { + sHint = "շѣ"; + sHint += IntToStr( styleInfo->pOrigin->cost ); + sHint += ""; + } + } + } + + if( pIMG ) { + int iWidth = pIMG->Width/3; + int nTrans = BsTmp==Bs_NORMAL ? 0 + : BsTmp==Bs_ENTER ? (-iWidth) + : BsTmp==Bs_DOWN ? (-2*iWidth) + : (-3*iWidth); + + if( Bs_NORMAL==BsTmp || Bs_ENTER==BsTmp || Bs_DOWN==BsTmp ) { + HRGN rgnClip = CreateRectRgn( rtTmp.Left, rtTmp.Top, + rtTmp.Left+rtTmp.Width(), rtTmp.Top+rtTmp.Height() ); + + SelectClipRgn( pCanvas->Handle, rgnClip ); + pCanvas->Draw(rtTmp.Left+nTrans, rtTmp.Top, pIMG); + SelectClipRgn( pCanvas->Handle, NULL ); + DeleteObject(rgnClip); + } + } + + if( sHint.Length() ){ + m_btnHint = sender; + Hint = sHint; + } + else if(m_btnHint==sender ){ + m_btnHint = NULL; + Hint = ""; + Application->CancelHint(); + } +} +//--------------------------------------------------------------------------- +int __fastcall TListViewPattern::DoIconsNum(TStateBtn *parent) +{ + return 2; +} +//--------------------------------------------------------------------------- +int __fastcall TListViewPattern::DoIconsBounds(TStateBtn *sender, TRect &rtBounds) +{ + int iLeft, iTop, iWidth, iHeight; + + if(sender->Index==0) { + + iLeft = Width - WIDTH_SB - WIDTH_IMG_COL; + iTop = (CELL_HEIGHT - 15) / 2; + iWidth = 21; + iHeight = 15; + } + else if(sender->Index==1) { + + iLeft = LEFT_SEG(Width) - WIDTH_IMG_CHARGE - 1; + iTop = (CELL_HEIGHT - pngCharge->Height)/2; + iWidth = pngCharge->Width/3; + iHeight = pngCharge->Height; + } + + rtBounds = TRect(iLeft, iTop, iLeft+iWidth, iTop+iHeight); +} +//--------------------------------------------------------------------------- +void __fastcall TListViewPattern::DoCellLClick(TStateBtn *sender) +{ + TStateBtn *pBtn = (TStateBtn *)sender; + + if( m_pPtInfo!=(TTextureInfo*)pBtn->m_Data ){ + if( m_nPlayIndex!=this->IndSel ) + f_MM_Stop(); + + m_pPtInfo = (TTextureInfo *)pBtn->m_Data; + + if( FOnTextureChanged ) + FOnTextureChanged((TObject*)m_pPtInfo); + } +} +//--------------------------------------------------------------------------- +void __fastcall TListViewPattern::DoCellDBClick(TStateBtn *sender) +{ + TTextureInfo *pPtInfo = NULL; + + if( sender ) { + TStateBtn *pBtn = (TStateBtn *)sender; + pPtInfo = (TTextureInfo*)pBtn->m_Data; + m_nPlayIndex = pBtn->Index; + } + else { + pPtInfo = m_pPtInfo; + } + + if( pPtInfo ){ + TPROSTYLE* info = GetStyleInfo( pPtInfo->idLoc, pPtInfo->idStyle ); + if( !info ) + return; + + int stype = pPtInfo->segType, + sno = pPtInfo->segNo, + iChno = -1, + nStageNum = m_lstStages ? m_lstStages->size() : 1, + nBarCount = 0, + iPlayBar = m_iPlayBar, + iFBar = -1; + + TStage* aStages = new TStage[nStageNum]; + + for( int i=0; iaChords ){ + pStage->aChords = new TBarChords[pTemp->nBarNum]; + memcpy( pStage->aChords, pTemp->aChords, sizeof(TBarChords)*pTemp->nBarNum ); + } + } + else{ + int seed = time(NULL); + int barNum = 4; + if( stype>=SEGTYPE_INTRO ){ + if( info->idLoc==0 ) { + if( stype==SEGTYPE_INTRO ) + barNum = info->pOrigin->detail.aIntroBars[sno]; + else + barNum = info->pOrigin->detail.aEndingBars[sno]; + } + else if( info->idLoc==1 ) + barNum = info->pShare->aIEBars[stype][sno]; + else + barNum = info->pLocal->aIEBars[stype][sno]; + } + + pStage->nBarNum = barNum; + + int key = g_iMelodyKey; + if( key<0 || key>11 ) + key = seed % 12; + + pStage->iSegKey = key; + pStage->iSegType = stype; + + char cType = (seed>>1) % 2; + int iPreset = (seed>>2) % 4; + + aStages->aChords = new TBarChords[barNum]; + for( int j=0; jaChords[j].iKey[0] + = aStages->aChords[j].iKey[1] + = aStages->aChords[j].iKey[2] + = aStages->aChords[j].iKey[3] = chordKey; + aStages->aChords[j].iType[0] + = aStages->aChords[j].iType[1] + = aStages->aChords[j].iType[2] + = aStages->aChords[j].iType[3] = chordType; + } + } + + if( pStage->iSegType==stype ){ + pStage->nTrkNum = 1; + pStage->aTracks = new TComposeTrack; + + TComposeTrack* pTrack = pStage->aTracks; + + pTrack->iProg = pPtInfo->prog; + pTrack->nVol = pPtInfo->vol; + + if( info->idLoc==0 ){ + pTrack->iStyleLoc = 0; + pTrack->iStyleId = info->idStyle; + pTrack->iSegNo = sno; + iChno = pTrack->iChanSpec = pTrack->iChanNo + = info->pOrigin->detail.tracks[stype][sno][pPtInfo->chNo].no; + } + else if( info->idLoc==1 ){ + TSTYLESHARE* pShare = info->pShare; + TSHARETRACKREF& rRef = pShare->trkRef[stype][sno][pPtInfo->chNo]; + + pTrack->iStyleLoc = 0; + pTrack->iStyleId = rRef.idStyle; + pTrack->iSegNo = rRef.segNo; + iChno = pTrack->iChanSpec = pTrack->iChanNo = rRef.chan; + } + else{ + TSTYLELOCAL* pLocal = info->pLocal; + TTRACKREF& rRef = pLocal->trkRef[stype][sno][pPtInfo->chNo]; + pTrack->iStyleLoc = rRef.idLoc; + pTrack->iStyleId = rRef.idStyle; + pTrack->iSegNo = rRef.segNo; + iChno = pTrack->iChanSpec = pTrack->iChanNo = rRef.chan; + } + + if( iFBar<0 ) + iFBar = nBarCount; + } + + nBarCount += pStage->nBarNum; + } + + if( iPlayBar>=0 && iFBar>iPlayBar ) + iPlayBar = iFBar; + + int len = 1000000; + BYTE* data = new BYTE[len]; + HRESULT ret = f_CM_Compose( &len, data, g_iMelodyTimeSignature, g_nMelodyTempo, + nStageNum, aStages, false, NULL, NULL ); + + if( ret==0 ){ + f_MM_LoadDemo( data, len ); + char* strFile = m_iFont==0xFF ? NULL : m_iFont<0x80 ? g_lstFonts[m_iFont]->strFileName + : g_lstVSTi[m_iFont-0x80]->strFileName; + f_MM_PlayDemo( NULL, iPlayBar, -1, m_iProg, m_iFont, strFile ); + } + else + DebugPrint( "Compose error: %d", ret ); + + delete[] data; + + SAFE_DELETE_ARRAY(aStages); + } +} +//--------------------------------------------------------------------------- +void __fastcall TListViewPattern::DoIconLClick(TStateBtn *sender) +{ + if(sender->Index==0) { + + TStateBtn *pBtn = (TStateBtn *)sender; + TStateBtn *pCell = pBtn->m_PAR; + TTextureInfo *pPtInfo = (TTextureInfo *)pCell->m_Data; + pPtInfo->bCollected = !pPtInfo->bCollected; + + TPROSTYLE* info = GetStyleInfo( pPtInfo->idLoc, pPtInfo->idStyle ); + char chan = info->idLoc==0 ? + info->pOrigin->detail.tracks[pPtInfo->segType][pPtInfo->segNo][pPtInfo->chNo].no + : info->idLoc==1 ? + info->pShare->trkRef[pPtInfo->segType][pPtInfo->segNo][pPtInfo->chNo].chan + : info->pLocal->trkRef[pPtInfo->segType][pPtInfo->segNo][pPtInfo->chNo].chan; + + SetFavorTexture( pPtInfo->idLoc, pPtInfo->idStyle, pPtInfo->segType, pPtInfo->segNo, + chan, pPtInfo->bCollected ); + // InsColSet( pInsRefTmp, pPtInfo->bCollected ); + + pBtn->Paint(); + } +} +//--------------------------------------------------------------------------- +int __fastcall TListViewPattern::DoMouseWheel(TObject *Sender) +{ + TListViewBase::DoMouseWheel(Sender); +// m_Hint->ReleaseHandle(); +} +//--------------------------------------------------------------------------- +//void __fastcall TListViewPattern::HintTimerProc(System::TObject* Sender) +//{ +// if( m_HintTimer ) +// m_HintTimer->Enabled = false; +// if( m_Hint && HintStr.Length()>0 ){ +// m_Hint->ShowHintWindow( ClientToScreen(m_ptMove), HintStr ); +// } +//} +//// --------------------------------------------------------------------------- diff --git a/ListViewPattern.h b/ListViewPattern.h new file mode 100644 index 0000000..9b91ad0 --- /dev/null +++ b/ListViewPattern.h @@ -0,0 +1,101 @@ +//--------------------------------------------------------------------------- + +#ifndef ListViewPatternH +#define ListViewPatternH +//--------------------------------------------------------------------------- +#include "ListViewBase.h" +#include "FavorTextureUnit.h" +#include "Compose.h" +#include "SkinHintWindow.h" + +#define WIDTH_LINE 4 +#define WIDTH_SB 14 +#define WIDTH_IMG_PROG 0 +#define WIDTH_IMG_COL 21 +#define WIDTH_IMG_CHARGE 21 + +#define WIDTH_AVERAGE(W) ((W-WIDTH_SB-WIDTH_IMG_PROG-WIDTH_IMG_COL-WIDTH_LINE*3)/5) +#define WIDTH_PROG(W) (WIDTH_AVERAGE(W)*3) +#define WIDTH_SEG(W) (WIDTH_AVERAGE(W)-6) +#define WIDTH_STYLE(W) (WIDTH_AVERAGE(W)+6) + +#define LEFT_CAPTION (WIDTH_IMG_PROG) +#define LEFT_PROG (LEFT_CAPTION) +#define LEFT_STYLE(W) (LEFT_PROG + WIDTH_PROG(W) + WIDTH_LINE) +#define LEFT_SEG(W) (LEFT_STYLE(W) + WIDTH_STYLE(W) + WIDTH_LINE) +#define LEFT_COL(W) (LEFT_SEG(W) + WIDTH_SEG(W) + WIDTH_LINE) +//--------------------------------------------------------------------------- +typedef struct tagTextureInfo +{ +// TPROSTYLE *styleInfo; + UINT idLoc; //λid + UINT idStyle; //ID + char segType; //Ƭ + char segNo; //Ƭκ + char chNo; // (FavorTextureṹͬ + char prog; // + char vol; // + bool bCollected; + + tagTextureInfo(){ + memset( this, 0, sizeof(tagTextureInfo) ); + } + tagTextureInfo( UINT loc, UINT sty, char type, char sNo, char cNo, char pg, char vl, bool bCol=false ){ + idLoc = loc; + idStyle = sty; + segType = type; + segNo = sNo; + chNo = cNo; + prog = pg; + vol = vl; + bCollected = bCol; + } +}TTextureInfo, *PTTextureInfo; + +typedef vector VCPtInfo; + +class TListViewPattern: public TListViewBase +{ +private: + TStateBtn *m_btnHint; + TStageList* m_lstStages; + int m_iPlayBar; + + virtual int __fastcall DoCellHgt(TTableView *Sender, int iCellIndex); + virtual int __fastcall DoMDNum(TTableView *Sender); + + virtual void __fastcall DoCellDraw(TStateBtn *sender, int BsTmp, TRect rtTmp, TCanvas *pCanvas); + virtual int __fastcall DoCellData(TStateBtn *sender); + virtual void __fastcall DoCellLClick(TStateBtn *sender); + virtual void __fastcall DoCellDBClick(TStateBtn *sender); + + virtual void __fastcall DoIconDraw(TStateBtn *sender, int BsTmp, TRect rtTmp, TCanvas *pCanvas); + virtual int __fastcall DoIconsNum(TStateBtn *parent); + virtual int __fastcall DoIconsBounds(TStateBtn *sender, TRect &rtBounds); + virtual void __fastcall DoIconLClick(TStateBtn *sender); + + int m_nPlayIndex; + int m_iseed; + TNotifyEvent FOnTextureChanged; + +protected: + + virtual int __fastcall DoMouseWheel(TObject *Sender); + +public: + + bool m_bChan9; + + VCPtInfo *m_LstParttern; + TTextureInfo *m_pPtInfo; + char m_iFont, m_iProg; + void __fastcall OnPartternPlay(TObject *sender); + + __fastcall TListViewPattern(TComponent* Owner, bool bChan9=false, TStageList* lstStages=NULL, int iPlayBar=-1); + __fastcall ~TListViewPattern(); + +__published: + __property TNotifyEvent OnTextureChanged = {read=FOnTextureChanged, write=FOnTextureChanged }; +}; +#endif + diff --git a/ListViewText.cpp b/ListViewText.cpp new file mode 100644 index 0000000..773db73 --- /dev/null +++ b/ListViewText.cpp @@ -0,0 +1,73 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop + +#include "ListViewText.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +//--------------------------------------------------------------------------- +__fastcall TListViewText::TListViewText(TComponent* Owner) + : TListViewBase( Owner ) +{ + m_VcText = NULL; +} +//--------------------------------------------------------------------------- + +__fastcall TListViewText::~TListViewText() +{ + +} +//--------------------------------------------------------------------------- +int __fastcall TListViewText::DoCellHgt(TTableView *Sender, int iCellIndex) +{ + return CELL_HEIGHT; +} +//--------------------------------------------------------------------------- +int __fastcall TListViewText::DoMDNum(TTableView *Sender) +{ + if( m_VcText ) { + int nSize = m_VcText->size(); + return m_VcText->size(); + } + + return 0; +} +//--------------------------------------------------------------------------- +int __fastcall TListViewText::DoCellData(TStateBtn *sender) +{ + sender->SetData((void *)((*m_VcText)[sender->Index])); +} +//--------------------------------------------------------------------------- +void __fastcall TListViewText::DoCellDraw(TStateBtn *sender, int BsTmp, TRect rtTmp, TCanvas *pCanvas) +{ + TStateBtn *pBtn = (TStateBtn *)sender; + char *strProg = (char *)pBtn->m_Data; + + if( Bs_NORMAL==BsTmp ) { + pCanvas->Brush->Color = LP_ITEM_DEF; + }else if( Bs_ENTER==BsTmp ){ + pCanvas->Brush->Color = LP_ITEM_OVER; + }else if( Bs_DOWN==BsTmp ){ + pCanvas->Brush->Color = LP_ITEM_SELECTED; + } + + if( BsTmp==Bs_NORMAL || + BsTmp==Bs_ENTER || + BsTmp==Bs_DOWN ) + { + pCanvas->FillRect(rtTmp); + + pCanvas->Brush->Style = bsClear; + pCanvas->Font->Color = FontClolor; + + String strCaption = strProg; + TSize szFont = pCanvas->TextExtent(strCaption); +// pCanvas->Font->Size = 8; + pCanvas->TextOutW(rtTmp.Left+4, + rtTmp.Top+(rtTmp.Height()-szFont.Height)/2, + strCaption); + } +} +//--------------------------------------------------------------------------- + + diff --git a/ListViewText.h b/ListViewText.h new file mode 100644 index 0000000..9fcfa04 --- /dev/null +++ b/ListViewText.h @@ -0,0 +1,34 @@ +//--------------------------------------------------------------------------- + +#ifndef ListViewTextH +#define ListViewTextH +//--------------------------------------------------------------------------- +#include "ListViewBase.h" + +#define LP_ITEM_OVER RGB(67, 73, 80) +#define LP_ITEM_SELECTED RGB(0, 0, 0) +#define LP_ITEM_DEF RGB(39, 42, 47) + +#define FontClolor TColor(0xBDAA9C) + +#define CELL_HEIGHT 18 +//--------------------------------------------------------------------------- +class TListViewText: public TListViewBase +{ +private: + + virtual int __fastcall DoCellHgt(TTableView *Sender, int iCellIndex); + virtual int __fastcall DoMDNum(TTableView *Sender); + + virtual void __fastcall DoCellDraw(TStateBtn *sender, int BsTmp, TRect rtTmp, TCanvas *pCanvas); + virtual int __fastcall DoCellData(TStateBtn *sender); + +public: + + vector *m_VcText; + + __fastcall TListViewText(TComponent* Owner); + __fastcall ~TListViewText(); +}; +#endif + diff --git a/LoginFormUnit.cpp b/LoginFormUnit.cpp new file mode 100644 index 0000000..22fe206 --- /dev/null +++ b/LoginFormUnit.cpp @@ -0,0 +1,520 @@ +//--------------------------------------------------------------------------- + +#include +#include +#include +#include "GlobalUnit.h" +#pragma hdrstop + +#include "LoginFormUnit.h" +#include "MessageFormUnit.h" +#include "VerifyCodeFormUnit.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma link "GeneralDialogPanel" +#pragma link "LineEdit" +#pragma link "TextButton" +#pragma link "CKBox" +#pragma resource "*.dfm" + +TLoginForm *LoginForm = NULL; + +const char *g_pPattern[5] = {"^[_a-zA-Z0-9\\xA1-\\xFE\\.-]{3,16}$", + "^[_a-zA-Z0-9\\.-]+@([_a-zA-Z0-9]+\\.)+[a-zA-Z0-9]{2,3}$", + "^[\\x21-\\x7E]{3,16}$", + "^[\\x21-\\x7E]{6,16}$", + "^$|^1(3\\d|4[5-9]|5[0-35-9]|6[2567]|7[0-8]|8\\d|9[0-35-9])\\d{8}$" + }; + +//--------------------------------------------------------------------------- + +__fastcall TLoginForm::TLoginForm(TComponent* Owner) + : TForm(Owner) +{ + FIsLogin = true; +// m_logPasswordEdit->PasswordChar = L'*'; +// m_regPasswordEdit->PasswordChar = L'*'; +// m_ConfirmEdit->PasswordChar = L'*'; + isEmailOrMobile = 0; + + for( int i=0; iClassNameIs( TLabel::ClassName() ) ) + ((TLabel*)Components[i])->ControlStyle>>csOpaque; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TLoginForm::FormCreate(TObject *Sender) +{ + m_logDialogPanel->Font->Size = g_szFont9; + m_logUserEdit->SetTextFont(g_strTxtFontName, g_szFont9); + m_logPasswordEdit->SetTextFont(g_strTxtFontName, g_szFont9); + m_logButton->FontSize = g_szFont9; + + m_regDialogPanel->Font->Size = g_szFont9; + m_regUserEdit->SetTextFont(g_strTxtFontName, g_szFont9); + m_regPasswordEdit->SetTextFont(g_strTxtFontName, g_szFont9); + m_VerifyEdit->SetTextFont(g_strTxtFontName, g_szFont9); + m_ConfirmEdit->SetTextFont(g_strTxtFontName, g_szFont9); + m_IsAutoLogin->Font->Size = g_szFont9; + m_ckAgree->Font->Size = g_szFont9; + m_regButton->FontSize = g_szFont9; + m_sendButton->FontSize = g_szFont9; + + FUserName = String(g_infoUser.strUserName); + m_logUserEdit->Text = FUserName; + + char strURL[256]; + f_CS_GetWebPageURL( URL_REGCODE, strURL ); + + RESTClient->BaseURL = String(strURL); +} +//--------------------------------------------------------------------------- + +void __fastcall TLoginForm::FormShow(TObject *Sender) +{ + Layout(); +} +//--------------------------------------------------------------------------- + +bool __fastcall TLoginForm::CheckInput(const char * pText, int type) +{ + bool bRet = false; + pcre *pPcre = NULL; + int nOffset = -1; + const char *pPattern = g_pPattern[type]; + const char *pErrMsg = NULL; + + if( NULL == (pPcre = pcre_compile(pPattern, 0, &pErrMsg, &nOffset, NULL)) ){ + printf("pcre_compile ErrMsg=%s\n", pErrMsg); + } + else{ + if( pcre_exec(pPcre, NULL, pText, strlen(pText), 0, NULL, 0) < 0 ){ + printf("%s doesn't match %s\n", pText, pPattern); + } + else{ + printf("%s matches %s\n", pText, pPattern); + bRet = true; + } + + pcre_free(pPcre); + } + + return bRet; +} +//--------------------------------------------------------------------------- + +void __fastcall TLoginForm::DoGoClick(TObject *Sender) +{ + if(FIsLogin){ + m_logUserEdit->Text = m_logUserEdit->Text.Trim(); + m_logPasswordEdit->Text = m_logPasswordEdit->Text.Trim(); + + if(m_logUserEdit->Text.IsEmpty()){ + m_logUserEdit->SetFocus(); + } + else if(m_logPasswordEdit->Text.IsEmpty()){ + m_logPasswordEdit->SetFocus(); + } + else{ + bool bCheckOk = true; + AnsiString astrUN = m_logUserEdit->Text; + if( !CheckInput(astrUN.c_str(), 0) && !CheckInput(astrUN.c_str(), 1 )){ + m_logUserEdit->Text = ""; + m_logUserEdit->SetFocus(); + bCheckOk = false; + } + else{ + AnsiString astrPW = m_logPasswordEdit->Text; + if(!CheckInput(astrPW.c_str(), 2)){ + m_logPasswordEdit->Text = ""; + m_logPasswordEdit->SetFocus(); + bCheckOk = false; + } + } + + if(bCheckOk){ + FUserName = m_logUserEdit->Text; + FPassword = m_logPasswordEdit->Text; + ModalResult = mrOk; + + string strUN = AnsiString(FUserName).c_str(); + string strPW = AnsiString(FPassword).c_str(); + SetAutoLogin(FAutoLogin, strUN.c_str(), strPW.c_str()); + } + } + } + else{ + m_regUserEdit->Text = m_regUserEdit->Text.Trim(); + m_regPasswordEdit->Text = m_regPasswordEdit->Text.Trim(); + m_ConfirmEdit->Text = m_ConfirmEdit->Text.Trim(); + m_VerifyEdit->Text = m_VerifyEdit->Text.Trim(); + + if(m_regUserEdit->Text.IsEmpty()){ + m_regUserEdit->SetFocus(); + } + else if(m_VerifyEdit->Text.IsEmpty()){ + m_VerifyEdit->SetFocus(); + } + else if(m_regPasswordEdit->Text.IsEmpty()){ + m_regPasswordEdit->SetFocus(); + } + else if(m_ConfirmEdit->Text.IsEmpty()){ + m_ConfirmEdit->SetFocus(); + } + else{ + AnsiString astrPW = m_regPasswordEdit->Text; + if(!CheckInput(astrPW.c_str(), 3)){ + m_regPasswordEdit->Text = ""; + m_regPasswordEdit->SetFocus(); + + return; + } + + if(m_regPasswordEdit->Text.Compare(m_ConfirmEdit->Text)){ + m_ConfirmEdit->Text = ""; + m_ConfirmEdit->SetFocus(); + + return; + } + + AnsiString astrUN = m_regUserEdit->Text; + + if( CheckInput(astrUN.c_str(), 1) ){ + isEmailOrMobile = 1; + } + else if( CheckInput(astrUN.c_str(), 4) ){ + isEmailOrMobile = 2; + } + else{ + m_regUserEdit->Text = ""; + m_regUserEdit->SetFocus(); + + return; + } + + this->Enabled = false; + Screen->Cursor = crHourGlass; + AnsiString strVerify = m_VerifyEdit->Text; + + RESTRequest->Resource = "verifyRegCode"; + RESTRequest->Params->Clear(); + RESTRequest->Params->AddItem("username", astrUN); + RESTRequest->Params->AddItem("verifyCode", strVerify); + + try{ + RESTRequest->Execute(); + } + catch (Exception &exception){ + DebugPrint("exception: %s", exception.Message ); + } + + Screen->Cursor = crDefault; + this->Enabled = true; + + if(RESTResponse->StatusCode==200){ + TJSONValue *jValue = RESTResponse->JSONValue; + if(jValue==NULL) + return; + + TJSONValue *jCode = jValue->FindValue("code"); + if( jCode==NULL ) + return; + + String code = ((TJSONString*)jCode)->Value(); + if(code!="00000"){ + String msg; + if(code=="A0213") + msg = "ע֤ѹ"; + else if(code=="A0214") + msg = "ע֤"; + else + msg = ((TJSONString*)jValue->FindValue("msg"))->Value(); + + MessageForm->ShowMessage( msg, MB_ICONERROR | MB_OK ); + + return; + } + } + else{ + MessageForm->ShowMessage( RESTResponse->StatusText, MB_ICONERROR | MB_OK ); + return; + } + + FUserName = m_regUserEdit->Text; + FPassword = m_regPasswordEdit->Text; + ModalResult = mrOk; + } + } +} +//--------------------------------------------------------------------------- + +void __fastcall TLoginForm::DoSwitchClick(TObject *Sender) +{ + FIsLogin = Sender!=(TObject*)m_logSwitchLabel; + + Layout(); +} +//--------------------------------------------------------------------------- + +void __fastcall TLoginForm::DoAutoCheck(TObject *Sender) +{ + FAutoLogin = m_IsAutoLogin->Checked; +} +//--------------------------------------------------------------------------- + +void __fastcall TLoginForm::Layout() +{ + if( FIsLogin ){ + m_logDialogPanel->Visible = true; + m_regDialogPanel->Visible = false; + + Height = 190; + + if( m_logUserEdit->Text.IsEmpty() ){ + m_logUserEdit->SetFocus(); + } + else if( m_logPasswordEdit->Text.IsEmpty() ){ + m_logPasswordEdit->SetFocus(); + } + } + else{ + m_logDialogPanel->Visible = false; + m_regDialogPanel->Visible = true; + + Height = 235; + + m_ckAgree->Checked = true; + m_ConfirmEdit->Text = ""; + + if( m_regUserEdit->Text.IsEmpty() ){ + m_regUserEdit->SetFocus(); + } + else if( m_VerifyEdit->Text.IsEmpty() ){ + m_VerifyEdit->SetFocus(); + } + else if( m_regPasswordEdit->Text.IsEmpty() ){ + m_regPasswordEdit->SetFocus(); + } + else if( m_ConfirmEdit->Text.IsEmpty() ){ + m_ConfirmEdit->SetFocus(); + } + } +} +//--------------------------------------------------------------------------- + +void __fastcall TLoginForm::SetUserName(String Value) +{ + if(FUserName != Value){ + FUserName = Value; + m_logUserEdit->Text = Value; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TLoginForm::SetPassWord(String Value) +{ + if(FPassword != Value){ + FPassword = Value; + m_logPasswordEdit->Text = Value; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TLoginForm::SetConfirm(String Value) +{ + if(FConfirm != Value){ + FConfirm = Value; + m_ConfirmEdit->Text = Value; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TLoginForm::SetVerify(String Value) +{ + if(FVerify != Value){ + FVerify = Value; + m_VerifyEdit->Text = Value; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TLoginForm::SetIsLogin(bool Value) +{ + if(FIsLogin != Value){ + FIsLogin = Value; + + Layout(); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TLoginForm::SetIsAntoLogin(bool Value) +{ + if(FAutoLogin != Value){ + FAutoLogin = Value; + m_IsAutoLogin->Checked = Value; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TLoginForm::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) +{ + switch( Key ){ + case VK_RETURN: + DoGoClick(NULL); + break; + + case VK_ESCAPE: + ModalResult = mrCancel; + break; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TLoginForm::AgreementMouseEnter(TObject *Sender) +{ + m_lblAgreement->Font->Color = RGB(0, 255, 255); +} +//--------------------------------------------------------------------------- + +void __fastcall TLoginForm::AgreementMouseLeave(TObject *Sender) +{ + m_lblAgreement->Font->Color = RGB(0, 200, 200); +} +//--------------------------------------------------------------------------- + +void __fastcall TLoginForm::AgreementClick(TObject *Sender) +{ + char strURL[256]; + f_CS_GetWebPageURL( URL_USERAGREEMENT, strURL ); + ShellExecute(Handle, NULL, ((String)strURL).c_str(), NULL, NULL, SW_SHOWNORMAL); +} +//--------------------------------------------------------------------------- + +void __fastcall TLoginForm::LinkLabelMouseEnter(TObject *Sender) +{ + TLabel* pLabel = (TLabel*)Sender; + pLabel->Font->Color = RGB(225, 235, 245); +} +//--------------------------------------------------------------------------- + +void __fastcall TLoginForm::LinkLabelMouseLeave(TObject *Sender) +{ + TLabel* pLabel = (TLabel*)Sender; + pLabel->Font->Color = RGB(191,203,218); +} +//--------------------------------------------------------------------------- + +void __fastcall TLoginForm::AgreeChange(TObject *Sender) +{ + m_regButton->Enabled = m_ckAgree->Checked; +} +//--------------------------------------------------------------------------- + +void __fastcall TLoginForm::DoSendClick(TObject *Sender) +{ +// m_regUserEdit->Text = m_regUserEdit->Text.Trim(); +// if(m_regUserEdit->Text.IsEmpty()){ +// m_regUserEdit->SetFocus(); +// return; +// } +// + AnsiString astrUN = m_regUserEdit->Text; +// if( !CheckInput(astrUN.c_str(), 1) && !CheckInput(astrUN.c_str(), 4 )){ +// m_regUserEdit->Text = ""; +// m_regUserEdit->SetFocus(); +// return; +// } + + String sKey, sCode; + TVerifyCodeForm* pForm = new TVerifyCodeForm(NULL, RESTClient->BaseURL); + if( pForm->ShowModal() == mrOk){ + sKey = pForm->GetKey(); + sCode = pForm->GetCode(); + } + delete pForm; + + if(sKey.Length()==0 || sCode.Length()==0) + return; + + this->Enabled = false; + Screen->Cursor = crHourGlass; + + RESTRequest->Resource = "sendRegCode"; + RESTRequest->Params->Clear(); + RESTRequest->Params->AddItem("contact", astrUN); + RESTRequest->Params->AddItem("captchaKey", sKey); + RESTRequest->Params->AddItem("captchaCode", sCode); + + try{ + RESTRequest->Execute(); + } + catch (Exception &exception){ + DebugPrint("exception: %s", exception.Message ); + } + + Screen->Cursor = crDefault; + this->Enabled = true; + + if(RESTResponse->StatusCode==200){ + TJSONValue *jValue = RESTResponse->JSONValue; + if(jValue==NULL) + return; + + TJSONValue *jCode = jValue->FindValue("code"); + if( jCode==NULL ) + return; + + String code = ((TJSONString*)jCode)->Value(); + if(code=="00000"){ + m_sendButton->Text = String(CODE_INTERVAL) + ""; + m_sendButton->Enabled = false; + + PostMessage(Application->MainFormHandle, UM_STARTCDTIMER, 0, 0); + MessageForm->ShowMessage(" " + astrUN + " ע֤\n15Чظύ!", MB_OK | MB_ICONINFORMATION); + } + else{ + String msg; + if(code=="A0213") + msg = "˻֤ѹ"; + else if(code=="A0214") + msg = "˻֤"; + else + msg = ((TJSONString*)jValue->FindValue("msg"))->Value(); + + MessageForm->ShowMessage( msg, MB_ICONERROR | MB_OK ); + } + } + else{ + MessageForm->ShowMessage( RESTResponse->StatusText, MB_ICONERROR | MB_OK ); + } +} + +//--------------------------------------------------------------------------- + +void __fastcall TLoginForm::OnCDTimer(int countDown) +{ + + if( countDown==0 ){ + m_sendButton->Text = "·"; + m_sendButton->Enabled = true; + } + else{ + m_sendButton->Text = String(countDown) + ""; + m_sendButton->Enabled = false; + } + + m_sendButton->Invalidate(); +} +//--------------------------------------------------------------------------- + + +void __fastcall TLoginForm::ResetPassClick(TObject *Sender) +{ + char strURL[256]; + f_CS_GetWebPageURL( URL_RESETPASS, strURL ); + ShellExecute(Handle, NULL, ((String)strURL).c_str(), NULL, NULL, SW_SHOWNORMAL); +} +//--------------------------------------------------------------------------- + diff --git a/LoginFormUnit.dfm b/LoginFormUnit.dfm new file mode 100644 index 0000000..a67e698 --- /dev/null +++ b/LoginFormUnit.dfm @@ -0,0 +1,420 @@ +object LoginForm: TLoginForm + Left = 0 + Top = 0 + ParentCustomHint = False + BorderStyle = bsNone + Caption = 'MainForm' + ClientHeight = 235 + ClientWidth = 377 + Color = 5064257 + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + KeyPreview = True + Position = poMainFormCenter + Scaled = False + OnCreate = FormCreate + OnKeyDown = FormKeyDown + OnShow = FormShow + TextHeight = 13 + object m_logDialogPanel: TGeneralDialogPanel + Left = 0 + Top = 0 + Width = 377 + Height = 235 + Align = alClient + Caption = #30331#24405 + Color = 5064257 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentBackground = False + ParentFont = False + TabOrder = 0 + object m_logSwitchLabel: TLabel + Left = 277 + Top = 154 + Width = 69 + Height = 19 + Cursor = crHandPoint + Hint = #28857#20987#27880#20876#26032#29992#25143 + ParentCustomHint = False + Alignment = taRightJustify + Caption = #27880#20876#26032#29992#25143' ' + Font.Charset = DEFAULT_CHARSET + Font.Color = 14339007 + Font.Height = -13 + Font.Name = 'Microsoft YaHei UI' + Font.Style = [fsItalic, fsUnderline] + Font.Quality = fqClearTypeNatural + ParentFont = False + ParentShowHint = False + ShowAccelChar = False + ShowHint = True + OnClick = DoSwitchClick + OnMouseEnter = LinkLabelMouseEnter + OnMouseLeave = LinkLabelMouseLeave + end + object m_logUserNameLabel: TLabel + Left = 22 + Top = 41 + Width = 40 + Height = 14 + Caption = #29992#25143#21517':' + Font.Charset = DEFAULT_CHARSET + Font.Color = 14339007 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentFont = False + end + object m_logPasswordLabel: TLabel + Left = 198 + Top = 41 + Width = 36 + Height = 14 + Caption = #23494#30721#65306 + Font.Charset = DEFAULT_CHARSET + Font.Color = 14339007 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentFont = False + end + object m_logButton: TTextButton + Left = 258 + Top = 103 + Width = 93 + Height = 36 + ParentShowHint = False + ShowHint = True + OnClick = DoGoClick + Text = #30331#24405 + end + object m_lblResetPass: TLabel + Left = 29 + Top = 154 + Width = 65 + Height = 19 + Cursor = crHandPoint + Hint = #28857#20987#25214#22238#23494#30721 + ParentCustomHint = False + Alignment = taRightJustify + Caption = #24536#35760#23494#30721#65311 + Font.Charset = DEFAULT_CHARSET + Font.Color = 14339007 + Font.Height = -13 + Font.Name = 'Microsoft YaHei UI' + Font.Style = [fsItalic, fsUnderline] + Font.Quality = fqClearTypeNatural + ParentFont = False + ParentShowHint = False + ShowAccelChar = False + ShowHint = True + OnClick = ResetPassClick + OnMouseEnter = LinkLabelMouseEnter + OnMouseLeave = LinkLabelMouseLeave + end + object m_IsAutoLogin: TCKBox + Left = 22 + Top = 115 + Width = 80 + Height = 16 + Caption = #33258#21160#30331#24405 + Ctl3D = False + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = 14339007 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentColor = True + ParentCtl3D = False + ParentDoubleBuffered = False + ParentFont = False + TabOrder = 2 + BoxColor = 3748912 + OnChange = DoAutoCheck + end + object m_logPasswordEdit: TLineEdit + Left = 198 + Top = 58 + Width = 156 + Height = 25 + ParentCustomHint = False + HintText = #35831#36755#20837#23494#30721 + MaxLength = 16 + PasswordChar = '*' + NumberMax = -1 + NumberMin = -1 + Color = 15591652 + TabOrder = 1 + end + object m_logUserEdit: TLineEdit + Left = 21 + Top = 58 + Width = 156 + Height = 25 + ParentCustomHint = False + HintText = #35831#36755#20837#29992#25143#21517 + MaxLength = 31 + NumberMax = -1 + NumberMin = -1 + Color = 15591652 + TabOrder = 0 + end + end + object m_regDialogPanel: TGeneralDialogPanel + Left = 0 + Top = 0 + Width = 377 + Height = 235 + Align = alClient + Caption = #27880#20876 + Color = 5064257 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentBackground = False + ParentFont = False + TabOrder = 1 + Visible = False + object m_regSwitchLabel: TLabel + Left = 283 + Top = 199 + Width = 64 + Height = 19 + Cursor = crHandPoint + Hint = #28857#20987#30331#24405 + ParentCustomHint = False + Alignment = taCenter + AutoSize = False + Caption = #24050#26377#36134#25143 + Font.Charset = DEFAULT_CHARSET + Font.Color = 14339007 + Font.Height = -13 + Font.Name = 'Microsoft YaHei UI' + Font.Style = [fsItalic, fsUnderline] + Font.Quality = fqClearTypeNatural + ParentFont = False + ParentShowHint = False + ShowAccelChar = False + ShowHint = True + OnClick = DoSwitchClick + OnMouseEnter = LinkLabelMouseEnter + OnMouseLeave = LinkLabelMouseLeave + end + object m_regUserNameLabel: TLabel + Left = 22 + Top = 41 + Width = 40 + Height = 14 + Caption = #29992#25143#21517':' + Font.Charset = DEFAULT_CHARSET + Font.Color = 14339007 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentFont = False + end + object m_regPasswrodLabel: TLabel + Left = 198 + Top = 38 + Width = 36 + Height = 14 + Caption = #23494#30721#65306 + Font.Charset = DEFAULT_CHARSET + Font.Color = 14339007 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentFont = False + end + object m_ConfirmLabel: TLabel + Left = 198 + Top = 92 + Width = 60 + Height = 14 + Caption = #30830#35748#23494#30721#65306 + Font.Charset = DEFAULT_CHARSET + Font.Color = 14339007 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentFont = False + end + object m_regButton: TTextButton + Left = 258 + Top = 148 + Width = 93 + Height = 36 + ParentShowHint = False + ShowHint = True + OnClick = DoGoClick + Text = #27880#20876 + end + object m_lblAgreement: TLabel + Left = 124 + Top = 203 + Width = 72 + Height = 14 + Cursor = crHandPoint + Hint = #28857#20987#38405#35835#29992#25143#21327#35758 + ParentCustomHint = False + Alignment = taCenter + BiDiMode = bdLeftToRight + Caption = #12298#29992#25143#21327#35758#12299 + Color = 5064257 + Font.Charset = DEFAULT_CHARSET + Font.Color = 13158400 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [fsUnderline] + ParentBiDiMode = False + ParentColor = False + ParentFont = False + ParentShowHint = False + ShowAccelChar = False + ShowHint = True + OnClick = AgreementClick + OnMouseEnter = AgreementMouseEnter + OnMouseLeave = AgreementMouseLeave + end + object m_sendButton: TTextButton + Left = 25 + Top = 148 + Width = 120 + Height = 36 + ParentShowHint = False + ShowHint = True + OnClick = DoSendClick + Text = #33719#21462#27880#20876#39564#35777#30721 + end + object m_VerifyLabel: TLabel + Left = 23 + Top = 92 + Width = 48 + Height = 14 + Caption = #39564#35777#30721#65306 + Font.Charset = DEFAULT_CHARSET + Font.Color = 14339007 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentFont = False + end + object m_ConfirmEdit: TLineEdit + Left = 198 + Top = 109 + Width = 156 + Height = 25 + ParentCustomHint = False + HintText = #35831#20877#27425#36755#20837#23494#30721 + MaxLength = 16 + PasswordChar = '*' + NumberMax = -1 + NumberMin = -1 + Color = 15591652 + TabOrder = 3 + end + object m_regPasswordEdit: TLineEdit + Left = 198 + Top = 58 + Width = 156 + Height = 25 + ParentCustomHint = False + HintText = #35831#36755#20837'6-16'#20301#23494#30721 + MaxLength = 16 + PasswordChar = '*' + NumberMax = -1 + NumberMin = -1 + Color = 15591652 + TabOrder = 2 + end + object m_regUserEdit: TLineEdit + Left = 21 + Top = 58 + Width = 156 + Height = 25 + ParentCustomHint = False + HintText = #35831#36755#20837#25163#26426'/'#37038#31665 + MaxLength = 31 + NumberMax = -1 + NumberMin = -1 + Color = 15591652 + TabOrder = 0 + end + object m_ckAgree: TCKBox + Left = 22 + Top = 202 + Width = 97 + Height = 16 + Caption = #24050#38405#35835#24182#21516#24847 + Ctl3D = False + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = 14339007 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentColor = True + ParentCtl3D = False + ParentDoubleBuffered = False + ParentFont = False + TabOrder = 4 + Checked = True + BoxColor = 3748912 + end + object m_VerifyEdit: TLineEdit + Left = 22 + Top = 109 + Width = 156 + Height = 25 + ParentCustomHint = False + HintText = #35831#36755#20837#27880#20876#39564#35777#30721 + MaxLength = 16 + NumbersOnly = True + NumberMax = -1 + NumberMin = -1 + Color = 15591652 + TabOrder = 1 + end + end + object RESTClient: TRESTClient + Accept = 'application/json, text/plain; q=0.9, text/html;q=0.8,' + AcceptCharset = 'utf-8, *;q=0.8' + ContentType = 'application/json' + Params = <> + SynchronizedEvents = False + Left = 192 + Top = 168 + end + object RESTRequest: TRESTRequest + Client = RESTClient + Method = rmPOST + Params = <> + Response = RESTResponse + SynchronizedEvents = False + Left = 232 + Top = 184 + end + object RESTResponse: TRESTResponse + ContentType = 'application/json' + ContentEncoding = 'UTF-8' + Left = 200 + Top = 168 + end +end diff --git a/LoginFormUnit.h b/LoginFormUnit.h new file mode 100644 index 0000000..67fdc93 --- /dev/null +++ b/LoginFormUnit.h @@ -0,0 +1,103 @@ +//--------------------------------------------------------------------------- + +#ifndef LoginFormUnitH +#define LoginFormUnitH +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include +#include "GeneralDialogPanel.h" +#include "LineEdit.h" +#include "TextButton.h" +#include "CKBox.h" +#include +#include +#include +#include +//--------------------------------------------------------------------------- +#define CODE_INTERVAL 120 + +class TLoginForm : public TForm +{ +__published: // IDE-managed Components + TGeneralDialogPanel *m_logDialogPanel; + TLineEdit *m_logUserEdit; + TLineEdit *m_logPasswordEdit; + TLabel *m_logSwitchLabel; + TLabel *m_logUserNameLabel; + TLabel *m_logPasswordLabel; + TCKBox *m_IsAutoLogin; + TTextButton *m_logButton; + TGeneralDialogPanel *m_regDialogPanel; + TLabel *m_regSwitchLabel; + TLabel *m_regUserNameLabel; + TLabel *m_regPasswrodLabel; + TLabel *m_ConfirmLabel; + TTextButton *m_regButton; + TLabel *m_lblAgreement; + TTextButton *m_sendButton; + TLabel *m_VerifyLabel; + TLineEdit *m_ConfirmEdit; + TLineEdit *m_regPasswordEdit; + TLineEdit *m_regUserEdit; + TCKBox *m_ckAgree; + TLineEdit *m_VerifyEdit; + TRESTClient *RESTClient; + TRESTRequest *RESTRequest; + TRESTResponse *RESTResponse; + TLabel *m_lblResetPass; + void __fastcall DoSwitchClick(TObject *Sender); + void __fastcall DoGoClick(TObject *Sender); + void __fastcall DoAutoCheck(TObject *Sender); + void __fastcall DoSendClick(TObject *Sender); + void __fastcall FormCreate(TObject *Sender); + void __fastcall FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift); + void __fastcall AgreementMouseEnter(TObject *Sender); + void __fastcall AgreementMouseLeave(TObject *Sender); + void __fastcall AgreementClick(TObject *Sender); + void __fastcall LinkLabelMouseEnter(TObject *Sender); + void __fastcall LinkLabelMouseLeave(TObject *Sender); + void __fastcall AgreeChange(TObject *Sender); + void __fastcall FormShow(TObject *Sender); + void __fastcall ResetPassClick(TObject *Sender); + +private: // User declarations + bool FIsLogin, + FAutoLogin; + + String FUserName, + FPassword, + FConfirm, + FVerify; + + bool __fastcall CheckInput(const char * pText, int type); + + void __fastcall Layout(); + void __fastcall SetUserName(String Value); + void __fastcall SetPassWord(String Value); + void __fastcall SetConfirm(String Value); + void __fastcall SetVerify(String Value); + void __fastcall SetIsLogin(bool Value); + void __fastcall SetIsAntoLogin(bool Value); + +public: // User declarations + __fastcall TLoginForm(TComponent* Owner); + + void __fastcall OnCDTimer(int countDown); + + int isEmailOrMobile; // ֻ 1= 2=ֻ + +__published: + __property String UserName = {read = FUserName, write = SetUserName}; + __property String PassWord = {read = FPassword, write = SetPassWord}; + __property String Confirm = {read = FConfirm, write = SetConfirm}; + __property String Verify = {read = FVerify, write = SetVerify}; + __property bool IsLogin = {read = FIsLogin, write = SetIsLogin}; + __property bool IsAntoLogin = {read = FAutoLogin, write = SetIsAntoLogin}; +}; +//--------------------------------------------------------------------------- +extern PACKAGE TLoginForm *LoginForm; +//--------------------------------------------------------------------------- +#endif diff --git a/MainFormUnit.cpp b/MainFormUnit.cpp new file mode 100644 index 0000000..8b84490 --- /dev/null +++ b/MainFormUnit.cpp @@ -0,0 +1,6083 @@ +//--------------------------------------------------------------------------- +// +#include +#include +#pragma hdrstop + +#include "GlobalUnit.h" +#include "ContentPanelUnit.h" +#include "ToolpalPanel.h" +#include "UseStylePanel.h" +#include "PreStylePanel.h" +#include "AudStylePanel.h" +#include "ChordPanel.h" +#include "TrackPanel.h" +#include "PlayTimePanel.h" +#include "MainFormUnit.h" +#include "MessageFormUnit.h" +#include "ProgressFormUnit.h" +#include "CapButton.h" +#include "ImportFormUnit.h" +#include "SaveFormUnit.h" //add by lm 14.1.7 +#include "LoginFormUnit.h" //add by lm 14.1.17 +#include "ShowUserInfoPanel.h" //add by lm 14.1.17 +#include "AboutFormUnit.h" +#include "ManageSongFormUnit.h" +#include "UploadFormUnit.h" +#include "UpdateFormUnit.h" //add by laq 2014.1.22 +#include "ScoreFormUnit.h" +#include "PayMentFormUnit.h" +#include "PredefineProjectFormUnit.h" +#include "CustomerSettingFormUnit.h" +#include "SaveLocalStyleFormUnit.h" +#include "ImportSegmentFormUnit.h" +#include "StyleUploadFormUnit.h" +#include "StyleSpecsFormUnit.h" +#include "Undo.h" +#include "Project.h" +#include "SplashFormUnit.h" +#include "MidiTrack.h" +#include "VSTPathFormUnit.h" + +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma link "PNGButton" +#pragma link "ComboBoxComponent" +#pragma link "LineEdit" +#pragma link "TextButton" +#pragma resource "*.dfm" +TMainForm *MainForm; + +#define PANEL_BOUND 3 +#define CONTENT_MINWIDTH 515 +#define TOOLPAL_MINWIDTH 210 +#define TOOLPAL_MINHEIGHT 26 + +#define IDM_OPENPROJECT 0x100 + +//϶ر +TImage * w_imgDrag = NULL; //͸ͼƬ +bool w_bDraging = false; +int w_iDragMode = 0, + w_xImgDrag = 0, //͸ͼƬλ(screen) + w_yImgDrag = 0, + w_xOldDrag = 0, //ϴλ + w_yOldDrag = 0, + w_xOffDrag = 0, //Ͻľ + w_yOffDrag = 0; + +TCursor crBrush = 0x50, + crBrushAdd = 0x51, + crBrushNo = 0x52; + +int BREAK_LINE_Y = 35; +const COLORREF CLR_TOP = RGB( 74, 80, 88 ), + CLR_BOTTOM = RGB( 39, 42, 47 ), + CLR_BR_OUT = RGB( 106, 111, 117 ), + CLR_BR_IN = RGB( 44, 46, 48 ), + CLR_BR_FILL = RGB( 70, 73, 76 ); + +TUndoLite* u_pUploadLite = NULL; + +//ص +int CALLBACK FontEnumProc (const ENUMLOGFONTEX *lpelfe, const NEWTEXTMETRICEX *lpntme, unsigned long FontType, LPARAM lParam) +{ + if( FontType==TRUETYPE_FONTTYPE ){ + return 0; + } + + return 1; +} + +bool CheckFontYaHeiInstalled(String sFontName) +{ + // Get the screen DC + HDC hDC = GetDC(NULL); + LOGFONTW lf; + lf.lfCharSet = DEFAULT_CHARSET; + wcscpy(lf.lfFaceName, sFontName.w_str()); + // Enumerate fonts + return EnumFontFamiliesEx(hDC, &lf, (FONTENUMPROC)FontEnumProc, 0, 0); +} + +//--------------------------------------------------------------------------- +__fastcall TMainForm::TMainForm(TComponent* Owner) + : TForm(Owner) +{ + m_pMenuBar = NULL; + m_pMenu = m_pPopMenu = NULL; + m_HelpForm = NULL; + m_pVolumeForm = NULL; + m_pContentPanel = NULL; + m_pUseStylePanel = m_pAudStylePanel = m_pPreStylePanel + = m_pChordPanel = m_pTrackPanel = NULL; + m_ToolpalWidth = 263; + m_UseStyleHeight = TOOLPAL_MINHEIGHT; + m_PreStyleHeight = 206; + + m_bFromFile = false; + m_pNotificationGetTimer = NULL; + m_pNotificationForm = NULL; + + HintWindowClass = __classid(TSkinHintWindow); + + m_nVolLevel = 0; + + m_pCDTimer = NULL; +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::FormCreate(TObject *Sender) +{ + Screen->Cursor = crHourGlass; + + Randomize(); + DragAcceptFiles( Handle, true ); + + g_hProjectEvent = CreateEvent(NULL, FALSE, TRUE, NULL); + Color = CLR_TOP; + + //ȫʾ + Application->HintHidePause = 10000; + Screen->HintFont->Color = RGB( 213, 221, 232 ); + Screen->HintFont->Size = 10; + + //˵ʹ΢ź + String sMenuFont = "Microsoft YaHei UI"; + if( !CheckFontYaHeiInstalled(sMenuFont) ){ + Canvas->Font->Name = sMenuFont; + Canvas->Font->Size = g_szFont10; + } + else{ + Canvas->Font->Name = g_strTxtFontName; + Canvas->Font->Size = g_szFont9; + } + + CreateMenus(); + + BREAK_LINE_Y = MENUBAR_TOP * 2 + m_pMenuBar->GetHeight() + 1; + + m_lblLogon->Font->Color = CLR_TEXT_NOR; + m_lblLogon->Height = m_pMenuBar->GetHeight(); + + if( g_strProjectName.length()>0 ) + m_lblTitle->Caption = g_strProjectName.c_str(); + else + m_lblTitle->Caption = L"Untitle"; + + m_lblTitle->Font->Color = CLR_TEXT_HOT;//RGB( 218, 221, 232 ); + m_lblTitle->Left = MENUBAR_LEFT + m_pMenuBar->Width + OFFSET_BR*2; + m_lblTitle->Width = m_lblLogon->Left - OFFSET_BR*2 - m_lblTitle->Left; + m_lblTitle->Height = m_pMenuBar->GetHeight(); + + //ʱʾ + m_pPlayTimePanel = new TPlayTimePanel(this); + m_pPlayTimePanel->Parent = this; + m_pPlayTimePanel->OnClick = PlayTimeClick; + m_pPlayTimePanel->SetBounds( 150, 46, 80, 26 ); + + // ִļ汾Ϣ + DWORD dwHandle; + DWORD dwVerLen = GetFileVersionInfoSize(Application->ExeName.c_str(), &dwHandle); + if (dwVerLen) { + TCHAR *lpData = new TCHAR[dwVerLen]; + if (GetFileVersionInfo(Application->ExeName.c_str(), 0, dwVerLen, lpData)) { + PVSFixedFileInfo lpffi; + UINT uLen; + if (VerQueryValue(lpData, TEXT("\\"), (void **)&lpffi, &uLen)) { + g_infoSoftwareUpdate.version.majorVersion = + HIWORD(lpffi->dwFileVersionMS); + g_infoSoftwareUpdate.version.minorVersion = + LOWORD(lpffi->dwFileVersionMS); + g_infoSoftwareUpdate.version.modifyVersion = + HIWORD(lpffi->dwFileVersionLS); + g_infoSoftwareUpdate.version.buildVersion = + LOWORD(lpffi->dwFileVersionLS); + } + } + delete[]lpData; + } + + sprintf(g_strCurrentVersion, "%d.%d.%d.%d", + g_infoSoftwareUpdate.version.majorVersion, g_infoSoftwareUpdate.version.minorVersion, + g_infoSoftwareUpdate.version.modifyVersion, g_infoSoftwareUpdate.version.buildVersion); + + DebugPrint("汾%d.%d.%d.%d \n", + g_infoSoftwareUpdate.version.majorVersion, g_infoSoftwareUpdate.version.minorVersion, + g_infoSoftwareUpdate.version.modifyVersion, g_infoSoftwareUpdate.version.buildVersion); + + string strRoot = ((AnsiString)g_strUserPath.c_str()).c_str(); + + HRESULT hResult = f_CS_GetVersion(); + if( hResult!=CS_VERSION ){ + if( SOFTWARE_ID==e_Pro_Lite ) + MessageForm->ShowMessage("ʼʧ!", MB_ICONERROR | MB_OK); + else + MessageForm->ShowMessage("ʼʧ!", MB_ICONERROR | MB_OK); + PostMessage(Handle, WM_CLOSE, 0, 0); + return; + } + + SplashForm->ShowProgress( "ʼý......" ); + hResult = f_MM_GetVersion(); + if( hResult!=MM_VERSION || f_MM_InitialObjects(Handle, (char*)strRoot.c_str())!=S_OK ){ + MessageForm->ShowMessage("ʼýʧܣ", MB_ICONERROR | MB_OK); + PostMessage(Handle, WM_CLOSE, 0, 0); + return; + } + + GetInitVar(); + + InitSegmentColor(); + SetMelodyTS(g_iMelodyTimeSignature, true); + SetMelodyTempo(g_nMelodyTempo, true); + + SplashForm->ShowProgress( "ʼ豸......" ); + HRESULT res = f_MM_CheckIODevice( g_iPlaybackDevice, g_strPlaybackDevice, + g_iRecordDevice, g_strRecordDevice ); + if( !(res&0xFF) ) + g_iPlaybackOutput = -1; + + if( !(res&0xFF00) ) + g_iRecordInput = -1; + + res = f_MM_SetIODevice( g_iPlaybackDevice, g_iPlaybackOutput, g_iRecordDevice, g_iRecordInput ); + + if( res!=S_OK ){ + g_iPlaybackDevice = -1; + g_iPlaybackOutput = -1; + g_iRecordDevice = -1; + g_iRecordInput = -1; + g_strPlaybackDevice[0] = 0; + g_strRecordDevice[0] = 0; + + f_MM_SetIODevice( g_iPlaybackDevice, g_iPlaybackOutput, g_iRecordDevice, g_iRecordInput ); + f_MM_CheckIODevice( g_iPlaybackDevice, g_strPlaybackDevice, g_iRecordDevice, g_strRecordDevice ); + } + + f_MM_SetRecordAutoAdjust( g_bRecordAutoAdjust ); + + if( g_fSpeakerVolume<0 ) + g_fSpeakerVolume = f_MM_GetStreamVolume( 0 ) / 100.0; + else + f_MM_SetStreamVolume(0, g_fSpeakerVolume); + + if( g_fRecordVolume<0 ) + g_fRecordVolume = f_MM_GetStreamVolume( 1 ) / 100.0; + else + f_MM_SetStreamVolume( 1, g_fRecordVolume ); + + g_fSpeakerVolume_SVD = g_fSpeakerVolume; + g_fRecordVolume_SVD = g_fRecordVolume; + + m_cbKey->SetFont(g_strTxtFontName, g_szFont9);// >SetFontSize( g_szFont9 ); + m_cbKey->Left = m_pPlayTimePanel->Left + m_pPlayTimePanel->Width + OFFSET_BR * 3; + m_cbKey->Top = m_pPlayTimePanel->Top; + m_cbKey->AddItem( " C" ); + m_cbKey->AddItem( "bD" ); + m_cbKey->AddItem( " D" ); + m_cbKey->AddItem( "bE" ); + m_cbKey->AddItem( " E" ); + m_cbKey->AddItem( " F" ); + m_cbKey->AddItem( "#F" ); + m_cbKey->AddItem( " G" ); + m_cbKey->AddItem( "bA" ); + m_cbKey->AddItem( " A" ); + m_cbKey->AddItem( "bB" ); + m_cbKey->AddItem( " B" ); + m_cbKey->DefItemIndex = -1; + m_cbKey->Enabled = false; + + m_btnTS->SetFont(g_strTxtFontName, g_szFont9); + m_btnTS->Left = m_cbKey->Left + m_cbKey->Width + OFFSET_BR; + m_btnTS->Top = m_pPlayTimePanel->Top; + m_btnTS->Caption = g_strTimeSignature[g_iMelodyTimeSignature]; + + m_btnTempo->SetFont(g_strTxtFontName, g_szFont9); + m_btnTempo->Left = m_btnTS->Left + m_btnTS->Width + OFFSET_BR; + m_btnTempo->Top = m_pPlayTimePanel->Top; + m_btnTempo->Caption = IntToStr(g_nMelodyTempo); + + m_cbPreStage->SetFont(g_strTxtFontName, g_szFont9);//SetFontSize( g_szFont9 ); + m_cbPreStage->Top = m_pPlayTimePanel->Top; + m_cbPreStage->Left = m_btnTempo->Left + m_btnTempo->Width + OFFSET_BR; + m_cbPreStage->AddItem( "ʼ" ); + m_cbPreStage->AddItem( "I M E" ); + m_cbPreStage->AddItem( "I M I M E" ); + m_cbPreStage->AddItem( "Զ" ); + m_cbPreStage->DefItemIndex = g_iPreStage; + + SplashForm->ShowProgress( "ɨSFɫ......" ); + InitFontList(); + + if( g_lstFonts.empty() ){ + MessageForm->ShowMessage("ʼɫʧܣ", MB_ICONERROR | MB_OK); + PostMessage(Handle, WM_CLOSE, 0, 0); + return; + } + else{ + SetSelectFont(); + strcpy( g_strSoundFont_SVD, g_strSoundFont ); //ȫɫ(ѱ) + + //ɫб + int iSelFont = -1; + for( int i=0; inInstCount>0 && pFont->nDrumCount>0 ){ + if( i==g_idFont ) + iSelFont = m_cbFontSelect->ItemsCount; + + TComboBoxItem* pItem = m_cbFontSelect->AddItem( g_lstFonts[i]->strFontName ); + pItem->Tag = i; + } + } + + m_cbFontSelect->SetFont(g_strTxtFontName, g_szFont9); + m_cbFontSelect->DefItemIndex = iSelFont; + m_cbFontSelect->Enabled = !g_bExtFont; + m_btnExtFontOn->Visible = g_bExtFontUsable && g_bExtFont; + m_btnExtFontOff->Visible = g_bExtFontUsable && !g_bExtFont; + m_lblExtFont->Visible = !g_bExtFontUsable; + } + + SplashForm->ShowProgress( "ʼ......" ); + + //ʼ +// strcpy( g_strServerURL, "new.ichangzuo.com" ); +// strcpy( g_strServerURL, "www.ichangzuo.com" ); +// strcpy( g_strServerURL, "LocalHost" ); +// strcpy( g_strServerURL, "47.98.232.209" ); +// strcpy( g_strServerURL, "192.168.5.80" ); + + char* idDevice = GetMacAdress(); + DebugPrint("MAC: %02X-%02X-%02X-%02X-%02X-%02X", (UCHAR)idDevice[0],(UCHAR)idDevice[1],(UCHAR)idDevice[2] + ,(UCHAR)idDevice[3],(UCHAR)idDevice[4],(UCHAR)idDevice[5] ); + + int ret_CS = f_CS_InitialService( Handle, SOFTWARE_ID, &g_infoSoftwareUpdate, g_strServerURL, + (char*)strRoot.c_str(), idDevice ); + if( ret_CS==-1 ){ + MessageForm->ShowMessage("ʼʧ!", MB_ICONERROR | MB_OK); + PostMessage(Handle, WM_CLOSE, 0, 0); + return; + } + else if( ret_CS==S_FALSE ) { + m_lblLogon->Visible = false; + g_bUpdateMandatory = true; + + if( SOFTWARE_ID!=e_Pro_Lite ){ + MessageForm->ShowMessage("ʧ!\n(޷ز)", + MB_ICONERROR | MB_OK); + } + } + else { + g_bAutoLogin = GetAutoLogin(g_infoUser.strUserName, g_infoUser.strPassword); + + if (g_bAutoLogin) { + m_lblLogon->Caption = L"ڵ¼..."; + m_lblLogon->Tag = 1; + m_lblLogon->Hint = L"ȡ¼"; + f_CS_Login(&g_infoUser, false); + } + + f_CS_AutoDownloadStyle( g_bAutoDownloadStyle ); + } + + SplashForm->ShowProgress( "ʼ......" ); + + // + m_pContentPanel = new TContentPanel(this); + m_pContentPanel->Parent = this; + m_pContentPanel->OnMouseMove = PanelMouseMove; + m_pContentPanel->OnMouseUp = PanelMouseUp; + m_pContentPanel->SetBounds( PANEL_BOUND, + PANEL_TOP, + Width - m_ToolpalWidth - PANEL_BOUND * 2, + Height - PANEL_TOP - STATE_HEIGHT); + m_pContentPanel->Show() ; + + // + TStylePanel::LoadImages(); + + m_pAudStylePanel = new TAudStylePanel(this); + m_pAudStylePanel->Parent = this; + m_pAudStylePanel->OnMouseMove = PanelMouseMove; + m_pAudStylePanel->OnMouseUp = PanelMouseUp; + m_pAudStylePanel->SetBounds( m_pContentPanel->Width + PANEL_BOUND, + m_pContentPanel->Top + m_UseStyleHeight + m_PreStyleHeight, + m_ToolpalWidth, + m_pContentPanel->Height - m_UseStyleHeight + - m_PreStyleHeight ); + + m_pPreStylePanel = new TPreStylePanel(this); + m_pPreStylePanel->Parent = this; + m_pPreStylePanel->OnMouseMove = PanelMouseMove; + m_pPreStylePanel->OnMouseUp = PanelMouseUp; + m_pPreStylePanel->SetBounds( m_pAudStylePanel->Left, + m_pContentPanel->Top + m_UseStyleHeight, + m_ToolpalWidth, + m_PreStyleHeight ); + + m_pUseStylePanel = new TUseStylePanel(this); + m_pUseStylePanel->Parent = this; + m_pUseStylePanel->OnMouseMove = PanelMouseMove; + m_pUseStylePanel->OnMouseUp = PanelMouseUp; + m_pUseStylePanel->SetBounds( m_pAudStylePanel->Left, + m_pContentPanel->Top, + m_ToolpalWidth, + m_UseStyleHeight ); + + m_pAudStylePanel->Show(); + m_pPreStylePanel->Show(); + m_pUseStylePanel->Show(); + + // + m_pChordPanel = new TChordPanel(this); + m_pChordPanel->Parent = this; + m_pChordPanel->OnMouseMove = PanelMouseMove; + m_pChordPanel->OnMouseUp = PanelMouseUp; + m_pChordPanel->SetBounds( m_pContentPanel->Width + PANEL_BOUND, + m_pContentPanel->Top, + m_ToolpalWidth, + m_pContentPanel->Height ); + + // + m_pTrackPanel = new TTrackPanel(this); + m_pTrackPanel->Parent = this; + m_pTrackPanel->OnMouseMove = PanelMouseMove; + m_pTrackPanel->OnMouseUp = PanelMouseUp; + m_pTrackPanel->SetBounds( m_pContentPanel->Width + PANEL_BOUND, + m_pContentPanel->Top, + m_ToolpalWidth, + m_pContentPanel->Height ); + + m_pContentPanel->SetStylePanel( m_pUseStylePanel ); + m_pContentPanel->SetChordPanel( m_pChordPanel ); + m_pContentPanel->SetTrackPanel( m_pTrackPanel ); + + ((TUseStylePanel*)m_pUseStylePanel)->SetContentPanel( m_pContentPanel ); + ((TChordPanel*)m_pChordPanel)->SetContentPanel( m_pContentPanel ); + ((TTrackPanel*)m_pTrackPanel)->SetContentPanel( m_pContentPanel ); + + m_pPopMenu = new TMenuPanel(this); + m_pPopMenu->Parent = this; + m_pContentPanel->SetPopMenu( m_pPopMenu ); + TToolpalPanel::SetPopMenu( m_pPopMenu ); + + //ģ + m_KeyBoard = new TKeyBoard(this); + m_KeyBoard->Visible = false; + m_KeyBoard->Parent = this; + m_KeyBoard->Left = m_panelVolLevel->Left + 195; + m_KeyBoard->Top = m_btnKeyboard->Top - 145; + + f_MM_ActiveAPR( false ); + + Screen->Cursors[crBrush] = LoadCursor(HInstance, L"CursorBrush"); + Screen->Cursors[crBrushAdd] = LoadCursor(HInstance, L"CursorBrushAdd"); + Screen->Cursors[crBrushNo] = LoadCursor(HInstance, L"CursorBrushNo"); + +// m_pNotificationGetTimer = new TTimer(this); //add by tj 2014/04/18 +// m_pNotificationGetTimer->Interval = NOTIFICATION_GETNOTI_PERIOD; +// m_pNotificationGetTimer->OnTimer = NotificationTimerProc; +// m_pNotificationGetTimer->Enabled = true; + + WindowState = g_iWindowState; + SetTransparent( this ); + + if( g_iToolPanelShow!=0 ){ + int iTPS = g_iToolPanelShow; + g_iToolPanelShow = 0; + ShowToolPanels( iTPS ); + } + else if( WindowState==wsNormal ) + ViewLayout(); + + g_strAutoProjName = g_strUserPath; + g_strAutoProjName += _T(AUTOSAVE_FILENAME); + + bool bWaitScanVST = false; + CheckVSTScanReg(); + if( !g_strVSTPath.empty() || !g_strVSTiPath.empty() ){ + SplashForm->ShowProgress( "ɨVST......" ); + InitVSTList(); + } + else if( g_bShowVSTPath ){ + bWaitScanVST = true; + PostMessage(Handle, UM_VSTPATH, 1, 0); + } + + UnicodeString strParam = ParamStr(1); + if( !strParam.IsEmpty() ){ + m_strLoadProjectName = strParam.c_str(); + + if( !bWaitScanVST ) + PostMessage(Handle, UM_LOADPROJECT, 0, 0); + + SetAutoSaveReg( false ); + } + else if( g_bAutoSave ){ + if( !bWaitScanVST ) + PostMessage(Handle, UM_OPENAUTOPROJ, 0, 0); + } + else if( g_bAutoOpenProject && g_bAutoOpenProjectEnable ){ + DisableAutoOpen(); + + String fileName = g_lstRecentProject.begin()->c_str(); + if( FileExists(fileName) ){ + m_strLoadProjectName = fileName; + if( !bWaitScanVST ) + PostMessage(Handle, UM_LOADPROJECT, 0, 0); + } + else{ + g_lstRecentProject.erase( g_lstRecentProject.begin() ); + PostMessage(Handle, UM_NEWPROJECT, 0, 0); + } + } + else{ + PostMessage(Handle, UM_NEWPROJECT, 0, 0); + } + + Screen->Cursor = crDefault; +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::OnViewMode(TObject *Sender) +{ + int index = (int)Sender; + + if( index==3 ){ + m_pContentPanel->SetScrollMode( !m_pContentPanel->IsVertical() ); + + if( m_pContentPanel->IsVertical() ) + ViewLayout(); + } + else{ + SetMode( index+1 ); + + if( g_iToolPanelShow & 0x02 ){ + ShowToolPanels( g_iToolPanelShow & 0x01 ); + } + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::UMSetViewMode(TMessage &Message) +{ + int index = Message.WParam; + + SetMode( index ); +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::SetMode( int iMode, bool bForce ) +{ + if( m_btnRecord->Down ) + return; + + if( g_Theme.Empty() )// g_lstRawBars.size()==0 ) + iMode = VIEW_INIT; + + if( !bForce && g_iViewMode==iMode ) + return; + + g_iViewMode = iMode; + + m_pContentPanel->SetMode( iMode ); + + if( iMode==VIEW_INIT ){ + g_bPredefine = false; + g_bMidiMelody = false; + g_bComposeMute = false; + + m_iStartBar = m_iLastStartBar = 0; + m_dblStartPoint = m_dblLastStartPoint = 0; + m_dwLastVol = 0; + m_pContentPanel->InitialVars( true ); + //m_pContentPanel->SetScrollMode( true ); + //m_pContentPanel->SetPlayPoint( 0, 0 ); + ShowPlayTime(); + + m_tabStyle->Down = true; + m_tabStyle->BringToFront(); + m_tabChord->Down = false; + m_tabAudio->Down = false; + m_tabAudio->SendToBack(); + + g_iMelodyKey = -1; + m_cbKey->DefItemIndex = -1; + m_cbKey->Enabled = false; + + if( !g_pPreStyle ) + ((TStylePanel*)m_pPreStylePanel)->InitItems(); + ((TUseStylePanel*)m_pUseStylePanel)->InitOpus( NULL, -1 ); + + if( g_Undo.GetUndoType()<0 ){ + //add by tj 2014/05/15 + if( (0<=g_iPreStageDefault) && (g_iPreStageDefault<=2) ){ + m_cbPreStage->DefItemIndex = g_iPreStage = g_iPreStageDefault; + }else{ + g_iPreStage = g_iPreStageDefault = 2; + } + } + + m_PreStyleHeight = m_PreStyleHeight + m_UseStyleHeight - TOOLPAL_MINHEIGHT; + m_UseStyleHeight = TOOLPAL_MINHEIGHT; + + m_pUseStylePanel->SetBounds( m_pUseStylePanel->Left, + PANEL_TOP, + m_ToolpalWidth, + m_UseStyleHeight ); + + m_pPreStylePanel->SetBounds( m_pUseStylePanel->Left, + m_pUseStylePanel->Top + m_UseStyleHeight, + m_ToolpalWidth, + m_PreStyleHeight ); + + m_btnPlay->Enabled = false; + m_btnSave->Enabled = false; + m_btnUpload->Enabled = false; + m_tabChord->Enabled = false; + m_tabAudio->Enabled = false; + + m_pContentPanel->SetFocus(); + } + else{ + m_tabChord->Enabled = true; + m_tabAudio->Enabled = true; + + if( iMode==VIEW_TRACK ){ + m_tabStyle->Down = false; + m_tabChord->Down = false; + m_tabChord->SendToBack(); + m_tabAudio->Down = true; + m_tabAudio->BringToFront(); + } + else if( iMode==VIEW_CHORD ){ + g_iSelAudio = -1; + m_tabStyle->Down = false; + m_tabChord->Down = true; + m_tabChord->BringToFront(); + m_tabAudio->Down = false; + m_tabAudio->SendToBack(); + } + else if( iMode==VIEW_STYLE ){ + g_iSelAudio = -1; + m_tabStyle->Down = true; + m_tabStyle->BringToFront(); + m_tabChord->Down = false; + m_tabAudio->Down = false; + m_tabAudio->SendToBack(); + } + } + + m_btnRecord->Enabled = RecordEnabled(); + + if( g_iToolPanelShow<2 ){ + m_pUseStylePanel->Visible = iMode==VIEW_STYLE || iMode==VIEW_INIT; + m_pPreStylePanel->Visible = iMode==VIEW_STYLE || iMode==VIEW_INIT; + m_pAudStylePanel->Visible = iMode==VIEW_STYLE || iMode==VIEW_INIT; + + m_pChordPanel->Visible = iMode==VIEW_CHORD; + m_pTrackPanel->Visible = iMode==VIEW_TRACK; +// if( iMode==VIEW_TRACK ) +// ((TTrackPanel*)m_pTrackPanel)->ResetSelPos(); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::CreateMenus() +{ + m_pMenuBar = new TMenuBar( this,Canvas ); + + m_pMenuBar->AddMenu( "ļ", "F", MENU_FILE ); + m_pMenuBar->AddMenu( "༭", "E", MENU_EDIT ); + m_pMenuBar->AddMenu( "ͼ", "V", MENU_VIEW ); + m_pMenuBar->AddMenu( "", "K", MENU_TRACK ); + m_pMenuBar->AddMenu( "", "T", MENU_TOOL ); + m_pMenuBar->AddMenu( "", "H", MENU_HELP ); + + TMenuPanel::LoadResources(); +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::OnShowMenu(TMessage &msg) +{ + int iType = msg.WParamLo; + bool bShow = msg.WParamHi; + int left = msg.LParamLo; + int top = msg.LParamHi; + + if( m_pMenu && ( !bShow && ( m_pMenu->Type==iType ) + || bShow && m_pMenu->Type!=iType )){ + m_pMenu->Hide(); + delete m_pMenu; + m_pMenu = NULL; + } + + if( bShow && !m_pMenu ){ + m_pMenu = new TMenuPanel( this, iType ); + m_pMenu->Parent = this; + + if( iType==MENU_FILE ){ //ļ˵ + CMenuItem* pMenuItem = m_pMenu->CreateMenu( "½" ); + pMenuItem->Enabled = !m_btnRecord->Down; + if( pMenuItem->Enabled ){ + pMenuItem->AppendMenu( "հ׹", "F5", OnCreateNewProject ); + pMenuItem->AppendMenu( "...", "F12", OnLoadMelody ); + pMenuItem->AppendMenu( "Ԥ幤...", "", OnPredefineProject ); + } + + pMenuItem = m_pMenu->CreateMenu( "򿪹...", "F2", OnLoadProject, IDM_OPENPROJECT-1 ); + pMenuItem->Enabled = !m_btnRecord->Down; + //index = m_pMenu->CreateMenuItem("򿪹...", "F2", OnLoadProject, IDM_OPENPROJECT-1 ); + //m_pMenu->EnabledMenuItem(index, !m_btnRecord->Down); + + pMenuItem = m_pMenu->CreateMenu( "" ); + pMenuItem->Enabled = !g_lstRecentProject.empty() && !m_btnRecord->Down; + if( pMenuItem->Enabled ){ + for (int i = 0; i < g_lstRecentProject.size(); i++) { + String strText = g_lstRecentProject[i].c_str(); + pMenuItem->AppendMenu( strText, "", OnLoadProject, IDM_OPENPROJECT+i ); + } + } + + pMenuItem = m_pMenu->CreateMenu( "湤", "F3", OnSaveProject ); + pMenuItem->Enabled = HasProjectModified() && !m_btnRecord->Down; + + pMenuItem = m_pMenu->CreateMenu( "Ϊ...", "F4", OnSaveAs ); + pMenuItem->Enabled = g_lstOpusStages.size()>0 && !m_btnRecord->Down; + + m_pMenu->CreateMenu( "-" ); + m_pMenu->CreateMenu( "˳", "", CloseClick ); + } + else if( iType==MENU_EDIT ){ //༭˵ + String strText = " "; + int iOp = g_Undo.GetUndoType(), + iT1 = ( iOp>>4 ), + iT2 = ( iOp & 0x0F ); + + if( iOp>=0 ) + strText += g_strUndoType[iT1][iT2]; + + CMenuItem* pMenuItem = m_pMenu->CreateMenu( strText, "Ctrl+Z", OnUndo ); + pMenuItem->Enabled = iOp>=0 && !m_btnRecord->Down; + + strText = " "; + iOp = g_Undo.GetRedoType(); + iT1 = ( iOp>>4 ); + iT2 = ( iOp & 0x0F ); + + if( iOp>=0 ) + strText += g_strUndoType[iT1][iT2]; + + pMenuItem = m_pMenu->CreateMenu( strText, "Ctrl+Shift+Z", OnRedo ); + pMenuItem->Enabled = iOp>=0 && !m_btnRecord->Down; + + if( m_pContentPanel ) + m_pContentPanel->CreateEditMenu(m_pMenu, !m_btnRecord->Down); + } + else if( iType==MENU_VIEW ){ //ͼ˵ + CMenuItem* pMenuItem = m_pMenu->CreateMenu( "", "F9", OnViewMode, 0 ); + pMenuItem->Enabled = !g_Theme.Empty() && !m_btnRecord->Down; + + pMenuItem = m_pMenu->CreateMenu( "", "F10", OnViewMode, 1 ); + pMenuItem->Enabled = !g_Theme.Empty() && !m_btnRecord->Down; + + pMenuItem = m_pMenu->CreateMenu( "", "F11", OnViewMode, 2 ); + pMenuItem->Enabled = !m_btnRecord->Down; + + m_pMenu->CreateMenu("-"); + + String strText = m_pContentPanel->IsVertical() ? "ʾMIDI()" + : "ʾMIDI()"; + pMenuItem = m_pMenu->CreateMenu( strText, "Ctrl+Tab", OnViewMode, 3 ); + pMenuItem->Enabled = !m_btnRecord->Down && g_iViewMode!=VIEW_INIT; + + m_pMenu->CreateMenu("-"); + + if( g_iToolPanelShow & 0x2 ){ + m_pMenu->CreateMenu( "ʾ", "", OnShowToolPanels ); + } + else{ + m_pMenu->CreateMenu( "ع", "", OnShowToolPanels ); + if( g_iToolPanelShow==0 ) + m_pMenu->CreateMenu( "ʾ", "", OnShowToolPanels, 0 ); + else + m_pMenu->CreateMenu( "ұʾ", "", OnShowToolPanels, 0 ); + } + } + else if( iType==MENU_TRACK ){ + if(m_pContentPanel != NULL){ + m_pContentPanel->CreateTrackMenu(m_pMenu, !m_btnRecord->Down); + } + } + else if( iType==MENU_TOOL ){ //߲˵ + m_pMenu->CreateMenu( "ģ", "F6", OnKeyBoard); + m_pMenu->CreateMenu( "", "F7", VolSetClick); + + CMenuItem* pMenuItem = m_pMenu->CreateMenu( "Ƶ豸...", "F8", OnMicSetting ); + pMenuItem->Enabled = !m_btnRecord->Down; + + m_pMenu->CreateMenu("-"); + m_pMenu->CreateMenu("ƫ...","",OnCustomerSetting); + m_pMenu->CreateMenu("VST·...","",OnVSTPathSetting); + } + else if( iType==MENU_HELP ){ //˵ + m_pMenu->CreateMenu("", "F1", OnUserHelp); + m_pMenu->CreateMenu("ûֲ", "", OnUserManual); + m_pMenu->CreateMenu("...", "", OnShowMore); +// m_pMenu->CreateMenu("̬", "", OnNotification); + m_pMenu->CreateMenu("-"); + m_pMenu->CreateMenu("...", "", OnAbout); + } + + m_pMenu->Show( left, top ); + } +} +// --------------------------------------------------------------------------- +/* +void __fastcall TMainForm::OnMenuCall(TMessage &msg) +{ + m_pMenuBar->Reset(); + + TNotifyEvent* CallProc = (TNotifyEvent*)msg.LParam; + (*CallProc)( (TObject*)msg.WParam ); +} +// --------------------------------------------------------------------------- +*/ +void __fastcall TMainForm::OnMenuClose(TMessage & Msg) +{ + if( m_pMenuBar ) + m_pMenuBar->Reset(); +} +// --------------------------------------------------------------------------- + +void __fastcall TMainForm::FormResize(TObject *Sender) +{ + switch (WindowState) { + case wsMaximized: + case wsNormal: { + Canvas->Lock(); + + m_btnClose->Left = Width - 12 - m_btnClose->Width; + m_btnMax->Left = m_btnClose->Left - 27; + m_btnRest->Left = m_btnClose->Left - 27; + m_btnMin->Left = m_btnMax->Left - 27; + + m_lblLogon->Left = m_btnMin->Left - OFFSET_BR*2 - m_lblLogon->Width - 21; + m_pbUserNoticeNum->Left = m_lblLogon->Left + m_lblLogon->Width; + + if(m_pMenuBar) + m_lblTitle->Left = MENUBAR_LEFT + m_pMenuBar->Width + OFFSET_BR*2; + m_lblTitle->Width = m_lblLogon->Left - m_lblTitle->Left; + m_lblWebsite->Left = Width - m_lblWebsite->Width - 14; + + m_btnVolSet->Top = Height - STATE_HEIGHT + 2; + m_panelVolLevel->Top = Height - STATE_HEIGHT + 3; + m_cbFontSelect->Top = Height - STATE_HEIGHT + 2; + m_btnKeyboard->Top = Height - STATE_HEIGHT - 2; + m_btnExtFontOn->Top = m_btnKeyboard->Top + 3; + m_btnExtFontOff->Top = m_btnExtFontOn->Top; + m_lblExtFont->Top = m_btnExtFontOn->Top + 5; + m_lblWebsite->Top = m_lblExtFont->Top + 6; + + if(m_KeyBoard) + m_KeyBoard->Top = m_btnKeyboard->Top - 145; + + if (WindowState == wsMaximized) { + Align = alClient; + m_btnMax->Visible = false; + m_btnRest->Visible = true; + } + else { + Align = alNone; + m_btnMax->Visible = true; + m_btnRest->Visible = false; + } + + if(m_pContentPanel) + ViewLayout(); + + Canvas->Unlock(); + + Invalidate(); + } + + break; + + default: + break; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::ViewLayout() +{ + bool bVertical = m_pContentPanel->IsVertical(); + int wContent = Width - m_ToolpalWidth - PANEL_BOUND * 2 - 10, + hContent = Height - PANEL_TOP - STATE_HEIGHT, + offset = bVertical && m_pContentPanel->GetBarNum()>0 ? wContent % POINTS_PER_BAR : 0, + lContent = PANEL_BOUND, + lToolPanel = PANEL_BOUND; + + if( offset > (POINTS_PER_BAR>>1) && (m_ToolpalWidth-offset)>=TOOLPAL_MINWIDTH ){ + wContent += POINTS_PER_BAR - offset; + m_ToolpalWidth -= POINTS_PER_BAR - offset; + } + else{ + wContent -= offset; + m_ToolpalWidth += offset; + } + + wContent += 10; + + int wRealContent = wContent; + if( g_iToolPanelShow & 0x02 ){ + wRealContent += m_ToolpalWidth; + } + else{ + if( g_iToolPanelShow & 0x01 ){ + lContent = m_ToolpalWidth + PANEL_BOUND; + m_tabStyle->Left = PANEL_BOUND + 7; + m_tabChord->Left = m_tabStyle->Left + 41; + m_tabAudio->Left = m_tabChord->Left + 41; + + } + else{ + lToolPanel = wContent + PANEL_BOUND; + m_tabStyle->Left = Width-144; + m_tabChord->Left = m_tabStyle->Left + 41; + m_tabAudio->Left = m_tabChord->Left + 41; + } + + m_pChordPanel->SetBounds( lToolPanel, + PANEL_TOP, + m_ToolpalWidth, + hContent ); + + m_pTrackPanel->SetBounds( lToolPanel, + PANEL_TOP, + m_ToolpalWidth, + hContent ); + + int hAud = hContent - m_UseStyleHeight - m_PreStyleHeight; + if( hAudSetBounds( lToolPanel, + PANEL_TOP, + m_ToolpalWidth, + m_UseStyleHeight ); + + m_pPreStylePanel->SetBounds( lToolPanel, + m_pUseStylePanel->Top + m_UseStyleHeight, + m_ToolpalWidth, + m_PreStyleHeight ); + + m_pAudStylePanel->SetBounds( lToolPanel, + m_pPreStylePanel->Top + m_PreStyleHeight, + m_ToolpalWidth, + hContent - m_UseStyleHeight - m_PreStyleHeight ); + } + + m_pContentPanel->SetBounds( lContent, + PANEL_TOP, + wRealContent, + hContent ); + + m_btnRecord->Left = lContent + 25; + m_btnPlay->Left = m_btnRecord->Left + 40; + m_btnPause->Left = m_btnPlay->Left; + m_btnStop->Left = m_btnPlay->Left + 40; + m_pPlayTimePanel->Left = m_btnStop->Left + 42; + m_cbKey->Left = m_btnStop->Left + 130; + m_btnTS->Left = m_cbKey->Left + m_cbKey->Width; + m_btnTempo->Left = m_btnTS->Left + m_btnTS->Width; + m_cbPreStage->Left = m_btnTempo->Left + m_btnTempo->Width; + + m_btnUpload->Left = lContent + wContent - m_btnUpload->Width - 4;//m_btnSave->Left + 43; + m_btnSave->Left = m_btnUpload->Left - 43; + m_btnOpen->Left = m_btnSave->Left - 43; +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::CloseClick(TObject *Sender) +{ + Close(); +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::FormCloseQuery(TObject *Sender, bool &CanClose) +{ + if( m_pPreStylePanel && ((TPreStylePanel*)m_pPreStylePanel)->CheckModified() ){ + int mrRet = MessageForm->ShowMessage("Ƿ񱣴Ԥ񵽱أ", + MB_ICONQUESTION | MB_YESNOCANCEL); + + if( mrRet==mrYes ){ + Perform( UM_SAVELOCALSTYLE, 0, 0 ); + } + else if( mrRet==mrCancel ){ + CanClose = false; + return; + } + } + + if( HasProjectModified() && g_lstOpusStages.size()>0 ) { + int mrRet = MessageForm->ShowMessage("Ƿ񱣴浱ǰ̣", + MB_ICONQUESTION | MB_YESNOCANCEL); + if (mrRet == mrYes) { + DebugPrint("ȷϱ"); + OnSaveProject(NULL); + } + else if (mrRet == mrCancel) { + CanClose = false; + } + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::FormClose(TObject *Sender, TCloseAction &Action) +{ + ClearCDTimer(); + + if( g_bLogon ){ + f_CS_Logoff(); + } + + if( m_pPopMenu ){ + m_pPopMenu->Hide(); + m_pPopMenu->Parent = NULL; + delete m_pPopMenu; + m_pPopMenu = NULL; + } + + if( m_pContentPanel ){ + StopClick(NULL); + SetInitVar(true); + } + + if( m_pNotificationGetTimer ){ + delete m_pNotificationGetTimer; + m_pNotificationGetTimer = NULL; + } + if( m_pNotificationForm ) { + delete m_pNotificationForm; + m_pNotificationForm = NULL; + } + +//// Զ ////////// + ClearAutoProj(); +///////////////////////// + + if( m_pContentPanel ){ + delete m_pContentPanel; + m_pContentPanel = NULL; + } + + if (m_pMenuBar){ + delete m_pMenuBar; + m_pMenuBar = NULL; + } + TMenuPanel::FreeResources(); + + if( m_pUseStylePanel ){ + delete m_pUseStylePanel; + m_pUseStylePanel = NULL; + } + + if( m_pPreStylePanel ){ + delete m_pPreStylePanel; + m_pPreStylePanel = NULL; + } + + if( m_pAudStylePanel ){ + delete m_pAudStylePanel; + m_pAudStylePanel = NULL; + } + + if( m_pChordPanel ){ + delete m_pChordPanel; + m_pChordPanel = NULL; + } + + if( m_pTrackPanel ){ + delete m_pTrackPanel; + m_pTrackPanel = NULL; + } + + TStylePanel::FreeImages(); + + HRESULT hr; + + if (f_CS_DestroyService) { + if (FAILED(hr = f_CS_DestroyService())) { + DebugPrint("Destroy client service failed! code=%x\n", hr); + } + } + + if (f_MM_DestroyObjects) { + if (FAILED(hr = f_MM_DestroyObjects())) { + DebugPrint("Destroy media module Failed! code=%x\n", hr); + } + } + + if (f_CM_Release) { + if (FAILED(hr = f_CM_Release())) { + DebugPrint("Relase compose module failed! code=%x\n", hr); + } + } + + if( m_HelpForm ){ + delete m_HelpForm; + m_HelpForm = NULL; + } + + ClearFontList(); + ClearVSTList(); + ClearStyleList(); + + CloseHandle(g_hProjectEvent); + + for(int i=0; iHitTest(Msg.XPos-Left, Msg.YPos-Top)){ + if( Msg.YPosLeft + && Msg.XPos > Left + m_pMenuBar->Width + OFFSET_BR + 3 ) + Msg.Result = HTCAPTION; + } +} +// --------------------------------------------------------------------------- + +void __fastcall TMainForm::WMNCLButtonDown(TWMNCLButtonDown &Msg) +{ + if (Msg.HitTest == HTCAPTION ) { + m_pMenuBar->HitTest( Msg.XCursor-Left, Msg.YCursor-Top, true ); + } + + TForm::Dispatch(&Msg); +} +// --------------------------------------------------------------------------- + +void __fastcall TMainForm::WMNCRButtonDown(TWMNCRButtonDown &Msg) +{ + if (Msg.HitTest == HTCAPTION ) { + m_pMenuBar->HitTest( Msg.XCursor-Left, Msg.YCursor-Top, true ); + } + +// TForm::Dispatch(&Msg); +} +// --------------------------------------------------------------------------- + +void __fastcall TMainForm::WMWindowPosChanged(TWMWindowPosChanged &Msg) +{ + if( m_HelpForm ){ + if( m_HelpForm->Window_state==HLP_WINDOW_MIN ){ + m_HelpForm->Left = Msg.WindowPos->x + Msg.WindowPos->cx - 160; + m_HelpForm->Top = Msg.WindowPos->y + Msg.WindowPos->cy - 34; + } + else if( m_HelpForm->Window_state==HLP_WINDOW_MAX ){ + m_HelpForm->SetBounds( Msg.WindowPos->x, + Msg.WindowPos->y + STATE_HEIGHT, + Msg.WindowPos->cx, + Msg.WindowPos->cy - STATE_HEIGHT ); + } + } + + TForm::Dispatch(&Msg); +} +// --------------------------------------------------------------------------- + +void __fastcall TMainForm::WMNCLButtonDblClk(TWMNCLButtonDblClk &Msg) +{ + if (Msg.HitTest == HTCAPTION ) { + if (WindowState == wsNormal) { + WindowState = wsMaximized; + } + else + WindowState = wsNormal; + + g_iWindowState = WindowState; + } +} +// --------------------------------------------------------------------------- + +void __fastcall TMainForm::OnRestoreWindow(TMessage &msg) +{ + if (WindowState == wsMinimized) { + WindowState = g_iWindowState; + } + + FormStyle = fsStayOnTop; + Application->BringToFront(); + FormStyle = fsNormal; +} +// --------------------------------------------------------------------------- + +void __fastcall TMainForm::OnNetworkError(TMessage &msg) +{ + WORD eMessage = HIWORD(msg.WParam); + WORD eExtra = LOWORD(msg.WParam); + + DebugPrint("ʴϢţ%dţ0x%X\n", eMessage, eExtra); +} +// --------------------------------------------------------------------------- + +void __fastcall TMainForm::OnNetworkMessage(TMessage &msg) +{ + WORD eMessage = HIWORD(msg.WParam); + WORD eExtra = LOWORD(msg.WParam); + + if(eMessage == e_loginResponse){ + if(eExtra == 0){ + DebugPrint( + "ûϢ\nID=%d\n dz: %s\n˻%d\nȨޣ0x%X\nѹ%d\nͷ: %s\nVIP: %d\n", + g_infoUser.accountInfo.ID, + g_infoUser.strNickName, + g_infoUser.accountInfo.balance, +// g_infoUser.accountInfo.pops, +// g_infoUser.accountInfo.fans, +// g_infoUser.accountInfo.songs, + g_infoUser.accountInfo.authority, + g_infoUser.ownStyleNum, + g_infoUser.strIconFile, + g_infoUser.accountInfo.vipPeriod); + + m_lblLogon->Caption = String(g_infoUser.strNickName); + m_lblLogon->Tag = 2; // ¼ɹ + m_lblLogon->Hint = String(g_infoUser.strNickName); + + g_bLogon = true; + + // ʾ + int nUser = f_CS_GetNewNoticeNum( g_infoUser.accountInfo.ID ); + int nPublic = f_CS_GetNewNoticeNum( 0 ); + + if(nUser > 0 || nPublic > 0) { + if(!m_pbUserNoticeNum->Visible) + m_pbUserNoticeNum->Visible = true; + + m_pbUserNoticeNum->Tag = nUser + nPublic; + m_pbUserNoticeNum->Refresh(); + + String strNoticeHint = " "; + if( nPublic>0 ){ + strNoticeHint += nPublic; + strNoticeHint += " վ¹"; + if( nUser>0 ){ + strNoticeHint += "\n "; + } + } + + if( nUser>0 ){ + strNoticeHint += nUser; + strNoticeHint += " δϢ\n鿴"; + } + + m_pbUserNoticeNum->Hint = strNoticeHint; + } + else { + if(m_pbUserNoticeNum->Visible) + m_pbUserNoticeNum->Visible = false; + } + +// if( m_HelpForm ){ + // m_HelpForm->SetNoticeNum( noticeNum, 0 ); +// m_HelpForm->SetNoticeNum( zoneNum, 1 ); +// } + g_bRecProtect = IsProtected(); + f_MM_SetRecordProtect( g_bRecProtect ); + ((TAudStylePanel*)m_pAudStylePanel)->ReloadLocalStyle( false ); + } + else{ + // ¼ʧ + g_infoUser.strPassword[0] = 0; + + if(eExtra == e_LoginPasswordError || eExtra == e_LoginUserNotExist || eExtra==e_VipExceeded + || eExtra==e_UserLocked || eExtra == e_UserDeleted) { + m_lblLogon->Tag = 0; + m_lblLogon->Caption = L"¼"; + m_lblLogon->Hint = L"¼ע"; + ShowErrorMessage( eExtra, "¼ʧ!" ); + //MessageForm->ShowMessage(L"û!", MB_ICONERROR | MB_OK); + PostMessage(Handle, UM_LOGIN, 0, 0); + } + } + } + else if( eMessage==e_versionResponse ){ //add by laq 2014.1.22 + if (eExtra == e_DatabaseError) { + DebugPrint("ݷʧܣ\n"); + } + else { + if (eExtra == e_UpdateMandatory || eExtra == e_UpdateOptional) { + int year = g_infoSoftwareUpdate.tIssueDate >> 16; + int month = (g_infoSoftwareUpdate.tIssueDate & 0xFF00) >> 8; + int day = g_infoSoftwareUpdate.tIssueDate & 0xFF; + + string sDescribe = UTF8ToMBCS(g_infoSoftwareUpdate.strDescribe); + + DebugPrint( + "µĿͻ˰汾Ver %d.%d.%d.%04d\nʱ䣺%d-%d-%d\nļС%dK\nļ%s\n", + g_infoSoftwareUpdate.version.majorVersion, + g_infoSoftwareUpdate.version.minorVersion, + g_infoSoftwareUpdate.version.modifyVersion, + g_infoSoftwareUpdate.version.buildVersion, year, month, day, + g_infoSoftwareUpdate.nFileSize, sDescribe.c_str()); + + if (eExtra == e_UpdateMandatory) { + DebugPrint("ð汾ΪǿƸ°档\n\n"); + + Logout(); + + g_bUpdateMandatory = true; + m_lblLogon->Visible = false; + m_btnUpload->Enabled = false; + } + + // don't display the update information while new user operator the software first + UpdateForm = new TUpdateForm(NULL); + UpdateForm->ShowModal(); + delete UpdateForm; + } + } + + } + else if( eMessage==e_noticeUpdateResponse ) { + if (eExtra == 0) { + WORD idUser = HIWORD(msg.LParam); + WORD nUnchecked = LOWORD(msg.LParam); + + int nUser = 0; + + if(g_bLogon) + nUser = f_CS_GetNewNoticeNum( g_infoUser.accountInfo.ID ); + + int nPublic = f_CS_GetNewNoticeNum( 0 ); + + if( nUser>0 || nPublic>0 ){ + m_pbUserNoticeNum->Tag = nUser + nPublic; + + if( !m_pbUserNoticeNum->Visible ){ + m_pbUserNoticeNum->Visible = true; + } + else{ + m_pbUserNoticeNum->Invalidate(); + } + + String strNoticeHint = " "; + if( nPublic>0 ){ + strNoticeHint += nPublic; + strNoticeHint += " վ¹"; + if( nUser>0 ){ + strNoticeHint += "\n "; + } + } + + if( nUser>0 ){ + strNoticeHint += nUser; + strNoticeHint += " δϢ\n鿴"; + } + + m_pbUserNoticeNum->Hint = strNoticeHint; + } + else{ + m_pbUserNoticeNum->Visible = false; + } + +// if( m_HelpForm ){ +// m_HelpForm->SetNoticeNum( iNotice, 0 ); +// m_HelpForm->SetNoticeNum( iUser, 1 ); +// } + } + } + else if( eMessage==e_logoffResponse ){ + m_lblLogon->Caption = L"¼"; + m_lblLogon->Tag = 0; + m_lblLogon->Hint = L"¼ע"; + + if( !strcmp( g_infoSong.strSinger, g_infoUser.strNickName ) ) + g_infoSong.strSinger[0] = '\0'; + if( !strcmp( g_infoSong.strLyricist, g_infoUser.strNickName ) ) + g_infoSong.strLyricist[0] = '\0'; + if( !strcmp( g_infoSong.strComposer, g_infoUser.strNickName ) ) + g_infoSong.strComposer[0] = '\0'; + if( !strcmp( g_infoSong.strArranger, g_infoUser.strNickName ) ) + g_infoSong.strArranger[0] = '\0'; + + char strName[80]; + strcpy(strName, g_infoUser.strUserName); + memset(&g_infoUser, 0, sizeof(g_infoUser)); + strcpy(g_infoUser.strUserName, strName); + + if(m_pbUserNoticeNum->Visible) + m_pbUserNoticeNum->Visible = false; + + if( m_HelpForm ){ + m_HelpForm->SetNoticeNum( 0, 1 ); + } + + g_bLogon = false; + } + else if( eMessage==e_styleDataResponse || eMessage==e_styleInfoResponse + || eMessage==e_styleRecomResponse ){ + m_pAudStylePanel->Perform( MSG_NETWORKMESSAGE, msg.WParam, msg.LParam ); + + if( eMessage==e_styleDataResponse && eExtra == 0 && !g_pPreStyle ){ + ((TPreStylePanel*)m_pPreStylePanel)->SetPreStyle( 0, msg.LParam ); + } + } +} + +void __fastcall TMainForm::FormPaint(TObject *Sender) +{ + //Ʋ˵ + if( m_pMenuBar ){ + m_pMenuBar->DrawMenuBar(); + + //Ʒ + TColor clrOldPen = Canvas->Pen->Color; + + int xL = MENUBAR_LEFT + m_pMenuBar->Width + OFFSET_BR, + xR = m_btnMin->Left - 3 - OFFSET_BR, + h = m_pMenuBar->GetHeight(), + xP = m_pPlayTimePanel->Left + m_pPlayTimePanel->Width + OFFSET_BR, + yP = m_pPlayTimePanel->Top, + hP = m_pPlayTimePanel->Height; + + Canvas->Pen->Color = CLR_BR_OUT; + Canvas->MoveTo( 0, BREAK_LINE_Y-1 ); + Canvas->LineTo( Width, BREAK_LINE_Y-1 ); + Canvas->MoveTo( 0, BREAK_LINE_Y+1 ); + Canvas->LineTo( Width, BREAK_LINE_Y+1 ); + + Canvas->MoveTo( xL, MENUBAR_TOP+3 ); + Canvas->LineTo( xL, MENUBAR_TOP+h-2 ); + Canvas->MoveTo( xL+2, MENUBAR_TOP+3 ); + Canvas->LineTo( xL+2, MENUBAR_TOP+h-2 ); + + Canvas->MoveTo( xR, MENUBAR_TOP+3 ); + Canvas->LineTo( xR, MENUBAR_TOP+h-2 ); + Canvas->MoveTo( xR+2, MENUBAR_TOP+3 ); + Canvas->LineTo( xR+2, MENUBAR_TOP+h-2 ); + + Canvas->MoveTo( xP, yP+3 ); + Canvas->LineTo( xP, yP+hP-2 ); + Canvas->MoveTo( xP+2, yP+3 ); + Canvas->LineTo( xP+2, yP+hP-2 ); + + Canvas->Pen->Color = CLR_BR_IN; + Canvas->MoveTo( 0, BREAK_LINE_Y ); + Canvas->LineTo( Width, BREAK_LINE_Y ); + + Canvas->MoveTo( xL+1, MENUBAR_TOP+3 ); + Canvas->LineTo( xL+1, MENUBAR_TOP+h-2 ); + Canvas->Pixels[xL+1][MENUBAR_TOP+2] = CLR_BR_FILL; + Canvas->Pixels[xL+1][MENUBAR_TOP+h-2] = CLR_BR_FILL; + + Canvas->MoveTo( xR+1, MENUBAR_TOP+3 ); + Canvas->LineTo( xR+1, MENUBAR_TOP+h-2 ); + Canvas->Pixels[xR+1][MENUBAR_TOP+2] = CLR_BR_FILL; + Canvas->Pixels[xR+1][MENUBAR_TOP+h-2] = CLR_BR_FILL; + + Canvas->MoveTo( xP+1, yP+3 ); + Canvas->LineTo( xP+1, yP+hP-2 ); + Canvas->Pixels[xP+1][yP+2] = CLR_BR_FILL; + Canvas->Pixels[xP+1][yP+hP-2] = CLR_BR_FILL; + + Canvas->Pen->Color = clrOldPen; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::FormMouseDown(TObject *Sender, TMouseButton Button, + TShiftState Shift, int X, int Y) +{ + m_pMenuBar->HitTest( X, Y, true ); +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::WMEraseBkgnd(Winapi::Messages::TWMEraseBkgnd &Message) +{ + TRect rect = GetClientRect(); + TRect rectFill = rect; + + TCanvas* tempCanvas = new TCanvas; + tempCanvas->Handle = Message.DC; + + //ϲɫ + rectFill.Bottom = rect.Height() - STATE_HEIGHT - 1; + tempCanvas->Brush->Color = CLR_TOP; + tempCanvas->FillRect( rectFill ); + + //²ɫ + rectFill.Top = rectFill.Bottom;//rect.Height() - 41; + rectFill.Bottom = rect.Bottom; + tempCanvas->Brush->Color = CLR_BOTTOM; + tempCanvas->FillRect(rectFill); + + delete tempCanvas; + + Message.Result = true; +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::LogonMouseEnter(TObject *Sender) +{ + m_lblLogon->Font->Color = CLR_TEXT_HOT; + m_lblLogon->Font->Style = TFontStyles()<Font->Color = CLR_TEXT_NOR; + m_lblLogon->Font->Style = TFontStyles(); +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::CreateParams(TCreateParams &Params) +{ + TForm::CreateParams(Params); + + wcscpy(Params.WinClassName, (LPCTSTR)APPNAME); +} +// --------------------------------------------------------------------------- + +void __fastcall TMainForm::OnSaveProject(TObject *Sender) +{ +/* int ret = CanSaveProj(); + if( ret==E_PROJ_NOLOCALTEMPSTYLE ){ //ʹ˷DZصƷ + MessageForm->ShowMessage( "ǰʹδ֪޷棡", + MB_ICONERROR | MB_OK, "湤" ); + return; + } + + if( ret==E_PROJ_UNSAVEDTEMPSTYLE ){ //Ʒδ棬ʾ +*/ + if( CanSaveProj()==E_PROJ_UNSAVEDTEMPSTYLE ){ //Ʒδ棬ʾ + if( mrOk==MessageForm->ShowMessage( "ȱڱ༭Ʒ", + MB_ICONQUESTION | MB_OKCANCEL, "湤" )){ + Application->MainForm->Perform( UM_SAVELOCALSTYLE, 0, 0 ); + } + else{ + return; + } + } + + if( g_strProjectName.length()==0 ){ + SaveAs( SAVE_PROJECT ); + } + else{ + TProgressForm *frmProgress = new TProgressForm(NULL); + + int ret = frmProgress->Project_Save( g_strProjectName.c_str() ); + int eExtra = frmProgress->GetOpertaionResult(); + + if (ret == mrOk && eExtra==0 ) { + MessageForm->ShowMessage("ļɹ", MB_OK | MB_ICONINFORMATION); + SetInitVar(); + } + else if( eExtra!=0 && eExtra!=e_UserCanceled ){ + MessageForm->ShowMessage( "ļʧ!", MB_ICONERROR|MB_OK ); + } + + delete frmProgress; + } +} +// --------------------------------------------------------------------------- + +void __fastcall TMainForm::OnCreateNewProject(TObject *Sender) +{ + if( !g_Theme.Empty() && (g_strProjectName.length()==0 || + HasProjectModified())) { + int mrRet = MessageForm->ShowMessage("Ƿ񱣴浱ǰ̣", + MB_ICONQUESTION | MB_YESNOCANCEL); + if (mrRet == mrYes) { + DebugPrint("ȷϱ"); + OnSaveProject(NULL); + } + else if (mrRet == mrCancel) { + return; + } + } + + NewProject(); + ClearAutoProj(); + SetInitVar(true); +} +// --------------------------------------------------------------------------- + +void __fastcall TMainForm::OnPredefineProject(TObject * Sender) +{ + if( !g_pPreStyle || g_pPreStyle->nSegNum[SEGTYPE_VAR]==0 ){ + MessageForm->ShowMessage( "ΪԤӰƬΣ", MB_ICONERROR|MB_OK ); + + return; + } + + OnCreateNewProject( NULL ); + + if( !g_Theme.Empty() ) + return; + + //ʾԤ幤̴ + TPredefineProjectForm *ppf = new TPredefineProjectForm(NULL); + if( ppf->ShowModal()==mrOk ){ + + //ýٶ + ChangeTT( true, ppf->m_Ts ); + ChangeTT( false, ppf->m_Tempo ); + + int iTonal = ppf->m_KeyType; + int nMSNum = ppf->m_RavStage; + int aPreset[3] = { 7, 5, 0 }; + + memcpy(aPreset, ppf->m_Preset, 3 * sizeof(int)); + + // ʼ + TBarList lstBars; + vector lstStages; + + //ԤRawStages + g_iMelodyKey = ppf->m_Key; + for( int i=0; i2 ){ + if( i==1 ) ind = 2; + else if( i==2 ) ind = 1; + } + + int nRepeat = (ind==2) ? 1 : 2; + for( int r=0; riBarKey = g_iMelodyKey; + int iKey = u_arrPredefChords[ind][iTonal][aPreset[i]][j] / 4 + g_iMelodyKey, + iType = u_arrPredefChords[ind][iTonal][aPreset[i]][j] % 4; + +// DebugPrint( "%d ", u_arrPredefChords[ind][iTonal][aPreset[i]][j] / 4 ); + + if( iKey>11 ) iKey -= 12; + + for( int k=0; k<4; k++ ){ + pBar->aChords.iKey[k] = iKey; + pBar->aChords.iType[k] = iType; + } + + lstBars.push_back( pBar ); + } + +// DebugPrint( "\n" ); + + lstStages.push_back( lstBars.size()-1 ); + } + } + + g_Theme.Build( lstBars, lstStages ); + + //ԤOpusStagesUseStyleItem + g_iViewMode = VIEW_STYLE; +// g_iPreStage = 3; + ((TUseStylePanel*)m_pUseStylePanel)->InitOpus( g_pPreStyle, g_iPreStage ); + + AfterLoadProject(); + + g_bPredefine = true; + } + + delete ppf; +} +// --------------------------------------------------------------------------- + +void __fastcall TMainForm::AcceptFiles(TMessage& Msg) +{ + const int m_nMaxFileNameLen = 255; + wchar_t m_wsFileName[m_nMaxFileNameLen]; + DragQueryFile((HDROP)Msg.WParam, 0, m_wsFileName, m_nMaxFileNameLen); + + if( !g_Theme.Empty() && ( g_strProjectName.length()==0 || HasProjectModified())) { + int mrRet = MessageForm->ShowMessage("Ƿ񱣴浱ǰ̣", + MB_ICONQUESTION | MB_YESNOCANCEL); + if (mrRet == mrYes) { + DebugPrint("ȷϱ"); + OnSaveProject(NULL); + } + else if (mrRet == mrCancel) { + return; + } + } + + SetInitVar(true); + DoLoadProject(m_wsFileName); + DragFinish((HDROP)Msg.WParam); +} +// --------------------------------------------------------------------------- + +void __fastcall TMainForm::OnLoadProject(TObject *Sender) +{ + if( g_aOriginStyles.empty() ) //δط + return; + +// DWORD param = (DWORD)Sender; +// int iMenuType = LOWORD( param ); +// int iMenuIndex = HIWORD( param ); + int ind = Sender ? (int)Sender - IDM_OPENPROJECT : -1; + wstring strProjectName; + + if( ind<0 ) { + strProjectName = m_strLoadProjectName.c_str(); + } + else{ + strProjectName = g_lstRecentProject[ind]; + } + + if( !g_Theme.Empty() && (g_strProjectName.length()==0 || + HasProjectModified())) { + int mrRet = MessageForm->ShowMessage("Ƿ񱣴浱ǰ̣", + MB_ICONQUESTION | MB_YESNOCANCEL); + if (mrRet == mrYes) { + DebugPrint("ȷϱ"); + OnSaveProject(NULL); + } + else if (mrRet == mrCancel) { + return; + } + } + + SetInitVar(true); + + if( strProjectName.empty() ){ + // ָļ + TOpenDialog * pDlg = new TOpenDialog(NULL); + pDlg->Title = "򿪹"; + pDlg->Options << ofFileMustExist; + pDlg->FileName = ExtractFileName(g_strProjectName.c_str()); + pDlg->InitialDir = ExtractFilePath(g_strProjectName.c_str()); + pDlg->Filter = "ļ (*.cpj)|*.cpj"; + pDlg->DefaultExt = "cpj"; + if (pDlg->Execute(Handle)) { + strProjectName = pDlg->FileName.c_str(); + } + delete pDlg; + } + + if( !strProjectName.empty() ){ + DoLoadProject(strProjectName.c_str()); + + Update(); + } + + m_strLoadProjectName = ""; +} +// --------------------------------------------------------------------------- + +void __fastcall TMainForm::DoLoadProject(LPCTSTR strName) +{ + Perform( UM_STOP, STOP_ALL, 0 ); + + m_pContentPanel->InitialVars( true ); + + g_Midi.ClearMidiTracks(); + ((TStylePanel*)m_pUseStylePanel)->SetStyleItem( g_pUseStyle = NULL ); + +// ClearAutoSave(); + + TProgressForm *frmProgress = new TProgressForm(NULL); + int ret = frmProgress->Project_Load(strName); + DWORD iResult = frmProgress->GetOpertaionResult(); + + delete frmProgress; + + if( ret==mrOk ){ + g_bAutoOpenProjectEnable = true; //add by tj 2014/05/15 + + if( SetSelectFont() ){ + TComboBoxItem* pItem = m_cbFontSelect->GetItem( m_cbFontSelect->DefItemIndex ); + + if( pItem->Tag != g_idFont ){ + for( int i=0; iItemsCount; i++ ){ + pItem = m_cbFontSelect->GetItem( i ); + + if( pItem->Tag==g_idFont ){ + m_cbFontSelect->DefItemIndex = i; + break; + } + } + } + } + else{ + iResult |= E_PROJ_INVALIDFONT; + } + + if( iResult & E_PROJ_INVALIDFONT ){ + String strMsg; + strMsg = g_strProjError[0]; + MessageForm->ShowMessage(strMsg, MB_ICONINFORMATION | MB_OK); + } + + if( iResult & E_PROJ_INVALSTAGESTYLE ){ + String strMsg; + strMsg = g_strProjError[1]; + MessageForm->ShowMessage(strMsg, MB_ICONINFORMATION | MB_OK); + } + + if( iResult & E_PROJ_INVALIDFX ){ + String strMsg; + strMsg = g_strProjError[2]; + MessageForm->ShowMessage(strMsg, MB_ICONINFORMATION | MB_OK); + } + + AfterLoadProject(); + +// m_lblTitle->Caption = TPath::GetFileNameWithoutExtension(strName); + } + else{ + if( iResult!=e_UserCanceled ){ + String strErr; + if (iResult > E_PROJ_FATALERROR) { + strErr = g_strProjError[iResult - E_PROJ_FATALERROR]; + } + + MessageForm->ShowMessage(strErr, MB_ICONERROR | MB_OK, "ʾ"); + + for (int i = 0; i < g_lstRecentProject.size(); i++) { + if (LowerCase(g_lstRecentProject[i].c_str()) == LowerCase(strName)) + { + g_lstRecentProject.erase(g_lstRecentProject.begin() + i); + break; + } + } + } + + NewProject(); + } +} +// --------------------------------------------------------------------------- + +void __fastcall TMainForm::AfterLoadProject() +{ + m_cbFontSelect->Enabled = !g_bExtFont; + m_btnExtFontOn->Visible = g_bExtFontUsable && g_bExtFont; + m_btnExtFontOff->Visible = g_bExtFontUsable && !g_bExtFont; + +// SetInitVar(); + + if( g_pPreStyle ) + ((TStylePanel*)m_pPreStylePanel)->SetStyleItem( g_pPreStyle ); + else + ((TStylePanel*)m_pPreStylePanel)->InitItems(); + + ((TStylePanel*)m_pUseStylePanel)->SetStyleItem( g_pUseStyle ); + ((TChordPanel*)m_pChordPanel)->EnableChordModify( false, -1, -1, -1 ); + + m_UseStyleHeight = m_UseStyleHeight + m_PreStyleHeight - TOOLPAL_MINHEIGHT; + m_PreStyleHeight = TOOLPAL_MINHEIGHT; + + m_pUseStylePanel->SetBounds( m_pUseStylePanel->Left, + m_pUseStylePanel->Top, + m_pUseStylePanel->Width, + m_UseStyleHeight ); + m_pPreStylePanel->SetBounds( m_pPreStylePanel->Left, + m_pUseStylePanel->Top + m_UseStyleHeight, + m_pPreStylePanel->Width, + m_PreStyleHeight ); + + m_btnTempo->Caption = IntToStr(g_nMelodyTempo); + m_btnTempo->Invalidate(); + m_cbPreStage->DefItemIndex = g_iPreStage; + m_cbKey->DefItemIndex = g_iMelodyKey; + m_cbKey->Enabled = true; + + m_iStartBar = 0; + m_dblStartPoint = 0; + m_dwLastVol = 0; + m_pContentPanel->SetPlayPoint( 0, 0 ); + m_pContentPanel->SelectTrack( -1, -1, -1 ); + ShowPlayTime(); + + m_strUploadFile = ""; + u_pUploadLite = NULL; + + SetMode( g_iViewMode, true ); + + m_pContentPanel->OnStageChanged( 0, MODE_INIT ); + + for( int i=0; iEnabled = !g_lstOpusStages.empty(); + m_btnSave->Enabled = !g_lstOpusStages.empty(); + m_btnUpload->Enabled = !g_bUpdateMandatory && !g_lstOpusStages.empty(); + + //ʼg_infoSong + memset( &g_infoSong, 0, sizeof(TSONGINFO) ); + memset( g_infoSong.iMusicStyle, -1, 4 ); + + g_infoSong.size = sizeof(tSongInfo); + g_infoSong.iTS = g_iMelodyTimeSignature; + g_infoSong.iTempo = g_nMelodyTempo; + g_infoSong.iSubmit = 1; + + //Title + if( g_strProjectName.length()==0 ) + m_lblTitle->Caption = L"Untitle"; + else{ + String strName = g_strProjectName.c_str(); + AnsiString strTitle = TPath::GetFileNameWithoutExtension( strName ); + m_lblTitle->Caption = strTitle; + strcpy( g_infoSong.strSongName, strTitle.c_str() ); + } +} +// --------------------------------------------------------------------------- + +void __fastcall TMainForm::OnLoadProjectMessage(TMessage &msg) +{ + if (msg.LParam != 0) { + int BUF_SIZE = 256; + TCHAR szName[] = TEXT("MyFileMappingObject"); + LPTSTR pBuf; + HANDLE hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, + // read/write access + FALSE, // do not inherit the name + szName); // name of mapping object + + if (hMapFile) { + pBuf = (LPTSTR) MapViewOfFile(hMapFile, // handle to map object + FILE_MAP_ALL_ACCESS, // read/write permission + 0, 0, BUF_SIZE); + + if (pBuf) { + m_strLoadProjectName = pBuf; + UnmapViewOfFile(pBuf); + PostMessage(Handle, UM_LOADPROJECT, 0, 0); + } + + CloseHandle(hMapFile); + } + } + else { + OnLoadProject(NULL); + } + + msg.Result = true; +} +// --------------------------------------------------------------------------- + +void __fastcall TMainForm::OnSaveProjectMessage(TMessage &msg) +{ + SaveAs( msg.WParam + msg.LParam ); +} +// --------------------------------------------------------------------------- + +void __fastcall TMainForm::OnNewProjectMessage(TMessage &msg) +{ + NewProject(); +} +// --------------------------------------------------------------------------- + +void __fastcall TMainForm::NewProject() +{ + if( g_iViewMode==VIEW_INIT ) + return; + + Perform( UM_STOP, STOP_ALL, 0 ); + + DisableAutoOpen(); //add by tj 2014/05/15 + + m_lblTitle->Caption = L"Untitle"; + m_strUploadFile = ""; + u_pUploadLite = NULL; + + g_bMidiMelody = false; + g_iMelodyKey = -1; + g_fMusicVolume = 1; + g_bComposeMute = false; +// g_iSelAudio = -1; + g_strProjectName.clear(); + g_Opus.Clear(); + + //ʼg_infoSong + memset( &g_infoSong, 0, sizeof(TSONGINFO) ); + memset( g_infoSong.iMusicStyle, -1, 4 ); + + g_infoSong.size = sizeof(tSongInfo); + g_infoSong.iTS = g_iMelodyTimeSignature; + g_infoSong.iTempo = g_nMelodyTempo; + g_infoSong.iSubmit = 1; + + ClearGlobalVars(); + ClearSVDVars(); + ClearProjStyleMap(); + f_CS_ResetProject(); + f_MM_ResetProject(); + g_bProjStylePaid = false; + + SetMode( VIEW_INIT, true ); +} +// --------------------------------------------------------------------------- + +void __fastcall TMainForm::OnUserHelp(TObject *Sender) +{ + if( !m_HelpForm ){ + m_HelpForm = new THelpForm(this); + int iPublic = 0, iUser = 0; + + if(g_bLogon) + iUser = f_CS_GetNewNoticeNum( g_infoUser.accountInfo.ID ); + + m_HelpForm->SetNoticeNum(iUser, 1); + + m_HelpForm->Show(); + } + else if( m_HelpForm->Window_state==HLP_WINDOW_MIN ){ + m_HelpForm->SetSize( HLP_WINDOW_NORMAL ); + } +} +// --------------------------------------------------------------------------- + + void __fastcall TMainForm::OnUserManual(TObject *Sender) +{ + PostMessage(Handle, UM_OPENMANUAL, 0, 0); +} +// --------------------------------------------------------------------------- + +void __fastcall TMainForm::OnForumVist(TObject *Sender) +{ + char strURL[256]; + f_CS_GetWebPageURL( URL_TECHFORUM, strURL ); + ShellExecute(Handle, NULL, ((String)strURL).c_str(), NULL, NULL, SW_SHOWNORMAL); +} +// --------------------------------------------------------------------------- + +void __fastcall TMainForm::OnMicSetting(TObject *Sender) +{ + StopClick( NULL ); + + TMicSetForm * pDlg = new TMicSetForm(this); + pDlg->ShowModal(); + delete pDlg; +} +// --------------------------------------------------------------------------- + +void __fastcall TMainForm::OnVSTPathSetting(TObject *Sender) +{ + PostMessage(Handle, UM_VSTPATH, 0, 0); +} +// --------------------------------------------------------------------------- + +void __fastcall TMainForm::OnAbout(TObject *Sender) +{ + PostMessage(Handle, UM_SHOWABOUT, 0, 0); +} +// --------------------------------------------------------------------------- + +void __fastcall TMainForm::OnShowAbout(TMessage & Msg) +{ + TAboutForm * pDlg = new TAboutForm(NULL); + + pDlg->ShowModal(); + + delete pDlg; +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::OnShowMore(TObject *Sender) +{ + char strURL[256]; + f_CS_GetWebPageURL(URL_SOFTWARE, strURL); + ShellExecute(Handle, NULL, ((String)strURL).c_str(), NULL, NULL, SW_SHOWNORMAL); +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::OnOpenManual(TMessage & Msg) +{ + HWND hHelp = FindWindow(NULL, L"ħרҵûֲ"); + if (hHelp) { + ShowWindow(hHelp, SW_RESTORE); + } + else { + String helpFile = g_strExecutePath.c_str(); + helpFile += "Help/ACProManual.chm"; + ShellExecute(Handle, L"Open", helpFile.c_str(), NULL, NULL, SW_MAXIMIZE); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::ShowPlayTime() +{ + int iTime[3]; + GetPlayTime( m_iStartBar, m_dblStartPoint, iTime ); + + m_pPlayTimePanel->SetTime( iTime ); +} +//--------------------------------------------------------------------------- +void __fastcall TMainForm::RecordClick(TObject *Sender) +{ + PostMessage( Handle, UM_RECORD, 0, 0 ); +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::UMRecord(TMessage &Message) +{ + HRESULT hr = S_FALSE; + m_bFromFile = false; + m_iRecordBar = 0; + m_dblRecordPoint = 0; + m_nDelayPoint = -1; + + Perform( UM_STOP, STOP_ALL, 0 ); + + m_pContentPanel->SetFocus(); + + int iModifyBeginBar, iModifyBeginPoint, iModifyEndBar, iModifyEndPoint; + m_pContentPanel->GetSelectRange(iModifyBeginBar, iModifyBeginPoint, + iModifyEndBar, iModifyEndPoint); + + if( g_iSelAudio<0 ){ + if( g_iViewMode==VIEW_INIT ){ + g_iSelAudio = 0; + } + else{ + bool bResetRange = g_iViewMode==VIEW_STYLE; + if( g_iViewMode!=VIEW_TRACK ) + SetMode( VIEW_TRACK ); + + for( int i=0; iIsHide() && !g_aAudioTracks[i]->lstBars.empty() ){ + int iShowTrack = m_pContentPanel->GetShowTrackId( ST_AUDIO, i ) - 1; + m_pContentPanel->SelectTrack( iShowTrack, -1, -1 ); + + break; + } + } + + if( bResetRange ) + m_pContentPanel->SetSelectRange( iModifyBeginBar, iModifyBeginPoint, + iModifyEndBar, iModifyEndPoint ); + } + } + + double dblEditStartBar = -1, + dblEditEndBar = -1, + dblPlayStartBar = 0; + int iWithCompose = 0; + + bool bModify = g_iViewMode!=VIEW_INIT;//!g_lstOpusStages.empty() && g_iPreStage>0 || g_bPredefine || m_pContentPanel->IsModifyMode(); + bool bBeatHint = false; + +//ǰݣʾԤg_iSelAudio=0 && g_lstRawStages.empty Ϊʼ¼AddUndo(UNDO_AUDIO_RECORD) + if( bModify ) { + if( g_iPreStage>0 ) + iWithCompose = TYPE_COMPOSE; + else + iWithCompose = TYPE_BASECOMPOSE; + + if( g_bPredefine || g_bMidiMelody ) + iWithCompose |= TYPE_PREDEFINE; + + GenerateCompose(); + + int nBarCount = g_aAudioTracks[g_iSelAudio]->lstBars.size(); +// int iModifyBeginBar, iModifyBeginPoint, iModifyEndBar, iModifyEndPoint; +// m_pContentPanel->GetSelectRange(iModifyBeginBar, iModifyBeginPoint, +// iModifyEndBar, iModifyEndPoint); + + if( iModifyBeginBar<1 ){ + bBeatHint = true; + m_iStartBar = 0; + m_dblStartPoint = 0; + m_pContentPanel->SetPlayPoint(0, 0); + } + + if( m_iStartBar>iModifyBeginBar || ( m_iStartBar==iModifyBeginBar + && m_dblStartPoint>=iModifyBeginPoint )){ + if (iModifyBeginBar > 0) + m_iStartBar = iModifyBeginBar - 1; + else + m_iStartBar = 0; + + m_dblLastStartPoint = m_dblStartPoint = 0; + m_pContentPanel->SetPlayPoint(m_iStartBar, 0); + } + + dblPlayStartBar = m_iStartBar + m_dblStartPoint/POINTS_PER_BAR; + + if( iModifyBeginBar>=0 ) + dblEditStartBar = iModifyBeginBar + (double)iModifyBeginPoint/POINTS_PER_BAR; + else + iModifyBeginBar = iModifyBeginPoint = 0; + + if( iModifyEndBar>=0 ) + dblEditEndBar = iModifyEndBar + (double)iModifyEndPoint/POINTS_PER_BAR; + else if( g_iSelAudio>0 ){ + iModifyEndBar = nBarCount; + iModifyEndPoint = 0; + } + + if( g_bPredefine && g_iPreStage==0 && dblEditStartBar<0 && dblEditEndBar<0 ){ + dblEditStartBar = 0; + dblEditEndBar = nBarCount;// g_lstRawBars.size(); + } + + if( g_iSelAudio>0 ){ + DWORD* aWave = NULL; + CopyWave( g_iSelAudio, iModifyBeginBar, iModifyBeginPoint, iModifyEndBar, iModifyEndPoint, &aWave ); + + g_Undo.AddUndo( UNDO_AUDIO_RECORD, g_iSelAudio, MAKELONG( iModifyBeginPoint, iModifyBeginBar ), + MAKELONG( iModifyEndPoint, iModifyEndBar ), aWave, NULL ); + } + else{ + TAudioTrack* pAudio = CopyAudioTrack( 0, 0, nBarCount ); + g_Undo.AddUndo( UNDO_AUDIO_RECORD, 0, g_iMelodyKey, -1, pAudio, NULL ); + } + + f_MM_AddUndoBefore( 1, &g_iSelAudio ); + } + else{ + //ԤƬ + if( !g_pPreStyle || g_pPreStyle->nSegNum[SEGTYPE_VAR]==0 ){ + MessageForm->ShowMessage( "ΪԤӰƬΣ", MB_ICONERROR|MB_OK ); + + return; + } + + if( g_Undo.GetUndoType()>=0 ){ + TAudioTrack* pAudio = CopyAudioTrack( 0, 0, 0 ); + g_Undo.AddUndo( UNDO_AUDIO_RECORD, 0, g_iMelodyKey, -1, pAudio, NULL ); + + int iAT = 0; + f_MM_AddUndoBefore( 1, &iAT ); + } + } + + BYTE* pBeatData = NULL; + int nBeatSize = 0; + + if( g_bPrebeat || bModify ){ + pBeatData = new BYTE[1000000]; + nBeatSize = 1000000; + + TStylePanel* pStyPanel = (TStylePanel*)( bModify ? m_pUseStylePanel : m_pPreStylePanel ); + if( !pStyPanel->GetPrebeat( pBeatData, nBeatSize ) ){ + nBeatSize = 0; + } + } + + f_MM_LoadPrebeat( pBeatData, nBeatSize ); + + if( pBeatData ){ + delete[] pBeatData; + pBeatData = NULL; + } + + hr = f_MM_AudioRecord( Handle, g_iSelAudio, dblPlayStartBar, dblEditStartBar, dblEditEndBar, iWithCompose ); + + if( hr==S_OK ){ + SetRecordState( true ); + + m_cbKey->Enabled = false; + + m_btnRecord->Enabled = false; + m_btnRecord->Down = true; + + m_btnStop->Enabled = true; + m_btnPlay->Enabled = false; + m_btnPlay->Visible = true; + m_btnPause->Visible = false; + + if( !bModify || bBeatHint ){ + m_pContentPanel->ShowBeatHint( g_nChordNumPerBar - 1 ); + + if( bBeatHint ){ + int tInterval = (int)(( g_iMelodyTimeSignature==3 ? 90000.0 : 60000.0 ) + / g_nMelodyTempo + 0.5 ); + + SetPlayTimer(true, m_tBeatHint, m_tAccuracy, Handle, tInterval); + } + else{ + // һС + TWaveBar * pBar = new TWaveBar; + g_aAudioTracks[0]->lstBars.push_back(pBar); + g_aAudioTracks[0]->Hide(false); + + m_pContentPanel->AddNewBar(0); + } + } + + if( !bBeatHint ){ + SetPlayTimer(true, m_tTimer, m_tAccuracy, Handle); + m_pContentPanel->Play(true); + } + } + else{ + ShowErrorMessage( hr, "" ); + + if( hr==3 || hr==6 || hr==37 || hr==46 || hr==23 ){ + g_iRecordDevice = g_iRecordInput = -1; + } + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::ShowErrorMessage( int errcode, String strOperation ) +{ + String msg; + if( strOperation.Length()==0 ){ + if( errcode==46 ){ + msg += L"¼豸ռá"; + } + else if( errcode==6 ){ + msg += L"¼豸֧ʽ"; + } + else if( errcode==1 ){ + msg += L"ڴռ䲻㡣"; + } + else if( errcode==37 ){ + msg += L"¼豸޷򿪡"; + } + else if( errcode==3 ){ + msg += L"¼豸Ч"; + } + else if( errcode==23 ){ + msg += L"¼豸á"; + } + else{ + msg += L"¼豸ʧܡ"; + } + } + else{ + msg = strOperation + L"\n\n"; + + if( errcode==e_InvalidUserID ){ + msg += L"Чû"; + } + else if( errcode==e_InvalidAuthority ){ + msg += L"û޲Ȩޡ"; + } + else if( errcode==e_InvalidStyleID ){ + msg += L"ѡķ֮һʧЧ"; + } + else if( errcode==e_VerifyInsufficient ){ + msg += L"㣬¼վȡ"; + } + else if( errcode==e_DatabaseError ){ + msg += L"ݿʧܣԺԡ"; + } + else if( errcode==e_ServiceBusy ){ + msg += L"æԺԡ"; + } + else if( errcode==e_SocketError ){ + msg += L"ϣرճԡ"; + } + else if( errcode==e_WaitTimeout ){ + msg += L"糬ʱԺԡ"; + } + else if( errcode==e_LoginPasswordError ){ + msg += L"롣"; + } + else if( errcode==e_LoginUserNotExist ){ + msg += L"Чû롣"; + } + else if( errcode==e_UsernameExist ){ + msg += L"ûѴڣעᡣ"; + } + else if( errcode==e_UserLocked ){ + msg += L"˻ᣬעᡣ"; + } + else if( errcode==e_UserDeleted ){ + msg += L"˻ѱɾעᡣ"; + } + else if( errcode==e_OpenFileFailed ){ + msg += L"ļ"; + } + else if( errcode==e_InvalidDataID + || errcode==e_InvalidPackID + || errcode==e_InvalidData ){ + msg += L"ļʧܡ"; + } + else if( errcode==e_FormatErr ){ + msg += L"ļʽ"; + } + else if( errcode==e_TrkToMuch ){ + msg += L"࣬ɾĹ"; + } + else if( errcode==e_NoTrack ){ + msg += L"ļЧ"; + } + else if( errcode==e_VipExceeded ){ + msg += L"˺ŵ¼豸ѴޣԺԡ"; + } + else if( errcode==e_NoService ){ + msg += L"ʧܡ"; + } + else{ + msg += L"δ֪ԭ"; + } + } + + MessageForm->ShowMessage( msg, MB_ICONERROR|MB_OK ); +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::UMMediaTime(TMessage &Message) +{ + if( Message.WParam==m_tBeatHint ){ + int iInterval = ( g_nChordNumPerBar==4 ? 30 : g_nChordNumPerBar==3 ? 40 : 60 ); + + m_dblStartPoint += iInterval; + + if( m_dblStartPoint >= (double)POINTS_PER_BAR ){ + m_dblStartPoint = 0; + + SetPlayTimer( false, m_tBeatHint, m_tAccuracy); + SetPlayTimer(true, m_tTimer, m_tAccuracy, Handle); + + m_pContentPanel->ShowBeatHint( -1 ); + m_pContentPanel->Play(true); + } + else{ + int iIndex = m_dblStartPoint/iInterval; + m_pContentPanel->ShowBeatHint( g_nChordNumPerBar-iIndex-1 ); + } + + return; + } + + if( !m_pContentPanel || !m_pContentPanel->IsPlaying() ) + return; + + int iModifyBeginBar(-1), iModifyBeginPoint(-1), + iModifyEndBar(-1), iModifyEndPoint(-1); + bool bRecording = m_btnRecord->Down, + bNewBar = false; + int iBar = m_iStartBar; + double dblStartPoint = m_dblStartPoint + g_dblStep; + + if( (int)dblStartPoint==(int)m_dblStartPoint ){ + m_dblStartPoint = dblStartPoint; + + return; + } + + if (dblStartPoint >= (double)POINTS_PER_BAR) { + dblStartPoint -= POINTS_PER_BAR; + iBar++; + bNewBar = true; + } + + if( bNewBar ){ + bool bAutoStop = !bRecording || g_bPredefine || g_bMidiMelody + || ( g_iViewMode!=VIEW_INIT && g_iPreStage!=0 ); + + if( !bAutoStop && g_iViewMode!=VIEW_INIT && g_iPreStage==0 + && m_pContentPanel->IsModifyMode() ){ + m_pContentPanel->GetSelectRange( iModifyBeginBar, iModifyBeginPoint, + iModifyEndBar, iModifyEndPoint); + + if( iModifyEndBar>=0 ) + bAutoStop = true; + } + + if( m_pContentPanel->GetBarNum()==iBar && bAutoStop ){ + if( bRecording ){ + m_iRecordBar = iBar-1; + m_dblRecordPoint = POINTS_PER_BAR - 1; + } + + StopClick(NULL); + return; + } + + bool bExtend = g_iViewMode==VIEW_INIT || g_iPreStage==0; + if( bRecording && bExtend && iBar==g_aAudioTracks[0]->lstBars.size() ){ + m_pContentPanel->ShowBeatHint( -1 ); + + TWaveBar* pBar = new TWaveBar; + g_aAudioTracks[0]->lstBars.push_back( pBar ); + + m_pContentPanel->AddNewBar(iBar); + } + } + else if( g_iViewMode==VIEW_INIT && iBar<1 ){ + int iInterval = ( g_nChordNumPerBar==4 ? 30 : g_nChordNumPerBar==3 ? 40 : 60 ); + int iIndex = dblStartPoint/iInterval; + + m_pContentPanel->ShowBeatHint( g_nChordNumPerBar-iIndex-1 ); + } + + if( bRecording ){ + if( g_iViewMode==VIEW_INIT ){ + iModifyBeginBar = 0; + iModifyBeginPoint = POINTS_PER_BAR/2; + } + else if( m_pContentPanel->IsModifyMode() ){ + m_pContentPanel->GetSelectRange( iModifyBeginBar, iModifyBeginPoint, + iModifyEndBar, iModifyEndPoint); + } + + if( m_nDelayPoint<0 && ( iBar>iModifyBeginBar || iBar==iModifyBeginBar + && dblStartPoint>(double)iModifyBeginPoint ) ){ + float fLatency = f_MM_GetLatency( false ) / 1000; + m_nDelayPoint = (int)( fLatency / g_dblTimePerBar * POINTS_PER_BAR + 0.5 ); + } + + if( m_nDelayPoint>0 ){ + if( iModifyBeginBar>=0 ){ + iModifyBeginPoint += m_nDelayPoint; + if( iModifyBeginPoint>=POINTS_PER_BAR ){ + iModifyBeginPoint -= POINTS_PER_BAR; + iModifyBeginBar++; + } + } + else{ + iModifyBeginBar = 0; + iModifyBeginPoint = m_nDelayPoint; + } + + if( iModifyEndBar>=0 ){ + iModifyEndPoint += m_nDelayPoint; + + if( iModifyEndPoint>=POINTS_PER_BAR ){ + iModifyEndPoint -= POINTS_PER_BAR; + iModifyEndBar++; + } + } + } + + if( !((iBar>iModifyBeginBar || iBar==iModifyBeginBar + && dblStartPoint>=(double)iModifyBeginPoint) && (iModifyEndBar<0 + || iBarInvalidate(); + + if( bRecording ){ + int iWave = m_pContentPanel->GetShowTrackId( ST_AUDIO, g_iSelAudio ); + + if( (iBar>iModifyBeginBar || iBar==iModifyBeginBar + && dblStartPoint>=(double)iModifyBeginPoint) + && (iModifyEndBar<0 || iBarlstBars[iLastBar]; + + if( iLastBaraVols[i] = m_dwLastVol; + } + + m_pContentPanel->InvalidateBar( iLastBar, iLastPoint, POINTS_PER_BAR-1, BAR_TRACK | iWave ); + } + + iLastPoint = 0; + + pBar = g_aAudioTracks[g_iSelAudio]->lstBars[iCurrBar]; + } + + if( iLastPointaVols[i] = m_dwLastVol; + } + } + + pBar->aVols[iCurrPoint] = dwVolume; + m_dwLastVol = dwVolume; + + m_pContentPanel->InvalidateBar( iCurrBar, iLastPoint, iCurrPoint, BAR_TRACK | iWave ); + } + + m_iRecordBar = iBar; + m_dblRecordPoint = dblStartPoint; + } + + m_pContentPanel->SetPlayPoint( iBar, (int)dblStartPoint ); + + m_iStartBar = iBar; + m_dblStartPoint = dblStartPoint; + + ShowPlayTime(); +} +// --------------------------------------------------------------------------- + +void __fastcall TMainForm::UMAutoRecognition(TMessage &Message) +{ + g_iMelodyKey = -1; + AutoRecognition( Message.WParam ); +} +// --------------------------------------------------------------------------- + +void __fastcall TMainForm::UMRecordComplete(TMessage &Message) +{ + if( !m_pContentPanel ) + return; + + StopClick( NULL ); + + if( m_pVolumeForm ){ + m_pVolumeForm->OnRecord( false ); + } + + int iBeginBar, iBeginPoint, iEndBar, iEndPoint; + m_pContentPanel->GetSelectRange( iBeginBar, iBeginPoint, + iEndBar, iEndPoint); + if( iBeginBar<0 ){ + iBeginBar = 0; + iBeginPoint = 0; + } + + if( iEndBar<0 ){ + iEndPoint = 0; + + if( g_iSelAudio==0 ) + iEndBar = g_aAudioTracks[0]->lstBars.size(); + else + iEndBar = GetBarCount(); + } + + if( ( m_iRecordBar=0 ){ + g_Undo.CancelUndo(); + f_MM_CancelAddUndo(); + } + else{ + if( g_iSelAudio==0 ){ + AutoRecognition( MODE_RECORD ); + } + else{ + f_MM_AddUndoAfter( 1, &g_iSelAudio ); + + TUndoLite* pUndo = g_Undo.GetLastLite(); + + if( m_iRecordBarpBefore, sizeof(DWORD) * len ); + delete[] (DWORD*)pUndo->pBefore; + + pUndo->pBefore = aNewWave; + pUndo->iEnd = MAKELONG( iEndPoint, iEndBar ); + } + + DWORD* aWave = NULL; + CopyWave( g_iSelAudio, iBeginBar, iBeginPoint, iEndBar, iEndPoint, &aWave ); + pUndo->pAfter = aWave; + + m_btnRecord->Down = false; + m_btnPlay->Visible = true; + m_btnPlay->Enabled = !g_lstOpusStages.empty(); + m_btnRecord->Enabled = RecordEnabled(); + m_btnPause->Visible = false; + m_btnStop->Enabled = false; + m_btnSave->Enabled = !g_lstOpusStages.empty(); + m_btnUpload->Enabled = !g_bUpdateMandatory && !g_lstOpusStages.empty(); + //g_bSongSaved = false; + m_bFromFile = false; + m_cbKey->DefItemIndex = g_iMelodyKey; + m_cbKey->Enabled = g_iMelodyKey>=0; + } + } +} +// --------------------------------------------------------------------------- + +void __fastcall TMainForm::UMRecordVolJust(TMessage &Message) +{ + g_fRecordVolume = (int)Message.WParam / 100.0; + + if( m_pVolumeForm ){ + m_pVolumeForm->ChangeRecordVol(); + } +} +// --------------------------------------------------------------------------- + +void __fastcall TMainForm::UMPlayOver(TMessage &Message) +{ +// if( !m_btnRecord->Down ) + Perform( UM_STOP, STOP_ALL, 0 ); +} +// --------------------------------------------------------------------------- + +void __fastcall TMainForm::StopClick(TObject *Sender) +{ + f_MM_Stop(); + + if( m_pContentPanel->IsPlaying() ){ + m_pContentPanel->Play(false); + + SetPlayTimer(false, m_tTimer, m_tAccuracy); + + m_nVolLevel = 0; + m_pbVolLevel->Invalidate(); + } + + if( m_tTimer ) + SetPlayTimer(false, m_tTimer, m_tAccuracy); + if( m_tBeatHint ) + SetPlayTimer(false, m_tBeatHint, m_tAccuracy); + + m_pContentPanel->ShowBeatHint( -1 ); + + if( m_btnRecord->Down ) + SetRecordState( false ); + + m_iStartBar = m_iLastStartBar; + m_dblStartPoint = m_dblLastStartPoint; + m_pContentPanel->SetPlayPoint(m_iStartBar, (int)m_dblStartPoint); + ShowPlayTime(); + + m_btnStop->Enabled = false; + m_btnRecord->Enabled = RecordEnabled(); + m_btnRecord->Down = false; + m_btnPlay->Visible = true; + m_btnPlay->Enabled = !g_lstOpusStages.empty(); + m_btnPause->Visible = false; +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) +{ + if( Shift.Contains( ssAlt ) ){ + int iType = 0; + + switch( Key ){ + case 'F': iType = MENU_FILE; break; + case 'E': iType = MENU_EDIT; break; + case 'V': iType = MENU_VIEW; break; + case 'K': iType = MENU_TRACK; break; + case 'T': iType = MENU_TOOL; break; + case 'H': iType = MENU_HELP; break; + } + + if( iType>0 ){ + m_pMenuBar->ShowMenu( iType ); + } + } + else{ + switch (Key) { + case VK_ESCAPE: + if( !m_btnRecord->Down ){ + m_pContentPanel->DoCancelAll(NULL); + if( Screen->Cursor>=crBrush && Screen->Cursor<=crBrushNo ){ + Screen->Cursor = crDefault; + } + } + + if( m_KeyBoard->Visible ){ + m_KeyBoard->ShowKeyboard( false ); + if( m_btnKeyboard->Down ) + m_btnKeyboard->Down = false; + } + break; + + case VK_TAB: + if( Shift.Contains( ssCtrl ) && !m_btnRecord->Down && g_iViewMode!=VIEW_INIT ){ + OnViewMode((TObject*)3); + } + break; + + case ' ': + if (m_btnPause->Visible && m_btnPause->Enabled) { + PauseClick(NULL); + } + else if (m_btnPlay->Visible && m_btnPlay->Enabled) { + PlayClick(NULL); + } + else if (m_btnStop->Enabled) { + StopClick(NULL); + } + + break; + + case 'W': + if( !m_btnRecord->Down ){ + if( m_btnStop->Enabled ){ + StopClick(NULL); + } + + m_iStartBar = m_iLastStartBar = 0; + m_dblStartPoint = m_dblLastStartPoint = 0; + m_pContentPanel->SetPlayPoint(0, 0); + ShowPlayTime(); + } + + break; + + case 'R': + if( m_btnRecord->Enabled && !m_btnRecord->Down ){ + RecordClick(m_btnRecord); + } + + break; + + case 'A': + if( Shift.Contains( ssCtrl ) && !m_btnRecord->Down ){ + m_pContentPanel->DoSelectAll(NULL); + } + break; + + case 'C': + if( Shift.Contains( ssCtrl ) && !m_btnRecord->Down ){ + if( g_iViewMode==VIEW_STYLE ) { + m_pContentPanel->DoBarsCopy(NULL); + } + else if( g_iViewMode==VIEW_CHORD ){ + m_pContentPanel->DoChordCopy(NULL); + } + else if( g_iViewMode==VIEW_TRACK ){ + m_pContentPanel->DoAudioCopy(NULL); + } + } + break; + + case 'X': + if( Shift.Contains( ssCtrl ) && !m_btnRecord->Down ){ + if( g_iViewMode==VIEW_STYLE ) { + m_pContentPanel->DoBarsCut(NULL); + } + else if( g_iViewMode==VIEW_TRACK ){ + m_pContentPanel->DoAudioCut(NULL); + } + } + break; + + case 'V': + if( Shift.Contains( ssCtrl ) && !m_btnRecord->Down ){ + if( g_iViewMode==VIEW_STYLE ) { + m_pContentPanel->DoBarsInsert(NULL); + } + else if( g_iViewMode==VIEW_CHORD ){ + m_pContentPanel->DoChordPaste(NULL); + } + else if( g_iViewMode==VIEW_TRACK ){ + m_pContentPanel->DoAudioPaste(NULL); + } + } + break; + + case 'Z': + if( !m_btnRecord->Down ){ + if( Shift.Contains( ssCtrl ) ){ + if( Shift.Contains( ssShift ) ){ + Undo( false ); + } + else{ + Undo( true ); + } + } + } + break; + + case VK_DELETE: + if( Shift.Contains( ssCtrl ) && !m_btnRecord->Down ){ + if( g_iViewMode==VIEW_STYLE ) { + m_pContentPanel->DoBarsDelete(NULL); + } + else if( g_iViewMode==VIEW_CHORD ){ + m_pContentPanel->DoChordDelete(NULL); + } + else if( g_iViewMode==VIEW_TRACK ){ + if( g_iSelAudio>=0 ) + m_pContentPanel->DoAudioDelete(NULL); + else if( g_iSelMidiTrack>=0 ) + m_pContentPanel->DoDeleteTexture(NULL); + } + } + break; + + case VK_INSERT: + if( Shift.Contains( ssCtrl ) && !m_btnRecord->Down ){ + if( g_iViewMode==VIEW_STYLE ) { + m_pContentPanel->DoInsertBlankBar(NULL); + } + else if( g_iViewMode==VIEW_TRACK ){ + if( g_iSelAudio>=0 ) + m_pContentPanel->DoAudioLoad(NULL); + else if( g_iSelMidiTrack>=0 ) + m_pContentPanel->DoInsertTexture(NULL); + } + } + break; + + case VK_F1: + if( !m_btnRecord->Down ) + OnUserHelp( NULL ); + break; + + case VK_F2: + if( !m_btnRecord->Down ) + OnLoadProject( NULL ); + break; + + case VK_F3: + if( g_lstOpusStages.size()>0 && !m_btnRecord->Down ) + OnSaveProject( NULL ); + break; + + case VK_F4: + if( g_lstOpusStages.size()>0 && !m_btnRecord->Down ) + OnSaveAs( Sender ); + break; + + case VK_F5: + if( !m_btnRecord->Down ) + OnCreateNewProject( NULL ); + break; + + case VK_F6: + OnKeyBoard( NULL ); + break; + + case VK_F7: + VolSetClick( NULL ); + break; + + case VK_F8: + if( !m_btnRecord->Down ) + OnMicSetting( NULL ); + break; + + case VK_F9: + case VK_F10: + case VK_F11: + if( !m_btnRecord->Down ) + OnViewMode( (TObject*)MAKELONG(0,(Key - VK_F9)) ); + break; + + case VK_F12: + if( !m_btnRecord->Down ) + OnLoadMelody( NULL ); + break; + + case VK_CONTROL: + if( w_bDraging && w_iDragMode==DM_ADJUSTSTAGE && Screen->Cursor==crDefault ){ + Screen->Cursor = crDrag; + } + break; + + default: + break; + } + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::FormKeyUp(TObject *Sender, WORD &Key, TShiftState Shift) +{ + switch (Key) { + case VK_CONTROL: + if( w_bDraging && w_iDragMode==DM_ADJUSTSTAGE && Screen->Cursor==crDrag ){ + Screen->Cursor = crDefault; + } + break; + + default: + break; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::UMShowPlayTime(TMessage &Message) +{ + m_iLastStartBar = m_iStartBar = Message.WParam; + m_dblLastStartPoint = m_dblStartPoint = Message.LParam; + + ShowPlayTime(); + + if( m_pContentPanel->IsPlaying() ){ + double dblComposeStartPoint = m_iStartBar + m_dblStartPoint / POINTS_PER_BAR ; + + if( g_lstOpusStages.size()>0 ){ + SetPlayTimer(false, m_tTimer, m_tAccuracy); + GenerateCompose(); + + int iPlayMode = TYPE_COMPOSE | ( g_iPreStage==0 ? TYPE_AUDIO : TYPE_SONG ); + f_MM_Play( Handle, dblComposeStartPoint, iPlayMode ); + + SetPlayTimer( true, m_tTimer, m_tAccuracy, Handle ); + } + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::PlayClick(TObject *Sender) +{ + if( g_lstOpusStages.size()==0 ) + return; + + Perform( UM_STOP, STOP_USESTYLE|STOP_PRESTYLE|STOP_AUDSTYLE, 0 ); + m_pContentPanel->SetFocus(); + GenerateCompose(); + + double dblAudioStartPoint = m_iStartBar + m_dblStartPoint / POINTS_PER_BAR; + + if( g_bRecProtect && g_bShowProtectMsg ){ + MessageForm->ShowMessage( "ʹշѷ񣬽\n\nӰ챣ĸ", + MB_ICONINFORMATION|MB_OK|MB_UNCHECKED, "ʾ" ); + g_bShowProtectMsg = !MessageForm->m_pbCheck->Checked; + } + + int iPlayMode = TYPE_COMPOSE | ( g_iPreStage==0 ? TYPE_AUDIO : TYPE_SONG ); + HRESULT hr = f_MM_Play( Handle, dblAudioStartPoint, iPlayMode ); + + if( hr==S_OK && !m_pContentPanel->IsPlaying() ){ + SetPlayTimer( true, m_tTimer, m_tAccuracy, Handle ); + + m_pContentPanel->Play(true); + m_btnRecord->Enabled = false; + m_btnPlay->Visible = false; + m_btnPlay->Enabled = false; + m_btnPause->Visible = true; + m_btnStop->Enabled = true; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::PauseClick(TObject *Sender) +{ + if (m_pContentPanel->IsPlaying()) { + SetPlayTimer(false, m_tTimer, m_tAccuracy); + + f_MM_Stop(); + + m_nVolLevel = 0; + m_pbVolLevel->Invalidate(); + + m_pContentPanel->Play(false); + } + + m_btnPlay->Visible = true; + m_btnPlay->Enabled = !g_lstOpusStages.empty(); + m_btnPause->Visible = false; +} +//--------------------------------------------------------------------------- + +HRESULT __fastcall TMainForm::AutoRecognition( int iMode ) +{ + int nOffsetBars, nValidBars; + f_MM_GetMelodyBars( &nOffsetBars, &nValidBars ); + + TOpusStageList *lstStagesBefore = NULL, + *lstStagesAfter = NULL; + UINT idLoc = -1, idStyle = -1; + + int iType = g_Undo.GetUndoType(); + + if( iType>=UNDO_AUDIO_ERASE && iType<=UNDO_AUDIO_RECORD ){ + if( g_pUseStyle && g_pUseStyle->pStyle ){ + idLoc = g_pUseStyle->pStyle->idLoc; + idStyle = g_pUseStyle->pStyle->idStyle; + } + + g_Theme.Set( idLoc, idStyle, g_lstOpusStages ); + + lstStagesBefore = new TOpusStageList; + lstStagesAfter = new TOpusStageList; + + g_Theme.Get( idLoc, idStyle, *lstStagesBefore ); + } + + if( nValidBars==0 ){ + String msg = L"Ч"; + + if( iMode==MODE_RECORD ) + msg += L"\n¼豸¼"; + + MessageForm->ShowMessage( msg, MB_OK | MB_ICONERROR); + + if( iType>=UNDO_AUDIO_ERASE && iType<=UNDO_AUDIO_RECORD ){ + if( g_lstOpusStages.empty() ){ + g_Undo.CancelUndo(); + f_MM_CancelAddUndo(); + } + else{ + f_MM_AddUndoAfter( 1, &g_iSelAudio ); + g_Undo.SetUndoExtra( idLoc, idStyle, 0, lstStagesBefore, lstStagesAfter ); + g_Theme.Clear(); + } + } + + m_btnPlay->Enabled = false; +// g_bAudioLoaded = false; + g_bWeakup = false; + + g_iMelodyKey = -1; + + for( int i=g_aAudioTracks[0]->lstBars.size()-1; i>=0; i-- ){ + delete g_aAudioTracks[0]->lstBars[i]; + } + + g_aAudioTracks[0]->lstBars.clear(); + } + else{ + if( iMode==MODE_LOAD ){ + g_aAudioTracks[0]->Hide(false); + + for (int i = 0; i < nValidBars; i++) { + TWaveBar* pBar = new TWaveBar; + + for( int j=0; jaVols[j] = f_MM_GetAudioVolume( 0, i + j/(double)POINTS_PER_BAR ); + } + + g_aAudioTracks[0]->lstBars.push_back(pBar); + } + + } + else{ + for (int i = 0; i < nOffsetBars; i++) { + delete g_aAudioTracks[0]->lstBars.front(); + g_aAudioTracks[0]->lstBars.erase( g_aAudioTracks[0]->lstBars.begin() ); + } + + while( g_aAudioTracks[0]->lstBars.size()>nValidBars ){ + delete g_aAudioTracks[0]->lstBars.back(); + g_aAudioTracks[0]->lstBars.pop_back(); + } + } + + AudioEffectsDefault( 0 ); + + SetMelodyNotes( nValidBars ); + + if( AutoChords()==S_OK ){ + if( iType>=UNDO_AUDIO_ERASE && iType<=UNDO_AUDIO_RECORD ){ + TAudioTrack* pAudio = CopyAudioTrack( 0, 0, nValidBars ); + g_Theme.Get( idLoc, idStyle, *lstStagesAfter ); + + f_MM_AddUndoAfter( 1, &g_iSelAudio ); + TUndoLite* pUndo = g_Undo.GetLastLite(); + pUndo->pAfter = pAudio; + pUndo->iEnd = g_iMelodyKey; + g_Undo.SetUndoExtra( idLoc, idStyle, 0, lstStagesBefore, lstStagesAfter ); + } + + ((TUseStylePanel*)m_pUseStylePanel)->InitOpus( g_pPreStyle, g_iPreStage ); + + m_UseStyleHeight = m_UseStyleHeight + m_PreStyleHeight - TOOLPAL_MINHEIGHT; + m_PreStyleHeight = TOOLPAL_MINHEIGHT; + + m_pUseStylePanel->SetBounds( m_pUseStylePanel->Left, + m_pUseStylePanel->Top, + m_pUseStylePanel->Width, + m_UseStyleHeight ); + m_pPreStylePanel->SetBounds( m_pPreStylePanel->Left, + m_pUseStylePanel->Top + m_UseStyleHeight, + m_pPreStylePanel->Width, + m_PreStyleHeight ); + + GenerateCompose(); + + m_iStartBar = 0; + m_dblStartPoint = 0; + m_dwLastVol = 0; + m_pContentPanel->SetPlayPoint( 0, 0 ); + } + } + + if( nValidBars==0 ) + SetMode( VIEW_INIT, true ); + else if( g_iViewMode==VIEW_STYLE ) + m_pContentPanel->InvalidateShowBars(); + else + SetMode( VIEW_STYLE ); + + m_btnRecord->Down = false; + m_btnPlay->Visible = true; + m_btnPlay->Enabled = !g_lstOpusStages.empty(); + m_btnRecord->Enabled = RecordEnabled(); + m_btnPause->Visible = false; + m_btnStop->Enabled = false; + m_btnSave->Enabled = !g_lstOpusStages.empty(); + m_btnUpload->Enabled = !g_bUpdateMandatory && !g_lstOpusStages.empty(); + //g_bSongSaved = false; + m_bFromFile = false; + m_cbKey->DefItemIndex = g_iMelodyKey; + m_cbKey->Enabled = g_iMelodyKey>=0; +} +//--------------------------------------------------------------------------- + +HRESULT __fastcall TMainForm::AutoChords() +{ + HRESULT hRet = S_OK; + + int nStageNum = 0,//g_lstRawStages.size(), + nBarNum = g_aAudioTracks[0]->lstBars.size(), + nChordNum = 0; + TBarChords *aChords = new TBarChords[nBarNum]; + + int *aStages = NULL; + + DebugPrint("//////////////////ֶ/////////////////////"); + if( nStageNum>0 ){ + aStages = new int[nStageNum]; + } + else { + aStages = new int[nBarNum]; + } + + DebugPrint("CM_AutoChords"); + hRet = f_CM_AutoChords( g_iMelodyKey, &nChordNum, aChords, + &nStageNum, aStages ); + + if( hRet==0 ) { + vector lstStages; + TBarList lstBars; + + DebugPrint("//////////////////ֶ/////////////////////"); + for (int i = 0; i < nStageNum; i++) { + lstStages.push_back(aStages[i]); + DebugPrint( " %d ", aStages[i] ); + } + + DebugPrint("///////////////////////////////////////"); + for( int i=0; iiBarKey = g_iMelodyKey; + memcpy( &pBar->aChords, &aChords[i], sizeof(TBarChords) ); + DebugPrint( " %d-%d %d-%d %d-%d %d-%d", + pBar->aChords.iKey[0], + pBar->aChords.iType[0], + pBar->aChords.iKey[1], + pBar->aChords.iType[1], + pBar->aChords.iKey[2], + pBar->aChords.iType[2], + pBar->aChords.iKey[3], + pBar->aChords.iType[3] ); + lstBars.push_back( pBar ); + } + + g_Theme.Build( lstBars, lstStages ); + } + else { + DebugPrint("AutoChords error.\n"); + } + + SAFE_DELETE_ARRAY(aChords); + SAFE_DELETE_ARRAY(aStages); + + return hRet; +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::OnLoadMelody(TObject *Sender) +{ + if( !g_pPreStyle || g_pPreStyle->nSegNum[SEGTYPE_VAR]==0 ){ + MessageForm->ShowMessage( "ΪԤӰƬΣ", MB_ICONERROR|MB_OK ); + + return; + } + + OnCreateNewProject( NULL ); + + if( !g_Theme.Empty() ) + return; + + // ָļ + wstring strFileName; + + int iTS = g_iMelodyTimeSignature, iTempo = g_nMelodyTempo; + + TImportForm *imF = new TImportForm(NULL, g_strLastImportFile.c_str(), iTS, iTempo, 0); + if(imF->ShowModal() == mrOk) + { + strFileName = imF->MediaFilePath.c_str(); + iTS = imF->TS; + iTempo = imF->Tempo; + } + delete imF; + + if( strFileName.length() > 0 ){ + SetMode( VIEW_INIT ); +// g_bAudioLoaded = false; + + m_bFromFile = true; + int iFileType = FILETYPE_MIDI; + if( ExtractFileExt( strFileName.c_str() ).CompareIC(".mid")==0 ){ + g_bMidiMelody = true; + } + else{ + g_bMidiMelody = false; + + ChangeTT( true, iTS ); + ChangeTT( false, iTempo ); + + if( ExtractFileExt( strFileName.c_str() ).CompareIC(".wav")==0){ + iFileType = FILETYPE_WAVE; + } + else if( ExtractFileExt( strFileName.c_str() ).CompareIC(".mp3")==0){ + iFileType = FILETYPE_MP3; + } + } + + TProgressForm *frmProgress = new TProgressForm(NULL); + + int ret = frmProgress->MM_Load( strFileName.c_str(), iFileType ); + int extra = frmProgress->GetOpertaionResult(); + //TMessage msgReturn = frmProgress->m_MsgTransparent; + + delete frmProgress; + + if( ret==mrOk ){ + g_strLastImportFile = strFileName.c_str(); + + if( g_bMidiMelody ){ + f_MM_GetMelodyInfo( &iTS, &iTempo ); + ChangeTT( true, iTS ); + ChangeTT( false, iTempo ); + } + + AutoRecognition( MODE_LOAD ); + + //PostMessage( Handle, msgReturn.Msg, msgReturn.WParam, msgReturn.LParam ); + } + else{ + if( extra!=e_UserCanceled ) + ShowErrorMessage( ret, "ʧܣ" ); + + g_bMidiMelody = false; + } + } +} +// --------------------------------------------------------------------------- + +void __fastcall TMainForm::PanelMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) +{ + if( m_btnRecord->Down ) + return; + + if( w_bDraging ){ + TWinControl* pSender = (TWinControl*)Sender; + TPoint pt( X, Y ); + pt = pSender->ClientToScreen( pt ); + + if( w_iDragMode==DM_ADJUSTHEIGHT ){ + int yMin = Top + PANEL_TOP + TOOLPAL_MINHEIGHT, + yMax = Top + Height - STATE_HEIGHT - TOOLPAL_MINHEIGHT; + + if( pSender==m_pPreStylePanel ){ + yMax -= TOOLPAL_MINHEIGHT; + } + else{ + yMin += TOOLPAL_MINHEIGHT; + } + + w_yImgDrag = pt.Y - w_yOffDrag; + + if( w_yImgDragyMax ){ + w_yImgDrag = yMax; + w_yOffDrag = 0; + SetCursorPos( pt.X, yMax ); + } + + if( w_yImgDrag!=w_yOldDrag ){ + m_pUseStylePanel->ShowDragImg(); + m_pPreStylePanel->ShowDragImg(); + m_pAudStylePanel->ShowDragImg(); + } + + w_yOldDrag = w_yImgDrag; + } + else if( w_iDragMode==DM_ADJUSTWIDTH ){ + int xMin = Left + PANEL_BOUND, + xMax = Left + Width - PANEL_BOUND; + + if( g_iToolPanelShow==0 ){ + xMin += CONTENT_MINWIDTH; + xMax -= TOOLPAL_MINWIDTH; + } + else{ + xMin += TOOLPAL_MINWIDTH; + xMax -= CONTENT_MINWIDTH; + } + + w_xImgDrag = pt.X - w_xOffDrag; + + if( w_xImgDragxMax ){ + w_xImgDrag = xMax; + w_xOffDrag = 0; + SetCursorPos( xMax, pt.Y ); + } + + if( w_xImgDrag!=w_xOldDrag ){ + if( m_pUseStylePanel->Visible ){ + m_pUseStylePanel->ShowDragImg(); + m_pPreStylePanel->ShowDragImg(); + m_pAudStylePanel->ShowDragImg(); + } + else if( m_pChordPanel->Visible ) + m_pChordPanel->ShowDragImg(); + else + m_pTrackPanel->ShowDragImg(); + + m_pContentPanel->ShowDragImg(); + } + + w_yOldDrag = w_yImgDrag; + w_xOldDrag = w_xImgDrag; + } + else if( w_iDragMode==DM_ADJUSTHEADER ){ + int xMin = Left + m_pContentPanel->Left + MIN_HDR_WIDTH, + xMax = Left + m_pContentPanel->Left + MAX_HDR_WIDTH; + + w_xImgDrag = pt.X - w_xOffDrag; + + if( w_xImgDragxMax ){ + w_xImgDrag = xMax; + w_xOffDrag = 0; + SetCursorPos( xMax, pt.Y ); + } + + if( w_xImgDrag!=w_xOldDrag ){ + m_pContentPanel->ShowDragImg(); + } + + w_yOldDrag = w_yImgDrag; + w_xOldDrag = w_xImgDrag; + } + else if( w_iDragMode==DM_ADJUSTSTYLE ){ + TCommonItem* pDragItem = ((TStylePanel*)Sender)->GetDragItem(); + if( !((TStylePanel*)m_pUseStylePanel)->GetDropItem() ) + ((TStylePanel*)m_pUseStylePanel)->SetDropItem( pDragItem ); + if( !((TStylePanel*)m_pPreStylePanel)->GetDropItem() ) + ((TStylePanel*)m_pPreStylePanel)->SetDropItem( pDragItem ); + if( !m_pContentPanel->GetDropItem() ) + m_pContentPanel->SetDropItem( pDragItem ); + + w_xImgDrag = pt.x - w_xOffDrag; + w_yImgDrag = pt.Y - w_yOffDrag; + + if( w_yImgDrag!=w_yOldDrag || w_xImgDrag!=w_xOldDrag ){ + bool bContentDrop = m_pContentPanel->ShowDragImg(); + bool bUseDrop = m_pUseStylePanel->ShowDragImg(); + bool bPreDrop = m_pPreStylePanel->ShowDragImg(); + bool bAudDrop = m_pAudStylePanel->ShowDragImg(); + + if( bContentDrop || bUseDrop || bPreDrop || bAudDrop ){ + if( Screen->Cursor!=crDefault ) + Screen->Cursor = crDefault;//crDrag; + } + else{ + if( Screen->Cursor!=crNoDrop ) + Screen->Cursor = crNoDrop; + } + } + + w_xOldDrag = w_xImgDrag; + w_yOldDrag = w_yImgDrag; + } + else if( w_iDragMode==DM_ADJUSTSTAGE || w_iDragMode==DM_ADJUSTAUDIO ){ + w_xImgDrag = pt.x - w_xOffDrag; + w_yImgDrag = pt.Y - w_yOffDrag; + + if( w_yImgDrag!=w_yOldDrag || w_xImgDrag!=w_xOldDrag ){ + bool bContentDrop = m_pContentPanel->ShowDragImg(); + + if( bContentDrop ){ + if( Shift.Contains( ssCtrl ) ){ + if( Screen->Cursor!=crDrag ) + Screen->Cursor = crDrag; + } + else{ + if( Screen->Cursor!=crDefault ) + Screen->Cursor = crDefault;//crDrag; + } + } + else{ + if( Screen->Cursor!=crNoDrop ) + Screen->Cursor = crNoDrop; + } + } + + w_xOldDrag = w_xImgDrag; + w_yOldDrag = w_yImgDrag; + } + } + else{ + if( Shift.Empty() ){ + if( Sender!=m_pUseStylePanel ) + ((TStylePanel*)m_pUseStylePanel)->SetFocusedItem( NULL, -1, 0 ); + + if( Sender!=m_pPreStylePanel ) + ((TStylePanel*)m_pPreStylePanel)->SetFocusedItem( NULL, -1, 0 ); + + if( Sender!=m_pAudStylePanel ) + ((TStylePanel*)m_pAudStylePanel)->SetFocusedItem( NULL, -1, 0 ); + } + + ((TPanel*)Sender)->Perform( UM_MOUSEMOVE, Shift.ToInt(), MAKELONG( X, Y ) ); + } +} +// --------------------------------------------------------------------------- + +void __fastcall TMainForm::PanelMouseUp(TObject *Sender, TMouseButton Button, + TShiftState Shift, int X, int Y) +{ + if( m_btnRecord->Down ) + return; + + if( w_bDraging ){ + ReleaseCapture(); + w_bDraging = false; + + TWinControl* pSender = (TWinControl*)Sender; + TPoint pt( w_xImgDrag, w_yImgDrag ); + pt = ScreenToClient( pt ); + + if( w_iDragMode==DM_ADJUSTHEIGHT ){ + int hStyle = m_pContentPanel->Height, + hUse = m_UseStyleHeight, + hPre = m_PreStyleHeight, + hAud = hStyle - hUse - hPre; + + if( pSender==m_pPreStylePanel ){ + hUse = pt.Y - m_pUseStylePanel->Top; + if( hUse m_pAudStylePanel->Top - TOOLPAL_MINHEIGHT ){ + hPre = TOOLPAL_MINHEIGHT; + hAud = hStyle - hUse - hPre; + if( hAudShowDragImg(false); + } + else{ + hAud = m_pContentPanel->Top + hStyle - pt.Y; + if( hAudTop+TOOLPAL_MINHEIGHT ){ + hPre = TOOLPAL_MINHEIGHT; + hUse = hStyle - hAud - hPre; + if( hUseShowDragImg(false); + ((TStylePanel*)m_pPreStylePanel)->ShowDragImg(false); + ((TStylePanel*)m_pAudStylePanel)->ShowDragImg(false); + + int l = m_pUseStylePanel->Left, + t = m_pUseStylePanel->Top, + w = m_pUseStylePanel->Width; + + m_pUseStylePanel->SetBounds( l, t, w, hUse ); + m_pPreStylePanel->SetBounds( l, t+hUse, w, hPre ); + m_pAudStylePanel->SetBounds( l, t+hUse+hPre, w, hAud ); + + m_UseStyleHeight = hUse; + m_PreStyleHeight = hPre; + } + else if( w_iDragMode==DM_ADJUSTWIDTH ){ + if( m_pUseStylePanel->Visible ){ + m_pUseStylePanel->ShowDragImg(false); + m_pPreStylePanel->ShowDragImg(false); + m_pAudStylePanel->ShowDragImg(false); + } + else if( m_pChordPanel->Visible ) + m_pChordPanel->ShowDragImg(false); + else + m_pTrackPanel->ShowDragImg(false); + + m_pContentPanel->ShowDragImg( false ); + + if( pSender==m_pContentPanel ){ + m_ToolpalWidth = pt.x - PANEL_BOUND; + } + else{ + m_ToolpalWidth = Width - pt.X - PANEL_BOUND; + } + + ViewLayout(); + } + else if( w_iDragMode==DM_ADJUSTHEADER ){ + m_pContentPanel->ShowDragImg( false ); + } + else if( w_iDragMode==DM_ADJUSTSTYLE ){ + int iKeyState = Shift.ToInt(); + ((TStylePanel*)m_pUseStylePanel)->ShowDragImg( false, iKeyState ); + ((TStylePanel*)m_pPreStylePanel)->ShowDragImg( false, iKeyState ); + ((TStylePanel*)m_pAudStylePanel)->ShowDragImg( false, iKeyState ); + m_pContentPanel->ShowDragImg( false, iKeyState ); + } + else if( w_iDragMode==DM_ADJUSTSTAGE || w_iDragMode==DM_ADJUSTAUDIO ){ + m_pContentPanel->ShowDragImg( false, Shift.ToInt() ); + } + + delete w_imgDrag; + w_imgDrag = NULL; + } + else{ + if( Button==mbLeft ) + Shift << ssLeft; + else if( Button==mbRight ) + Shift << ssRight; + + ((TPanel*)Sender)->Perform( UM_MOUSEUP, Shift.ToInt(), MAKELONG( X, Y ) ); + } + + if( !m_pContentPanel->IsStyleBrush() && Screen->Cursor!=crDefault ){ + if( Screen->Cursor>=crBrush && Screen->Cursor<=crBrushNo ){ + m_pContentPanel->CancelBrush(); + } + + Screen->Cursor = crDefault; + } +} +// --------------------------------------------------------------------------- + +void __fastcall TMainForm::UMStop(TMessage &msg) +{ + DWORD dwSpec = msg.WParam; + + if( ( dwSpec & STOP_CONTENT ) && m_pContentPanel->IsPlaying() ) + StopClick(NULL); + if( dwSpec & STOP_USESTYLE ) + ((TStylePanel*)m_pUseStylePanel)->Stop(); + if( dwSpec & STOP_PRESTYLE ) + ((TStylePanel*)m_pPreStylePanel)->Stop(); + if( dwSpec & STOP_AUDSTYLE ) + ((TStylePanel*)m_pAudStylePanel)->Stop(); +} +// --------------------------------------------------------------------------- + +void __fastcall TMainForm::UMShowBrush(TMessage &msg) +{ + if( g_lstOpusStages.size()>0 ){ + if( g_iViewMode==VIEW_STYLE ){ + TCommonItem* pItem = (TCommonItem*)msg.LParam; + m_pContentPanel->BeginBrush( pItem ); + Screen->Cursor = crBrushNo; + } + } +} +// --------------------------------------------------------------------------- + +void __fastcall TMainForm::TabClick(TObject *Sender) +{ + if( g_iViewMode!=VIEW_INIT ){ + TPNGButton* pBtn = (TPNGButton*)Sender; + if( pBtn==m_tabAudio && !m_tabAudio->Down ){ + SetMode( VIEW_TRACK ); + } + else if( pBtn==m_tabChord && !m_tabChord->Down ){ + SetMode( VIEW_CHORD ); + } + else if( pBtn==m_tabStyle && !m_tabStyle->Down ){ + SetMode( VIEW_STYLE ); + } + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::TTClick(TObject* Sender) +{ + if( !g_Theme.Empty() ){// g_lstRawBars.size()>0 ){ + if( Sender==m_btnTS ){ + String strMsg = "½̲ſԸıģ"; + MessageForm->ShowMessage( strMsg, MB_ICONERROR|MB_OK ); + return; + } + else{ + String strMsg = "棺ıٶȽ֧¼"; + + if( g_aAudioTracks.size()>1 || g_aAudioTracks[0]->lstBars.size()>0 ){ + strMsg += "\nԼƵ"; + } + + strMsg += ",Ҳɳ"; + MessageForm->ShowMessage( strMsg, MB_ICONINFORMATION|MB_OK ); + } + } + + PostMessage( Handle, UM_TTSETUP, 0, 0 ); +} +//--------------------------------------------------------------------------- + +//add by tj 2013/12/24 17:47 +void __fastcall TMainForm::UMTTSetup(TMessage &Message) +{ +/* if( g_bAudioLoaded ) { + String strMsg = "½̲ſԸıĻٶȣ"; + MessageForm->ShowMessage( strMsg, MB_ICONERROR|MB_OK ); + return; + } +*/ + Perform( UM_STOP, STOP_ALL, 0 ); + + if( m_KeyBoard->Visible ){ + m_KeyBoard->ShowKeyboard( false ); + if( m_btnKeyboard->Down ) + m_btnKeyboard->Down = false; + } + + TSetUpForm *SetUpForm = new TSetUpForm(this); + + if(SetUpForm->ShowModal()==mrOk) + { + if( SetUpForm->m_nTempo!=g_iMelodyTimeSignature || + SetUpForm->m_iTS!=g_iMelodyTimeSignature ) { + ChangeTT( true, SetUpForm->m_iTS ); + ChangeTT( false, SetUpForm->m_nTempo ); + } + }else { + f_MM_SetTempo( g_nMelodyTempo ); + f_MM_SetTimeSignature( g_iMelodyTimeSignature ); + } + + delete SetUpForm; +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::UMChangeTT(TMessage &Message) +{ + ChangeTT( Message.WParam, Message.LParam ); +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::ChangeTT( bool bTS, int iValue ) +{ + if( bTS && iValue!=g_iMelodyTimeSignature ){ + if( iValue>=0 ){ + SetMelodyTS( iValue ); + g_infoSong.iTS = iValue; + SetMode( VIEW_INIT ); + SelectStyle(); + } + + m_btnTS->Caption = g_strTimeSignature[g_iMelodyTimeSignature]; + m_btnTS->Invalidate(); + + ((TStylePanel*)m_pAudStylePanel)->InitItems(); + if( iValue>=0 ) + ((TStylePanel*)m_pPreStylePanel)->InitItems(); + } + + if( !bTS && iValue!=g_nMelodyTempo ){ + SetMelodyTempo( iValue ); + g_infoSong.iTempo = iValue; + m_btnTempo->Caption = IntToStr(g_nMelodyTempo); + m_btnTempo->Invalidate(); + +// if( g_iViewMode==VIEW_TRACK ) + m_pContentPanel->InitialVars(); +// m_pContentPanel->Invalidate(); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::PreStageChange(TComboBoxItem *Sender, int Index) +{ + if( m_cbPreStage->DefItemIndex!=Index ) + m_cbPreStage->DefItemIndex = Index; + + if( Index!=g_iPreStage ){ + if( g_Theme.Empty() ){ + g_iPreStage = Index; + return; + } + + StopClick( NULL ); + + //ԤƬ + if ( Sender!=NULL && !g_lstOpusStages.empty() ){ + TOpusStageList* lstStages = NULL; + TAudioTrackList* lstAudio = NULL; + + if( g_iPreStage>0 && Index<3 ){ + lstStages = new TOpusStageList; + lstAudio = new TAudioTrackList; + + ((TUseStylePanel*)m_pUseStylePanel)->CopyUndoBars( 0, GetBarCount()-1, lstStages, lstAudio, true ); + + if( g_aAudioTracks.size()>1 ){ +// int iTracks = g_Audio.GetTrackBit(); + f_MM_AddUndoBefore( -1, NULL ); + } + } + + g_Undo.AddUndo( UNDO_PRESET, 0, g_iPreStage, Index, (void*)lstStages, NULL ); + g_Undo.SetUndoExtra( 0, 0, 0, (void*)lstAudio, NULL ); + } + + if( Index==0 ) + g_aAudioTracks[0]->Hide(false); + else if( Index==3 && g_iPreStage==0 ) + DuplicateRawBars(); + + g_iPreStage = Index; + + if( !g_Theme.Empty() && g_iPreStage<3 ){ + if( g_Theme.GetKey()!=g_iMelodyKey ){ + g_iMelodyKey = g_Theme.GetKey(); + m_cbKey->DefItemIndex = g_iMelodyKey; + } + + ((TUseStylePanel*)m_pUseStylePanel)->InitOpus( g_pPreStyle, g_iPreStage ); + + SetMode( VIEW_STYLE, true ); + GenerateCompose(); + } + + m_btnPlay->Enabled = !g_lstOpusStages.empty(); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::UMStageChanged(TMessage &Message) +{ + int iPreset = Message.WParam; + + if( m_cbPreStage->DefItemIndex!=iPreset ){ + m_cbPreStage->DefItemIndex = iPreset; + g_iPreStage = iPreset; + } + + bool bEnable = !g_lstOpusStages.empty(); + m_btnPlay->Enabled = bEnable; + m_btnSave->Enabled = bEnable; + m_btnUpload->Enabled = bEnable && !g_bUpdateMandatory; + m_btnRecord->Enabled = bEnable ? RecordEnabled() : false; +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::VolLevelPaint(TObject *Sender) +{ + int xPos = 0; + for (int i = 0; i < m_nVolLevel; i++) { + if (i < 22) { + m_pbVolLevel->Canvas->Brush->Color = RGB(70, 154, 8); + m_pbVolLevel->Canvas->Pen->Color = RGB(70, 154, 8); + } + else if (i < 32) { + m_pbVolLevel->Canvas->Brush->Color = RGB(221, 241, 2); + m_pbVolLevel->Canvas->Pen->Color = RGB(221, 241, 2); + } + else if (i < 42) { + m_pbVolLevel->Canvas->Brush->Color = RGB(221, 122, 0); + m_pbVolLevel->Canvas->Pen->Color = RGB(221, 122, 0); + } + else if (i < 52) { + m_pbVolLevel->Canvas->Brush->Color = RGB(215, 78, 2); + m_pbVolLevel->Canvas->Pen->Color = RGB(215, 78, 2); + } + else { + m_pbVolLevel->Canvas->Brush->Color = RGB(255, 0, 0); + m_pbVolLevel->Canvas->Pen->Color = RGB(255, 0, 0); + } + + m_pbVolLevel->Canvas->Rectangle(xPos, 0, xPos + 2, + m_pbVolLevel->Height); + + xPos += 3; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::OnSaveAs(TObject *Sender) +{ + SaveAs( SAVE_ALL ); +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::SaveAs( int iComb ){ + int iSaveType = iComb & 0x0F00, + iSaveTrack = iComb & 0xFF; + TSaveForm *saveForm = new TSaveForm( NULL, iSaveType ); + + if( saveForm->ShowModal()==mrOk ){ + String strFileName = saveForm->FilePath; + g_iLastSaveType = saveForm->SaveType; + + AnsiString strTitle = TPath::GetFileNameWithoutExtension( strFileName ); + strcpy( g_infoSong.strSongName, strTitle.c_str() ); + + if( saveForm->SaveType==FILETYPE_CPJ ){ + if( CanSaveProj()==E_PROJ_UNSAVEDTEMPSTYLE ){ //Ʒδ棬ʾ + if( mrOk==MessageForm->ShowMessage( "ȱڱ༭Ʒ", + MB_ICONQUESTION | MB_OKCANCEL, "湤" )){ + Application->MainForm->Perform( UM_SAVELOCALSTYLE, 0, 0 ); + } + else{ + goto Cleanup_Line; + } + } + + // 湤 + // · + TProgressForm *frmProgress = new TProgressForm(NULL); + int ret = frmProgress->Project_Save(strFileName.c_str()); + int eExtra = frmProgress->GetOpertaionResult(); + if( ret==mrOk && eExtra==0 ){ + MessageForm->ShowMessage("ļɹ", MB_OK | MB_ICONINFORMATION); + m_lblTitle->Caption = strTitle; + + g_strProjectName = strFileName.c_str(); + g_strLastProjSavePath = ExtractFilePath( strFileName.c_str() ).c_str(); + g_bAutoOpenProjectEnable = true; //add by tj 2014/05/15 + SetInitVar(); + } + else if( eExtra!=0 && eExtra!=e_UserCanceled ){ + MessageForm->ShowMessage( "ļʧ!", MB_ICONERROR|MB_OK ); + } + + delete frmProgress; + } + else{ + Perform( UM_STOP, STOP_CONTENT | STOP_USESTYLE, 0 ); + //ȱֹû޸ķ󲻲ֱӱ + GenerateCompose(); + + // ýļ + int iOperation = e_PO_Pay4Basic; + + if( saveForm->MediaOption & SAVE_COMPOSE ) + iOperation |= e_PO_Pay4Compose; + + if( saveForm->SaveType==FILETYPE_MIDI ) + iOperation |= e_PO_Pay4Midi; + else{ + if( iSaveType==SAVE_AUDIO && g_iSelAudio>1 || iSaveType!=SAVE_AUDIO + && (saveForm->MediaOption & SAVE_AUDIO) + && g_aAudioTracks.size()>2 ) + iOperation |= e_PO_Pay4Audios; + + if( (saveForm->MediaOption & SAVE_COMPOSE) && ( g_bExtFont + || ((TUseStylePanel*)m_pUseStylePanel)->Charge4Fonts()) ) + iOperation |= e_PO_Pay4Fonts; + } + + int iSaveOption = saveForm->MediaOption; + int iFileType = saveForm->SaveType; + + if( iSaveType==SAVE_AUDIO || iSaveType==SAVE_COMPOSE ) + iSaveOption += iSaveTrack; + + //ȼļЧ + int iFileHandle = FileOpen( strFileName, fmOpenReadWrite ); + bool bCreate = false; + + if( iFileHandle<0 ){ + iFileHandle = FileCreate( strFileName ); + bCreate = true; + } + + if( iFileHandle<0 ){ + ShowErrorMessage( e_OpenFileFailed, L"ʧ!" ); + goto Cleanup_Line; + } + else{ + FileClose( iFileHandle ); + + if( bCreate ) + DeleteFile( strFileName ); + } + + // Ƿɸ + if( iFileType==FILETYPE_MP3 && ( iSaveOption==(SAVE_COMPOSE|SAVE_AUDIO) + || iSaveOption==SAVE_COMPOSE && g_aAudioTracks.size()==1 ) + && !m_strUploadFile.IsEmpty() && FileExists(m_strUploadFile, false) + && g_Undo.GetLastLite()==u_pUploadLite ){ + if( m_strUploadFile.CompareIC( strFileName )){ + CopyFile( m_strUploadFile.c_str(), strFileName.c_str(), false ); + } + + g_strLastSavePath = ExtractFilePath( strFileName.c_str() ).c_str(); + g_iLastSaveOption = iSaveOption & 0x0F00; + + String strMessage = "ýļɹ"; + MessageForm->ShowMessage( strMessage, MB_OK|MB_ICONINFORMATION, "" ); + } + else{ + SaveMedia( iOperation, iSaveOption, iFileType, strFileName ); + } + } + } + +Cleanup_Line: + delete saveForm; +} +//--------------------------------------------------------------------------- + +int __fastcall TMainForm::SaveMedia( int iOperation, int iSaveOption, int iFileType, String strFileName, bool bUpload ) +{ + if( SOFTWARE_ID!=e_Pro_Lite ){ + if( !g_bLogon ) + Perform( UM_LOGIN, true, 0 ); + + if( !g_bLogon ) + return -1; + } + + bool bConfirm = false; + UINT nIdCount = 0, aIdStyle[MAX_STYLE_NUM]; + + for( int i=0; iaTracks.size(); j++ ){ + if( pStage->aTracks[j]->iStyleLoc==0 ){ + int id = pStage->aTracks[j]->iStyleId; + + bool bExist = false; + for( int j=0; j=MAX_STYLE_NUM ){ + char buf[200]; + sprintf( buf, "ʹõķ%dֻܱΪ̣", MAX_STYLE_NUM ); + MessageForm->ShowMessage( buf, MB_ICONERROR|MB_OK ); + + return -1; + } + else{ + aIdStyle[nIdCount++] = id; + } + } + } + } + } + + int nUserBalance = g_infoUser.accountInfo.balance, + nCost = 0, + arrCost[MAX_STYLE_NUM]; + + TProgressForm * dlgProgress = new TProgressForm(NULL); + int ret = dlgProgress->User_CheckPayment( iOperation, nIdCount, aIdStyle, arrCost, + &nCost, &nUserBalance ); + int eExtra = dlgProgress->GetOpertaionResult(); + delete dlgProgress; + + if( ret==mrOk ){ + g_infoUser.accountInfo.balance = nUserBalance; + + if( eExtra==0 || eExtra==e_VerifyInsufficient ){ + if( nCost==0 ){ + bConfirm = true; +// ShowMessage("balance=" + IntToStr(nUserBalance) + ", cost=" + IntToStr(nCost) + ", eExtra=" + IntToStr(eExtra)); + } + else{ + TPayMentForm *payMentForm = new TPayMentForm(NULL, iOperation, nIdCount, aIdStyle, + arrCost, nCost, nUserBalance); + bConfirm = ( mrYes==payMentForm->ShowModal() ); + delete payMentForm; + + if( !bConfirm ) + eExtra = e_UserCanceled; + } + } + } + + if( bConfirm ){ + TProgressForm * dlgProgress = new TProgressForm(NULL); + + int ret = dlgProgress->MM_SaveMedia( iSaveOption, iFileType, strFileName.c_str(), + iOperation, nIdCount, aIdStyle ); + eExtra = dlgProgress->GetOpertaionResult(); + delete dlgProgress; + + if( ret==mrOk ){ + bool bTip = false; + for( int i=0; i0 ){ + bTip = true; + break; + } + } + + if( bTip ){ + //֧¼ + g_bRecProtect = IsProtected(); + f_MM_SetRecordProtect( g_bRecProtect ); + AnsiString strProjectName = g_strAutoProjName.c_str(); + SaveProject( strProjectName.c_str() ); + g_bProjStylePaid = true; + } + + if( bUpload ){ + m_strUploadFile = strFileName; + u_pUploadLite = g_Undo.GetLastLite(); + } + else{ + g_strLastSavePath = ExtractFilePath( strFileName.c_str() ).c_str(); + g_iLastSaveOption = iSaveOption & 0x0F00; + + if( iFileType==FILETYPE_MP3 && ( iSaveOption==(SAVE_COMPOSE|SAVE_AUDIO) + || iSaveOption==SAVE_COMPOSE && g_aAudioTracks.size()==1 )){ + m_strUploadFile = strFileName; + u_pUploadLite = g_Undo.GetLastLite(); + } + + MessageForm->ShowMessage( "ýļɹ", MB_OK|MB_ICONINFORMATION, "" ); + + if( bTip ){ + String strMessage = "֧뼰ʱ湤̡\n\nǷ棿"; + if( mrYes==MessageForm->ShowMessage( strMessage, MB_YESNO|MB_ICONQUESTION, "" ) ){ + PostMessage( Handle, UM_SAVEPROJECT, SAVE_PROJECT, 0 ); + } + } + } + } + else if( !bUpload && eExtra!=0 && eExtra!=e_UserCanceled ){ + ShowErrorMessage( eExtra, L" ʧ!" ); + } + } + else if( !bUpload && eExtra!=0 && eExtra!=e_UserCanceled ){ + ShowErrorMessage( eExtra, L"Ȩʧ!" ); + } + +// Update(); + + return eExtra; +} +//--------------------------------------------------------------------------- + +// add by lm 14.1.17 +void __fastcall TMainForm::UserNameClick(TObject *Sender) +{ + if(m_lblLogon->Tag == 0){ + // δ¼ + PostMessage(Handle, UM_LOGIN, 0, 0); + } + else if(m_lblLogon->Tag == 1){ + // ڵ¼ʱȡ¼ + Logout(); + } + else if(m_lblLogon->Tag == 2){ + TShowUserInfo *showUI = new TShowUserInfo(NULL); + TPoint p = ClientToScreen(TPoint(m_lblLogon->BoundsRect.Right - 250, + m_lblLogon->BoundsRect.Bottom)); + showUI->Top = p.Y - 5; + showUI->Left = p.X; + + if(int ret = showUI->ShowModal()){ + if(ret == 1) + Logout(); + else{ + int iOp = -1; + + if(ret == 2) + iOp = URL_USERCENTER; + else if(ret == 3) + iOp = URL_VIPMEMBER; + else if(ret == 4) + iOp = URL_RECHARGE; + + if( iOp>=0 ){ + char strURL[256]; + f_CS_GetWebPageURL( iOp, strURL ); + + if( strlen(strURL)>0 ) + ShellExecute(Handle, NULL, ((String)strURL).c_str(), NULL, NULL, SW_SHOWNORMAL); + } + } + } + + delete showUI; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::Logout() +{ + f_CS_Logoff(); +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::UMStartCDTimer(TMessage &Message) +{ + if(m_pCDTimer==NULL){ + m_pCDTimer = new TTimer(this); + m_pCDTimer->Interval = 1000; + m_pCDTimer->OnTimer = CDTimerProc; + m_pCDTimer->Tag = CODE_INTERVAL; + m_pCDTimer->Enabled = true; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::CDTimerProc(TObject* Sender) +{ + if(LoginForm!=NULL){ + LoginForm->OnCDTimer(m_pCDTimer->Tag); + } + + if( m_pCDTimer->Tag==0 ){ + ClearCDTimer(); + } + else{ + m_pCDTimer->Tag--; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::ClearCDTimer() +{ + if( m_pCDTimer ){ + m_pCDTimer->Enabled = false; + delete m_pCDTimer; + m_pCDTimer = NULL; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::OnLogin(TMessage &msg) +{ + if( g_bUpdateMandatory ) + return; + + bool bSync = msg.WParam; + AnsiString strUsernameBk = g_infoUser.strUserName, + strPasswordBk = g_infoUser.strPassword; + + LoginForm = new TLoginForm(NULL); + LoginForm->IsAntoLogin = g_bAutoLogin; + LoginForm->UserName = strUsernameBk; + LoginForm->PassWord = strPasswordBk; + + bool var_Repeat = false; + + do{ + if(LoginForm->ShowModal() == mrOk){ + g_bAutoLogin = LoginForm->IsAntoLogin; + AnsiString aStr = LoginForm->UserName; + strncpy(g_infoUser.strUserName, aStr.c_str(), aStr.Length() + 1); + + aStr = LoginForm->PassWord; + strncpy(g_infoUser.strPassword, aStr.c_str(), aStr.Length() + 1); + + if(LoginForm->IsLogin && !bSync){ + m_lblLogon->Caption = L"ڵ¼..."; + m_lblLogon->Tag = 1; + m_lblLogon->Hint = L"ȡ¼"; + f_CS_Login(&g_infoUser, false); + } + else{ + TProgressForm *dlgProgress = new TProgressForm(NULL); + int ret = 0; + if(LoginForm->IsLogin) + ret = dlgProgress->User_Login(); + else + ret = dlgProgress->User_Register(LoginForm->isEmailOrMobile); + + int eExtra = dlgProgress->GetOpertaionResult(); + delete dlgProgress; + + var_Repeat = false; + if( ret==mrOk && eExtra==0 ){ + if( g_infoUser.accountInfo.ID==0 ){ + DebugPrint( "Invalid user ID.\n" ); + } + + g_bLogon = true; + + g_bRecProtect = IsProtected(); + f_MM_SetRecordProtect( g_bRecProtect ); + + } + else if( eExtra!=0 && eExtra!=e_UserCanceled ){ + ShowErrorMessage( eExtra, LoginForm->IsLogin ? "¼ʧ!" : "עʧ!"); + + g_infoUser.strPassword[0] = 0; + LoginForm->PassWord = ""; + LoginForm->Confirm = ""; + if( eExtra==e_LoginPasswordError + || eExtra==e_LoginUserNotExist + || eExtra==e_UsernameExist){ + var_Repeat = TRUE; + } + } + } + } + else { + var_Repeat = false; + // ȡ¼ + strncpy(g_infoUser.strUserName, strUsernameBk.c_str(), strUsernameBk.Length() + 1); + strncpy(g_infoUser.strPassword, strPasswordBk.c_str(), strPasswordBk.Length() + 1); + + if( !LoginForm->IsAntoLogin && g_bAutoLogin ){ + g_bAutoLogin = false; + SetAutoLogin(false, g_infoUser.strUserName, NULL); + } + } + }while(var_Repeat); + + delete LoginForm; + LoginForm = NULL; +} +//---------------------------------------------------------------------------- + +void __fastcall TMainForm::OnKeyBoard(TObject *Sender) +{ +// m_KeyBoard->ShowKeyboard( !m_KeyBoard->Visible ); + Application->MainForm->Perform( UM_SHOW_KB, NULL, NULL ); +} +//---------------------------------------------------------------------------- + +bool __fastcall TMainForm::CheckPayment( int iOperation ) +{ + bool bPaid = false; + + if( !g_bLogon ){ + Perform( UM_LOGIN, true, 0 ); + } + + if( g_bLogon ){ + UINT nIdCount = 0, aIdStyle[MAX_STYLE_NUM]; + + for( int i=0; iaTracks.size(); j++ ){ + if( pStage->aTracks[j]->iStyleLoc==0 ){ + int id = pStage->aTracks[j]->iStyleId; + + bool bExist = false; + for( int j=0; j=MAX_STYLE_NUM ){ + char buf[200]; + sprintf( buf, "ʹõķ%dֻܱΪ̣", MAX_STYLE_NUM ); + MessageForm->ShowMessage( buf, MB_ICONERROR|MB_OK ); + + return false; + } + else{ + aIdStyle[nIdCount++] = id; + } + } + } + } + } + + int nUserBalance = g_infoUser.accountInfo.balance, + nCost = 0, + arrCost[MAX_STYLE_NUM]; + + TProgressForm * dlgProgress = new TProgressForm(NULL); + int ret = dlgProgress->User_CheckPayment( iOperation, nIdCount, aIdStyle, arrCost, + &nCost, &nUserBalance ); + + int eExtra = dlgProgress->GetOpertaionResult(); + delete dlgProgress; + + if( ret==mrOk ){ + g_infoUser.accountInfo.balance = nUserBalance; + + if( eExtra==0 || eExtra==e_VerifyInsufficient){ + bool bConfirm = true; + + if( nCost!=0 ){ + TPayMentForm *payMentForm = new TPayMentForm(NULL, iOperation, nIdCount, aIdStyle, + arrCost, nCost, nUserBalance); + bConfirm = ( mrYes==payMentForm->ShowModal() ); + delete payMentForm; + } + + if( bConfirm ){ + TProgressForm * dlgProgress = new TProgressForm(NULL); + + int ret = dlgProgress->User_ConfirmPayment( iOperation, nIdCount, + aIdStyle, &nUserBalance ); + int eExtra = dlgProgress->GetOpertaionResult(); + delete dlgProgress; + + if( ret==mrOk ){ + if( eExtra==0 ){ + bPaid = true; + g_infoUser.accountInfo.balance = nUserBalance; + + bool bTip = false; + for( int i=0; i0 ){ + bTip = true; + break; + } + } + + if( bTip ){ + g_bProjStylePaid = true; + String msg = "֧ɹ\n\nΪظ֧ס湤̡"; + MessageForm->ShowMessage( msg, MB_ICONINFORMATION|MB_OK, "ʾ" ); + } + } + else{ + ShowErrorMessage( eExtra, L"֧ʧ!" ); + } + } + } + } + else if( eExtra==e_InvalidStyleID ){ //ʧЧһʾ + ShowErrorMessage( eExtra, L"Ȩʧ!" ); + } + else{ + ShowErrorMessage( eExtra, L"Ȩʧ!" ); + } + } + } + + Update(); + + return bPaid; +} +//---------------------------------------------------------------------------- +void __fastcall TMainForm::SetFont( int idFont, bool bExtFont, bool bAddUndo ) +{ + int idOld = g_idFont, idNew = idFont; + bool bOld = g_bExtFont, bNew = bExtFont, + bSet = false; + + if( bExtFont!=g_bExtFont ){ + char aFiles[17][256]; + int num = 0; + if( bExtFont ){ + for( int i=0; i<17; i++ ){ + strcpy( aFiles[i], g_lstCZFonts[i]->strFileName ); + } + num = 17; + } + else{ + num = 1; + strcpy( aFiles[0], g_lstFonts[g_idFont]->strFileName ); + } + + if( f_MM_SetDefaultFont( num, aFiles )==S_OK ){ + g_bExtFont = bExtFont; + bSet = true; + } + else{ + + } + + m_btnExtFontOn->Visible = g_bExtFont; + m_btnExtFontOff->Visible = !g_bExtFont; + m_cbFontSelect->Enabled = !g_bExtFont; + } + else if( idFont!=g_idFont ){ + char strFile[1][256]; + strcpy( strFile[0], g_lstFonts[idFont]->strFileName ); + + int ret = f_MM_SetDefaultFont( 1, strFile ); + if( ret>=0 ){ + g_idFont = idFont; + strcpy( g_strSoundFont, g_lstFonts[idFont]->strFontName ); + + TComboBoxItem* pItem = m_cbFontSelect->GetItem( m_cbFontSelect->DefItemIndex ); + if( pItem->Tag != idFont ){ + for( int i=0; iItemsCount; i++ ){ + pItem = m_cbFontSelect->GetItem( i ); + + if( pItem->Tag==idFont ){ + m_cbFontSelect->DefItemIndex = i; + break; + } + } + } + + bSet = true; + } + else{ + m_cbFontSelect->OnChange = NULL; + m_cbFontSelect->DefItemIndex = g_idFont; + m_cbFontSelect->OnChange = FontSelectChange; + } + } + + if( bAddUndo && bSet ){ + TUndoLite* pLite = g_Undo.GetLastLite(); + + if( pLite && pLite->iType==UNDO_FONT_SET + && ( bOld==bNew && pLite->iBegin==idNew && pLite->iEnd==idOld + || idOld==idNew && (bool)pLite->pBefore==bNew && (bool)pLite->pAfter==bOld) ) + g_Undo.CancelUndo(); + else + g_Undo.AddUndo( UNDO_FONT_SET, 0, idOld, idNew, (void*)bOld, (void*)bNew ); + } +} +//---------------------------------------------------------------------------- + +void __fastcall TMainForm::FontSelectChange(TComboBoxItem *Sender, int Index) +{ + int iFont = Sender->Tag; + + if( iFont!=g_idFont ) + SetFont( iFont, g_bExtFont ); +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::KeyChange(TComboBoxItem *Sender, int Index) +{ + if( Index<0 || Index==g_iMelodyKey ) + return; + + StopClick( NULL ); + + if( g_iPreStage==0 ){ + UINT idLoc, idStyle; + int iOrigKey = g_iMelodyKey; + TOpusStageList* lstStagesBefore = new TOpusStageList; + g_Theme.Get( idLoc, idStyle, *lstStagesBefore ); + + g_iMelodyKey = Index; + + SetMelodyNotes( g_Theme.BarCount() ); + + if( AutoChords()==S_OK ){ + TOpusStageList* lstStagesAfter = new TOpusStageList; + g_Theme.Get( idLoc, idStyle, *lstStagesAfter ); + + g_Undo.AddUndo( UNDO_KEY_MELODY, 0, iOrigKey, Index, (void*)lstStagesBefore, (void*)lstStagesAfter ); + + ((TUseStylePanel*)m_pUseStylePanel)->InitOpus( g_pPreStyle, g_iPreStage ); + } + else{ + while( !lstStagesBefore->empty() ){ + delete lstStagesBefore->back(); + lstStagesBefore->pop_back(); + } + delete lstStagesBefore; + } + } + else{ + m_pContentPanel->OnChangeMelodyKey( Index ); + } + + m_iStartBar = 0; + m_dblStartPoint = 0; + m_dwLastVol = 0; + m_pContentPanel->SetPlayPoint( 0, 0 ); + ShowPlayTime(); +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::OpenClick(TObject *Sender) +{ + PostMessage( Handle, UM_LOADPROJECT, 0, 0 ); +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::SaveClick(TObject *Sender) +{ + PostMessage( Handle, UM_SAVEPROJECT, SAVE_ALL, 0 ); +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::UploadClick(TObject *Sender) +{ +// PostMessage( Handle, UM_UPLOADMUSIC, 0, 0 ); +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::OnUploadMusic(TMessage & Msg) +{ + //¼ܽϴ + if( !g_bLogon ) + Perform( UM_LOGIN, true, 0 ); + + if( !g_bLogon ) + return; + + Perform( UM_STOP, STOP_CONTENT | STOP_USESTYLE, 0 ); + //ȱֹû޸ķ󲻲ֱϴ + GenerateCompose(); + + if( !m_strUploadFile.IsEmpty() && (!FileExists(m_strUploadFile, false) + || g_Undo.GetLastLite()!=u_pUploadLite )){ + m_strUploadFile = ""; + u_pUploadLite = NULL; + } + + //ȼϴ + TProgressForm *frmProgress = new TProgressForm(NULL); + int ret = frmProgress->User_UploadSong( NULL, NULL ); + int eExtra = frmProgress->GetOpertaionResult(); + delete frmProgress; + + if( ret==mrCancel ){ + return; + } + else if( ret==mrOk && eExtra!=0 ){ + if( eExtra==e_InvalidAuthority ){ + TManageSongForm * frmManage = new TManageSongForm(NULL, false); + ret = frmManage->ShowModal(); + delete frmManage; + } + else{ + ShowErrorMessage( eExtra, "֤ʧ!" ); + } + + return; + } + + //ȱϴ + + //дϢ + TUploadForm * pUpload = new TUploadForm( NULL ); + + wstring strFileName; + while( pUpload->ShowModal()==mrOk ){ //ʾԻֱϴɹûȡ + eExtra = 0; + strFileName = m_strUploadFile.c_str(); + + //ǰδ棬򱣴浽UploadĿ¼ + if( strFileName.empty() ){ + strFileName = g_strUserPath; + strFileName += L"Save\\"; + + MkDir( strFileName.c_str() ); + + strFileName += pUpload->m_editSongName->Text.c_str(); + strFileName += L".mp3"; + + int iOperation = e_PO_Pay4Compose; + if( g_bExtFont || ((TUseStylePanel*)m_pUseStylePanel)->Charge4Fonts() ) + iOperation |= e_PO_Pay4Fonts; + if( g_aAudioTracks.size()>2 ) + iOperation |= e_PO_Pay4Audios; + + eExtra = SaveMedia( iOperation, SAVE_ALL, FILETYPE_MP3, strFileName.c_str(), true ); + } + + //õļʼϴ + if( eExtra==0 ){ + //๤ + if( g_infoSong.strCpjName && strlen( g_infoSong.strCpjName )>0 ){ + SaveProject( g_infoSong.strCpjName, PROJ_MODE_UPLOAD ); + } + + TSHAREINFO infoShare; + frmProgress = new TProgressForm(NULL); + ret = frmProgress->User_UploadSong( strFileName.c_str(), &infoShare ); + eExtra = frmProgress->GetOpertaionResult(); + delete frmProgress; + + //ɾ๤ + if( g_infoSong.strCpjName && strlen( g_infoSong.strCpjName )>0 && FileExists( g_infoSong.strCpjName ) ){ + DeleteFile( g_infoSong.strCpjName ); + } + + if( ret==mrOk && eExtra==0 ){ + TManageSongForm * frmManage = new TManageSongForm(NULL, true, infoShare.idSong); + frmManage->ShowModal(); + delete frmManage; + + break; + } + } + + //ͳһ󷵻ֵ + if( eExtra!=0 ){ + if( eExtra==e_InvalidAuthority ){ + TManageSongForm * frmManage = new TManageSongForm(NULL, false); + ret = frmManage->ShowModal(); + delete frmManage; + + if( ret!=mrOk ){ + break; + } + } + else if( eExtra!=-1 && eExtra!=e_UserCanceled ){ + ShowErrorMessage( eExtra, "ϴʧ!" ); + break; + } + } + } + + delete pUpload; + + Update(); +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::VolSetClick(TObject *Sender) +{ + if( m_KeyBoard->Visible ){ + m_KeyBoard->ShowKeyboard( false ); + if( m_btnKeyboard->Down ) + m_btnKeyboard->Down = false; + } + + Perform( UM_SHOW_VOLSET, 1, 0 ); +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::UMShowVolSet(TMessage &Message) +{ + int iShow = Message.WParam; + + if( iShow>0 && !m_pVolumeForm ){ + m_pVolumeForm = new TVolumeForm(NULL); + + int x = m_btnVolSet->Left; + int y = m_btnVolSet->Top - 245; + TPoint volumePos = ClientToScreen(TPoint(x, y)); + m_pVolumeForm->Top = volumePos.Y; + m_pVolumeForm->Left = volumePos.X; + m_btnVolSet->Down = true; + + if( iShow==1 ){ + m_pVolumeForm->OnRecord( m_btnRecord->Down ); + m_pVolumeForm->ShowModal(); + } + else{ + bool bUndo = Message.LParam; + m_pVolumeForm->ShowUndo( bUndo ); + } + } + else if( iShow==0 && m_pVolumeForm ){ + delete m_pVolumeForm; + m_pVolumeForm = NULL; + m_btnVolSet->Down = false; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::UMAudioVolChanged(TMessage &Message) +{ + int iTrack = Message.WParam, + iState = Message.LParamLo; + bool bUnset = Message.LParamHi; + + if( iState>0 && !m_pContentPanel->IsVertical() ) + m_pContentPanel->OnTrackStateChanged( ST_AUDIO, iTrack, iState, bUnset ); + + if( g_iSelAudio==iTrack ) + ((TTrackPanel*)m_pTrackPanel)->RefreshTrackState( iState, bUnset ); +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::UMShowKeyBoard(TMessage &Message) +{ + if( m_KeyBoard->Visible ){ + m_KeyBoard->ShowKeyboard( false ); + if( m_btnKeyboard->Down ) + m_btnKeyboard->Down = false; + } + else{ + m_KeyBoard->ShowKeyboard( true ); + if( !m_btnKeyboard->Down ) + m_btnKeyboard->Down = true; + } +} +//--------------------------------------------------------------------------- + +bool __fastcall TMainForm::RecordEnabled() +{ + bool bRec = true; + + if( g_iViewMode!=VIEW_INIT ){ + bRec = false; + + if( g_Opus.BarCount()>0 ){ + for( int i=0; iIsHide() && !g_aAudioTracks[i]->lstBars.empty() ){ + bRec = true; + break; + } + } + } + } + + return bRec; +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::SetRecordState( bool bRecord ) +{ + bool bEnable = !bRecord; + + m_btnTS->Enabled = bEnable; + m_btnTempo->Enabled = bEnable; + m_cbPreStage->Enabled = bEnable; + + m_btnOpen->Enabled = bEnable; + m_btnSave->Enabled = bEnable; + m_btnUpload->Enabled = bEnable && !g_bUpdateMandatory; + + m_tabStyle->Enabled = bEnable; + m_tabChord->Enabled = bEnable; + m_tabAudio->Enabled = bEnable; + + m_pContentPanel->Enabled = bEnable; + m_pUseStylePanel->Enabled = bEnable; + m_pAudStylePanel->Enabled = bEnable; + m_pPreStylePanel->Enabled = bEnable; + m_pTrackPanel->Enabled = bEnable; + m_pChordPanel->Enabled = bEnable; +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::ShowToolPanels( int iShow ) +{ + if( g_iToolPanelShow==iShow ) + return; + + g_iToolPanelShow = iShow; + + bool bShow = !( iShow & 0x2 ); + + if( bShow ){ + if( g_iToolPanelShow & 0x01 ){ + m_tabStyle->PngImg->LoadFromResourceName( int(HInstance), "btnViewStyleLeft" ); + m_tabChord->PngImg->LoadFromResourceName( int(HInstance), "btnViewChordLeft" ); + m_tabAudio->PngImg->LoadFromResourceName( int(HInstance), "btnViewTrackLeft" ); + } + else{ + m_tabStyle->PngImg->LoadFromResourceName( int(HInstance), "btnViewStyleRight" ); + m_tabChord->PngImg->LoadFromResourceName( int(HInstance), "btnViewChordRight" ); + m_tabAudio->PngImg->LoadFromResourceName( int(HInstance), "btnViewTrackRight" ); + } + } + + m_tabStyle->Visible = bShow; + m_tabChord->Visible = bShow; + m_tabAudio->Visible = bShow; + + if(g_iViewMode == VIEW_TRACK) + m_pTrackPanel->Visible = bShow; + else if(g_iViewMode == VIEW_CHORD) + m_pChordPanel->Visible = bShow; + else{ + m_pUseStylePanel->Visible = bShow; + m_pAudStylePanel->Visible = bShow; + m_pPreStylePanel->Visible = bShow; + } + + ViewLayout(); +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::OnShowToolPanels(TObject *Sender) +{ + int index = (int)Sender; + + if( index<0 ) + ShowToolPanels( g_iToolPanelShow ^ 0x2 ); + else if( g_iToolPanelShow==0 ) + ShowToolPanels( 1 ); + else + ShowToolPanels( 0 ); +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::PlayTimeClick(TObject *Sender) +{ + g_bShowPlayTick = !g_bShowPlayTick; + + ShowPlayTime(); + + if( g_bShowPlayTick ){ + m_pPlayTimePanel->Hint = "ǰλ()"; + } + else{ + m_pPlayTimePanel->Hint = "ǰλ(ʱ)"; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::OnOpenAutoProj(TMessage & Msg) //add by tj 2013/12/31 +{ + GetAutoSaveReg(); + SetAutoSaveReg( false ); + + if( !FileExists( g_strAutoProjName.c_str() ) ) + return; + + if( g_aOriginStyles.empty() ) //δط + return; + + String strMsg = L"ָϴδĹ̡\nǷָ?"; + MessageForm->m_btnYes->Hint = L"ָ"; + MessageForm->m_btnNo->Hint = L"ָ"; + + int mrRet = MessageForm->ShowMessage( strMsg, MB_ICONQUESTION|MB_YESNO ); + + MessageForm->m_btnYes->Hint = ""; + MessageForm->m_btnNo->Hint = ""; + + if( mrRet==mrYes ) { + //MessageForm->ShowMessage( strProjectName.c_str(), MB_ICONINFORMATION|MB_OK ); + mrRet = LoadProject(((AnsiString)g_strAutoProjName.c_str()).c_str(), NULL); + + if (mrRet) { + DebugPrint("open auto Save project...."); + AfterLoadProject(); + + return; + } + else { + DebugPrint("open auto Save project invalidate...."); + String strErr = L"ָʧ"; + MessageForm->ShowMessage(strErr, MB_ICONERROR | MB_OK); + + NewProject(); + } + + Update(); + } + else{ + g_strProjectName.clear(); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::UMShowHelp(TMessage &Message) +{ + bool bShow = Message.WParamHi; + + if( !bShow && m_HelpForm ){ + delete m_HelpForm; + m_HelpForm = NULL; + } + else if( bShow && !m_HelpForm ){ + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::DoShowNoticeNumPaint(TObject *Sender) +{ + TPngImage* img = new TPngImage(); + img->LoadFromResourceName( int(HInstance), L"NoticeBk" ); + m_pbUserNoticeNum->Canvas->Draw(0, 0, img); + SetBkMode(m_pbUserNoticeNum->Canvas->Handle, TRANSPARENT); + + String num; + num.sprintf(L"%d", m_pbUserNoticeNum->Tag); + + TSize size = m_pbUserNoticeNum->Canvas->TextExtent(num); + m_pbUserNoticeNum->Canvas->TextOutW((21 - size.Width) / 2, (21 - size.Height) / 2, num); + + delete img; +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::UserNoticeNumClick(TObject *Sender) +{ + char strURL[256]; + f_CS_GetWebPageURL( URL_USERNOTICE, strURL ); + ShellExecute(Handle, NULL, ((String)strURL).c_str(), NULL, NULL, SW_SHOWNORMAL); + +// int num = 0; +// f_CS_GetNotice( num, NULL, 0 ); +// f_CS_GetNotice( num, NULL, g_infoUser.accountInfo.ID ); + +// if(g_bLogon) { + // ¼ +// if(!m_HelpForm) { +// m_HelpForm = new THelpForm(NULL); +// } + +// int zoneNum = f_CS_GetNewNoticeNum( g_infoUser.accountInfo.ID ); +// int noticeNum = f_CS_GetNewNoticeNum( 0 ); + +// m_HelpForm->SetNoticeNum(noticeNum, 0); +// m_HelpForm->SetNoticeNum(zoneNum, 1); + +// if(noticeNum == 0) +// m_HelpForm->SetPage(3); +// else +// m_HelpForm->SetPage(TAB_NT); +// } +/* else { + // δ¼ + if(!m_HelpForm) { + m_HelpForm = new THelpForm(NULL); + } + + int noticeNum = f_CS_GetNewNoticeNum( 0 ); + m_HelpForm->SetNoticeNum(noticeNum, 0); + m_HelpForm->SetPage(2); + } +*/ + +// if( m_HelpForm && m_HelpForm->Window_state==HLP_WINDOW_MIN ){ +// m_HelpForm->SetSize( HLP_WINDOW_NORMAL ); +// } +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::UMStyleScore(TMessage &Message) +{ + if( !g_bLogon ){ + Perform( UM_LOGIN, true, 0 ); + } + + if( g_bLogon ){ + //ȡûǰּǰƽ + TPROSTYLE* pStyle = (TPROSTYLE*)Message.LParam; + int iType = pStyle->idLoc==0 ? e_ST_Origin : e_ST_Share, + scrUser = -1, + scrAverage = iType==e_ST_Origin ? pStyle->pOrigin->score : pStyle->pShare->score; + + TProgressForm *frmProgress = new TProgressForm(NULL); + int ret = frmProgress->User_StyleScore( pStyle->idStyle, iType, &scrUser, &scrAverage ); + int eExtra = frmProgress->GetOpertaionResult(); + delete frmProgress; + + int oldMyScore = scrUser; + if( ret==mrOk ){ + if( eExtra!=0){ + ShowErrorMessage( eExtra, L"ȡʧ!" ); + return; + } + else{ + if( iType==e_ST_Origin ) + pStyle->pOrigin->score = scrAverage; + else + pStyle->pShare->score = scrAverage; + } + + //ʾ + int iTop = Message.WParamLo, + iRight = Message.WParamHi; + + TScoreForm *pScoreForm = new TScoreForm(NULL); // + pScoreForm->Top = Top + iTop; + pScoreForm->Left = Left + iRight - pScoreForm->Width; + + if( iTop + pScoreForm->Height > ClientHeight - 42 ){ + pScoreForm->SetScoreWindow(false); + pScoreForm->Top -= pScoreForm->Height + OPTION_HEIGHT + 2; + } + else{ + pScoreForm->SetScoreWindow(true); + } + + string strStyleName; + if( iType==e_ST_Origin ) + strStyleName = UTF8ToMBCS(pStyle->pOrigin->detail.strStyleName); + else + strStyleName = UTF8ToMBCS(pStyle->pShare->strStyleName); + + pScoreForm->SetNetScore( scrAverage, strStyleName.c_str()); + pScoreForm->SetMyScore( scrUser ); + + bool bSumit = ( pScoreForm->ShowModal()==mrOk ); + scrUser = pScoreForm->MyScore; + delete pScoreForm; + + if( bSumit ){ + if( scrUser==oldMyScore ){ //֮ǰͬ + MessageForm->ShowMessage( "ɹ޸֡", MB_OK|MB_ICONINFORMATION ); + return; + } + + //ʾֽ + TProgressForm *frmProgress = new TProgressForm(NULL); + int ret = frmProgress->User_StyleScore( pStyle->idStyle, iType, &scrUser, &scrAverage ); + int eExtra = frmProgress->GetOpertaionResult(); + delete frmProgress; + + if( ret==mrOk ){ + if( eExtra==0){ + if( iType==e_ST_Origin ) + pStyle->pOrigin->score = scrAverage; + else + pStyle->pShare->score = scrAverage; + + if( oldMyScore==-1 ) + MessageForm->ShowMessage( "ɹύ֡", MB_OK|MB_ICONINFORMATION ); + else + MessageForm->ShowMessage( "ɹ޸֡", MB_OK|MB_ICONINFORMATION ); + } + else{ + ShowErrorMessage( eExtra, L"ύʧ!" ); + return; + } + } + } + } + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::UMNotification(TMessage & Msg) +{ + if( !m_pNotificationGetTimer ) + return; + + static bool bAutoShowHappened = false; + static bool bMenuShowHappened = false; + if( Msg.WParam == NOTIFICATION_SHOW_CLOSED ){ + + bAutoShowHappened = true; + m_pNotificationGetTimer->Enabled = false; + + if( m_pNotificationForm ) { + + delete m_pNotificationForm; + m_pNotificationForm = NULL; + } + + }else if( Msg.WParam == NOTIFICATION_NO_JSONDATA ){ + + if( m_pNotificationForm ) { + + delete m_pNotificationForm; + m_pNotificationForm = NULL; + } + + if( !bAutoShowHappened ) { + m_pNotificationGetTimer->Enabled = true; + } + + if( bMenuShowHappened ) { + bMenuShowHappened = false; + MessageForm->ShowMessage("ݲܻȡ̬Ժԣ", MB_ICONERROR | MB_OK); + } + + }else if( Msg.WParam == NOTIFICATION_MENU_JSONDATA ){ + m_pNotificationGetTimer->Enabled = false; + if( m_pNotificationForm== NULL) { + NotificationTimerProc(m_pNotificationGetTimer); + bMenuShowHappened = true; + } + }else if( Msg.WParam == NOTIFICATION_SHOW_FORM ){ + if( m_pNotificationForm ){ + m_pNotificationForm->setPANEL(); + m_pNotificationForm->Show(); + } + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::NotificationTimerProc(TObject* Sender) +{ + TTimer *notiTimer = (TTimer *)Sender; + + if( notiTimer == m_pNotificationGetTimer ) { + + m_pNotificationGetTimer->Enabled = false; + if( m_pNotificationForm == NULL ) { + m_pNotificationForm = new TNotificationForm(NULL); + //m_pNotificationForm->ParentWindow = GetDesktopWindow(); + } + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::OnNotification(TObject *Sender) +{ + PostMessage(Handle, UM_NOTIFICATION, + NOTIFICATION_MENU_JSONDATA, 0 ); +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::OnCustomerSetting(TObject *Sender) +{ + TCustomerSettingForm *csForm = new TCustomerSettingForm(NULL); + int ret = csForm->ShowModal(); + if( mrYes==ret ){ + g_bAutoOpenProject = csForm->m_pCSPanel->m_bAutoOpenProject; + g_iPreStageDefault = csForm->m_pCSPanel->m_cPreStage; + g_bPrebeat = csForm->m_pCSPanel->m_bPreBeat; + + bool bAutoDownload = csForm->m_pCSPanel->m_bDownloadStyle; + if( bAutoDownload!=g_bAutoDownloadStyle ){ + g_bAutoDownloadStyle = bAutoDownload; + f_CS_AutoDownloadStyle( bAutoDownload ); + } + } + else{ + bool bAlphaKey = csForm->m_bAlphaKeyOrig; + if( g_bAlphaKey!=bAlphaKey ) + ((TChordPanel*)m_pChordPanel)->SetKeyMode( bAlphaKey ); + + int iColorMode = csForm->m_iSegColorOrig; + if( iColorMode!=g_iSegColorMode ){ + g_iSegColorMode = iColorMode; + + InitSegmentColor(); + m_pContentPanel->Invalidate(); + m_pUseStylePanel->Invalidate(); + m_pPreStylePanel->Invalidate(); + m_pAudStylePanel->Invalidate(); + } + } + + delete csForm; +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::UMPreferChanged(TMessage &Message) +{ + int iParam = Message.WParam; + + if( iParam==0 ){ //ɫģʽ + int iColorMode = Message.LParam; + if( iColorMode!=g_iSegColorMode ){ + g_iSegColorMode = iColorMode; + + InitSegmentColor(); + m_pContentPanel->Invalidate(); + m_pUseStylePanel->Invalidate(); + m_pPreStylePanel->Invalidate(); + m_pAudStylePanel->Invalidate(); + } + } + else if( iParam==1 ){ //ʾģʽ + bool bAlphaKey = Message.LParam; + if( g_bAlphaKey!=bAlphaKey ) + ((TChordPanel*)m_pChordPanel)->SetKeyMode( bAlphaKey ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::UMApplyStyle(TMessage &Message) +{ + TStyleItem* pStyItem = (TStyleItem*)Message.LParam; + if( Message.WParam==0 ){ //滻Ԥ + ((TStylePanel*)m_pPreStylePanel)->Stop(); + ((TPreStylePanel*)m_pPreStylePanel)->SetPreStyle( pStyItem->pStyle->idLoc, + pStyItem->pStyle->idStyle ); + } + else if( Message.WParam==1 ){ //滻ʹ÷ + if( ( g_pUseStyle->nSegNum[SEGTYPE_VAR]>0 || g_pUseStyle->nSegNum[SEGTYPE_FILL]>0 ) + && pStyItem->nSegNum[SEGTYPE_VAR]==0 && pStyItem->nSegNum[SEGTYPE_FILL]==0 ){ + MessageForm->ShowMessage( "ѡȱٰӻƬΣ", MB_ICONERROR|MB_OK ); + } + else{ + ((TStylePanel*)m_pUseStylePanel)->Stop(); + ((TUseStylePanel*)m_pUseStylePanel)->ApplyStyle( pStyItem ); + } + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::UMChangeMelodyKey(TMessage &Message) +{ + if( m_cbKey->DefItemIndex != g_iMelodyKey ){ + m_cbKey->DefItemIndex = g_iMelodyKey; + m_cbKey->Enabled = g_iMelodyKey>=0; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::UMSaveLocalStyle(TMessage &Message) +{ + if( !g_pPreStyle || g_pPreStyle->aItems->Count==0 ) + return; + + TSaveLocalStyleForm * frmSave = new TSaveLocalStyleForm( NULL, g_pPreStyle ); + + while( frmSave->ShowModal()==mrOk ){ + String editText = frmSave->m_editName->Text.Trim(); + string strName = GBToUTF8(AnsiString(editText.c_str()).c_str()).c_str(); + TPROSTYLE * pStyle = NULL; + bool bNewStyle = true; + + for( int i=0; ipLocal->strStyleName )==0 ){ + pStyle = g_aLocalStyles[i]; + break; + } + } + + if( pStyle ){ + String strMsg = "ط[" + editText + "]Ѵڣ"; + + if( pStyle!=g_pPreStyle->pStyle ){ + bool bUsed = false; + + if( g_pUseStyle ){ + TStyleItem* pStyItem = (TStyleItem*)g_pUseStyle; + if( pStyItem->pStyle==pStyle ) + bUsed = true; + + for( int i=0; !bUsed && iaItems->Count; i++ ){ + TSegmentItem* pSeg = (TSegmentItem*)pStyItem->aItems->Items[i]; + for( int j=0; !bUsed && jaItems->Count; j++ ){ + TTrackItem* pTrk = (TTrackItem*)pSeg->aItems->Items[j]; + if( pTrk->pStyle==pStyle ){ + bUsed = true; + } + } + } + } + + if( !bUsed && g_pPreStyle ){ + TStyleItem* pStyItem = (TStyleItem*)g_pPreStyle; + if( pStyItem->pStyle==pStyle ) + bUsed = true; + + for( int i=0; !bUsed && iaItems->Count; i++ ){ + TSegmentItem* pSeg = (TSegmentItem*)pStyItem->aItems->Items[i]; + for( int j=0; !bUsed && jaItems->Count; j++ ){ + TTrackItem* pTrk = (TTrackItem*)pSeg->aItems->Items[j]; + if( pTrk->pStyle==pStyle ){ + bUsed = true; + } + } + } + } + + if( bUsed ){ + strMsg += "\nʹû༭Уɸǣ"; + MessageForm->ShowMessage( strMsg, MB_ICONERROR | MB_OK, "" ); + + continue; + } + } + + strMsg += "Ƿ񸲸ǣ"; + if( mrNo==MessageForm->ShowMessage( strMsg, MB_ICONQUESTION | MB_YESNO, "" ) ){ + continue; + } + + if( pStyle!=g_pPreStyle->pStyle ){ + UINT idStyle = pStyle->idStyle; + f_CM_DeleteLocalStyle( pStyle->idLoc, idStyle ); + DeleteStyleInfo( pStyle->idLoc, idStyle ); + + pStyle = new TPROSTYLE; + pStyle->idLoc = -1; + pStyle->idStyle = idStyle; + pStyle->pLocal = new TSTYLELOCAL; + pStyle->pLocal->iTimesignature = g_iMelodyTimeSignature; + strcpy( pStyle->pLocal->strStyleName, strName.c_str() ); + } + else{ + bNewStyle = false; + memset( pStyle->pLocal->nSegNum, 0, 4 ); + memset( pStyle->pLocal->aIEBars, 0, 2*8 ); + memset( pStyle->pLocal->trkRef, 0, sizeof(TTRACKREF)*4*8*16 ); + } + } + else{ + pStyle = new TPROSTYLE; + pStyle->idLoc = -1; + pStyle->pLocal = new TSTYLELOCAL; + pStyle->pLocal->iTimesignature = g_iMelodyTimeSignature; + strcpy( pStyle->pLocal->strStyleName, strName.c_str() ); + + } + + Perform( UM_STOP, STOP_CONTENT|STOP_USESTYLE|STOP_PRESTYLE, 0 ); + + pStyle->pLocal->iTempo = g_nMelodyTempo; + + //汾ط + frmSave->Save( pStyle ); + + + if( bNewStyle ){ + //·񵽱б + int index = 0; + for( int i=g_aLocalStyles.size()-1; i>=0; i-- ){ + if( LOWORD(pStyle->idStyle) > LOWORD(g_aLocalStyles[i]->idStyle) ){ + index = i+1; + break; + } + } + + if( index>=g_aLocalStyles.size() ) + g_aLocalStyles.push_back( pStyle ); + else + g_aLocalStyles.insert( g_aLocalStyles.begin() + index, pStyle ); + } + + ((TAudStylePanel*)m_pAudStylePanel)->ReloadLocalStyle(); + + //ˢԤ + m_pPreStylePanel->Invalidate(); + m_pUseStylePanel->Invalidate(); + + break; + } + + delete frmSave; +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::UMImportSegment(TMessage &Message) +{ + bool bAuthor = false; + + if( SOFTWARE_ID!=e_Pro_Lite ){ + if( !g_bLogon ){ + Perform( UM_LOGIN, true, 0 ); + } + + if( g_bLogon && g_infoUser.accountInfo.authority & 0x1000 ){ + bAuthor = true; + } + } + else{ + bAuthor = true; + } + + if( bAuthor ){ + TImportSegmentForm * frmIS = new TImportSegmentForm( NULL, (TPreStylePanel*)m_pPreStylePanel );//, pStyItem, Message.WParam ); + frmIS->ShowModal(); + delete frmIS; + } + else{ + String txt = "ùܽ˿\n\nʸ"; + MessageForm->ShowMessage(txt, MB_ICONINFORMATION | MB_OK); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::UMUploadStyle(TMessage &Message) +{ + if( !g_bLogon ){ + Perform( UM_LOGIN, true, 0 ); + } + + if( g_bLogon ){ + TStyleItem* pStyItem = (TStyleItem*)Message.LParam; + TSTYLELOCAL* pLocal = pStyItem->pStyle->pLocal; + UINT idLoc = pStyItem->pStyle->idLoc, + idStyle = pStyItem->pStyle->idStyle; + + //淶 + DWORD dwError = 0; + if( pLocal->nSegNum[0]<4 ) + dwError |= 1; + if( pLocal->nSegNum[1]<2 ) + dwError |= 2; + if( ( pLocal->nSegNum[2] & 0x0F )<2 ) + dwError |= 4; + if( ( pLocal->nSegNum[2] & 0xF0 )<0x20 ) + dwError |= 8; + if( ( pLocal->nSegNum[3] & 0x0F )<2 ) + dwError |= 0x10; + if( ( pLocal->nSegNum[3] & 0xF0 )<0x20 ) + dwError |= 0x20; + + bool bShare = true, bPublish = true; + for( int i=0; i<4; i++ ){ + for( int j=0; j<8; j++ ){ + for( int k=0; k<16; k++ ){ + if( pLocal->trkRef[i][j][k].idLoc==0 + && pLocal->trkRef[i][j][k].idStyle==0 ) + break; + + if( pLocal->trkRef[i][j][k].idLoc==0 ){ + bPublish = false; + + if( !bShare ){ + dwError |= 0x80; + goto END_STATEMENT; + } + } + else{ + bShare = false; + + if( !bPublish ){ + dwError |= 0x40; + goto END_STATEMENT; + } + } + } + } + } + +END_STATEMENT: + if( dwError!=0 ){ + TStyleSpecsForm * frm = new TStyleSpecsForm( NULL, dwError ); + frm->ShowModal(); + delete frm; + } + else{ + TSTYLESHARE* pShare = NULL; + TMAKESTYLEINFO* pMake = NULL; + + TStyleUploadForm * frm = new TStyleUploadForm(NULL, pStyItem->pStyle, bShare); + if( frm->ShowModal()==mrOk ){ + if( bShare ){ + pShare = new TSTYLESHARE; + + frm->GetShareInfo( pShare ); + + pShare->idAuthor = g_infoUser.accountInfo.ID; + pShare->iTempo = pLocal->iTempo; + pShare->iTimesignature = pLocal->iTimesignature; + memcpy( pShare->nSegNum, pLocal->nSegNum, 4 ); + memcpy( pShare->aIEBars, pLocal->aIEBars, 2*8 ); + memcpy( pShare->nSegVol, pLocal->nSegVol, 4*8 ); + + for( int s=0; s<4; s++ ){ + for( int i=0; i<8; i++ ){ + for( int j=0; j<16 && pLocal->trkRef[s][i][j].idStyle>0; j++ ){ + pShare->trkRef[s][i][j].idStyle = pLocal->trkRef[s][i][j].idStyle; + pShare->trkRef[s][i][j].segNo = pLocal->trkRef[s][i][j].segNo; + pShare->trkRef[s][i][j].chan = pLocal->trkRef[s][i][j].chan; + pShare->trkRef[s][i][j].prog = pLocal->trkRef[s][i][j].prog; + pShare->trkRef[s][i][j].vol = pLocal->trkRef[s][i][j].vol; + } + } + } + } + else{ + pMake = new TMAKESTYLEINFO; + + frm->GetMakeInfo( pMake ); + + pMake->detail.idAuthor = g_infoUser.accountInfo.ID; + pMake->detail.iTempo = pLocal->iTempo; + pMake->detail.iTimesignature = pLocal->iTimesignature; + } + } + + delete frm; + + if( pShare || pMake ){ + int ret = 0; + + TProgressForm * frmProgress = new TProgressForm(NULL); + if( bShare ){ + ret = frmProgress->User_StyleUpload( e_ST_Share, sizeof(TSTYLESHARE), (char*)pShare ); + } + else{ + int len = 1000000; + BYTE* buff = new BYTE[len]; + ret = f_CM_MakeStyle( idLoc, idStyle, pMake, len, buff); + + ret = frmProgress->User_StyleUpload( e_ST_Temp, len, (char*)buff ); + + delete buff; + } + + int eExtra = frmProgress->GetOpertaionResult(); + delete frmProgress; + + if( pShare ) + delete pShare; + if( pMake ) + delete pMake; + + if( ret==mrOk ){ + if( eExtra==0 ){ + String strMsg = bShare ? "ɹ!" : "ύɹ!"; + MessageForm->ShowMessage( strMsg, MB_ICONINFORMATION | MB_OK); + } + else{ + String strMsg = bShare ? "ʧ!" : "ύʧ!"; + ShowErrorMessage( eExtra, strMsg ); + } + } + } + } + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::UMShowMore(TMessage &Message) +{ + OnShowMore(); +} + +void __fastcall TMainForm::UMEnableRecord(TMessage &Message) +{ + m_btnRecord->Enabled = RecordEnabled(); +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::UMAudioLoad(TMessage &Message) +{ + // ָļ + String strFileName; + TImportForm *imF = new TImportForm(NULL, g_strLastImportFile.c_str()); + + if( imF->ShowModal()==mrOk ){ + strFileName = imF->MediaFilePath; + } + delete imF; + + if( strFileName.Length()==0 ) + return; + + int iSelAudioBar = Message.WParam, + iSelAudioPoint = Message.LParam; + + if( iSelAudioBar<0 ){ + iSelAudioBar = 0; + iSelAudioPoint = 0; + } + + if( iSelAudioPoint<0 ) + iSelAudioPoint = 0; + + double dblStart = iSelAudioBar + (double)iSelAudioPoint / POINTS_PER_BAR, + dblEnd = 0; + + int iModifyBeginBar, iModifyBeginPoint, iModifyEndBar, iModifyEndPoint; + m_pContentPanel->GetSelectRange(iModifyBeginBar, iModifyBeginPoint, + iModifyEndBar, iModifyEndPoint); + + DWORD *aBefore = NULL, *aAfter = NULL; + + if( g_iSelAudio>0 ){ + if( iModifyEndBar<0 ){ + iModifyEndBar = g_Opus.BarCount(); + iModifyEndPoint = 0; + } + + CopyWave( g_iSelAudio, iSelAudioBar, iSelAudioPoint, + iModifyEndBar, iModifyEndPoint, &aBefore ); + } + else{ + TAudioTrack* pAudio = CopyAudioTrack( 0, 0, GetBarCount() ); + g_Undo.AddUndo( UNDO_AUDIO_LOAD, 0, g_iMelodyKey, -1, (void*)pAudio, NULL ); + } + + f_MM_AddUndoBefore( 1, &g_iSelAudio ); + + if( iModifyEndBar>=0 ) + dblEnd = iModifyEndBar + (double)iModifyEndPoint / POINTS_PER_BAR; + + double dblLen = f_MM_AudioLoad( g_iSelAudio, dblStart, dblEnd, ((AnsiString)strFileName).c_str() ); + + if( dblLen<=0 ){ + if( aBefore ) + delete[] aBefore; + + if( g_iSelAudio==0 ){ + g_Undo.CancelUndo(); + } + + f_MM_CancelAddUndo(); + + return; + } + + int iVolBar = iSelAudioBar, + iVolPoint = iSelAudioPoint, + nPoints = dblLen * POINTS_PER_BAR, + iPoint = 0; + + if( g_iSelAudio>0 ){ + int lenOrig = ( iModifyEndBar * POINTS_PER_BAR + iModifyEndPoint ) + - ( iSelAudioBar * POINTS_PER_BAR + iSelAudioPoint ); + + if( lenOrig > nPoints ){ + DWORD* aNew = new DWORD[nPoints]; + memcpy( aNew, aBefore, sizeof(DWORD)*nPoints ); + delete[] aBefore; + aBefore = aNew ; + } + + aAfter = new DWORD[nPoints]; + } + + dblEnd = dblStart + dblLen; + if( dblEnd > g_aAudioTracks[g_iSelAudio]->lstBars.size() ){ + int nAddBar = (int)( dblEnd - g_aAudioTracks[g_iSelAudio]->lstBars.size() ) + 1; + for( int i=0; ilstBars.push_back( pNewBar ); + } + } + + while( iPoint0 ){ + iSP = iVolPoint; + + if( iSP + nPoints - iPoint < POINTS_PER_BAR ) + iEP = iSP + nPoints - iPoint; + } + else if( nPoints-iPoint < POINTS_PER_BAR ){ + iEP = nPoints - iPoint; + } + + if( iEP > iSP ){ + TWaveBar* pBar = g_aAudioTracks[g_iSelAudio]->lstBars[iVolBar]; + + for( int i=iSP; iaVols[i] = f_MM_GetAudioVolume( g_iSelAudio, iVolBar + i/(double)POINTS_PER_BAR ); + } + + if( aAfter ){ + memcpy( aAfter + iPoint, pBar->aVols + iSP, sizeof(DWORD)*(iEP-iSP) ); + } + + iVolPoint = 0; + iVolBar++; + iPoint += iEP - iSP; + } + else{ + break; + } + } + + if( g_iSelAudio>0 ){ + int ind = m_pContentPanel->GetShowTrackId( ST_AUDIO, g_iSelAudio ); + m_pContentPanel->InvalidateBars( iSelAudioBar, (int)(dblEnd)+1, BAR_TRACK | ind ); + + int nPointsEnd = ( iSelAudioBar * POINTS_PER_BAR + iSelAudioPoint ) + nPoints, + iBarEnd = nPointsEnd / POINTS_PER_BAR, + iPointEnd = nPointsEnd % POINTS_PER_BAR, + iBegin = MAKELONG( iSelAudioPoint, iSelAudioBar ), + iEnd = MAKELONG( iPointEnd, iBarEnd ); + + g_Undo.AddUndo( UNDO_AUDIO_LOAD, g_iSelAudio, iBegin, iEnd, (void*)aBefore, (void*)aAfter ); + f_MM_AddUndoAfter( 1, &g_iSelAudio ); + + m_pContentPanel->SetSelectRange( iSelAudioBar, iSelAudioPoint, iBarEnd, iPointEnd ); + } + else{ + AutoRecognition( MODE_RELOAD ); + } + + g_strLastImportFile = strFileName.c_str(); +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::OnUndo(TObject *Sender) +{ + Undo( true ); +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::OnRedo(TObject *Sender) +{ + Undo( false ); +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::Undo( bool bUndo ) +{ + if( w_bDraging ) + return; + + int iOp = bUndo ? g_Undo.GetUndoType() : g_Undo.GetRedoType(); + + if( iOp<0 ) + return; + + if( iOp>=UNDO_KEY_MELODY && iOp<=UNDO_CHORD + || iOp>=UNDO_TRKAUD_ADD && iOp<=UNDO_TRKAUD_HIDEALL + || iOp>=UNDO_TRKMID_SHOW && iOp<=UNDO_TRKMID_HIDEALL ) { + m_pContentPanel->Undo( bUndo ); + } + else if( iOp>=UNDO_BAR_INSERT && iOp<=UNDO_PROG_VOL + || iOp>=UNDO_TRKMID_ADD && iOp<=UNDO_TRKMID_DELALL ){ + ((TUseStylePanel*)m_pUseStylePanel)->Undo( bUndo ); + } + else if( iOp>=UNDO_FX_ADD && iOp<=UNDO_TRACK_CHNO ){ + ((TTrackPanel*)m_pTrackPanel)->Undo( bUndo ); + } + else if( iOp>=UNDO_AUDIO_ERASE && iOp<=UNDO_AUDIO_FX ){ + int iTrack = bUndo ? g_Undo.GetUndoCode() : g_Undo.GetRedoCode(); + if( iTrack>0 ) + m_pContentPanel->Undo( bUndo ); + else{ + TUndoLite * pLite = bUndo ? g_Undo.Undo() : g_Undo.Redo(); + TAudioTrack* pAudio = (TAudioTrack*)( bUndo ? pLite->pBefore + : pLite->pAfter ); + TOpusStageList* lstStages = (TOpusStageList*)( bUndo ? pLite->pExt1 + : pLite->pExt2 ); + g_iMelodyKey = bUndo ? pLite->iBegin : pLite->iEnd; + + TAudioTrack* pAT = g_aAudioTracks[0]; + RemoveWaveBars( 0, 0, pAT->lstBars.size() ); + + if( pAudio ){ + for( int i=0; ilstBars.size(); i++ ){ + TWaveBar* pWvBar = new TWaveBar; + memcpy( pWvBar->aVols, pAudio->lstBars[i], sizeof(DWORD)*POINTS_PER_BAR ); + pAT->lstBars.push_back( pWvBar ); + } + } + + g_Theme.Set( pLite->iExt1, pLite->iExt2, *lstStages ); + g_Opus.Set( pLite->iExt1, pLite->iExt2, *lstStages ); + g_Opus.BuildStyleItem(); + g_Midi.ClearMidiTracks(); + + f_MM_Undo( bUndo ); + + ((TStylePanel*)m_pUseStylePanel)->SetStyleItem( g_pUseStyle ); + + m_iStartBar = 0; + m_dblStartPoint = 0; + m_dwLastVol = 0; + m_pContentPanel->SetPlayPoint( 0, 0 ); + ShowPlayTime(); + + m_pContentPanel->OnStageChanged( 0, MODE_INIT ); + + if( g_pUseStyle ){ + SetMode( VIEW_TRACK, true ); +// GenerateCompose(); + } + else + SetMode( VIEW_INIT, true ); + + m_cbKey->DefItemIndex = g_iMelodyKey; + m_cbKey->Enabled = g_iMelodyKey>=0; + m_btnPlay->Enabled = !g_lstOpusStages.empty(); + m_btnSave->Enabled = !g_lstOpusStages.empty(); + m_btnUpload->Enabled = !g_bUpdateMandatory && !g_lstOpusStages.empty(); + } + } + else if( iOp==UNDO_VOLUME ){ + if( m_KeyBoard->Visible ){ + m_KeyBoard->ShowKeyboard( false ); + if( m_btnKeyboard->Down ) + m_btnKeyboard->Down = false; + } + + Perform( UM_SHOW_VOLSET, 2, bUndo ); + } + else if( iOp==UNDO_PRESET ){ + TUndoLite * pLite = bUndo ? g_Undo.Undo() : g_Undo.Redo(); + TOpusStageList* lstStages = (TOpusStageList*)pLite->pBefore; + TAudioTrackList* lstAudio = (TAudioTrackList*)pLite->pExt1; + int iPreset = bUndo ? pLite->iBegin : pLite->iEnd, + iPreOther = bUndo ? pLite->iEnd : pLite->iBegin; + bool bSetMM = lstAudio!=NULL; + + if( iPreset>0 ) + g_aAudioTracks[0]->Hide(); + + if( bSetMM ){ + if( lstAudio->size()>0 ) + f_MM_Undo( bUndo ); + + if( bUndo ){ + g_Audio.ResetTracks( lstAudio ); + int idLoc = g_pUseStyle->pStyle ? g_pUseStyle->pStyle->idLoc : -1, + idStyle = g_pUseStyle->pStyle ? g_pUseStyle->pStyle->idStyle : -1; + g_Opus.Set( idLoc, idStyle, *lstStages ); + g_Opus.BuildStyleItem(); + g_Midi.ClearMidiTracks(); + + ((TUseStylePanel*)m_pUseStylePanel)->SetStyleItem( g_pUseStyle ); + m_pContentPanel->OnStageChanged( 0, MODE_INIT ); + } + } + + if( pLite->iBegin==0 && pLite->iEnd==3 ){ + if( bUndo ){ + DeleteAudioTrack( 1, false ); + g_aAudioTracks[0]->Hide(false); + } + else{ + DuplicateRawBars(); + } + } + + if( pLite->iBegin==0 && pLite->iEnd==3 || bUndo && bSetMM ){ + Perform( UM_STAGECHANGED, iPreset, 0 ); + } + else{ + PreStageChange( NULL, iPreset ); + } + } + else if( iOp==UNDO_FONT_SET ){ + TUndoLite* pLite = bUndo ? g_Undo.Undo() : g_Undo.Redo(); + int idNew = bUndo ? pLite->iBegin : pLite->iEnd; + bool bNew = bUndo ? (bool)pLite->pBefore : (bool)pLite->pAfter; + + SetFont( idNew, bNew, false ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::ExtFontClick(TObject *Sender) +{ + bool bExtFont = Sender==m_btnExtFontOff; + + if( bExtFont!=g_bExtFont ) + SetFont( g_idFont, bExtFont ); +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::URLClick(TObject *Sender) +{ + char strURL[256]; + if( Sender==m_lblExtFont ) + f_CS_GetWebPageURL( URL_EXTFONT, strURL ); + else if( Sender==m_lblWebsite ) + strcpy( strURL, "http://www.iChangzuo.com" ); + + ShellExecute(Handle, NULL, ((String)strURL).c_str(), NULL, NULL, SW_SHOWNORMAL); +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::URLMouseEnter(TObject *Sender) +{ + if( Sender==m_lblExtFont ) + m_lblExtFont->Font->Color = 0x00FFC090; + else if( Sender==m_lblWebsite ) + m_lblWebsite->Font->Color = 0x0000D0FF; +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::URLMouseLeave(TObject *Sender) +{ + if( Sender==m_lblExtFont ) + m_lblExtFont->Font->Color = clHighlight; + else if( Sender==m_lblWebsite ) + m_lblWebsite->Font->Color = 0x001D84F6; +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::UMVSTPath(TMessage &Message) +{ + bool bShowCheck = Message.WParam; + + TVSTPathForm *VST = new TVSTPathForm(this, bShowCheck); + if( VST->ShowModal()==mrOk ) { + g_strVSTPath = VST->m_lpSelectVSTDir; + g_strVSTiPath = VST->m_lpSelectVSTiDir; + + if( bShowCheck ){ + Screen->Cursor = crHourGlass; + InitVSTList(); + Screen->Cursor = crDefault; + } + } + else if( bShowCheck && VST->IsChecked() ){ + g_bShowVSTPath = false; + } + + SAFE_DELETE(VST); + + if( bShowCheck ){ + if( !m_strLoadProjectName.IsEmpty() ) + PostMessage(Handle, UM_LOADPROJECT, 0, 0); + else if( g_bAutoSave ) + PostMessage(Handle, UM_OPENAUTOPROJ, 0, 0); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::UMSetContentView(TMessage &Message) +{ + if( g_iViewMode!=VIEW_INIT ){ + int iView = Message.WParam; + + m_pContentPanel->SetScrollMode( iView ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::UMGetContentView(TMessage &Message) +{ + int* iView = (int*)Message.WParam; + *iView = m_pContentPanel->IsVertical(); +} +//--------------------------------------------------------------------------- + + diff --git a/MainFormUnit.dfm b/MainFormUnit.dfm new file mode 100644 index 0000000..961cdad --- /dev/null +++ b/MainFormUnit.dfm @@ -0,0 +1,3773 @@ +object MainForm: TMainForm + Left = 0 + Top = 0 + ParentCustomHint = False + HorzScrollBar.ParentColor = False + HorzScrollBar.Visible = False + VertScrollBar.Visible = False + Anchors = [] + BiDiMode = bdLeftToRight + BorderIcons = [] + BorderStyle = bsNone + Caption = #21809#20316#39764#26041#19987#19994#29256 + ClientHeight = 680 + ClientWidth = 1024 + Color = clBtnFace + DoubleBuffered = True + Font.Charset = GB2312_CHARSET + Font.Color = clBackground + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + KeyPreview = True + ParentBiDiMode = False + Position = poScreenCenter + Scaled = False + OnClose = FormClose + OnCloseQuery = FormCloseQuery + OnCreate = FormCreate + OnKeyDown = FormKeyDown + OnKeyUp = FormKeyUp + OnMouseDown = FormMouseDown + OnPaint = FormPaint + OnResize = FormResize + TextHeight = 14 + object m_btnPause: TPNGButton + Left = 68 + Top = 46 + Width = 39 + Height = 26 + Hint = #26242#20572 + ParentCustomHint = False + ParentShowHint = False + PngImg.Data = { + 89504E470D0A1A0A0000000D494844520000009C0000001A0806000000425135 + 88000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F33000005AF4944415478DAED9B6B6C544514 + C767DF65D9B26ED51651FB022B68406CFD40528CD1A0A820428A487C44AC4822 + 418909B17C6810091FA8213128C104B1427C049106C4A2A24442A4493FD8A691 + 2888D0975ADBAAAD4B9765BB7B77EB99EDDDC952C699D9B9C3DDFD704F727267 + EFF9A7F7DF737E9D6D72EFB58D8D8DA1D977DD8DB2151DED3FB0CA764827A41B + 324F3F3AF5F366450252838C4246F4A3A6D772D2DBDCCA7B12267AB82258F374 + 381CC886818BC7E32EF8EC85F4EB475716BCC620C39041FD883FE3210620A741 + 96431642E69BEC0FFB18811C84EC84EC831CD66B3EC802C8A9BA4F9FEED9ACC0 + 8085743FFD9043F833001785C1BB743FD8D764937B96DEBB4BBABF1000174B01 + E77FF89145BBFB07065664C1D41531B5A8E8C0D75F1D5D83C6C1C30DBB6DE9B2 + 9AE6EE9E9E69D9F6565A52D277F850D36258FE9AB2BBACE689B7BABABA1667DB + 5B595959F3A1A6CF5E85653F001702E00230D37D30D3C7B2ED0D66FA05CCF439 + 006E38055C3198EC292E9F996D6FA8B7F32CDE964BF012F206C8FBC0DBC11CF2 + B61C9627F55333C1DBF7EE3C1F723A9DE35F19763BB2D96CD7DC0B9EDB582281 + 6787344D43D148087BBB174A67C1D3DFB02E87E38579F3EFCF76DB50EBA913D8 + DB74E84F670A38DCB8333934D459B87168FCABF471F0B62B87BCAD85E5E7FAA9 + 2AF076C4EBBB0E395D2E80CE85EC26029700E0342D86B4580C8543FF626F4BA0 + D4069EFA603D1B8E3FE610707300B8D329E092E678438DC35FD2E86824F94BA6 + 076EB4C793871CF0572EA261853ED439B03C0D590CB912BC35E490B73A58EED7 + 4F5583B74FF2FDD72397DB93DCE5EC78979B005CEABA78374A0FBC234EF4C6D2 + A44712387D778B4547D148F01FECED2928B580A75E5857C2B18D075C02EF8ED1 + 28D2E2137AE27021B7DB8DEC705D110D2B74E0AAE07769CF08B8F0A510AAF866 + 0FB576EEA1D5C83BD927A411186A0AB852C8A7C1DBD61CF2560FCB8FF553F8EB + 7EEF94C08DD0784F7297733800BA09C0E1EBDE7EBC91FA337F59504BBCF134E9 + 9148CE4D4BEE6E5100EEE2F05FD8DB2A289D044FDDA2C045C26154FAC1566AAD + FBF97A94E7F50A6958210DDCC5E030AA38F61E7D600B5F4453FC01218DC05033 + 06CE446F5701E72F2824C0390138FC7FDCB5F686FF7FD3D2800B0E0D4A01171A + 09A2B2F7E93075BD508F7CF97E210D2B0C01577A6427B5D6BD641D691C4F2330 + 5429E04CF226059C6A6F2A81BBE5DD4DD4DAEF2F6D21C0F134AC3004DC4D07B6 + 536B7FAED8401AC7D3080C550A3893BC4901A7DA9B4AE00A77D4516B83EB1B08 + 703C0D2B0C0117D8BB855A1B5EB589348EA71118AA1470267993024EB53795C0 + F9B7ADA7D6821B7710E0781A5618026ED2AE8DD4DAE5B5DB48E3781A81A14A01 + 67923729E0547B53095CDEE635D45A64F36E021C4FC30A43C0A1ED2FD38B1BDE + 218DE36904862A059C49DEA48053ED4D2570A8EE597AB1E143021C4FC30A43C0 + 5D7EA3965A9BF47A23691C4F23305429E04CF226059C6A6F2A811B7D6539B5E6 + 79FB20018EA7618521E0865E7B925A2B78F353D2389E4660A852C099E44D0A38 + D5DE5402175CFD28B5E6DFF325018EA7618521E0FE5847BF4F7DF3CE66D2389E + 4660A852C099E44D0A38D5DE540237F00C5D53F4D109021C4FC30A43C05DA87D + 805A9BDEF81D691C4F23305429E04CF226059C6A6F2A81FBAD661EB5766B532B + 018EA7618521E07E5A49BFF09DFB5B49E3781A81A14A0167923729E0547B5309 + DCF94573A9B519473B08703C0D2B0C01D7BE947EE1CAC31DA4713C8DC050A580 + 33C99B1470AABDA904EEE705B3A8B53B8E9F21C0F134AC3074F3FED48333A8B5 + F9DF9E2737A1791A81A14ADDBC37C99BD4CDFB968515D49F597DEC1CF1C6D3A4 + 87CA9BF76DD5C5D45A554B2FB979CFD3B0421A38EBF124EBF1A4FFD3B082069C + F500A6B837EB01CC0C83F600A6F588B9B837EB11F30C83F688B9F5128D40582F + D1C805ED251AEB3541B62FEB3541F9DE5DFD9AA0F5223433AC17A13308DE8BD0 + FF01749528459F8DEC5B0000000049454E44AE426082} + ShowHint = True + Visible = False + OnClick = PauseClick + end + object m_btnPlay: TPNGButton + Left = 68 + Top = 46 + Width = 39 + Height = 26 + Hint = #25773#25918 + ParentCustomHint = False + Enabled = False + ParentShowHint = False + PngImg.Data = { + 89504E470D0A1A0A0000000D494844520000009C0000001A0806000000425135 + 88000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F33000006DB4944415478DAED9B5B6C145518 + C7FF33B3B33BBB5DD8DEA08514684B34F000229840A284105E105120808A2682 + D110F4498C898A3E9878892646DF34F1816022C4A080968A260A4DA3D2126805 + 6AA55269BB157ABFEF76BBF7F53BB3B3A49576BBBB7366B60FFB255FE6ECCCB6 + FBDB737E73CE999D33422C16C3AA071E44B6E26AE3956487454A0BA59552D1B6 + 166DBF5911A50C530629FDDA36AC1D9B936C6BD63E143591614A246B4F499220 + 30E12291884CAF1D942E6D2B67813544E9A31CD5B6EC356BC402CAC59495940B + 29E799CCC7383C947D946D945D94C3DA3127652165A9C6E9D498CD0A269857E3 + E9A11C62AF49B82035BCACF130AE3C93EB6C72DD8D6B7C5E122E9410CEB5F5D1 + C7BEE8E9ED7D320B5053A2B4A4E4E44F3FFE701071F15885DDB773D7EEEA0EB7 + 7B71B6D9CA972DEBFAEECCA9ED546C4DE0EEDABDF7D3F6F6F6EDD966ABA8A8A8 + 3E73EA9BC354EC21E1BC245C01B5E997D4A68F679B8DDAF42CB5E97E126E3821 + DC5282742FAD5C916D3674B6B5B06E79192B5216536E22B66FE710DB1E2AD66A + BB5610DBAF56C5098BC5121F324411822018CEC2DA2D168DB2B643381C46D0EF + 656C1BE9500B310D50B992B6B7363CB239DBD586FADF6A18DB72AA9FB68470AC + E26ECCA1465DC92A0EF1A17407B17D3687D85EA6E2F7DAAE75C456E570E6C322 + CB249D0CD144E1A2245C381C42381482CF3BC2D89EA0430DC4D445E555B4BD3E + 87845B4DC235258453E1526DD4283BAB2261AA5C297E5673AC60AD515753B189 + 7229E5D3C4F6D11C627B9D8A5F6BBB1E26B613F35C4590AD36B59713937C6634 + 1A41241C517B41BD6CAA705AEF160A06E0191D646CCFD0A1DF89A993CA6B69DB + 90AA7031F6BF884F14E26CE0586F9A70EBE8FF3666249C7FC287C2375E40DFB1 + D390BA8760B52971480EF13FE1CA299F25B6F7E610DBDB543CAEED62C3FDB1F9 + 050B6065C2512F274924DD0C8DE59F9840D19117D177F414C49E21F56F32658B + AAED16567BB720093736DCCFD80ED0A15A62EA4857B8A07F02AE837B3078FA67 + 48FD23EA092472AA37DDC2793D63283BFE2124A7030355E7E1397E0EB6884090 + 567548D1137A853381ED1EE15C850BEF0A6721E184193E87271B9BBF85270937 + 3AD4A74B38DFB817A51FBF06C9A160F8421DBC55B5B046898DBE93A0B3DE740B + E7191B41C9D177D58A6311F1FA3078A21AE10B97A1508FC2E632990E177A8533 + 812D63E178B2F1166EDC3B86E20F5E81E850D4D7519F1F23D53508D735C1A64D + 17321D66B908E7FAFC08A43CC794FD0177173C5F9D85A5B50B8A6287C420336B + 545DC219CCA64B385E6C460837EF9D436A0F37398277FA305E5503A9A30F361B + 0DB319D41B17E1EC9F1C8698679FF6F84443338227CFC33E1E54E750E90C173C + 8433984D9770BCD88C104E79F30044BB32ED717F732B42E7EAA04C84D4F95D3A + C32C17E184F70F51F76B9FF13D31BA1A0BFC520FF1FC1538249B3A4F4965B8E0 + 219CC16CBA84E3C5668470C2E17D1015DBCC6C91288217AF42ACFB138A6455E7 + 77A90CB35C840BBCF51C048732EB7BA3A35EC4CE5D84F3C66D2876C7AC3D0A0F + E10C66D3251C2F3623840B1EDA09C16E9BF5BD318F0FB1DA46386EF5C2A628B3 + F6765C841B7D756F4A7089B0D4FF85A2BA9BF1C96792E0219CC16CBA84E3C566 + 8470DEE7B782AE105267BB760BF97FB4CF3AE7E4225CEF4BDB0025858A1B1885 + BDE62A0A7A3CEA84D88C1ECE60365DC2F1623342B8C17D9B52136ED803DBA51B + 70F58FD38584493D9C7B3F7D1125095C3004FBA51614FFDD03BB4C7311D9BC39 + 9CC16CBA84E3C56684705DBBD683BEC8CC6FA2CF52AEB5A1A07D0036E2922D26 + CEE15A9FDA80D80C6783ADE55F94347660BE688DFF626DF255AAC16CBA84E3C5 + 668470EE6D6B10B34EBF8AC9DAD68DE2E63BC813E5F84960F6556AD30E82B34D + 8593FB46B0E8723B8AFC5479ECF7A40C6E8DF010CE60365DC2F1623342B89B5B + 56927053E76396410F1636DD467E80A4B36576BB8B8B700D5B57DE3D1B245F00 + 0BAE776249BF9FE61B0E751299CD3B0D06B3E9128E179B11C2356F5C8E981C17 + 4EF20751D0D28D45C3019AD629F10B836CDD6960F704EB37572066115148738D + 8A4E0F9C567BCABF67A5D0A8BAEEA51ACC96F1CD7BC67669CB728DAD1BE5EEB1 + 385B8A73C8C9C1FBE63DBB977A6D7D19629208577B3FCABAC7E19095947F6B4B + 16FA578BF82770BDD289B27F06512858D3FEC53E59E85D9E64025BC6CB93027E + 3F9AEF7761F1CD7EE4435625CD948DF7F2A460C08F96250E94BA47902FC869DF + 4D4816D30997D602CCA8BAD234AC56163BA37986DE059826B065BC0093B13149 + 12EBE1F404EF059889D5C3A228D049C3B7DEA65B80995B629E3A5B6E89799A31 + DD12F3DC43342944EE219ACC62BA8768728F0926E7CA3D269879DDDDFB9860EE + 41E8A4917B103A8D98ED41E8FF0013A48036FFAB77F70000000049454E44AE42 + 6082} + ShowHint = True + OnClick = PlayClick + end + object m_btnClose: TPNGButton + Left = 989 + Top = 10 + Width = 23 + Height = 18 + ImgStates = 3 + PngImg.Data = { + 89504E470D0A1A0A0000000D49484452000000450000001208060000000D0613 + 66000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F330000067F4944415478DABD58094C944714 + 9EDD85656529085A400B495913D46A9346894DDAC4A3BA2A566CB54A8B72552C + 2A022D2AD178228256299472C8214D056FA86D53A807A65A4D5AABD1A6D15A95 + 8A3D14C55A05916365D9DDBE61DFB06F87DD4093EA9FBCFCF3CF3FF3E69B6FDE + BCF76614168B853D89C7643289A282881245419A5A50E4F6F4BF19C522B55738 + 18E3BFEA96755A1494143291FFF3E124A8405C405C515CB05E8031E19B122740 + 77811851BAB0AD994C5249C610A220933413DD322926223DC43F695204684E84 + 1B883B881644837574E2666C4F09E3F5069036907690C7488E9828255C4D4458 + A323C205295C4727911EC26552B8724F102F029A21B02604C627E40D32800CC0 + 81B6A018255254488816F5FAE07B004EC6420029B14E41087908F200DF6D488C + 98A8205C8DFAB4F816C4D0AD27B0084238CE0ED4D981C4181D598A666EF8DBE9 + D7AFD7A7D2E5562A955D5151917129EF27D7565656BD94959D73C068347AD136 + 414141B95F1EAA5A830350525C10A857C4FCC8942B57AFA648BA4D5B32338AA7 + 4F9BFAD7C54B977CE2172F4D34180C5ADA263838B8A0F2C0BE2C24A61D096384 + 14F7D7C366A53434DC5E27E34E4A5CB6FCDDD898BA13274FFAAD5ABD264FC6ED + EFEFBFEDE8E19AED8418879612307DC6CC838D8D8DE368673737B7FB39D9592B + D7AEDBB0AAB9B97904FDE7EBEBFB53EDD1C373A178CB81A5085206720C00BE10 + C087D0FE1E1E1E8FCA4A4B76AE484D0D877F0112E89F01F4122836A2B5762029 + 165CF96E5238E99326EB773535358DEF2F6E2F2FCF1F4E9D3C1149C8363A2285 + BF34A74E9F0E0156BF80157B962A51A954066E4DB44EA3D1DCDBBC296D9E5E3F + E52C9A3B7D84C96A9094217575752F2E5C149FDDDADA3A9036747575ED845554 + 4B643517EF284C1D3D7AD445F8BC0DD28C63C8DBA79B9433677ED4A5AC5879A0 + BFB83FDCBA65C1C409E37FEB0F297C22CF64E77C1CB177DFFE02B3D9ECC29C3C + 0A85C23C3FE29DA4D4952BF6C0E723661FFE7A3031AB4FE1663B0444575D5DA3 + DFB8293D0E74AB9CE906D3B7AC5FB7B66CF69B6FD4C2E70D903B085EF814C66C + 3E6800EA1F5C5C523AB17467D9B6BE702F8A5BB87A59C2D26FE1F31FD42B2CD0 + EC2CFAF0C1862E5E92B0F9ECB973B1CE94BF3C6EDCAE92E21D1BA0D8C06C61B2 + D7FC98D5F171D0FE9C149091EB37A64DE4E438D31D1636F33858E07750BC0A52 + CFACDB8783EF64F6215990C20304B79021807B5E3F705721D1F7983540F46C4B + 67A4F08102DF9A175E545F7F639A33E5C386E98E1DAAAAE4FBFD26593D47A4B8 + 21686E29C340462C8A5F3CFBFCF90B639DE90E09197B01FCCC5750BC82A4DC41 + F08F9D90E285A4F803EEE47EE0CE27A4504B71480A9F84F772F07AE0B157B13E + 1EFD94C95BB3B66FCB665627285B8BC80D844F190AA2CBFD242F7C5779C59CBE + 7483891F4A5C96C057946F1FEA53689EC2497147FD83C117461CABAD5DDE97EE + D0D0E91F6DCDCC38C8ACDB87EB1551CDE1F6D102E0D0FC82C2DDB27352ABD54D + 9D9D9DDEB48E3B31087B51B131D1479835E6CBA48895E4FD86D61E3FFE2A4482 + 4CD9A96AB5EEAD6D6DED1EB48E3BDFCC8CF4B553F5FAEF91141A7DC4027247DB + 9D039557EC0EC9CB2F28EF2FEEE4A4C49898E8A8F3CC96033974B46ED7AED58D + 8C7B2FFE6B880E8154C9A0413EBF1415166C84C8912BFF832871F3D39DA5B386 + 0F0FE6A6FE58224544079F9BB76E3DBF2032BAA2A5A5E539DA3F3030F04FD82A + FBE74746C6DDBFFFC02E72787A7A36ECDD53111D1810F007B32671224A0852BA + 33E5CB977FF503DCD510798264DC25454519B10BE3B264DC10817E07DC61A346 + BD7097D932E65EA4784C0B9DB1FFEEDDBF67D2CE3CD66F4E4F9B032B760556E3 + 15B0A27D5D5D5DEEB48D9F9F6FCDB1238723A0D84AAAEDCC1B74E7CBBAB55A6D + CBEEF2CF72753ADD23708EBE49C91F24C1AA6A1CE84E62F6662EF294EE6C76C2 + A4D78A1F3E6C992BE3DE51989F3076CC98E6EA9A6F02D236A5E7C11CED1243C8 + 553E875C6509B3256F26991411253C992D25B620106EBA069CA048F37BBA32AB + 1314D1815A0A27458326CEF7BD0FEAD7206966664BF34532A6C46F03EA7D8084 + B4619DBC7DD4ACF7B94A9C7D449A2FCE490A664BF3E9B94AA4F9E6A771201413 + D52070772C8B3CC2C46C074271B853927F1D08BA1D276164B64847F58BC3A02B + B33F65D3444F29E93632DB8150E87D2AA764015C9C64C5D5015D497A925531FB + 53AEB83AA027590BEB7DD5E0E2A0AFD02F1E25C144C7168BF254AE0E2831F482 + C9D9458F7C5944FFC9174D8C3DA14BA67F0133893470B75DAFB1000000004945 + 4E44AE426082} + OnClick = CloseClick + end + object m_btnMax: TPNGButton + Left = 965 + Top = 10 + Width = 21 + Height = 18 + ImgStates = 3 + PngImg.Data = { + 89504E470D0A1A0A0000000D494844520000003F000000120806000000EC6D06 + 37000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F330000029D4944415478DAED98CB4F534114 + C66F4B0BC5DA4041C4F7A2822ED8106835F11F30C68D3182AC4C342A2C5918B7 + C62D71E1529448C20AC11837C6F80F98688B61E342C52E7CE30B0D8F8278BD7E + C7FB8D39DE78C15E6051CB245F663A9D7EF7FCCE9C195A428EE358ABD56CDBD6 + 2F435058F5661C5AC2C2A17E508EEA2DCFE7C36ABC9CA7A5BC7E3F27A4E13DC1 + AFA44930155084AA52E30A9F60251009E03BB5A0C6B6C737ACBC4C62FD9A49A4 + F136E3358397A0A284AE86E2500CAA54F0BAE4CC6B09E01B340FCD4205266191 + EF9B841AEFA84A809FA7815D545EBF12EA85DF80AE9E01FF6B93003F41736A2E + 42D88D500D94E4B84AED92CDE0CC6E9A5D920067A029E82BC7F37CCF9B505351 + 61F579E3A9E74C25FD91502FFCCED6B6F48B62B779FC516E17BA976A4A763841 + E80678DE0FE07900DD0726619A10022B1B9480E7F3009EBBE9251BB5E085DF03 + D327014CF7A27BAAA664D765C737435BE1792F80E741746FA1F7965B015229D5 + 4C6A0D3C1F07F06CA19724A0E00BDFDCD474777464F82233EF6DC98ECEAE0BCF + 26260EF9C04B9075D01668073C6FCB6426937E78ADFFCA301F2E41C8F9AE64A2 + 1267BA7BBAB2D9DC3E7A1E41F70A7A077DB6DCD28D736D2D3CC7655D2A95BA73 + EBE6C865CB3D1A05AE8B3086D8D1639DBDF97CFE303D5BD17DE1B36797833F89 + E1E45FE01B013FB804BC94E626681BE14765329D6E7F3070B57F88301F19708C + 6BEB4E9FED3E91CB8DEDA76707E1DF70AD40C9BD514BF831057FC972CFB3DC0F + 72A145B9360EF8730ABE9DF0A299B5846F80B613FE8682BF4E984905DF280900 + FC29057F9CF0AF2DF7EC1B78B94792F0CC2AF83E56D3B4AA26391E09C09F57F0 + 1956F2D43AFC7AD9FBC397E785574CFB5FFED495F5979CB2FE7A5B6C32FD5A49 + FEB0592DF8D2FB49BBD2566AFFCCF80990017597BCE4EA990000000049454E44 + AE426082} + OnClick = MaxClick + end + object m_btnMin: TPNGButton + Left = 935 + Top = 12 + Width = 23 + Height = 13 + ImgStates = 3 + PngImg.Data = { + 89504E470D0A1A0A0000000D49484452000000450000000D0806000000FF86A3 + 28000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F330000018D4944415478DAED97CB4AC34018 + 852769ED458D552BD28D5DD69550C4B50FE0C28775E103B81629B8D2A56E44BC + D5A8BD99C4F39B3332849A964C2A54FAC3E10CB3383DF93A4D52278A22358B09 + 82402F1DC8355CAF9D2962222AA422C35522C735D6D3662B23F3E7F31C138A71 + 21798D942B4045AA6CAC0B13CA4B3129F4490D8C7590C8778D4C0D7ED268D0FA + 33F47AE650A4E412612C43ABF432F7D3CA4BC911617C406FF401F72303788999 + A5049CB46C0D63C8CCA1069E842285EB503503801EF4C8E27AA46005F2A07568 + 8BEE71BF98922705FB900FBD400F749FFB21C156D8D7B300EEB3BFE48E925076 + DAFB073719807C4FE7E2BC09BB35B64A2CBB0935907D66917D08BB839E781121 + 01AC4035645F5B64B7605DE85D4025A1B4107E6511BE0B33CBC9B7B8066D4302 + FCD422FB48C5C0EFA157151F7F9DBF81EC4B8BEC3DD83373FB7F01A50635A026 + B24F2CB28F61728AE5B47409A54A287564772CB2DB2AFEE90B94DEE2A4A8C927 + 65714F19734F593C7DC63C7DB2C2FE6DFEC57B4ADE50E6FF8D36CF99E7FF3E5F + B19A31A2907770F30000000049454E44AE426082} + OnClick = MinClick + end + object m_btnRest: TPNGButton + Left = 965 + Top = 8 + Width = 22 + Height = 22 + ImgStates = 3 + PngImg.Data = { + 89504E470D0A1A0A0000000D4948445200000042000000160806000000744B4A + 09000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F33000005D84944415478DACD98596C546514 + C7CFEC4B67A69556B08D1A7868AB8911A10B2856D29652048AB410E3B3FAA4AF + FAE2032F2E212A2E0F466254822F060D04DBB2D4053586D46E208440AD0FB884 + D20296765A8AED6C9E33FD7F9D6FBEDE990E50083739F9BEB973EFFF9EFBBBE7 + 9C6FB1251209BA13472C1693C6C666D75AD5B7199727607158426BC9E17058E9 + 2A0DBBD6B7D2254D6FF659B63B08429C923770C23C5ADFA1392D0EC9DB456153 + 5A5FCE270C100A8203109C5ADF6EB8A1C02A7DD55F7810F842568738E76273B3 + F9D8F2D0BA34C795B3221261BBCE760DED34CE990FB0E37E07B43D86A60E58D7 + 9E82A6FC8E6505C12FE5E7A6100E673BC4D17FD926B35C235FCA0B0021B67BD0 + 77E33FDDE1289C140857D9C2E8FF87FF4C102E00107D3FA5A2CD0A848AB249E8 + 493F321F88071E5B59F937E570FC76A2F7416EFE314EEB35C10B00056C45ACFB + 738EBAABB8B9C236C6360E407A4D706B00F258772047DD65802B40A6D2405884 + 75190BFF9EA3703937BA13664D10088B0402DB62D6DD97A36E1D379734185394 + 5E13549A05E419ACDB9DA3EE43003BC1763D67107CE33A9AFBC52562BECF00C2 + AC090261B1CD662BE2674A44ECC67DAFD3CC57D60BA28DFFDF85FF377033CC76 + 996D0420F49A200082CAF8BE63B86F3BA58AA2B4C95187FFEFC0FF8FD04CCA09 + 8C6B2608B3262CD56E6CE4E64F9C5735E17E0D9409C2AC094B0484E8338C82E5 + 2B2ADE968B4E9DECDB4933B91A615FA4884500E23DE86EE6660820AEE05ABD26 + 88763E8004F8BE76E83E074D05380ADDA3D07D540331618248AB092525253438 + 3838A70F21A909BE2C20DCF84AE26451F5EA27BAFC7E3F0503010A068374F6DC + B9E445D5D555343D3D4D0C873C6E0FEDFEF8A357E53CEBBE03DD2644C425C098 + 0684644DA8A85A75DEE3F1909897EDE2D0505277D9D2A5B311EE743AE9C0FEAF + 3721220E4377394084AD40A4D5047138140A25FBE17098C6C7C77510E5703813 + 08AF8220915059BDFA98D7EB25311F5B3C1E279BDD96FC1D8D4693CE0618D2DE + 3D9FBFC63EC5597767061011446C3225565656F7BB5C2E5226BA76D6753A5D94 + 903ECF393C6E37B5B77DB385750544DB0D81404D18ECEDED9354A1CACA0A4985 + 12A3266403A1EAC2BD9216ECF05171B4ABF3F82BF2288E2E1F4781BDB8B85872 + DEFD4CF3B6370BF2F3E98BBD7B7600C41B195223827493680BB1EE19BBDD4EBD + DDBF4A2D490C0C0C0424BCCA4A4B653470D637AC6FF5F97C74A8ADB519200EE6 + 921A65C68BFD41E9E370D9E36B6AFA254A3A8E1C5ACFBFE3598AA51FD12020EE + 6387DBE1F04BA83112B7768479B0B965FBBB858585F4D9A79FBC2579CDBA3BA0 + 6B16CB18A50A64684545D56949AB13BDDDB5949A70A9B9856F5D43E3913C8EB4 + D683079E65DD18EBEE876ED6625996E50BCBF1F0868D9BCF8E8C8C24F35A3F32 + 801008522097B0C36D70F8053C5C9C76E0EB2EDADAB2EDFD0B170629128998BA + E6F0190708C959192E4F89EEC9BE9E1A2BC0F50D8D1DA3A3A37346C4F986CF5B + 01614EA8D240486EC2E1E7F125D430282F55D4B465EB0743C3C35620CC091599 + 2070DD930011256D025757DFF0ED18D7370B10592754F381283752E32F9CB79A + 62A7A5861AD658F7453810A1D484A8E0E94D4D1F86B8387FB5EF4BA92161F66B + 14297191D2A7D8763D3558F734746B28B540936B64D4CA5B5B5BF79DD7EB137F + 37C2CF09401DA34C536C8B6279231328F3482B96DAF8FD321EAEE7725E6D7DC3 + 2E296A87DB5B05D45580BD8C565F74C93DB3C59275CF40B796522B4AB510F3AC + A979AAC3C523C84F3FFEB01630553A4C50A64597397C663B741016FB0344C6F0 + A9667CFA21C553D2C5C9F73B5D4E82C32D7879B11138AECF3A9DA40D9FACDB6F + EA8AA698E83BD86408ED3CFE4B8506621270AD97E137BBC8CA00226D42C5BA5D + 563AE2AC725EFA3D5D9D358020A12B2921E1AB6FCCA8BD0CB5C83A6FA5AB60A8 + 7E5F4F572900A855A72A727337666E76D99D01C45DBDECA6D40ED50CAC79165D + 391D1940DCD51B310A84F2FD768258B0AD39E3710BB23547C6FEE7EDDEAA5B90 + CD5A8BE396376BCD8FF83F04188E95BC34C8D60000000049454E44AE426082} + Visible = False + OnClick = RestClick + end + object m_btnRecord: TPNGButton + Left = 28 + Top = 46 + Width = 39 + Height = 26 + Hint = #24405#38899 + ParentCustomHint = False + ParentShowHint = False + PngImg.Data = { + 89504E470D0A1A0A0000000D494844520000009C0000001A0806000000425135 + 88000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F330000067B4944415478DAED9B7B8815551C + C77F77EECC7D3FF7EEBAEBA37D89A491565A10D8830AA24833D3229430088222 + 82E88F08021182E88F08220A822009254A33D32802092B21282534D210F761BA + EEBA7BF7BE9F33776EDF73EFDC55DB6D67EEBCEEFDE31EF871CECC9C3BF733BF + F39DDF9999738EA35AADD2DADBEEA056A53F4EFDBED8610EC6C35C308F92F3CA + 7EBB920C9360655851C925E5585BB2DDBEFE4ED946861BD262EDE9743AC9C104 + 57A954046CFB606125175AC02AC2F2B09492B36DD68851D832D8306C092C6833 + 1FE3C8C0AEC2466013B084722C00EB82F5299C0185D9AEC4049655782661B36C + 1B822BA3E105858771F96DF6D9F5BECB297C59084E6C082EFCC8A38F7D3C3935 + F5740BA06E487DBDBD5F7CFFDDB72F505D78CC61AB9ED8BAEDE8D8F8F8B256B3 + 0D0E0C4C7C7DE8E02614CF3770B76E7BEABDD1D1D14DAD661B1A1A3A7AE8E097 + AFA23809C16521B828DA742FDA7473ABD9D0A647D0A6BB20B8444370FD801CEF + 1F5EDD6A36BA38728E85E501568475C3EE07DB813662DB8EE27165D76AB0FDEC + F20488E7F97A97C171E470382C6761ED569565D676244912958B59C6762F0E9D + 03D30CCAC3C82FDC7DCF03AD761BFDFACB8F8C6D25FC33D2101C73DCD9366AD4 + 35CC7154EF4AB780EDC336627B09C5C3CAAE0D60FBC61788102F08109D409C8D + 829321384912491245CA67938CED711C3A09A60994D7223FDD46825B07C19D69 + 08AE06D7468DBA0EC533B07ED833607BA78DD85E47F17365D746B0ED0F866324 + B8DCB528C7B1286797E094E826964B9449C519DB0E1C3A01A68B28AF477EB28D + 04B701823B6548708D8B16C572EDC2AB5519CEE66A8E1704972EE7FF477083B0 + 9D607BAB8DD8DE44719FB28B75F79F86A23DE462824394733A213A95F35E6313 + 6B118A6D33161621059C430B9B5C6B37A916DDCA105C3A31CDD89EC3A1E3601A + D32DB83921830DF99CDFC0548BE0C8A949BF99223816CECBA5225ECF64DAB5BC + 8FD645C2D4EBF5D054A148A79329DA7B7912AF4D1CB9DC9E5A37D364A31A129C + C56CF30417EE5A3227381E82732C724EB3D8D8F39B749DE052B3570D0B8E9D93 + 45CB6EAAD2D6DE6EBA3914A46EB79B664A25FA3B9DA143533334438E5A347734 + E137C382634E130B79DA1CF2D1F343FD242CF0E722EA7C327A910EA7F3E4F6FA + 3437AC51C1D9C0A65B7066B2992DB89AD88A457A30E0A1ED2B9611CFCD8F6292 + 5CA5039726E858B6482E8F47B3E80C098ED52FC269CF46FCF4E4F2A5AAF5BFBA + 7C853E4BE6C803E769E9C28C08CE26365D82339BCD54C181AD542CD016DC080F + F7F6A856FF616ABA7E4378BC9ABA57438263CF434BCB797A7BD590FA8528E98D + F3A374C5E5AB3D3FA9252382B3894D97E0CC6633537015B0F588457A6D708566 + B677C72ED1B4E021A706BF19121CBB4B77FA04BA2F16D50CF7533C41FBF262ED + 6E554B460467139B2EC199CD66A6E0CA886E9B3D3CDD150D6B66FB2D91A22345 + 095DAB57B5AE21C1653369DA1D0B52974BFB48C96C59A43DF10C058221D5BA46 + 0467139B2EC199CD66A6E0F2B92CBD8CAE3E22A847AB464A8A127D802EDFE70F + A8D63524B84C3A497BA27EE29B783596F01FBB13390A8622AA758D08CE26365D + 82339BCD4CC1E5B2697A25E42567136C15B0BD9F2E903FA07EA31A8E702F0A55 + 0AF34ECD7029A9421F890E5B229C0D6CBA239C996C6647B81D7C95024EED6CD9 + 4A85F64B0EEB231C7B16D9984BD0AD6EED9322FE2C95E9843F6ACB339C0D6CBA + 9FE1CC6433FB196E7D214DAB9AE8EECFA3BB3FE50D59FF0CC7DEB63CB3D3B485 + AB68863B2C3BA9D8D563CB5BAA0D6CBADF52CD6433FB2DD59D9AA58738EDD3E8 + 8EC91C95C25DD6BFA536BE27AD894FD26A0DDFFDCEE11ACEC6FA6CFD0E67319B + A1EF7066B159F11D6E6572868635B08D80ED42A4DB9EEF702CB12FE6C55C866E + 8A5FA55B649116FACB2AEC2F4EA07F624BC8E30FDA3AD260319BA19106B3D8AC + 1869281572B43411A79555E97FD92E3878BA128D91DBEBB767A4E17AE7B13141 + 2742F140264931B942AC372FC0E29C93C68311AA20E4B6722CD522364383F773 + 6CE9040D6653F3D8C60261AA84A2AA6C560CDE37C652B94C8A96E7D214C1B61B + FB4BB024582EFB432407C3F68FA5CE01D67F8B8B9E3F2383175CF50989C6668B + E89E9E64219BE1E949D7D844E4221ABA8A067480495044ABED1C964C4F52D82A + 0BCC1671F2753633668B7426606A67EB4CC06C322D3401B333C55C3B5B678A79 + 9369A129E69D45341A5267118DBEB4D0229ACE32C1C5B93ACB04F5FB6EFE32C1 + CE42E8455367217413496D21F4BFF618C0363FE1ECB50000000049454E44AE42 + 6082} + ShowHint = True + OnClick = RecordClick + end + object m_btnStop: TPNGButton + Left = 108 + Top = 46 + Width = 39 + Height = 26 + Hint = #20572#27490 + ParentCustomHint = False + Enabled = False + ParentShowHint = False + PngImg.Data = { + 89504E470D0A1A0A0000000D494844520000009C0000001A0806000000425135 + 88000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F33000004C64944415478DAED9B7D6893471C + C72FC9F3A45D4C8DD1698B4263EBCB3A5DDD6C1D28DABD20B88DD6971237CAFA + C7A6C806F32F19634C6463228E21E25F1514D9F48F8EB22DA8D3B229145FAA28 + D85659F7D26DAE35424B5B37B3D898B5C99374DF4B2F9BCEDAE4FA3C777984E7 + 073FEE9EE71EC827779FDC13B83BDBE8E828297F7A29C9555CEB689BA8D98E54 + 904E643E2B15765F5624911A32861C66A5C6DA4CC9F64CC5B2A44486FB62A2F1 + 74381CC446854B24122AAE5D480F2BD51CB0C69151649895F49A0EA217391B59 + 8A9C852C90CC4739869083C86E641F32C4DADCC8E9C822C6E966CCB2820A1661 + 3CFDC8DBF41AC2C530F02AE3A15C5324F7D9BD7D7797F145205C3C2D9CE7E557 + AA0FF60F0CBC9603A8FBA2A8B0F0CBEFBE6D7E8B8C89473B6CC1865AFFC91BC1 + E0EC5CB3CDF5F9FA8E1D0DD4A0FA5B1AB7D6FFEABE9E9E9E9A5CB39594949C3C + 1AF86A1BAAFD102E02E1BC18D32318D3B5B966C3989EC098BE01E14269E18A01 + 192C2E2DCB351BB9D9DD45A7651FAD221F473E0FB6AF4DC4B611D573EC5619D8 + 5A9DF96EA228CAD82BC36E27369B4D380B1DB7D164928E1DD1348DC4862394AD + 0A4D5D60FA03F55294BF2F5FF562AEBB8D5CBE7086B2CD43FF74A785A31DF7B3 + 8906F549DA7164EC55BA1E6CFB4DC4F60EAAC7D9AD4AB07DE3724F238AAA423A + 95D8250A9784709A16275A3C4EA291BF28DB3A34B583A90FF57294DF9B48B825 + 10AE332D5C0ACE4483BA04D54E6431B20E6C9F9A88ED7D549BD8AD9560FBA2C0 + 3383A8CEBCD42C67A7B39C2CE1D8EC168F8D90A1F09F94ED75345D04D34DD42B + 50B69B48B84A08D73129E112F8922323C3A95F5736417FF97979F9C4A128199F + FD9F707391F560DB6522B61DA836B25BF4757F78AA77267152E130CB391C90EE + 21C2FDC7A665FCAC3136E5A16CC9D4B869A9D92D06E1EE846E51B637D1740E4C + 3778854BD2D7722C46B44496FDE650F19D9DC49E45BFE9162E7A3742AADE6EC8 + EAD974B41ED84A5C53DC199FD32B9C04B60784F34C9FF5AF700A84A3FFE344B3 + D1FF6FDA3DC2856F0FEA126E381A25CBEA3EE4626B6BDA49F25DAE8CCFE916EE + 4E38449EE3ECB8F3E8B8A91E6FC6E7F40A27816DD2C219C966B47091A13079B6 + EE232EB62B4D1F13778127E3738608B762F33E2EB84B9F6D93269C60365DC219 + C52642B8A5FEED5C6C5703BBE5095759FF09175C7BE307D28413CCA64B38A3D8 + 4408F7D4DA77B9D87E38B1579E70E57EBEF77D6760A734E104B3E912CE283611 + C23DB1662B17DB2FA71BE409B7B0FA3D2EB85F9BF748134E309B2EE18C621321 + 5CC90B5BB8D87ACE1E92279C6F35DFAF21D8D2204D38C16CBA84338A4D847073 + 56D473B1F55E6A94275CD1CA4D5C70FD173F97269C60365DC219C52642B89915 + 7E2EB65B1D0179C2792BEAB8E0421D4DD28413CCA64B38A3D84408E75954CDC5 + 16FEA9599E70AEC5EBB9E0A23F1E97269C60365DC219C52642B8C7E6AFE662FB + FB7A8B3CE1D4F92F71C1C5AF9F92269C60365DC219C5264238D557C5C7166C95 + 231C5DA2D1E6ACE282537A2F485BDA12CCA66B69CB2836114B5B5A61251FDB40 + BB9CA52D6BF1DE5ABC97BA782F32ACED49D9C5A3BE3DC9DA80993D9BB5019333 + C6DB80696D31CF9ECDDA62CE19E36D31B70ED16411D6219AC9C5788768AC6382 + 137359C70427DF770F1E13B40E424F18D641688EC87410FA1FF0936827C0A298 + CF0000000049454E44AE426082} + ShowHint = True + OnClick = StopClick + end + object m_lblTitle: TLabel + Left = 360 + Top = 4 + Width = 337 + Height = 21 + ParentCustomHint = False + Alignment = taCenter + AutoSize = False + BiDiMode = bdLeftToRight + Caption = 'untitle' + EllipsisPosition = epEndEllipsis + ParentBiDiMode = False + ParentShowHint = False + ShowAccelChar = False + ShowHint = False + Layout = tlCenter + end + object m_lblLogon: TLabel + Left = 817 + Top = 6 + Width = 85 + Height = 21 + Cursor = crHandPoint + Hint = #28857#20987#30331#24405#25110#27880#20876 + ParentCustomHint = False + Alignment = taRightJustify + AutoSize = False + BiDiMode = bdLeftToRight + Caption = #28857#20987#30331#24405 + EllipsisPosition = epEndEllipsis + Font.Charset = GB2312_CHARSET + Font.Color = clBackground + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentBiDiMode = False + ParentFont = False + ParentShowHint = False + ShowAccelChar = False + ShowHint = True + Layout = tlCenter + OnClick = UserNameClick + OnMouseEnter = LogonMouseEnter + OnMouseLeave = LogonMouseLeave + end + object m_tabAudio: TPNGButton + Left = 962 + Top = 48 + Width = 55 + Height = 28 + Hint = #36712#36947#35774#32622 + ParentShowHint = False + PngImg.Data = { + 89504E470D0A1A0A0000000D49484452000000DC0000001C08060000000AB2D1 + 35000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F3300000DE84944415478DAED5C0B5454751A + FF66E6CEFBC180F982F011248496D9C38EB847B763656DEEA6ABA56B91182562 + 08095A561E5B77B192A4D5F04096A6B25A90F928B32DA39356A2B668659AA484 + 68A6A58B3CE4393330FB7D7F6670E07867EE63987139FB79E65CCEBDD7B9FFDF + FDBEDFF7FDBEFFFFDE51C48FB91BE45AD5F95F46E266037E62657F99FF2CBFEC + D8D139BE4EBAF9D6515E8F3737D65D95D8F0C3B059ACBD257F495DCD85FF630B + 3036855CC221D9FA814271CE64B6825667083620CF7101124EE1EB3C6F8443B2 + F5C3CD39B5460F2A4E1D6C489EE3A20DC326352831201936BDC10C6A8D2ED890 + 3CC7D5A3B1F983702B0C464BBADE680E369EAEE3F207E156706A6D3A7E820DA7 + EBB868233728576875C6F4AB2949BAC6D5A3B1C9221C06750AC7A9F34242F1C6 + 287CC676404D2EE130A853944A559E46670C36942B8D8D369283121D9FA25271 + 79467368B0A15C696C3D1A9B64C261404720C9CE58916C5793DCF2189F64C261 + 4047E0E68C5667028552196C28571A1F6D2405253A9D613361402A555CB0A15C + 697C3D1A9B1CC2E5A2944CF5B7946C6B6B83A55327C167478EC1E73FFC889C96 + 563965122E176564AABFA52461CB497C18767D7318761D3E22199B4CC2E5A2DC + 4AF5B7DC226C2F3FFC1014232EF29D546C3209D76DD8D29E7C1C2E9CFA190A77 + EE92854D12E13098311835B94C4AFAD96C2D2DF0F7872641BF502B24BFB90138 + B5B4EA29957018CCA9282573BB434ADAED3658FEE874E817160A092BF381E3A4 + 6561A9844387A7A2DCCAED0EB965B3B5C0CBD31F627E7B2C7F0D6293E637A984 + EB6E6C19E929ECEF15B9AB6561134D380CE468A4F8096B681F9492BE03A6B5B5 + 1536A43C0646ADF76A71A0FC2758BEF353245C33FC75CA0330E2BAC1F066F16E + F85462959342380CE468DC9C102A2529F3BD9B39174C3AEF33612565C761E996 + F7C186845BF6C834B8253A0AF2FEF509ECFCE67B49D8A4100E9DCDB099CC6128 + B75402B0B5C2A6B9B3C1A8F3EEB7FDC7CBE1E5F73F023B0665D6B4C93022EA3A + 58FDC967F0F1F73F48C226857052B0A53DF984CFF31418BB2B5F5FC7B0CD7F6A + 0E38114FCDD95FE19FDB774AC6268570B9465348AACE6012743E1168DC0D4340 + C7F1DF081AFCE98BD5F0FDD9F3D0EAB0C3A289F7C3CD8307B1634FBFFD1E9CAD + AB73FB40CC38A5102E97D3E852394E23E81A54B1EEBB6918E83598789CFCD82A + FF5305874E9DC1E4E380A5D3A6B0A0244B7BAB007EBE58230A976B9C00E28332 + 57A737A56AB47A41E75356BF67582CFA8D3FA932BF5555C37767CEA2DF1CF082 + 2B51926514BC03BFD4D489C6269170A2B1CD98FC47D06ABD254A277CFBF52128 + ADA864D8E6638573BA92F0B677DE938C4D14E1308833504AE688919214948D0D + F54C2A3A79A2528940B43A3DE8F54670E0F90B278C87E18306B2630DF8FF5EDC + F1319CAD15473AB184C320CE40299923464A3A3039343735328C4E1EC211368D + 468BF87478BE03964C990837BB82B2BEB9195ED8BC1D49572DF89AAEB1028808 + 4A7474868A53E7184D56C1D7B0DBEDD0D4887EB3D900BCF90D8356873D93C395 + 28870F1EC48E3534636BB07D079CA9161798620917286CF3D36683D3A37A6E2F + 7C4F1236C184C3008EC18C561612865252C40C1095EF3B63A2418FBD9893272A + 29531EFFED02945FA8621571FEBDE3E0C681033A8E13E9166E4649D6E6147A59 + 5184C3008EC13FCBB47A94920AE1B3922429C7DF188715CE9BA657C0B1B3E7E0 + F8AFBF31072F9A340193C9A0CBD83030D30ADE861647ABE0EB8A211C3A390641 + 95B1993BA56FB9E5896D5CDC10E6375E6438821FCF9D8713E83BAA1ACF60A2BC + C995281936F45B262A145B6B9BE0EB8A219C1C6C3409E2CB8ADFDF09C7CE9C63 + D832E7260374A9F66FBCB15E34363184132525DD46D93F3F61AACFF30E559E86 + B57B0FA05EB641FA5D636168E4B5B0B5641FFC39BEBD027D85BD4261E9772CF3 + 081CAF18C2E5AA514AAA044A49B751E6DB303BC9E779A53F9D8455D88FD2F9CF + 4CB89725932D7BF7C2E4D1A3D9F13D3F94C1FAAFF60BC6269270A2E496DBA80A + AC497AC4E779074F9E82D5BBF7326592818972D88048C45682D8E2D9F12FB17F + DDB8FFA0606C22092719DBBCB46441E7AE5CF526C396493D9F4603D5A74F43E8 + 80F66260BF540FF90585A2B009221C4949B55A9B6309BD461430B216AC5897EA + 6AA005E5139F5176D21B0C6032595850CE191B0F71D746C083392BE086887078 + 66E203AC0A2EDCFA2168B4C2A6EA85122EF686A1A2A5A4DB283934345C621990 + AF8753AA489AA05C3618590F9789413934321226BE948DDB08786ECA64562AD2 + 3716815A2D8CF0420927456EB98D30D55FAA45FF21365ED9857ED31BC06034B1 + 3E67EEB8312C514ECECE41BF45C0B3932732BF65166D63B25A8809255CA0B165 + A4248102DB8285CF2E62D866A4B6CF5ABEBA325F14369F84C3C08DC39B7654AC + 94741BCD52D22C0F6DF98C9C4253E4D81F3249F9C4E891101BDE1F5236BCCD8E + F7D2AA216BDA8330EFDDED603008238610C221D9E2F0EA47B5D83B8A91926E23 + B94CD992B6BCD8F01FCDE67278EF689672EEB8B12C99CC5CBD961DEF63D0C3B2 + 84E9307BFD26EC1784656A218443E732BF1945CAAD0E6CE4371CAF2FBF316C9C + 9AF97836264A4A90B3D66E60C77BE9B5F0D2F4693077D36616BC424C08E18281 + 6DDEAC44501A8D90F5627607B69479E9F0CAABAB44611342B83CA3D99AA2D34B + 5B9722BD3CE3F6E1BC930A6E3B555D035F549C62953071E40818D2BF1F3CBD75 + 076B5C2FD5D5C2CCD177C03B870E23E184495A8184CB43299922564A7A624B1E + 33CAE77915D89B16979D6099958232363C1CD2A8A2A144A109A559778E81F525 + 5FFB9B707928B752C4CA2D4F6C49A36EE39DE86A370554565D84CF4F9C648932 + 29FE7688C1449951B415B3BE0E1AEAEB2069CC68D8F8F541362126C404124E36 + 36213D9C1D2BE0EB6B37326C994FCD614A64D9F2951DD8E6633B918B89520C36 + AF84C3A05DA0D668B32D56F152D26D1464F7C54481D5CB7A0E6593FD953F4365 + 5D03D3CBD36FB911AEEFDB07167FB80B8C261334230929CB10F9345A614F7FFB + 221C926D8152C5656BB4D29F4AA0EA3669781C580DFCDF4103F8AABC02CAABAA + D92C6552FC48964C166CDEC61C45F787A42949657F494A74EC02CCCCD9060972 + EB32361B4C881B82D8F8839A06B00F936445751D6B051EC544797DBFBEF0DCB6 + 9D4C8A513B417E239FF94B52FA0BDB53A9B37CAEB5EED858D8812D73DE936C5F + F6F2D76461E3251C06ECAD4884526B585F418B89BCE03098EA311BD000F9CA1C + 4955EAE1A8CFA1F31F1C1603517D7AC3D24FF720E1CC2C23D1879A537F4C9A20 + D96E459F964A95926E7320E11A1B1BD0812DBC155CE5EAE1A87AD929286F1F01 + D1984C167DF011239C93B039111B8E43E8739BDE08874E657E932AB73AFCE65A + CE617EE331779FA3C30F25CA6923864134FA6DC947C52C28C967844F21C26FDE + 08174C6C5D0927159B37C2AD31994393B402F5299FD1C0A8E96CA53E87775940 + C9F43205A745A980BBA20642FF100BBCB2671F239C14F341B8356A8D3E49EE43 + D74E27616B6DBFF9C0BFE4A1C284450E0CD570703F568D70AB15FEF671B16029 + D2D57C106E8DDE604E92FB1E180593A3D5C1B081D31B368E25E4104E09E3875C + 87D842E0A5E22F58504A311F840B1AB64767CD64FBDD84938AED8A84C3607D1E + A564961C2929D638BCC5770D8C8008CB6530AF9594FA9D7048B6E7514A66C991 + 92624D8D4964426C34446230BA6DD9677BFC4E3874E8F31CA7C9329842247DAF + 246C1898E3A307C0B59820DDF62A264A7F132E58D89293133BBD7AE677C2D1CF + 2560C53960EDD54756D916632A68837B0684C3355DFA85D74B0FFB957048B691 + 78F30EB0672503F4FE1ED5D03FC546416F536772FDE3CB7D7E251CFDA400623A + 40CF1306EA95228A8E3F4445426F63E7E4B56ADF41BF122E58D86623D9BA5EAF + 3B08B7CE64094D0CD4DBB254D6A34C3AB823BC6FA7FDB54DCDB0E5F849C9E078 + 08B70EA56462A0DEDF23C9191B1A02BF1B14D9697F4D53136CFAF628EB0FA418 + 0FE1D6A1DC4A0CD44F0A902C8B0E31427C6478A7FDB588ADF0E809C1CB375D8D + 877041C176DF237FE9B4BF0D5BA3E52BF36561EB443892921A8D2ECB6CED1510 + 6064340374BD4103B7F4EF4CB80F8FFD08B50AB5E4A0EC4AB86048495AE81E1A + 6A819191119DF66F3F7C042E389C3E1E9EE5B7AE8463724B8D72CB1838B94533 + AEB1163DDC16D1BFD3FE0F8E1C838B4EA5E0258EAED69570C1C476EF8C844EFB + DF5A912B1B5B07E130404761F92CB186054E4A92D1D4BAC1D10CE3060F002DC7 + B10CF945452554B53AC16CB14A7EF7C8937048B65128494A3401949264E4B810 + 451B8C1F120D3A753BB6CF8F97C3AFCD36301ACD825E6FBA9279120E8D610BA4 + DC6AC76607539B1DEE8E1EDCE1B73DE51570DED60A267388E477FD3C09176C6C + 33931F0795560BB5A74F43D1E62D7EC1E649B80294920981FEE1155AED6F6CB8 + C416B7694D8A5E3835A28C341A2D6C61D81F6F7C23E10A504A2604FAA720E809 + 94A6A64668ACAF07BBC3C69E36A18A4DCB1F9448FCF1C6375A01CAAD8440FF3A + 153DAD414B22F5F5B560B7D95910122E6A01683DD11F6F7CF7446C8C70189C8B + 355AFD12734858408191D11B0424BD1CEC11A9F6B536221D4DC9CAA9466EC221 + D916E3772D5107504A7A6223D251A573AFD970AEA96639D83C08B798536B9718 + 8C16C9DF25071B254BAA061D7EE3D46C09440E360FC2F5486C8A98D8B8B11808 + BB032D25BBDB887068BFC71BB43BD052B2BBCD4538862DD072ABBBCD45B81E8B + 8D085768B6844DD5486C04AF567311AE48ADD54F55A9AEBE5F1593632EC215E9 + 8D96A9EAABEC3733E59A8B703D161BAB70F837BD6BE0FBA5B5FF2DCBE7D49A7F + 736ADD5BC11E88BFCDD6D2F86E5BAB230F7AA8DFF053D453B1FD17AEB78FD4AD + 569EA20000000049454E44AE426082} + ShowHint = True + OnClick = TabClick + end + object m_cbPreStage: TComboBoxComponent + Left = 376 + Top = 46 + Width = 73 + Height = 25 + Hint = #39044#35774#27573#33853#32467#26500 + ParentShowHint = False + ShowHint = True + OnChange = PreStageChange + ShowItemCount = 5 + Parent = Owner + end + object m_btnTS: TCapButton + Left = 284 + Top = 46 + Width = 46 + Height = 25 + Hint = #33410#25293 + ParentShowHint = False + ShowHint = True + OnClick = TTClick + end + object m_btnTempo: TCapButton + Left = 330 + Top = 46 + Width = 46 + Height = 25 + Hint = #36895#24230 + ParentShowHint = False + ShowHint = True + OnClick = TTClick + end + object m_cbFontSelect: TComboBoxComponent + Left = 634 + Top = 642 + Width = 119 + Height = 21 + Hint = #38899#33394#24211 + ParentShowHint = False + ShowHint = True + InterColor = 4011570 + OnChange = FontSelectChange + ShowItemCount = 5 + ShowMode = cbShowUp + Parent = Owner + end + object m_cbKey: TComboBoxComponent + Left = 238 + Top = 46 + Width = 46 + Height = 25 + Hint = #35843#21495 + ParentShowHint = False + ShowHint = True + OnChange = KeyChange + ShowItemCount = 12 + Parent = Owner + end + object m_btnOpen: TPNGButton + Left = 634 + Top = 47 + Width = 37 + Height = 24 + Hint = #25171#24320#24037#31243#25991#20214 + ParentCustomHint = False + ParentShowHint = False + PngImg.Data = { + 89504E470D0A1A0A0000000D49484452000000940000001808060000001C4ED4 + 77000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F33000008934944415478DAED9B0B6C536514 + C74FBB758FAEDDBB7BAF636C8E6D08010183424C08319190090AC830211AA344 + 0D314631801A238A18833124983801A32289883C8C86A00904335C90C778CADE + CFB26EDD606C63DDD6AD2FCFF9D82D5D7B6FFBB577859270929BDEDB7BEFD7FF + FDBEDF3DE77C8F2A6C369B0A00D4B8258C7FD2F1BD362B6EC3B80D8C7FC2434D + DC9A34B825E116771F350DE1D6879B598140253CB364E92E5377F70BF741CC04 + CB484F3FF0E7B1A3EB68FFA1262E4D4AD4F4236A2A0B034D7FA0A6970828FDAC + C7E6B6EBA716DF6F4D6068A9834B17CEE7D17EB86A8A8AD14064642444444480 + 42A904854211720D4EA7139C0E07D8ED76C0F682318B59D014899A9A9F58B8E8 + 7E57139CFEE724692A20A08A51546D18355E09ED87AB26B5261122552A844A05 + CA7B08940381B2D9AC60B35A61D8DC2F6852A1A62B6104D44C026A06890AA3C6 + 9B49FB529AEC761B8C5A2CEC4DC5AA767D4F0D1B111109D1D13110811EC49F39 + D81B6FC3FB9477BC8D04189E9AB40929A08A8A665E4A397E1F9533363A3AAEE9 + AE5189A4250AAFE7D5E4402F04EC59EE6A62408D7B27EBD8280C0EF40A9A08A8 + EA30026A8E5FA0AE5EBAC05CADA751254D2B9DCE1E9CC78CD70D909098041AAD + 56F21A1EA08687CC50F1CDB710A7D1789DEBEE36C1E6CD1BB1A123195C52460D + 47E594979743757535B4B7B73348C4A0F2D4149FA463CF4E5E8A7E4389F70C0F + 0F4145C52ED08869329960D3A6F7B8348D6039E5E56BE0FCF973A8C9809AA298 + 26070245D092771A43A06EF7DDE002AAA1F61AD8B15C4F53A9A220BFB0102294 + 7C6DD7DDD509DAF80450C7C5495EC30DD4A5EA739285C4AAD530AD64BA5F4186 + B656B8D57B93C1575854CCEE13BD8E03A8DB03FDB077EF3EC9DF6A696E82F73F + D88C8D1EE5754E8915A84210ACD8306BD7AE85C58B9F06B3D90C5BB76E81BEFE + 0156D1FE342524A7B9808A4440288F0AB526CA9F6C6E400DDCEAE102AAF6DA55 + 494D313131905FF088DFB6EB3476C0407F1FC2A7047DFE54BC2F56F4BA4901CA + 9FE9A7E4DF6914044A308289A012F36C7C40F5C1EEDDDF07AD69CFEE0A163A5E + 7F63BDEBBBD6D616D8B1E32BE645282FF2A5491CA8D06A22BF39D940F9B3ACEC + 1CF649400946101254629E4D165054A114BAC4DE38C12867D068B460EC308079 + 7070C2BDC92929909195ED750F2F503BBFAEF0FABEA7A71BEA6A6BA0B7B717C4 + D321058C8E5AA0A9B1119E5FB10A4A4AEF7AD61B3D3D70F6DC19A8ACAC64B991 + 2F4D52408552137987C9028A3C1E85AE2895F49015E586744DB7A90B5383A109 + F7262626426A5ABAD73D4103959C92EAF23C3C46303535D4B98E2944CA0B797D + B07DFB8E09DF555555C2A143BFB2D0C1BAD84EA748E977125D3A97A64B857737 + 6C769DF96CEBC7308861262656EDE53979810AA526CAD3260328CA6105CFC363 + 04537B5B8BEB38BFA07072431E09A2420550CC83B77D0AD2A567406B73A3CB43 + 9157CBC8CC66092695E569BC406DF9E473D7F165EC341C3A7480BD3D999999A0 + D7E789361E25B7D4D5AFAA3A05ABCB5F84A2A23B6537D4D7C2F1E37F313D0683 + 81C1E24B931450A1D4A4C26BE402A5D5C6438E3ECF050A754A7C59526A2A7418 + DA5D1E8A3C964E97CEDA8E12F449018A60A287A404DB3D2FF2347AEBC88B8D8D + 8DB1DE1D197925BABFBEE61AEB35CE9A332F68A0366EFAC875BCFFE79FC08871 + BE00CB5EFEDC2A494D23232370F8E07E888F8F87B2652BD87746E375D8FBC31E + 78FB9D8D108B9EE0CBEDDBB0F7A8F5A9490AA8506A52ABE364039593AB672050 + 82ED9E1779B51D3E4F267A31EA2450C823A3DC89606C6D6A64BDC692E933E403 + 4595583A83D5ABE4508260044B2BF66C483C1985491DC65D437B2B768D87257B + 87BC40AD7F6B03DBEFEBBB05FBF67EC7F65F5BB71EC343ACA4A66D9F7E082B57 + A117282E65C717ABCFC2D93355F0ECF2559099950326EC1A1F397C2068A042A9 + 492E50E4290B8BA6B17DA9A104C10816F24C83E3D1871C08E5BC5D08A1C56291 + EC1D060C1401918D94FBF34E0250A64EA32B31379B07D9B1002195A31349EC78 + 817AE5D537D9FE056C802B972F406E6E1E2C7E7A894F4D3B777C018FCF5F0043 + A885C0CECD9D020B9E5AE4CA092AFF3E011DD881888A8E090AA8506A2220E400 + 959C9C02E999597EBD9300D44DEC4C088939853C3A16204CCFC8640E42365042 + 32EDEE79A42C03C5931148EE3D3CC1C8D379E62A8100B57ACDCB6CFFE8EF0761 + 687808E6CD7BD2EF98CA99D3A7B0F11590856F7E0E369CA7FD76E41796AB2883 + 4CCA43A94921332917926977CF23653A5D1AFBA46770EFE109469E4E6CBC2E20 + A08470471E86C29D1CA3C4BCB048FCB778812A5BB69A55CCC913C758BEB6B46C + A52C4DA6AE0EF42C67BCC29D982629A042A949CEC0A610EEEC0E3B86BB1A599A + C863E54D992A7A2E20A0020977FE8C9275319729D678629A066FF763282983A6 + C65A0C13CD9094940AB3E7CC97A5E962F5BFF8469AB9BCA61850A1D62407A840 + C29D3FA32107B1DE39193750F598C491CBA407E30977FE0C7F4C72FE8F07289A + EF2A7D7436D4D55C66953BB5A01832B27265693A7DEA04A8351AAF5172314D62 + 40855A53B040D1900DF5CEC84BF1843B7F5654522A39FFC70D9460F4203557AF + C812E43E8E25667CAB0DEC601F9FD5B75AC7B003B04096A61E9311BA3ADBD19D + 6B44CFF34C0E334D7641931566CF5D285B53A7B18DF5EEC8829D1C168CEAA9A9 + A15E9626F7712C310B18A81B98E90B634AC19AAF7047C6039460B436283A5A0D + D9FA02599ADA9A6AB1B1AC6C669F4793D8F215774DB1B15AD0E717C9D2D4D2F8 + 1F82637125BF7297AF50AA228C29056BBEC21D993B505C0BEC68FCC8D7D8138F + 512FD1D772974016D89116AA68AA64A78F71155FC6A63D00D8F48858B813D3E4 + 6B811D69A2D503D4F80E67709A0852077AA308B7896AB90BEC2C96112C33383D + 8245C7C6F85CEEE2BEC0EE815C022CCC8F39A9E19CDC3F31D110067FAB2E035A + 024C0D2F396FC72989368F721FB425C00FFFA4F0E06A0ACB3F293CFC1BD583AD + 29ACFE46F53F3AAAA54C2D36C44F0000000049454E44AE426082} + ShowHint = True + OnClick = OpenClick + end + object m_btnSave: TPNGButton + Left = 677 + Top = 47 + Width = 37 + Height = 24 + Hint = #23548#20986#20026#25991#20214 + ParentCustomHint = False + Enabled = False + ParentShowHint = False + PngImg.Data = { + 89504E470D0A1A0A0000000D49484452000000940000001808060000001C4ED4 + 77000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F330000063F4944415478DAED9B7B4C535718 + C0BFBE004BA13C664B5110C439F0410C688C9339895BE2A62E5B302E33616C8B + 71EEAF65CB96B0CC7F96CC3FE6A24B7492F9603ADF93C47F9C9903C966B6CC65 + A2321E81E850740F41A00FFA80D216F67D672DB1D07BDBDB7B2F2FFB2527F7B6 + 3DB7F7D77B7EF7BBE7DE73AAF07ABD1A00D062D1FB97F47AA2C383C585C5E65F + 428C2962261D96542C8993C8E4C462C1E250A050FAF52F6C38D4D5DDBD651260 + 8222C3683C77E9FB8BDB693DC61411931299BE41A64D5380E90232559050D9CB + 8A96DFCB9E9F3FD94C70FF4E3B34DE689847EB5395292E41076AB51A542A1528 + 944A502814B2338C8C8CC0C8F030F87C3EC0F682A1414780498D4C1DAB4A4A27 + FB30C1D55F7E24A63C122A1FA1DAA650E315D03A1F930F0FAADB3D8807D72378 + 1F4A9440AD8983B8B878B62E9449AB4BC1ED352895866D1F10CAE7C38676BB59 + A30B0DFA0EFA4E0D72856222A1865128FABD5E8F075C0E6B8049834C4D5348A8 + 42126A2941F109D578FD5AD43B4A4B7F02B2737223AAEB6FBC425AE76372391D + 70E2C4A9A899EA2FD7C1D747AB619656C7328D10A6247D3A685046CA524ACA52 + 7EA188E9ECD99AA899EAEA7E80C3870F81569BC8BEF7D16042F9B39367C80D76 + 5B5F808984BACE27545B6B73D44CFA9454C89C3337A2BA7EA18AA3126A59F10A + CEBA43F883CDBDBD10171FCFCED8AE07FF32A9E664650B6E3C2EA67E9B058E1F + 3F1DF4DEE6B297409BA81B5797CEECE4241DAC5EFD0CB23C0083D108E5AFBF89 + 52D5C2B99A7378D952313922654A4E9DCDB21B6514950AA5F20BD56FB3C28993 + 6782B62D7B65534826BA7C25215349C91AE8EA42268301CA2BDE82CB75B55053 + F32DA62C6510D3300A451990B2131DDF7E4B4FD442152C5ECA59D7E319029BC5 + 82274C1C8A3B043D3D0F9954469309544AFEB6934D2887DD0E7FDE6A075D5212 + E874494C288A595A2D2C5898CF2B9510A18E1C3916F4DEB66D6F40B23E755C5D + BA04998C06A8FC68273437FF012DCD4DF0DAD672F6D9DD3B1DB067EFE7981134 + 9C528D65D2A719468552A3500AFF254A4E2612D0FB885036F343598472399D70 + AFF30E9E04899088999284A248484880ECDCF9BC524DB85014E1A41222D48103 + 0783DEDBB1631B2427A784683C2F983232E0830F2BA1B5A5195AF1006F7975EB + E8E79D9D77A1AAEA4B6C4075C80EB610A1E4629A6CA128C249254A2892822BE8 + 600DB85CA0C2B38B96E6BEDE71DB926CA14288507BF6EE0B7A6FF767BB203E3E + 615C5DEA7F68346A309932C189FD9CACAC79B0B6745D509DFDFBBE809EDEBE90 + A20B114A2E2629859A97339FB7EDDC8383AC0F37884B9BD5326E5B922D548812 + 4A4C4825D4A7BB764BC6F455D57EB058ADEC2408C7C427945C4C520A252666B4 + 501FEFFC4432A6A3D507C1D66F172D945C4C8F9D507480D3D2D3C186773A7499 + E30BA9847AEFFD4ADEFD58CC7D70F36603E4172C86CC4CFE5BDFD3A78E81C3E1 + 142D945C4C720A45CFBE525252C06EEF679739BE9810A1E8E02E5A5A38FA9A3A + E4D431E70AA9847AFB9D7739F761B598E1E4F16A76CB3E30E0820D1B5F869CDC + 3CCEFAE76BCE806B6040B4507231C92514C9B460E153A3AFA9434E1D73AE9810 + A1661B8CEC195320FEF9EB3EF43CECE6AC2F9550E515DB39F771A3E137686B6B + 658D470F1C0B162D81A2E2959CF52F5E380F6EB75BB4507231C925545A5A3A18 + F1C62010DD78476EC62CCA15132214DD85E4E63DC924A1CC74B7E336EFF08354 + 42956D29E7DC070DCBFC547F89DDA5D083B9B5EBD687BCDB0A447DED77E0F178 + 450B2517935C42A9907D6E760E938432D3DFF73BC187FBE28A19DD297F71E366 + C9987EBE52C79EA88B154A2EA6C7AE532E24A412AAF4B98D9231FD7EF50A5B8A + 154A2EA698503C219550AB4A9E978CA9F1FAAF6C945FAC507231C584E209A984 + 2A5AB14632A6D6A60650AB551109C537385CBCF2590999AEB13E0E314939382C + 2666AC504E871D0A962C978CA9E376CBFFD92082A117AEE92B4EA71D0A973D2D + 19D3ADF646B664432F93347D656C442A54D809767CCF9584060D1087191C0E3B + C18EA6568C80027C514CB01B1B81ACA4C18CC333381C76829D07B3874AA5C14C + 229E49C9C6EF7C2C03B2C1611113ECF89E2B098DF85909E106870BA7E514E0C0 + 01C615F13BC50653F24CE58D740A309BA6EB2FA291A88CFDEE69340538F62785 + E9CB3425FFA410FB1BD5F4669A527FA3FA0F99C98C3D4B4D6329000000004945 + 4E44AE426082} + ShowHint = True + OnClick = SaveClick + end + object m_btnUpload: TPNGButton + Left = 720 + Top = 47 + Width = 37 + Height = 24 + Hint = #27468#26354#19978#20256#21040#21809#20316#32593 + ParentCustomHint = False + Enabled = False + ParentShowHint = False + PngImg.Data = { + 89504E470D0A1A0A0000000D49484452000000940000001808060000001C4ED4 + 77000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F3300000BDF4944415478DAED9B0B5054E715 + C70F0BCBF25CDE0F81A0280134813A4A7C8DD6F86A93AACD4C4C3535354E1235 + 6A62DB99B45133B56D3A49939924B6D366A6339D692735355A8D4E1B2B6A3309 + B6464D10AD150451DE022E2CB03C965D9665979EFF81BBEE2E2B2CC8469CE130 + 3B7BF7DEBB77FFF73BBFEF9CF37DF7C3AFB7B7574D4421FC8A1878C7E7AFDBAC + FC32F1AB7DE09D263479AD298C5F51FC0ABD879ABAF865E097D18F818A78ECF1 + 957FD43536AEBD07625C2C3121E1D0C913C7B7607B4293579A54ACE92FAC69F5 + 38D0748C356D0450A93367E5D6A44ECDBAD79AA8B6F21A5DBE543819DBE35553 + 60501805040490BFBF3FF9A954E4E7E7E7730D7D7D7DD467B793CD6623F617F5 + 741B154D01ACA962FEC225F7BA99E8FC17F9D0340D4065B1A8D271E4BCE9D81E + AF9A42C2222940AD66A8D4A4FA1A81B23350BDBD56EAB55AC9646C5334A959D3 + 957104540E80CA86A871E4BC1C6C0FA7090D6CB5F64803DBED366974989F9F4A + 22883A3090A348C05D3BDC5D5378440C5F5B23BFA1429472BABE389DF5587B7B + A8CF66A7BE81FD3807E703C4D16812A006A293B5C7429DED2D8A260075711C01 + 35DB2BA0106AF58D3A6A6D69A11EBE21678B888CA2B8F8040A0B0FBF6B51DE00 + 85C605482AF6C9F265CB69E9D2E5949098E87A73E7CED28913795459554541C1 + 21929EC64A93362A8E0201D4001C2A86C345D3F215B46CD90A0F9ABEA0BCBCE3 + ACA99A82828247A4C9CED7B7D97A0556B47F8741EF355036EE6C86E6666A6B6B + 138DCE161EAEA5E898580A090DBD6BDF790D547B9B816AABAB1C9FD3A63D48BA + 5BF594382999CC6613D5DFAC95FD000AC7C6D279EE9AE0384BB799B2323369DB + F697682028D11B6FFC92D6AFDF407F3BB89FD2D2A6D1A6CD2FCAFEE2A22BF4FB + F77FC7B54E804488418EE288826B0E95BADC354544C73B800A60A0F88B3ED784 + FAA9D709A8F6D626AF80EAEC68A75BF5758ECF29A95348AF6FA4B8B804EA66CD + 8DBA5BB21F40A5A44E267FD5E87DE71550AD2DCD0253E2A424F9ECCF0D806854 + 7EFD9A0005880014206A6F6F9373D233B23C428528D7CEBD243A2666D440592C + DD94939D4D5BB66CA38307F673C3DBB961BAE9D4A913B4E7E7AFD3D12387A9AC + EC1A3DFDF433D4D9D941F3E62D90C279EFDE77393D05B8E8821E8E2D949B9B4B + E7CE9F278D26C82354C301D5C3BDDED79A460314024103C31417172F9F919E11 + 8D6AAA2B052840D478AB417E1FBA60A969533D42852867ECE8E46C14397AA020 + BCACE4AA0084B456567AD591D6CC2613056A3422068D6BECECA4CC190FC9F9C1 + 21211CA9D207FD60755505F7980E391616E6393D0E05141A5BEDAFA2DDAFEDA1 + BCE3C7E8D2A542FAF5DBEF5229EB92C6E0DED7DCDCC451B39BF44D8D94357D06 + EDDEF50ABDF5F67B545B5B437FFD701F6B0B7538A8ABCB485BB76E63E7CDA137 + DFFC15D53734C8BD8C04283FFE0B5407F85CD34881426AAB2ABF21008569B554 + 5551EE486B16B359EA4B00A6560792A9AB8BD2D2D3F9FC724EC54112A9DCADBE + AE96BA8C46391612E2393D0E0B14221328074C78075871098902917384C23134 + 160CA0E898FACCE90F09588AE9F54D8ED00B47647014C3FB4880EAE6F4BA72E5 + 2A9AF98D5974F1D2059A3D7B0E7DFEF9A7F4E597E704E86DDB77D089BC7F521D + FF4E56D6745AB468B1A48E92ABC5F4E49AB5F4CE3B6F5197C92CA904296AEE9C + B9B4FE07CFCAB5DB0C064E51AF4BFA425DE42D50BD3D565AB57AB5CF35A978A0 + 3112A010998C9CEEC2B411F20EB0A2626325FA384728A4C4D6D616F94E288302 + 3FA1C3A3C6530CC7513FC3FC79649B8628E621550F0B54D1E54BD2B8A953D2A4 + 6672AE8F9C8182A1F100150A476C2345262625CB31F4BA4AEE2DCA284C010FC2 + DD53CC504019392CBFFAEA6B6462B00E7CB48F1E7B7C15D7271FC9880BB03DC3 + 8E389DFF19E9B900458F8EE5069C3B77BE344E466616FDEB641E157204817362 + A22369C78F5E71A9614A4B8AE9830FFECC457CA838D81BA0BA3952EFDCF5339F + 6BD26882B930B77B0DD4758E9048A749C929523339D747CE40C110A150DA20AD + 611B29329683070C35F2CD9A6A17DF2142E17AEEBE1B16A8CB172F38220D0042 + 6DA4983B50CA3E9C83F00AB0B08D61EE0DDE6FED711D5DC0121227C9CB5BA03A + B846DBB96B0FFD76EF5BDC487A7A61D376FA70DF9F188060769E99363CFB3CE5 + E77F4A8D8D8D02041CBA61E326FAC3FBBFA18DCF6DA6D0D030FAF8C821D204AA + E9C5AD2F5374F4E05AEED4C9E374E142818C0C95061B0A283377969DBB7FE173 + 4D05055FC9EFD930A9E90550A5578B1C9106004D9E32D571CC1D28651FCEA9E3 + 340CB0B00D1F5657550AC4EE1603E862E3460ED4680DA0095C95E55237793238 + 2C6DEA343E57EB2550067AF9873F19B526D4709FFCE308AD796A1D4D4BCFF078 + 0E4658473E3E482DCD2D52630C079489EB8A1D3FFEA9EF351D3A40BA261DD96D + 76AF811AAD013481EB668DD44D77F25DCA03A97C6E98639F57408172D450C345 + 28DCA48E0B48A4471C0BE61E3E89C3AD85473BB02A6E3867D2E3B9168B8888EC + 2FEA35B70BE1A180EAEC68A3E75ED846470FEFA76AAEEFBEB76E037DF2F7C312 + 0DF03BAB9F5843055F9DE59CDF2A371CC80E9FFDC83C3A7EEC28ADFBFE4609EB + 574B8AF877A318844E7AE2C9B5320FA3D8D933A7B91179C4CADFB3582C8EB437 + 5C847A7EF34B3ED704B8BB4C5D32B9E92D50707838D750C3452814F0FAA62649 + 8F3816C4234BD4CACA7C63DDCD9B1C196FFB2E862313FC8E148AE2DE6BA030AA + EBE186452D847780A500E40E141A06E718B9515043012C14828E1BE45AC039ED + 25A73C20C2DC6D28A04CECBCC54B56488317169C232D03A9D3359089EB185C7B + E1A225545C7459EA19A406408BC6413D979C32999D934FCD2D7A796462EC6CA7 + 55DF7D8AB4DA08C7F5CFFCE733999709E4EF785B43F530348F2EFBB6CF356134 + 36921AAAAAE286FC3E6A21BC032C052077A030A8C23900163514C082AF15AB28 + BFEE120C50A64446450FF2DDB040297350B8380A62A4263484525301286CE358 + 3D531CA8E9A7B5C7D24333B2735C7BCC180085868CD046D29C798BA8BAF20625 + A5A4726337D0F5B2121E11B5D0C26F2EE7D1D3652E24CD14C99A7366E6CA2806 + 05A596BF773AFF24DF4384440A685EBCE45B3C38B81D0D0A0BCE92A1AD75D0D4 + C15040E1F10ADAC7D79AD40CDC484679CA1C14404747446A8A8D8F77D454004A + 131C2429BB51A7E348D33FE2B6F2A8353D23D3E55A6306140CE00010A43ECC45 + 602E08690AFB1480604871800B002A6972AC818213BA380266E7CC96B99B33A7 + 4FD1ACDC053C02D248D80E0909E3C8609461364654E81086D6669ABF70295D64 + C7745BBA1D211ACE7B64EE22971AA0E87F851C613B460414C2BE897BB6AF358D + 142818C0012029A9A912E5902E913AB14F0108868889140D009534E933A00010 + C227263201096E06D307D8870805A894C94C4FA96E2C8152F458BA4DF460E6C3 + 7CE3911C19AB29342C9C2E9CFF37CD59F0285DBF56DC9F1A977E870C86664E31 + 495452FC5F06B18334DC3B95911B9CF7704EAE40A05859E915EAE66B8F0428CC + 94DBE571906F358D06288CD6306AC34426E6A3003886FBD8870805A830F9A961 + 983CA53A9F00A598AEA17E609EC926F0D87A6D021322156E10B55432877BE7C9 + 4C5F00A54065E6A8101D93C029660AD7176A1901A2CE309BBB385A868A530CAD + 7A6EBC4A0407A98B9CE74DE0BCF48C6C991E50ACAAA2941BDD322C509E1E0E2B + 9A62E2120734057AD6C4F5525D4DB9442C0C469C3521FAA667E6B86A2A2F91D5 + 0518288CF6E17033FBAD7F9EC92E33E1364ED38009914AA228D75280C47932D3 + E7402986DC8C68A518664C314979279014ABAEAC20ABD348213E3ED1E373216F + 97AF284B5730BB1CCC6925282894FAF80F8F42D0F0664E3358D2A21978AAEF3E + 0987F9A0E8B8A48159F13E59F262686994E770EE0F6CBD5DBEA22C5DC1F3C650 + AE8330412A4F8AF9B89D352122411BE0F6A889EF253E31D531538FE3ADFA5B1C + 99AC72FEDD2E5F41EDA68CBA61D00E98EE04926278566B65DD8AC544C77224D6 + 0E3ACF19A8FB76815D9F2CEBB089C36432D7AFDF11123986584120C36F061223 + 2F181ED6AA0716CDDD61F6DEEB0576CADA25A41C72D2A4E27A6B484D039D04DF + C5D754B2864AED78CC713F2DB09B58023C024D134B803D9BF312E0897F52B87F + 358DCB7F5298F837AAFB5BD3B8FA37AAFF03FB26627989E7D71A000000004945 + 4E44AE426082} + ShowHint = True + Visible = False + OnClick = UploadClick + end + object m_btnKeyboard: TPNGButton + Left = 376 + Top = 638 + Width = 53 + Height = 29 + Hint = #27169#25311#38190#30424 + ParentCustomHint = False + ImgStates = 3 + ParentShowHint = False + PngImg.Data = { + 89504E470D0A1A0A0000000D494844520000009F0000001D0806000000B463BE + 33000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F3300000B7A4944415478DAED9C698C5B5715 + C7FFDEC6F6D89EF138B3EFFBA4CD4245D5264D33EA34939694A461A702120951 + C217D4AA7C284D1BBE9622F1010412428420A48A4085A844364A9B0969D2A2D0 + AA1026899259ECF1ECFB78DFC736E75CFB796C8F9D99A1C9C4B1E64A4FEFFABE + F3AE7DDFF9DD73EF7DF71CCB3A1EFC4C14799E643299383295DFEB148D463396 + 652ACFB724CB67F8E47279E22C973380729167E862677A00C802E0DD04330E16 + 218648249A802D1C0E8B73241249C0C7F97C4D790B9F04994221A7434987024A + 251F4A71C8E50A285846CE9065072D1B83C98669AD32B1F218640C5F38BC88C5 + 453EC2E2CC104A07A77C05302FE19386590934954A05754101341A0D0AE85CA0 + 2E804AA9828261242833D123C3DDB37C6CF1A20454980E015D28047F208840C0 + 4F4700C16008212A9340CC049FD446C9AA8B5F9C36BD481FBA5733CDE07B5692 + 5B496669DAC01D2B92F8BCECF7E4237C3185C805740C9B56AB41616121F47A3D + 7474D6166AA151ABE97A818053C1CA5BCFF91F0FB171F002049DDFEF87D7E783 + DBED81C7E386CFE71765C1605040983C0C73923A964AA5849ADA213A14B54516 + 0751924D9F364A4D4C07E776F34B497635325292AC7928B418EF4C41712C6B47 + BEC2C7CA61C0345AAD80AEB8C8801253098CC5C530188AA0D369094AADB0803C + 1CE32E5ABAE5292A865806CF47D0793C1E385D4ED8EC76D86D76389C4E51C610 + B2D2D2AD1FB78FAD38B7CB6834529B8A44E76208B381B59E8BAB4884DA46BF9B + 3B93DDEE80C36187D7EB132026B723237CFC830B356A343634C0326486872A69 + 6E6E86C56211D739BFA4AC684A39E7757A1D29578F99E969916F6E6AC6F4CC0C + 2ACACBA93E4B96FA10AF7315F535B7C03A3C021F59874CD0B072D82268E3E0B1 + 824A4B4D28319860329AE881D8110A07F140FB160C8F99C5FCAFA5B19D14A811 + F77BBD7E98ADFD22DF4AE5E6E101E80B0DD0EB0C989A9D10F9AAAA2A1A2EC350 + AA14989C9C84DBEB424B439B90E5C4794E5AAAD3C7F525950F52DD851A1D4D05 + B4F4FD16A8146A14D36FB43B6D98B3CD606ECE2614C6CA6338D942262BADA040 + 45ED32A0ACAC14B595B5A8A9AC21706D08847CF47B3B30381CFFED0DED28D0A8 + 443EE80FA59473DEA0A34E58C86D1A17F9EACA2AD121D4342D99989A84CBE34C + C84AF789EFA73A6F57DFE4F42859620D750A2326A627A88DC3989F5FA0F6B813 + F3D8ACF031B95DBB77A17B6F377EFB9BE3182200F650FEC2F91E71FDF9EF1D49 + 81E704C97092649AE85A53735322FF5D926759BE672DF57139E719B81D3B77A6 + D477FCF8098C8C4F2656B4C98917170C9F045E596929AA2A2B60501BA12F2AC0 + 95CBBD18B0DEC4D35D07F0EEC533E29EFDCFEC87A9548F8539B7F87CF66F67C5 + 5992696B7C004D8D2D89FCCECEED4296EF594B7D5CCE7983AE188F3DD299529F + D31180CD338BA96906703EABC560AB575ABA09F5753568ADDD8C62933667DB34 + 3DE5C0E0C84D8C91AEECD441783E7B5BF8426432BFFED52FE2D0A14338F6EA6B + B87EED1ABEF1AD6FE28F7F3829AEBFFE9337B075EB565CBF7E5D7C3E76F45571 + 9664B66EDB866DDBB725F2AFBFF16321CBF7ACA53E2ECF5437D7F7CAD1A3E81B + B088956C7AE22197E7793CBCB292AA2A2B515353058D5283EEA7BAF0CB9FFE1E + 576F7C8403FB0EE2CC3BA7C43D870F3F87AEEE2770B1E77DF1F9CD37DF126749 + E6A12D8FA2B6AE32917FE1E56F0B59BE672DF57179A6BAB9BE0BEF7D00BB671E + E3A4A8191A29E61716E072B9C5FC2F193E1E622BA933B552076FAA6FC2D3FBBA + 73B64DE74EBF873E4B1F86AC56CCCECE8969C46DE10B060304DF97703887E17B + F987AFA07FD042A0A932C2C70A321A8B515E5646E0D5A0A1A10E208BFF44D7EE + 9C55D43F2F7F0C57C08191E1314CD0501EB37E0E31F426C3A7D3E9A84DD5D8DC + DE86EAF26A3CB56F4FCEB6E9FCDFDF47DFD02D0C0E0E619AA64D6CC5F31A3E5E + E5327CA69212545494A3BEBE0E2D4D4D08F88278BC7367CE2AEA938F7AE109BA + 60B50E63746C5C583F868F87DEE4B9124F2718BE073777A06253454EC3C7D6BC + 9FE01B1834636A6A5A58F1BC874F4FF3C492129318721B1BEBD1D6DA02B7DD83 + C7763F9AB38AEAFDCF4DF8163D309B2D181D1DA3B9DFB458FD7ABCDE0DF8EE17 + F8C46A9056C7269309D5D50C5F233ADA5A619B73E4347C37FEDB077FC487C181 + 4158474685B27865CEAF5D36E0BB1FE1A3854613C347F3A385195B6EC3D7DB8F + 20C1C78AB25A47C8F24DC166DB806F03BE0DF836E0DB806F03BEFB0EBE769EF3 + CDDA731EBE40C48B810133868747313935B531E763585EFCC14B3871FCB8D81A + 4B8685DF39BDF4C28B6217E2F92347F08B9FFD3C053EDE9978ED47C796C1C7BB + 177F3A79326B7DC9F095575488DD96E4FA56B3DA65F862ABDD0682AF05CE0577 + 0A7C079F3D807F5CB80C97C791F26075061D7EFDABDF8937F64FEEE9C4A9D367 + 5214F5F8234FE23BDFFFDA3245F19BFE4B973EC85A5FB2A2AACA6AF1F0C39F4D + A9EFDAD55BF0D36A77D03C84919191FF6BB59B6B6DFA54F0F19EECBFAE5CC1C1 + 8307459EC1E9EEEE167212503D3D3D0238DEBB3D75EA940044CAB32C0325C9DE + A9FA56824FA78BBDE7E39D80BABA7AB4B43421E00960D7EE1DE8EBEBC78DAB03 + F8F273FB45FED6F5417CE12B9F17F74A0FFFAF7F3987CD5B5BD1D1D18EB7DF3A + 8B2D0FB525F29DDD3BC4969D247BA7EAFBF7C7D7E00BB961B658313A3686D999 + 59D8E35B6C2BC197AB6DFA54F02543912DBFD2F5B5E65723BB127CEC54C0FBBA + 15E565A8ABAD153B1CD110D0D9B52BE50166CBAF747DADF9D5C85EF9F0137802 + 4E5869C81D1F9FC0ECDC1C9C4E27C1E7CDB0C35183CD1DADA82E8BED70E46A9B + 7ADEBD44F0F5A19FA612FCD23CEFE113DB6B045F51711136993689777D75B535 + 50C90BB067EF9D7BB0775A51177B3E84C36BC318813735358385857982CF9571 + 6FB7AAAA126D2DCD68AC6DCC69F8DE39731E7DD63E0C5986C548B7A6BDDDFB11 + 3EF66A61CF0F83418F12B27EE53464575494C1A837E273CFECCD59459D3B7D1E + F3CE594C0BAF96391A721D62B1E1F7A77AB5B055E721ADAEAE061D2DEDD8FFEC + BE9C6DD3DB7F3E835BE69B189F98A0CE645B0D7C41186942B9776FAC4799CD66 + 9A33B588FC14ADC02A6912CF0B0597DB25F25219A7DEDE5E6CDFBE3D4536BD7C + 2DF565926597DC9E9E0B70BABC5028977BB5C49C2D63FE7C458622E1446A2A31 + C2A02E4669B909AA0225D4323D64EA45C8C12E597C44B0188A40A9528ABC54C6 + 29E49743A591949FB95C0E3595065264B2D527C946A211840261842321F1CC9D + 2E3766E6C9E2D96D62A1C1CF83E77B9237B394D869949D62D947B1B6BC9E160D + 55D42615A28B2AC8943197A5C8227D0F7DF562280A39BBDB2B97CA38F9DD5168 + F4B214D9F4F2B5D4972E2B5344110C043141F3BCA1118BF0E773BA5CC237F1B6 + F0B10BB4DFE7153105D148EE393ACBD95F4FA325C0B419FDF9129ECC1A769F67 + 000DD093152CA6337BFD16198B51A437404BC3973A1ECFB19E8ECCFC4C438BA1 + 98FBBCC70B87CB09A7DD4996CE49C0B98592D89194E77A3C0AB1D773327C6CD9 + B95D3CFC16D1AABE98DAC46F1BD46A8D088A12DF118FB3C8E4FE2E9527BBC8AF + 36BF9AFAC204183BFABAA81D3C6D70B9BD62C59E3E7DC8EAC9CC0EA51CFCC19E + C5928771FC96B47CE2AE2CD7D79A5FB93E0EEE6105C8E2116AE989E1E3EBBCF0 + 905CE975A42C9EA817D22A584F4A938289588665D7B34D51A1A03082A1205987 + 10298A94E3891FA424864E72A167AB27855426B78F5DFF45EC061DEA783BB8C3 + AD6B344096148DC770B0E36880A60C81D0524054DEC77048515D1280EA78C49A + 56584B0EB8518B17D189104AC5FA6A8C9F7F72904DCC0A068465E0837DDE62CA + 0A2DB37A525A0A0D55C43A6296C0F87B9192638ED988711BA4CFC9292FE1E324 + 45B04943F0521865EC2C627945DCEE0AC1E3772189D0C928E2E193E144BCAE14 + 46B9188EC5F0260791E763CA5BF8244BB0F4EF04312B91FCEF05B16BF7C65AC4 + E258A5732411DF2A45AA49C0E5F35F67E42D7C8906A60D47C99F53CBD7EF3725 + B3B414639B0A593E4327A5FF018EC2B6532664604C0000000049454E44AE4260 + 82} + ShowHint = True + OnClick = OnKeyBoard + end + object m_tabChord: TPNGButton + Left = 921 + Top = 48 + Width = 55 + Height = 28 + Hint = #21644#24358#35774#32622 + ParentShowHint = False + PngImg.Data = { + 89504E470D0A1A0A0000000D49484452000000DC0000001C08060000000AB2D1 + 35000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F33000012A44944415478DAED9C097454559A + C7FFA9BD5295A5022109418190909D2D105651B45550444001D9B75101A31164 + 13101AA101832C76BA632F76D3D08A42DB6A2F3A763B73D47694A6B585690502 + 8490E3B084B08508592B55F3DDFB967AAF2A24EF5555C4E1CCE5D429A05E2AF7 + 57DFF7FFEEFF2EAF22860CBF1BA1B68B55A7F3E969273D32427EB3F0B5974B8F + 1C5AD0D6457DF206B7FA7A7D6DCDF7928D1E9C2D3A363EE837A9A93EFFFF6CDF + 315B44A88223B1252222E2AC332A16565BE48D0652F60B24B888B6AE6B4D7024 + B6447A3A6BB6D86134996F3492B25FEC89B3059B9494909CCD1E1905B3C576A3 + 9194FDBAA9D9C221B8ED918EE842BB23EA46F3F8F72B1C82DB6E325B0BE971A3 + 71FCFBC59E424DCAED569BA3F0FB5424C57EDDD46C21098E927ABEC9642E8971 + D10713D1666E7FA72D54C15152CF37188C25169BE346A3B4D437F614745252E0 + E71B8DA6124794EB46A3B4D4B79B9A2D68C151422793C84EC592D8F4D82DAFD7 + 1BF07F11ED20D6500447099D4C4FA7AC3627220C86EF1D5B2882A3A073362725 + A4C168FADEB18522B8FF0B6CA108AE98AC64811E2B2981B1E7B16FBF8977C63D + 2C83094FE1830C5170C564230BF458495FD0BC98F2D7BF60F73DF7CA3CE10E5E + 88822B26BB55A0C76EC96CF4FCF0BB7FC49BF78F911D4DB8D942145C486CCB97 + 166253D14BEDCA1694E0289929192DC5DC4A6AC382C7E3E5CF0C90313EF0FB3D + F8F3C39344A8083F38E11AA929C5A85598C10A8E92B980AC64B11E2BE9F57A84 + FE3236FA33E9FDF7B077E4FDBCB32DF75759517DAF690D70B082A3801790DD2A + D663B7BC1E0F04342FE71BF7A7B7F1F698F1BCAF029A5F9F0303A78B2D58C185 + 836DC5F285D8F0C2F67665D32D384AE454FA0DC7635D9DC84AB63E6C0BD54310 + 8F87C1B1C4F4084939FA777BF0DEC4C964D904B149C2633F63764422BA7B77FE + 61D49DAB42DDF92AFA770ABEADA810AF9563D25A3F750B8E1239959E8E6BB192 + CAD15A109C570C1C30E1BD3FD328F080C0C6FA290690FD84D9E1406C6A0FFEAF + 6B95E7F8C395968A2B65274481B61DBC600447C1E66CCEA838B25B46ED6C1437 + 8FC8C8DAD877DEC21FC63D44FD3428E2C6AF8689B1A5A470D06BE7CEA1B6AA0A + B13D5270A5FCA4DFB5ADF6F386B13DB76231D66FDCD2229BD56A45526227CE76 + B9FA0AAAAFD42029A9132A2BCFEB620B4670C50E674C812DD2D92698948CD169 + 69481C3C081D7BF7E2AF9D3F7810B7DE7D37DE9F3C150683410464C9E844C6EC + 9988CBC9C6B9FDFF40D3B56B481C98CF03F9EDC90A1C28DADCC28771DD7E0623 + B86293C5566032593404CDCB8B872B2303C9C38721A15F3F1E8CCA2FFF899451 + A3681418CB452B1508B3D389DEF31E477CAF5E38FDD96768BA7A0D9D870E8185 + D8AA4F9463DFDAE765AEB6D882145CB1CDEE2CB058ED6DB3D18325626C7A1A92 + 860E457C9FDEFCB5AA0307D0EDDE7BC9994C14E3261449C690FDD85C74C8CDC5 + D97D7FE7714B1A3488981DA8292FC7E73FDAA4992D48C1E9664BEE9C804CE24B + E9D695BF56565E8181F97958478253B2D96D368C1A7917BA77BB15874B8FA1BE + BE1E9919E9F4FF569CADACC2EB7BDED2C5A64B7094C48BC84A6ED16225191C1B + D53C9E66643FF904E25942FAB50FA64E2738231F0998D8066FDE44A3D9797CF9 + C266B8292179D5A444EDB76C0917DDFEA5CFD2F5119A44A7577094C48BA82F5B + B45849A99030BE7E8B1723317F40C0357F1C375E2E262CF146FCF427A8A5AAFF + 771256D3D5AB7CB4B310DBA035ABF9A8F7D19385303026434B165BDDF40A8E02 + BDC868326F713863B5B11157333D7A2F2C44A7FE7901D7BC37F11118191B3D58 + DF876DDF8A3A1ACDBEF8D146CEC61A2B30FD573ECB5FFF74D162FE3930BEB646 + 71BD820B966DFC9851484B4D51BDCE7898E024361B89EDC905FF86CB97AFE0B7 + BBF7A2BEAE8E5F67B3DB317DCA447AB6A1E467BFD2C5A6597094C0E9F466A531 + 716425DB5C0112E66C9EE666B89BDDC87C623E3AF6EB1B70D57F4E9B49B6D448 + 9D35206DD60C24DD3E1CFFDABC15970F1FF24D73A8FFF6F84EC82FDA884F1F9D + C793D8372A86477094C0E9F4D752ABDDC9DFB7CDC0894163C5A4F7A2854818D0 + 3FE09A771F9AC0ED0D0B44F6638FA2CB5D77E2F3F51B70F1ABAF7C73017A2D32 + A11386FFF8257C30659A8A2B5C82A320A7D39B95F2953B43EB768B35A9483653 + EC720A0B109F1728B8BF3E324564332063EE6C741E71070E6C2AC2A5AFBF56C5 + 2DB253270CDEFA223E9E399727B0C1D0369B1EC185C236FEC1FB909E96AA7A9D + F571EDFA1764B6D1F78F445EBFDED8F5EA1E949F3CA9628B73B9F054C1E358BF + 618B2E363D82D36425599346B766129BDBDD84C8AE5DD1313F1F1D444B79812C + E52D64293F9C390B269A07B20E0FFBE52FE0AEADC5FEC285BE4E4B93576A09C3 + 6FC3854FF7D187D12E822B36939534B661252536F66041637C51344749183C18 + F17D858252F5E597E8367224DE9F34490EDC0F5E7B95DBAC8F1F7BBC45B6CE77 + 8E40E5C77FE3D74668089C4EC169B25B3E360F6763717374EF86F8416C2A2058 + 4A3615E87ACF3DF88FA9D378D165A3F11DBFD90137B17DFAC4933E26055BE21D + B7A3EA93FFE2826807C105CD9644852E3B2B033DF97C1A3876BC0C43870EC6CA + D5EB64B6E7D7AC401D59C84D2F6C6B912D2FAF0F0E1CFC4A179B26C1312B6936 + 5BB744BB3AB679AD04C72A89DBED4653632332173DCDE771FEED6F73E672C1C5 + 666521EBE9425C39528AD21F17AB3B2F2DD1D243B09F0695AD6CA5CF9A049791 + 99ADD94ACA81F308816BA2C0F5797639CD75D203AEFB60CA140A9C91E6A3B9E8 + B36C292E1F3A84FFDEFCA2CA7AF0FE7B0538416CDAECB256C1E9B15BBEB80985 + B2A9A911394B1623A667CF80EB3E9C3193B3B9727290FBCC22541F3E8243DBB6 + C97D3728E2061E3783E662A25570A1B2CD204BD8F5D65B54D798AD562C5FB186 + B3A5921067CF9C8A13E527B1F3B7AF878DAD4DC151E266D19B1CD26625957024 + B826371A1B1BD08D6C479C38F156B67D8F3ECE573A633333D1F3A902D41C3D8A + B29FBE4C1EDA285B47159C8EA4D42238125B16FD824356BB439395F40F9CBBA9 + 093D17CC23BB1C383FFD70FA0CFE79B972B291BBF8194ACAC338BC75BB504C24 + 36BF2D0183A2C8842A380A2E8F9B43A3DD52B1512169A4A4EC4156B843DF3E01 + D77D327B2E9F0AB8B2B291B9502894C778A134AAEC95924D19B35005170EB609 + E3C62033435D4C98E0962E7F8EB3A5A5A662CEAC69387182096E77D8D8B408AE + C411153BDF66D7B32FE59587EEC6867AC4909D8C274B684F48E0AFD79DAB4464 + E764FC63C1023EC2396EED8A744ACAC68B177174E3265E618C0613B78F328057 + 84532C2A844170256425E76BB192EAC0919D7437F34AD961E810248E1881C8C4 + 44FE7A6DE5593892BBE0933973384754F7EEC85DB1020D172EE05FABD7083653 + 1938AF38C8C90103C2B16842C12D21BB355F8BDD52B189F36E56285D64271368 + 5E6D97D92A892D19FBC81A333667B76EC8A2D1BBE1C2451C59B78EB309C5D2A8 + 28945E5F52F25E87457021B3F5ED95838103F2101F2FB8B6F3E72FA00B8D784B + 96ADE26CB77449C6130B1EC3A5CB97B1FDA592B0B1B52A384ADA25668BB5283A + 569B9554C229059734752A62727302AE3BF8F4D37C1460C997B67C392C1DE2F0 + 3FBFFA351A2A2AB8E01838171865646456261A29E0CDD55734EDC5B5253812DB + 1283D15464B1EA3BE0EA2FB8AE7366C3D53B70F4DE3F6F9ED07F0A46CE0FD7C0 + DAB1234E9494A0F644B92838A31C9CA8DC5C349C390DF7A5CB9AF6E2DA121C05 + 7689C9642E8AD468B7546C8AA4EC32633A627BF50AB8EE9F0505F23C2773D52A + 8A5B0754FCFC97A83F592E24A5C8CD02E7C8CE46E399B370575787655B205C6C + 13C68F4156867A2AC046B825CB56CA6C4B1615222ECE85DFECDC8D8A6FBE0960 + 632364656515DF930B795B8012368FDEE08BD8B884363713AF07C7E6384D0417 + 3F69229CCCBDF9B5234B970970D45127093269F22394786770E1776FC15B5323 + 2F3A44F6ED0D3B59D24B3B5F0D1809AED75A131C892D8F7EF60B3D5652C5A698 + 0B245352C69060FCDBC1A70AE555CA1812E42D3367A0FED4299C7E6D372F1A92 + E06206F4471455DA333FFB856F933C04C1515079DCF4D82D359B6FEE9D387532 + A2C812FBB7AF173D231793A85EB9489E36150DA74FE3DC1B7BE1B952232625C5 + 94ACB623AF2FCEBFB2433D6F6DA5B526B870B231C1B56C2957C96CB9395998FC + C8049CA182B1F7CD775053F3ADCCD6B74F2FF4EB938B1D3B5FD7C5D69AE05E71 + 46B9E65AEDFA6F7150CDE19A1A60202B69A7C039D205C0ABA5A5881B32042756 + 3D278F70AC39F3F21037FA3E78EAEB515F7A9482770536B10AD59008A93429FC + B21C97EBF5BF35C1BD62B6D8E706738F9BFF1CCE94DC195124A8A84CE13EC79A + 2347D071D8301C5EBC440C9CD08598FC8148183F169EBA3A5C3D7408CD97AB79 + F5670855BB5E83B7A1212C1BDF14D457EC91517383B90F4C39CF61C5C4909404 + 07592F6786C0F62DB175183A14C796AF50B1450F18808E0F3E406CF5A8A56B3C + 349AD9C991B076F9F5BDC4D618968DEF70B2252674426E76267AF614B6068E1E + 3D8EE1B7DF8665CFAE56B1E553317C70CCFD7CB5F2F0E1525457D7202B4BC8C9 + DD6FFC1E0D3AD95A141C25EB4AB292EBF55A49359C584D08AE9192A981AC2583 + 65AFB1C967CF0D1B716AFD7A95E05833C6C6C24A730383DDCE01D848D774BC4C + 5C0552AE50CA7169B15D4F7024B6956425D7EBB5924A366995D22D4EC0D928CE + 2C263BB2C6F7DDB66C45D94A9F35919AC9E582BD470F18191BFD69A682524FC5 + C717306DA768AE27380AE84A93C9B23ED2191342DC7CA337E362B163368CBDC6 + F7DD8A8A50B1E6877CB1CBA070072617C58DE6AB46316ECD34D2351E3B266F0A + 6B59C513196E18DBF66D9B85554A3F3617B1A5F648813DD2461D339085BC8223 + A5C1B105088E7D5D02BDD1FED80E9D740FDBD783F3D2C4D49C9E0E6B0F6167BF + BEAC0CCEFEFD71BEE845901F175723212C20889BC2D20289B4E42A3F6BD81210 + 3902044762CBA71FDCCFCF4A0679125CBD9FE386312901B6AC6CD8C44DD45A4A + B298810371EAF975B25DE6D5811F6C161A5FF6510449CFEA2BFFFC5A101CFB4A + 01FAB9FDEC3CA19E5B8A02D8E42D0FAADC340A5868E4B6F548E5C1A9A3B845D1 + 6856B961932F29A5B88974FCF4A81437914BEBB2B9C8F19DB0B17DB89C6CB60F + 27B01D3D5686DB860FC38A556BDB95AD25C1ED7046BB668572B7AC9C946E01CE + 7CCFDD30F54809B8AEE6A5622E383684435AB1F37AA4AD295FD537E84FCAEB08 + 6E0759C959A17C5D82B4F12D4DC01D6346C3DAC21E63D5A622E1140D9BAB8991 + F38AA253AE6829F777B41CEB62ED3A82DB41766B56285F29E0DBD4170E2C58EF + 1B058BB831AC6C97B66C83893913C97A7903D9D4955FDBD12791E33B617B68EC + 6864F454C78DCDE1D8C6777BB2A904C7ACA4C5625B1F15DB2168301F9C4F7086 + BBEE84B17B37D5354DE5E570FFE50398CD167992CA88A4BB09844FDDE78DD562 + 936372DDE62FB850ADA47FE024C1D95A48CA86E3C751FBA77779A5E46C7C3144 + 3A3C2B5E1401D52289D679006BFE82E376CB4C76CB119CDDF2679392D27C2F15 + CA1475A16C2C3B81867F7F5F2E94BEBB3C3CAAEB5AB2C9C1DC2DD05E6C2D098E + D9C4BD6FFDA15DD964C151820E26D57E161B17BC9554C3098263704D712E20A5 + 3B0CB7083BFBCDDF7C032F05CE74E9124CA2E0A48D60E924BEA2A40440698153 + 0A8EC436987EE6334B0856D23F7092E0BCF1F13052E04C5D8553E74D1515701F + 3D8A88AAF3825D36FAEE869004A74013B8A03851A35370D4385B2876CB9F4D48 + 4A373C1DE93DD99C536473139B878A89E1028B9B992F93F34A2FFDACF02E104B + 49C026BE5EC1B5275BE74476B42B1D69AC5852978F513E7E7DE830CE9CAD6A57 + 36A5E07691959C1E9E2F5E110E2F33B86671E1A4A9A98927295F582010968C6C + 7493AB8938442BEF9CF6BFE954CBC826353FC1ED222B393D5CDFBCA53C04CB0A + 0A63647F678DB1311ECEC5E6027CB33402906DA5EF7D943C7A0A819FE07691DD + 9A1EAE6FA7E26C623161ABB09C4F668BE0F352EE4AC4D15B98EBA8E7A872E774 + 24A3D4FC0477D3B171C15172AEB658ED6BA362E2C20226DF2DA038C0CC92D2D3 + EC9105C7E07825313238FFC3C82DDF11ADA7498223B1ADA6DFB1D61CA29554D1 + 89B7E60807988543CC6C422E04C0C0FDBF340FD072A8556F53086EB5C96C5D1B + E9880E1F9BC7C7E66E16E326B1298B89D128EF2586934D21B89B922D223D23EB + 76FA651F85C34AAAE014F7C309231D1BDD3CFCB334441864D1294FFF87B331C1 + 51BB833EB08FC26125FDD924D1B122C218D5ABAB06F93C6884A1ED1555BD4D14 + 1C670B87DD0A6053DC7EC446048FD7574CD8BD620631210DEDC0260AEEA66563 + 827B232A3A6E92C5A6FD5C9A663839317D5F43C0E1A4E5558DF77F05D344C1ED + 315BED938CC6F07E89ABF28E6FE9167D95E0144BFD5A561DF53651707BEC8EE8 + 49E6307F67A6F2AE68F92B31E4FBF7A0D8A6D1B632A7B78982BB69D9F808477F + 9F4F8F49617D7725A4E2596A7A269B41B6974D66CBE726B3EDD7EDCFE59B9BF9 + 1F3E6E0FBEC686DABD9E6677096ED2B8D163CFCDCAF6BF714013107B6F017C00 + 00000049454E44AE426082} + ShowHint = True + OnClick = TabClick + end + object m_tabStyle: TPNGButton + Left = 880 + Top = 48 + Width = 55 + Height = 28 + Hint = #39118#26684#35774#32622 + Down = True + ParentShowHint = False + PngImg.Data = { + 89504E470D0A1A0A0000000D49484452000000DC0000001C08060000000AB2D1 + 35000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F33000010514944415478DAED9C09745445DA + 86DFDEF74E27811812B640300102845508EBA8C310E01790715047945F140D06 + 4114511951CEA0E7170C0306C230888C19605855989145645764150462020102 + 24843521E93DE94E67BE2A204367BFB76F80C3F92BA74F2FB752B94FBEEFAD7A + AB6EF59525F4FB2D022D05572FF6A0A72FE9111B7063D29585599919E3EBAA14 + DFB557ADC7DD4EEB7DC9460FCE66B63416DD88B5E8DAFFB3DD653659A08223B1 + 854326BB643459A0D1EAEF35D09DE705129CACAE7AB5098EC4164E4F97546A1D + 144AD5BD46BAF3BCD81367139B9494909C4DA73741A5D6DE6BA43BCFEB816693 + 427073F506F3449DC174AF792A9F9714829BAB546926D2E35EE3543E2FF61468 + 52CED5680D13EFA74EF2D6793DD06C01098E923A49A954A50505D33F4656676E + DFD512A8E028A993E472459A5A6BB8D728D59D1B7B129D9414F8248542996630 + 05DF6B94EACEED8166132D384AE84812599E85C42695DD0A3784E26F7FF8082F + AD7E17571D37026A2B10C1514247D2539E466B844C2E97842DC21C86F4E7E7E0 + 8F7F9F842BF6EB01B51588E028E89CCD480929572825616B626A8425CFCCC298 + E553286E0501B51588E01A8A6DE4734F6075FA7A49D802115C2A59C964A9AC64 + 595919663C3E0109515D91B4E67D9CB5E6919EC5277B80824B251B992C9595F4 + F9CAF07F43A7A26F740FBCB8EC2D9C2A384F6CE21D4180824B25BB952C95DDF2 + 51DC66264E46EF56DDF0F23FDFC599A2DC80D802149CE46CAF27BFCC5F6F5CF1 + 9D246CA20447C94CC9A84EE5565282525E5E8EF8B018CC1C3499BF4FD9B118DB + CE1F8042A110DDA658C151322793954C95CA4A32B66E9171983DEC3DFEFE93EF + D2B0297B37E86F886E53ACE028E0C964B752A5B25B8CAD73785BEA4CDEE6EF67 + 6F5B84AD67F6D2E8229E4DACE01A8AADCF9309FC7DE6A60C49D8040B8E12399A + 649E6D090E232B29CDB00D5F39E60D9986C8A070FEF6E7BC1398B1633E542AB5 + E826C5088E12399A9EB2A5B492321FC8267F8CA69626FCFDA1F3C7F0EEA65950 + 0660C3C5088E82CDD98CA6908092C6AF105BDAF00F1169B919B7C3178EE3FDAD + 73296EE2D9C408AEA1D8925F7BD1EFA3BF7CB628603631824B35188392B57AA3 + 245CE5E53E24B6EA8BE16D7F8B1D593F6058FC20FEF9E2032BB13DF7A0E8215C + A4E052956A6DB252295EE8FE6CE5181EFB387EDF2911DB32F76044E7C1FCF305 + 3FA663CBE91F44B389145CAA56674C566B7492B10D6DD31F4FC60DC276621BDE + 39917FFED77DCBF17DCE3ED16C22052739DBC82E0311D1B319E760EF5961A35C + A06C820447493C99AC648A545692153514983B701A961E5885754737A25FAB1E + 18D671105A8636439EF532161F5D03ABC721B85DA182A3249E4C362F45CA5549 + 8D4C8D45236662C9DE155873E45F1810DD0B23E207232AB439CE17E563C1FE65 + 282AB10A6E57A8E028D093154A558AC16891904D89D4211FE08B7D2BB1EEC8B7 + E8D7FA110CA78E25AA5173E416E7E3AF8757A2B8C42EB85DA1826B28B6975F7D + 1E87D6ECAF604B1C3BA4E2F83FBE582D9AADDE82A3048E216567058590959468 + 05C8E7F3E1A9E88168D7381A6F7E3B13268311C54E1B4A4BDCBC17D1EAF4D0D3 + 6737877161BD8A10C15102C7D0CB2C8DCE18D0424D65B6D11D8621EEA118247F + F52718C911D85CC4565ACAD9341A2DF1E944594B2182A320C7D01FCCE22B7701 + CC1B2BB33DDD7630E21A3F8C891B3E84496F82D56525B6929B6C5A1D743A8328 + FB2544700DC536F19597504E29FED1479F4ACE26447082AD241B8AA3CDCDD036 + B8357464D30ADCC53870F538EC5E173B8AC6AA604CEDF112E6FCB81827ADE731 + 35E155BEA277B22007E78AF370D57D03D6328728810B145CAA8AACA442809564 + 6C31C151E810F630B16971DD75033FE6FD0CDBADD1385C178A0FFABD8E4F762E + 4046E1194C1F3091A6AA3E645E3B8DB3851770D9791D45A53651730E8182136C + B7185B1B4B0BB40F8D26360DC5AD083FE5FF427173F2E30F6982F15E421266EF + 5E84ACA21C4CEB3B1E65C49675FD2C728A7271C55580628F43D4A29740C18966 + 7B6C505FA843B438B3E334769F3EE8C7F6D48B23F0CDDFD673B677DE9EC43FCF + FDE9024E646706CC562FC1312BA9526952CCC18D0481C5073F4C23D8EF20BF63 + D470794BB0FCD4BF71AAF81C5E69FB14EC6E07161E5D812E4DE230AED328BF36 + 3C3E2F1665ACC145D755C1BEB9BE828B6DDB5EB095E42B8F617178AEFD1395D8 + DCF8E2D83A64169EC6C42E2FC05EE2C067FB97A26B644724777FDE9FADCC8379 + 87D371C17E49305B7D0527C66E31B62EA1B1783A764815B6F44C4AC2C21CBCD6 + F119CEB6E0D03FD025B203923A3FEBCFE6F320ED977F22D77145305B7D051708 + 5BEF51BDAB1CDBBC7C2B679B34611C7F3FF3E3D99C6DF00B83AAD4FDE6CB7F8B + 66AB537094B8EDA8E10CA156D2EBF16052BBD108D60655395646A3D8EEFC83E8 + 17D11D1FFD341F2EB9176FC6FF2F1AE942AAD4652347DAC9559029A4171C89AD + 1DC536434316418895F47ABD78AFFBAB08D1560DB697D8B65FD88B479B27E0C3 + 5D29709497E0BD9EE3D1581F5AA5EE356721528E2C0165B620B6FA088E82CBE3 + 661068B7BC5E0FA6741A5B63DC76E6EE43FF663DF1E71FE6C185524CE9368ED8 + AA8B5B213E3BBE0C1018B7FA082E10B649135EA9F9FF5AE882364487059F2EE2 + 6C6FBD35A1C6BAF3E72F11C5561FC1A5194C9624AD4ED86282DBE5C4EBB1CF21 + 4853F385F13D7907B1F9E21EF48FEC81E6BA70C8CA658869D4BA4ABDB5E7BEC3 + D9927C413D4A3D059746563249889564A584E698533B8F83456BAEB1CEAEF3FB + B021671B1E6D9180286324149023A67174957A2B4E6EC049BBB00BE1F5145C1A + D9AD24A12B77256E17DEE83006164DCD6CBB73F763E3855DE8DFB4275A1A9B40 + 5E2EAF366EAB4F6F44B62B4F105B3D05279AEDCD375EABFD7F5BECC69C850BF0 + 1BEA307B3D5BF33EDBCD4BB78862AB557094B453546ACD2CB3A5FE56F2767191 + E07A186231A069F527EDF4B830F7F8DF61315910A20AC289AB597CB1A4675867 + 3C1993E857F7F0F50CECB61E8552C075BFBA0447629B22572867A935C2772530 + C1F50989C7632DFA547BDC416CB30F2D82D96046239A139CB89289524F29FA44 + 74C3EFDB0EF5AB7BE0CA2FD87AF52741EEA12EC15160A72895AA597A112B776E + 4ACA9EE6383E42575758DC528E7E0E33B5DD581D84E357B2F882424278178C8C + 1DE257F7D0B5E3D8517048D0F5DABA041728DB881E03D1BA779B1AEB7CF2F19C + 2A6C2C6E435E7BC2AF5EA9B5040BBFFC52305B8D82A384ED4AEA3D64097948D4 + C4DE535A0ABBB5187F68FA3BB40C6A56E5F8FAB35B91EDC9C3A088BED8767D3F + B7746C2B8DDBE1C03B1DFD87FDD3D6F3D852B41F6A4DFDB75AD52638125B578A + E921A156F2766176999DE71F5B3F81284BF32AC7BFCADE845F1D3918DAE2516C + CEDFC37B41C6E671BB31BDFB44BFBA278BCE62C3E59D822EF2D726380A2A8F9B + 50BB75BB78A86370DA6C78BAE510445513B76FCE6C4196FB020637ED8FAD57F6 + 56C4ADC4E9C2B42EFE5F3FCCA679FAB7D77F805A5DFFB8D52638A9D8A64D9B52 + EDF1AFE6ADE56CEF4C9A8494050BFCD8DE9F3EB54AFD39F3160A66AB4D709F1B + 4DC163353A71FBD2D8F22AB395D6E222743446A37D700C228CE1C8B3E7E378E1 + 496497E6A24550538C087B0C6BAF7D0FA7D2C327B5168F16034313F8CADFED72 + A2E814F6B97F85465BFFEF36D521B8CF556ADD58B19BAED9C5FA12128FC36143 + E7A076E8D028169164AD726D1771EC7A26321C6728599B6354F3C1589EFB2F58 + 6946C0D81A2308432306F8B1FD5290895DC5870505AE0EC17DAED39BC68AFD1E + 58398B1B8D04365B31E24D31681F1AC3D9F26CF9385698892CD7792EC4911103 + B1EAD266D8E5259C2DC4674062585F3FB66337B2B0D77E8C3ACAFA9F4B1D8293 + 8CED91B08E1832FEBFA3D6EA9495156CA3273C8BA5F397F9B13D37E119BFB6BC + 2E0F3E5BB458305BB582A3649D465672A6182B7967614BFC6E4A4C97C3CE41CB + CABCDC3AE9F47A84E88231302801414A231C652E9C2C3D4FB31C39DA69A2B0E2 + DC7A345606A35FF82330A98DD84923E04565A120B89A0447629B465672A6182B + E9CFE6E37683752AA525257C41812D15B3EB6B21FA60FC4FD86F605199F97273 + 86E334E434CA7532C6203D7B1D1ED284A27F4402CCC4F6FDE51F91E3BB24C908 + 47019DA654AA67EA8D41F56EAB2636669B5D4E073DBBF8C6721637AD5687507D + 081243FA204865A2B83991E9CAE1718BD34763D999AF11A60E41BF263D39DB76 + B2CA1764D72419E1EE16DBF8375EAAA8BB6DC93668F55AF47EA6373E9DF117CE + F6FCBB2FF0636BE7AE15C5564570EC76093494EEB78486497231918D065E6F19 + CABC1E7E1D4A46C1E9A489466B5553A865D58F3036AF1DEBAF6DE7178A9F8A1C + 8C2DD6BDD09A0D822E12572738125B0FF209FBF95E4909BEBFC77A3F1630D691 + B0D732FAE9666C87185D14D4F2EACFD5EAB1635DFE2662B3E3D996C3B0813855 + 1454217381EA04C76E29404CFBD97E4229F681DE64F352DCBC1571EBAC8B411B + 6DF31AE366A5B87D7D692BEC6E1B8DEE43B1B1700FD446BDA0B9777582BB1B6C + 23FB2622AA7BAB5A7FEF933FCFE16CAF8F1C87A55B568962AB4E704B8DE6E031 + 0DF56D5936FF695A1A82786DEDB79AB0953970CD7B03E74AF27043E5A451D140 + 1D40FDFFD935086E2959C9310D75BB0476B9A0B52C824417576B3D9698574B0B + 70C67901D764457CC78990B9640D825B4A766B4C43DD52802DA9B7280B43177D + BB5AEBB1B85DF51420C7958B02851D3A9A920811490D826B70B6288463D88461 + 75D6F5384A914E76532C9B9FE0989554ABB5334D96D07A372206CE565C8C877D + 4DD1D154BBE88EBAB3704E71053A12BF52E0569ACA8293CA4AD656588FE924FB + DC5ED90AF141ED6BAD7BD87E02D965B9DC260BE92559A92C386EB75464B70C81 + D9ADDA0AEB4C1C362B6265CDD1C95CBBE88E387FC559E4F36D5042B7AE5516DC + DD646BAF8CC2F0B747D65AF7AB39EB78DCC4B255088E12B417A975AF25441A2B + 5953B9BDE060B316C354A221EFDF0611DAF0FF1EA79F3CF76564B8B3E1D6F960 + 3499F9FC26909D2624B65EF4FB7BD51259C99AD9CAF9BCCEE9B021B8CC888EC6 + 5844EA9AF8B1E53AF371CC910587BA94466D23175B203B4DA87036A9EC566D6C + 6CEE63A7C4B478748833C4105BA5B8B92EE1B8F3145C5A2F0C46134FC840769A + DC2BB641098F2336D1DFA51CFBFA676C3DB22B60B63B05974E5672F4DDB8F10A + 9BB8B2CB064EA79D4F5E599206C98DFCC2377D02855AC92DA49E1E2A9A948A11 + 4925C1A593951C7D37EEBCC53A140FD9667691952D14B1A5688BC2CCD96CE50E + C894729AA0EB2B362E8B61AB24B874B25BA3EFC6DDA9D82A1FE361D758D983C5 + D0223771069BCF09B94ACEE3C6369D8BE92459A924B8078E8D0B8E9273BA5AA3 + 9B610A0A11DC886840EA55F8B529B298CC8AB1492C2BEC9A1F4B44B61B9B8DB4 + 817E1F8EC4365DA150CE5035A095AC968D02583131A7D76C0450100F5B1C61AB + 626C3E2AC1F7E1A62B559A197A8359543BE2D9CAB80DE371A3D7F46145DCD823 + 10B63B04F740B2C96262DBF5A7E17A67435BC93A5009F4E697FC188C14B68F09 + 8ECA006A6B67435BC93AE968D4BB59A461BB2538CED6D076AB4E36DF2D3689E2 + 764B700F2C1B13DC4A933964945A2BCDB765EF97724B70AB541ADD2885E2FEB9 + 89AB14E596E056E90CE651AAFBEC9E9981965B827B60D9F80847AF93E8312AD0 + 06EFB3B250A9521F54AAB45FDCEB1391BA94963857FBCABC697840E3468F550F + 2ADB7F008860D7E3D26354B00000000049454E44AE426082} + ShowHint = True + OnClick = TabClick + end + object m_btnVolSet: TPNGButton + Left = 9 + Top = 642 + Width = 31 + Height = 20 + Hint = #38899#37327#35774#32622 + ParentCustomHint = False + ImgStates = 3 + ParentShowHint = False + PngImg.Data = { + 89504E470D0A1A0A0000000D494844520000005D000000140806000000EF2631 + 67000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F33000005484944415478DAED99FB4F9B6514 + C7BFEFDB320AE152C071916BE71897058969060808833186D992CD89CC8D0D16 + 214EE32FFE29FEE04C988242B2CCB98B4E9CCE3974CE45377F36467F18145AEE + B772496803BCF59CE76D3B56582FAE6FF9654FF2A62D3C7D3FCFF99E739EE73D + A7524171A90BDB34F47A3D620C06C4C5C7C140AF51F4598BB1AE28703A9C585A + 5EC6CACA0A565757A1D3E9B68D2DB1E8F373B3585E5AD2525FEF888B8F475272 + 8A781F1F1787C5053B6C365B44D8B9797930262563C16E476C6CECB6B185E8D6 + 610B0A8BF78A7FBA5C2EEF156824241AC98B0E389D8EA7CE9124C97BF118B60C + 213E2101D1D1066464A4E3CF070F22CA2E2A2AC6C2E222525292053B9DD620CB + 3A48B20C294801138D49C45E81C3E10838976D519475CC4CCFA0E4E552C17E42 + 748552C145971284E1E6B20A5455D7E2DA5797601DB1D0C2652492100B143D9B + 0DE75759A4F446D14DA63CDCBB7B37A26CB3D98CC9A969E17066BF989929BEAF + 3A26B0EC651595A8DE7F00572EF56184EEC7F766272CD8E77D3CCE8A934D2E55 + F8E9A9299495970BB657F4028A00657D5DEC412C009E62784EAE09F58D4D484B + CF109FFBBABBC8F06161D4F19653E4FD15DCBC711DB26AADB8D8209D4E1611C5 + 733DA2EFC9DF8D813B7722CA2E27C347C7C691939D25D899D9D98FE7FBF1756E + 9E090D4D87BDEC2F3EFD04D6E161C8C46E3E791A0EDAAFFBBFBE4A1CB7F324D5 + 0C49E24827D1272751595525D85ED1F71416619D0DA76BAB14E7C3A6BAA60EFB + C8D31BC7E717086E1DC1B1375BF0D3ADEFD070E8B0F0FA6FBFFEACA6ADDB708E + 2616C746737D458F24DB57F42C129DA3D59D1A9BC416ECDA7A11E11B474FD779 + 71BF63CD2770FB877E1C2487D8E7EDC41E50D91CE8EC4511E90AA6B6123DBFA0 + 5018CD11B7233A1AA969E95EE3397DF8A6BC00DFD1DDF531D6D6D684618D4D47 + F0E5C55E9C686DC3B7D7AF6091F62F36962389234247736C36EB26D123C9F627 + BA212646447238D8B2FB8C10C253F64E06123D2B370FAD6DEF04DCDF3C70F3BE + 0A71A84D4C8CC36834C2323488D257CCE8FFE62A19AE1706072BBAD66C7FA2E7 + 9A76A1B5BD232C6C8E767678F0A2E7E48604E7BDF26CE7FBB871ED3279BB1D5D + E73F427BC739F4F55C1086EB39E282155D63B63FD17368DF3E7DB6332C6C169D + 999A89CE7B5B45550D26C646515BDF805E3AE004BC9B0CD7EBC870BD66A287CA + 0EA7E8FED8321DDE3A125E33D147AD561CA5C3ECE11FF7D1F8FA11F47E46F0CE + F7C4D385D6A287CA0EA7E8FED89A8BAED747617FFD415CBED887B68E7785C7F9 + 508944A487CA0EA7E8FED89A8BBEB7A414F77E1940F9AB55B0BB8B048321060F + 7FBF4F866BBBA787CA0EA7E8FED81E66D0A247EDD8811776A6D2E735B558A151 + 545C82CAD76AB784F38152D7700846AA0A6F7DDF8F731F7C280E15A7D349D1A0 + 131E0F5674ADD9FE448FA647C39DA96961617B1E57FD8AEE5BA0081194F50DC5 + A10B098989387ABC05A65DBBBD705124D846E86FF9541CCCE2AD9367709B1660 + B10C8A139C238DFB1AA114475AB20315478A4F55EC126CA328C036B23D07A9E9 + 2562CFCDA1E5D419FCC8ECA1476EB6AC16B8FE8AA3AD4A71DFCA50346FDC5B00 + 1F20DC35E3AA70940CE7C733AEDCFEFDFB2F7A6E1DF3F63B24775F23D4368056 + EC60DA005BB22908B2A98678A3F96DC1EE61D147464416D5D41DC03FC41EA7A7 + 98C76C29701B20D8A693BA004508602EAFC0301504B3D3D362FFE4557BD2526D + 22C9616D788583FD7F1B5E6A7B42115958467BF8D0E023CC4C4D0A87F378922D + 05D7F00AB5BDAA2E4011F364770A33CCF33D4F3B558BD6EEB3B09FB5B5EB71BC + CA56FB3AACB02FDB374B36B5769FFF881159B6F4FCE7BAC8B3FF0342393BE3A9 + 5CB8A20000000049454E44AE426082} + ShowHint = True + OnClick = VolSetClick + end + object m_Logo: TImage + Left = 2 + Top = 2 + Width = 47 + Height = 42 + AutoSize = True + Picture.Data = { + 0954506E67496D61676589504E470D0A1A0A0000000D494844520000002F0000 + 002A080600000023EA021F000000097048597300000B1300000B1301009A9C18 + 00000A4D6943435050686F746F73686F70204943432070726F66696C65000078 + DA9D53775893F7163EDFF7650F5642D8F0B1976C81002223AC08C81059A21092 + 006184101240C585880A561415119C4855C482D50A489D88E2A028B867418A88 + 5A8B555C38EE1FDCA7B57D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691 + E6A26A003952853C3AD81F8F4F48C4C9BD80021548E0042010E6CBC26705C500 + 00F00379787E74B03FFC01AF6F00020070D52E2412C7E1FF83BA502657002091 + 00E02212E70B01905200C82E54C81400C81800B053B3640A009400006C797C42 + 2200AA0D00ECF4493E0500D8A993DC1700D8A21CA908008D0100992847240240 + BB00605581522C02C0C200A0AC40222E04C0AE018059B632470280BD0500768E + 58900F4060008099422CCC0020380200431E13CD03204C03A030D2BFE0A95F70 + 85B8480100C0CB95CD974BD23314B895D01A77F2F0E0E221E2C26CB142611729 + 106609E4229C979B231348E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666 + E76CEFF4C5A2FE6BF06F223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370 + C701B075BF6BA95B00DA560068DFF95D33DB09A05A0AD07AF98B7938FC401E9E + A150C83C1D1C0A0B0BED2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7A + F000719A4099ADC0A383FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD + 8E29D1E234B15C2C158AF15889B850224DC779B952914421C995E212E97F32F1 + 1F96FD0993770D00AC864FC04EB607B5CB6CC07EEE01028B0E58D27600407EF3 + 2D8C1A0B91001067343279F7000093BFF98F402B0100CD97A4E30000BCE8185C + A894174CC608000044A0812AB041070CC114ACC00E9CC11DBCC0170261064440 + 0C24C03C104206E4801C0AA11896411954C03AD804B5B0031AA0119AE110B4C1 + 31380DE7E0125C81EB70170660189EC218BC86090441C8081361213A8811628E + D822CE0817998E04226148349280A420E988145122C5C872A402A9426A915D48 + 23F22D7214398D5C40FA90DBC820328AFC8ABC47319481B25103D4027540B9A8 + 1F1A8AC6A073D174340F5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A + 8E6380D1310E668CD9615C8C87456089581A26C71663E55835568F35631D5837 + 76151BC09E61EF0824028B8013EC085E8410C26C82909047584C5843A825EC23 + B412BA085709838431C2272293A84FB4257A12F9C478623AB1905846AC26EE21 + 1E219E255E270E135F9348240EC992E44E0A21259032490B496B48DB482DA453 + A43ED210699C4C26EB906DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7 + 143AC588E24C09A22452A494124A35653FE504A59F324299A0AA51CDA99ED408 + AA883A9F5A496DA076502F5387A91334759A25CD9B1643CBA42DA3D5D09A6967 + 69F7682FE974BA09DD831E4597D097D26BE807E9E7E983F4770C0D860D83C748 + 6228196B197B19A718B7192F994CA605D39799C85430D7321B9967980F986F55 + 582AF62A7C1591CA12953A9556957E95E7AA545573553FD579AA0B54AB550FAB + 5E567DA64655B350E3A909D416ABD5A91D55BBA936AECE5277528F50CF515FA3 + BE5FFD82FA630DB2868546A08648A35463B7C6198D2116C63265F15842D67256 + 03EB2C6B984D625BB2F9EC4C7605FB1B762F7B4C534373AA66AC6691669DE671 + CD010EC6B1E0F039D99C4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA + 7ADABEDA62ED72ED16EDEBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA + 85BADB75CFEA3ED363EB79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD1 + 1F373034083690196C313863F0CC9063E86B9869B8D1F084E1A811CB68BA91C4 + 68A3D149A327B826EE8767E33578173E66AC6F1C62AC34DE65DC6B3C61626932 + DBA4C4A4C5E4BE29CD946B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C + 6B9E61BED9BCDBFC8D85A5459CC54A8B368BC796DA967CCB05964D96F7AC9856 + 3E567956F556D7AC49D65CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BAD + C4769B6DDF14E2148F29D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F6 + 6DF6CF1DCC1C121DD63B743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957 + 671B67A1739DF33517A64B90CB1297769717536DA78AA76E9F7ACB95E51AEEBA + D2B5D3F5A39BBB9BDCADD96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0 + F758E271CCE39DA79BA7C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8 + DBC45BE0BDCB7B603A3E3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE23 + 7ED67E997E07FC9EFB3BFACBFD8FF8BFE179F216F14E056001C101E501BD811A + 81B3036B031F049904A50735058D05BB062F0C3E15420C090D591F72936FC017 + F21BF96333DC672C9AD115CA089D155A1BFA30CC264C1ED6118E86CF08DF107E + 6FA6F94CE9CCB60888E0476C88B81F69199917F97D14292A32AA2EEA51B45374 + 7174F72CD6ACE459FB67BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9B + B880B8AAB8817887F845F1971274132409ED89E4C4D8C43D89E37302E76C9A33 + 9CE49A54967463AEE5DCA2B917E6E9CECB9E773C593559907C3885981297B23F + E5832042502F184FE5A76E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E6 + 9D5695F638DD3B7D43FA68864F4675C633094F522B79911992B923F34D5644D6 + DEACCFD971D92D39949C949CA3520D6996B42BD730B728B74F662B2B930DE479 + E66DCA1B9387CAF7E423F973F3DB156C854CD1A3B452AE500E164C2FA82B785B + 185B78B848BD485AD433DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1 + E022BF45BB16238B5317772E315D52BA647869F0D27DCB68CBB296FD50E25852 + 55F26A79DCF28E5283D2A5A5432B82573495A994C9CB6EAEF45AB96315619564 + 55EF6A97D55B567F2A17955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDA + DADE4AB7CAEDEB48EBA4EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B + 5F6D4ADE74A17A6AF58ECDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D + 7F5DCB56FDADABB7BED926DAD6BFDD777BF30E831D153BDEEF94ECBCB52B7857 + 6BBD457DF56ED2EE82DD8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645 + EFEB6A746F6CDCAFBFBFB2096D52368D1E483A70E59B806FDA9BED9A77B5705A + 2A0EC241E5C127DFA67C7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23A + BF75AC2DA36DA03DA1BDEFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F57 + 9EA09D283DF1F9E48293E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD + 6743CF9E3F1774EE4CB75FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE + 3D477E70FDE148AF5B6FEB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573 + D7F8D72E5D9F79BDEFC6EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D + 7A8F78AFFCBEDAFDEA07FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09 + 879EFE94FFD387E1D247CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2 + A713CFCA7E56FF79EB73ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372 + EFABA9AF3AC723C71FBCCE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40 + FE50F3D1FA63C7A7D04FF73EE77CFEFC2FF784F3FB25D29F3300000CC7494441 + 5478DABD59697314D715BDBDCCD2B369460BD2082D4146582C92CC6663D905D8 + C6768C03A95086D840C2223ED80E3855FE904FA9CA0F48C5C1B153FE908A93AA + 189B252E82532E3089C1441418B30810DA9004429A196DA399D1326B4F77E7BE + 9EEEE1A93592256769D5ADD6F4F4749F73FABC7BEF7BCDC0FC37661EE72ADFE1 + FAFF13204C8EFF991CD750A8BD32C377FF57F046B02458C3677A93A9BD6288FF + 1A9969E015459E7A02C3D2C0592A386A9F4B7DD9100ACC4206EF3B27228867DE + E075E09C163C15FAB15CE0252A6822D20C64BE95C89CC1E7004EC09A30CCB5B5 + B5B6AD5BB77AEBEBEBCA198631FBFD8168474747A4B7B737E6F7FB13434343C9 + E1E1E114053E6DD8D3846832B312981378CA2EB4DA04B845C0EDADB70E557A17 + 56BC71E59B1B2FC992CC2D5FB134B8A0B0A01BAFD0974C261E8C0647EEE33684 + 313E3232120B87C3844C42034F42A4C8A473582C2781F980D7FDADAA8D61C510 + D6AF5F5FD4D8D8F8C2D51B2D3FEFB9D75BC8713C98CD66D96C324936BB2DE571 + BB122525C5E376C1DAC3714C4F2C16EB0B8582BE07BDBDFE4060602210084C0E + 0E0EC642A150422321E67822CA77026FB00B4F01B72D5C589A77F0E0A17A86B3 + FCF2CAD5E62ABC3A871B702C070CCB662F88C7900C9F365BCCA2D3694F788B17 + 841C76A107BFEA89C7A2F7FC7E5FEBA54B9702CDCDCD112497C4E3292D662530 + 2B78EA986E1702DC4280BB707BE595571E797CDD53AF5F68BAFC6C4A4C233E13 + 703C0FBC8404E20CB02906D2C50CB92BC8B28C21A97BBCA8C49B38C9C473A2C7 + 9D175D585AD2C932F289B35F7CF1F5B973E746E2B8E13D92060292D13E73014F + 0F5015388663E3C68DA53F7EF5B52D77DABBF70D0D07DDE6380FE98924282919 + 524A0224268D3FE2A0C8550AEC22011415BC0C9224A924D2E974264411789E4B + D5AEA819C8CFB3FFEEC891234DF81482780F4220A111D06D24D30466036FB48B + 45B38BBDAAAAAA68EFBEBDEB2C82EBED6B376E57984C66E0D1EB63C341488C4D + 00CB70C0637018268587027729705536958044D49732E025290D2282270464FC + B261DDEACE547CE2D71F7EF8A75B5D5D5D61BC578C7A02223588550233819FC9 + 2E76A7D399B77DFBF625ABD63CFE260ED20651942C66B3054C663310DB047D01 + 8885C6F047AC0A9EEC05390F9CF92E302D766494C720FBB494515E14532A098B + 994FAE5BBBF2F2DDCED60F3EFEF8930ECC4CE31A01FA0964FD3F1B783ABB64ED + D2D0D0B070E7CE5D5B7B7A7D3F1D180C7A2C5601CC16044FD447BF07FB7C3019 + 8C6480E3C5ADE000936486341B038FBB184C4B5C06EB64944FA590402A096E8F + 6BE2B1DA9AD34D17CEFFE5ECD97F3C080683638627901DC040153363CF426717 + 41B7CBEEDDBBD7BA3C856FDF686EADC4C1C95A2C5620CAB3985DC243C3303E14 + 546D43801302F9893298B40CE20519E0651EC12181479D9AFF1FFA3E2566C027 + 9349A828F38E56967B3FF9DBC94F4F5DBC78D18FC726B43190848735610A0163 + DFC269AAAB6911EDE2C62AFA48C3D3EBDF40BB6C48A5D2161538AA4E727B5F7B + 07C86909BDCEABC0590C0B630387E886183F8A1745320A039CCC415E418680A4 + DA27434044E5098154921048407D6D8DDF6A623F387AF4937F5DBB766D103144 + 2902530630214083A7B30B51DDF1E493EB4A77EDFAC996EEFBBEFD8181E17C62 + 178BD58A3EB5808437BFDFDAA60E5A029E00275E2F14CB216A8EA03429601502 + 1FED259BF08E12583C79602F7181E2545412AAEF0901549F84820363CDAABAAE + 4868F8F0471F7DD47CEFDEBDA046C09881141D3C4381D755B757575717EEDDBB + 6FADC962FB052946668B9521AAEBCA13BF4F84C330D0735F2D5004BA9515203F + 560A61C1879F184D79D442B6C2D28AE5B897211A4960868A40C18B1E188D86D4 + 41AB8227EA27E280B520F5C49AFA2B5D9DEDBFFFF4D3BF7660CF14D608D0F691 + 68AF3306D5ED8D8DFBAB57AE5AFBF6C5CB57378A69190527AA0B19F024CB6883 + 3586636BD8E7072929824BCE0799418D9938AA80F0511B05FF78C9051EA9184A + 961763D691E141B30F96BDBC183A877B206DD5C0E31320E013189E3CD7C4DAD5 + 75673B3BDA8E9C3973A6B3ADAD4D4FA1298A40CEBC4E328CF3DD770F37DC6EED + 3A3C343CEAB60A0258AD360CA27A063C498FE6240BE9F1847A05562D4F8CA637 + FE296CC6364AA6DD9790048783D79446CB31987918B40912C17FB00EA421568A + 67B84D2A01E2FF721CC015E5A5970703FD87DF79E7B79D54FAD4C12B34783A3D + BADE7FFFFDF54D97AF1F8E46E3364140E082A6BC9ADF2DD07FB70B2C93F823C6 + 8457512093DDA7832F144B601C9F7AC432AC1E67D4018C7BC4CD28191733123E + 9F7207C45D695579128484D36E8B6EFEFE336FEEDBB7FF420EEF4F036FD5C11F + 3A7468C5C2F2EFFDEACAD59B4B313D7246E5FBEF766BE079F52A33296F910428 + 7196C1D0D800885C0A42A6B046002B71DA8C6D850C2CEA28E25370451D305635 + 09513E0689780CEC3621B6F9C5670E1E387080809FD4324FB670196DA38377D6 + D5D595EED9B367B36F60747F5F7FA020ABBC063E16413DEF8FA8BD06C3901FF3 + 59EDA7D8867C9633C714B4CD249F563B57321630CF229AA8DA3E70229B492225 + 02C470CC788B0B23951565CD03FEBEDFBCF7DE7BED73016FD6C13B1C0ECF73CF + 3D57FDECA6170E608E7F4A9214B331DB7058A4A24822D8DD07669305D2360692 + D1B8DA0AB0AACF6552D4D51A805A43A154047136AADA852FB64172685C2D56D6 + 4A0F708225E3F744025C4E5B6CF5CADA0BAD776E1D3D7FFEAB76DC46A89C3FCD + 360C4CEDDB1DC43A5E6F49F19E3D7B1BACB6BC373AEEDE5B805E67F43C4FFA1A + 1EFB1ADE84BDCDC5BB6073BBC0BDB2029F02A366A050673FD6020918130B794B + 4A414C88308E695BB1C950BA7CB1DA328FB4DC07299C00A1AE441DA47AAAC456 + A1B5A3ADE50FA74E7DD68ABD0EC9F5E31AF078AE01AB3764D9668CA88FE17EFA + E9A7AA7EB46DFB6BADED3D9B1229315B61D5C60C811302A397BBC15E9C0FAE1A + AF3A2121DBF0ED1E1023E85B571EB8EBCB6132128107B7DB7152E084D2A58BD5 + FE66E44E2F289124989717A9E02549941FAB5DE61F1AF4FDF1C4F1E3577D3EDF + 90065CB70C9DEBC15861750282A67E5E4141C1821D3B76ACAC5C54FDB35B773A + 4A39CEC412F5CD681B5DFDC9F641300B5670D694A8CA93186DEB83E4E8043817 + 1480634931DA6B0CFA5A3A40703AA0E4D1456A7B10EAF4818CF301AECAAD82AF + 7EA432C8B3F28913C78F7D85B9DD87F71FD380EB458A9EA84C6BCCA6F436C43A + 44FD55AB5655ECD8F1EA0FFBFC433F0885C71D665D7D52A850FDB1074360631C + E05C5298990A22F889BE1188F607C155560442450144C363D0DFDA095687038A + 9754AA9575FC6E00A431C454E580A2A2FC89326FE1D9CF4E9DFCFBD5ABD7FAB0 + 684534D5F51449F737D9F68026914B7D97DD6ECFDFB66D5B6DDD63AB5FBF71B3 + B51A1172743F4FA681AC88A9D2C6A99D26013FE90B42CC1702E7C242B0967960 + B8B71F26074771F09A20BFB81464B702E3E1084803127896E625962E59F4CD57 + E7FF79ECCB2FCF75E19C364C0137366692B131CBA57EB6DA12FBD4D4D47877EE + DAFDFC687872A72F30E8CE78DE9CF53D9984B3DC43F0517F08E4FE0498BC985E + 2BDC10EEF243127D6EE33C38883113B933FD3C76D8E2CADAA5ADB76E5E3FF2F9 + E79FB78DE246F95C6F0972F6F4B96652D3560C88FA369BCDF3FCF39B163FF3EC + 0BFB2F7D7DFD09495178939A6D323D0E513FB382C0A81D666C3002A98131B015 + 7B80F73AB4C9B8AC76A36A3B8C1D25763ED2CAFAE57D7DBDDD7F3E79F2E4AD40 + 203042F99C6E07D230CB64C4A83EDD2E087AF6C1D459D8D8D8B84E524C075B5A + 3B1664D32501CEF119F535E549E50AA1EFDD9602608A203B1197B46920990ED6 + 2E7B74484AC78F1C3B7AF4527777B79E59260C0394F639CC061E20F7C444F7BF + 63C3860D152F6D7E794B6060644B3014B163BEE6644561655961C97A0F01CFB2 + EC940BAACB2092942540D224365D91CAB292CF8E1F3F76E6E6CD9B7E1CC0B4E2 + 71986105613EEB363C4CCD3E36ACBCAE4D9B3655AEA8AD5B6FB3D997A15DF210 + 9B2B99149D38D04CF144D2148F2778DCF3C9648A478519025EC92A2F618F6416 + D7ACAABFD87CFD9BBF9C3E7DFA5E341A1DD3D4A6ABA808F35CFA30AE98E9EAD3 + 1612707AE8ACA8A8F078BD5E0F562DBB2008769B4D20DDA780CD1B9601AB198F + 610B644247F1FAD39059964B731C2B8E8D8D875A5A5A1E343535F5A3CF239ADA + BAC7A74D3AE6BCE84481D7D5A7D3A75E81AD5A58B4D0D732F573E9170FBA4F75 + 30290D60021E967C1DF4B4CC32AFE53EC342AB715D5E7F0A3A11FD7F7AAD5E5F + 3E318297E1E18A708A0A7A81C99859E03F01AF9F431330BE5CA05F30D06F4A72 + 81A7D7EA69B0B44DA6AC9019F17DDB809D72AE81402E22AC21E873E94D57539A + 25E8170CDFFA9A672E2FD4E873683BB039F6F439B936FADDD44CEFABE6047CAE + E0739D6BB4C54C6F05E9CFC6579C33BD259CF31BC2F9809FEBEFE6724D658EC7 + 66DDFE0D936AC18FA37564950000000049454E44AE426082} + end + object m_pbUserNoticeNum: TPaintBox + Left = 890 + Top = 4 + Width = 21 + Height = 21 + Cursor = crHandPoint + ParentCustomHint = False + Font.Charset = DEFAULT_CHARSET + Font.Color = 15062729 + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentFont = False + ParentShowHint = False + ShowHint = True + Visible = False + OnClick = UserNoticeNumClick + OnPaint = DoShowNoticeNumPaint + end + object m_btnExtFontOn: TPNGButton + Left = 757 + Top = 641 + Width = 36 + Height = 23 + Hint = #28857#20987#20351#29992#24120#35268#38899#33394#24211 + ParentCustomHint = False + ImgStates = 3 + ParentShowHint = False + PngImg.Data = { + 89504E470D0A1A0A0000000D494844520000006C000000170806000000EE83AA + CF000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F33000005304944415478DAED9A5B681C5518 + C7FF73CB269BEC35A926698C5A3769126F6D516C142B95B45A288A2F3E8868AA + D2179FFAEEA37843282A14542CA220585F240449AD562422D607DB9AB649DB6D + 6B1A9B069B6CB2D76477E7E277CEA4B9E0CE6E1C66C615F20DDFCE66CF09F33B + DFFFDCCF08AAAA2A00FCE4A1C53BFBDB4B2B92E7C893E42AB98F3C4ADE4C1E21 + 6F20AFF188A5409E219F259F224F90E7C9E52A894F4E20C1420F6D7FF8A3C9C9 + EBCF7A0CB2CA5A5B5B8E9CF8E5E7032C283B1FDF75301E8FEFFD2F7962B1D8E0 + 0FC78F319E1CC5E76095C4673F13ACFDB6F63BC73BBAEEE6098661B00FB0CB4D + 13E882409FE4CC2E8E9DC5C4D52B5BE96B03F10C5709CFA3F435433C27FD0D01 + 4892045114298FB894CF2D63E5360C1DBAAE43D334E43269C6733B13AC8B8046 + 59800C4AD45946BA570A90D8BE01CAB618C49628845AB3C7323239E8D712289E + 18833E93AE1820810A2F0AE67D31408F5152887806AA84E7294A4A12CF8F8150 + 9804932132D156086B65CA1DCDA8DDDE05656313F1F8F86F7A3A0B75621AB9E1 + 1168D3C98A82B1B2EB2496A6A94827E7184F3713EC5E02FA3DB6B987ABA9EB1A + B961D6EC1226C75AE17F7E2704BF0FC64201462AB7BAE0D1000459829E4823FB + F19065A058814591B9596BE3E7CF31A02728A99178BEA8129EE7286986788E86 + 225148B2B2DCCA505A30A5B30DC117FB20D4D7C2982F404F655757ACC620E7D1 + 6652481E1A249E5469C1E8BAD9BA34B588E46C82F1DCB72C5867B799C86AB3C1 + BCB4F2E1B7F6F1C2673E396A5978795333EAFBFB6064F348BDFD954580C0BB16 + 890ACF8210BF30CA809EA4A466E2F9B44A78FA29698A7886C2D126C8B24CA2C9 + 5C54AB16167DE76568C493E6952365C91378693774E249BEF96569C158EBD299 + 582A4823CC25A6570B7657679719204D5FEC3F4B4728F2EE2B50C7FF42FAC36F + 684EA596CCC36A51E0D5BD106A64CCBDF6994580CC6E4592CC005DBA30B64AB0 + 2AE159122CD2B8C1146CB15BB412CC291E634577C8049B9DB9615F30EA5CE9A9 + 020C02D2E73266CD56244811EA7E02751C04AC6550BA1782B9C8634B3027781C + 152CFDC100AF25350F76400CD59B00AA6E4E126EA4B070FC1494CD6DF0EDB8C7 + 13C15CE4B12598133C8E0A9639FC2D8AE7AEA29CF99FEEE5C05E08E6228F2DC1 + 9CE071B64BA43C85912B043501F5E2359AAECEF334F1D63094F65BA06CD9C467 + 4B46BEE04D97E81E8F2DC19CE07154B0627C12725BD3D27A874FE156148001EA + C92CA4A6A02782B9C8634B3027781C1FC3D84C48A40154EED8C80752E4F23058 + CDFA2DCEF3D5EDDEE6E918E6128F2DC19CE07154B0FCAFE7913B328C72163CF0 + 0C0DBC014F047391C796604EF0383B86315335BE4064B31E6D2A413321056273 + 1852340831D2604E6B173C1AC3DCE3B12598133CCECE126915AFF4B4F3A9A910 + F4F387F3B5077B08411647FEE079BDEA125DE4B12598133CCE8E618706A15E9E + 4239ABDBF3007C8FF4783386B9C7634B3027782A0AB6D6BDBBD0EB2FF0E6BEF0 + DD29E47F3AFB8F74D15F839ADE1ED4F66D81763D81F4FB03160172662FD1659E + 25C1D6BA971879A39FF3E48E9D447EF84C091E1F17AAAE6F2BD4C90452EF7D6D + 2D58B9BDC4B5EE8E8BE17AF8F7ED82D412357F602D80FA62B05AC756F4ACF9D3 + FFAA637F22FBF9F77C855F3A40CEECD6BBCCF3AF77EBC5700342FBF7406A6D5C + E2D1E70B1064918F6337790AA313481D1EB2E429B75B6FEB3C0C04A0F4762F07 + 6AD1545AE1AB67C651C99C3E0F7389C7F67918E3F1EFB81F0AADC756DAC2E9CB + C89FBE5491A7DC79D8FA8933FE5F27CEEBEF7494B06A7EA763FDADA965ABFAB7 + A6FE061FC286C45CBFC2C50000000049454E44AE426082} + ShowHint = True + Visible = False + OnClick = ExtFontClick + end + object m_btnExtFontOff: TPNGButton + Left = 757 + Top = 641 + Width = 36 + Height = 23 + Hint = #28857#20987#20351#29992#39764#26041#25193#23637#38899#33394#24211 + ParentCustomHint = False + ImgStates = 3 + ParentShowHint = False + PngImg.Data = { + 89504E470D0A1A0A0000000D494844520000006C000000170806000000EE83AA + CF000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F330000053C4944415478DAED9AFB4F5B6518 + C79FB6A720B7DEB88C716907ABE33258CA256C2ED3E9A2CEC4B9E98C24537F58 + 62E20F6653F1F667B8C41F16B398B9683627036193CC5BA231260A73CEE8C2B8 + 15B6310436A01729154ACFA9CFF3160AC4D3164FDE73AC094FF3F4B4E77DDBF3 + 799FEFFB3EE73DEF39BA70386C04804C74F3D296BE6B698BE841743F7A183D1D + DD865E886E45CF464FD38825841E40F7A24FA27BD017D08514894F5087829977 + EEDA7D6A7C7CA2596390355654B4B9B5A7FBC7160ACA23FB1E3BE176BB0FFC97 + 3C4EA7B3EBBB6FBF219E20C6E7448AC4E76512CC5E6A2FBB7D7FE57656108944 + E80DE8A5A6E9F0053A7C47271BEAEF853BA337EBF06336F2FC90223C0FE2C700 + F2FC9A999D03068301F47A3DD6D1C7EAA965D4EE484402499240144508066689 + C741825522501F052882851255C46DB2006D2E2A86AAEDB5909B9B07E9E9E96C + 5F301884A97B77E1FA6FD7C0E7F3250D900E1BAFD745B74B01DA8B4566E4B994 + 223C07B1C88F3CDFE7982D2898007A126D95B0F1ACA4C40E35AE3A2828D814E3 + 999B9B83BB9313F0CBD51EF0793C4905A3B64B2896288661D6EF239E2A12AC16 + 817E77565433352549448F447BB68C391C65B0FFC9A7C0683482180EB3A0ACB6 + EC9C1CD69820C275B49D8F1B28AAA3D793477BAD7BE00601EDC7A25CE4399722 + 3CCF63D10CF27C65B6DAC02018574619C80BE6282B8703870E339E30F1E07157 + 5B8EC9C48E351708C085F367C1E795178E3AE8F2E812C38BE0C77AC8B36345B0 + 6D55D142EACD117279E58FBDFE16046667A1B3BD151BEF95EF5DA57606BD303F + 0F1F7EF07E9C00014B2D066C3C05C13DD847404F605121F29C49119EA3583489 + 3C5F5A6C792008028A263051E38DB057DF780779FE84CF2E108FBC182576071C + 7CFA5998479ED3A74ECA0B46A34B12592724E17D9EE9B5826DDD56190D90282D + E54FF9081D6F791BA6A7EE415BEB27B0180AC9D6B1586CD07CE40510B0979D7C + EFDD38018AA61583211AA0E1C1FE3582A5084F4C306B6E7E54B0A5B4184F305E + 3C9155E99004F3CE4C29176CB981549F86B61FF3AB80E982867B4646064B1964 + 54AE85602AF228128C070F57C1DAB1F7582C56A8AEA9856C9C3D094601FF3C3A + A3A13470A5FB27D852B6155CF50D9A08A6228F22C178F07015ECF2E71761D83D + 08896CDFA38F4365758D2682A9C8A348301E3CDC53E2C8B01B6EA2DFBE35C2A6 + AB64369C5217159740454515149796B20369951255E25124180F1EAE824D4E4C + 407E41016BD8EA062FFF66616101A7B30130E1B58B1682A9C8A348301E3CDCCF + 61E37F8C4156561638B694B3ED5F3845A503DCE8BDCEEAEDDEB357D373984A3C + 8A04E3C1C355B081FE3EF8FA8B2E48642F1E7D094C26B32682A9C8A348301E3C + DCCF61544E17AC34EB999E9A82B4B43496A36998538F22D3725AAF128F22C178 + F07015ACEB6207943B9D6C5928233373253FA3CFE255BE7B6888D5D52A25AAC8 + A348301E3C5C05EB68FB14C6EE8C4222DBF3D0C3B0C355AF89602AF228128C07 + 4F52C1D6BB76F7CAF116AC23C2CF3DDD70EDEA957F94DF8757F22E57033434ED + 04AF6706CE7D7C264E80F8AC25AACC13136CBD6B89C75E7B9371D3C531ADCACB + F1D4D5374263D32EF0CCCCC0D98F4EC7172CD15AE27A57C76979E5D033CF81D9 + 6289ED5B5C0CB1462C4F6369257B6C6C142E75B6B35E221F203EABF52AF3FCEB + D57A9A481C6E3E0216AB7585271462BF21B1978E86FF7D0B3A71248A717812AD + D62BBA1F460DA31C9C975FB066FF887B0873F4002433DEF7C354E2517C3F8C84 + 6D6C7A00361516AED94F33C881BEDEA43C89EE876DDC7186FFD71DE78D673A64 + 2C959FE9D8786A6AC552FEA9A9BF01C6F980C48B03983A0000000049454E44AE + 426082} + ShowHint = True + OnClick = ExtFontClick + end + object m_lblExtFont: TLabel + Left = 760 + Top = 646 + Width = 84 + Height = 14 + Cursor = crHandPoint + Hint = #20174#21809#20316#32593#19979#36733#25193#23637#38899#33394#24211 + ParentCustomHint = False + BiDiMode = bdLeftToRight + Caption = #19979#36733#25193#23637#38899#33394#24211 + Font.Charset = GB2312_CHARSET + Font.Color = clHighlight + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [fsUnderline] + Font.Quality = fqClearTypeNatural + ParentBiDiMode = False + ParentFont = False + ParentShowHint = False + ShowAccelChar = False + ShowHint = True + Layout = tlCenter + OnClick = URLClick + OnMouseEnter = URLMouseEnter + OnMouseLeave = URLMouseLeave + end + object m_lblWebsite: TLabel + Left = 912 + Top = 653 + Width = 98 + Height = 14 + Cursor = crHandPoint + Hint = #27426#36814#35775#38382#21809#20316#32593 + ParentCustomHint = False + Alignment = taCenter + AutoSize = False + BiDiMode = bdLeftToRight + Caption = 'iChangzuo.com' + Font.Charset = GB2312_CHARSET + Font.Color = 1934582 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [fsItalic] + Font.Quality = fqClearTypeNatural + ParentBiDiMode = False + ParentFont = False + ParentShowHint = False + ShowAccelChar = False + ShowHint = True + Layout = tlCenter + OnClick = URLClick + OnMouseEnter = URLMouseEnter + OnMouseLeave = URLMouseLeave + end + object m_panelVolLevel: TPanel + Left = 40 + Top = 643 + Width = 166 + Height = 18 + ParentCustomHint = False + BevelOuter = bvNone + BiDiMode = bdLeftToRight + Color = clWindow + Ctl3D = False + UseDockManager = False + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentBiDiMode = False + ParentCtl3D = False + ParentDoubleBuffered = False + ParentFont = False + ParentShowHint = False + ShowCaption = False + ShowHint = False + TabOrder = 1 + object m_imgVolLevelBk: TImage + Left = 0 + Top = 0 + Width = 166 + Height = 18 + ParentCustomHint = False + AutoSize = True + ParentShowHint = False + Picture.Data = { + 0A544A504547496D6167654A320000FFD8FFE105714578696600004D4D002A00 + 0000080007011200030000000100010000011A00050000000100000062011B00 + 05000000010000006A012800030000000100020000013100020000001C000000 + 7201320002000000140000008E8769000400000001000000A4000000D0000AFC + 8000002710000AFC800000271041646F62652050686F746F73686F7020435335 + 2057696E646F777300323031343A30313A30332031353A31393A303000000000 + 03A00100030000000100010000A002000400000001000000A6A0030004000000 + 01000000120000000000000006010300030000000100060000011A0005000000 + 010000011E011B00050000000100000126012800030000000100020000020100 + 04000000010000012E02020004000000010000043B0000000000000048000000 + 010000004800000001FFD8FFED000C41646F62655F434D0001FFEE000E41646F + 626500648000000001FFDB0084000C08080809080C09090C110B0A0B11150F0C + 0C0F1518131315131318110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C + 0C0C0C0C0C0C0C0C0C0C0C0C0C0C010D0B0B0D0E0D100E0E10140E0E0E14140E + 0E0E0E14110C0C0C0C0C11110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C + 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0CFFC0001108001100A00301220002110103 + 1101FFDD0004000AFFC4013F0000010501010101010100000000000000030001 + 020405060708090A0B0100010501010101010100000000000000010002030405 + 060708090A0B1000010401030204020507060805030C33010002110304211231 + 054151611322718132061491A1B14223241552C16233347282D14307259253F0 + E1F163733516A2B283264493546445C2A3743617D255E265F2B384C3D375E3F3 + 462794A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F637475767 + 778797A7B7C7D7E7F71100020201020404030405060707060535010002110321 + 3112044151617122130532819114A1B14223C152D1F0332462E1728292435315 + 637334F1250616A2B283072635C2D2449354A317644555367465E2F2B384C3D3 + 75E3F34694A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F62737 + 475767778797A7B7C7FFDA000C03010002110311003F00E1EAA9AEAD90C608AA + B3FCDB0C9F4DAE324B54FECED98DACE63F9A6786EFDD4F448AD9ED2669AE2078 + D6D08B3ACED7733C0FDDDBFBC86AA4231DA63DACD76FF8267E77F652F41B13B5 + 9C4FF36CF1DBFBA8C0C47B5DA6DEC3F379EE9BB46D7711C0FDEDDE286A84471D + A27DACD377F8267E6FF652FB3B6636B3923F9AAFB0DDFBA8C4CCFB5DAEEEC3BF + 1DD29D676BB92781DC6DFDE47552118ED31ED66BB7FC157F9C3FAA97A0D89DAC + E01FE6D9DCEDFDD460608F6BB42DEC3B0D7F3921C01B5DC01C0EC7778A1AAB54 + 4319A4130CD27FC157D8FF00553FD95BE0CFFB6ABFFC8A2870008DAEE4F61DCF + F594B78FDD777EC3FF002487ABF24A0FB2B7C19FF6D57FF914BECADF067FDB55 + FF00E451F78FDD776EC3FF0024983C7EEBBB761FF924AE5F9A9AFF00676C4ED6 + 704FF34CEC76FEEA738CD13ED6693FE099DBFB28B3A46D7704703C67C53974CF + B5DAEEEC3B8FEB23EAFC976887ECCD98DACE63F9AAFC377EEA6FB3B74F6B358F + F04CEFFD947DDACED7723B0F08FDE4C0F1ED769B7B0EDCFE725AA3441E836276 + B389FE6D9E3B7F7539C7689F6B34DDFE099F9BFD945ED1B5DC4703F7B778A771 + 99F6BB5DDD87E771F9C96A9D10FD9DB31B59CC7F355F86EFDD43BA968A2E3B59 + A564FF0036C1CB5C790D56A759DAEE6781FBBB7F790B227ECD7E847E8BBC7663 + 9BE3E688B5695F47FFD0F2D3DBE03F2265149253249452494C92514925324945 + 2494C925149253249452494C925149253249452494C92514925324BFB9452494 + FF00FFD9FFED0C9250686F746F73686F7020332E30003842494D042500000000 + 0010000000000000000000000000000000003842494D043A0000000000930000 + 00100000000100000000000B7072696E744F7574707574000000050000000043 + 6C7253656E756D00000000436C7253000000005247424300000000496E746565 + 6E756D00000000496E746500000000496D6720000000004D70426C626F6F6C01 + 0000000F7072696E745369787465656E426974626F6F6C000000000B7072696E + 7465724E616D6554455854000000010000003842494D043B0000000001B20000 + 0010000000010000000000127072696E744F75747075744F7074696F6E730000 + 0012000000004370746E626F6F6C0000000000436C6272626F6F6C0000000000 + 5267734D626F6F6C000000000043726E43626F6F6C0000000000436E7443626F + 6F6C00000000004C626C73626F6F6C00000000004E677476626F6F6C00000000 + 00456D6C44626F6F6C0000000000496E7472626F6F6C000000000042636B674F + 626A630000000100000000000052474243000000030000000052642020646F75 + 62406FE000000000000000000047726E20646F7562406FE00000000000000000 + 00426C2020646F7562406FE000000000000000000042726454556E744623526C + 74000000000000000000000000426C6420556E744623526C7400000000000000 + 000000000052736C74556E74462350786C40520000000000000000000A766563 + 746F7244617461626F6F6C010000000050675073656E756D0000000050675073 + 0000000050675043000000004C656674556E744623526C740000000000000000 + 00000000546F7020556E744623526C7400000000000000000000000053636C20 + 556E74462350726340590000000000003842494D03ED00000000001000480000 + 0001000200480000000100023842494D042600000000000E0000000000000000 + 00003F8000003842494D040D000000000004000000783842494D041900000000 + 00040000001E3842494D03F3000000000009000000000000000001003842494D + 271000000000000A000100000000000000023842494D03F5000000000048002F + 66660001006C66660006000000000001002F6666000100A1999A000600000000 + 0001003200000001005A00000006000000000001003500000001002D00000006 + 0000000000013842494D03F80000000000700000FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFF03E800000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFF03E800000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFF03E800000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E8 + 00003842494D040000000000000200003842494D040200000000000200003842 + 494D043000000000000101003842494D042D0000000000060001000000023842 + 494D0408000000000010000000010000024000000240000000003842494D041E + 000000000004000000003842494D041A00000000033F00000006000000000000 + 000000000012000000A600000005672A68079898002D00310000000100000000 + 000000000000000000000000000000010000000000000000000000A600000012 + 0000000000000000000000000000000001000000000000000000000000000000 + 0000000010000000010000000000006E756C6C0000000200000006626F756E64 + 734F626A6300000001000000000000526374310000000400000000546F70206C + 6F6E6700000000000000004C6566746C6F6E67000000000000000042746F6D6C + 6F6E670000001200000000526768746C6F6E67000000A600000006736C696365 + 73566C4C73000000014F626A6300000001000000000005736C69636500000012 + 00000007736C69636549446C6F6E67000000000000000767726F757049446C6F + 6E6700000000000000066F726967696E656E756D0000000C45536C6963654F72 + 6967696E0000000D6175746F47656E6572617465640000000054797065656E75 + 6D0000000A45536C6963655479706500000000496D672000000006626F756E64 + 734F626A6300000001000000000000526374310000000400000000546F70206C + 6F6E6700000000000000004C6566746C6F6E67000000000000000042746F6D6C + 6F6E670000001200000000526768746C6F6E67000000A60000000375726C5445 + 5854000000010000000000006E756C6C54455854000000010000000000004D73 + 67655445585400000001000000000006616C7454616754455854000000010000 + 0000000E63656C6C54657874497348544D4C626F6F6C010000000863656C6C54 + 6578745445585400000001000000000009686F727A416C69676E656E756D0000 + 000F45536C696365486F727A416C69676E0000000764656661756C7400000009 + 76657274416C69676E656E756D0000000F45536C69636556657274416C69676E + 0000000764656661756C740000000B6267436F6C6F7254797065656E756D0000 + 001145536C6963654247436F6C6F7254797065000000004E6F6E650000000974 + 6F704F75747365746C6F6E67000000000000000A6C6566744F75747365746C6F + 6E67000000000000000C626F74746F6D4F75747365746C6F6E67000000000000 + 000B72696768744F75747365746C6F6E6700000000003842494D042800000000 + 000C000000023FF00000000000003842494D0414000000000004000000033842 + 494D040C00000000045700000001000000A000000011000001E000001FE00000 + 043B00180001FFD8FFED000C41646F62655F434D0001FFEE000E41646F626500 + 648000000001FFDB0084000C08080809080C09090C110B0A0B11150F0C0C0F15 + 18131315131318110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C + 0C0C0C0C0C0C0C0C0C0C0C010D0B0B0D0E0D100E0E10140E0E0E14140E0E0E0E + 14110C0C0C0C0C11110C0C0C0C0C0C110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C + 0C0C0C0C0C0C0C0C0C0C0C0CFFC0001108001100A003012200021101031101FF + DD0004000AFFC4013F0000010501010101010100000000000000030001020405 + 060708090A0B0100010501010101010100000000000000010002030405060708 + 090A0B1000010401030204020507060805030C33010002110304211231054151 + 611322718132061491A1B14223241552C16233347282D14307259253F0E1F163 + 733516A2B283264493546445C2A3743617D255E265F2B384C3D375E3F3462794 + A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F637475767778797 + A7B7C7D7E7F71100020201020404030405060707060535010002110321311204 + 4151617122130532819114A1B14223C152D1F0332462E1728292435315637334 + F1250616A2B283072635C2D2449354A317644555367465E2F2B384C3D375E3F3 + 4694A485B495C4D4E4F4A5B5C5D5E5F55666768696A6B6C6D6E6F62737475767 + 778797A7B7C7FFDA000C03010002110311003F00E1EAA9AEAD90C608AAB3FCDB + 0C9F4DAE324B54FECED98DACE63F9A6786EFDD4F448AD9ED2669AE2078D6D08B + 3ACED7733C0FDDDBFBC86AA4231DA63DACD76FF8267E77F652F41B13B59C4FF3 + 6CF1DBFBA8C0C47B5DA6DEC3F379EE9BB46D7711C0FDEDDE286A84471DA27DAC + D377F8267E6FF652FB3B6636B3923F9AAFB0DDFBA8C4CCFB5DAEEEC3BF1DD29D + 676BB92781DC6DFDE47552118ED31ED66BB7FC157F9C3FAA97A0D89DACE01FE6 + D9DCEDFDD460608F6BB42DEC3B0D7F3921C01B5DC01C0EC7778A1AAB544319A4 + 130CD27FC157D8FF00553FD95BE0CFFB6ABFFC8A2870008DAEE4F61DCFF594B7 + 8FDD777EC3FF002487ABF24A0FB2B7C19FF6D57FF914BECADF067FDB55FF00E4 + 51F78FDD776EC3FF0024983C7EEBBB761FF924AE5F9A9AFF00676C4ED6704FF3 + 4CEC76FEEA738CD13ED6693FE099DBFB28B3A46D7704703C67C53974CFB5DAEE + EC3B8FEB23EAFC976887ECCD98DACE63F9AAFC377EEA6FB3B74F6B358FF04CEF + FD947DDACED7723B0F08FDE4C0F1ED769B7B0EDCFE725AA3441E836276B389FE + 6D9E3B7F7539C7689F6B34DDFE099F9BFD945ED1B5DC4703F7B778A77199F6BB + 5DDD87E771F9C96A9D10FD9DB31B59CC7F355F86EFDD43BA968A2E3B59A564FF + 0036C1CB5C790D56A759DAEE6781FBBB7F790B227ECD7E847E8BBC76639BE3E6 + 88B5695F47FFD0F2D3DBE03F2265149253249452494C925149253249452494C9 + 25149253249452494C925149253249452494C92514925324BFB9452494FF00FF + D9003842494D042100000000005500000001010000000F00410064006F006200 + 65002000500068006F0074006F00730068006F00700000001300410064006F00 + 620065002000500068006F0074006F00730068006F0070002000430053003500 + 000001003842494D04060000000000070004000000010100FFE10E4A68747470 + 3A2F2F6E732E61646F62652E636F6D2F7861702F312E302F003C3F787061636B + 657420626567696E3D22EFBBBF222069643D2257354D304D7043656869487A72 + 65537A4E54637A6B633964223F3E203C783A786D706D65746120786D6C6E733A + 783D2261646F62653A6E733A6D6574612F2220783A786D70746B3D2241646F62 + 6520584D5020436F726520352E302D633036302036312E3133343737372C2032 + 3031302F30322F31322D31373A33323A30302020202020202020223E203C7264 + 663A52444620786D6C6E733A7264663D22687474703A2F2F7777772E77332E6F + 72672F313939392F30322F32322D7264662D73796E7461782D6E7323223E203C + 7264663A4465736372697074696F6E207264663A61626F75743D222220786D6C + 6E733A786D703D22687474703A2F2F6E732E61646F62652E636F6D2F7861702F + 312E302F2220786D6C6E733A786D704D4D3D22687474703A2F2F6E732E61646F + 62652E636F6D2F7861702F312E302F6D6D2F2220786D6C6E733A73744576743D + 22687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F735479 + 70652F5265736F757263654576656E74232220786D6C6E733A70686F746F7368 + 6F703D22687474703A2F2F6E732E61646F62652E636F6D2F70686F746F73686F + 702F312E302F2220786D6C6E733A64633D22687474703A2F2F7075726C2E6F72 + 672F64632F656C656D656E74732F312E312F2220786D703A43726561746F7254 + 6F6F6C3D2241646F62652050686F746F73686F70204353352057696E646F7773 + 2220786D703A437265617465446174653D22323031342D30312D30335431353A + 31392B30383A30302220786D703A4D65746164617461446174653D2232303134 + 2D30312D30335431353A31392B30383A30302220786D703A4D6F646966794461 + 74653D22323031342D30312D30335431353A31392B30383A30302220786D704D + 4D3A496E7374616E636549443D22786D702E6969643A41383334373232343435 + 373445333131393741324646464545423237333241422220786D704D4D3A446F + 63756D656E7449443D22786D702E6469643A4137333437323234343537344533 + 3131393741324646464545423237333241422220786D704D4D3A4F726967696E + 616C446F63756D656E7449443D22786D702E6469643A41373334373232343435 + 37344533313139374132464646454542323733324142222070686F746F73686F + 703A436F6C6F724D6F64653D2233222070686F746F73686F703A49434350726F + 66696C653D22735247422049454336313936362D322E31222064633A666F726D + 61743D22696D6167652F6A706567223E203C786D704D4D3A486973746F72793E + 203C7264663A5365713E203C7264663A6C692073744576743A616374696F6E3D + 2263726561746564222073744576743A696E7374616E636549443D22786D702E + 6969643A41373334373232343435373445333131393741324646464545423237 + 33324142222073744576743A7768656E3D22323031342D30312D30335431353A + 31392B30383A3030222073744576743A736F6674776172654167656E743D2241 + 646F62652050686F746F73686F70204353352057696E646F7773222F3E203C72 + 64663A6C692073744576743A616374696F6E3D22736176656422207374457674 + 3A696E7374616E636549443D22786D702E6969643A4138333437323234343537 + 344533313139374132464646454542323733324142222073744576743A776865 + 6E3D22323031342D30312D30335431353A31392B30383A303022207374457674 + 3A736F6674776172654167656E743D2241646F62652050686F746F73686F7020 + 4353352057696E646F7773222073744576743A6368616E6765643D222F222F3E + 203C2F7264663A5365713E203C2F786D704D4D3A486973746F72793E203C7068 + 6F746F73686F703A446F63756D656E74416E636573746F72733E203C7264663A + 4261673E203C7264663A6C693E757569643A3633363832453242313837424531 + 3131393541433934453838354644453138383C2F7264663A6C693E203C2F7264 + 663A4261673E203C2F70686F746F73686F703A446F63756D656E74416E636573 + 746F72733E203C2F7264663A4465736372697074696F6E3E203C2F7264663A52 + 44463E203C2F783A786D706D6574613E20202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 20202020202020202020202020202020203C3F787061636B657420656E643D22 + 77223F3EFFE20C584943435F50524F46494C4500010100000C484C696E6F0210 + 00006D6E74725247422058595A2007CE00020009000600310000616373704D53 + 46540000000049454320735247420000000000000000000000000000F6D60001 + 00000000D32D4850202000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000011637072740000 + 01500000003364657363000001840000006C77747074000001F000000014626B + 707400000204000000147258595A00000218000000146758595A0000022C0000 + 00146258595A0000024000000014646D6E640000025400000070646D64640000 + 02C400000088767565640000034C0000008676696577000003D4000000246C75 + 6D69000003F8000000146D6561730000040C0000002474656368000004300000 + 000C725452430000043C0000080C675452430000043C0000080C625452430000 + 043C0000080C7465787400000000436F70797269676874202863292031393938 + 204865776C6574742D5061636B61726420436F6D70616E790000646573630000 + 000000000012735247422049454336313936362D322E31000000000000000000 + 000012735247422049454336313936362D322E31000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000058595A20000000000000F35100010000000116CC58595A200000 + 000000000000000000000000000058595A200000000000006FA2000038F50000 + 039058595A2000000000000062990000B785000018DA58595A20000000000000 + 24A000000F840000B6CF64657363000000000000001649454320687474703A2F + 2F7777772E6965632E636800000000000000000000001649454320687474703A + 2F2F7777772E6965632E63680000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000646573630000 + 00000000002E4945432036313936362D322E312044656661756C742052474220 + 636F6C6F7572207370616365202D207352474200000000000000000000002E49 + 45432036313936362D322E312044656661756C742052474220636F6C6F757220 + 7370616365202D20735247420000000000000000000000000000000000000000 + 000064657363000000000000002C5265666572656E63652056696577696E6720 + 436F6E646974696F6E20696E2049454336313936362D322E3100000000000000 + 000000002C5265666572656E63652056696577696E6720436F6E646974696F6E + 20696E2049454336313936362D322E3100000000000000000000000000000000 + 0000000000000000000076696577000000000013A4FE00145F2E0010CF140003 + EDCC0004130B00035C9E0000000158595A2000000000004C0956005000000057 + 1FE76D6561730000000000000001000000000000000000000000000000000000 + 028F000000027369672000000000435254206375727600000000000004000000 + 0005000A000F00140019001E00230028002D00320037003B00400045004A004F + 00540059005E00630068006D00720077007C00810086008B00900095009A009F + 00A400A900AE00B200B700BC00C100C600CB00D000D500DB00E000E500EB00F0 + 00F600FB01010107010D01130119011F0125012B01320138013E0145014C0152 + 015901600167016E0175017C0183018B0192019A01A101A901B101B901C101C9 + 01D101D901E101E901F201FA0203020C0214021D0226022F02380241024B0254 + 025D02670271027A0284028E029802A202AC02B602C102CB02D502E002EB02F5 + 0300030B03160321032D03380343034F035A03660372037E038A039603A203AE + 03BA03C703D303E003EC03F9040604130420042D043B0448045504630471047E + 048C049A04A804B604C404D304E104F004FE050D051C052B053A054905580567 + 05770586059605A605B505C505D505E505F6060606160627063706480659066A + 067B068C069D06AF06C006D106E306F507070719072B073D074F076107740786 + 079907AC07BF07D207E507F8080B081F08320846085A086E0882089608AA08BE + 08D208E708FB09100925093A094F09640979098F09A409BA09CF09E509FB0A11 + 0A270A3D0A540A6A0A810A980AAE0AC50ADC0AF30B0B0B220B390B510B690B80 + 0B980BB00BC80BE10BF90C120C2A0C430C5C0C750C8E0CA70CC00CD90CF30D0D + 0D260D400D5A0D740D8E0DA90DC30DDE0DF80E130E2E0E490E640E7F0E9B0EB6 + 0ED20EEE0F090F250F410F5E0F7A0F960FB30FCF0FEC1009102610431061107E + 109B10B910D710F511131131114F116D118C11AA11C911E81207122612451264 + 128412A312C312E31303132313431363138313A413C513E5140614271449146A + 148B14AD14CE14F01512153415561578159B15BD15E0160316261649166C168F + 16B216D616FA171D17411765178917AE17D217F7181B18401865188A18AF18D5 + 18FA19201945196B199119B719DD1A041A2A1A511A771A9E1AC51AEC1B141B3B + 1B631B8A1BB21BDA1C021C2A1C521C7B1CA31CCC1CF51D1E1D471D701D991DC3 + 1DEC1E161E401E6A1E941EBE1EE91F131F3E1F691F941FBF1FEA20152041206C + 209820C420F0211C2148217521A121CE21FB22272255228222AF22DD230A2338 + 2366239423C223F0241F244D247C24AB24DA250925382568259725C725F72627 + 2657268726B726E827182749277A27AB27DC280D283F287128A228D429062938 + 296B299D29D02A022A352A682A9B2ACF2B022B362B692B9D2BD12C052C392C6E + 2CA22CD72D0C2D412D762DAB2DE12E162E4C2E822EB72EEE2F242F5A2F912FC7 + 2FFE3035306C30A430DB3112314A318231BA31F2322A3263329B32D4330D3346 + 337F33B833F1342B3465349E34D83513354D358735C235FD3637367236AE36E9 + 37243760379C37D738143850388C38C839053942397F39BC39F93A363A743AB2 + 3AEF3B2D3B6B3BAA3BE83C273C653CA43CE33D223D613DA13DE03E203E603EA0 + 3EE03F213F613FA23FE24023406440A640E74129416A41AC41EE4230427242B5 + 42F7433A437D43C044034447448A44CE45124555459A45DE4622466746AB46F0 + 4735477B47C04805484B489148D7491D496349A949F04A374A7D4AC44B0C4B53 + 4B9A4BE24C2A4C724CBA4D024D4A4D934DDC4E254E6E4EB74F004F494F934FDD + 5027507150BB51065150519B51E65231527C52C75313535F53AA53F65442548F + 54DB5528557555C2560F565C56A956F75744579257E0582F587D58CB591A5969 + 59B85A075A565AA65AF55B455B955BE55C355C865CD65D275D785DC95E1A5E6C + 5EBD5F0F5F615FB36005605760AA60FC614F61A261F56249629C62F063436397 + 63EB6440649464E9653D659265E7663D669266E8673D679367E9683F689668EC + 6943699A69F16A486A9F6AF76B4F6BA76BFF6C576CAF6D086D606DB96E126E6B + 6EC46F1E6F786FD1702B708670E0713A719571F0724B72A67301735D73B87414 + 747074CC7528758575E1763E769B76F8775677B37811786E78CC792A798979E7 + 7A467AA57B047B637BC27C217C817CE17D417DA17E017E627EC27F237F847FE5 + 804780A8810A816B81CD8230829282F4835783BA841D848084E3854785AB860E + 867286D7873B879F8804886988CE8933899989FE8A648ACA8B308B968BFC8C63 + 8CCA8D318D988DFF8E668ECE8F368F9E9006906E90D6913F91A89211927A92E3 + 934D93B69420948A94F4955F95C99634969F970A977597E0984C98B899249990 + 99FC9A689AD59B429BAF9C1C9C899CF79D649DD29E409EAE9F1D9F8B9FFAA069 + A0D8A147A1B6A226A296A306A376A3E6A456A4C7A538A5A9A61AA68BA6FDA76E + A7E0A852A8C4A937A9A9AA1CAA8FAB02AB75ABE9AC5CACD0AD44ADB8AE2DAEA1 + AF16AF8BB000B075B0EAB160B1D6B24BB2C2B338B3AEB425B49CB513B58AB601 + B679B6F0B768B7E0B859B8D1B94AB9C2BA3BBAB5BB2EBBA7BC21BC9BBD15BD8F + BE0ABE84BEFFBF7ABFF5C070C0ECC167C1E3C25FC2DBC358C3D4C451C4CEC54B + C5C8C646C6C3C741C7BFC83DC8BCC93AC9B9CA38CAB7CB36CBB6CC35CCB5CD35 + CDB5CE36CEB6CF37CFB8D039D0BAD13CD1BED23FD2C1D344D3C6D449D4CBD54E + D5D1D655D6D8D75CD7E0D864D8E8D96CD9F1DA76DAFBDB80DC05DC8ADD10DD96 + DE1CDEA2DF29DFAFE036E0BDE144E1CCE253E2DBE363E3EBE473E4FCE584E60D + E696E71FE7A9E832E8BCE946E9D0EA5BEAE5EB70EBFBEC86ED11ED9CEE28EEB4 + EF40EFCCF058F0E5F172F1FFF28CF319F3A7F434F4C2F550F5DEF66DF6FBF78A + F819F8A8F938F9C7FA57FAE7FB77FC07FC98FD29FDBAFE4BFEDCFF6DFFFFFFEE + 000E41646F626500640000000001FFDB00840006040404050406050506090605 + 06090B080606080B0C0A0A0B0A0A0C100C0C0C0C0C0C100C0C0C0C0C0C0C0C0C + 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C010707070D0C0D18101018140E + 0E0E14140E0E0E0E14110C0C0C0C0C11110C0C0C0C0C0C110C0C0C0C0C0C0C0C + 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0CFFC0001108001200A6030111 + 00021101031101FFDD00040015FFC401A2000000070101010101000000000000 + 0000040503020601000708090A0B010002020301010101010000000000000001 + 0002030405060708090A0B100002010303020402060703040206027301020311 + 0400052112314151061361227181143291A10715B14223C152D1E1331662F024 + 7282F12543345392A2B26373C235442793A3B33617546474C3D2E2082683090A + 181984944546A4B456D355281AF2E3F3C4D4E4F465758595A5B5C5D5E5F56676 + 8696A6B6C6D6E6F637475767778797A7B7C7D7E7F738485868788898A8B8C8D8 + E8F82939495969798999A9B9C9D9E9F92A3A4A5A6A7A8A9AAABACADAEAFA1100 + 02020102030505040506040803036D0100021103042112314105511361220671 + 819132A1B1F014C1D1E1234215526272F1332434438216925325A263B2C20773 + D235E2448317549308090A18192636451A2764745537F2A3B3C32829D3E3F384 + 94A4B4C4D4E4F465758595A5B5C5D5E5F5465666768696A6B6C6D6E6F6475767 + 778797A7B7C7D7E7F738485868788898A8B8C8D8E8F839495969798999A9B9C9 + D9E9F92A3A4A5A6A7A8A9AAABACADAEAFAFFDA000C03010002110311003F00E1 + B676D13DB5B811442904449312124FA4189248EF809A45AB8B08C903D38B72A3 + FB98FF006857C30712DB5F518F8D7D38BA57FB98FC69E1838D6DB36118247A71 + 6C587F731FEC8AF861E25B70B08C903D38B72A3FB98FF6857C31E25B6BEA31F1 + AFA7174AFF00731F8D3C3071ADB66C23048F4E2D8B0FEE63FD915F0C3C4B6E16 + 119207A716E547F731FED0AF863C4B6E4D3E36A7EEE21515FEE63F1A786033D9 + 415FFA2E3FE48BBFFBA63EDF460F112EFD171FF245DBFDD31F7FA31F115DFA32 + 3A7D88BFE44C7FD30788AD369B183F622EFF00EE98FB0F964B8D203434E8EA3E + 08BA81FDCC7DC7CB1E34F0BBF47C74AF08BA57FB98FC69E1838D785C74E8EA7E + 08BA91FDCC7D87CB0F1AF0B5FA3E3AD3D38BAA8FEE63FDA15F0C789785AFA8C7 + C6BE9C5D2BFDCC7E34F0C78D3C0D9B08C123D38B62C3FB98FF006457C31E2470 + B85847503D38B72A3FB98FF6857C31E25E142DD5BA2B5A37A717C729D84483FD + D7275DB7E992BD93C1EAA7FFD0E29A6B2ADBC35AFF00BCF17627AC4076C8C820 + A30491D475EA9FB2DD86FDB23C2514B79A70A6F5E34FB2DD7957C307095A5C64 + 8EA7AF57FD96EE36ED8784AD38491D475EA9FB2DD86FDB1E12B4B79A70A6F5E3 + 4FB2DD7957C307095A5C648EA7AF57FD96EE36ED8784AD38491D475EA9FB2DD8 + 6FDB1E12B4DC72C6295AFD9A7D96EBCABE191313490A9F5883C4F7FD96FE980C + 0FFBA64EFAC41E27B7ECB7F4C440FF00B9577AF053A9E9FCADE3F2C1C06BE1FA + 56D6BCD093B57F6BF65BB8F964B84FDE905A12C551D7AAFECB761BF6C3C27EE4 + DADF522E34DEBC69F65BF9ABE18384D27882E32C553D7AB7ECB771B76C3C27EF + 45ADF523E40EFD50FD96EC37ED8444A7882DE71F0A6F5E34FB2DD7957C307094 + F105C648EA7AF573F65BB8DBB61E128E20E124751D7AA1FB2DD86FDB1E12BC41 + 0379426C4006A2560450FF00BEE4392AD99710E3B7FFD1F3DC3FDD45FEF7FF00 + 751FD8E9F647D9FF0027F971554FFB8962AD7FDC4B1577FDC4B1577FDC4B1577 + FDC4B1577FDC4B1577FDC4B1577FDC4B1577FDC4B1577FDC4B1577FDC4B1577F + DC4B1577FDC4B1577FDC4B1577FDC4B1577FDC4B1577FDC4B1577FDC4B156FFE + E258AA8CDFDF41FEF7FDB3F6BED7D86FB1EFFF001AE2AFFFD9} + ShowHint = False + end + object m_pbVolLevel: TPaintBox + Left = 4 + Top = 4 + Width = 158 + Height = 10 + ParentCustomHint = False + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentColor = False + ParentFont = False + ParentShowHint = False + ShowHint = False + OnPaint = VolLevelPaint + end + end +end diff --git a/MainFormUnit.h b/MainFormUnit.h new file mode 100644 index 0000000..3d03cf9 --- /dev/null +++ b/MainFormUnit.h @@ -0,0 +1,327 @@ +//--------------------------------------------------------------------------- + +#ifndef MainFormUnitH +#define MainFormUnitH +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include +#include +#include +#include + +#include "PNGButton.hpp" +#include "Capbutton.h" +#include "MenuBar.h" +#include "MenuUnit.h" +#include "SkinHintWindow.h" +#include "MicSetFormUnit.h" +#include "SetUpFormUnit.h" +#include "ComboBoxComponent.h" +#include "VolumeFormUnit.h" //add by lm 14.1.7 + +#include "LineEdit.h" +#include "KeyBoard.h" +#include "HelpFormUnit.h" + +#include "NotificationFormUnit.h" +#include "TextButton.h" +//--------------------------------------------------------------------------- +class TMainForm : public TForm +{ +__published: // IDE-managed Components + TPNGButton *m_btnClose; + TPNGButton *m_btnMax; + TPNGButton *m_btnMin; + TPNGButton *m_btnRest; + TPNGButton *m_btnRecord; + TPNGButton *m_btnPlay; + TPNGButton *m_btnStop; + TPNGButton *m_btnPause; + TLabel *m_lblTitle; + TLabel *m_lblLogon; + TPNGButton *m_tabStyle; + TPNGButton *m_tabChord; + TPNGButton *m_tabAudio; + TComboBoxComponent *m_cbPreStage; + TCapButton *m_btnTS; + TCapButton *m_btnTempo; + TPanel *m_panelVolLevel; + TImage *m_imgVolLevelBk; + TPaintBox *m_pbVolLevel; + TComboBoxComponent *m_cbFontSelect; + TComboBoxComponent *m_cbKey; + TPNGButton *m_btnOpen; + TPNGButton *m_btnSave; + TPNGButton *m_btnUpload; + TPNGButton *m_btnKeyboard; + TPNGButton *m_btnVolSet; + TImage *m_Logo; + TPaintBox *m_pbUserNoticeNum; + TPNGButton *m_btnExtFontOn; + TPNGButton *m_btnExtFontOff; + TLabel *m_lblExtFont; + TLabel *m_lblWebsite; + + void __fastcall FormCreate(TObject *Sender); + void __fastcall FormResize(TObject *Sender); + void __fastcall CloseClick(TObject *Sender); + void __fastcall FormClose(TObject *Sender, TCloseAction &Action); + void __fastcall FormCloseQuery(TObject *Sender, bool &CanClose); + void __fastcall MaxClick(TObject *Sender); + void __fastcall MinClick(TObject *Sender); + void __fastcall RestClick(TObject *Sender); + void __fastcall FormMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, + int X, int Y); + void __fastcall FormPaint(TObject *Sender); + void __fastcall LogonMouseEnter(TObject *Sender); + void __fastcall LogonMouseLeave(TObject *Sender); + void __fastcall RecordClick(TObject *Sender); + void __fastcall StopClick(TObject *Sender); + void __fastcall FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift); + void __fastcall PlayClick(TObject *Sender); + void __fastcall PauseClick(TObject *Sender); + void __fastcall PanelMouseMove(TObject *Sender, TShiftState Shift, int X, int Y); +// void __fastcall PanelMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y); + void __fastcall PanelMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y); + void __fastcall TabClick(TObject *Sender); + void __fastcall PreStageChange(TComboBoxItem *Sender, int Index); + void __fastcall VolLevelPaint(TObject *Sender); + void __fastcall UserNameClick(TObject *Sender); + void __fastcall FontSelectChange(TComboBoxItem *Sender, int Index); + void __fastcall KeyChange(TComboBoxItem *Sender, int Index); + void __fastcall OpenClick(TObject *Sender); + void __fastcall SaveClick(TObject *Sender); + void __fastcall UploadClick(TObject *Sender); + void __fastcall TTClick(TObject *Sender); + void __fastcall VolSetClick(TObject *Sender); + void __fastcall OnKeyBoard(TObject *Sender); + void __fastcall FormKeyUp(TObject *Sender, WORD &Key, TShiftState Shift); + void __fastcall PlayTimeClick(TObject *Sender); + void __fastcall DoShowNoticeNumPaint(TObject *Sender); + void __fastcall UserNoticeNumClick(TObject *Sender); + void __fastcall ExtFontClick(TObject *Sender); + void __fastcall URLClick(TObject *Sender); + void __fastcall URLMouseEnter(TObject *Sender); + void __fastcall URLMouseLeave(TObject *Sender); + +private: // User declarations + TMenuBar *m_pMenuBar; + TMenuPanel *m_pMenu, + *m_pPopMenu; + TVolumeForm *m_pVolumeForm; + + TPlayTimePanel *m_pPlayTimePanel; + TContentPanel *m_pContentPanel; + TToolpalPanel *m_pUseStylePanel, *m_pAudStylePanel, *m_pPreStylePanel, + *m_pChordPanel, *m_pTrackPanel; + int m_ToolpalWidth, m_UseStyleHeight, m_PreStyleHeight; + + TKeyBoard *m_KeyBoard; //ģ add by laq 2014.1.17 + + //¼/ + DWORD m_dwLastVol; + int m_iStartBar, + m_iLastStartBar, + m_iRecordBar, + m_nDelayPoint; + double m_dblStartPoint, + m_dblLastStartPoint, + m_dblRecordPoint; + +// bool m_bAudioModified; + bool m_bFromFile; + UINT m_tTimer, m_tAccuracy, m_tBeatHint; + int m_nVolLevel; //ȼ + + HRESULT __fastcall AutoRecognition( int iType ); //ʶ 0=¼ 1=Ƶ 2=MIDI 3=ƶ + HRESULT __fastcall AutoChords(); //Զú + void __fastcall OnLoadMelody(TObject *Sender); + void __fastcall SetMode( int iMode, bool bForce=false ); //ͼģʽ, bForceǿˢ + void __fastcall ChangeTT( bool bTS, int iValue ); + void __fastcall SetFont( int idFont, bool bExtFont=false, bool bAddUndo=true ); + + //ʱʱ + TTimer * m_pCDTimer; + void __fastcall CDTimerProc(TObject* Sender); + void __fastcall ClearCDTimer(); + + // + String m_strLoadProjectName, + m_strUploadFile; + + void __fastcall SaveAs( int iComb ); + + //ʾ + void __fastcall ShowPlayTime(); + void __fastcall CreateMenus(); + void __fastcall ViewLayout(); + + void __fastcall NewProject(); + void __fastcall DoLoadProject( LPCTSTR strName ); + void __fastcall AfterLoadProject(); + void __fastcall Undo( bool bUndo ); + + void __fastcall SetRecordState( bool bRecord ); + void __fastcall ShowToolPanels( int iShow ); + + bool __fastcall RecordEnabled(); + bool __fastcall CheckPayment( int iOperation ); + void __fastcall Logout(); // add by lm 14.1.17 + + int __fastcall SaveMedia( int iOperation, int iSaveOption, int iFileType, String strFileName, bool bUpload=false ); + + // + THelpForm* m_HelpForm; + + //̬ //add by tj 2014/04/18 + TTimer *m_pNotificationGetTimer; + void __fastcall NotificationTimerProc(TObject* Sender); + TNotificationForm *m_pNotificationForm; + + void __fastcall CreateParams(TCreateParams &Params); + + void __fastcall OnCreateNewProject(TObject * Sender = NULL); + void __fastcall OnPredefineProject(TObject * Sender = NULL); + void __fastcall OnSaveProject(TObject *Sender=NULL); + void __fastcall OnLoadProject(TObject *Sender=NULL); + void __fastcall OnUserHelp(TObject *Sender=NULL); + void __fastcall OnUserManual(TObject *Sender=NULL); + void __fastcall OnForumVist(TObject *Sender=NULL); + void __fastcall OnAbout(TObject *Sender=NULL); + void __fastcall OnMicSetting(TObject *Sender=NULL); + void __fastcall OnVSTPathSetting(TObject *Sender=NULL); + void __fastcall OnSaveAs(TObject *Sender=NULL);// add by lm 14.1.7 + void __fastcall OnShowToolPanels(TObject *Sender=NULL); + void __fastcall OnViewMode(TObject *Sender=NULL); + void __fastcall OnNotification(TObject *Sender=NULL); //add by tj 2014/04/18 + void __fastcall OnCustomerSetting(TObject *Sender=NULL); //add by tj 2014/05/13 + void __fastcall OnUndo(TObject *Sender=NULL); + void __fastcall OnRedo(TObject *Sender=NULL); + void __fastcall OnShowMore(TObject *Sender=NULL); + + //Ϣ + MESSAGE void __fastcall WMEraseBkgnd(Winapi::Messages::TWMEraseBkgnd &Message); + MESSAGE void __fastcall WMNCHitTest(TWMNCHitTest &Msg); + MESSAGE void __fastcall WMNCLButtonDown(TWMNCLButtonDown &Msg); + MESSAGE void __fastcall WMNCRButtonDown(TWMNCRButtonDown &Msg); + MESSAGE void __fastcall WMNCLButtonDblClk(TWMNCLButtonDblClk &Msg); + MESSAGE void __fastcall WMWindowPosChanged(TWMWindowPosChanged &Msg); + + MESSAGE void __fastcall OnRestoreWindow(TMessage &msg); + MESSAGE void __fastcall OnShowMenu(TMessage &msg); +// MESSAGE void __fastcall OnMenuCall(TMessage &msg); + MESSAGE void __fastcall OnMenuClose(TMessage & Msg); + MESSAGE void __fastcall OnLogin(TMessage &msg); + MESSAGE void __fastcall OnNetworkError(TMessage &msg); + MESSAGE void __fastcall OnNetworkMessage(TMessage &msg); + MESSAGE void __fastcall OnLoadProjectMessage(TMessage &msg); + MESSAGE void __fastcall OnSaveProjectMessage(TMessage &msg); + MESSAGE void __fastcall OnNewProjectMessage(TMessage &msg); + MESSAGE void __fastcall OnUploadMusic(TMessage & Msg); + MESSAGE void __fastcall AcceptFiles (TMessage& Msg); + MESSAGE void __fastcall OnShowAbout(TMessage & Msg); + MESSAGE void __fastcall OnOpenManual(TMessage & Msg); + MESSAGE void __fastcall OnOpenAutoProj(TMessage & Msg); + + MESSAGE void __fastcall UMShowBrush(TMessage &msg); + MESSAGE void __fastcall UMMediaTime(TMessage &Message); + MESSAGE void __fastcall UMRecordComplete(TMessage &Message); + MESSAGE void __fastcall UMRecordVolJust(TMessage &Message); + MESSAGE void __fastcall UMPlayOver(TMessage &Message); + MESSAGE void __fastcall UMShowPlayTime(TMessage &Message); + MESSAGE void __fastcall UMStop(TMessage &Message); + MESSAGE void __fastcall UMRecord(TMessage &Message); + MESSAGE void __fastcall UMTTSetup(TMessage &Message); + MESSAGE void __fastcall UMChangeTT(TMessage &Message); + MESSAGE void __fastcall UMStageChanged(TMessage &Message); + MESSAGE void __fastcall UMShowKeyBoard(TMessage &Message); + MESSAGE void __fastcall UMShowHelp(TMessage &Message); + MESSAGE void __fastcall UMStyleScore(TMessage &Message); + MESSAGE void __fastcall UMNotification(TMessage & Msg); //add by tj 2014/04/18 + MESSAGE void __fastcall UMApplyStyle(TMessage &Message); + MESSAGE void __fastcall UMSaveLocalStyle(TMessage &Message); + MESSAGE void __fastcall UMImportSegment(TMessage &Message); + MESSAGE void __fastcall UMUploadStyle(TMessage &Message); + MESSAGE void __fastcall UMChangeMelodyKey(TMessage &Message); + MESSAGE void __fastcall UMSetViewMode(TMessage &Message); + MESSAGE void __fastcall UMEnableRecord(TMessage &Message); + MESSAGE void __fastcall UMAudioLoad(TMessage &Message); + MESSAGE void __fastcall UMAutoRecognition(TMessage &Message); + MESSAGE void __fastcall UMShowVolSet(TMessage &Message); + MESSAGE void __fastcall UMVSTPath(TMessage &Message); + MESSAGE void __fastcall UMSetContentView(TMessage &Message); + MESSAGE void __fastcall UMGetContentView(TMessage &Message); + MESSAGE void __fastcall UMAudioVolChanged(TMessage &Message); + MESSAGE void __fastcall UMPreferChanged(TMessage &Message); + MESSAGE void __fastcall UMShowMore(TMessage &Message); + MESSAGE void __fastcall UMStartCDTimer(TMessage &Message); + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(WM_ERASEBKGND, TWMEraseBkgnd, WMEraseBkgnd) + MESSAGE_HANDLER(WM_NCHITTEST, TWMNCHitTest, WMNCHitTest) + MESSAGE_HANDLER(WM_NCLBUTTONDOWN, TWMNCLButtonDown, WMNCLButtonDown) + MESSAGE_HANDLER(WM_NCRBUTTONDOWN, TWMNCRButtonDown, WMNCRButtonDown) + MESSAGE_HANDLER(WM_NCLBUTTONDBLCLK, TWMNCLButtonDblClk, WMNCLButtonDblClk) + MESSAGE_HANDLER(WM_WINDOWPOSCHANGED, TWMWindowPosChanged, WMWindowPosChanged) + MESSAGE_HANDLER(WM_DROPFILES,TMessage, AcceptFiles) + + MESSAGE_HANDLER(MSG_NETWORKERROR, TMessage, OnNetworkError) + MESSAGE_HANDLER(MSG_NETWORKMESSAGE, TMessage, OnNetworkMessage) + MESSAGE_HANDLER(MSG_MEDIATIME, TMessage, UMMediaTime) + MESSAGE_HANDLER(MSG_RECORD_COMPLETE, TMessage, UMRecordComplete) + MESSAGE_HANDLER(MSG_RECORD_VOLJUST, TMessage, UMRecordVolJust) + MESSAGE_HANDLER(MSG_PLAY_END, TMessage, UMPlayOver) + + MESSAGE_HANDLER(UM_RESTORE, TMessage, OnRestoreWindow) + MESSAGE_HANDLER(UM_SHOWMENU, TMessage, OnShowMenu) + MESSAGE_HANDLER(UM_MENUCLOSE, TMessage, OnMenuClose) + MESSAGE_HANDLER(UM_SHOWPLAYTIME, TMessage, UMShowPlayTime) + MESSAGE_HANDLER(UM_STOP, TMessage, UMStop) + MESSAGE_HANDLER(UM_RECORD, TMessage, UMRecord) + MESSAGE_HANDLER(UM_SHOWBRUSH, TMessage, UMShowBrush) + MESSAGE_HANDLER(UM_TTSETUP, TMessage, UMTTSetup) + MESSAGE_HANDLER(UM_CHANGETT, TMessage, UMChangeTT) + MESSAGE_HANDLER(UM_STAGECHANGED, TMessage, UMStageChanged) + MESSAGE_HANDLER(UM_LOGIN, TMessage, OnLogin) + MESSAGE_HANDLER(UM_LOADPROJECT, TMessage, OnLoadProjectMessage) + MESSAGE_HANDLER(UM_SAVEPROJECT, TMessage, OnSaveProjectMessage) + MESSAGE_HANDLER(UM_NEWPROJECT, TMessage, OnNewProjectMessage) + MESSAGE_HANDLER(UM_UPLOADMUSIC,TMessage,OnUploadMusic) + MESSAGE_HANDLER(UM_SHOWABOUT,TMessage,OnShowAbout) + MESSAGE_HANDLER(UM_OPENMANUAL,TMessage,OnOpenManual) + MESSAGE_HANDLER(UM_SHOW_KB, TMessage, UMShowKeyBoard) + MESSAGE_HANDLER(UM_OPENAUTOPROJ,TMessage,OnOpenAutoProj) + MESSAGE_HANDLER(UM_SHOWHELP, TMessage, UMShowHelp) + MESSAGE_HANDLER(UM_STYLESCORE, TMessage, UMStyleScore) + MESSAGE_HANDLER(UM_NOTIFICATION, TMessage, UMNotification) //add by tj 2014/04/18 + MESSAGE_HANDLER(UM_APPLYSTYLE, TMessage, UMApplyStyle) + MESSAGE_HANDLER(UM_SAVELOCALSTYLE, TMessage, UMSaveLocalStyle) + MESSAGE_HANDLER(UM_IMPORTSEGMENT, TMessage, UMImportSegment) + MESSAGE_HANDLER(UM_UPLOADSTYLE, TMessage, UMUploadStyle) + MESSAGE_HANDLER(UM_CHANGEKEY, TMessage, UMChangeMelodyKey) + MESSAGE_HANDLER(UM_SETVIEWMODE, TMessage, UMSetViewMode) + MESSAGE_HANDLER(UM_ENABLERECORD, TMessage, UMEnableRecord) + MESSAGE_HANDLER(UM_AUDIOLOAD, TMessage, UMAudioLoad) + MESSAGE_HANDLER(UM_AUTORECOGNITION, TMessage, UMAutoRecognition) + MESSAGE_HANDLER(UM_SHOW_VOLSET, TMessage, UMShowVolSet) + MESSAGE_HANDLER(UM_VSTPATH, TMessage, UMVSTPath) + MESSAGE_HANDLER(UM_SETCONTENTVIEW, TMessage, UMSetContentView) + MESSAGE_HANDLER(UM_GETCONTENTVIEW, TMessage, UMGetContentView) + MESSAGE_HANDLER(UM_AUDIOVOLCHANGED, TMessage, UMAudioVolChanged) + MESSAGE_HANDLER(UM_PREFERCHANGED, TMessage, UMPreferChanged) + MESSAGE_HANDLER(UM_SHOWMORE, TMessage, UMShowMore) + MESSAGE_HANDLER(UM_STARTCDTIMER, TMessage, UMStartCDTimer) + END_MESSAGE_MAP(TForm) + +public: // User declarations + __fastcall TMainForm(TComponent* Owner); + + void __fastcall ShowErrorMessage( int err, String strOperation ); +}; +//--------------------------------------------------------------------------- +extern PACKAGE TMainForm *MainForm; +//--------------------------------------------------------------------------- +#endif diff --git a/ManageSongFormUnit.cpp b/ManageSongFormUnit.cpp new file mode 100644 index 0000000..07fe453 --- /dev/null +++ b/ManageSongFormUnit.cpp @@ -0,0 +1,126 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop + +#include "GlobalUnit.h" +#include "ManageSongFormUnit.h" +#include "QRcodePanel.h" + +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma link "PNGButton" +#pragma link "GeneralDialogPanel" +#pragma link "TextButton" +#pragma resource "*.dfm" + +TManageSongForm *ManageSongForm; +const static COLORREF Enter = RGB( 100,180,236 ), + Leave = RGB( 67,117,233 ); + +TQRcodePanel * QRPanel = NULL; + +//--------------------------------------------------------------------------- +__fastcall TManageSongForm::TManageSongForm(TComponent* Owner, bool bUpload, UINT idSong) + : TForm(Owner) +{ + m_pQRdata = NULL; + char strURL[1024]; + + if( bUpload ){ + if( idSong>0 ){ + String strMsg = L"ϴɹ\n\nվ"; + if( f_QR_Encode ){ + char strURL[256], strID[20]; + f_CS_GetWebPageURL( URL_SHAREPLAY, strURL ); + sprintf( strID, "%d", idSong ); + strcat( strURL, strID ); + + m_pQRdata = new unsigned char[100*100]; + int qrWidth = f_QR_Encode( strURL, m_pQRdata ); + QRPanel = new TQRcodePanel( NULL, "ά" ); + if( QRPanel ){ + Width += Height; + QRPanel->Parent = this; + QRPanel->SetBounds( Width-Height, 0, Height, Height ); + QRPanel->SetQRData( qrWidth, m_pQRdata ); + QRPanel->Show(); + + strMsg += L"ɨά룩"; + } + } + + strMsg += L"ͷ"; + + f_CS_GetWebPageURL( URL_SONGPLAY, strURL ); + m_strGo = strURL; + m_strGo += "&musicId=" + IntToStr( (int)idSong ); + + m_lbMsg->Caption = strMsg; + } + } + else{ + m_lbMsg->Caption = L"ϴδѴ\n\nվ"; + f_CS_GetWebPageURL( URL_SONGMANAGE, strURL ); + m_strGo = strURL; + } + + Font->Color = RGB(60,43,23); + m_lbGoManage->Font->Color = Leave; + + SetTransparent( this ); +} + +//--------------------------------------------------------------------------- + +void __fastcall TManageSongForm::GoManageMouseEnter(TObject *Sender) +{ + Screen->Cursor = crHandPoint; + m_lbGoManage->Font->Color = Enter; +} +//--------------------------------------------------------------------------- +void __fastcall TManageSongForm::GoManageMouseLeave(TObject *Sender) +{ + Screen->Cursor = crDefault; + m_lbGoManage->Font->Color = Leave; +} +//--------------------------------------------------------------------------- +void __fastcall TManageSongForm::GoManageClick(TObject *Sender) +{ +// char strURL[256]; +// f_CS_GetWebPageURL( URL_SONGMANAGE, strURL ); +// ShellExecute(Handle, NULL, ((String)strURL).c_str(), NULL, NULL, SW_SHOWNORMAL); + ShellExecute(Handle, NULL, m_strGo.c_str(), NULL, NULL, SW_SHOWNORMAL); + + ModalResult = mrOk; +} +//--------------------------------------------------------------------------- + +void __fastcall TManageSongForm::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) +{ + switch( Key ){ + case VK_RETURN: + return GoManageClick(NULL); + break; + + case VK_ESCAPE: + ModalResult = mrCancel; + break; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TManageSongForm::FormDestroy(TObject *Sender) +{ + if( QRPanel ){ + delete QRPanel; + QRPanel = NULL; + } + + if( m_pQRdata ){ + delete[] m_pQRdata; + m_pQRdata = NULL; + } +} +//--------------------------------------------------------------------------- + diff --git a/ManageSongFormUnit.dfm b/ManageSongFormUnit.dfm new file mode 100644 index 0000000..638b711 --- /dev/null +++ b/ManageSongFormUnit.dfm @@ -0,0 +1,186 @@ +object ManageSongForm: TManageSongForm + Left = 0 + Top = 0 + BorderStyle = bsNone + Caption = 'UpdateStyleForm' + ClientHeight = 135 + ClientWidth = 300 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + KeyPreview = True + Position = poMainFormCenter + Scaled = False + OnDestroy = FormDestroy + OnKeyDown = FormKeyDown + TextHeight = 13 + object m_pGenenalBKG: TGeneralDialogPanel + Left = 0 + Top = 0 + Width = 300 + Height = 135 + Caption = #27468#26354#19978#20256 + Color = 5064257 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentBackground = False + ParentFont = False + TabOrder = 0 + object m_ImgFlag: TImage + Left = 1 + Top = 1 + Width = 28 + Height = 28 + AutoSize = True + Picture.Data = { + 0954506E67496D61676589504E470D0A1A0A0000000D494844520000001C0000 + 001C0806000000720DDF94000000097048597300000B1300000B1301009A9C18 + 00000A4D6943435050686F746F73686F70204943432070726F66696C65000078 + DA9D53775893F7163EDFF7650F5642D8F0B1976C81002223AC08C81059A21092 + 006184101240C585880A561415119C4855C482D50A489D88E2A028B867418A88 + 5A8B555C38EE1FDCA7B57D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691 + E6A26A003952853C3AD81F8F4F48C4C9BD80021548E0042010E6CBC26705C500 + 00F00379787E74B03FFC01AF6F00020070D52E2412C7E1FF83BA502657002091 + 00E02212E70B01905200C82E54C81400C81800B053B3640A009400006C797C42 + 2200AA0D00ECF4493E0500D8A993DC1700D8A21CA908008D0100992847240240 + BB00605581522C02C0C200A0AC40222E04C0AE018059B632470280BD0500768E + 58900F4060008099422CCC0020380200431E13CD03204C03A030D2BFE0A95F70 + 85B8480100C0CB95CD974BD23314B895D01A77F2F0E0E221E2C26CB142611729 + 106609E4229C979B231348E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666 + E76CEFF4C5A2FE6BF06F223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370 + C701B075BF6BA95B00DA560068DFF95D33DB09A05A0AD07AF98B7938FC401E9E + A150C83C1D1C0A0B0BED2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7A + F000719A4099ADC0A383FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD + 8E29D1E234B15C2C158AF15889B850224DC779B952914421C995E212E97F32F1 + 1F96FD0993770D00AC864FC04EB607B5CB6CC07EEE01028B0E58D27600407EF3 + 2D8C1A0B91001067343279F7000093BFF98F402B0100CD97A4E30000BCE8185C + A894174CC608000044A0812AB041070CC114ACC00E9CC11DBCC0170261064440 + 0C24C03C104206E4801C0AA11896411954C03AD804B5B0031AA0119AE110B4C1 + 31380DE7E0125C81EB70170660189EC218BC86090441C8081361213A8811628E + D822CE0817998E04226148349280A420E988145122C5C872A402A9426A915D48 + 23F22D7214398D5C40FA90DBC820328AFC8ABC47319481B25103D4027540B9A8 + 1F1A8AC6A073D174340F5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A + 8E6380D1310E668CD9615C8C87456089581A26C71663E55835568F35631D5837 + 76151BC09E61EF0824028B8013EC085E8410C26C82909047584C5843A825EC23 + B412BA085709838431C2272293A84FB4257A12F9C478623AB1905846AC26EE21 + 1E219E255E270E135F9348240EC992E44E0A21259032490B496B48DB482DA453 + A43ED210699C4C26EB906DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7 + 143AC588E24C09A22452A494124A35653FE504A59F324299A0AA51CDA99ED408 + AA883A9F5A496DA076502F5387A91334759A25CD9B1643CBA42DA3D5D09A6967 + 69F7682FE974BA09DD831E4597D097D26BE807E9E7E983F4770C0D860D83C748 + 6228196B197B19A718B7192F994CA605D39799C85430D7321B9967980F986F55 + 582AF62A7C1591CA12953A9556957E95E7AA545573553FD579AA0B54AB550FAB + 5E567DA64655B350E3A909D416ABD5A91D55BBA936AECE5277528F50CF515FA3 + BE5FFD82FA630DB2868546A08648A35463B7C6198D2116C63265F15842D67256 + 03EB2C6B984D625BB2F9EC4C7605FB1B762F7B4C534373AA66AC6691669DE671 + CD010EC6B1E0F039D99C4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA + 7ADABEDA62ED72ED16EDEBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA + 85BADB75CFEA3ED363EB79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD1 + 1F373034083690196C313863F0CC9063E86B9869B8D1F084E1A811CB68BA91C4 + 68A3D149A327B826EE8767E33578173E66AC6F1C62AC34DE65DC6B3C61626932 + DBA4C4A4C5E4BE29CD946B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C + 6B9E61BED9BCDBFC8D85A5459CC54A8B368BC796DA967CCB05964D96F7AC9856 + 3E567956F556D7AC49D65CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BAD + C4769B6DDF14E2148F29D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F6 + 6DF6CF1DCC1C121DD63B743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957 + 671B67A1739DF33517A64B90CB1297769717536DA78AA76E9F7ACB95E51AEEBA + D2B5D3F5A39BBB9BDCADD96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0 + F758E271CCE39DA79BA7C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8 + DBC45BE0BDCB7B603A3E3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE23 + 7ED67E997E07FC9EFB3BFACBFD8FF8BFE179F216F14E056001C101E501BD811A + 81B3036B031F049904A50735058D05BB062F0C3E15420C090D591F72936FC017 + F21BF96333DC672C9AD115CA089D155A1BFA30CC264C1ED6118E86CF08DF107E + 6FA6F94CE9CCB60888E0476C88B81F69199917F97D14292A32AA2EEA51B45374 + 7174F72CD6ACE459FB67BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9B + B880B8AAB8817887F845F1971274132409ED89E4C4D8C43D89E37302E76C9A33 + 9CE49A54967463AEE5DCA2B917E6E9CECB9E773C593559907C3885981297B23F + E5832042502F184FE5A76E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E6 + 9D5695F638DD3B7D43FA68864F4675C633094F522B79911992B923F34D5644D6 + DEACCFD971D92D39949C949CA3520D6996B42BD730B728B74F662B2B930DE479 + E66DCA1B9387CAF7E423F973F3DB156C854CD1A3B452AE500E164C2FA82B785B + 185B78B848BD485AD433DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1 + E022BF45BB16238B5317772E315D52BA647869F0D27DCB68CBB296FD50E25852 + 55F26A79DCF28E5283D2A5A5432B82573495A994C9CB6EAEF45AB96315619564 + 55EF6A97D55B567F2A17955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDA + DADE4AB7CAEDEB48EBA4EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B + 5F6D4ADE74A17A6AF58ECDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D + 7F5DCB56FDADABB7BED926DAD6BFDD777BF30E831D153BDEEF94ECBCB52B7857 + 6BBD457DF56ED2EE82DD8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645 + EFEB6A746F6CDCAFBFBFB2096D52368D1E483A70E59B806FDA9BED9A77B5705A + 2A0EC241E5C127DFA67C7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23A + BF75AC2DA36DA03DA1BDEFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F57 + 9EA09D283DF1F9E48293E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD + 6743CF9E3F1774EE4CB75FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE + 3D477E70FDE148AF5B6FEB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573 + D7F8D72E5D9F79BDEFC6EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D + 7A8F78AFFCBEDAFDEA07FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09 + 879EFE94FFD387E1D247CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2 + A713CFCA7E56FF79EB73ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372 + EFABA9AF3AC723C71FBCCE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40 + FE50F3D1FA63C7A7D04FF73EE77CFEFC2FF784F3FB25D29F33000002A2494441 + 5478DAB5966D48536114C7CF6A4E178B0D416B9283C8704861D1CB971223308B + 46041946102408658405FB14F529A2FA10D10B0845E1100CA28822C330E88506 + 5114B3342814C3953109A3D5B25ACDDBFF7877E3DEEDBE3CDBF20F7FB83BF739 + CFEFEEB9E779EEB155D7D49280AAE126B80176C1CBD2F17E3801DF83AFBF79DD + FFD66A229B0570237C0C5E21F254D00BF808C07773053AE14BF04E4150A6AEC2 + 2D00FF1001FAE06BF0EA3C618A06E000A05133A01B7E0C2F2D10A668185E0968 + 5C0F381BBE016FD1CB9C723A28D1B8242B3E6B3249AEBE41332817D426405399 + C036B8C328EBCF3C37456FB667C5EDE371F26D3D67F54F5B01BCAC0672918CC0 + F367083806FB014D28C0DD70A759468140D61E002F2AC01E78F30C03C300D631 + 908BE55B7A590D2515DBE9DDC34359F1A2E8045536779080784F7A1858858B21 + 918CD1DE20A53C733431E7B311F21EE81649672D67E05A92F79EA5C63A5BE997 + DFAB89CDBD1DA1B2E33DA2C00D0CE403B94F64F4F8C9EDF4BDDEAF89955E7840 + 9E5058141860201F614F45464F1C6CA478B3F6C42B3F7A8B5CBDAF4481D34553 + CA73898C661843D5AAD8D74525915151E002655B7086CF6A342F272FAB5ABE6D + E7C9FEF18B082C866DE155805CD76D56195C305C38FF3425D1C27527C8F63B25 + 020C01D8A200F903FB5C745DF2541D8061F5E1CD95DA6096F1B3B632EB1DF296 + 700CC5AC6077000BF0851A580347608751D6E49AC5143BB54313ABD81BA29297 + EFCD604992BF89039940D62EB8EB3F03A70F6DE5875E8BC14DD361DD475D544E + 5F9B566962EEEE2754F4E1B311EC34604175C0A889DA0F9F21B90BC8475CB641 + C0CE66DE306B13EB49EEDCAA72840DA797F1BEDE4DABBE940B885B457EB7EB2D + 408FE02B24EFB7A4D1202BA05A6564D27903F24964129B244939AE5861FA0B36 + 05EEF82A32C1E10000000049454E44AE426082} + end + object m_lbGoManage: TLabel + Left = 112 + Top = 97 + Width = 72 + Height = 14 + Alignment = taCenter + AutoSize = False + Caption = #31435#21363#21069#24448 + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlue + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [fsUnderline] + ParentFont = False + OnClick = GoManageClick + OnMouseEnter = GoManageMouseEnter + OnMouseLeave = GoManageMouseLeave + end + object m_lbMsg: TLabel + Left = 29 + Top = 43 + Width = 242 + Height = 40 + Alignment = taCenter + AutoSize = False + Caption = #27468#26354#19978#20256#32467#26524 + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + Layout = tlCenter + WordWrap = True + end + end +end diff --git a/ManageSongFormUnit.h b/ManageSongFormUnit.h new file mode 100644 index 0000000..b0a8dac --- /dev/null +++ b/ManageSongFormUnit.h @@ -0,0 +1,40 @@ +//--------------------------------------------------------------------------- + +#ifndef ManageSongFormUnitH +#define ManageSongFormUnitH +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include +#include +#include +#include "PNGButton.hpp" +#include "GeneralDialogPanel.h" +#include "TextButton.h" +//--------------------------------------------------------------------------- +class TManageSongForm : public TForm +{ +__published: // IDE-managed Components + TImage *m_ImgFlag; + TLabel *m_lbMsg; + TLabel *m_lbGoManage; + TGeneralDialogPanel *m_pGenenalBKG; + void __fastcall GoManageMouseEnter(TObject *Sender); + void __fastcall GoManageMouseLeave(TObject *Sender); + void __fastcall GoManageClick(TObject *Sender); + void __fastcall FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift); + void __fastcall FormDestroy(TObject *Sender); +private: + unsigned char * m_pQRdata; + String m_strGo; +public: // User declarations + __fastcall TManageSongForm(TComponent* Owner, bool bUpload, UINT idSong=0 ); + + void SetMessage(String strMsg); +}; +//--------------------------------------------------------------------------- +extern PACKAGE TManageSongForm *ManageSongForm; +//--------------------------------------------------------------------------- +#endif diff --git a/MenuBar.cpp b/MenuBar.cpp new file mode 100644 index 0000000..ad73245 --- /dev/null +++ b/MenuBar.cpp @@ -0,0 +1,281 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop + +#include "MessageDef.h" +#include "MenuBar.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) + +#define STATE_NOR 0 +#define STATE_HOT 1 +#define STATE_DOWN 2 + +#define CLR_NOR RGB( 74, 80, 88 ) +#define CLR_HOT RGB( 87, 94, 104 ) +#define CLR_DOWN RGB( 39, 42, 47 ) +#define CLR_BOARD_OUT RGB( 100, 108, 119 ) +#define CLR_BOARD_IN RGB( 44, 46, 48 ) +#define CLR_BOARD_FILL RGB( 70, 73, 76 ) + +#define OFFSET_X 10 +#define OFFSET_Y 3 + +int u_Height = 0; + +//--------------------------------------------------------------------------- +// TTextMenu +__fastcall TTextMenu::TTextMenu( String caption, String shortcut, int type ) +{ + m_strCaption = caption; + m_strShortCut = shortcut; + iType = type; + iState = STATE_NOR; +} +//--------------------------------------------------------------------------- + +void __fastcall TTextMenu::ShowMenu( bool bShow ) +{ + TMessage msg; + msg.WParamLo = iType; + msg.WParamHi = bShow; + msg.LParamLo = Left; + msg.LParamHi = MENUBAR_TOP+u_Height; + + Application->MainForm->Perform( UM_SHOWMENU, msg.WParam, msg.LParam ); +} +//--------------------------------------------------------------------------- + +void __fastcall TTextMenu::Draw( TCanvas* pCanvas ) +{ + TColor clrOldPen = pCanvas->Pen->Color, + clrOldBrush = pCanvas->Brush->Color; + + //ˢ± + TRect rect( Left+1, MENUBAR_TOP+1, Left+Width, MENUBAR_TOP+u_Height ); + pCanvas->Brush->Color = iState==STATE_HOT ? CLR_HOT : + (iState==STATE_DOWN ? CLR_DOWN : CLR_NOR ); + pCanvas->FillRect( rect ); + + if( iState!=STATE_NOR ){ + //ڱ߿ + TRect rtFrame( Left+1, MENUBAR_TOP+1, Left+Width, MENUBAR_TOP+u_Height ); + pCanvas->Brush->Color = CLR_BOARD_IN; + pCanvas->FrameRect( rtFrame ); + + pCanvas->Pixels[Left+1][MENUBAR_TOP+1] = CLR_BOARD_FILL; + pCanvas->Pixels[Left+Width-1][MENUBAR_TOP+1] = CLR_BOARD_FILL; + pCanvas->Pixels[Left+Width-1][MENUBAR_TOP+u_Height-1] = CLR_BOARD_FILL; + pCanvas->Pixels[Left+1][MENUBAR_TOP+u_Height-1] = CLR_BOARD_FILL; + + pCanvas->Pen->Color = CLR_BOARD_OUT; + pCanvas->Font->Color = CLR_TEXT_HOT; + } + else{ + pCanvas->Pen->Color = CLR_NOR; + pCanvas->Font->Color = CLR_TEXT_NOR; + } + + //߿ + //ϱ + pCanvas->MoveTo( Left+3, MENUBAR_TOP ); + pCanvas->LineTo( Left+Width-2, MENUBAR_TOP ); + // + pCanvas->MoveTo( Left, MENUBAR_TOP+3 ); + pCanvas->LineTo( Left, MENUBAR_TOP+u_Height-2 ); + //± + pCanvas->MoveTo( Left+3, MENUBAR_TOP+u_Height ); + pCanvas->LineTo( Left+Width-2, MENUBAR_TOP+u_Height ); + //ұ + pCanvas->MoveTo( Left+Width, MENUBAR_TOP+3 ); + pCanvas->LineTo( Left+Width, MENUBAR_TOP+u_Height-2 ); + + pCanvas->Pen->Color = clrOldPen; + pCanvas->Brush->Color = clrOldBrush; + + TBrushStyle oldBS = pCanvas->Brush->Style; + pCanvas->Brush->Style = bsClear; + // +// String strText = m_strCaption; + String strText = m_strCaption + "(" + m_strShortCut + ")"; + int txtLeft = Left + OFFSET_X, + txtTop = MENUBAR_TOP + OFFSET_Y; + + pCanvas->TextOut( txtLeft, txtTop, strText ); + + pCanvas->Brush->Style = oldBS; +} +//--------------------------------------------------------------------------- + +void __fastcall TTextMenu::Invalidate() +{ + TRect rect( Left, MENUBAR_TOP, Left+Width, MENUBAR_TOP+u_Height ); + InvalidateRect( Application->MainForm->Handle, &rect, false ); +} + +//--------------------------------------------------------------------------- +// TMenuBar +__fastcall TMenuBar::TMenuBar( TComponent* Owner,TCanvas* pCanvas ) +{ + m_pCanvas = pCanvas; + m_nMenuCount = 0; + Width = 0; + m_bMenuShow = false; + m_iSelMenu = -1; + +} +//--------------------------------------------------------------------------- + +__fastcall TMenuBar::~TMenuBar() +{ + while( m_nMenuCount>0 ){ + delete m_aTextMenu[--m_nMenuCount]; + } +} +//--------------------------------------------------------------------------- + +int TMenuBar::GetHeight() +{ + return u_Height; +} +//--------------------------------------------------------------------------- + +void TMenuBar::AddMenu( String caption, String shortcut, int iType ) +{ + String strText = caption; + strText += "(" + shortcut + ")"; + + TSize size = m_pCanvas->TextExtent( strText ); + int w = size.Width + OFFSET_X * 2, + h = size.Height + OFFSET_Y * 2; + + m_aTextMenu[m_nMenuCount] = new TTextMenu( caption, shortcut, iType ); + m_aTextMenu[m_nMenuCount]->Left = MENUBAR_LEFT + Width; + m_aTextMenu[m_nMenuCount]->Width = w; + + if( u_HeightWidth + 2; + + m_nMenuCount++; +} +//--------------------------------------------------------------------------- + +bool __fastcall TMenuBar::HitTest( int XPos, int YPos, bool bLBDown ) +{ + bool bHit(false), bRet(false); + + if( YPos > MENUBAR_TOP && YPos < MENUBAR_TOP + u_Height + && XPos > MENUBAR_LEFT && XPos < MENUBAR_LEFT + Width + OFFSET_BR + 3 ){ + for( int i=0; iLeft + m_aTextMenu[i]->Width + && XPos > m_aTextMenu[i]->Left ){ + if( bLBDown ){ + m_bMenuShow = !m_bMenuShow; + } + + if( m_bMenuShow ){ + if( m_aTextMenu[i]->iState!=STATE_DOWN ){ + m_aTextMenu[i]->iState = STATE_DOWN; + m_aTextMenu[i]->Draw( m_pCanvas ); + + m_aTextMenu[i]->ShowMenu( true ); + } + } + else if( m_aTextMenu[i]->iState!=STATE_HOT ){ + if( m_aTextMenu[i]->iState==STATE_DOWN ){ + m_aTextMenu[m_iSelMenu]->ShowMenu( false ); + } + + m_aTextMenu[i]->iState = STATE_HOT; + m_aTextMenu[i]->Draw( m_pCanvas ); + } + + if( m_iSelMenu!=i ){ + if( m_iSelMenu>=0 ){ + m_aTextMenu[m_iSelMenu]->iState = STATE_NOR; + m_aTextMenu[m_iSelMenu]->Draw( m_pCanvas ); + + m_aTextMenu[m_iSelMenu]->ShowMenu( false ); + } + m_iSelMenu = i; + } + + bHit = true; + + break; + } + } + + bRet = true; + } + + if( !bHit && m_iSelMenu>=0 && ( !m_bMenuShow || bLBDown ) ){ + m_aTextMenu[m_iSelMenu]->iState = STATE_NOR; + m_aTextMenu[m_iSelMenu]->Draw( m_pCanvas ); + + m_aTextMenu[m_iSelMenu]->ShowMenu( false ); + + m_iSelMenu = -1; + + if( m_bMenuShow ) + m_bMenuShow = false; + } + + return bRet; +} +//--------------------------------------------------------------------------- + +void __fastcall TMenuBar::DrawMenuBar() +{ + for( int i=0; iDraw( m_pCanvas ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMenuBar::Reset() +{ + if( m_iSelMenu>=0 && m_bMenuShow ){ + m_aTextMenu[m_iSelMenu]->iState = STATE_NOR; + m_aTextMenu[m_iSelMenu]->Draw( m_pCanvas ); + + m_aTextMenu[m_iSelMenu]->ShowMenu( false ); + + m_iSelMenu = -1; + m_bMenuShow = false; + } +} +//--------------------------------------------------------------------------- + +void TMenuBar::ShowMenu( int iType ) +{ + TPoint point; + GetCursorPos( &point ); + point = Application->MainForm->ScreenToClient( point ); + + if( m_bMenuShow && point.Y > MENUBAR_TOP && point.Y < MENUBAR_TOP + u_Height + && point.X > MENUBAR_LEFT && point.X < MENUBAR_LEFT + Width + OFFSET_BR + 3 ){ + return; + } + + for( int i=0; iiType==iType ){ + if( m_aTextMenu[i]->iState!=STATE_DOWN ){ + m_aTextMenu[i]->iState = STATE_DOWN; + m_aTextMenu[i]->Draw( m_pCanvas ); + m_aTextMenu[i]->ShowMenu( true ); + + m_iSelMenu = i; + m_bMenuShow = true; + } + } + else{ + if( m_aTextMenu[i]->iState==STATE_DOWN ){ + m_aTextMenu[i]->iState = STATE_NOR; + m_aTextMenu[i]->Draw( m_pCanvas ); + } + } + } +} +//--------------------------------------------------------------------------- + diff --git a/MenuBar.h b/MenuBar.h new file mode 100644 index 0000000..2a6686b --- /dev/null +++ b/MenuBar.h @@ -0,0 +1,62 @@ +//--------------------------------------------------------------------------- + +#ifndef MenuBarH +#define MenuBarH + +#define MENU_POP 0 +#define MENU_FILE 1 +#define MENU_EDIT 2 +#define MENU_VIEW 3 +#define MENU_TRACK 4 +#define MENU_TOOL 5 +#define MENU_HELP 6 +#define SYS_MENU_NUM 6 + +#define MENUBAR_LEFT 50 +#define MENUBAR_TOP 4 +#define OFFSET_BR 12 + +#define CLR_TEXT_NOR RGB( 156, 170, 189 ) +#define CLR_TEXT_HOT RGB( 201, 214, 229 ) + +#include +//--------------------------------------------------------------------------- +class TTextMenu +{ +private: + String m_strCaption, m_strShortCut; +public: + int Left, Width, iState, iType; + + __fastcall TTextMenu( String caption, String shortcut, int type ); + + void __fastcall Draw( TCanvas* pCanvas ); + void __fastcall ShowMenu( bool bShow ); + void __fastcall Invalidate(); +}; + +class TMenuBar +{ +private: + TTextMenu* m_aTextMenu[SYS_MENU_NUM]; + TCanvas* m_pCanvas; + + int m_nMenuCount; + bool m_bMenuShow; + int m_iSelMenu; +public: + int Width; + + __fastcall TMenuBar( TComponent* Owner,TCanvas* pCanvas ); + __fastcall ~TMenuBar(); + + void AddMenu( String caption, String shortcut, int iType ); + bool __fastcall HitTest( int XPos, int YPos, bool bLBDown=false ); + void __fastcall DrawMenuBar(); + void __fastcall Reset(); + + int GetHeight(); + void ShowMenu( int iType ); +}; +//--------------------------------------------------------------------------- +#endif diff --git a/MenuUnit.cpp b/MenuUnit.cpp new file mode 100644 index 0000000..24d66f3 --- /dev/null +++ b/MenuUnit.cpp @@ -0,0 +1,1107 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop + +#include "MenuUnit.h" +#include "MessageDef.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#include "GlobalUnit.h" +//--------------------------------------------------------------------------- +#define CLR_BORDER RGB( 100, 108, 119 ) +#define CLR_BORDER_HOT RGB( 30, 32, 36 ) +#define CLR_BKGRND_NOR RGB( 39, 42, 47 ) +#define CLR_BKGRND_HOT RGB( 67, 73, 80 ) +#define CLR_TXT_NOR RGB( 213, 221, 232 ) +#define CLR_TXT_DISABLE RGB( 100, 108, 119 ) +#define CLR_BREAK RGB( 100, 108, 119 ) +#define CLR_BOARD_FILL RGB( 76, 82, 91 ) + +#define WIDTH_MIN 65 +#define WIDTH_MAX 525 + +#define TOP_HEIGHT 5 +#define HEIGHT_BREAK 5 +#define IMG_WIDTH 32 +#define TRI_WIDTH 16 +#define OFFSET_X 6 +#define OFFSET_Y 5 +#define OFFSET_SEL 3 +//--------------------------------------------------------------------------- + +String __fastcall CutDirString(TCanvas *ACanvas, String strDir, int nWidth) +{ + String str = strDir; + AnsiString strText; + + if( ACanvas->TextWidth( str ) > nWidth ){ // + strText = str.SubString(1, 3); + nWidth -= ACanvas->TextWidth(strText); + + //-----------------ȡļļ----------------------------- + int istart=1,iend=1; + UnicodeString strShorty = str.SubString(4, str.Length()); + System::DynamicArray DStr; + + for( int i=1;i<=strShorty.Length();i++ ){ + if( strShorty[i]== '\\' ){ + iend = i; + DStr.Length++; + DStr[DStr.Length-1] = strShorty.SubString(istart,iend-istart); + istart = iend+1; + } + } + DStr.Length++; + DStr[DStr.Length-1] = strShorty.SubString(istart,str.Length()-istart); + + // C:/ + ļ C:/ + ... + ļ + if( ACanvas->TextWidth( strText+DStr[DStr.Length-1] ) > nWidth + ||( DStr.Length>1 && ACanvas->TextWidth( strText+"...\\"+DStr[DStr.Length-1] )>nWidth ) ) + { + strText = strText + "..."; + + while( ACanvas->TextWidth( strShorty )>nWidth ){ + strShorty = strShorty.SubString( 2, strShorty.Length() ); + } + strText += strShorty; + } + else{ + struct Pos{ + int id; + int Length; + }; + Pos temPos[20]; //*********ʾ֧ļ + for( int i=0;iTextWidth( DStr[i] ); + } + + for( int i=0;itemPos[j].Length ){ + Pos temp = temPos[i]; + temPos[i] = temPos[j]; + temPos[j] = temp; + } + } + } + + int iPos=0; + AnsiString temstrText = str; + while( ACanvas->TextWidth(temstrText)>nWidth ){ + if(iPos>DStr.Length-2) + break; + temstrText = strText; + + if(ACanvas->TextWidth(DStr[temPos[iPos].id])>ACanvas->TextWidth(DStr[temPos[iPos].id].SubString( 1,2 ) + "...")) + DStr[temPos[iPos].id] = DStr[temPos[iPos].id].SubString( 1,2 ) + "..."; + iPos++; + + for( int i=0;iTextWidth(temstrText)>nWidth ){ + if(iPos>DStr.Length-2) + break; + temstrText = strText; + + if(iPos==0 ) + DStr[iPos] = "..."; + else + DStr[iPos] = ""; + iPos++; + + for( int i=0;iAssign(pPic); + } + + FSubItems = new System::Classes::TList(); + Parent = NULL; + + FEnabled = true; + FSelected = false; + FBreak = !Caption.Compare("-"); + FMenuID = idMenu; +} +//--------------------------------------------------------------------------- + +__fastcall CMenuItem::~CMenuItem() +{ + ClearSubItems(); + SAFE_DELETE(FSubItems); + SAFE_DELETE(FIcon) +} +//--------------------------------------------------------------------------- + +void __fastcall CMenuItem::AddItem( CMenuItem *Item ) +{ + FSubItems->Add( Item ); + Item->Parent = this; +// HasSubItem = true; +// FCaption-> +} +//--------------------------------------------------------------------------- + +void __fastcall CMenuItem::ClearSubItems() +{ + for( int i=0; iCount; i++ ){ + CMenuItem *pItem = (CMenuItem *)FSubItems->Items[i]; + SAFE_DELETE(pItem) + } + FSubItems->Clear(); +} +//--------------------------------------------------------------------------- + +CMenuItem* __fastcall CMenuItem::AppendMenu( String strCaption, String strHotkey, + TNotifyEvent aClickEvent, int idMenu, TPngImage *pPic ) +{ + CMenuItem * pItem = new CMenuItem(strCaption, strHotkey, aClickEvent, idMenu, pPic); + pItem->OnDrawItem = FDrawItem; + + FSubItems->Add( pItem ); + + return pItem; +} +//--------------------------------------------------------------------------- + +void __fastcall CMenuItem::CreateSubMenu( TMenuPanel* pSubMenu ) +{ + for( int i=0; iCount; i++ ) + ((CMenuItem*)FSubItems->Items[i])->Selected = false; + + pSubMenu->SetMenuItems( FSubItems ); +} +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* * * * * * * * * * * * * * * * * *TMenuPanel * * * * * * * * * * * * * * * * * +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +//--------------------------------------------------------------------------- + +#define STATE_NONE -1 +#define STATE_NORMAL 0 +#define STATE_HOVER 1 +#define STATE_DOWN 2 +#define STATE_DISABLE 3 + +TPngImage *u_imgSubMenu = NULL, + *u_imgUp = NULL, + *u_imgDown = NULL; +TApplicationEvents *u_AppEvent = NULL; +TTimer *u_pTimer = NULL; //Զʱ + + +__fastcall TMenuPanel::TMenuPanel(TComponent* Owner, int iType ) +: Vcl::Extctrls::TPanel(Owner) +{ + Visible = false; + + m_iType = iType; + Width = 90; + Height = 2*TOP_HEIGHT; + + m_Items = NULL; + m_ItemHeight = 20; + m_iSelected = -1; + m_iFirst = 0; + m_iUpState = m_iDownState = STATE_NONE; + + m_SubMenu = m_SupMenu = NULL; +// m_AppEvent = NULL; +// m_pTimer = NULL; +} +//--------------------------------------------------------------------------- + +__fastcall TMenuPanel::~TMenuPanel() +{ + ClearAll(); + + if( m_iType==0 ) + ReleaseCapture(); + + if( !m_SupMenu ) + SAFE_DELETE(m_Items); + + if( u_AppEvent ) + u_AppEvent->OnMessage = NULL; +} +//--------------------------------------------------------------------------- + +void TMenuPanel::LoadResources() +{ + if( !u_imgSubMenu ){ + u_imgSubMenu = new TPngImage(); + u_imgSubMenu->LoadFromResourceName(int(HInstance), L"ImgSubMenu"); + } + + if( !u_imgUp ){ + u_imgUp = new TPngImage(); + u_imgUp->LoadFromResourceName(int(HInstance), L"ImgUpMenu"); + } + + if( !u_imgDown ){ + u_imgDown = new TPngImage(); + u_imgDown->LoadFromResourceName(int(HInstance), L"ImgDownMenu"); + } + + u_AppEvent = new TApplicationEvents(Application->MainForm); +} +//--------------------------------------------------------------------------- + +void TMenuPanel::FreeResources() +{ + SAFE_DELETE( u_imgSubMenu ); + SAFE_DELETE( u_imgUp ); + SAFE_DELETE( u_imgDown ); + + SAFE_DELETE( u_AppEvent ); + SAFE_DELETE( u_pTimer ); +} +//--------------------------------------------------------------------------- + +void __fastcall TMenuPanel::ClearAll() +{ + m_ItemHeight = 20; + m_iSelected = -1; + m_iFirst = 0; + m_iUpState = m_iDownState = STATE_NONE; + + if( !m_SupMenu && m_Items ){ + for( int i=0; iCount; i++ ){ + CMenuItem *pItem = (CMenuItem *)m_Items->Items[i]; + SAFE_DELETE(pItem) + } + m_Items->Clear(); + } + + SAFE_DELETE(m_SubMenu) +} +//--------------------------------------------------------------------------- + +CMenuItem* __fastcall TMenuPanel::CreateMenu( String strCaption, String strHotkey, + TNotifyEvent aClickEvent, int idMenu, TPngImage *pPic ) +{ + CMenuItem * pItem = new CMenuItem(strCaption, strHotkey, aClickEvent, idMenu, pPic); + pItem->OnDrawItem = DrawItem; + + if( !m_Items ) + m_Items = new System::Classes::TList(); + + m_Items->Add( pItem ); + + return pItem; +} +//--------------------------------------------------------------------------- + +void __fastcall TMenuPanel::ShowSubMenu(CMenuItem *pItem, int iTop) +{ + if( !m_SubMenu ){ + m_SubMenu = new TMenuPanel( NULL, m_iType ); + + m_SubMenu->Parent = Parent; + m_SubMenu->m_SupMenu = this; + + pItem->CreateSubMenu( m_SubMenu ); + } + + TPoint pt(Left+Width, Top+iTop); + + if( m_iType==0 ) + pt = Parent->ScreenToClient(pt); + + m_SubMenu->Show( pt.x, pt.y ); +// m_SubMenu->Repaint(); +} +//--------------------------------------------------------------------------- + +void __fastcall TMenuPanel::Show( int X, int Y ) +{ + CalRect(X, Y); + u_AppEvent->OnMessage = DoHandleMessage; + + Extctrls::TPanel::Show(); + + if( m_iType==0 ) + SetCapture(Handle); + +// Repaint(); + Update(); +} +//--------------------------------------------------------------------------- + +void __fastcall TMenuPanel::CalRect(int X, int Y) +{ + RECT rc; + if( m_iType==0 ) + SystemParametersInfo( SPI_GETWORKAREA, 0, &rc, 0 ); + else{ + rc.left = Application->MainForm->Left; + rc.top = Application->MainForm->Top; + rc.right = rc.left + Application->MainForm->Width; + rc.bottom = rc.top + Application->MainForm->Height; + } + + int maxHeight = rc.bottom - rc.top - 27, + wid = WIDTH_MIN, + hei = TOP_HEIGHT*2; + + for( int i=0; iCount; i++ ){ + CMenuItem *pItem = (CMenuItem *)(m_Items->Items[i]); + + if( pItem->Break ){ + hei += HEIGHT_BREAK; + } + else { + String strText = pItem->Caption; + strText += pItem->Hotkey; + + TSize size = Canvas->TextExtent( strText ); + int w = size.Width + OFFSET_X * 2 + OFFSET_SEL * 2 + 12, + h = size.Height + OFFSET_Y * 2; + + if( m_iType!=0 ) + w += IMG_WIDTH; + if( pItem->Hotkey.Length()>0 ) + w += 30; + if( pItem->HasSubItem() ) + w += TRI_WIDTH + 10; + + if( w > WIDTH_MAX ) w = WIDTH_MAX; + if( wid < w ) wid = w; + if( m_ItemHeight= maxHeight ){ + int board = ( TOP_HEIGHT + u_imgUp->Height ) * 2; +// hei = (maxHeight - board) / m_ItemHeight * m_ItemHeight + board; + hei = maxHeight; + + m_iUpState = STATE_DISABLE; + m_iDownState = STATE_NORMAL; + + break; + } + } + + Width = wid; + Height = hei; + + TPoint point(X,Y); + point = Parent->ClientToScreen(point); + + if( point.X + Width > rc.right ){ + if( m_SupMenu ) + point.X = m_SupMenu->Left - Width; + else + point.X = rc.right - Width - 2; + } + + if( point.Y + Height > rc.bottom ){ + point.Y = rc.bottom - Height - 2; + } + + if( m_iType!=0 ) + point = Parent->ScreenToClient(point); + + Left = point.X; + Top = point.Y; +} +//--------------------------------------------------------------------------- + +void __fastcall TMenuPanel::DeleteMenuItem(int index) +{ + if( CLEAR_ALL==index ){ + ClearAll(); + } + else if( index>=0 && indexCount ){ + ((CMenuItem*)m_Items->Items[index])->ClearSubItems(); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMenuPanel::CreateWnd() +{ + Vcl::Extctrls::TPanel::CreateWnd(); + + Canvas->Font->Name = g_strTxtFontName; + Canvas->Font->Quality = TFontQuality::fqClearTypeNatural; + Canvas->Font->Size = g_szFont9; +// Canvas->Font->Color = CLR_TXT_NOR; +// Canvas->Font->Assign( Application->MainForm->Font ); +} +//--------------------------------------------------------------------------- + +void __fastcall TMenuPanel::CreateParams(TCreateParams &Params) +{ + TPanel::CreateParams(Params); + + if( m_iType==0 ) + Params.Style = WS_POPUP; +} +//--------------------------------------------------------------------------- + +void __fastcall TMenuPanel::CloseMenu() +{ + if( m_iType!=0 && Parent ) + PostMessage( Parent->Handle, UM_MENUCLOSE, NULL, NULL ); +} +//--------------------------------------------------------------------------- + +void __fastcall TMenuPanel::WMEraseBkgnd(Winapi::Messages::TWMEraseBkgnd &Message) +{ + TRect rect = GetClientRect(); + + TCanvas* tempCanvas = new TCanvas; + tempCanvas->Handle = Message.DC; + + //Ƶɫ + tempCanvas->Brush->Color = CLR_BKGRND_NOR; + tempCanvas->FillRect( rect ); + + //߿ + tempCanvas->Brush->Color = CLR_BORDER; + tempCanvas->FrameRect( rect ); + + tempCanvas->Pixels[0][0] = CLR_BOARD_FILL; + tempCanvas->Pixels[Width][0] = CLR_BOARD_FILL; + tempCanvas->Pixels[Width][Height] = CLR_BOARD_FILL; + tempCanvas->Pixels[0][Height] = CLR_BOARD_FILL; + + delete tempCanvas; + + Message.Result = true; +} +//--------------------------------------------------------------------------- + +void __fastcall TMenuPanel::Paint(void) +{ + int t = TOP_HEIGHT, + b = Height - TOP_HEIGHT, + h; + + if( m_iUpState!=STATE_NONE ){ //Ϸͷ + h = u_imgUp->Height; + + TRect rect( OFFSET_SEL, 0, Width-OFFSET_SEL, t+h ); + DrawUpDown( Canvas, rect, true ); + + t += h; + b -= h; + } + + bool bDisableDown = true; + for( int i=m_iFirst; iCount; i++ ){ + CMenuItem *pItem = (CMenuItem*)m_Items->Items[i]; + if( pItem->Break ) + h = HEIGHT_BREAK; + else + h = m_ItemHeight; + + if( t+h > b ){ + bDisableDown = false; + break; + } + + TRect rect( OFFSET_SEL, t, Width-OFFSET_SEL, t+h ); + if( pItem->OnDrawItem ) + pItem->OnDrawItem( pItem, Canvas, rect ); + + t += h; + } + + // + if( tPen->Color = CLR_BREAK; + Canvas->MoveTo( X, Y ); + + Y = b; + Canvas->LineTo( X, Y ); + } + + if( m_iDownState!=STATE_NONE ){ //¼ͷ + if( bDisableDown ) + m_iDownState = STATE_DISABLE; + + h = u_imgDown->Height; + + TRect rect( OFFSET_SEL, b, Width-OFFSET_SEL, Height ); + DrawUpDown( Canvas, rect, false ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMenuPanel::WMMouseMove(TWMMouse &Message) +{ + if( !Visible ) + return; + + TShiftState Shift(Message.Keys); + int t = TOP_HEIGHT, + b = Height - TOP_HEIGHT, + h; + + int iLastSel = m_iSelected; + + if( m_iUpState!=STATE_NONE ){ //Ϸͷ + h = u_imgUp->Height; + bool bRedraw = false; + + if( m_iUpState!=STATE_DISABLE ){ + if( Message.YPos > 0 && Message.YPos < t+h + && (Message.XPos >= 0 && Message.XPos <= Width ) ){ + if( Shift.Empty() && m_iUpState!=STATE_HOVER ){ + m_iUpState = STATE_HOVER; + bRedraw = true; + } + } + else{ + if( m_iUpState!=STATE_NORMAL ){ + m_iUpState = STATE_NORMAL; + bRedraw = true; + SAFE_DELETE(u_pTimer); + } + } + + if( bRedraw ){ + TRect rect( OFFSET_SEL, 0, Width-OFFSET_SEL, t+h ); + DrawUpDown( Canvas, rect, true ); + } + } + + t += h; + b -= h; + } + + for( int i=m_iFirst; iCount; i++ ) { + CMenuItem *pItem = (CMenuItem*)m_Items->Items[i]; + + if( pItem->Break ) + h = HEIGHT_BREAK; + else + h= m_ItemHeight; + + if( t+h<=b ){ + if( !pItem->Break ){ + if( Message.YPos > t && Message.YPos < t+h + && (Message.XPos >= 0 && Message.XPos <= Width ) ){ + if( !pItem->Selected ){ + SAFE_DELETE(m_SubMenu) //Ӳ˵ + + if( pItem->Enabled ){ + pItem->Selected = true; + + m_iSelected = i; + + TRect rect( OFFSET_SEL, t, Width-OFFSET_SEL, t+h ); + if( pItem->OnDrawItem ) + pItem->OnDrawItem( pItem, Canvas, rect ); + + if( pItem->HasSubItem() ) + ShowSubMenu(pItem, t); + } + else{ + m_iSelected = -1; + } + } + } + else if( iLastSel==i ){ + pItem->Selected = false; + + TRect rect( OFFSET_SEL, t, Width-OFFSET_SEL, t+h ); + if( pItem->OnDrawItem ) + pItem->OnDrawItem( pItem, Canvas, rect ); + + if( m_iSelected==i ) + m_iSelected = -1; + } + } + + t += h; + } + else{ + t = b; + break; + } + } + + if( m_iDownState!=STATE_NONE ){ //·ͷ + h = u_imgUp->Height + TOP_HEIGHT; + bool bRedraw = false; + + if( m_iDownState!=STATE_DISABLE ){ + if( Message.YPos > t && Message.YPos < t+h + && (Message.XPos >= 0 && Message.XPos <= Width ) ){ + if( Shift.Empty() && m_iDownState!=STATE_HOVER ){ + m_iDownState = STATE_HOVER; + bRedraw = true; + } + } + else{ + if( m_iDownState!=STATE_NORMAL ){ + m_iDownState = STATE_NORMAL; + bRedraw = true; + SAFE_DELETE(u_pTimer); + } + } + + if( bRedraw ){ + TRect rect( OFFSET_SEL, t, Width-OFFSET_SEL, t+h ); + DrawUpDown( Canvas, rect, false ); + } + } + } + + if( !m_SubMenu && u_AppEvent->OnMessage!=DoHandleMessage ) { + u_AppEvent->OnMessage = DoHandleMessage; + + if( m_iType==0 && GetCapture()!=Handle){ + SetCapture( Handle ); + } + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMenuPanel::CMMouseLeave(TMessage &Message) +{ + SAFE_DELETE( u_pTimer ); + + if( !Visible || m_SubMenu ) return; + + int t = TOP_HEIGHT, + b = Height - TOP_HEIGHT, + h; + + if( m_iUpState!=STATE_NONE ){ //Ϸͷ + h = u_imgUp->Height; + + if( m_iUpState==STATE_HOVER || m_iUpState==STATE_DOWN ){ + m_iUpState = STATE_NORMAL; + + TRect rect( OFFSET_SEL, 0, Width-OFFSET_SEL, t+h ); + DrawUpDown( Canvas, rect, true ); + + return; + } + + t += h; + b -= h; + } + + for( int i=m_iFirst; iCount; i++ ){ + CMenuItem *pItem = (CMenuItem*)m_Items->Items[i]; + + if( pItem->Break ) + h = HEIGHT_BREAK; + else + h = m_ItemHeight; + + if( t+h<=b ){ + if( pItem->Selected ){ + pItem->Selected = false; + if( m_iSelected==i ){ + m_iSelected = -1; + } + + TRect rect( OFFSET_SEL, t, Width-OFFSET_SEL, t+h ); + if( pItem->OnDrawItem ) + pItem->OnDrawItem( pItem, Canvas, rect ); + } + + t += h; + } + else{ + t = b; + break; + } + } + + if( m_iDownState!=STATE_NONE ){ //·ͷ + h = u_imgUp->Height + TOP_HEIGHT; + bool bRedraw = false; + + if( m_iDownState==STATE_HOVER || m_iDownState==STATE_DOWN ){ + m_iDownState = STATE_NORMAL; + + TRect rect( OFFSET_SEL, t, Width-OFFSET_SEL, t+h ); + DrawUpDown( Canvas, rect, false ); + } + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMenuPanel::MouseDown(System::Uitypes::TMouseButton Button, + System::Classes::TShiftState Shift, int X, int Y) +{ + if( !Visible ) + return; + + if( m_iSelected<0 ){ + if( Button==mbLeft && m_iUpState!=STATE_NONE && X>0 && XHeight; + bool bRedraw = false; + + if( m_iUpState==STATE_HOVER && Y>0 && YItems[m_iFirst])->Break ) + m_iFirst--; + + if( m_iDownState==STATE_DISABLE ) + m_iDownState = STATE_NORMAL; + + if( m_iFirst==0 ) + m_iUpState = STATE_DISABLE; + + bRedraw = true; + } + else if( m_iDownState==STATE_HOVER && YHeight - h ){ //· + m_iDownState = STATE_DOWN; + m_iFirst++; + if( ((CMenuItem*)m_Items->Items[m_iFirst])->Break ) + m_iFirst++; + + if( m_iUpState==STATE_DISABLE ){ + m_iUpState = STATE_NORMAL; + } + + bRedraw = true; + } + + if( bRedraw ){ + SAFE_DELETE( u_pTimer ); + + u_pTimer = new TTimer(this); + u_pTimer->OnTimer = TimerProc; + u_pTimer->Tag = m_iUpState==STATE_DOWN ? -1 : 1; + u_pTimer->Interval = 500; + u_pTimer->Enabled = true; + + InvalidateRgn( Handle, NULL, false ); + } + } + + return; + } + + CMenuItem *pItemSel = (CMenuItem*)m_Items->Items[m_iSelected]; + if( pItemSel->OnClick!=NULL && + !(pItemSel->HasSubItem()) && + !(pItemSel->Break) && + pItemSel->Enabled ) + { + HideAll(); + pItemSel->OnClick((TObject*)pItemSel->MenuID); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMenuPanel::MouseUp(System::Uitypes::TMouseButton Button, + System::Classes::TShiftState Shift, int X, int Y) +{ + SAFE_DELETE( u_pTimer ); + + if( !Visible ) + return; + + if( m_iSelected<0 ){ + int h = TOP_HEIGHT+u_imgUp->Height; + + if( m_iUpState==STATE_DOWN ){ + if( X>0 && X0 && Y0 && XHeight-h ) + m_iDownState = STATE_HOVER; + else + m_iDownState = STATE_NORMAL; + + TRect rect( OFFSET_SEL, Height-h, Width-OFFSET_SEL, Height ); + DrawUpDown( Canvas, rect, false ); + } + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMenuPanel::DoHandleMessage(MSG &Msg, bool &Handled) +{ + if( Visible ){ + if( Msg.message==WM_LBUTTONDOWN || Msg.message==WM_RBUTTONDOWN + || Msg.message==WM_NCLBUTTONDOWN || Msg.message==WM_NCRBUTTONDOWN ){ + TMenuPanel* pMenu = (TMenuPanel*)this; + + while( pMenu ){ + TPoint ptCusor = pMenu->ScreenToClient(TPoint(Msg.pt.x, Msg.pt.y)); + if( PtInRect( TRect(0, 0, pMenu->Width, pMenu->Height), ptCusor ) ) + return; + + pMenu = (TMenuPanel*)pMenu->m_SupMenu; + } + + m_iSelected = -1; + HideAll(); + } + else if( m_iType==0 && Msg.message==WM_MOUSEMOVE && Msg.wParam==0 ){ + TPoint ptCusor = ScreenToClient(TPoint(Msg.pt.x, Msg.pt.y)); + if( PtInRect( TRect(0, 0, Width, Height), ptCusor ) ) + return; + + TMenuPanel* pSup = (TMenuPanel*)m_SupMenu; + while( pSup ){ + ptCusor = pSup->ScreenToClient(TPoint(Msg.pt.x, Msg.pt.y)); + if( PtInRect( TRect(0, 0, pSup->Width, pSup->Height), ptCusor ) ){ + PostMessage( pSup->Handle, WM_MOUSEMOVE, 0, MAKELONG(ptCusor.x, ptCusor.y) ); + return; + } + + pSup = (TMenuPanel*)pSup->m_SupMenu; + } + } + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMenuPanel::HideAll() +{ + Hide(); + + u_AppEvent->OnMessage = NULL; + SAFE_DELETE(u_pTimer); + + if( m_iType==0 ) + ReleaseCapture(); + + TMenuPanel* pSup = (TMenuPanel*)m_SupMenu; + while( pSup ){ + pSup->Hide(); + pSup = (TMenuPanel*)pSup->m_SupMenu; + } + + CloseMenu(); +}//--------------------------------------------------------------------------- + +void __fastcall TMenuPanel::DrawItem( TObject *Sender, TCanvas* ACanvas, const TRect &ARect ) +{ + CMenuItem *pItem = (CMenuItem *)Sender; + bool bIsDrawImg = IsDrawImg(); + bool bIsDrawDir = pItem->IsDrawDir(); + + //Ƶɫ + ACanvas->Brush->Color = pItem->Selected ? CLR_BKGRND_HOT : CLR_BKGRND_NOR; + ACanvas->FillRect( ARect ); + + int X, Y; + + //ѡп + if( pItem->Selected ){ + ACanvas->Brush->Color = CLR_BORDER_HOT; + ACanvas->FrameRect( ARect ); + }// + else if( bIsDrawImg ) { + X = ARect.Left + IMG_WIDTH - 6; + Y = ARect.Top; + ACanvas->Pen->Color = CLR_BREAK; + ACanvas->MoveTo( X, Y ); + + Y = ARect.Top + ARect.Height(); + ACanvas->LineTo( X, Y ); + } + + //Ƽ + if( pItem->Break ){ + if( bIsDrawImg ) X = ARect.Left + IMG_WIDTH + OFFSET_X + 2; + else X = ARect.Left + OFFSET_X + 2; + Y = ARect.Top + ( ARect.Bottom - ARect.Top )/2; + ACanvas->Pen->Color = CLR_BREAK; + ACanvas->MoveTo( X, Y ); + + X = ARect.Left + ARect.Width()-2; + ACanvas->LineTo( X, Y ); + + return; + } + + //ͼ + if( bIsDrawImg && pItem->Icon ){ + TPngImage* pIcon = pItem->Icon; + + int w = pIcon->Width/2, + h = pIcon->Height, + l = pItem->Enabled ? 0 : w; + + X = ARect.Left + ( IMG_WIDTH - pIcon->Width / 2 ) / 2; + Y = ARect.Top + ( ARect.Height() - pIcon->Height ) / 2; + + HRGN rgnClip; + rgnClip = ::CreateRectRgn( X, Y, X+w, Y+h ); + ::SelectClipRgn( ACanvas->Handle, rgnClip ); + + ACanvas->Draw( X-l, Y, pIcon ); + + ::SelectClipRgn( ACanvas->Handle, NULL ); + ::DeleteObject(rgnClip); + } + + //Caption + ACanvas->Brush->Style = bsClear; + ACanvas->Font->Color = pItem->Enabled ? CLR_TXT_NOR : CLR_TXT_DISABLE; + if( bIsDrawImg ) X = ARect.Left + IMG_WIDTH + OFFSET_X; + else X = ARect.Left + OFFSET_X*2; + Y = ARect.Top + OFFSET_Y; + + //--------------------- + String strText = pItem->Caption; + int wHotKey = ACanvas->TextWidth( pItem->Hotkey ); + int nWidth = ARect.Width() - TRI_WIDTH - IMG_WIDTH - 2*OFFSET_X - wHotKey; + if( bIsDrawDir ) strText = CutDirString(ACanvas, strText, nWidth); + ACanvas->TextOut( X, Y, strText ); + + //Hotkey + if( wHotKey>0 ){ + X = ARect.Left + ARect.Width() - TRI_WIDTH - OFFSET_X - wHotKey; + ACanvas->TextOut( X, Y, pItem->Hotkey ); + } + + //Ӳ˵ʾ + if( pItem->HasSubItem() ){ + int w = u_imgSubMenu->Width/2, + h = u_imgSubMenu->Height, + l = pItem->Selected ? w : 0; + + X = ARect.Left + ARect.Width() - TRI_WIDTH; + Y = ARect.Top + (ARect.Height() - h) / 2; + + HRGN rgnClip; + rgnClip = ::CreateRectRgn( X, Y, X+w, Y+h ); + ::SelectClipRgn( ACanvas->Handle, rgnClip ); + + ACanvas->Draw( X-l, Y, u_imgSubMenu ); + + ::SelectClipRgn( ACanvas->Handle, NULL ); + ::DeleteObject(rgnClip); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMenuPanel::DrawUpDown( TCanvas* ACanvas, const TRect &ARect, bool bUp ) +{ + int s = bUp ? m_iUpState : m_iDownState, + w = u_imgUp->Width/4, + h = u_imgUp->Height, + l = w * s; + + int X = ARect.Left + ( ARect.Width() - w ) / 2, + Y = ARect.Top + (ARect.Height() - h) / 2 + ( bUp ? 1 : 2 ); + + HRGN rgnClip; + rgnClip = ::CreateRectRgn( X, Y, X+w, Y+h ); + ::SelectClipRgn( ACanvas->Handle, rgnClip ); + + ACanvas->Draw( X-l, Y, bUp ? u_imgUp : u_imgDown ); + + ::SelectClipRgn( ACanvas->Handle, NULL ); + ::DeleteObject(rgnClip); + + //߻ + X = ARect.left + 2; + Y = bUp ? ARect.bottom - 1 : ARect.top; + ACanvas->Pen->Color = CLR_BREAK; + ACanvas->MoveTo( X, Y ); + + X = ARect.right - 2; + ACanvas->LineTo( X, Y ); +} +//--------------------------------------------------------------------------- + +void __fastcall TMenuPanel::TimerProc(TObject* Sender) +{ + if( u_pTimer && u_pTimer->Enabled ){ + int direct = u_pTimer->Tag; + bool bRedraw = false, + bStop = true; + + if( direct<0 && m_iUpState==STATE_DOWN ){ + m_iFirst--; + if( ((CMenuItem*)m_Items->Items[m_iFirst])->Break ) + m_iFirst--; + + if( m_iFirst==0 ) + m_iUpState = STATE_DISABLE; + else + bStop = false; + + bRedraw = true; + } + else if( direct>0 && m_iDownState==STATE_DOWN ){ + m_iFirst++; + + if( ((CMenuItem*)m_Items->Items[m_iFirst])->Break ) + m_iFirst++; + + bStop = false; + bRedraw = true; + } + + if( bRedraw ) + InvalidateRgn( Handle, NULL, false ); + + if( bStop ){ + SAFE_DELETE(u_pTimer); +// delete u_pTimer; +// u_pTimer = NULL; + } + else if( u_pTimer->Interval>200 ){ + u_pTimer->Interval = 200; + } + } +} +//----------------------------------------------------------------------------- + + diff --git a/MenuUnit.h b/MenuUnit.h new file mode 100644 index 0000000..794760c --- /dev/null +++ b/MenuUnit.h @@ -0,0 +1,135 @@ +//--------------------------------------------------------------------------- +#ifndef MenuUnitH +#define MenuUnitH +//--------------------------------------------------------------------------- +#include +#include + +//--------------------------------------------------------------------------- +#define CLEAR_ALL -1 +//--------------------------------------------------------------------------- +String __fastcall CutDirString(TCanvas *ACanvas, String strDir, int nWidth); +typedef void __fastcall (__closure *DrawItem)( TObject *Sender, TCanvas* ACanvas, const TRect &ARect ); +class TMenuPanel; +class CMenuItem : public TObject +{ +private: + System::Classes::TList* FSubItems; + + DrawItem FDrawItem; + TNotifyEvent FOnClick; + TPngImage* FIcon; + + bool FEnabled; + bool FSelected; + bool FBreak; + int FMenuID; + + String FCaption; + String FHotkey; + CMenuItem *Parent; + +public: + int m_iTypeMenu; + + __fastcall CMenuItem(String strCaption, String strHotkey, TNotifyEvent aClickEvent, + int idMenu=-1, TPngImage *pPic=0); + __fastcall ~CMenuItem(); + + void __fastcall AddItem( CMenuItem *Item ); + void __fastcall ClearSubItems(); + + CMenuItem* __fastcall AppendMenu( String strCaption, String strHotkey="", + TNotifyEvent aClickEvent=NULL, int idMenu=-1, + TPngImage *pPic=0 ); + void __fastcall CreateSubMenu( TMenuPanel* pSubMenu ); + + bool __fastcall HasSubItem() { return FSubItems->Count > 0; }; + bool __fastcall IsDrawDir() { return FCaption.Pos("\\")>0; }; + +__published: + __property DrawItem OnDrawItem = { read=FDrawItem, write=FDrawItem }; + __property TNotifyEvent OnClick = { read=FOnClick, write=FOnClick }; + __property TPngImage* Icon = { read=FIcon, write=FIcon }; + __property String Caption = { read=FCaption, write=FCaption }; + __property String Hotkey = { read=FHotkey, write=FHotkey }; + __property bool Enabled = { read=FEnabled, write=FEnabled }; + __property bool Selected = { read=FSelected, write=FSelected }; + __property bool Break = { read=FBreak, write=FBreak }; + __property int MenuID = { read=FMenuID, write=FMenuID }; +}; + +//--------------------------------------------------------------------------- +class TMenuPanel: public Extctrls::TPanel +{ +private: +// TApplicationEvents *m_AppEvent; //add by LAQ + + //˵Ϣ + int m_iUpState, + m_iDownState, + m_iFirst; +// TTimer *m_pTimer; //Զʱ + + void __fastcall TimerProc(TObject* Sender); + void __fastcall DoHandleMessage(MSG &Msg, bool &Handled); //add by LAQ + void __fastcall HideAll(); + void __fastcall ClearAll(); + void __fastcall DrawItem( TObject *Sender, TCanvas* ACanvas, const TRect &ARect ); + void __fastcall DrawUpDown( TCanvas* ACanvas, const TRect &ARect, bool bUp ); + +protected: + System::Classes::TList* m_Items; + int m_ItemHeight, + m_iType, + m_iSelected; + + virtual void __fastcall CreateParams(TCreateParams &Params); + virtual void __fastcall CreateWnd(); + virtual void __fastcall Paint(void); + + virtual void __fastcall CalRect(int X, int Y); + virtual void __fastcall ShowSubMenu(CMenuItem *pItem, int iTop); + virtual void __fastcall CloseMenu(); + virtual bool __fastcall IsDrawImg(){ return m_iType!=0; }; + virtual bool __fastcall IsDrawDir(){ return false; }; + +public: + TMenuPanel *m_SubMenu, + *m_SupMenu; + + __fastcall TMenuPanel( TComponent* Owner=NULL, int iType=0 ); + __fastcall ~TMenuPanel(); + + static void LoadResources(); + static void FreeResources(); + + DYNAMIC void __fastcall MouseDown(System::Uitypes::TMouseButton Button, + System::Classes::TShiftState Shift, int X, int Y); + DYNAMIC void __fastcall MouseUp(System::Uitypes::TMouseButton Button, + System::Classes::TShiftState Shift, int X, int Y); + MESSAGE void __fastcall WMEraseBkgnd(Winapi::Messages::TWMEraseBkgnd &Message); + MESSAGE void __fastcall WMMouseMove(TWMMouse &Message); + MESSAGE void __fastcall CMMouseLeave(TMessage &Message); + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(WM_ERASEBKGND, TWMEraseBkgnd, WMEraseBkgnd) + MESSAGE_HANDLER(WM_MOUSEMOVE, TWMMouseMove, WMMouseMove) + MESSAGE_HANDLER(CM_MOUSELEAVE, TMessage, CMMouseLeave) + END_MESSAGE_MAP(Vcl::Extctrls::TPanel) + + CMenuItem* __fastcall CreateMenu( String strCaption, String strHotkey="", + TNotifyEvent aClickEvent=NULL, int idMenu=-1, + TPngImage *pPic=0); + void __fastcall SetMenuItems( System::Classes::TList* pItems ) { m_Items=pItems; }; + void __fastcall DeleteMenuItem(int index); + void __fastcall ClearItems() { DeleteMenuItem(CLEAR_ALL); }; + void __fastcall Show( int X, int Y ); + +__published: + __property int Type = { read=m_iType, write=m_iType }; + +}; +//--------------------------------------------------------------------------- +#endif + diff --git a/MessageDef.h b/MessageDef.h new file mode 100644 index 0000000..5cdf198 --- /dev/null +++ b/MessageDef.h @@ -0,0 +1,84 @@ +#ifndef MESSAGEDEF_H +#define MESSAGEDEF_H + +// ײϢ +#define MSG_PLAY_RANGE WM_USER + 0x100 +#define MSG_PLAY_END WM_USER + 0x101 +#define MSG_PLAY_FAILED WM_USER + 0x102 +#define MSG_PLAY_ABORT WM_USER + 0x104 +#define MSG_OPERATE_FAILED WM_USER + 0x105 +#define MSG_OPERATE_PERCENT WM_USER + 0x106 +#define MSG_OPERATE_COMPLETE WM_USER + 0x107 +#define MSG_RECORD_FAILED WM_USER + 0x108 +#define MSG_RECORD_COMPLETE WM_USER + 0x109 +#define MSG_RECORD_VOLJUST WM_USER + 0x10A +#define MSG_MEASURE_0 WM_USER + 0x110 +#define MSG_MEDIATIME WM_USER + 0X115 +#define MSG_SETSCROLLPOS WM_USER + 0x120 +#define MSG_OPERATE_NEXTRANGE WM_USER + 0x121 +#define MSG_NETWORKMESSAGE WM_USER + 0x130 +#define MSG_NETWORKERROR WM_USER + 0x131 +#define MSG_VSTEDITORRESIZE WM_USER + 0x132 +#define MSG_PAYMENTCONFIRMED WM_USER + 0x133 + +// Ϣ +#define UM_RESTORE WM_USER + 0x1000 +#define UM_SHOWMENU WM_USER + 0x1001 +#define UM_SHOWNEXTPAGE WM_USER + 0x1002 +#define UM_TEINVALIDATE WM_USER + 0x1003 +#define UM_LOGIN WM_USER + 0x1004 +#define UM_ENABLERELOAD WM_USER + 0x1005 +#define UM_SELECTSTYLE WM_USER + 0x1006 +#define UM_LOADPROJECT WM_USER + 0x1007 +#define UM_SAVEPROJECT WM_USER + 0x1008 +#define UM_NEWPROJECT WM_USER + 0x1009 +#define UM_AUDIOEFFECT WM_USER + 0x100a +#define UM_NEWCOMERTASK WM_USER + 0x1010 +#define UM_REFRESH_PAGE_STATE WM_USER + 0x1011 +#define UM_SAVEMUSIC WM_USER + 0x1012 +#define UM_UPLOADMUSIC WM_USER + 0x1013 +#define UM_MICSETTING WM_USER + 0x1014 +#define UM_STAGECHANGED WM_USER + 0x1100 +#define UM_SHOWABOUT WM_USER + 0x110a +#define UM_OPENMANUAL WM_USER + 0x110b +//#define UM_MENUCALL WM_USER + 0x110c +#define UM_MENUCLOSE WM_USER + 0x110d +#define UM_MOUSEMOVE WM_USER + 0x110e +#define UM_MOUSEUP WM_USER + 0x110f +#define UM_SHOWPLAYTIME WM_USER + 0x1110 +#define UM_SHOWBRUSH WM_USER + 0x1111 +#define UM_STOP WM_USER + 0x1112 +#define UM_TTSETUP WM_USER + 0x1113 +#define UM_CHANGETT WM_USER + 0x1114 +#define UM_SHOW_KB WM_USER + 0x1115 //add by laq +#define UM_SEARCH WM_USER + 0x1116 //add by laq 2014.1.23 +#define UM_OPENAUTOPROJ WM_USER + 0x1117 +#define UM_HANDLEAUTOPROJ WM_USER + 0x1118 +#define UM_SHOWHELP WM_USER + 0x1119 +#define UM_SHOWMORE WM_USER + 0x111a +#define UM_STYLESCORE WM_USER + 0x111b +#define UM_NOTIFICATION WM_USER + 0x111c //add by tj 2014/04/18 +#define UM_APPLYSTYLE WM_USER + 0x111d +#define UM_SAVELOCALSTYLE WM_USER + 0x111e +#define UM_IMPORTSEGMENT WM_USER + 0x111f +#define UM_UPLOADSTYLE WM_USER + 0x1120 +#define UM_CHANGEKEY WM_USER + 0x1121 +#define UM_SETVIEWMODE WM_USER + 0x1122 +#define UM_ENABLERECORD WM_USER + 0X1123 +#define UM_AUDIOLOAD WM_USER + 0x1124 +#define UM_AUTORECOGNITION WM_USER + 0x1125 +#define UM_MUSICCOVER WM_USER + 0x1126 +#define UM_UPLOADUSRICON WM_USER + 0x1127 +#define UM_SHOW_VOLSET WM_USER + 0x1128 +#define UM_ADDCHANNELPROG WM_USER + 0x1129 +#define UM_MIDISWITCH WM_USER + 0x1130 +#define UM_AUDIOFX WM_USER + 0x1131 +#define UM_VSTPATH WM_USER + 0x1132 +#define UM_SETCONTENTVIEW WM_USER + 0x1133 +#define UM_GETCONTENTVIEW WM_USER + 0x1134 +#define UM_AUDIOVOLCHANGED WM_USER + 0x1135 +#define UM_PREFERCHANGED WM_USER + 0x1136 +#define UM_RECORD WM_USER + 0x1137 +#define UM_STARTCDTIMER WM_USER + 0x1138 + +#endif \ No newline at end of file diff --git a/MessageFormUnit.cpp b/MessageFormUnit.cpp new file mode 100644 index 0000000..ee00251 --- /dev/null +++ b/MessageFormUnit.cpp @@ -0,0 +1,181 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop + +#include "GlobalUnit.h" +#include "MessageFormUnit.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma link "PNGButton" +#pragma link "CKBox" +#pragma link "GeneralDialogPanel" +#pragma link "TextButton" +#pragma resource "*.dfm" +TMessageForm *MessageForm; + +//--------------------------------------------------------------------------- +__fastcall TMessageForm::TMessageForm(TComponent* Owner) + : TForm(Owner) +{ + m_iCheck = -1; + + Font->Color = RGB(60,43,23); +} + +//--------------------------------------------------------------------------- +__fastcall TMessageForm::~TMessageForm() +{ +} + +//--------------------------------------------------------------------------- +void __fastcall TMessageForm::WMNCHitTest(TWMNCHitTest &Msg) +{ + TForm::Dispatch(&Msg); + + if( Msg.Result==HTCLIENT && Msg.YPosVisible = false; + m_iconError->Visible = false; + m_iconQuestion->Visible = false; + + m_btnYes->Visible = false; + m_btnNo->Visible = false; + m_btnOk->Visible = false; + m_btnCancel->Visible = false; + + m_pbCheck->Visible = false; + + int iIconType = AType & 0x0F0; + if( iIconType==MB_ICONERROR ){ + m_iconError->Visible = true; + } + else if( iIconType==MB_ICONQUESTION ) { + m_iconQuestion->Visible = true; + } + else if( iIconType==MB_ICONINFORMATION ) { + m_iconInformation->Visible = true; + } + + int iButtonType = AType & 0x0F; + if( iButtonType==MB_OK ){ + m_btnOk->Visible = true; + m_btnOk->Left = (Width - m_btnOk->Width)/2 + 6; + } + else if( iButtonType==MB_OKCANCEL ){ + m_btnOk->Visible = true; + m_btnCancel->Visible = true; + m_btnOk->Left = (Width - (m_btnOk->Width+6)*2 )/2 + 6; + m_btnCancel->Left = m_btnOk->Left + m_btnOk->Width + 6; + } + else if( iButtonType==MB_YESNO ){ + m_btnYes->Visible = true; + m_btnNo->Visible = true; + m_btnYes->Left = (Width - (m_btnYes->Width+6)*2 )/2 + 6; + m_btnNo->Left = m_btnYes->Left + m_btnYes->Width + 6; + } + else if( iButtonType==MB_YESNOCANCEL ){ + m_btnYes->Visible = true; + m_btnNo->Visible = true; + m_btnCancel->Visible = true; + m_btnYes->Left = (Width - (m_btnYes->Width+6)*3 )/2 + 6; + m_btnNo->Left = m_btnYes->Left + m_btnYes->Width + 6; + m_btnCancel->Left = m_btnNo->Left + m_btnNo->Width + 6; +// m_pbCheck->Width = m_btnYes->Left - m_pbCheck->Left - 4 ; //add + } + + int iCheckType = AType & 0xF00; + if( iCheckType ){ + if( iCheckType==MB_CHECKED ){ + m_pbCheck->Checked = true; + } + else if( iCheckType==MB_UNCHECKED ){ + m_pbCheck->Checked = false; + } + m_pbCheck->Show(); + } + else{ + m_pbCheck->Hide(); + } + + m_lblMessage->Caption = AMessage; + + if( ATitle.Length()>0 ) + m_panGeneral->Caption = ATitle; + else + m_panGeneral->Caption = "ʾ"; + //Բ +// HRGN hRgn = CreateRoundRectRgn( 0, 0, Width+1, Height+2, 20, 20 ); +// SetWindowRgn( Handle, hRgn, false ); +// DeleteObject( hRgn ); + + return ShowModal(); +} +//--------------------------------------------------------------------------- + +void __fastcall TMessageForm::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) +{ + switch( Key ){ + case VK_RETURN: + case ' ': + if( m_btnYes->Visible ) + ModalResult = mrYes; + else if( m_btnOk->Visible ) + ModalResult = mrOk; + break; + + case VK_ESCAPE: + if( m_btnCancel->Visible ) + ModalResult = mrCancel; + break; + + case 'Y': + if( m_btnYes->Visible ) + ModalResult = mrYes; + break; + + case 'N': + if( m_btnNo->Visible ) + ModalResult = mrNo; + break; + } +} +//--------------------------------------------------------------------------- + +void _fastcall TMessageForm::SetCheckMessage( String strMessage ) +{ + if( strMessage.IsEmpty() ){ + m_pbCheck->Caption = L"ʾ"; + } + else{ + m_pbCheck->Caption = strMessage; + } +} +//--------------------------------------------------------------------------- + +bool TMessageForm::GetCheckState() +{ + return m_pbCheck->Checked; +} +//--------------------------------------------------------------------------- + +void __fastcall TMessageForm::FormCreate(TObject *Sender) +{ + m_lblMessage->ControlStyle>>csOpaque; + + m_panGeneral->Font->Size = g_szFont9; + m_pbCheck->Font->Size = g_szFont9; + m_btnYes->FontSize = g_szFont9; + m_btnOk->FontSize = g_szFont9; + m_btnNo->FontSize = g_szFont9; + m_btnCancel->FontSize = g_szFont9; +} +//--------------------------------------------------------------------------- + diff --git a/MessageFormUnit.dfm b/MessageFormUnit.dfm new file mode 100644 index 0000000..8dc4f00 --- /dev/null +++ b/MessageFormUnit.dfm @@ -0,0 +1,480 @@ +object MessageForm: TMessageForm + Left = 0 + Top = 0 + ParentCustomHint = False + HorzScrollBar.Visible = False + BiDiMode = bdLeftToRight + BorderIcons = [] + BorderStyle = bsNone + ClientHeight = 140 + ClientWidth = 314 + Color = clBtnFace + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + KeyPreview = True + ParentBiDiMode = False + PopupMode = pmAuto + Position = poScreenCenter + Scaled = False + ShowHint = True + OnCreate = FormCreate + OnKeyDown = FormKeyDown + TextHeight = 13 + object m_panGeneral: TGeneralDialogPanel + Left = 0 + Top = 0 + Width = 314 + Height = 140 + Align = alClient + Color = 5064257 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentBackground = False + ParentFont = False + TabOrder = 0 + object m_iconError: TImage + Left = 6 + Top = 6 + Width = 28 + Height = 28 + ParentCustomHint = False + AutoSize = True + ParentShowHint = False + Picture.Data = { + 0954506E67496D61676589504E470D0A1A0A0000000D494844520000001C0000 + 001C0806000000720DDF94000000097048597300000B1300000B1301009A9C18 + 00000A4D6943435050686F746F73686F70204943432070726F66696C65000078 + DA9D53775893F7163EDFF7650F5642D8F0B1976C81002223AC08C81059A21092 + 006184101240C585880A561415119C4855C482D50A489D88E2A028B867418A88 + 5A8B555C38EE1FDCA7B57D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691 + E6A26A003952853C3AD81F8F4F48C4C9BD80021548E0042010E6CBC26705C500 + 00F00379787E74B03FFC01AF6F00020070D52E2412C7E1FF83BA502657002091 + 00E02212E70B01905200C82E54C81400C81800B053B3640A009400006C797C42 + 2200AA0D00ECF4493E0500D8A993DC1700D8A21CA908008D0100992847240240 + BB00605581522C02C0C200A0AC40222E04C0AE018059B632470280BD0500768E + 58900F4060008099422CCC0020380200431E13CD03204C03A030D2BFE0A95F70 + 85B8480100C0CB95CD974BD23314B895D01A77F2F0E0E221E2C26CB142611729 + 106609E4229C979B231348E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666 + E76CEFF4C5A2FE6BF06F223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370 + C701B075BF6BA95B00DA560068DFF95D33DB09A05A0AD07AF98B7938FC401E9E + A150C83C1D1C0A0B0BED2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7A + F000719A4099ADC0A383FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD + 8E29D1E234B15C2C158AF15889B850224DC779B952914421C995E212E97F32F1 + 1F96FD0993770D00AC864FC04EB607B5CB6CC07EEE01028B0E58D27600407EF3 + 2D8C1A0B91001067343279F7000093BFF98F402B0100CD97A4E30000BCE8185C + A894174CC608000044A0812AB041070CC114ACC00E9CC11DBCC0170261064440 + 0C24C03C104206E4801C0AA11896411954C03AD804B5B0031AA0119AE110B4C1 + 31380DE7E0125C81EB70170660189EC218BC86090441C8081361213A8811628E + D822CE0817998E04226148349280A420E988145122C5C872A402A9426A915D48 + 23F22D7214398D5C40FA90DBC820328AFC8ABC47319481B25103D4027540B9A8 + 1F1A8AC6A073D174340F5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A + 8E6380D1310E668CD9615C8C87456089581A26C71663E55835568F35631D5837 + 76151BC09E61EF0824028B8013EC085E8410C26C82909047584C5843A825EC23 + B412BA085709838431C2272293A84FB4257A12F9C478623AB1905846AC26EE21 + 1E219E255E270E135F9348240EC992E44E0A21259032490B496B48DB482DA453 + A43ED210699C4C26EB906DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7 + 143AC588E24C09A22452A494124A35653FE504A59F324299A0AA51CDA99ED408 + AA883A9F5A496DA076502F5387A91334759A25CD9B1643CBA42DA3D5D09A6967 + 69F7682FE974BA09DD831E4597D097D26BE807E9E7E983F4770C0D860D83C748 + 6228196B197B19A718B7192F994CA605D39799C85430D7321B9967980F986F55 + 582AF62A7C1591CA12953A9556957E95E7AA545573553FD579AA0B54AB550FAB + 5E567DA64655B350E3A909D416ABD5A91D55BBA936AECE5277528F50CF515FA3 + BE5FFD82FA630DB2868546A08648A35463B7C6198D2116C63265F15842D67256 + 03EB2C6B984D625BB2F9EC4C7605FB1B762F7B4C534373AA66AC6691669DE671 + CD010EC6B1E0F039D99C4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA + 7ADABEDA62ED72ED16EDEBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA + 85BADB75CFEA3ED363EB79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD1 + 1F373034083690196C313863F0CC9063E86B9869B8D1F084E1A811CB68BA91C4 + 68A3D149A327B826EE8767E33578173E66AC6F1C62AC34DE65DC6B3C61626932 + DBA4C4A4C5E4BE29CD946B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C + 6B9E61BED9BCDBFC8D85A5459CC54A8B368BC796DA967CCB05964D96F7AC9856 + 3E567956F556D7AC49D65CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BAD + C4769B6DDF14E2148F29D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F6 + 6DF6CF1DCC1C121DD63B743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957 + 671B67A1739DF33517A64B90CB1297769717536DA78AA76E9F7ACB95E51AEEBA + D2B5D3F5A39BBB9BDCADD96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0 + F758E271CCE39DA79BA7C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8 + DBC45BE0BDCB7B603A3E3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE23 + 7ED67E997E07FC9EFB3BFACBFD8FF8BFE179F216F14E056001C101E501BD811A + 81B3036B031F049904A50735058D05BB062F0C3E15420C090D591F72936FC017 + F21BF96333DC672C9AD115CA089D155A1BFA30CC264C1ED6118E86CF08DF107E + 6FA6F94CE9CCB60888E0476C88B81F69199917F97D14292A32AA2EEA51B45374 + 7174F72CD6ACE459FB67BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9B + B880B8AAB8817887F845F1971274132409ED89E4C4D8C43D89E37302E76C9A33 + 9CE49A54967463AEE5DCA2B917E6E9CECB9E773C593559907C3885981297B23F + E5832042502F184FE5A76E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E6 + 9D5695F638DD3B7D43FA68864F4675C633094F522B79911992B923F34D5644D6 + DEACCFD971D92D39949C949CA3520D6996B42BD730B728B74F662B2B930DE479 + E66DCA1B9387CAF7E423F973F3DB156C854CD1A3B452AE500E164C2FA82B785B + 185B78B848BD485AD433DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1 + E022BF45BB16238B5317772E315D52BA647869F0D27DCB68CBB296FD50E25852 + 55F26A79DCF28E5283D2A5A5432B82573495A994C9CB6EAEF45AB96315619564 + 55EF6A97D55B567F2A17955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDA + DADE4AB7CAEDEB48EBA4EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B + 5F6D4ADE74A17A6AF58ECDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D + 7F5DCB56FDADABB7BED926DAD6BFDD777BF30E831D153BDEEF94ECBCB52B7857 + 6BBD457DF56ED2EE82DD8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645 + EFEB6A746F6CDCAFBFBFB2096D52368D1E483A70E59B806FDA9BED9A77B5705A + 2A0EC241E5C127DFA67C7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23A + BF75AC2DA36DA03DA1BDEFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F57 + 9EA09D283DF1F9E48293E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD + 6743CF9E3F1774EE4CB75FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE + 3D477E70FDE148AF5B6FEB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573 + D7F8D72E5D9F79BDEFC6EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D + 7A8F78AFFCBEDAFDEA07FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09 + 879EFE94FFD387E1D247CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2 + A713CFCA7E56FF79EB73ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372 + EFABA9AF3AC723C71FBCCE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40 + FE50F3D1FA63C7A7D04FF73EE77CFEFC2FF784F3FB25D29F33000002F6494441 + 5478DAAD964B68135114864F92B621B11AABADA4313645AAD5A25551DCA80842 + 7D6010A18A0FF05110A5A80B29E84271A31B373E16BA1045ED4294FA0051F081 + A25817858A8158ADF1515BB5446B2D4963439326F13F930E4C26F34ACC0F3FB9 + 33F7E47E33F79E7BE69A6AEB169001D5C29BE006B8145E387EDF0747E027F0AD + EE2EDF07BD814C3AC0B5F04978B191A7825EC3C7007E982BD0065F82B71B04C9 + 75136E02386A045805B7C14BF38489F2C35E40FBB4800EF8253CFF3F61A23EC1 + 4B000D29012DF01D78438160A238A1D6019A90039BE10BE2C5EC513BB5F6CD25 + 339932FE7DBEFC3B5D2B0B0AED5D434EDAFFDB9DD13F624E5263B59F062D71E9 + ED3D005E96023949BEC04E69D4F19FD5E40D97670DB8D9F35668B7F5CE237BD2 + ACFA4012FD80E7001A1181BBE12BF2A88AB112C5411F4DFC23FCAE199E9271FF + 5BF1286DC5C3C44D29A5A9DD07E04511781F5EAF14A5346D6A3A5CF9999E970E + A975B703B882819C2CC3E3D39AA5E29449784B57DCAA09F3D922B4D7DDAD15C2 + 7B7232036BD0F8A815C95377223853B53F4929DA59F59E02D611BD4958C4C0E5 + 94DE7B9ABAD7534F4EACA9923AEC613A383DA037046B3503B9203FD68A5AF6D7 + 4167FA6769BEE136CF3BEA2989928EBC0CE412D6A116C16B78036B3843670D5F + 4D08D12197E6CAB084A4E1DC1E548BC8254B19C8600DB9C56DD14BE9A29DA1B2 + 4411DDFD5A9FB50F9F22F5B912C9DF5A671F06B12D2A452097B46679C4915F1E + 6A0C5564DC8B9813B4C5D305A04D715D552A0DEB2A804D22903FB09DD25EB55A + 7A6A5A2FDD760C086D067242C91F68236A69D83296B57E00B64B8B37676A8378 + C1656D2AA654AE80352A64256B12FA5D0A5BA5BF2826073E00CCCB0D29B00E7E + 032B6FB6FC15A3F437D12F07B276C0AD05060A455BBC503A62F0A1E9688160A7 + 016B91DE503B441D80CF52FA14908FF8EBDE02D8397987D6317125A54F6E3539 + C2F81CC3D3F84CA953EF5CCA09C447455EDB553AA017F0754AEFB7985A901E50 + 2AAE00AA276F40068C0C624AA55246E20AA67FC9F81007218208890000000049 + 454E44AE426082} + ShowHint = False + end + object m_iconInformation: TImage + Left = 6 + Top = 6 + Width = 28 + Height = 28 + AutoSize = True + Picture.Data = { + 0954506E67496D61676589504E470D0A1A0A0000000D494844520000001C0000 + 001C0806000000720DDF94000000097048597300000B1300000B1301009A9C18 + 00000A4D6943435050686F746F73686F70204943432070726F66696C65000078 + DA9D53775893F7163EDFF7650F5642D8F0B1976C81002223AC08C81059A21092 + 006184101240C585880A561415119C4855C482D50A489D88E2A028B867418A88 + 5A8B555C38EE1FDCA7B57D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691 + E6A26A003952853C3AD81F8F4F48C4C9BD80021548E0042010E6CBC26705C500 + 00F00379787E74B03FFC01AF6F00020070D52E2412C7E1FF83BA502657002091 + 00E02212E70B01905200C82E54C81400C81800B053B3640A009400006C797C42 + 2200AA0D00ECF4493E0500D8A993DC1700D8A21CA908008D0100992847240240 + BB00605581522C02C0C200A0AC40222E04C0AE018059B632470280BD0500768E + 58900F4060008099422CCC0020380200431E13CD03204C03A030D2BFE0A95F70 + 85B8480100C0CB95CD974BD23314B895D01A77F2F0E0E221E2C26CB142611729 + 106609E4229C979B231348E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666 + E76CEFF4C5A2FE6BF06F223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370 + C701B075BF6BA95B00DA560068DFF95D33DB09A05A0AD07AF98B7938FC401E9E + A150C83C1D1C0A0B0BED2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7A + F000719A4099ADC0A383FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD + 8E29D1E234B15C2C158AF15889B850224DC779B952914421C995E212E97F32F1 + 1F96FD0993770D00AC864FC04EB607B5CB6CC07EEE01028B0E58D27600407EF3 + 2D8C1A0B91001067343279F7000093BFF98F402B0100CD97A4E30000BCE8185C + A894174CC608000044A0812AB041070CC114ACC00E9CC11DBCC0170261064440 + 0C24C03C104206E4801C0AA11896411954C03AD804B5B0031AA0119AE110B4C1 + 31380DE7E0125C81EB70170660189EC218BC86090441C8081361213A8811628E + D822CE0817998E04226148349280A420E988145122C5C872A402A9426A915D48 + 23F22D7214398D5C40FA90DBC820328AFC8ABC47319481B25103D4027540B9A8 + 1F1A8AC6A073D174340F5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A + 8E6380D1310E668CD9615C8C87456089581A26C71663E55835568F35631D5837 + 76151BC09E61EF0824028B8013EC085E8410C26C82909047584C5843A825EC23 + B412BA085709838431C2272293A84FB4257A12F9C478623AB1905846AC26EE21 + 1E219E255E270E135F9348240EC992E44E0A21259032490B496B48DB482DA453 + A43ED210699C4C26EB906DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7 + 143AC588E24C09A22452A494124A35653FE504A59F324299A0AA51CDA99ED408 + AA883A9F5A496DA076502F5387A91334759A25CD9B1643CBA42DA3D5D09A6967 + 69F7682FE974BA09DD831E4597D097D26BE807E9E7E983F4770C0D860D83C748 + 6228196B197B19A718B7192F994CA605D39799C85430D7321B9967980F986F55 + 582AF62A7C1591CA12953A9556957E95E7AA545573553FD579AA0B54AB550FAB + 5E567DA64655B350E3A909D416ABD5A91D55BBA936AECE5277528F50CF515FA3 + BE5FFD82FA630DB2868546A08648A35463B7C6198D2116C63265F15842D67256 + 03EB2C6B984D625BB2F9EC4C7605FB1B762F7B4C534373AA66AC6691669DE671 + CD010EC6B1E0F039D99C4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA + 7ADABEDA62ED72ED16EDEBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA + 85BADB75CFEA3ED363EB79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD1 + 1F373034083690196C313863F0CC9063E86B9869B8D1F084E1A811CB68BA91C4 + 68A3D149A327B826EE8767E33578173E66AC6F1C62AC34DE65DC6B3C61626932 + DBA4C4A4C5E4BE29CD946B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C + 6B9E61BED9BCDBFC8D85A5459CC54A8B368BC796DA967CCB05964D96F7AC9856 + 3E567956F556D7AC49D65CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BAD + C4769B6DDF14E2148F29D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F6 + 6DF6CF1DCC1C121DD63B743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957 + 671B67A1739DF33517A64B90CB1297769717536DA78AA76E9F7ACB95E51AEEBA + D2B5D3F5A39BBB9BDCADD96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0 + F758E271CCE39DA79BA7C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8 + DBC45BE0BDCB7B603A3E3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE23 + 7ED67E997E07FC9EFB3BFACBFD8FF8BFE179F216F14E056001C101E501BD811A + 81B3036B031F049904A50735058D05BB062F0C3E15420C090D591F72936FC017 + F21BF96333DC672C9AD115CA089D155A1BFA30CC264C1ED6118E86CF08DF107E + 6FA6F94CE9CCB60888E0476C88B81F69199917F97D14292A32AA2EEA51B45374 + 7174F72CD6ACE459FB67BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9B + B880B8AAB8817887F845F1971274132409ED89E4C4D8C43D89E37302E76C9A33 + 9CE49A54967463AEE5DCA2B917E6E9CECB9E773C593559907C3885981297B23F + E5832042502F184FE5A76E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E6 + 9D5695F638DD3B7D43FA68864F4675C633094F522B79911992B923F34D5644D6 + DEACCFD971D92D39949C949CA3520D6996B42BD730B728B74F662B2B930DE479 + E66DCA1B9387CAF7E423F973F3DB156C854CD1A3B452AE500E164C2FA82B785B + 185B78B848BD485AD433DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1 + E022BF45BB16238B5317772E315D52BA647869F0D27DCB68CBB296FD50E25852 + 55F26A79DCF28E5283D2A5A5432B82573495A994C9CB6EAEF45AB96315619564 + 55EF6A97D55B567F2A17955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDA + DADE4AB7CAEDEB48EBA4EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B + 5F6D4ADE74A17A6AF58ECDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D + 7F5DCB56FDADABB7BED926DAD6BFDD777BF30E831D153BDEEF94ECBCB52B7857 + 6BBD457DF56ED2EE82DD8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645 + EFEB6A746F6CDCAFBFBFB2096D52368D1E483A70E59B806FDA9BED9A77B5705A + 2A0EC241E5C127DFA67C7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23A + BF75AC2DA36DA03DA1BDEFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F57 + 9EA09D283DF1F9E48293E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD + 6743CF9E3F1774EE4CB75FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE + 3D477E70FDE148AF5B6FEB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573 + D7F8D72E5D9F79BDEFC6EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D + 7A8F78AFFCBEDAFDEA07FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09 + 879EFE94FFD387E1D247CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2 + A713CFCA7E56FF79EB73ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372 + EFABA9AF3AC723C71FBCCE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40 + FE50F3D1FA63C7A7D04FF73EE77CFEFC2FF784F3FB25D29F33000002A2494441 + 5478DAB5966D48536114C7CF6A4E178B0D416B9283C8704861D1CB971223308B + 46041946102408658405FB14F529A2FA10D10B0845E1100CA28822C330E88506 + 5114B3342814C3953109A3D5B25ACDDBFF7877E3DEEDBE3CDBF20F7FB83BF739 + CFEFEEB9E779EEB155D7D49280AAE126B80176C1CBD2F17E3801DF83AFBF79DD + FFD66A229B0570237C0C5E21F254D00BF808C07773053AE14BF04E4150A6AEC2 + 2D00FF1001FAE06BF0EA3C618A06E000A05133A01B7E0C2F2D10A668185E0968 + 5C0F381BBE016FD1CB9C723A28D1B8242B3E6B3249AEBE41332817D426405399 + C036B8C328EBCF3C37456FB667C5EDE371F26D3D67F54F5B01BCAC0672918CC0 + F367083806FB014D28C0DD70A759468140D61E002F2AC01E78F30C03C300D631 + 908BE55B7A590D2515DBE9DDC34359F1A2E8045536779080784F7A1858858B21 + 918CD1DE20A53C733431E7B311F21EE81649672D67E05A92F79EA5C63A5BE997 + DFAB89CDBD1DA1B2E33DA2C00D0CE403B94F64F4F8C9EDF4BDDEAF89955E7840 + 9E5058141860201F614F45464F1C6CA478B3F6C42B3F7A8B5CBDAF4481D34553 + CA73898C661843D5AAD8D74525915151E002655B7086CF6A342F272FAB5ABE6D + E7C9FEF18B082C866DE155805CD76D56195C305C38FF3425D1C27527C8F63B25 + 020C01D8A200F903FB5C745DF2541D8061F5E1CD95DA6096F1B3B632EB1DF296 + 700CC5AC6077000BF0851A580347608751D6E49AC5143BB54313ABD81BA29297 + EFCD604992BF89039940D62EB8EB3F03A70F6DE5875E8BC14DD361DD475D544E + 5F9B566962EEEE2754F4E1B311EC34604175C0A889DA0F9F21B90BC8475CB641 + C0CE66DE306B13EB49EEDCAA72840DA797F1BEDE4DABBE940B885B457EB7EB2D + 408FE02B24EFB7A4D1202BA05A6564D27903F24964129B244939AE5861FA0B36 + 05EEF82A32C1E10000000049454E44AE426082} + end + object m_iconQuestion: TImage + Left = 7 + Top = 6 + Width = 28 + Height = 28 + ParentCustomHint = False + AutoSize = True + ParentShowHint = False + Picture.Data = { + 0954506E67496D61676589504E470D0A1A0A0000000D494844520000001C0000 + 001C0806000000720DDF94000000097048597300000B1300000B1301009A9C18 + 00000A4D6943435050686F746F73686F70204943432070726F66696C65000078 + DA9D53775893F7163EDFF7650F5642D8F0B1976C81002223AC08C81059A21092 + 006184101240C585880A561415119C4855C482D50A489D88E2A028B867418A88 + 5A8B555C38EE1FDCA7B57D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691 + E6A26A003952853C3AD81F8F4F48C4C9BD80021548E0042010E6CBC26705C500 + 00F00379787E74B03FFC01AF6F00020070D52E2412C7E1FF83BA502657002091 + 00E02212E70B01905200C82E54C81400C81800B053B3640A009400006C797C42 + 2200AA0D00ECF4493E0500D8A993DC1700D8A21CA908008D0100992847240240 + BB00605581522C02C0C200A0AC40222E04C0AE018059B632470280BD0500768E + 58900F4060008099422CCC0020380200431E13CD03204C03A030D2BFE0A95F70 + 85B8480100C0CB95CD974BD23314B895D01A77F2F0E0E221E2C26CB142611729 + 106609E4229C979B231348E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666 + E76CEFF4C5A2FE6BF06F223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370 + C701B075BF6BA95B00DA560068DFF95D33DB09A05A0AD07AF98B7938FC401E9E + A150C83C1D1C0A0B0BED2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7A + F000719A4099ADC0A383FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD + 8E29D1E234B15C2C158AF15889B850224DC779B952914421C995E212E97F32F1 + 1F96FD0993770D00AC864FC04EB607B5CB6CC07EEE01028B0E58D27600407EF3 + 2D8C1A0B91001067343279F7000093BFF98F402B0100CD97A4E30000BCE8185C + A894174CC608000044A0812AB041070CC114ACC00E9CC11DBCC0170261064440 + 0C24C03C104206E4801C0AA11896411954C03AD804B5B0031AA0119AE110B4C1 + 31380DE7E0125C81EB70170660189EC218BC86090441C8081361213A8811628E + D822CE0817998E04226148349280A420E988145122C5C872A402A9426A915D48 + 23F22D7214398D5C40FA90DBC820328AFC8ABC47319481B25103D4027540B9A8 + 1F1A8AC6A073D174340F5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A + 8E6380D1310E668CD9615C8C87456089581A26C71663E55835568F35631D5837 + 76151BC09E61EF0824028B8013EC085E8410C26C82909047584C5843A825EC23 + B412BA085709838431C2272293A84FB4257A12F9C478623AB1905846AC26EE21 + 1E219E255E270E135F9348240EC992E44E0A21259032490B496B48DB482DA453 + A43ED210699C4C26EB906DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7 + 143AC588E24C09A22452A494124A35653FE504A59F324299A0AA51CDA99ED408 + AA883A9F5A496DA076502F5387A91334759A25CD9B1643CBA42DA3D5D09A6967 + 69F7682FE974BA09DD831E4597D097D26BE807E9E7E983F4770C0D860D83C748 + 6228196B197B19A718B7192F994CA605D39799C85430D7321B9967980F986F55 + 582AF62A7C1591CA12953A9556957E95E7AA545573553FD579AA0B54AB550FAB + 5E567DA64655B350E3A909D416ABD5A91D55BBA936AECE5277528F50CF515FA3 + BE5FFD82FA630DB2868546A08648A35463B7C6198D2116C63265F15842D67256 + 03EB2C6B984D625BB2F9EC4C7605FB1B762F7B4C534373AA66AC6691669DE671 + CD010EC6B1E0F039D99C4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA + 7ADABEDA62ED72ED16EDEBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA + 85BADB75CFEA3ED363EB79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD1 + 1F373034083690196C313863F0CC9063E86B9869B8D1F084E1A811CB68BA91C4 + 68A3D149A327B826EE8767E33578173E66AC6F1C62AC34DE65DC6B3C61626932 + DBA4C4A4C5E4BE29CD946B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C + 6B9E61BED9BCDBFC8D85A5459CC54A8B368BC796DA967CCB05964D96F7AC9856 + 3E567956F556D7AC49D65CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BAD + C4769B6DDF14E2148F29D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F6 + 6DF6CF1DCC1C121DD63B743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957 + 671B67A1739DF33517A64B90CB1297769717536DA78AA76E9F7ACB95E51AEEBA + D2B5D3F5A39BBB9BDCADD96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0 + F758E271CCE39DA79BA7C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8 + DBC45BE0BDCB7B603A3E3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE23 + 7ED67E997E07FC9EFB3BFACBFD8FF8BFE179F216F14E056001C101E501BD811A + 81B3036B031F049904A50735058D05BB062F0C3E15420C090D591F72936FC017 + F21BF96333DC672C9AD115CA089D155A1BFA30CC264C1ED6118E86CF08DF107E + 6FA6F94CE9CCB60888E0476C88B81F69199917F97D14292A32AA2EEA51B45374 + 7174F72CD6ACE459FB67BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9B + B880B8AAB8817887F845F1971274132409ED89E4C4D8C43D89E37302E76C9A33 + 9CE49A54967463AEE5DCA2B917E6E9CECB9E773C593559907C3885981297B23F + E5832042502F184FE5A76E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E6 + 9D5695F638DD3B7D43FA68864F4675C633094F522B79911992B923F34D5644D6 + DEACCFD971D92D39949C949CA3520D6996B42BD730B728B74F662B2B930DE479 + E66DCA1B9387CAF7E423F973F3DB156C854CD1A3B452AE500E164C2FA82B785B + 185B78B848BD485AD433DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1 + E022BF45BB16238B5317772E315D52BA647869F0D27DCB68CBB296FD50E25852 + 55F26A79DCF28E5283D2A5A5432B82573495A994C9CB6EAEF45AB96315619564 + 55EF6A97D55B567F2A17955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDA + DADE4AB7CAEDEB48EBA4EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B + 5F6D4ADE74A17A6AF58ECDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D + 7F5DCB56FDADABB7BED926DAD6BFDD777BF30E831D153BDEEF94ECBCB52B7857 + 6BBD457DF56ED2EE82DD8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645 + EFEB6A746F6CDCAFBFBFB2096D52368D1E483A70E59B806FDA9BED9A77B5705A + 2A0EC241E5C127DFA67C7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23A + BF75AC2DA36DA03DA1BDEFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F57 + 9EA09D283DF1F9E48293E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD + 6743CF9E3F1774EE4CB75FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE + 3D477E70FDE148AF5B6FEB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573 + D7F8D72E5D9F79BDEFC6EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D + 7A8F78AFFCBEDAFDEA07FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09 + 879EFE94FFD387E1D247CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2 + A713CFCA7E56FF79EB73ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372 + EFABA9AF3AC723C71FBCCE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40 + FE50F3D1FA63C7A7D04FF73EE77CFEFC2FF784F3FB25D29F33000002FD494441 + 5478DABD966B48536118C79FCDCBCA9645B5C82D2FB3ACD08A1541184444542B + 43B45148940592657E302B8DFA5064CCC022122A2B0CE94A421442902244F5A1 + A888440836E82659B32DAD2DD9DA665BCF73E63BCEC6B96D417FF8C39E9DF3BE + BFF3BECFF35E54E1701816149940463A7409BA1C6D401BD1D3D076F428FA09BA + DBF6B6AF57AE23950C703EFA187A9B5C47E372A1ADE83684071205D6A15BD0E9 + 0A617CD1C83721F49D1220012EA3772501E2CB8DAE4068B71CB01D5DF58F3026 + 9AD695087D2906A4693C27D5835A0D5054E8838C892170BA52E1E3278D1C94F2 + BA04A15FE281547D1F4024673ADD18D4EC76C246F34F0ECAF4D59106D76ECC80 + 070FA74230A812837622B0221E781DBD43E8ED450B7DD07A6600B4DA90E8305E + BC9A04071A73A4A02B10FA9C01697403E894F8B7F45941B8D9F15E12C6D4DEA1 + 832B5775628FEF237033038AE6EED4C94158B3DA230B230D8FA44249D93C0809 + 7F1B155016037661501AFF0615C6A31E5B4CCE7A7AA7C0AD3BD3C1A00FC09106 + 076466FE896953B6A580CBAB88363020158B31FE69F6EC00584F0C46E3DF7E35 + D4D6E546F374A87E08B65A4662DA5456E583CD3E410CD8C880BF30D02A9A379E + 848032233CCB8063205030522A5E3E0A2DCD9F41A30947FF23100125D4C680C3 + 10D9FD15C952FE031AEA1D31B9E5E6EB68363C7E3A59AAA99501DF60207B4691 + E6CEF173CB840FA39C3635EBB98292D11E06BC88418D1220E58C72C757F5BE3C + E8EBCF50D27C1903D292E852D262E7F6EF50BBD7198D87BEA541A9A5404953DA + 4B731990F64F5A1A06252D935413EE34C7F97B693544CE414919F3FC605AEC8D + C65E9F5A49EE68EDE423D0CD07D2B2E847174AB5A40A3D7CD091E894EE47582B + FD883F0F09F60C2DFAC94900B94D9B054227BE19220524782E2E357961FD3A77 + 34F67852E0C2A59962B0D71039F17D52405231FA1E7A96DC5C49E82EBA920F93 + 029272205244E60441744FA58A3C2DF450EE5E4A5A0591BBCE5A90DEE0E94A78 + 1B7D1E612EB197940099D2C7A182376F84D89574C201FFA7FE020AB95485E854 + 32E90000000049454E44AE426082} + ShowHint = False + end + object m_lblMessage: TLabel + Left = 23 + Top = 34 + Width = 273 + Height = 65 + Alignment = taCenter + AutoSize = False + Font.Charset = DEFAULT_CHARSET + Font.Color = 12429980 + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowAccelChar = False + ShowHint = False + Layout = tlCenter + WordWrap = True + end + object m_btnYes: TTextButton + Left = 106 + Top = 105 + Width = 52 + Height = 27 + ModalResult = mrYes + ParentShowHint = False + ShowHint = True + Text = #26159 + end + object m_btnOk: TTextButton + Left = 139 + Top = 105 + Width = 52 + Height = 27 + ModalResult = mrOk + ParentShowHint = False + ShowHint = True + Text = #30830#23450 + end + object m_btnNo: TTextButton + Left = 169 + Top = 105 + Width = 52 + Height = 27 + ModalResult = mrNo + ParentShowHint = False + ShowHint = True + Text = #21542 + end + object m_btnCancel: TTextButton + Left = 187 + Top = 105 + Width = 52 + Height = 27 + ModalResult = mrCancel + ParentShowHint = False + ShowHint = True + Text = #21462#28040 + end + object m_pbCheck: TCKBox + Left = 13 + Top = 109 + Width = 78 + Height = 13 + Caption = #19981#20877#25552#31034 + Ctl3D = False + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = 12429980 + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentColor = True + ParentCtl3D = False + ParentDoubleBuffered = False + ParentFont = False + TabOrder = 0 + AutoBox = False + BoxColor = 3355443 + end + end +end diff --git a/MessageFormUnit.h b/MessageFormUnit.h new file mode 100644 index 0000000..65a47bf --- /dev/null +++ b/MessageFormUnit.h @@ -0,0 +1,59 @@ +//--------------------------------------------------------------------------- + +#ifndef MessageFormUnitH +#define MessageFormUnitH +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include +#include +#include "PNGButton.hpp" +#include +#include +#include "CKBox.h" +#include "GeneralDialogPanel.h" +#include "TextButton.h" +//--------------------------------------------------------------------------- + +#define MB_CHECKED 0x100 +#define MB_UNCHECKED 0x200 + +class TMessageForm : public TForm +{ +__published: // IDE-managed Components + TImage *m_iconError; + TImage *m_iconInformation; + TImage *m_iconQuestion; + TLabel *m_lblMessage; + TCKBox *m_pbCheck; + TGeneralDialogPanel *m_panGeneral; + TTextButton *m_btnYes; + TTextButton *m_btnOk; + TTextButton *m_btnNo; + TTextButton *m_btnCancel; + void __fastcall FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift); + void __fastcall FormCreate(TObject *Sender); + +private: // User declarations + int m_iCheck; + + void __fastcall WMNCHitTest(TWMNCHitTest &Msg); + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(WM_NCHITTEST, TWMNCHitTest, WMNCHitTest) + END_MESSAGE_MAP(TForm) +public: // User declarations + __fastcall TMessageForm(TComponent* Owner); + __fastcall ~TMessageForm(); + + void _fastcall SetCheckMessage( String strMessage ); + bool GetCheckState(); + int __fastcall ShowMessage( const String AMessage, int AType=MB_ICONINFORMATION|MB_OK, const String ATitle = "" ); + +}; +//--------------------------------------------------------------------------- +extern PACKAGE TMessageForm *MessageForm; +//--------------------------------------------------------------------------- +#endif diff --git a/MicSetFormUnit.cpp b/MicSetFormUnit.cpp new file mode 100644 index 0000000..537a7d3 --- /dev/null +++ b/MicSetFormUnit.cpp @@ -0,0 +1,918 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop + +#include "MicSetFormUnit.h" +#include "Instruments.h" +#include "MessageFormUnit.h" + +#define IO_DEVICE_WASAPI 0x10000 +#define IO_DEVICE_ASIO 0x20000 +#define IO_DEVICE_MIDI 0x40000 +#define DEVICE_DEFAULT 0x02 +#define REC_INPUT_OFF 0x10000 + +// source info structure +typedef struct { + char name[256]; + DWORD flags; +} IO_CHANNEL_INFO; + +#define CLR_TEXT_HOT RGB( 201, 214, 229 ) +#define CLR_TEXT_NOR RGB( 156, 170, 189 ) + +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma link "GeneralDialogPanel" +#pragma link "TextButton" +#pragma link "CKBox" +#pragma resource "*.dfm" +TMicSetForm *MicSetForm; +//--------------------------------------------------------------------------- +__fastcall TMicSetForm::TMicSetForm(TComponent* Owner) + : TForm(Owner) +{ + //ͼƬ + Font->Color = RGB(60,43,23); + m_iCurrPlaybackDevice = m_iCurrRecordDevice = -1; + m_iCurrOutput = m_iCurrInput = -1; + + m_PopupMenu = NULL; +} + +//--------------------------------------------------------------------------- +void __fastcall TMicSetForm::FormCreate(TObject *Sender) +{ + SetTransparent( this ); + + m_panGeneral->Font->Size = g_szFont9; + + m_cbPlayDev->SetFontSize(g_szFont9); + m_cbOutput->SetFontSize(g_szFont9); + m_cbRecDev->SetFontSize(g_szFont9); + m_cbInput->SetFontSize(g_szFont9); + m_ckAuto->Font->Size = g_szFont9; + m_ckMoniter->Font->Size = g_szFont9; + m_rbCommon->Font->Size = g_szFont9; + m_rbASIO->Font->Size = g_szFont8; + m_rbWASAPI->Font->Size = g_szFont8; + m_ckMIDI->Font->Size = g_szFont8; + + m_btnOk->FontSize = g_szFont9; + m_btnCanel->FontSize = g_szFont9; + + //Լɫ޸ + m_lblVolume->Font->Color = CLR_TEXT_NOR; + m_lblPlayback->Font->Color = CLR_TEXT_NOR; + m_lblOutput->Font->Color = CLR_TEXT_NOR; + m_lblRecord->Font->Color = CLR_TEXT_NOR; + m_lblInput->Font->Color = CLR_TEXT_NOR; + m_lblLatencyTime->Font->Color = CLR_TEXT_NOR; + m_lblHint->Font->Color = CLR_TEXT_NOR; + m_lblHintMsg->Font->Color = CLR_TEXT_NOR; + m_lblLatency->Font->Color = CLR_TEXT_NOR; + m_lblType->Font->Color = CLR_TEXT_NOR; + + //-------------------------------ѡ״̬ж + m_ckAuto->Checked = g_bRecordAutoAdjust; + m_ckMoniter->Checked = g_bRecordMoniter; + + m_iCurrPlaybackDevice = g_iPlaybackDevice; + m_iCurrOutput = g_iPlaybackOutput; + m_iCurrRecordDevice = g_iRecordDevice; + m_iCurrInput = g_iRecordInput; + + IO_DEVICE_INFO aPbDevs[20], //豸 + aRcDevs[20]; //¼豸 + + int nPbDev = f_MM_GetPlaybackDeviceInfo( 20, aPbDevs ); + int nRcDev = f_MM_GetRecordDeviceInfo( 20, aRcDevs ); + + for( int i=0; iiDevice & IO_DEVICE_WASAPI ) + m_aWasapiPb.push_back( pDev ); + else if( pDev->iDevice & IO_DEVICE_ASIO ) + m_aAsioPb.push_back( pDev ); + else + m_aCommonPb.push_back( pDev ); + } + + for( int i=0; iiDevice & IO_DEVICE_WASAPI ) + m_aWasapiRc.push_back( pDev ); + else if( pDev->iDevice & IO_DEVICE_MIDI ) + m_aMidiRc.push_back( pDev ); + else + m_aCommonRc.push_back( pDev ); + } + + m_rbCommon->Enabled = !m_aCommonPb.empty(); + m_rbASIO->Enabled = !m_aAsioPb.empty(); + m_rbWASAPI->Enabled = !m_aWasapiPb.empty(); + m_ckMIDI->Enabled = !m_aMidiRc.empty(); + + int iType = m_iCurrPlaybackDevice>=0 ? (m_iCurrPlaybackDevice & 0xF0000) : -1; + + if( m_iCurrPlaybackDevice<0 && !m_aCommonPb.empty() + || m_iCurrRecordDevice<0 && ( iType==0 && !m_aCommonRc.empty() + || iType==IO_DEVICE_WASAPI && !m_aWasapiRc.empty() ) ){ + f_MM_SetIODevice( m_iCurrPlaybackDevice, m_iCurrOutput, + m_iCurrRecordDevice, m_iCurrInput ); + } + + if( iType<0 ) + iType = m_iCurrPlaybackDevice>=0 ? (m_iCurrPlaybackDevice & 0xF0000) : -1; + + m_rbCommon->Checked = iType==0; + m_rbASIO->Checked = iType==IO_DEVICE_ASIO; + m_rbWASAPI->Checked = iType==IO_DEVICE_WASAPI; + m_ckMIDI->Checked = m_iCurrRecordDevice>=0 && (m_iCurrRecordDevice & IO_DEVICE_MIDI); + + ReloadPlayDev(); + ReloadOutput(); + + ReloadRecDev(); + ReloadInput(); + + m_pTimerLatency = new TTimer(this); + m_pTimerLatency->Enabled = false; + m_pTimerLatency->Interval = 250; + m_pTimerLatency->OnTimer = LatencyTimerProc; + + m_tbVolume->Position = g_fRecordVolume * 100; + m_tbVolume->Hint = IntToStr(m_tbVolume->Position); + + if( m_iCurrPlaybackDevice>=0 && m_iCurrRecordDevice>=0 ) + BeginRecordTest(); + else + m_tbVolume->Enabled = false; +} +//--------------------------------------------------------------------------- + +void __fastcall TMicSetForm::FormClose(TObject *Sender, TCloseAction &Action) +{ + BeginRecordTest( false ); + + if( m_pTimerLatency ){ + delete m_pTimerLatency; + m_pTimerLatency = NULL; + } +/* if( m_PopupMenu ){ + delete m_PopupMenu; + m_PopupMenu = NULL; + } +*/ + while( !m_aCommonPb.empty() ){ + delete m_aCommonPb.back(); + m_aCommonPb.pop_back(); + } + while( !m_aCommonRc.empty() ){ + delete m_aCommonRc.back(); + m_aCommonRc.pop_back(); + } + while( !m_aWasapiPb.empty() ){ + delete m_aWasapiPb.back(); + m_aWasapiPb.pop_back(); + } + while( !m_aWasapiRc.empty() ){ + delete m_aWasapiRc.back(); + m_aWasapiRc.pop_back(); + } + while( !m_aAsioPb.empty() ){ + delete m_aAsioPb.back(); + m_aAsioPb.pop_back(); + } + while( !m_aMidiRc.empty() ){ + delete m_aMidiRc.back(); + m_aMidiRc.pop_back(); + } + + if( ModalResult!=mrOk ){ + if( !(g_iPlaybackDevice==m_iCurrPlaybackDevice + && g_iRecordDevice==m_iCurrRecordDevice + && g_iPlaybackOutput==m_iCurrOutput + && g_iRecordInput==m_iCurrInput) ){ + f_MM_SetIODevice( g_iPlaybackDevice, g_iPlaybackOutput, + g_iRecordDevice, g_iRecordInput ); + } + + if( g_bRecordAutoAdjust!=m_ckAuto->Checked ) + f_MM_SetRecordAutoAdjust( g_bRecordAutoAdjust ); + if( g_bRecordMoniter!=m_ckMoniter->Checked ) + f_MM_SetRecordMoniter( g_bRecordMoniter ); + f_MM_SetStreamVolume( 1, g_fRecordVolume ); + } +} +//--------------------------------------------------------------------------- + +void TMicSetForm::ReloadPlayDev() +{ + m_cbPlayDev->Clear(); + + int iDevice = -1; + + if( m_iCurrPlaybackDevice>=0 ){ + int iType = m_iCurrPlaybackDevice & 0xF0000; + vector& rDevs = iType==IO_DEVICE_WASAPI ? m_aWasapiPb + : iType==IO_DEVICE_ASIO ? m_aAsioPb + : m_aCommonPb; + for( int i=0; iiDevice==m_iCurrPlaybackDevice ) + iDevice = m_cbPlayDev->ItemsCount; + + if( iType==0 && !stricmp( rDevs[i]->name, "Default" )) + m_cbPlayDev->AddItem( "ϵͳĬ豸" )->Tag = rDevs[i]->iDevice; + else + m_cbPlayDev->AddItem( rDevs[i]->name )->Tag = rDevs[i]->iDevice; + } + } + + m_cbPlayDev->DefItemIndex = iDevice; + m_cbPlayDev->Enabled = m_cbPlayDev->ItemsCount>0; +} +//--------------------------------------------------------------------------- + +void TMicSetForm::ReloadRecDev() +{ + m_cbRecDev->Clear(); + + int iDevice = -1; + if( m_iCurrRecordDevice>=0 ){ + int iType = m_iCurrRecordDevice & 0xF0000; + + if( iType==IO_DEVICE_ASIO ){ + for( int i=0; iiDevice==m_iCurrRecordDevice ){ + m_cbRecDev->AddItem( m_aAsioPb[i]->name )->Tag = m_aAsioPb[i]->iDevice; + break; + } + } + iDevice = 0; + } + else{ + vector& rDevs = iType==IO_DEVICE_WASAPI ? m_aWasapiRc + : iType==IO_DEVICE_MIDI ? m_aMidiRc + : m_aCommonRc; + for( int i=0; iiDevice==m_iCurrRecordDevice ) + iDevice = m_cbRecDev->ItemsCount; + + if( iType==0 && !strcmp( rDevs[i]->name, "Default" )) + m_cbRecDev->AddItem( "ϵͳĬ豸" )->Tag = rDevs[i]->iDevice; + else + m_cbRecDev->AddItem( rDevs[i]->name )->Tag = rDevs[i]->iDevice; + } + } + } + + m_cbRecDev->DefItemIndex = iDevice; + m_cbRecDev->Enabled = m_cbRecDev->ItemsCount>0; + if( !m_cbRecDev->Enabled ) + m_cbRecDev->Caption = ""; +} +//--------------------------------------------------------------------------- + +void TMicSetForm::ReloadOutput() +{ + m_cbOutput->Clear(); + + int iType = m_iCurrPlaybackDevice & 0xF0000; + + if( iType==IO_DEVICE_ASIO ){ + m_lblASIO->Visible = true; + + IO_CHANNEL_INFO chanInfo[20]; + int nSize = f_MM_GetPlaybackOutputInfo( 20, chanInfo ); + int iChannel = -1; + + if( m_iCurrOutput>=0 && m_iCurrOutput0 ) + iChannel = 0; + + for( int i=0; iAddItem( chanInfo[i].name ); + } + + if( iChannel>=0 ) + m_cbOutput->DefItemIndex = iChannel/2; + + m_lblASIO->Enabled = iChannel>=0; + m_iCurrOutput = iChannel; + } + else{ + m_lblASIO->Visible = false; + + m_cbOutput->AddItem( "Ĭ" ); + m_cbOutput->DefItemIndex = 0; + } + + m_cbOutput->Enabled = m_cbOutput->ItemsCount>0; + if( !m_cbOutput->Enabled ) + m_cbOutput->Caption = ""; +} +//--------------------------------------------------------------------------- + +void TMicSetForm::ReloadInput() +{ + m_cbInput->Clear(); + + bool bMidi = m_iCurrRecordDevice>=0 && (m_iCurrRecordDevice & IO_DEVICE_MIDI); + m_ckAuto->Visible = !bMidi; + m_ckMoniter->Visible = !bMidi; + + if( bMidi ){ +// m_lblLatency->Top = m_lblVolume->Top; +// m_lblLatencyTime->Top = m_lblVolume->Top; +// m_lblVolume->Caption = "ʱ䣺"; + m_lblInput->Caption = "ɫ"; + + for( int i=0; i<112; i++ ){ + m_cbInput->AddItem( GM_INSTRUMENT[i] ); + } + + m_cbInput->DefItemIndex = m_iCurrInput; + } + else{ +// m_lblLatency->Top = m_lblInput->Top; +// m_lblLatencyTime->Top = m_lblInput->Top; +// m_lblVolume->Caption = "¼"; + m_lblInput->Caption = "¼룺"; + + int iChannel = -1; + if( m_cbRecDev->DefItemIndex>=0 ){ + IO_CHANNEL_INFO chanInfo[20]; + int nSize = f_MM_GetRecordInputInfo( 20, chanInfo ); + + if( m_iCurrInput>=0 && m_iCurrInput0 ){ + for( int i=0; iAddItem( chanInfo[i].name ); + if( iChannel<0 ){ + iChannel = i; + } + } + + if( iChannel<0 ){ + iChannel = 0; + } + + m_cbInput->DefItemIndex = iChannel; + } + else if( (m_iCurrPlaybackDevice & 0xF0000)!=IO_DEVICE_ASIO ){ + m_cbInput->AddItem( "Ĭ" ); + m_cbInput->DefItemIndex = 0; + } + } + + m_iCurrInput = iChannel; + } + + m_cbInput->Enabled = m_cbInput->ItemsCount>0; + m_tbVolume->Enabled = m_cbInput->ItemsCount>0; + if( !m_cbInput->Enabled ) + m_cbInput->Caption = ""; +} +//--------------------------------------------------------------------------- + +void __fastcall TMicSetForm::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) + +{ + switch( Key ){ + case VK_RETURN: + case ' ': + if( m_btnOk->Visible ){ + OkClick( NULL ); + ModalResult = mrOk; + } + break; + + case VK_ESCAPE: + if( m_btnCanel->Visible ){ + ModalResult = mrCancel; + } + break; + } +} +//--------------------------------------------------------------------------- +void __fastcall TMicSetForm::VolumeChange(TObject *Sender) +{ + if( m_iCurrRecordDevice<0 ) + return; + + int nPos = m_tbVolume->Position; + m_tbVolume->Hint = IntToStr(nPos); + +/* if( m_iCurrRecordDevice & IO_DEVICE_MIDI ){ + f_MM_SetMidiInBuffer( nPos ); + } + else{ +*/ if( m_ckAuto->Visible && m_ckAuto->Checked ){ + m_ckAuto->Checked = false; + f_MM_SetRecordAutoAdjust( m_ckAuto->Checked ); + } + + f_MM_SetStreamVolume( 1, nPos/100.0 ); +// } +} +//--------------------------------------------------------------------------- + +void __fastcall TMicSetForm::LatencyTimerProc(TObject* Sender) +{ + float fLatency = f_MM_GetLatency( true ); + char str[16]; + sprintf( str, "%.1f ms", fLatency ); + m_lblLatencyTime->Caption = str; +} +//--------------------------------------------------------------------------- + +void TMicSetForm::BeginRecordTest(bool bStart) +{ + if( bStart ){ + HRESULT hr = f_MM_RecordTest( Handle ); + if( hr==S_OK ){ + if( m_ckAuto->Checked ){ + m_tbVolume->OnChange = NULL; + m_tbVolume->Position = 100; + m_tbVolume->Hint = IntToStr(100); + + f_MM_SetStreamVolume( 1, 1 ); + } + + m_tbVolume->Enabled = true; + m_tbVolume->OnChange = VolumeChange; + m_pTimerLatency->Enabled = true; + m_lblLatencyTime->Caption = "0.0 ms"; + } + else{ + m_pTimerLatency->Enabled = false; + m_tbVolume->Enabled = false; + m_lblLatencyTime->Caption = "---- ms"; + + ShowErrorMessage( hr ); + } + } + else{ + m_pTimerLatency->Enabled = false; + f_MM_Stop(); + m_tbVolume->Enabled = false; + m_lblLatencyTime->Caption = "---- ms"; + } +} +// --------------------------------------------------------------------------- + +void TMicSetForm::ShowErrorMessage( int errcode ) +{ + String msg; + + int errRec = LOWORD( errcode ), + errPlay = HIWORD( errcode ), + err = errRec>0 ? errRec : errPlay; + + if( err==1 ){ + msg += L"ڴռ䲻㡣"; + } + else{ + if(errRec>1 && m_cbInput->ItemsCount>0) + msg += ""; + if(errPlay>1 && m_cbOutput->ItemsCount>0) + msg += ""; + } + + if( msg.Length()==0 ) + return; + + if( err==46 ){ + msg += L"豸ռ"; + } + else if( err==37 ){ + msg += L"豸޷򿪡"; + } + else if( err==3 || err==23 ){ + msg += L"豸Ч"; + } + else{ + msg += L"豸ʧܡ"; + } + + MessageForm->ShowMessage( msg, MB_ICONERROR | MB_OK ); +} +//--------------------------------------------------------------------------- + +void __fastcall TMicSetForm::OkClick(TObject *Sender) +{ + g_iPlaybackDevice = m_iCurrPlaybackDevice; + g_iRecordDevice = m_iCurrRecordDevice; + g_iPlaybackOutput = m_iCurrOutput; + g_iRecordInput = m_iCurrInput; + + if( m_iCurrPlaybackDevice>=0 ){ + int iType = m_iCurrPlaybackDevice & 0xF0000; + vector& rDevsPb = iType==IO_DEVICE_WASAPI ? m_aWasapiPb + : iType==IO_DEVICE_ASIO ? m_aAsioPb + : m_aCommonPb; + for( int i=0; iiDevice==m_iCurrPlaybackDevice ){ + strcpy( g_strPlaybackDevice, rDevsPb[i]->name ); + break; + } + } + } + + if( m_iCurrRecordDevice>=0 ){ + int iType = m_iCurrRecordDevice & 0xF0000; + if( iType==IO_DEVICE_ASIO ){ + strcpy( g_strRecordDevice, g_strPlaybackDevice ); + } + else{ + vector& rDevsRc = iType==IO_DEVICE_WASAPI ? m_aWasapiRc + : iType==IO_DEVICE_MIDI ? m_aMidiRc + : m_aCommonRc; + + for( int i=0; iiDevice==m_iCurrRecordDevice ){ + strcpy( g_strRecordDevice, rDevsRc[i]->name ); + break; + } + } + } + } + + //״̬ + g_fRecordVolume = m_tbVolume->Position / 100.0; +// g_fRecordVolume = f_MM_GetStreamVolume( 1 ) / 100.0; + g_bRecordAutoAdjust = m_ckAuto->Checked; + g_bRecordMoniter = !(m_iCurrRecordDevice&IO_DEVICE_MIDI) && m_ckMoniter->Checked; + f_MM_SetRecordMoniter( g_bRecordMoniter ); +} +//--------------------------------------------------------------------------- + +void __fastcall TMicSetForm::UMRecordVolJust(TMessage &Message) +{ + m_tbVolume->OnChange = NULL; + m_tbVolume->Position = (int)Message.WParam; + m_tbVolume->Hint = IntToStr((int)Message.WParam); + m_tbVolume->OnChange = VolumeChange; +} +//--------------------------------------------------------------------------- + +void __fastcall TMicSetForm::AutoChange(TObject *Sender) +{ + f_MM_SetRecordAutoAdjust( m_ckAuto->Checked ); +} +//--------------------------------------------------------------------------- + +void __fastcall TMicSetForm::MoniterChange(TObject *Sender) +{ + f_MM_SetRecordMoniter( m_ckMoniter->Checked ); +} +//--------------------------------------------------------------------------- + +void __fastcall TMicSetForm::PlayDevChange(TComboBoxItem *Sender, int Index) +{ + int iNewDev = m_cbPlayDev->GetItem(Index)->Tag; + if( iNewDev==m_iCurrPlaybackDevice ) + return; + + BeginRecordTest( false ); + + int iType = (m_iCurrPlaybackDevice & 0xF0000); + int iPlayDev = iNewDev, iOutput = -1, + iRecDev = m_iCurrRecordDevice, + iInput = m_iCurrInput; + + if( !m_ckMIDI->Checked && iType==IO_DEVICE_ASIO ){ + iRecDev = iNewDev; + iInput = -1; + } + + Screen->Cursor = crHourGlass; + + HRESULT hr = f_MM_SetIODevice( iPlayDev, iOutput, iRecDev, iInput ); + + m_iCurrPlaybackDevice = iPlayDev; + m_iCurrOutput = iOutput; + m_iCurrRecordDevice = iRecDev; + m_iCurrInput = iInput; + + if( iType==IO_DEVICE_ASIO ){ + ReloadOutput(); + + if( !m_ckMIDI->Checked ){ + ReloadRecDev(); + ReloadInput(); + } + } + + if( hr==S_OK ){ + if( m_iCurrRecordDevice>=0 ) + BeginRecordTest(); + } + else + ShowErrorMessage( hr ); + + m_tbVolume->Enabled = hr==S_OK; + Screen->Cursor = crDefault; +} +//--------------------------------------------------------------------------- + +void __fastcall TMicSetForm::RecDevChange(TComboBoxItem *Sender, int Index) +{ + int iNewDev = m_cbRecDev->GetItem(Index)->Tag; + if( iNewDev==m_iCurrRecordDevice ) + return; + + BeginRecordTest( false ); + + int iPlayDev = m_iCurrPlaybackDevice, + iOutput = m_iCurrOutput, + iRecDev = iNewDev, + iInput = (iNewDev & IO_DEVICE_MIDI) ? 0 : -1; + + Screen->Cursor = crHourGlass; + + HRESULT hr = f_MM_SetIODevice( iPlayDev, iOutput, iRecDev, iInput ); + + m_iCurrPlaybackDevice = iPlayDev; + m_iCurrOutput = iOutput; + m_iCurrRecordDevice = iRecDev; + m_iCurrInput = iInput; + + ReloadInput(); + + if( hr==S_OK ){ + if( m_iCurrRecordDevice>=0 ) + BeginRecordTest(); + } + else{ + ShowErrorMessage( hr ); + } + + m_tbVolume->Enabled = hr==S_OK; + Screen->Cursor = crDefault; +} +//--------------------------------------------------------------------------- + +void __fastcall TMicSetForm::OutputChange(TComboBoxItem *Sender, int Index) +{ + if( !m_rbASIO->Checked ) + return; + + int iIndex = Index * 2; + + if( iIndex==m_iCurrOutput ) + return; + + BeginRecordTest( false ); + + int iPlayDev = m_iCurrPlaybackDevice, + iOutput = iIndex, + iRecDev = m_iCurrRecordDevice, + iInput = m_iCurrInput; + + Screen->Cursor = crHourGlass; + + HRESULT hr = f_MM_SetIODevice( iPlayDev, iOutput, iRecDev, iInput ); + + m_iCurrPlaybackDevice = iPlayDev; + m_iCurrOutput = iOutput; + m_iCurrRecordDevice = iRecDev; + m_iCurrInput = iInput; + + if( hr==S_OK ){ + if( m_iCurrRecordDevice>=0 ) + BeginRecordTest(); + } + else{ + ShowErrorMessage( hr ); + } + + m_tbVolume->Enabled = hr==S_OK; + Screen->Cursor = crDefault; +} +//--------------------------------------------------------------------------- + +void __fastcall TMicSetForm::InputChange(TComboBoxItem *Sender, int Index) +{ + if( m_rbWASAPI->Checked && !m_ckMIDI->Checked ) + return; + + int iInput = m_cbInput->DefItemIndex; + if( iInput==m_iCurrInput ) + return; + + BeginRecordTest( false ); + + int iPlayDev = m_iCurrPlaybackDevice, + iOutput = m_iCurrOutput, + iRecDev = m_iCurrRecordDevice; + + Screen->Cursor = crHourGlass; + + HRESULT hr = f_MM_SetIODevice( iPlayDev, iOutput, iRecDev, iInput ); + + m_iCurrInput = iInput; + + if( hr==S_OK ) + BeginRecordTest(); + else{ + ShowErrorMessage( hr ); + } + + m_tbVolume->Enabled = hr==S_OK; + Screen->Cursor = crDefault; +} +//--------------------------------------------------------------------------- + +void __fastcall TMicSetForm::DoShowPanel(TObject* Sender) +{ + if( m_iCurrPlaybackDevice & IO_DEVICE_ASIO ) + f_MM_ShowAsioPanel(); +} +//--------------------------------------------------------------------------- + +void __fastcall TMicSetForm::DoRestart(TObject* Sender) +{ + if( m_iCurrPlaybackDevice & IO_DEVICE_ASIO ){ + if( f_MM_RestartAsioDevice()==S_OK ){ + ReloadOutput(); + ReloadInput(); + } + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMicSetForm::MIDIInputClick(TObject *Sender) +{ + bool bMidi = m_iCurrRecordDevice>0 && (m_iCurrRecordDevice & IO_DEVICE_MIDI); + if( bMidi==m_ckMIDI->Checked ) + return; + + BeginRecordTest( false ); + + int iPlayDev = m_iCurrPlaybackDevice, + iOutput = m_iCurrOutput, + iRecDev = -1, + iInput = -1; + + if( m_ckMIDI->Checked ){ + iRecDev = m_aMidiRc[0]->iDevice; + iInput = 0; + } + else{ + int iPbType = m_iCurrPlaybackDevice & 0xF0000; + + if( iPbType==IO_DEVICE_ASIO ){ + iRecDev = iPlayDev; + } + else{ + vector& rDevsRc = iPbType==IO_DEVICE_WASAPI ? m_aWasapiRc + : m_aCommonRc; + + if( rDevsRc.empty() ){ + iRecDev = iPbType; + } + else{ + for( int i=0; iflags & DEVICE_DEFAULT ){ + iRecDev = rDevsRc[i]->iDevice; + break; + } + } + } + } + } + + Screen->Cursor = crHourGlass; + + HRESULT hr = f_MM_SetIODevice( iPlayDev, iOutput, iRecDev, iInput ); + + m_iCurrPlaybackDevice = iPlayDev; + m_iCurrOutput = iOutput; + m_iCurrRecordDevice = iRecDev; + m_iCurrInput = iInput; + + ReloadRecDev(); + ReloadInput(); + + if( hr==S_OK ){ + if( m_iCurrRecordDevice>=0 ) + BeginRecordTest(); + } + else{ + ShowErrorMessage( hr ); + } + + Screen->Cursor = crDefault; +} +//--------------------------------------------------------------------------- + +void __fastcall TMicSetForm::DevTypeClick(TObject *Sender) +{ + int iTypeOld = m_iCurrPlaybackDevice & 0xF0000; + int iType = m_rbASIO->Checked ? IO_DEVICE_ASIO + : m_rbWASAPI->Checked ? IO_DEVICE_WASAPI + : 0; + + if( iType==iTypeOld ) + return; + + BeginRecordTest( false ); + + int iPlayDev = -1, iOutput = -1, + iRecDev = -1, iInput = -1; + + if( m_ckMIDI->Checked ){ + iRecDev = m_iCurrRecordDevice; + iInput = m_iCurrInput; + } + + if( iType==IO_DEVICE_ASIO ){ + iPlayDev = m_aAsioPb[0]->iDevice; + + if( iRecDev<0 ) + iRecDev = iPlayDev; + } + else{ + vector& rDevsPb = iType==IO_DEVICE_WASAPI ? m_aWasapiPb + : iType==IO_DEVICE_ASIO ? m_aAsioPb + : m_aCommonPb; + for( int i=0; iflags & DEVICE_DEFAULT ){ + iPlayDev = rDevsPb[i]->iDevice; + break; + } + } + + if( iRecDev<0 ){ + vector& rDevsRc = iType==IO_DEVICE_WASAPI ? m_aWasapiRc + : m_aCommonRc; + + for( int i=0; iflags & DEVICE_DEFAULT ){ + iRecDev = rDevsRc[i]->iDevice; + break; + } + } + } + } + + Screen->Cursor = crHourGlass; + + m_iCurrPlaybackDevice = iPlayDev; + m_iCurrOutput = iOutput; + + HRESULT hr = f_MM_SetIODevice( iPlayDev, iOutput, iRecDev, iInput ); + + if( iPlayDev>=0 ){ + m_iCurrPlaybackDevice = iPlayDev; + m_iCurrOutput = iOutput; + } + + m_iCurrRecordDevice = iRecDev; + m_iCurrInput = iInput; + + ReloadPlayDev(); + ReloadOutput(); + + ReloadRecDev(); + ReloadInput(); + + if( hr==S_OK ){ + if( m_cbInput->Enabled ) + BeginRecordTest(); + } + else + ShowErrorMessage( hr ); + + Screen->Cursor = crDefault; +} +//--------------------------------------------------------------------------- + +void __fastcall TMicSetForm::ASIOClick(TObject *Sender) +{ + if( m_PopupMenu ){ + delete m_PopupMenu; + m_PopupMenu = NULL; + } + + m_PopupMenu = new TMenuPanel(); + m_PopupMenu->Parent = this; + + m_PopupMenu->CreateMenu( "ʾ", "", DoShowPanel ); + m_PopupMenu->CreateMenu( "豸", "", DoRestart ); + + m_PopupMenu->Width = m_lblASIO->Width; + m_PopupMenu->Show( m_lblASIO->Left, m_lblASIO->Top+m_lblASIO->Height ); +} +//--------------------------------------------------------------------------- + + diff --git a/MicSetFormUnit.dfm b/MicSetFormUnit.dfm new file mode 100644 index 0000000..d21105d --- /dev/null +++ b/MicSetFormUnit.dfm @@ -0,0 +1,396 @@ +object MicSetForm: TMicSetForm + Left = 0 + Top = 0 + BorderStyle = bsNone + Caption = 'MicSetForm' + ClientHeight = 324 + ClientWidth = 382 + Color = 5064257 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + Position = poMainFormCenter + Scaled = False + OnClose = FormClose + OnCreate = FormCreate + OnKeyDown = FormKeyDown + TextHeight = 14 + object m_panGeneral: TGeneralDialogPanel + Left = 0 + Top = 0 + Width = 382 + Height = 324 + Align = alClient + Caption = #38899#39057#35774#22791#35774#32622 + Color = 5064257 + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentBackground = False + ParentDoubleBuffered = False + ParentFont = False + TabOrder = 0 + object m_cbOutput: TComboBoxComponent + Left = 89 + Top = 117 + Width = 161 + Height = 25 + ParentShowHint = False + ShowHint = True + OnChange = OutputChange + ShowItemCount = 5 + Parent = m_panGeneral + end + object m_lblASIO: TLabel + Left = 250 + Top = 117 + Width = 101 + Height = 25 + Cursor = crHandPoint + Alignment = taCenter + AutoSize = False + Caption = 'ASIO'#35774#22791 + Font.Charset = DEFAULT_CHARSET + Font.Color = clAqua + Font.Height = -13 + Font.Name = 'Tahoma' + Font.Style = [fsBold, fsItalic] + ParentFont = False + Transparent = False + Layout = tlCenter + OnClick = ASIOClick + end + object m_lblVolume: TLabel + Left = 27 + Top = 238 + Width = 60 + Height = 14 + Caption = #24405#38899#38899#37327#65306 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object m_lblPlayback: TLabel + Left = 27 + Top = 83 + Width = 60 + Height = 14 + Caption = #25773#25918#35774#22791#65306 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object m_lblInput: TLabel + Left = 27 + Top = 199 + Width = 60 + Height = 14 + Caption = #24405#38899#36755#20837#65306 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentColor = False + ParentFont = False + Transparent = True + end + object m_lblLatencyTime: TLabel + Left = 291 + Top = 200 + Width = 60 + Height = 14 + ParentCustomHint = False + Alignment = taRightJustify + AutoSize = False + Caption = '---- ms' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentColor = False + ParentFont = False + ParentShowHint = False + ShowAccelChar = False + ShowHint = False + Layout = tlCenter + end + object m_lblHint: TLabel + Left = 27 + Top = 278 + Width = 36 + Height = 14 + Caption = #25552#31034#65306 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object m_lblHintMsg: TLabel + Left = 72 + Top = 278 + Width = 108 + Height = 28 + Caption = #35831#23545#30528#40614#20811#39118#21756#21809#65292#36827#34892#35797#21548#27979#35797#12290 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + WordWrap = True + end + object m_lblLatency: TLabel + Left = 266 + Top = 199 + Width = 28 + Height = 14 + Caption = #24310#36831':' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object m_cbPlayDev: TComboBoxComponent + Left = 89 + Top = 79 + Width = 262 + Height = 25 + ParentShowHint = False + ShowHint = True + OnChange = PlayDevChange + ShowItemCount = 5 + Parent = m_panGeneral + end + object m_cbInput: TComboBoxComponent + Left = 89 + Top = 194 + Width = 161 + Height = 25 + ParentShowHint = False + ShowHint = True + OnChange = InputChange + ShowItemCount = 5 + Parent = m_panGeneral + end + object m_btnOk: TTextButton + Left = 236 + Top = 278 + Width = 54 + Height = 25 + ModalResult = mrOk + ParentShowHint = False + ShowHint = True + OnClick = OkClick + Text = #30830#23450 + end + object m_btnCanel: TTextButton + Left = 299 + Top = 278 + Width = 54 + Height = 25 + ModalResult = mrCancel + ParentShowHint = False + ShowHint = True + Text = #21462#28040 + end + object m_lblOutput: TLabel + Left = 27 + Top = 122 + Width = 60 + Height = 14 + Caption = #25773#25918#36755#20986#65306 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object m_lblRecord: TLabel + Left = 27 + Top = 159 + Width = 60 + Height = 14 + Caption = #24405#38899#35774#22791#65306 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object m_cbRecDev: TComboBoxComponent + Left = 89 + Top = 155 + Width = 262 + Height = 25 + ParentShowHint = False + ShowHint = True + OnChange = RecDevChange + ShowItemCount = 5 + Parent = m_panGeneral + end + object m_lblType: TLabel + Left = 27 + Top = 44 + Width = 60 + Height = 14 + Caption = #35774#22791#31867#22411#65306 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object m_ckAuto: TCKBox + Left = 241 + Top = 236 + Width = 54 + Height = 18 + Caption = #33258#21160 + Ctl3D = False + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = 12429980 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentColor = True + ParentCtl3D = False + ParentDoubleBuffered = False + ParentFont = False + TabOrder = 0 + BoxColor = 3157548 + OnChange = AutoChange + end + object m_ckMoniter: TCKBox + Left = 301 + Top = 236 + Width = 52 + Height = 18 + Caption = #30417#21548 + Ctl3D = False + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = 12429980 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentColor = True + ParentCtl3D = False + ParentDoubleBuffered = False + ParentFont = False + TabOrder = 1 + BoxColor = 3157548 + OnChange = MoniterChange + end + object m_tbVolume: TSkinTrackBar + Tag = 1 + Left = 89 + Top = 237 + Width = 142 + Height = 19 + Hint = '100' + Caption = 'm_tbVolume' + FullRepaint = False + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentColor = True + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 2 + Position = 100 + end + object m_rbCommon: TRadioBtn + Left = 91 + Top = 39 + Width = 51 + Height = 25 + Caption = #24120#35268 + Font.Charset = DEFAULT_CHARSET + Font.Color = 12429980 + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 3 + OnClick = DevTypeClick + end + object m_rbASIO: TRadioBtn + Left = 148 + Top = 39 + Width = 51 + Height = 25 + Caption = 'ASIO' + Font.Charset = DEFAULT_CHARSET + Font.Color = 12429980 + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 4 + OnClick = DevTypeClick + end + object m_rbWASAPI: TRadioBtn + Left = 205 + Top = 39 + Width = 68 + Height = 25 + Caption = 'WASAPI' + Font.Charset = DEFAULT_CHARSET + Font.Color = 12429980 + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 5 + OnClick = DevTypeClick + end + object m_ckMIDI: TCKBox + Left = 279 + Top = 43 + Width = 71 + Height = 18 + Caption = 'MIDI'#36755#20837 + Ctl3D = False + DoubleBuffered = False + FullRepaint = False + Font.Charset = DEFAULT_CHARSET + Font.Color = 12429980 + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentColor = True + ParentCtl3D = False + ParentDoubleBuffered = False + ParentFont = False + TabOrder = 6 + OnClick = MIDIInputClick + BoxColor = 3157548 + end + end +end diff --git a/MicSetFormUnit.h b/MicSetFormUnit.h new file mode 100644 index 0000000..3859a2e --- /dev/null +++ b/MicSetFormUnit.h @@ -0,0 +1,120 @@ +//--------------------------------------------------------------------------- + +#ifndef MicSetFormUnitH +#define MicSetFormUnitH +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include +#include + +#include "GeneralDialogPanel.h" +#include "GlobalUnit.h" +#include "CapButton.h" +#include "ComboBoxComponent.h" +#include "MessageDef.h" +#include "SkinTrackBar.h" +#include "TextButton.h" +#include "CKBox.h" +#include "MenuUnit.h" +#include "RadioBtn.h" + + +typedef struct tagDeviceInfo{ + int iDevice; + char name[256]; // description + DWORD flags; + + tagDeviceInfo(){ + memset( this, 0, sizeof(tagDeviceInfo) ); + } + + tagDeviceInfo( tagDeviceInfo* src ){ + memcpy( this, src, sizeof(tagDeviceInfo) ); + } +} IO_DEVICE_INFO; + +//--------------------------------------------------------------------------- +class TMicSetForm : public TForm +{ +__published: // IDE-managed Components + TGeneralDialogPanel *m_panGeneral; + TLabel *m_lblVolume; + TLabel *m_lblPlayback; + TLabel *m_lblInput; + TLabel *m_lblLatencyTime; + TLabel *m_lblHint; + TLabel *m_lblHintMsg; + TLabel *m_lblLatency; + TComboBoxComponent *m_cbPlayDev; + TComboBoxComponent *m_cbOutput; + TComboBoxComponent *m_cbRecDev; + TComboBoxComponent *m_cbInput; + TTextButton *m_btnOk; + TTextButton *m_btnCanel; + TCKBox *m_ckAuto; + TCKBox *m_ckMoniter; + TSkinTrackBar *m_tbVolume; + TLabel *m_lblOutput; + TLabel *m_lblASIO; + TLabel *m_lblRecord; + TLabel *m_lblType; + TRadioBtn *m_rbCommon; + TRadioBtn *m_rbASIO; + TRadioBtn *m_rbWASAPI; + TCKBox *m_ckMIDI; + + void __fastcall VolumeChange(TObject *Sender); + void __fastcall FormCreate(TObject *Sender); + void __fastcall OkClick(TObject *Sender); + void __fastcall FormClose(TObject *Sender, TCloseAction &Action); + void __fastcall AutoChange(TObject *Sender); + void __fastcall MoniterChange(TObject *Sender); + void __fastcall FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift); + void __fastcall PlayDevChange(TComboBoxItem *Sender, int Index); + void __fastcall InputChange(TComboBoxItem *Sender, int Index); + void __fastcall OutputChange(TComboBoxItem *Sender, int Index); + void __fastcall RecDevChange(TComboBoxItem *Sender, int Index); + void __fastcall MIDIInputClick(TObject *Sender); + void __fastcall DevTypeClick(TObject *Sender); + void __fastcall ASIOClick(TObject *Sender); + + +private: // User declarations + TTimer *m_pTimerLatency; //Timer + + TMenuPanel *m_PopupMenu; //˵ + + int m_iCurrPlaybackDevice, m_iCurrOutput, + m_iCurrRecordDevice, m_iCurrInput; + vector m_aCommonPb, m_aCommonRc, + m_aWasapiPb, m_aWasapiRc, + m_aAsioPb, m_aMidiRc; + + void ReloadPlayDev(); + void ReloadRecDev(); + void ReloadOutput(); + void ReloadInput(); + void BeginRecordTest(bool bStart=true); + void ShowErrorMessage( int err ); + + void __fastcall DoShowPanel(TObject* Sender); + void __fastcall DoRestart(TObject* Sender); + void __fastcall LatencyTimerProc(TObject* Sender); //Timerص + void __fastcall PanelClick(String Sender,int PanelType,int MenuType); + + MESSAGE void __fastcall UMRecordVolJust(TMessage &Message); + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(MSG_RECORD_VOLJUST, TMessage, UMRecordVolJust) + END_MESSAGE_MAP(TForm) + +public: // User declarations + + __fastcall TMicSetForm(TComponent* Owner); +}; +//--------------------------------------------------------------------------- +extern PACKAGE TMicSetForm *MicSetForm; +//--------------------------------------------------------------------------- +#endif diff --git a/MidiTrack.cpp b/MidiTrack.cpp new file mode 100644 index 0000000..59ff8f1 --- /dev/null +++ b/MidiTrack.cpp @@ -0,0 +1,571 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop + +#include "GlobalUnit.h" +#include "Compose.h" +#include "MidiTrack.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) + +/***************************************************************************************/ +// ȫֱ +/***************************************************************************************/ +TMidi g_Midi; //MIDI +TMidiTrackList& g_aMidiTracks = g_Midi.MidiTrackList(); //MIDIб +int g_iSelMidiTrack = -1; //ǰMIDI + +/***************************************************************************************/ +// Midiຯ +void TMidi::ClearMidiTracks() +{ + ClearMidiTrackNotes(); + + while( !m_lstMidiTracks.empty() ){ + delete m_lstMidiTracks.back(); + m_lstMidiTracks.pop_back(); + } + + while( !m_aChnoUsed.empty() ){ + delete m_aChnoUsed.back(); + m_aChnoUsed.pop_back(); + } + + m_nMidiFile = 0; +} +//--------------------------------------------------------------------------- + +void TMidi::ClearMidiTrackNotes() +{ + for( int i=0; iaNotes.empty() ){ + delete pTrack->aNotes.back(); + pTrack->aNotes.pop_back(); + } + + pTrack->ptMin = 0xFF; + pTrack->ptMax = 0; + } +} +//--------------------------------------------------------------------------- + +TMidiTrack* TMidi::FindMidiTrack( BYTE file, BYTE chno ) +{ + for( int i=0; ifile==file && m_lstMidiTracks[i]->chno==chno ){ + return m_lstMidiTracks[i]; + } + } + + return NULL; +} +//--------------------------------------------------------------------------- + +int TMidi::GetMidiTrackIndex( BYTE file, BYTE chno ) +{ + for( int i=0; ifile==file + && m_lstMidiTracks[i]->chno==chno ){ + return i; + } + } + + return -1; +} +//--------------------------------------------------------------------------- + +void TMidi::SortMidiTracks() +{ +/* ClearMidiTracks(); + + if( !g_pUseStyle ) + return; + + TStyleItem* pStyleItem = g_pUseStyle; +*/ + for( int i=0; iaTracks.size(); j++ ){ + TTrack* pTrk = pStage->aTracks[j]; + +// BYTE ch = ( pTrk->iBank==0xFF || pTrk->iBank<0x80 ) ? pTrk->iChanNo +// : pTrk->iChanSpec; + + TMidiTrack* pMT = GetValidMidiTrack( i, pTrk->iFile, pTrk->iChanSpec, + pTrk->iBank, pTrk->iProg ); + + if( pTrk->iChanSpec!=pMT->chno || pTrk->iFile!=pMT->file ){ + pTrk->iFile = pMT->file; + pTrk->iChanSpec = pMT->chno; + } + } + } + +#ifdef _DEBUG + for( int k=0; kbank, pChannel->chno, pChannel->prog ); + AnsiString strStages = " stages:"; + for( int m=0; maStages.size(); m++ ){ + strStages += " "; + strStages += IntToStr( pChannel->aStages[m] ); + } + + DebugPrint( "%s\n", strStages.c_str() ); + } + + for( int m=0; mbank ); + + strStages += " used:"; + + for( int n=0; n<16; n++ ){ + if( m_aChnoUsed[m]->chno & (1<file==file && pChUs->bank==bank ){ + pCU = pChUs; + break; + } + } + + if( !pCU ){ + pCU = new TChnoUsed( bank, file ); + AddChnoUsed( pCU ); + } + + return pCU; +} +//--------------------------------------------------------------------------- + +BYTE TMidi::GetValidFile( BYTE bank, BYTE chno ) +{ + WORD ch = ( 1<bank==bank && !(pChUs->chno & ch) ){ + pCU = pChUs; + break; + } + } + + if( !pCU ){ + pCU = new TChnoUsed( bank, m_nMidiFile++ ); + AddChnoUsed( pCU ); + } + + pCU->chno |= ch; + return pCU->file; +} +//--------------------------------------------------------------------------- + +TMidiTrack* TMidi::GetValidMidiTrack( int iStage, BYTE file, BYTE chno, BYTE bank, BYTE prog ) +{ + vector aStages; + aStages.push_back( iStage ); + + return GetValidMidiTrack( aStages, file, chno, bank, prog ); +} +//--------------------------------------------------------------------------- + +TMidiTrack* TMidi::GetValidMidiTrack( vector& lstStages, BYTE file, BYTE chno, BYTE bank, BYTE prog ) +{ + TMidiTrack* pMidiTrack = NULL; + vector aValidTracks; + bool bVSTi = bank!=0xFF && bank>=0x80; + + if( file!=0xFF ){ + TMidiTrack* pMT = FindMidiTrack( file, chno ); + + if( !pMT ){ + pMidiTrack = new TMidiTrack( bank, chno, prog, file ); + AddMidiTrack( pMidiTrack ); + + goto EXIT_LINE; + } + else if( pMT->bank==bank && (!bVSTi && ( pMT->chno==9 && chno==9 + || pMT->chno!=9 && chno!=9 + && pMT->prog==prog ) //GMĹͨͬbankprog + || bVSTi && pMT->chno==chno ) //VSTiͨͬ + && pMT->ValidStages( lstStages ) ){ + pMidiTrack = pMT; + + goto EXIT_LINE; + } + } + + for( int i=0; ibank && (!bVSTi && ( pMT->chno==9 && chno==9 + || pMT->chno!=9 && chno!=9 + && pMT->prog==prog ) //GMĹͨͬbankprog + || bVSTi && pMT->chno==chno ) //VSTiͨͬ + && pMT->ValidStages( lstStages ) ){ + pMidiTrack = pMT; + + goto EXIT_LINE; + } + } + + //δҵЧMidiTrack½ + for( int i=0; ibank==bank ){ + TChnoUsed* pCU = m_aChnoUsed[i]; + + if( bVSTi && ( pCU->chno & (1<chno & 0x200) || chno!=9 && (pCU->chno & 0xFDFF)!=0xFDFF ){ + if( pCU->chno & (1<chno & (1<file ); + AddMidiTrack( pMidiTrack ); + + goto EXIT_LINE; + } + } + } + +EXIT_LINE: + if( !pMidiTrack ){ + pMidiTrack = new TMidiTrack( bank, chno, prog, m_nMidiFile++ ); + AddMidiTrack( pMidiTrack ); + } + + for( int i=0; iAddStage( lstStages[i] ); + } + + return pMidiTrack; +} +//--------------------------------------------------------------------------- + +void TMidi::AddMidiTrack( TMidiTrack* pCh, int iInd ) +{ + if( iInd>=0 && iIndfile ) + m_nMidiFile = pCh->file+1; + + TChnoUsed* pCU = GetChnoUsed( pCh->file, pCh->bank ); + pCU->chno |= ( 1 << pCh->chno ); +} +//--------------------------------------------------------------------------- + +void TMidi::AddChnoUsed( TChnoUsed* pCU ) +{ + int m = 0; + for( ; mbank > (char)pCU->bank ){ + m_aChnoUsed.insert( m_aChnoUsed.begin()+m, pCU ); + break; + } + } + + if( m==m_aChnoUsed.size() ) + m_aChnoUsed.push_back( pCU ); +} +//--------------------------------------------------------------------------- + +void TMidi::DeleteMidiTrack( TMidiTrack* pCh ) +{ + for( int i=0; ifile, pCh->bank ); + pCU->chno &= ~( 1 << pCh->chno ); + if( pCU->chno==0 ) + DeleteChnoUsed( pCU ); + + delete pCh; + m_lstMidiTracks.erase( m_lstMidiTracks.begin() + i ); + + break; + } + } +} +//--------------------------------------------------------------------------- + +void TMidi::DeleteChnoUsed( TChnoUsed* pCU ) +{ + for( int i=0; iaStages.size()-1; j>=0; j-- ){ + if( pMT->aStages[j]>iStage ) + pMT->aStages[j]++; + else if( pMT->aStages[j]==iStage ){ + pMT->aStages.insert( pMT->aStages.begin()+j+1, iStage+1 ); + break; + } + else + break; + } + } +} +//--------------------------------------------------------------------------- + +void TMidi::InsertStage( int iStage ) +{ + for( int i=0; iaStages.size()-1; j>=0; j-- ){ + if( pMT->aStages[j]>=iStage ) + pMT->aStages[j]++; + else + break; + } + } +} +//--------------------------------------------------------------------------- + +void TMidi::RemoveStage( int iStage, bool bSort ) +{ + for( int i=0; iaStages.size()-1; j>=0; j-- ){ + if( pMT->aStages[j]>iStage ){ + if( bSort ) + pMT->aStages[j]--; + } + else if( pMT->aStages[j]==iStage ) + pMT->aStages.erase( pMT->aStages.begin()+j ); + else + break; + } + } +} +//--------------------------------------------------------------------------- + +int TMidi::ClearEmptyTrack() +{ + int iFirstEmpty = -1; + + for( int i=m_lstMidiTracks.size()-1; i>=0; i-- ){ + if( m_lstMidiTracks[i]->aStages.empty() ){ + TMidiTrack* pMT = m_lstMidiTracks[i]; + TChnoUsed* pCU = GetChnoUsed( pMT->file, pMT->bank ); + pCU->chno &= ~( 1 << pMT->chno ); + if( pCU->chno==0 ) + DeleteChnoUsed( pCU ); + + delete pMT; + m_lstMidiTracks.erase( m_lstMidiTracks.begin() + i ); + + iFirstEmpty = i; + } + } + + return iFirstEmpty; +} +//--------------------------------------------------------------------------- + +void TMidi::ChangMidiChno( int iMT, BYTE fiNew, BYTE chNew ) +{ + TMidiTrack* pMT = m_lstMidiTracks[iMT]; + + for( int i=0; iaStages.size(); i++ ){ + TOpusStage* pStage = g_lstOpusStages[pMT->aStages[i]]; + for( int j=0; jaTracks.size(); j++ ){ + TTrack* pTrack = pStage->aTracks[j]; + if( pTrack->iFile==pMT->file && pTrack->iChanSpec==pMT->chno ){ + pTrack->iFile = fiNew; + pTrack->iChanSpec = chNew; + break; + } + } + } + + TChnoUsed* pCU = g_Midi.GetChnoUsed( pMT->file, pMT->bank ); + pCU->chno &= ~( 1 << pMT->chno ); + pMT->file = fiNew; + pMT->chno = chNew; +} +//--------------------------------------------------------------------------- + +void TMidi::ChangeNotesVolume( int iMT, int iSBar, int iEBar, BYTE volume ) +{ + TMidiTrack* pMT = m_lstMidiTracks[iMT]; + int iTickS = iSBar * POINTS_PER_BAR, + iTickE = iEBar * POINTS_PER_BAR; + + for( int i=0; iaNotes.size(); i++ ){ + TMidiNote* pNote = pMT->aNotes[i]; + if( pNote->tkOn < pNote->tkOff && pNote->tkOn < iTickE && pNote->tkOff > iTickS ){ + pNote->volume = volume; + } + } +} +//--------------------------------------------------------------------------- + +TColor u_clrNote[64]; +void TMidi::InitNoteColor() +{ + int clrSeed[2][3] = {{52,101,100},{162,180,180}}; + + int r0 = clrSeed[0][0], + r1 = clrSeed[1][0], + g0 = clrSeed[0][1], + g1 = clrSeed[1][1], + b0 = clrSeed[0][2], + b1 = clrSeed[1][2]; + double dR = (r1-r0) / 64.0, + dG = (g1-g0) / 64.0, + dB = (b1-b0) / 64.0; + + u_clrNote[63] = RGB( r0, g0, b0 ); + + for (int i=62; i>0; i--){ + r0 += dR; + g0 += dG; + b0 += dB; + + u_clrNote[i] = RGB( r0, g0, b0 ); + } + + u_clrNote[0] = RGB( r1, g1, b1 ); +} +//--------------------------------------------------------------------------- + +TColor TMidi::GetNoteColor( int vol ) +{ + return u_clrNote[vol>>1]; +} +//--------------------------------------------------------------------------- + +void TMidi::GetSpecBanks( vector& lstBank ) +{ + for( int i=0; ibank!=0xFF ){ + bool bAdd = true; + + for( int b=0; bbank==lstBank[b] ){ + bAdd = false; + break; + } + } + + if( bAdd ) + lstBank.push_back( pMT->bank ); + } + } +} +//--------------------------------------------------------------------------- + +void TMidi::SetSpecBanks( BANKMAPLIST& lstMap ) +{ + for( int i=0; ibank!=0xFF ){ + for( int b=0; bbank==pMap->iBankOld ){ + pMT->bank = pMap->iBankNew; + break; + } + } + } + } +} +//--------------------------------------------------------------------------- + +void TMidi::WriteProj( FILE* pFile ) +{ + int num = m_lstMidiTracks.size(); + fwrite( &num, sizeof(int), 1, pFile ); + + for( int i=0; istate, sizeof(BYTE), 1, pFile ); + fwrite( &pMT->volume, sizeof(BYTE), 1, pFile ); + fwrite( &pMT->pan, sizeof(char), 1, pFile ); + fwrite( &pMT->gain, sizeof(char), 1, pFile ); + + fwrite( &pMT->bank, sizeof(BYTE), 1, pFile ); + fwrite( &pMT->chno, sizeof(BYTE), 1, pFile ); + fwrite( &pMT->prog, sizeof(BYTE), 1, pFile ); + fwrite( &pMT->file, sizeof(BYTE), 1, pFile ); + } +} +// --------------------------------------------------------------------------- + +int TMidi::ReadProj( FILE* pFile, DWORD dwVersion ) +{ + int num = 0; + fread( &num, sizeof(int), 1, pFile ); + + for( int i=0; istate, sizeof(BYTE), 1, pFile ); + fread( &pMT->volume, sizeof(BYTE), 1, pFile ); + fread( &pMT->pan, sizeof(char), 1, pFile ); + fread( &pMT->gain, sizeof(char), 1, pFile ); + + fread( &pMT->bank, sizeof(BYTE), 1, pFile ); + fread( &pMT->chno, sizeof(BYTE), 1, pFile ); + fread( &pMT->prog, sizeof(BYTE), 1, pFile ); + fread( &pMT->file, sizeof(BYTE), 1, pFile ); + + AddMidiTrack( pMT ); + } + + return 0; +} +// --------------------------------------------------------------------------- + diff --git a/MidiTrack.h b/MidiTrack.h new file mode 100644 index 0000000..0b3f412 --- /dev/null +++ b/MidiTrack.h @@ -0,0 +1,215 @@ +//--------------------------------------------------------------------------- + +#ifndef MidiTrackH +#define MidiTrackH +//--------------------------------------------------------------------------- +#include +#include "ProCommon.h" +using namespace std; +#include "StyleItem.h" +#include "BaseTrack.h" + +/***************************************************************************************/ +// TMidi +typedef struct tagMidiNote{ + BYTE pitch, // + velocity, // + volume, // + rsvd; + int tkOn, tkOff; + + tagMidiNote( BYTE pt, BYTE vel, BYTE vol, DWORD on ) + { + pitch = pt; + velocity = vel; + volume = vol; + tkOn = on; + tkOff = -1; + + }; +} TMidiNote; + +class TMidiTrack : public TBaseTrack +{ +public: + BYTE bank; //Դ 0xFF=ȫSF2otherΪָԴ + BYTE chno; //ͨ + BYTE prog; // + BYTE file; //ļ 16ֵ + + BYTE ptMin, ptMax; //Χ + + vector aStages; + vector aNotes; + + TMidiTrack() : TBaseTrack() + { + bank = chno = prog = file = 0xFF; + }; + + TMidiTrack( BYTE bk, BYTE ch, BYTE pr, BYTE fi=0 ) : TBaseTrack() + { + bank = bk; + chno = ch; + prog = pr; + file = fi; + + ptMin = 0xFF; + ptMax = 0; + }; + + TMidiTrack( TMidiTrack* pSrc ) : TBaseTrack( pSrc->state, pSrc->volume, pSrc->pan, pSrc->gain ) + { + bank = pSrc->bank; + chno = pSrc->chno; + prog = pSrc->prog; + file = pSrc->file; + + ptMin = 0xFF; + ptMax = 0; + } + + void AddStage( int iStage ) + { + if( aStages.empty() ) + aStages.push_back( iStage ); + else{ + for( int i=aStages.size()-1; i>=0; i-- ){ + if( aStages[i]=aStages.size() ) + aStages.push_back( iStage ); + else + aStages.insert( aStages.begin()+i+1, iStage ); + + break; + } + + if( aStages[i]==iStage ) + break; + + if( i==0 ){ + aStages.insert( aStages.begin(), iStage ); + break; + } + } + } + }; + + void DelStage( int iStage ) + { + for( int i=0; iiStage ) + break; + + if( aStages[i]==iStage ){ + aStages.erase( aStages.begin() + i ); + break; + } + } + }; + + bool ValidStages( vector& lstStages ) // + { + bool bValid = true; + vector::iterator iter1 = aStages.begin(), + iter2 = lstStages.begin(); + while( iter1!=aStages.end() && iter2!=lstStages.end() ){ + if( *iter1 < *iter2 ) + iter1++; + else if( *iter1 > *iter2 ) + iter2++; + else{ + bValid = false; + break; + } + } + + return bValid; + }; + + bool IsDrum() + { + if( !aStages.empty() ){ + TOpusStage* pStage = g_lstOpusStages[aStages[0]]; + for( int i=0; iaTracks.size(); i++ ){ + TTrack* pTrack = pStage->aTracks[i]; + if( pTrack->iFile==file && pTrack->iChanSpec==chno && pTrack->iChanNo==9 ) + return true; + } + } + + return false; + } +}; + +typedef struct tagChnoUsed +{ + WORD chno; //ͨŰλռ + BYTE file; //ļ 16ֵ + BYTE bank; //Դ 0xFF=ȫSF2otherΪָԴ + + tagChnoUsed( BYTE bk, BYTE fi=0 ) + { + bank = bk; + file = fi; + chno = 0; + } +} TChnoUsed, *PTChnoUsed; + +typedef vector TMidiTrackList; + +class TMidi +{ +private: + TMidiTrackList m_lstMidiTracks; //MIDIб + vector m_aChnoUsed; + int m_nMidiFile; + + +public: + TMidi(){m_nMidiFile = 0;}; + ~TMidi(){ClearMidiTracks();}; + + TMidiTrackList& MidiTrackList() { return m_lstMidiTracks; }; + bool IsEmpty() { return m_lstMidiTracks.empty(); }; + void ClearMidiTracks(); + void ClearMidiTrackNotes(); + int ClearEmptyTrack(); + + void SortMidiTracks(); //channel + + int GetMidiTrackIndex( BYTE file, BYTE chno ); + TMidiTrack* FindMidiTrack( BYTE file, BYTE chno ); + TMidiTrack* GetValidMidiTrack( vector& lstStages, BYTE file, BYTE chno, BYTE bank, BYTE prog ); + TMidiTrack* GetValidMidiTrack( int iStage, BYTE file, BYTE chno, BYTE bank, BYTE prog ); + + void CutStage( int iStage ); //ָ + void InsertStage( int iStage ); //ն + void RemoveStage( int iStage, bool bSort ); //ɾ bSort= + + TChnoUsed* GetChnoUsed( BYTE file, BYTE bank ); + void AddMidiTrack( TMidiTrack* pCh, int iInd=-1 ); + void AddChnoUsed( TChnoUsed* pCU ); + void DeleteMidiTrack( TMidiTrack* pCh ); + void DeleteChnoUsed( TChnoUsed* pCU ); + BYTE GetValidFile( BYTE bank, BYTE chno ); + void ChangMidiChno( int iMT, BYTE fiNew, BYTE chNew ); + + void InitNoteColor(); + TColor GetNoteColor( int vol ); + void ChangeNotesVolume( int iMT, int iSBar, int iEBar, BYTE volume ); + + void GetSpecBanks( vector& lstBank ); + void SetSpecBanks( BANKMAPLIST& lstMap ); + void WriteProj( FILE* pFile ); + int ReadProj( FILE* pFile, DWORD dwVersion ); +}; + +/***************************************************************************************/ +// ȫֱ +/***************************************************************************************/ +extern TMidi g_Midi; //MIDI +extern TMidiTrackList& g_aMidiTracks; //MIDIб +extern int g_iSelMidiTrack; //ǰMIDI + +#endif diff --git a/MultiSwitchProgFormUnit.cpp b/MultiSwitchProgFormUnit.cpp new file mode 100644 index 0000000..06c11b7 --- /dev/null +++ b/MultiSwitchProgFormUnit.cpp @@ -0,0 +1,406 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop + +#include "MultiSwitchProgFormUnit.h" +#include "GlobalUnit.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma link "PNGButton" +#pragma link "GeneralDialogPanel" +#pragma link "TextButton" +#pragma resource "*.dfm" +TMultiSwitchProgForm *MultiSwitchProgForm; +//--------------------------------------------------------------------------- +__fastcall TMultiSwitchProgForm::TMultiSwitchProgForm(TComponent* Owner, TCommonItem *pItem) + : TForm(Owner) +{ + m_pItem = pItem; + + mData = new TList(); + ItemChange = new TList(); + mCurrentItem = NULL; + + if( pItem->iType==SEGTYPE_STYLE || pItem->iType==SEGTYPE_TRACK ){ + InitProgListPanel(); + InitInsTypePanel(); + InitInsPanel(); + + if( pItem->iType==SEGTYPE_TRACK ){ + GeneralDialogPanel->Caption = L"ɫ/"; + } + } + + SetTransparent( this ); +} +//--------------------------------------------------------------------------- +__fastcall TMultiSwitchProgForm::~TMultiSwitchProgForm() +{ + if(mData) { + mData->Clear(); + delete mData; + mData = NULL; + } + + if(ItemChange) { + ItemChange->Clear(); + delete ItemChange; + ItemChange = NULL; + } +} +//--------------------------------------------------------------------------- +void __fastcall TMultiSwitchProgForm::InitProgListPanel() +{ + if( m_pItem->iType==SEGTYPE_STYLE ){ + for(int i = 0; i < m_pItem->aItems->Count; i++) { + TSegmentItem *SegItem = (TSegmentItem *)m_pItem->aItems->Items[i]; + + for(int c = 0; c < SegItem->aItems->Count; c++) { + TTrackItem *TrackItem = (TTrackItem *) SegItem->aItems->Items[c]; + char prog = TrackItem->pTrack->iProg,// >progCurr, + chan = TrackItem->pTrack->iChanNo; + + ProgListData *progData = CheckData( chan, prog ); + + if(!progData) { + String strInst = chan==9 ? "GM" : GM_INSTRUMENT[prog]; + progData = new ProgListData( strInst, prog, chan ); + if( progData->Channel==9 ) + mData->Insert( 0, progData ); + else + mData->Add(progData); + } + + String strText = g_strSegment[SegItem->iType]; + strText += String("-") + (int)(SegItem->iInd+1); + + if( SegItem->iSegType>=SEGTYPE_INTRO ){ + if( SegItem->iSegNo<4 ) + strText += " " ; + else + strText += " С" ; + } + + progData->List->Add(new ProgItemData( strText, TrackItem)); + } + } + } + else{ + TTrackItem *TrackItem = (TTrackItem *) m_pItem; + TSegmentItem *SegItem = (TSegmentItem *)m_pItem->up; + + char prog = TrackItem->pTrack->iProg,// >progCurr, + chan = TrackItem->pTrack->iChanNo; + + ProgListData *progData = CheckData( chan, prog ); + + if(!progData) { + String strInst = chan==9 ? "GM" : GM_INSTRUMENT[prog]; + progData = new ProgListData( strInst, prog, chan ); + if( progData->Channel==9 ) + mData->Insert( 0, progData ); + else + mData->Add(progData); + } + + String strText = g_strSegment[SegItem->iType]; + strText += String("-") + (int)(SegItem->iInd+1); + + if( SegItem->iSegType>=SEGTYPE_INTRO ){ + if( SegItem->iSegNo<4 ) + strText += " " ; + else + strText += " С" ; + } + + progData->List->Add(new ProgItemData( strText, TrackItem)); + } + + mProgListPanel = new TProgHandlePanel(this); + mProgListPanel->Width = 160; + mProgListPanel->Height = 225; + mProgListPanel->Top = m_ShapeCur->Top+m_ShapeCur->Height-1; + mProgListPanel->Left = 15; + mProgListPanel->Parent = this; + mProgListPanel->OnSelectedItem = DoProListSelect; + mProgListPanel->SetTextFont(g_strTxtFontName, g_szFont9); + + m_ShapeCur->Left = mProgListPanel->Left; + m_ShapeCur->Width = mProgListPanel->Width; + m_lbCurProg->Left = m_ShapeCur->Left+(m_ShapeCur->Width-m_lbCurProg->Width)/2; + m_lbCurProg->Top = m_ShapeCur->Top+(m_ShapeCur->Height-m_lbCurProg->Height)/2; + + for(int i = 0; i < mData->Count; i++) { + ProgListData *data = (ProgListData *)mData->Items[i]; + + TProgHandleItem *Item = new TProgHandleItem(mProgListPanel, data->Caption); + Item->IsUnfold = false; + Item->Data = data; + + for(int di = 0; di < data->List->Count; di++) { + ProgItemData *it = (ProgItemData *)data->List->Items[di]; + + bool itemExist = false; + + for(int dci = 0; dci < Item->ChildCount; dci++) { + if(Item->Child(dci)->Caption == it->Caption) + itemExist = true; + } + + if(!itemExist) + new TProgHandleItem(Item, it->Caption)->Data = it; + } + } +} +//--------------------------------------------------------------------------- +void __fastcall TMultiSwitchProgForm::InitInsTypePanel() +{ + mInsTypePanel = new TListPanel(this); + mInsTypePanel->Left = 190; + mInsTypePanel->Top = m_ShapType->Top+m_ShapType->Height-1; + mInsTypePanel->Height = 225; + mInsTypePanel->Width = 120; + mInsTypePanel->Parent = this; + mInsTypePanel->SetTextFont(g_strTxtFontName, g_szFont9); + + m_ShapType->Left = mInsTypePanel->Left; + m_ShapType->Width = mInsTypePanel->Width; + m_lbType->Left = m_ShapType->Left+(m_ShapType->Width-m_lbType->Width)/2; + m_lbType->Top = m_ShapType->Top+(m_ShapType->Height-m_lbType->Height)/2; +} +//--------------------------------------------------------------------------- +void __fastcall TMultiSwitchProgForm::InitInsPanel() +{ + mInsPanel = new TListPanel(this); + mInsPanel->Left = 325; + mInsPanel->Top = m_ShapeProg->Top+m_ShapeProg->Height-1; + mInsPanel->Height = 225; + mInsPanel->Width = 120; + mInsPanel->Parent = this; + mInsPanel->SetTextFont(g_strTxtFontName, g_szFont9); + + m_ShapeProg->Left = mInsPanel->Left; + m_ShapeProg->Width = mInsPanel->Width; + m_lbProg->Left = m_ShapeProg->Left+(m_ShapeProg->Width-m_lbProg->Width)/2; + m_lbProg->Top = m_ShapeProg->Top+(m_ShapeProg->Height-m_lbProg->Height)/2; +} +//--------------------------------------------------------------------------- +ProgListData *TMultiSwitchProgForm::CheckData( char chan, char prog ) +{ + for(int i = 0; i < mData->Count; i++) { + ProgListData *d = (ProgListData *) mData->Items[i]; + + if( prog==d->Prog && ( chan==9 && d->Channel==9 + || chan!=9 && d->Channel!=9 ) ){ + return d; + } + } + + return NULL; +} +//--------------------------------------------------------------------------- +void __fastcall TMultiSwitchProgForm::DoProListSelect(TObject *Sender) +{ + TProgHandleItem *Item = (TProgHandleItem *)Sender; + TProgHandleItem *CurrentItem = mCurrentItem; + + if( Item && Item->Parent ) + Item = Item->Parent; + + if( CurrentItem==Item ) + return; + else + mCurrentItem = Item; + + if( Item==NULL ){ + mProgListPanel->DoSelectedItem( NULL ); + mInsTypePanel->Clear(); + mInsTypePanel->ResetScroll(); + mInsPanel->Clear(); + mInsPanel->ResetScroll(); + + return; + } + + ProgListData *data = (ProgListData *)Item->Data, + *dataOld = CurrentItem ? (ProgListData*)CurrentItem->Data : NULL; + + int groupNew = data->Channel==9 ? 0 : ( data->Prog >> 3 ), + groupOld = dataOld ? ( dataOld->Channel==9 ? 0 : ( dataOld->Prog >> 3 )) : -1; + + if( dataOld==NULL || data->Channel==9 && dataOld->Channel!=9 + || data->Channel!=9 && dataOld->Channel==9 ){ + if( dataOld ){ + mInsTypePanel->Clear(); + groupOld = -1; + } + + if( data->Channel==9 ){ + m_lbProg->Caption = ""; + mInsTypePanel->AddItem(new TListPanelItem("Ԥ", DoInsTypeClick)); + } + else{ + m_lbProg->Caption = ""; + for(int i = 0; i < 16; i++) { + mInsTypePanel->AddItem(new TListPanelItem(GM_GROUP[i], DoInsTypeClick)); + } + } + + mInsTypePanel->ResetScroll(); + } + + mInsTypePanel->SelectedItemIndex = groupNew; + + int iIndex = data->Channel==9 ? mInsPanel->SelectedItemIndex : data->Prog & 0x07; + + if( groupOld!=groupNew ){ + mInsPanel->Clear(); + + if( data->Channel==9 ){ + FONTINFO *pFont = g_lstFonts[g_idFont]; + iIndex = -1; + + for( int i = 0; i < pFont->nDrumCount; i++ ){ + FONTPRESET& set = pFont->aDrums[i]; + mInsPanel->AddItem( new TListPanelItem( set.text, DoInsClick )); + + if( set.id==data->Prog ){ + iIndex = i; + } + } + } + else{ + int base = groupNew<<3; + for(int i = 0; i < 8; i++) { + mInsPanel->AddItem(new TListPanelItem(GM_INSTRUMENT[base + i], DoInsClick)); + } + } + + mInsPanel->ResetScroll(); + } + + mInsPanel->SelectedItemIndex = iIndex; +} +//--------------------------------------------------------------------------- +void __fastcall TMultiSwitchProgForm::DoInsTypeClick(TListPanel *Sender, int Index) +{ + if( mCurrentItem == NULL || mInsPanel->SelectedItemIndex==Index ) + return; + + mInsPanel->Clear(); + + ProgListData *data = (ProgListData *) mCurrentItem->Data; + int base = Index << 3; + + for( int i = 0; i < 8; i++ ){ + mInsPanel->AddItem(new TListPanelItem(GM_INSTRUMENT[base + i], DoInsClick)); + } + + mInsPanel->ResetScroll(); + + if( Index==(data->Prog >> 3) ) + mInsPanel->SelectedItemIndex = data->Prog & 0x07; +} +//--------------------------------------------------------------------------- +void __fastcall TMultiSwitchProgForm::DoInsClick(TListPanel *Sender, int Index) +{ + if( mCurrentItem == NULL ) + return; + + ProgListData *data = (ProgListData *) mCurrentItem->Data; + TProgHandleItem *CurrentItem = mCurrentItem; + + if( data->Channel==9 ){ + data->Prog = g_lstFonts[g_idFont]->aDrums[Index].id; + CurrentItem->Caption = data->Caption + L"*"; + } + else{ + int type = mInsTypePanel->SelectedItemIndex; + int ins = Index; + data->Prog = ( type << 3 ) + ins; + + if( data->ProgBak == data->Prog ) + CurrentItem->Caption = String(GM_INSTRUMENT[data->Prog]); + else + CurrentItem->Caption = String(GM_INSTRUMENT[data->Prog]) + L"*"; + } +} +//--------------------------------------------------------------------------- +void __fastcall TMultiSwitchProgForm::DoReset(TObject *Sender) +{ + for( int i = 0; i < mProgListPanel->TopLevelItemCount; i++ ){ + TProgHandleItem *Item = mProgListPanel->GetTopLevelItem(i); + ProgListData *data = (ProgListData *)Item->Data; + + if( data->Prog != data->ProgBak ){ + data->Prog = data->ProgBak; + + Item->Caption = data->Channel==9 ? data->Caption : String( GM_INSTRUMENT[data->Prog] ); + } + } + + DoProListSelect( NULL ); +} +//--------------------------------------------------------------------------- +void __fastcall TMultiSwitchProgForm::DoOkClick(TObject *Sender) +{ + for(int pIndex = 0; pIndex < this->mProgListPanel->TopLevelItemCount; pIndex++) { + TProgHandleItem *pItem = mProgListPanel->GetTopLevelItem(pIndex); + + ProgListData *pData = (ProgListData *)pItem->Data; + + for(int cIndex = 0; cIndex < pItem->ChildCount; cIndex++) { + TProgHandleItem *cItem = pItem->Child(cIndex); + + ProgItemData *cData = (ProgItemData *)cItem->Data; + + //TTrackItem *TrackItem = (TTrackItem *)cData->Item; + + if(cItem->IsChecked) { + for(int dIndex = 0; dIndex < pData->List->Count; dIndex++) { + ProgItemData *itemData = (ProgItemData *)pData->List->Items[dIndex]; + if(itemData->Caption == cData->Caption) { + TTrackItem *pTrack = (TTrackItem *)itemData->Item; + if( pTrack->pTrack->iProg !=pData->Prog ){ + pTrack->pTrack->iProg = pData->Prog; + ItemChange->Add(pTrack); + } + } + } + } + } + } + + ModalResult = mrOk; +} +//--------------------------------------------------------------------------- + +void __fastcall TMultiSwitchProgForm::FormShow(TObject *Sender) +{ + if( mProgListPanel->TopLevelItemCount>0 ){ + TProgHandleItem *pItem = mProgListPanel->GetTopLevelItem( 0 ); + mProgListPanel->DoSelectedItem( pItem ); + pItem->IsSelected = true; + } + else{ + mOKButton->Enabled = false; + mResetButton->Enabled = false; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMultiSwitchProgForm::FormCreate(TObject *Sender) +{ + GeneralDialogPanel->Font->Name = g_strTxtFontName; + GeneralDialogPanel->Font->Size = g_szFont9; + +// mResetButton->FontName = g_strTxtFontName; + mResetButton->FontSize = g_szFont9; +// mCancelButton->FontName = g_strTxtFontName; + mCancelButton->FontSize = g_szFont9; +// mOKButton->FontName = g_strTxtFontName; + mOKButton->FontSize = g_szFont9; +} +//--------------------------------------------------------------------------- + diff --git a/MultiSwitchProgFormUnit.dfm b/MultiSwitchProgFormUnit.dfm new file mode 100644 index 0000000..7bfe125 --- /dev/null +++ b/MultiSwitchProgFormUnit.dfm @@ -0,0 +1,128 @@ +object MultiSwitchProgForm: TMultiSwitchProgForm + Left = 0 + Top = 0 + BorderStyle = bsNone + Caption = 'MultiSwitchProgForm' + ClientHeight = 337 + ClientWidth = 460 + Color = 5064257 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Position = poMainFormCenter + Scaled = False + OnCreate = FormCreate + OnShow = FormShow + TextHeight = 13 + object GeneralDialogPanel: TGeneralDialogPanel + Left = 0 + Top = 0 + Width = 460 + Height = 337 + Caption = #25209#37327#26356#25442#38899#33394'/'#20048#22120 + Color = 5064257 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentBackground = False + ParentFont = False + TabOrder = 0 + object mResetButton: TTextButton + Left = 206 + Top = 294 + Width = 75 + Height = 25 + ParentShowHint = False + ShowHint = True + OnClick = DoReset + Text = #37325#32622 + end + object mCancelButton: TTextButton + Left = 368 + Top = 294 + Width = 75 + Height = 25 + ModalResult = mrCancel + ParentShowHint = False + ShowHint = True + Text = #21462#28040 + end + object mOKButton: TTextButton + Left = 287 + Top = 294 + Width = 75 + Height = 25 + ParentShowHint = False + ShowHint = True + OnClick = DoOkClick + Text = #30830#23450 + end + object m_ShapeCur: TShape + Left = 16 + Top = 37 + Width = 160 + Height = 21 + Brush.Color = 2433053 + Pen.Color = 8092539 + end + object m_lbCurProg: TLabel + Left = 69 + Top = 39 + Width = 48 + Height = 14 + Caption = #24403#21069#20048#22120 + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object m_ShapType: TShape + Left = 182 + Top = 37 + Width = 120 + Height = 21 + Brush.Color = 2433053 + Pen.Color = 8092539 + end + object m_ShapeProg: TShape + Left = 317 + Top = 37 + Width = 120 + Height = 21 + Brush.Color = 2433053 + Pen.Color = 8092539 + end + object m_lbProg: TLabel + Left = 362 + Top = 39 + Width = 24 + Height = 14 + Caption = #20048#22120 + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object m_lbType: TLabel + Left = 234 + Top = 39 + Width = 24 + Height = 14 + Caption = #31867#21035 + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + end +end diff --git a/MultiSwitchProgFormUnit.h b/MultiSwitchProgFormUnit.h new file mode 100644 index 0000000..c953fa9 --- /dev/null +++ b/MultiSwitchProgFormUnit.h @@ -0,0 +1,105 @@ +//--------------------------------------------------------------------------- + +#ifndef MultiSwitchProgFormUnitH +#define MultiSwitchProgFormUnitH +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include + +#include "ProgHandlePanel.h" +#include "PNGButton.hpp" +#include "GeneralDialogPanel.h" +#include "GlobalUnit.h" +#include "StyleItem.h" +#include "ListPanel.h" +#include "Instruments.h" +#include "TextButton.h" +//--------------------------------------------------------------------------- +class ProgListData : public TObject +{ +public: + int Prog; + int Channel; + int ProgBak; + String Caption; + TList *List; + + __fastcall ProgListData(String Cap, int pr, int ch) { + Caption = Cap; + Prog = pr; + ProgBak = pr; + Channel = ch; + List = new TList(); + } + + __fastcall ~ProgListData(){ + if(List) { + List->Clear(); + delete List; + List = NULL; + } + } +}; +//--------------------------------------------------------------------------- +class ProgItemData : public TObject +{ +public: + String Caption; + TCommonItem *Item; + + __fastcall ProgItemData(String Cap, TCommonItem *it) { + Caption = Cap; + Item = it; + } +}; +//--------------------------------------------------------------------------- +class TMultiSwitchProgForm : public TForm +{ +__published: // IDE-managed Components + TGeneralDialogPanel *GeneralDialogPanel; + TTextButton *mResetButton; + TTextButton *mCancelButton; + TTextButton *mOKButton; + TLabel *m_lbCurProg; + TShape *m_ShapeCur; + TLabel *m_lbType; + TShape *m_ShapType; + TLabel *m_lbProg; + TShape *m_ShapeProg; + void __fastcall DoReset(TObject *Sender); + void __fastcall DoOkClick(TObject *Sender); + void __fastcall FormShow(TObject *Sender); + void __fastcall FormCreate(TObject *Sender); +private: // User declarations + TProgHandlePanel *mProgListPanel; + TListPanel *mInsTypePanel; + TListPanel *mInsPanel; + + TProgHandleItem *mCurrentItem; + + TList *mData; + + TCommonItem *m_pItem; + + ProgListData *CheckData( char chan, char prog ); + + void __fastcall InitProgListPanel(); + void __fastcall InitInsTypePanel(); + void __fastcall InitInsPanel(); + + void __fastcall DoProListSelect(TObject *Sender); + void __fastcall DoInsTypeClick(TListPanel *Sender, int Index); + void __fastcall DoInsClick(TListPanel *Sender, int Index); + +public: // User declarations + TList *ItemChange; + __fastcall TMultiSwitchProgForm(TComponent* Owner, TCommonItem *pItem); + __fastcall ~TMultiSwitchProgForm(); +}; +//--------------------------------------------------------------------------- +extern PACKAGE TMultiSwitchProgForm *MultiSwitchProgForm; +//--------------------------------------------------------------------------- +#endif diff --git a/NotificationADPanelUnit.cpp b/NotificationADPanelUnit.cpp new file mode 100644 index 0000000..04967ce --- /dev/null +++ b/NotificationADPanelUnit.cpp @@ -0,0 +1,270 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop + +#include "NotificationADPanelUnit.h" + +#define PERIOD_AD ( 3*1000 ) +#define AD_SHOW_NUMBER 1 + +#define AD_CHANGE_WIDTH 10 +#define AD_CHANGE_HEIGHT 6 +#define AD_CHANGE_HEIGHT_TO_BOTTOM 5 +#define AD_CHANGE_PIC2PIC 5 + +#define AD_PIC_LEFT 0 +#define AD_PIC_TOP 0 +#define AD_PIC_WIDTH Width +#define AD_PIC_HEIGHT (Height - AD_CHANGE_HEIGHT - 2*AD_CHANGE_HEIGHT_TO_BOTTOM) + +const static COLORREF + CLR_BKG = RGB(39, 42, 47); +//--------------------------------------------------------------------------- +#pragma package(smart_init) + +__fastcall TNotiADPanel::TNotiADPanel( TComponent* Owner, VCTJSON *VCJsonAD) + : Vcl::Extctrls::TPanel( Owner ) +{ + m_VCJsonAD = VCJsonAD; + m_iIndex = 0; + + m_pADTimer = new TTimer(this); + m_pADTimer->Enabled = false; + m_pADTimer->Interval = PERIOD_AD; + m_pADTimer->OnTimer = NotificationTimerProc; + + this->BevelOuter = bvNone; + + ParentColor = true; +} +//--------------------------------------------------------------------------- + +__fastcall TNotiADPanel::~TNotiADPanel() +{ + if( m_pPaintBoxAD ) { delete m_pPaintBoxAD; m_pPaintBoxAD = NULL; } + + vector::iterator vc_pFindADChange; + for( vc_pFindADChange = m_pPBADChange.begin(); + vc_pFindADChange != m_pPBADChange.end(); + vc_pFindADChange++ ) + { + if( *vc_pFindADChange ) { + delete *vc_pFindADChange; + *vc_pFindADChange = NULL; + } + } + + vector::iterator vc_pFindPIC; + for( vc_pFindPIC = m_vcPIC.begin(); + vc_pFindPIC != m_vcPIC.end(); + vc_pFindPIC++ ) + { + if( *vc_pFindPIC ) { + delete *vc_pFindPIC; + *vc_pFindPIC = NULL; + } + } + + if( m_pADTimer ) { delete m_pADTimer; m_pADTimer = NULL; } +} +//--------------------------------------------------------------------------- + +void __fastcall TNotiADPanel::CreateWnd() +{ + Vcl::Extctrls::TPanel::CreateWnd(); + + SetAD(); +} +//--------------------------------------------------------------------------- + +void __fastcall TNotiADPanel::WMEraseBkgnd(TWMEraseBkgnd &Message) +{ + TRect rect = GetClientRect(); + + TCanvas* tempCanvas = new TCanvas; + tempCanvas->Handle = Message.DC; + + tempCanvas->Brush->Color = CLR_BKG; //ɫ + tempCanvas->FillRect( rect ); + + delete tempCanvas; + tempCanvas = NULL; +} +//--------------------------------------------------------------------------- + +void __fastcall TNotiADPanel::NotificationTimerProc(TObject* Sender) +{ + TTimer *NotiTimer = (TTimer *)Sender; + + int index = 0; + int size = (*m_VCJsonAD).size(); + + if( size>AD_SHOW_NUMBER ) + { + if( NotiTimer == m_pADTimer ) { + m_iIndex = ( (m_iIndex+1)==size )? 0: (m_iIndex+1); + } + + vector::iterator vc_pFindADChange; + bool bFind = false; + VCTJSON::iterator vc_pFindAD; + for( vc_pFindAD = (*m_VCJsonAD).begin(), + vc_pFindADChange = m_pPBADChange.begin(); + vc_pFindAD != (*m_VCJsonAD).end(), + vc_pFindADChange != m_pPBADChange.end(); + vc_pFindADChange++ ) + { + if( index==m_iIndex ) { + (*vc_pFindADChange)->State = 1; + bFind = true; + }else{ + (*vc_pFindADChange)->State = 0; + if( !bFind ) { + vc_pFindAD++; + } + } + + (*vc_pFindADChange)->Invalidate(); + index++; + } + + vector::iterator vc_pFindPIC = m_vcPIC.begin() + m_iIndex; + + m_pPaintBoxAD->GraphicImg = *vc_pFindPIC; + m_pPaintBoxAD->StrUrl = (*vc_pFindAD).strUrl; + m_pPaintBoxAD->Invalidate(); + + }else { + m_pADTimer->Enabled = false; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TNotiADPanel::SetAD() +{ + int adSize = (*m_VCJsonAD).size(); + + if( adSize ) + { + int startLoc = Width - adSize*(AD_CHANGE_WIDTH+AD_CHANGE_PIC2PIC) + + AD_CHANGE_PIC2PIC; + + TUrlPaintBox *tmpPB; + TPicture *picImg; + VCTJSON::iterator vc_pFindAD; + for( vc_pFindAD = (*m_VCJsonAD).begin(); + vc_pFindAD != (*m_VCJsonAD).end(); + vc_pFindAD++ ) + { + picImg = new TPicture(); + String name = (*vc_pFindAD).strNamePic; + picImg->LoadFromFile( (*vc_pFindAD).strNamePic ); + m_vcPIC.push_back(picImg); + + if( adSize>1 ) + { + tmpPB = new TUrlPaintBox(this); + tmpPB->Parent = this; + tmpPB->Width = AD_CHANGE_WIDTH; + tmpPB->Height = AD_CHANGE_HEIGHT; + tmpPB->Left = startLoc; + tmpPB->Top = Height - AD_CHANGE_HEIGHT - AD_CHANGE_HEIGHT_TO_BOTTOM; + tmpPB->StateCount = 2; + + tmpPB->OnMouseEnter = ADChangeMouseEnter; + tmpPB->OnMouseLeave = ADChangeMouseLeave; + + if( vc_pFindAD == (*m_VCJsonAD).begin() ) { + tmpPB->State = 1; + } + tmpPB->BringToFront(); + tmpPB->Visible = true; + + startLoc += AD_CHANGE_WIDTH + AD_CHANGE_PIC2PIC; + m_pPBADChange.push_back(tmpPB); + } + } + + vc_pFindAD = (*m_VCJsonAD).begin(); + m_pPaintBoxAD = new TUrlPaintBox(this); + m_pPaintBoxAD->Parent = this; + m_pPaintBoxAD->Width = AD_PIC_WIDTH; + m_pPaintBoxAD->Height = AD_PIC_HEIGHT; + m_pPaintBoxAD->Left = AD_PIC_LEFT; + m_pPaintBoxAD->Top = AD_PIC_TOP; + m_pPaintBoxAD->OnMouseEnter = PaintBoxMouseEnter; + m_pPaintBoxAD->OnMouseLeave = PaintBoxMouseLeave; + m_pPaintBoxAD->GraphicImg = *( m_vcPIC.begin() ); + m_pPaintBoxAD->StrUrl = (*vc_pFindAD).strUrl; + m_pPaintBoxAD->Visible = true; + } + + m_pADTimer->Enabled = true; +} +//--------------------------------------------------------------------------- + +void __fastcall TNotiADPanel::PaintBoxMouseLeave(TObject *Sender) +{ + int adSize = (*m_VCJsonAD).size(); + if( adSize<=1 ){ + return; + } + + TPoint clientPos = ScreenToClient(Mouse->CursorPos); + TUrlPaintBox *tmpPB = (TUrlPaintBox *)Sender; + + if( tmpPB==m_pPaintBoxAD ) { + m_pADTimer->Enabled = true; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TNotiADPanel::PaintBoxMouseEnter(TObject *Sender) +{ + int adSize = (*m_VCJsonAD).size(); + if( adSize<=1 ){ + return; + } + + TUrlPaintBox *tmpPB = (TUrlPaintBox *)Sender; + + if( tmpPB==m_pPaintBoxAD ) { + + m_pADTimer->Enabled = false; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TNotiADPanel::ADChangeMouseEnter(TObject *Sender) +{ + m_pADTimer->Enabled = false; + + TUrlPaintBox *tmpPB = (TUrlPaintBox *)Sender; + + int index = 0; + vector::iterator vc_pFindADChange; + + for( vc_pFindADChange = m_pPBADChange.begin(); + vc_pFindADChange != m_pPBADChange.end(); + vc_pFindADChange++ ) + { + if( tmpPB==*vc_pFindADChange ) { + break; + } + index++; + } + + if( m_iIndex != index ) { + m_iIndex = index; + NotificationTimerProc(NULL); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TNotiADPanel::ADChangeMouseLeave(TObject *Sender) +{ + m_pADTimer->Enabled = true; +} +//--------------------------------------------------------------------------- + + diff --git a/NotificationADPanelUnit.h b/NotificationADPanelUnit.h new file mode 100644 index 0000000..d2d95f1 --- /dev/null +++ b/NotificationADPanelUnit.h @@ -0,0 +1,48 @@ +//--------------------------------------------------------------------------- + +#ifndef NotificationADPanelUnitH +#define NotificationADPanelUnitH +//--------------------------------------------------------------------------- +#include "NotificationExUnit.h" +#include +#include +#include +#include "PNGButton.hpp" +//--------------------------------------------------------------------------- +typedef vector VCURLLABEL; + +class TNotiADPanel : public Vcl::Extctrls::TPanel +{ +private: + VCTJSON *m_VCJsonAD; + void __fastcall SetAD(); + + int m_iIndex; + + vector m_vcPIC; + + TUrlPaintBox *m_pPaintBoxAD; + void __fastcall PaintBoxMouseEnter(TObject *Sender); + void __fastcall PaintBoxMouseLeave(TObject *Sender); + + vector m_pPBADChange; + void __fastcall ADChangeMouseEnter(TObject *Sender); + void __fastcall ADChangeMouseLeave(TObject *Sender); + + TTimer *m_pADTimer; + void __fastcall NotificationTimerProc(TObject* Sender); + + + virtual void __fastcall CreateWnd(); + MESSAGE void __fastcall WMEraseBkgnd(TWMEraseBkgnd &Message); + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(WM_ERASEBKGND, TWMEraseBkgnd, WMEraseBkgnd) + END_MESSAGE_MAP( Vcl::Extctrls::TPanel ) + +public: + __fastcall TNotiADPanel( TComponent* Owner, VCTJSON *VCJsonAD); + __fastcall ~TNotiADPanel(); +}; +//--------------------------------------------------------------------------- +#endif diff --git a/NotificationContentPanelUnit.cpp b/NotificationContentPanelUnit.cpp new file mode 100644 index 0000000..ca2bc7e --- /dev/null +++ b/NotificationContentPanelUnit.cpp @@ -0,0 +1,535 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop +#include "NotificationContentPanelUnit.h" + +#pragma package(smart_init) +//--------------------------------------------------------------------------- +#define SCOLLBAR_WIDTH (14) +#define TOP_BUTTOM (10) +#define LEFT_RIGHT (SCOLLBAR_WIDTH + 20) +#define LINE_HEIGHT (25) + +#define DB_NAME_LINE (2) +#define DB_NAME_HEIGHT (DB_NAME_LINE*LINE_HEIGHT) +#define DB_NAME_RECT_LEFT (10) +#define DB_NAME_RECT_HEIGHT (20) +#define DB_NAME_TEXT_LEFT (5) +#define DB_NAME_TEXT_WIDTH (10) + + +#define PIC_TO_LEFT (LEFT_RIGHT) +#define PIC_HEIGHT (45) +#define PIC_WIDTH (45) +#define PIC_LEFT (LEFT_RIGHT) +#define PIC_RIGHT (PIC_LEFT + PIC_WIDTH + LEFT_RIGHT) + +#define LABEL_TO_LEFT (PIC_LEFT) +#define LABEL_MAX_WIDTH_PIC (Width - PIC_RIGHT - LEFT_RIGHT) +#define LABEL_MAX_WIDTH (Width - LABEL_TO_LEFT - LEFT_RIGHT) +#define LABEL_HEIGHT (PIC_HEIGHT/2) + +const static COLORREF + CLR_TXT_HOT = RGB(171, 186, 207), + CLR_CONTENT_BKG = RGB(56, 61, 67), + CLR_CONTENT_DB_NAME_BKG = RGB(47, 50, 56), + CLR_CONTENT_DB_NAME_FRAME = RGB(32, 35, 39), + CLR_CONTENT_DB_LINE_DARK = RGB(32, 35, 39), + CLR_CONTENT_DB_LINE_LIGHT = RGB(76, 81, 87); + +//--------------------------------------------------------------------------- + +__fastcall TNotiContenPanel::TNotiContenPanel( TComponent* Owner, VCTJSONDB *VCJsonContent) + : Vcl::Extctrls::TPanel( Owner ) +{ + ParentColor = true; + + m_VCJsonContent = VCJsonContent; + m_ScrollBar = NULL; + m_iTopLine =0; + m_iShowLine = 1; + SetContent(); +} +//--------------------------------------------------------------------------- + +void __fastcall TNotiContenPanel::CreateWnd() +{ + Vcl::Extctrls::TPanel::CreateWnd(); + + SetShowLine(); +} +//--------------------------------------------------------------------------- + +__fastcall TNotiContenPanel::~TNotiContenPanel() +{ + if( m_ScrollBar ){ + delete m_ScrollBar; + m_ScrollBar = NULL; + } + + vector::iterator vc_pFindPIC; + for( vc_pFindPIC = ItemPIC.begin(); + vc_pFindPIC != ItemPIC.end(); + vc_pFindPIC++ ) + { + if( *vc_pFindPIC ) { + delete *vc_pFindPIC; + *vc_pFindPIC = NULL; + } + } + + vector::iterator vc_pFindItemLabel; + for( vc_pFindItemLabel = ItemLabel.begin(); + (vc_pFindItemLabel != ItemLabel.end()); + vc_pFindItemLabel++ ) + { + vector::iterator vc_pFindLabel; + VCURLLABEL* vcLabel = *vc_pFindItemLabel; + + for( vc_pFindLabel = (*vcLabel).begin(); + vc_pFindLabel!= (*vcLabel).end(); + vc_pFindLabel++ ) + { + if( *vc_pFindLabel ) { + delete *vc_pFindLabel; + *vc_pFindLabel = NULL; + } + } + } +} +//--------------------------------------------------------------------------- + +void __fastcall TNotiContenPanel::WMEraseBkgnd(TWMEraseBkgnd &Message) +{ + TRect rect = GetClientRect(); + + TCanvas* tempCanvas = new TCanvas; + tempCanvas->Handle = Message.DC; + + tempCanvas->Brush->Color = CLR_CONTENT_BKG; //ɫ + tempCanvas->FillRect( rect ); + + delete tempCanvas; + tempCanvas = NULL; +} +//--------------------------------------------------------------------------- + +void __fastcall TNotiContenPanel::WMVScroll(Winapi::Messages::TWMScroll &Message) +{ + int minpos, maxpos, page, curpos; + m_ScrollBar->GetScrollRange(&minpos, &maxpos); + page = m_ScrollBar->GetPageSize(); + // Get the current position of scroll box. + curpos = m_ScrollBar->GetScrollPos(); + + // Determine the new position of scroll box. + switch (Message.ScrollCode) + { + case SB_TOP: // Scroll to far top. + curpos = minpos; + break; + + case SB_BOTTOM: // Scroll to far bottom. + curpos = maxpos-page+1; + break; + + case SB_ENDSCROLL: // End scroll. + break; + + case SB_LINEUP: // Scroll left. + if (curpos > minpos) + curpos--; + break; + + case SB_LINEDOWN: // Scroll right. + if (curpos < maxpos-page+1) + curpos++; + break; + + case SB_PAGEUP: // Scroll one page left. + if (curpos > minpos) + curpos = (minpos > curpos-page) ? minpos : curpos-page; + //max(minpos, curpos-page); + break; + + case SB_PAGEDOWN: // Scroll one page right. + if( curposHandle ){ + m_ScrollBar->SetPosition(curpos); +// Paint(); + } + if( m_iTopLine != curpos ){ + m_iTopLine = curpos; + Invalidate(); + } + + Message.Result = true; +} +//--------------------------------------------------------------------------- + +void __fastcall TNotiContenPanel::WMMouseWheel(TWMMouseWheel &Message) +{ + if( m_ScrollBar->Visible ){ + UINT nSBCode; + + if( Message.WheelDelta>0 ) nSBCode = SB_LINEUP; + else nSBCode = SB_LINEDOWN; + + Perform( WM_VSCROLL, MAKELONG(nSBCode,0), NULL ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TNotiContenPanel::SetContent() +{ + bool bPicExist, bLabelExist; + VCTJSONDB::iterator vc_pFindContent; + for( vc_pFindContent = (*m_VCJsonContent).begin(); + vc_pFindContent != (*m_VCJsonContent).end(); + vc_pFindContent++) + { + int dbNum = 0; + VCTJSON::iterator vc_pFindContentPIC; + for( vc_pFindContentPIC = (*vc_pFindContent).vcContent.begin(); + vc_pFindContentPIC != (*vc_pFindContent).vcContent.end(); + vc_pFindContentPIC++) + { + bPicExist = bLabelExist = false; + //===========ͼƬϢ + TPicture *picImg = NULL; + TUrlPaintBox *tmpPicDraw = NULL; + String strExit = (*vc_pFindContentPIC).strNamePic; + if( strExit.Length() ) { + + picImg = new TPicture(); + picImg->LoadFromFile( strExit ); + bPicExist = true; + + if( bPicExist ) { + tmpPicDraw = new TUrlPaintBox(this); + tmpPicDraw->Parent = this; + tmpPicDraw->GraphicImg = picImg; + tmpPicDraw->StrUrl = (*vc_pFindContentPIC).strUrl; + tmpPicDraw->Visible = true; + } + } + ItemPIC.push_back( picImg ); + ItemPICDraw.push_back( tmpPicDraw ); + + //===========Ϣ + VCURLLABEL *tmpVCUrlLabel = new VCURLLABEL(); + + //Ϣ + TUrlLabel *tmpLabel = CreateLabel((*vc_pFindContentPIC).strName, + (*vc_pFindContentPIC).strUrl); + if( tmpLabel!=NULL ) { + tmpVCUrlLabel->push_back(tmpLabel); + bLabelExist = true; + } + + //˵Ϣ + tmpLabel = CreateLabel((*vc_pFindContentPIC).strAuthor, L""); + if( tmpLabel!=NULL ) { + tmpVCUrlLabel->push_back(tmpLabel); + bLabelExist = true; + } + + if( !bLabelExist) { //˵ + ItemPIC.pop_back(); + ItemPICDraw.pop_back(); + if( picImg ) { delete picImg; picImg=NULL;}; + if( tmpPicDraw ) { delete tmpPicDraw; tmpPicDraw=NULL;}; + if( tmpVCUrlLabel ) { delete tmpVCUrlLabel; tmpVCUrlLabel=NULL;}; + }else { + ItemLabel.push_back(tmpVCUrlLabel); + dbNum++; + } + + } + + //===========Ϣ + if( bLabelExist ) { + + ItemDBName.push_back((*vc_pFindContent).strDbName); + ItemDBNameNum.push_back(dbNum); + } + } +} +//--------------------------------------------------------------------------- + +TUrlLabel* __fastcall TNotiContenPanel::CreateLabel(String caption, String url) +{ + TUrlLabel *tmpUrlLabel; + if( caption.Length() ) { + tmpUrlLabel = new TUrlLabel(this); + tmpUrlLabel->Parent = this; + tmpUrlLabel->Caption = caption; + tmpUrlLabel->StrUrl = url; + }else { tmpUrlLabel=NULL; } + + return tmpUrlLabel; +} +//--------------------------------------------------------------------------- + +void __fastcall TNotiContenPanel::CutOffLabelString() +{ + int maxPicExsit = LABEL_MAX_WIDTH_PIC; + int maxPicNo = LABEL_MAX_WIDTH; + int maxLabelLen; + vector::iterator vc_pFindItemPIC; + vector::iterator vc_pFindLBItem = ItemLabel.begin(); + for( vc_pFindLBItem = ItemLabel.begin(), + vc_pFindItemPIC = ItemPIC.begin(); + vc_pFindLBItem != ItemLabel.end(), + vc_pFindItemPIC != ItemPIC.end(); + vc_pFindLBItem++, + vc_pFindItemPIC++) + { + if( (*vc_pFindItemPIC) == NULL ){ + maxLabelLen = maxPicNo; + }else{ + maxLabelLen = maxPicExsit; + } + + vector::iterator vc_pFindLabel; + VCURLLABEL* vcLabel = *vc_pFindLBItem; + + for( vc_pFindLabel = (*vcLabel).begin(); + vc_pFindLabel!= (*vcLabel).end(); + vc_pFindLabel++) + { + String caption = (*vc_pFindLabel)->Caption; + TSize size = Canvas->TextExtent( caption ); + int nLen = caption.Length(); + if( size.Width >= maxLabelLen ) + { + nLen = nLen*(maxLabelLen)/size.Width; + nLen -= 1; + + if(nLen <= 0){ + caption = caption.SubString(0, 1); + }else{ + caption = caption.SubString(0, nLen); + caption += ".."; + } + + (*vc_pFindLabel)->Caption = caption; + } + } + } +} +//--------------------------------------------------------------------------- + +int __fastcall TNotiContenPanel::GetLineNumber() +{ + int linePIC; + int linePICExist = (PIC_HEIGHT%LINE_HEIGHT==0)?(PIC_HEIGHT/LINE_HEIGHT): + ((PIC_HEIGHT/LINE_HEIGHT)+1); + int lineLabel = 0; + int lineNumber = 0; + + vector::iterator vc_pFindItemPIC; + vector::iterator vc_pFindItemLabel; + for( vc_pFindItemLabel =ItemLabel.begin(), + vc_pFindItemPIC = ItemPIC.begin(); + vc_pFindItemLabel != ItemLabel.end()&& + vc_pFindItemPIC != ItemPIC.end(); + vc_pFindItemLabel++, + vc_pFindItemPIC++) + { + if( (*vc_pFindItemPIC) == NULL ) { + linePIC = 0; + }else{ + linePIC = linePICExist; + } + + VCURLLABEL* vcLabel = *vc_pFindItemLabel; + lineLabel = (*vcLabel).size(); + + int lineNumberTmp = lineNumber; +// if( linePIC>lineLabel ) { +// lineNumber += linePIC; +// }else { +// lineNumber += lineLabel; +// } + + lineNumber += linePICExist; + ItemLine.push_back(lineNumber - lineNumberTmp); + } + + lineNumber += ItemDBName.size()*DB_NAME_LINE; + + return lineNumber; +} +//--------------------------------------------------------------------------- + +void __fastcall TNotiContenPanel::SetShowLine() +{ + CutOffLabelString(); + + int totalLine = GetLineNumber(); +// m_iShowLine = (Height - 2*TOP_BUTTOM)/LINE_HEIGHT; + m_iShowLine = Height/LINE_HEIGHT; + + if( totalLine>m_iShowLine ){ + m_ScrollBar = new TSkinScrollBar(this); + m_ScrollBar->m_pWndCtrl = this; + m_ScrollBar->Parent = this; + m_ScrollBar->Height = Height-2; +// m_ScrollBar->Width = SCOLLBAR_WIDTH; + m_ScrollBar->Left = Width - m_ScrollBar->Width - 1; + m_ScrollBar->Top = 1; + m_ScrollBar->SetRange( 0,totalLine-1 ); + m_ScrollBar->SetPageSize(m_iShowLine); + m_ScrollBar->SetPosition( m_iTopLine ); + m_ScrollBar->Visible = true; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TNotiContenPanel::Paint(void) +{ + int contentHeight = 0; + int curX = 0; + int curY = 0; + int curWidth = 0; + int curHeight = 0; + int contentStart = -m_iTopLine*LINE_HEIGHT; + int dbNum = 0; + bool dbNameShow = true; + + vector::iterator vc_pFindItemDBNameNum = ItemDBNameNum.begin(); + vector::iterator vc_pFindItemDBName = ItemDBName.begin(); + vector::iterator vc_pFindItemLine; + vector::iterator vc_pFindItemPIC; + vector::iterator vc_pFindItemPICDraw; + vector::iterator vc_pFindItemLabel; + + if( vc_pFindItemDBNameNum == ItemDBNameNum.end() + || vc_pFindItemDBName == ItemDBName.end() ) + return; + + for( vc_pFindItemLine = ItemLine.begin(), + vc_pFindItemPIC = ItemPIC.begin(), + vc_pFindItemPICDraw = ItemPICDraw.begin(), + vc_pFindItemLabel = ItemLabel.begin(); + + (vc_pFindItemLine != ItemLine.end())&& + (vc_pFindItemPIC != ItemPIC.end()) && + (vc_pFindItemPICDraw != ItemPICDraw.end()), + (vc_pFindItemLabel != ItemLabel.end()); + + vc_pFindItemLine++, + vc_pFindItemPIC++, + vc_pFindItemPICDraw++, + vc_pFindItemLabel++ ) + { + if( dbNameShow && dbNum == 0 ) + { + contentHeight = DB_NAME_HEIGHT; + + //Ϣ + dbNum = (*vc_pFindItemDBNameNum) - 1; + + TSize sizeFont = Canvas->TextExtent((*vc_pFindItemDBName)); + curX = DB_NAME_RECT_LEFT; + curY = contentStart + contentHeight/2 - DB_NAME_RECT_HEIGHT/2; + curWidth = sizeFont.Width; + curHeight = DB_NAME_RECT_HEIGHT; + + Canvas->Brush->Color = CLR_CONTENT_DB_NAME_BKG; + Canvas->FillRect(TRect(curX, curY, curX+curWidth+DB_NAME_TEXT_WIDTH, curY+curHeight)); + Canvas->Brush->Color = CLR_CONTENT_DB_NAME_FRAME; + Canvas->FrameRect(TRect(curX, curY,curX+curWidth+DB_NAME_TEXT_WIDTH, curY+curHeight)); + + curX = DB_NAME_RECT_LEFT + DB_NAME_TEXT_LEFT; + curY = curY + (DB_NAME_RECT_HEIGHT - sizeFont.Height)/2; + Canvas->Font->Color = CLR_TXT_HOT; + Canvas->Brush->Style = bsClear; + Canvas->TextOutW(curX, curY, (*vc_pFindItemDBName)); + + + if( vc_pFindItemDBName != ItemDBName.end() && + vc_pFindItemDBNameNum != ItemDBNameNum.end()) + { + vc_pFindItemDBName++; + vc_pFindItemDBNameNum++; + } + + if( vc_pFindItemDBName == ItemDBName.end() ){ + dbNameShow = false; + } + + contentStart += contentHeight; + + }else { + dbNum--; + } + + //ͼƬ + contentHeight = (*vc_pFindItemLine)*LINE_HEIGHT; + + curY = contentStart + (contentHeight - PIC_HEIGHT)/2; + bool bPicExsit = true; + if( (*vc_pFindItemPIC) != NULL ) { + curX = PIC_LEFT; + curWidth = PIC_HEIGHT; + curHeight = PIC_WIDTH; + (*vc_pFindItemPICDraw)->SetBounds(curX, curY, curWidth, curHeight); + +// Canvas->StretchDraw( TRect(curX, curY, curX+curWidth, curY+curHeight), +// (*vc_pFindItemPIC)->Graphic ); + }else{ + bPicExsit = false; + } + + //˵ + vector::iterator vc_pFindLabel; + VCURLLABEL* vcLabel = *vc_pFindItemLabel; + +// int labelStart = contentStart + (contentHeight - (*vcLabel).size()*LINE_HEIGHT)/2; + int labelStart,lineStart; + labelStart = lineStart = curY; + + for( vc_pFindLabel = (*vcLabel).begin(); + vc_pFindLabel!= (*vcLabel).end(); + vc_pFindLabel++ ) + { +// if( bPicExsit ) { + curX = PIC_RIGHT + (LABEL_MAX_WIDTH_PIC - (*vc_pFindLabel)->Width)/2; +// }else{ +// curX = LABEL_TO_LEFT + (LABEL_MAX_WIDTH - (*vc_pFindLabel)->Width)/2; +// } + + curY = labelStart + (LABEL_HEIGHT - (*vc_pFindLabel)->Height)/2; + (*vc_pFindLabel)->Left = curX; + (*vc_pFindLabel)->Top = curY; + labelStart += LABEL_HEIGHT; + } + lineStart += PIC_HEIGHT; + Canvas->Pen->Color = CLR_CONTENT_DB_LINE_DARK; + Canvas->MoveTo( PIC_RIGHT, lineStart-1 ); + Canvas->LineTo( Width-LEFT_RIGHT, lineStart-1 ); + Canvas->Pen->Color = CLR_CONTENT_DB_LINE_LIGHT; + Canvas->MoveTo( PIC_RIGHT, lineStart ); + Canvas->LineTo( Width-LEFT_RIGHT, lineStart ); + + contentStart += contentHeight; + } +} +//--------------------------------------------------------------------------- + diff --git a/NotificationContentPanelUnit.h b/NotificationContentPanelUnit.h new file mode 100644 index 0000000..60350e7 --- /dev/null +++ b/NotificationContentPanelUnit.h @@ -0,0 +1,56 @@ +//--------------------------------------------------------------------------- + +#ifndef NotificationContentPanelUnitH +#define NotificationContentPanelUnitH +#include "SkinScrollBarUnit.h" +#include "NotificationExUnit.h" +#include "NotificationThreadUnit.h" +//--------------------------------------------------------------------------- +typedef vector VCURLLABEL; + +class TNotiContenPanel : public Vcl::Extctrls::TPanel +{ + +private: + VCTJSONDB *m_VCJsonContent; + + vector ItemDBNameNum; //һֶӦӦ + vector ItemDBName; //˵ + vector ItemLine; //һitemͼƬռõ + + vector ItemPIC; + vector ItemPICDraw; + + vector ItemLabel; //һͼƬܶӦn˵ + + int m_iShowLine; + int m_iTopLine; + + TSkinScrollBar *m_ScrollBar; + + TUrlLabel* __fastcall CreateLabel(String caption, String url); + void __fastcall CutOffLabelString(); + int __fastcall GetLineNumber(); + void __fastcall SetShowLine(); + void __fastcall SetContent(); + + virtual void __fastcall CreateWnd(); + virtual void __fastcall Paint(void); + + MESSAGE void __fastcall WMEraseBkgnd(TWMEraseBkgnd &Message); + MESSAGE void __fastcall WMVScroll(Winapi::Messages::TWMScroll &Message); + MESSAGE void __fastcall WMMouseWheel(TWMMouseWheel &Message); + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(WM_ERASEBKGND, TWMEraseBkgnd, WMEraseBkgnd) + MESSAGE_HANDLER(WM_VSCROLL, TWMVScroll, WMVScroll) + MESSAGE_HANDLER(WM_MOUSEWHEEL, TWMMouseWheel, WMMouseWheel) + END_MESSAGE_MAP( Vcl::Extctrls::TPanel ) + +public: + + __fastcall TNotiContenPanel( TComponent* Owner, VCTJSONDB *VCJsonContent); + __fastcall ~TNotiContenPanel(); +}; +//--------------------------------------------------------------------------- +#endif diff --git a/NotificationExUnit.cpp b/NotificationExUnit.cpp new file mode 100644 index 0000000..e27abd3 --- /dev/null +++ b/NotificationExUnit.cpp @@ -0,0 +1,356 @@ +//--------------------------------------------------------------------------- + +#pragma hdrstop +#include +#include "NotificationExUnit.h" +#include +//--------------------------------------------------------------------------- +#pragma package(smart_init) + +extern wstring g_strUserPath; + +TJSONObject* __fastcall GetJsonContext(String strContextNoti) +{ + TJSONObject *jsonTmp = new TJSONObject(); + TBytes StringBytesTmp = TEncoding::UTF8->GetBytes(strContextNoti); + jsonTmp = (TJSONObject *)jsonTmp->ParseJSONValue(StringBytesTmp, 0); + + return jsonTmp; +} +//--------------------------------------------------------------------------- + +TJSONObject* __fastcall GetJsonValue(TJSONObject *json, int index) +{ + if( json->Count > index ){ + String strkey = json->Get(index)->JsonString->Value(); + return (TJSONObject *)json->GetValue(strkey); + } + + return NULL; +} +//--------------------------------------------------------------------------- +typedef struct tagBingdingWhere{ + + IBinding *bind; + int iWhereIs; + +}BingdingWhere; + +typedef vector VCBingding; +VCBingding vc_Bingding; + +void __fastcall StopURLDownload(int iWhereIs) +{ + for(int i=0; iiWhereIs ) { + if( pTmp->bind ){ + pTmp->bind->Abort(); + } + break; + } + } +} + +HRESULT STDMETHODCALLTYPE CBindCBHttpCallback::OnStartBinding(DWORD dwReserved, IBinding __RPC_FAR *pib) +{ + pib->AddRef(); + + for(int i=0; iiWhereIs==iWhereIs){ + pTmp->bind->Release(); + pTmp->bind = pib; + + return S_OK; + } + } + + BingdingWhere *pWhere = new BingdingWhere(); + pWhere->bind = pib; + pWhere->iWhereIs = iWhereIs; + vc_Bingding.push_back(pWhere); + + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CBindCBHttpCallback::OnStopBinding(HRESULT hresult, LPCWSTR szError) +{ + for(int i=0; iiWhereIs ) { + if( pTmp->bind ){ + pTmp->bind->Release(); + pTmp->bind = NULL; + } + + delete pTmp; + vc_Bingding.erase(vc_Bingding.begin()+i); + + break; + } + } + + return S_OK; +} + +//********************************************************************** +//***************************************TUrlLabel +//********************************************************************** +//--------------------------------------------------------------------------- + +__fastcall TUrlLabel::TUrlLabel( TComponent* Owner): + Vcl::Stdctrls::TLabel( Owner ) +{ + FCloseForm = false; + + Transparent = true; + ControlStyle>>csOpaque; + + FColorNor = CLR_TEXT_NORMAL; + FColorEnt = CLR_TEXT_ENTER; + FColorLea = CLR_TEXT_LEAVE; + + Font->Color = FColorNor; +} +//--------------------------------------------------------------------------- + +__fastcall TUrlLabel::~TUrlLabel() +{ + +} +//--------------------------------------------------------------------------- + +void __fastcall TUrlLabel::CMMouseLeave(Winapi::Messages::TMessage &Msg) +{ + if( FStrUrl.Length() ) { + Screen->Cursor = crDefault; + Font->Color = FColorLea; + } + + if( FOnMouseLeave ) + FOnMouseLeave(this); +} +//--------------------------------------------------------------------------- + +void __fastcall TUrlLabel::CMMouseEnter(Winapi::Messages::TMessage &Msg) +{ + if( FStrUrl.Length() ) { + Screen->Cursor = crHandPoint; + Font->Color = FColorEnt; + }else + Font->Color = FColorNor; + + if( FOnMouseEnter ) { + FOnMouseEnter(this); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TUrlLabel::Click() +{ + if( StrUrl.Length() ) { + ShellExecute(Parent->Handle, NULL, StrUrl.c_str(), NULL, NULL, SW_SHOWNORMAL); + if(FCloseForm) { + TCustomForm * parentForm = GetParentForm( this ); + parentForm->Close(); + } + } +} +//--------------------------------------------------------------------------- + +void __fastcall TUrlLabel::SetStrUrl(String url) +{ + FStrUrl = url; + if( FStrUrl.Length() ) { + Font->Color = FColorLea; + } +} +//--------------------------------------------------------------------------- + +//********************************************************************** +//***************************************TUrlPaintBox +//********************************************************************** +//--------------------------------------------------------------------------- +const COLORREF + CLR_AD_CHANGE_NOR = RGB(63, 68, 76), + CLR_AD_CHANGE_ENTER = RGB(94, 101, 112); + +#define STATE_NORMAL 0 +#define STATE_ENTER 1 + +__fastcall TUrlPaintBox::TUrlPaintBox( TComponent* Owner, TPicture * graphicImg): + Vcl::Extctrls::TPaintBox( Owner ) +{ + FCloseForm = false; + FState = 0; + FStateCount = 1; + FIndex = 0; + FGraphicImg = graphicImg; +} +//--------------------------------------------------------------------------- + +__fastcall TUrlPaintBox::~TUrlPaintBox() +{ + +} +//--------------------------------------------------------------------------- + +void __fastcall TUrlPaintBox::Click() +{ + if( FStrUrl.Length() ) { + ShellExecute(Parent->Handle, NULL, FStrUrl.c_str(), NULL, NULL, SW_SHOWNORMAL); + if(FCloseForm) { + TCustomForm * parentForm = GetParentForm( this ); + parentForm->Close(); + } + } +} +//--------------------------------------------------------------------------- +void __fastcall TUrlPaintBox::CMMouseEnter(Winapi::Messages::TMessage &Msg) +{ + if( FStrUrl.Length() ) + Screen->Cursor = crHandPoint; + + if( FOnMouseEnter ) + FOnMouseEnter(this); + +} + +//--------------------------------------------------------------------------- +void __fastcall TUrlPaintBox::CMMouseLeave(Winapi::Messages::TMessage &Msg) +{ + if( FStrUrl.Length() ) + Screen->Cursor = crDefault; + + if( FOnMouseLeave ) + FOnMouseLeave(this); +} +//--------------------------------------------------------------------------- + +void __fastcall TUrlPaintBox::SetGraphicImg(TPicture *GraphicImg) +{ + FGraphicImg = GraphicImg; + this->Invalidate(); +} +//--------------------------------------------------------------------------- + +void __fastcall TUrlPaintBox::SetStrUrl(String strUrl) +{ + FStrUrl = strUrl; +} +//--------------------------------------------------------------------------- + +void __fastcall TUrlPaintBox::SetStateCount(int stateCount) +{ + FStateCount = stateCount; +} +//--------------------------------------------------------------------------- +void __fastcall TUrlPaintBox::Paint() +{ + if( GraphicImg ){ + if( 1< FStateCount ) + Canvas->Draw((-(FGraphicImg->Width/FStateCount))*FState, 0, FGraphicImg->Graphic); + else + Canvas->StretchDraw( TRect(0, 0, Width, Height), FGraphicImg->Graphic); + }else{ + if( FState==STATE_NORMAL ){ + Canvas->Brush->Color = CLR_AD_CHANGE_NOR; + }else if( FState==STATE_ENTER ){ + Canvas->Brush->Color = CLR_AD_CHANGE_ENTER; + } + Canvas->FillRect(TRect(0, 0, Width, Height)); + } +} +//--------------------------------------------------------------------------- + + +//********************************************************************** +//***************************************GetUrlData +//********************************************************************** +//--------------------------------------------------------------------------- +HRESULT GetUrlData(String url, String fileDirect, String &fileName, TStringStream *fileToSteam, bool bfileToStream, int iWhereIs) +{ + String BasePath = g_strUserPath.c_str(); + BasePath += fileDirect; + + fileName = BasePath + fileName; + if(!DirectoryExists(BasePath, false)) + ForceDirectories(BasePath); + + DeleteUrlCacheEntry(url.c_str()); + + CBindCBHttpCallback callBack; + callBack.iWhereIs = iWhereIs; + HRESULT result = URLDownloadToFile(NULL, url.c_str(), fileName.c_str(), 0, &callBack); + + if( result==S_OK ) + { + bool bfileExsit = true; + if( !FileExists(fileName) ){ + result = S_FALSE; + fileName = L""; + bfileExsit = false; + } + + if( bfileToStream ) + { + if( bfileExsit ) + { + if( fileToSteam == NULL ){ + fileToSteam = new TStringStream(NULL, 65001); + } + + fileToSteam->LoadFromFile(fileName); + fileToSteam->Position = 0; + + DeleteFile(fileName); + } + } + } + + return result; +} +//--------------------------------------------------------------------------- + +bool __fastcall GetPic(String &name, bool bCopy) +{ + bool bReturn = true; + + TMemoryStream *tmpMemoryStream = new TMemoryStream(); + tmpMemoryStream->LoadFromFile(name); + tmpMemoryStream->Position = 0; + WORD wType = 0; + tmpMemoryStream->ReadBuffer(&wType, 2); + + String tmpName = name; + + if( wType==0x5089 ){ //png + + name = ChangeFileExt(name, L".png"); + RenameFile(tmpName, name); + + }else if( wType==0xD8FF ) { //jpg + + name = ChangeFileExt(name, L".jpg"); + RenameFile(tmpName, name); + + }else if( wType==0x4947 ){ + + name = ChangeFileExt(name, L".gif"); + RenameFile(tmpName, name); + + }else{ + bReturn = false; + } + + if( tmpMemoryStream ) + delete tmpMemoryStream; + + if( bReturn && bCopy) + CopyFile(name.c_str(), tmpName.c_str(), true); + + return bReturn; +} + + diff --git a/NotificationExUnit.h b/NotificationExUnit.h new file mode 100644 index 0000000..88abc1e --- /dev/null +++ b/NotificationExUnit.h @@ -0,0 +1,175 @@ +//--------------------------------------------------------------------------- + +#ifndef NotificationExUnitH +#define NotificationExUnitH +//--------------------------------------------------------------------------- +#include +#include +using namespace std; +#include +#include +#include +#pragma comment(lib, "urlmon.lib") +#pragma comment(lib, "wininet.lib") + +//--------------------------------------------------------------------------- +#define JSON_PIC_DERICTORY L"temp\\JSON\\" +#define JSON_PIC_DERICTORY_AD L"AD\\" +#define JSON_PIC_DERICTORY_CONTENT L"CONTENT\\" +#define JSON_PIC_DERICTORY_TEXT L"TEXT\\" + +typedef struct tagJson{ + String strName; + String strNamePic; + String strFileUrl; + String strUrl; + String strAuthor; +}TJSON, *PTJSON; +typedef vector VCTJSON; +typedef vector VCPTJSON; +//extern VCTJSON::iterator vc_pFindAD; +//extern VCTJSON::iterator vc_pFindNoti; + +typedef struct tagJsonDB{ //ͬ͵ + String strDbName; + VCTJSON vcContent; +}TJSONDB, *PTJSONDB; +typedef vector VCTJSONDB; +typedef vector VCPTJSONDB; + +//extern VCTJSONDB::iterator vc_pFindContent; +//extern VCTJSON::iterator vc_pFindContentPIC; + +TJSONObject* __fastcall GetJsonContext(String strContextNoti); +TJSONObject* __fastcall GetJsonValue(TJSONObject *json, int index); +//--------------------------------------------------------------------------- +static const COLORREF + CLR_TEXT_NORMAL = RGB( 156, 170, 189 ), + CLR_TEXT_ENTER = RGB( 100, 180, 236 ), + CLR_TEXT_LEAVE = RGB( 67, 117, 233 ); +//--------------------------------------------------------------------------- +#define UrlDown_Notification 0 +#define UrlDown_ImageCover 1 + +void __fastcall StopURLDownload(int iWhereIs=UrlDown_Notification); + +class CBindCBHttpCallback : public IBindStatusCallback +{ +public: + CBindCBHttpCallback(){}; + ~CBindCBHttpCallback(){}; + + STDMETHOD(OnStartBinding)(DWORD dwReserved, IBinding __RPC_FAR *pib); + STDMETHOD(OnStopBinding)(HRESULT hresult, LPCWSTR szError); + + STDMETHOD(OnProgress)(ULONG ulProgress, ULONG ulProgressMax, ULONG ulStatusCode, + LPCWSTR wszStatusText) + { return E_NOTIMPL; } + STDMETHOD(GetPriority)(LONG __RPC_FAR *pnPriority) + { return E_NOTIMPL; } + STDMETHOD(OnLowResource)(DWORD reserved) + { return E_NOTIMPL; } + STDMETHOD(GetBindInfo)(DWORD __RPC_FAR *grfBINDF, BINDINFO __RPC_FAR *pbindinfo) + { return E_NOTIMPL; } + STDMETHOD(OnDataAvailable)(DWORD grfBSCF, DWORD dwSize, FORMATETC __RPC_FAR *pformatetc, + STGMEDIUM __RPC_FAR *pstgmed) + { return E_NOTIMPL; } + STDMETHOD(OnObjectAvailable)(REFIID riid, IUnknown __RPC_FAR *punk) + { return E_NOTIMPL; } + STDMETHOD_(ULONG,AddRef)() + { return 0; } + STDMETHOD_(ULONG,Release)() + { return 0; } + STDMETHOD(QueryInterface)(REFIID riid, void __RPC_FAR *__RPC_FAR *ppvObject) + { return E_NOTIMPL; } + + int iWhereIs; +}; +//--------------------------------------------------------------------------- + +class TUrlLabel : public Vcl::Stdctrls::TLabel{ + +private: + TColor FColorNor; + TColor FColorEnt; + TColor FColorLea; + + bool FCloseForm; + String FStrUrl; + void __fastcall SetStrUrl(String url); + + TNotifyEvent FOnMouseEnter;//on mouse enter notify event + TNotifyEvent FOnMouseLeave;//on mouse leave notify event + + DYNAMIC void __fastcall Click(void); + MESSAGE void __fastcall CMMouseEnter(Winapi::Messages::TMessage &Msg); // to know when mouse is entered + MESSAGE void __fastcall CMMouseLeave(Winapi::Messages::TMessage &Msg); // to know when mouse is leaved + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(CM_MOUSEENTER, TMessage, CMMouseEnter) + MESSAGE_HANDLER(CM_MOUSELEAVE, TMessage, CMMouseLeave) + END_MESSAGE_MAP(TLabel) +public: + __fastcall TUrlLabel( TComponent* Owner); + __fastcall ~TUrlLabel(); + +__published: + __property bool CloseForm = {read=FCloseForm, write=FCloseForm, default=false}; + __property String StrUrl = {read=FStrUrl, write=SetStrUrl}; + __property System::Classes::TNotifyEvent OnMouseEnter = {read=FOnMouseEnter, write=FOnMouseEnter}; + __property System::Classes::TNotifyEvent OnMouseLeave = {read=FOnMouseLeave, write=FOnMouseLeave}; + __property TColor ColorNor = {read=FColorNor, write=FColorNor, default=CLR_TEXT_NORMAL}; + __property TColor ColorEnt = {read=FColorEnt, write=FColorEnt, default=CLR_TEXT_NORMAL}; + __property TColor ColorLea = {read=FColorLea, write=FColorLea, default=CLR_TEXT_NORMAL}; +}; +//--------------------------------------------------------------------------- + + +class TUrlPaintBox : public Vcl::Extctrls::TPaintBox{ + +private: + String FStrUrl; + TPicture *FGraphicImg; + bool FCloseForm; + int FState; + int FStateCount; + int FIndex; + void __fastcall SetStrGraphicName(String strGraphicName); + void __fastcall SetGraphicImg(TPicture *GraphicImg); + void __fastcall SetStrUrl(String strUrl); + void __fastcall SetStateCount(int stateCount); + + TNotifyEvent FOnMouseEnter;//on mouse enter notify event + TNotifyEvent FOnMouseLeave;//on mouse leave notify event + + DYNAMIC void __fastcall Click(void); + MESSAGE void __fastcall CMMouseEnter(Winapi::Messages::TMessage &Msg); // to know when mouse is entered + MESSAGE void __fastcall CMMouseLeave(Winapi::Messages::TMessage &Msg); // to know when mouse is leaved + + virtual void __fastcall Paint(void); + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(CM_MOUSEENTER, TMessage, CMMouseEnter) + MESSAGE_HANDLER(CM_MOUSELEAVE, TMessage, CMMouseLeave) + END_MESSAGE_MAP(TPaintBox) + +public: + __fastcall TUrlPaintBox( TComponent* Owner, TPicture * graphicImg=NULL); + __fastcall ~TUrlPaintBox(); + +__published: + __property bool CloseForm = {read=FCloseForm, write=FCloseForm, default=false}; + __property int State = {read=FState, write=FState, default=0}; + __property int StateCount = {read=FStateCount, write=SetStateCount, default=1}; + __property int Index = {read=FIndex, write=FIndex, default=0}; + __property TPicture *GraphicImg = {read=FGraphicImg, write=SetGraphicImg}; + __property String StrUrl = {read=FStrUrl, write=SetStrUrl}; + __property System::Classes::TNotifyEvent OnMouseEnter = {read=FOnMouseEnter, write=FOnMouseEnter}; + __property System::Classes::TNotifyEvent OnMouseLeave = {read=FOnMouseLeave, write=FOnMouseLeave}; +}; +//--------------------------------------------------------------------------- + +bool __fastcall GetPic(String &name, bool bCopy=false); +HRESULT GetUrlData(String url, String fileDirect, String &fileName, TStringStream *fileToSteam=NULL, bool bfileToStream=false, int iWhereIs=UrlDown_Notification); +//--------------------------------------------------------------------------- +#endif diff --git a/NotificationFormUnit.cpp b/NotificationFormUnit.cpp new file mode 100644 index 0000000..dbd6787 --- /dev/null +++ b/NotificationFormUnit.cpp @@ -0,0 +1,571 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop + +#include "NotificationFormUnit.h" +#include "GlobalUnit.h" + +#pragma package(smart_init) +#pragma link "PNGButton" +#pragma resource "*.dfm" +TNotificationForm *NotificationForm; +//--------------------------------------------------------------------------- +#define PERIOD_SHUTDOW ( 60*1000 ) +#define PERIOD_TEXT ( 3*1000 ) +//--------------------------------------------------------------------------- +#define LEN_BKG_EXTERNAL_ROUND (1) +#define LEN_BKG_EXTERNAL_FRMAE (1) +#define LEN_BKG_INTERNAL_LINE (23) +//--------------------------------------------------------------------------- +#define AD_PANEL_TOP (LEN_BKG_INTERNAL_LINE + 3) +#define AD_PANEL_LEFT (8) +#define AD_PANEL_WIDTH (Width - 2*AD_PANEL_LEFT) +#define AD_PANEL_HEIGHT (75) + +#define TEXT_HEIGHT (LEN_BKG_INTERNAL_LINE + 1) +//--------------------------------------------------------------------------- +#define JSON_ID_TYPE 0 +#define JSON_ID_NAME 1 +#define JSON_ID_COUNT 2 +#define JSON_ID_DB 3 + +#define JSON_TYPE_PIC 1 +#define JSON_TYPE_TEXT 2 +#define JSON_TYPE_CONTENT 3 +//--------------------------------------------------------------------------- + const static COLORREF + CLR_TXT_HOT = RGB(171, 186, 207), + CLR_BKG_EXTERNAL_ROUND = RGB(60, 62, 70), + CLR_BKG_EXTERNAL_FRMAE = RGB(98, 106, 114), + CLR_BKG_INTERNAL = RGB(39, 42, 47), + CLR_BKG_INTERNAL_LINE_HIG = RGB(71, 73, 78), + CLR_BKG_INTERNAL_LINE_BLACK = RGB(22, 24, 26); +//--------------------------------------------------------------------------- +__fastcall TNotificationForm::TNotificationForm(TComponent* Owner) + : TForm(Owner) +{ + Color = CLR_BKG_INTERNAL; + + this->Left = Screen->Width - this->Width - 14; + this->Top = Screen->WorkAreaHeight - this->Height; + + // + m_pTextNotiTimer = new TTimer(this); + m_pTextNotiTimer->Enabled = false; + m_pTextNotiTimer->Interval = PERIOD_TEXT; + m_pTextNotiTimer->OnTimer = NotificationTimerProc; + + //Զر + m_pNotiShutDownTimer = new TTimer(this); + m_pNotiShutDownTimer->Enabled = false; + m_pNotiShutDownTimer->Interval = PERIOD_SHUTDOW; + m_pNotiShutDownTimer->OnTimer = NotificationTimerProc; + + m_pNotificationThread = new TNotificationThread(true, this); + m_pNotificationThread->Start(); + + SetTransparent( this ); +} +//--------------------------------------------------------------------------- + +void __fastcall TNotificationForm::setPANEL() +{ + bool bSuccess = true; + int tmp = m_VCJsonAD.size(); + if( m_VCJsonAD.size() ) { + + m_pNotiADPanel = new TNotiADPanel(this, &m_VCJsonAD); + m_pNotiADPanel->Parent = this; + m_pNotiADPanel->Top = AD_PANEL_TOP; + m_pNotiADPanel->Left = AD_PANEL_LEFT; + m_pNotiADPanel->Width = AD_PANEL_WIDTH; + m_pNotiADPanel->Height = AD_PANEL_HEIGHT; + }else { bSuccess = false;} + + if( m_VCJsonContent.size() ) { + m_pNotiContenPanel = new TNotiContenPanel(this, &m_VCJsonContent); + m_pNotiContenPanel->Parent = this; + if( bSuccess ) { + m_pNotiContenPanel->Top = AD_PANEL_TOP + AD_PANEL_HEIGHT; + m_pNotiContenPanel->Left = AD_PANEL_LEFT; + m_pNotiContenPanel->Width = this->Width - 2*AD_PANEL_LEFT; + m_pNotiContenPanel->Height = this->Height - TEXT_HEIGHT - m_pNotiContenPanel->Top; + }else{ + m_pNotiContenPanel->Top = AD_PANEL_TOP; + m_pNotiContenPanel->Left = 0; + m_pNotiContenPanel->Width = this->Width; + m_pNotiContenPanel->Height = this->Height - TEXT_HEIGHT - m_pNotiContenPanel->Top; + } + bSuccess = true; + }else { bSuccess = false;} + + if( m_VCJonNoti.size() ) { + + m_pNotiUrl = new TUrlLabel(this); + m_pNotiUrl->Parent = this; + + m_pNotiUrl->Caption = (*m_VCJonNoti.begin()).strName; + + String url = (*m_VCJonNoti.begin()).strUrl; + if( url.Length() ) { + m_pNotiUrl->StrUrl = url; + }else{ + char strURL[256]; + if( f_CS_GetWebPageURL ) + f_CS_GetWebPageURL( URL_HOMEPAGE, strURL ); + m_pNotiUrl->StrUrl = (String)strURL; + } + + m_pNotiUrl->Top = this->Height - TEXT_HEIGHT + (TEXT_HEIGHT - m_pNotiUrl->Height)/2; + m_pNotiUrl->Left = (this->Width - m_pNotiUrl->Width)/2; + + if( m_VCJonNoti.size() > 1) { + m_pNotiUrl->OnMouseEnter = NotiChangeMouseEnter; + m_pNotiUrl->OnMouseLeave = NotiChangeMouseLeave; + m_pTextNotiTimer->Enabled = true; + } + } + + if( bSuccess ){ + m_pNotiShutDownTimer->Enabled = true; + } +} +//--------------------------------------------------------------------------- +void __fastcall TNotificationForm::CreateParams(Vcl::Controls::TCreateParams &Params) +{ + TForm::CreateParams(Params); + + Params.WndParent = GetDesktopWindow(); + Params.ExStyle |= WS_EX_TOOLWINDOW; +} +//--------------------------------------------------------------------------- + +void __fastcall TNotificationForm::FormShow(TObject *Sender) +{ + this->Left = Screen->Width - this->Width - 14; + this->Top = Screen->WorkAreaHeight - this->Height; +// AnimateWindow(Handle, 1000, AW_BLEND); +} +//--------------------------------------------------------------------------- + +void __fastcall TNotificationForm::FormClose(TObject *Sender, TCloseAction &Action) + +{ +/* AnimateWindow(Handle,1000,AW_BLEND+AW_HIDE); + + if( m_pNotiADPanel ) { delete m_pNotiADPanel; m_pNotiADPanel = NULL; } + + if( m_pTextNotiTimer ){ delete m_pTextNotiTimer; m_pTextNotiTimer = NULL; } + if( m_pNotiShutDownTimer ){ delete m_pNotiShutDownTimer; m_pNotiShutDownTimer = NULL; } + if( m_pNotiUrl ) { delete m_pNotiUrl; m_pNotiUrl = NULL;} + + if( m_pNotiContenPanel ) { delete m_pNotiContenPanel; m_pNotiContenPanel = NULL; } + + if( m_pNotificationThread ) { delete m_pNotificationThread; m_pNotificationThread = NULL; } + + ClearJsonDirect(); + + m_VCJsonAD.clear(); + m_VCJonNoti.clear(); + m_VCJsonContent.clear(); +*/ + PostMessage(Application->MainForm->Handle, UM_NOTIFICATION, + NOTIFICATION_SHOW_CLOSED, 0 ); +} +//--------------------------------------------------------------------------- + +__fastcall TNotificationForm::~TNotificationForm() +{ + if( m_pNotiADPanel ) { delete m_pNotiADPanel; m_pNotiADPanel = NULL; } + + if( m_pTextNotiTimer ){ delete m_pTextNotiTimer; m_pTextNotiTimer = NULL; } + if( m_pNotiShutDownTimer ){ delete m_pNotiShutDownTimer; m_pNotiShutDownTimer = NULL; } + if( m_pNotiUrl ) { delete m_pNotiUrl; m_pNotiUrl = NULL;} + + if( m_pNotiContenPanel ) { delete m_pNotiContenPanel; m_pNotiContenPanel = NULL; } + + if( m_pNotificationThread ) { + StopURLDownload(); + m_pNotificationThread->WaitFor();// >Terminate(); + delete m_pNotificationThread; + m_pNotificationThread = NULL; + } + + ClearJsonDirect(); + + m_VCJsonAD.clear(); + m_VCJonNoti.clear(); + m_VCJsonContent.clear(); +} + +bool __fastcall TNotificationForm::ParseJson() +{ + ClearJsonDirect(); + + char strURL[256]; + if( S_OK != f_CS_GetWebPageURL( URL_JASONQUERY, strURL ) ) + return false; + + String urlJson = strURL; + String strJson; + String picDirect = JSON_PIC_DERICTORY; + String picName = L"json.tmp"; + TStringStream *strStream = new TStringStream(NULL, 65001); + + HRESULT resultJson = GetUrlData(urlJson, picDirect, picName, strStream, true); + + strJson= strStream->DataString; + delete strStream; + +// HRESULT resultJson = S_OK; +// strJson = L"{\"1\":{\"type\":1,\"name\":\"\",\"count\":3,\"db\":{\"1\":{\"name\":\"ı\",\"picture\":\"http://www.ichangzuo.com/ichangzuo/File/Music/Cover/201307/414_1374757039.png\",\"file\":\"\",\"url\":\"http://composemusic.xicp.net:81/index.php/Activity?tpl=show\",\"author\":\"\"},\"2\":{\"name\":\"ı\",\"picture\":\"http://www.ichangzuo.com/ichangzuo/File/Music/Cover/201403/414_1396202466.png\",\"file\":\"\",\"url\":\"http://composemusic.xicp.net:81/index.php/Activity?tpl=show\",\"author\":\"\"},\"3\":{\"name\":\"ı\",\"picture\":\"http://www.ichangzuo.com/ichangzuo/File/User/Photo/414_1374202747.jpg\",\"file\":\"\",\"url\":\"http://composemusic.xicp.net:81/index.php/Activity?tpl=show\",\"author\":\"\"}}},\"2\":{\"type\":1,\"name\":\"\",\"count\":0},\"3\":{\"type\":1,\"name\":\"\",\"count\":0},\"4\":{\"type\":3,\"name\":\"Ƽ\",\"count\":3,\"db\":{\"1\":{\"name\":\"Ÿо\",\"picture\":\"http://composemusic.xicp.net:81/ichangzuo/File/Web/Default/music_cover_default.jpg\",\"file\":\"http://composemusic.xicp.net:81/ichangzuo/File/Music/Music/201307/867_1374396650.MP3\",\"url\":\"http://composemusic.xicp.net:81/index.php/Music?tpl=play&i=22\",\"author\":\"ľľ\"},\"2\":{\"name\":\"ī\",\"picture\":\"http://composemusic.xicp.net:81/ichangzuo/File/User/Default/Music_cover/10475_1380381900.jpg\",\"file\":\"http://composemusic.xicp.net:81/ichangzuo/File/Music/Music/201309/10475_1378453592.mp3\",\"url\":\"http://composemusic.xicp.net:81/index.php/Music?tpl=play&i=549\",\"author\":\"\"},\"3\":{\"name\":\"123\",\"picture\":\"http://composemusic.xicp.net:81/ichangzuo/File/Web/Default/music_cover_default.jpg\",\"file\":\"http://composemusic.xicp.net:81/ichangzuo/File/Music/Music/201403/23599_1395305792.mp3\",\"url\":\"http://composemusic.xicp.net:81/index.php/Music?tpl=play&i=2457\",\"author\":\"С\"}}},\"5\":{\"type\":3,\"name\":\"Ƽ\",\"count\":1,\"db\":{\"1\":{\"name\":\"\",\"picture\":\"http://composemusic.xicp.net:81/ichangzuo/File/User/Portrait/default.jpg\",\"file\":\"\",\"url\":\"http://composemusic.xicp.net:81/index.php/Lyric?tpl=show&i=33\",\"author\":\"С\"}}},\"6\":{\"type\":2,\"name\":\"\",\"count\":3,\"db\":{\"1\":{\"name\":\"333\",\"picture\":\"\",\"file\":\"\",\"url\":\"\",\"author\":\"0\"},\"2\":{\"name\":\"һԵı\",\"picture\":\"\",\"file\":\"\",\"url\":\"\",\"author\":\"0\"},\"3\":{\"name\":\"һ\",\"picture\":\"\",\"file\":\"\",\"url\":\"\",\"author\":\"0\"}}}}"; + + if( !m_pNotiShutDownTimer || !(resultJson==S_OK && strJson.Length() > 1) ){ + return false; + } + + String jsonPath = JSON_PIC_DERICTORY; + bool bSuccess = false; + int indexPic = 0; + + TJSONObject *jsonOri = GetJsonContext(strJson); + if( jsonOri==NULL ) { + return false; + } + + try + { + for( int i=0; iSize(); i++ ) + { + TJSONObject *ValueID = GetJsonValue(jsonOri, i); + if( ValueID==NULL ) {continue;} + + TJSONObject *ValueCount = GetJsonValue(ValueID, JSON_ID_COUNT); + if( ValueCount==NULL ) { continue; } + if( StrToInt(ValueCount->Value())==0 ) { continue; } + + TJSONObject *ValueDB = GetJsonValue(ValueID, JSON_ID_DB); + if( ValueDB==NULL) {continue;} + + bool bTypeContent = false; + TJSONDB jsonContent; + for(int i=0; iSize(); i++) + { + TJSONObject *ValueDBID = GetJsonValue(ValueDB, i); + + if( ValueDBID==NULL ) {continue;} + + TJSONObject *ValueType = GetJsonValue(ValueID, JSON_ID_TYPE); + if( ValueType==NULL ) { continue;} + + TJSON jsonAdd; + + jsonAdd.strName = ValueDBID->GetValue(L"name")->Value(); + jsonAdd.strFileUrl = ValueDBID->GetValue(L"file")->Value(); + jsonAdd.strUrl = ValueDBID->GetValue(L"url")->Value(); + jsonAdd.strAuthor = ValueDBID->GetValue(L"author")->Value(); + + String strPicDirect; + String strType = ValueType->Value(); + if( StrToInt(strType)==JSON_TYPE_PIC ){ + strPicDirect = JSON_PIC_DERICTORY_AD; + }else if( StrToInt(strType)==JSON_TYPE_TEXT ) { + strPicDirect = JSON_PIC_DERICTORY_TEXT; + }else if( StrToInt(strType)==JSON_TYPE_CONTENT ){ + strPicDirect = JSON_PIC_DERICTORY_CONTENT; + } + String strPicUrl = ValueDBID->GetValue(L"picture")->Value(); +// String strPicUrl = L"http://www.ichangzuo.com/ichangzuo/File/Software/Content/Ac/137784127986.jpg"; + if( strPicUrl.Length() ) { + strPicDirect = jsonPath + strPicDirect; + String strPicName = IntToStr(indexPic) + ExtractFileExt(strPicUrl); + resultJson = GetUrlData(strPicUrl, strPicDirect, strPicName); + + if( !m_pNotiShutDownTimer ){ + delete jsonOri; + return false; + } + + if( resultJson == S_OK ){ + jsonAdd.strNamePic = strPicName; + indexPic++; + } + } + + if( StrToInt(strType)==JSON_TYPE_PIC && jsonAdd.strNamePic.Length() ){ + m_VCJsonAD.push_back(jsonAdd); + }else if( StrToInt(strType)==JSON_TYPE_TEXT ) { + m_VCJonNoti.push_back(jsonAdd); + }else if( StrToInt(strType)==JSON_TYPE_CONTENT ){ + jsonContent.vcContent.push_back(jsonAdd); + bTypeContent = true; + } + } + + if( bTypeContent && jsonContent.vcContent.size() ) { + + TJSONObject *ValueName = GetJsonValue(ValueID, JSON_ID_NAME); + if( ValueName == NULL ){ + jsonContent.strDbName = L""; + }else { + jsonContent.strDbName = ValueName->Value(); + } + m_VCJsonContent.push_back(jsonContent); + } + } + }catch(Exception &e){ + delete jsonOri; + return false; + } + + if( jsonOri ){ + delete jsonOri; + jsonOri = NULL; + } + + if( m_VCJsonAD.size() ) { + bSuccess = true; + } + + if( m_VCJsonContent.size() ){ + bSuccess = true; + }else { bSuccess = false;} + + return bSuccess; +} +//--------------------------------------------------------------------------- + +bool __fastcall TNotificationForm::LoadImg() +{ + TPicture *picImg = NULL; + int adSize = m_VCJsonAD.size(); + + if( adSize ) + { + VCTJSON::iterator vc_pFindAD; + for( vc_pFindAD = m_VCJsonAD.begin(); + vc_pFindAD != m_VCJsonAD.end(); + vc_pFindAD++ ) + { + if( (*vc_pFindAD).strNamePic.Length() ) { + + if( GetPic(vc_pFindAD->strNamePic) ) + { + try{ + picImg = new TPicture(); + picImg->LoadFromFile( (*vc_pFindAD).strNamePic ); + delete picImg; + }catch(Exception &e){ + return false; + } + }else{ + return false; + } + }else{ + return false; + } + } + } + + adSize = m_VCJsonContent.size(); + + if( adSize ){ + VCTJSONDB::iterator vc_pFindContent; + for( vc_pFindContent = m_VCJsonContent.begin(); + vc_pFindContent != m_VCJsonContent.end(); + vc_pFindContent++) + { + VCTJSON::iterator vc_pFindContentPIC; + for( vc_pFindContentPIC = (*vc_pFindContent).vcContent.begin(); + vc_pFindContentPIC != (*vc_pFindContent).vcContent.end(); + vc_pFindContentPIC++) + { + + if( (*vc_pFindContentPIC).strNamePic.Length() ) + { + if( GetPic(vc_pFindContentPIC->strNamePic) ) { + try{ + picImg = new TPicture(); + picImg->LoadFromFile( (*vc_pFindContentPIC).strNamePic ); + delete picImg; + }catch(Exception &e){ + return false; + } + }else{ + return false; + } + } + } + } + } + + return true; +} +//--------------------------------------------------------------------------- + +void __fastcall TNotificationForm::NotificationTimerProc(TObject* Sender) +{ + TTimer *NotiTimer = (TTimer *)Sender; + + int index = -1; + int size = 0; + + if( NotiTimer== m_pTextNotiTimer) { //л + + index = -1; + size = m_VCJonNoti.size(); + if( size>1 ) { + index = (m_iTextNotiIndex+1Enabled = false; + return; + } + + if( m_iTextNotiIndex != index ) + { + m_iTextNotiIndex = index; + VCTJSON::iterator vc_pFindNoti = m_VCJonNoti.begin() + index; + String url = (*vc_pFindNoti).strUrl; + if( url.Length() ) { + m_pNotiUrl->StrUrl = url; + }else{ + m_pNotiUrl->StrUrl = L"http://www.ichangzuo.com/"; + } + + m_pNotiUrl->Caption = (*vc_pFindNoti).strName; + m_pNotiUrl->Left = (this->Width - m_pNotiUrl->Width)/2; + } + }else if( NotiTimer == m_pNotiShutDownTimer ) { + + m_pNotiShutDownTimer->Enabled = false; + this->Close(); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TNotificationForm::WMEraseBkgnd(Winapi::Messages::TWMEraseBkgnd &Message) +{ + TRect rect = GetClientRect(); + TRect rectFill = rect; + + TCanvas* tempCanvas = new TCanvas; + tempCanvas->Handle = Message.DC; + + rectFill.Top = rectFill.Top + LEN_BKG_EXTERNAL_ROUND; + rectFill.Left = rectFill.Left + LEN_BKG_EXTERNAL_ROUND; + rectFill.Right = rectFill.Right - LEN_BKG_EXTERNAL_ROUND; + rectFill.Bottom = rectFill.Bottom - LEN_BKG_EXTERNAL_ROUND; + + tempCanvas->Brush->Color = CLR_BKG_INTERNAL; + + tempCanvas->FillRect( rectFill ); + +// //==========Բ + tempCanvas->Pen->Color = CLR_BKG_EXTERNAL_ROUND; + int X,Y; + // + Y = 0; + + X = 0; + tempCanvas->Pixels[X][Y] = tempCanvas->Pen->Color; + X = Width - LEN_BKG_EXTERNAL_ROUND; + tempCanvas->Pixels[X][Y] = tempCanvas->Pen->Color; + + // + Y = Height - LEN_BKG_EXTERNAL_ROUND; + + X = 0; + tempCanvas->Pixels[X][Y] = tempCanvas->Pen->Color; + X = Width - LEN_BKG_EXTERNAL_ROUND; + tempCanvas->Pixels[X][Y] = tempCanvas->Pen->Color; + + //===========߿ + tempCanvas->Pen->Color = CLR_BKG_EXTERNAL_FRMAE; + + tempCanvas->MoveTo( LEN_BKG_EXTERNAL_FRMAE, 0 ); + tempCanvas->LineTo( Width-LEN_BKG_EXTERNAL_FRMAE, 0 ); + + tempCanvas->MoveTo( LEN_BKG_EXTERNAL_FRMAE, Height-LEN_BKG_EXTERNAL_FRMAE ); + tempCanvas->LineTo( Width-LEN_BKG_EXTERNAL_FRMAE, Height-LEN_BKG_EXTERNAL_FRMAE ); + + tempCanvas->MoveTo( 0, LEN_BKG_EXTERNAL_FRMAE ); + tempCanvas->LineTo( 0, Height-LEN_BKG_EXTERNAL_FRMAE ); + + tempCanvas->MoveTo( Width-LEN_BKG_EXTERNAL_FRMAE, LEN_BKG_EXTERNAL_FRMAE ); + tempCanvas->LineTo( Width-LEN_BKG_EXTERNAL_FRMAE, Height-LEN_BKG_EXTERNAL_FRMAE ); + + //===========ָ + int iLineHeight = LEN_BKG_INTERNAL_LINE; + + tempCanvas->Pen->Color = CLR_BKG_INTERNAL_LINE_HIG; + tempCanvas->MoveTo( LEN_BKG_EXTERNAL_FRMAE, iLineHeight ); + tempCanvas->LineTo( Width-LEN_BKG_EXTERNAL_FRMAE, iLineHeight ); + tempCanvas->MoveTo( LEN_BKG_EXTERNAL_FRMAE, iLineHeight+2 ); + tempCanvas->LineTo( Width-LEN_BKG_EXTERNAL_FRMAE, iLineHeight+2 ); + + tempCanvas->Pen->Color = CLR_BKG_INTERNAL_LINE_BLACK; + tempCanvas->MoveTo( LEN_BKG_EXTERNAL_FRMAE, iLineHeight+1 ); + tempCanvas->LineTo( Width-LEN_BKG_EXTERNAL_FRMAE, iLineHeight+1 ); + + // + tempCanvas->Font->Color = CLR_TXT_HOT; + tempCanvas->Brush->Style = bsClear; + TSize size = tempCanvas->TextExtent( Caption ); + X = LEN_BKG_EXTERNAL_FRMAE + ( Width - size.Width )/2, + Y = LEN_BKG_EXTERNAL_FRMAE + ( LEN_BKG_INTERNAL_LINE-size.Height )/2; + X = ( Width - size.Width )/2; + Y = ( LEN_BKG_INTERNAL_LINE-size.Height )/2; + tempCanvas->TextOut( X, Y, Caption ); + + delete tempCanvas; + + Message.Result = true; +} +//--------------------------------------------------------------------------- + +void __fastcall TNotificationForm::WMNCHitTest(TWMNCHitTest &Msg) +{ + TForm::Dispatch(&Msg); + + if( Msg.Result==HTCLIENT && + (Msg.YPosLeft) ) ) + { + Msg.Result = HTCAPTION; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TNotificationForm::m_PNGButtonCloseClick(TObject *Sender) +{ + m_pNotiShutDownTimer->Enabled = false; + this->Close(); +} +//--------------------------------------------------------------------------- +void __fastcall TNotificationForm::NotiChangeMouseEnter(TObject *Sender) +{ + m_pTextNotiTimer->Enabled = false; +} +//--------------------------------------------------------------------------- +void __fastcall TNotificationForm::NotiChangeMouseLeave(TObject *Sender) +{ + m_pTextNotiTimer->Enabled = true; +} +//--------------------------------------------------------------------------- + +void __fastcall TNotificationForm::ClearJsonDirect() +{ + String fileDirect = g_strUserPath.c_str(); + fileDirect += JSON_PIC_DERICTORY; + + if( DirectoryExists(fileDirect) ) { + TDirectory *clearDirect = new TDirectory(); + clearDirect->Delete(fileDirect, true); + delete clearDirect; + } +} +//--------------------------------------------------------------------------- + + + + diff --git a/NotificationFormUnit.dfm b/NotificationFormUnit.dfm new file mode 100644 index 0000000..203b126 --- /dev/null +++ b/NotificationFormUnit.dfm @@ -0,0 +1,169 @@ +object NotificationForm: TNotificationForm + Left = 0 + Top = 0 + BorderStyle = bsNone + Caption = #21809#20316#32593#21160#24577 + ClientHeight = 330 + ClientWidth = 268 + Color = clBtnFace + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + FormStyle = fsStayOnTop + Scaled = False + OnClose = FormClose + OnShow = FormShow + TextHeight = 13 + object m_PNGButtonClose: TPNGButton + Left = 240 + Top = 4 + Width = 23 + Height = 18 + ImgStates = 3 + ModalResult = 8 + PngImg.Data = { + 89504E470D0A1A0A0000000D49484452000000450000001208060000000D0613 + 66000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F33000006B94944415478DABD58094C544718 + 9EDDE5580159451456B45AAF6A6BAB8918B0948A495B540E8F2A8A8AA0A82508 + 08222851ACF5880222A055A15A5CD4A25851118CA890D818164CDA7A8416E3D1 + 5691E241E53E97DDED3FEC0CFBEF6337D0A4F2922FEFBD7933DFFBE79B7FFEF9 + 67445AAD96BC8D4BAD56F3471182984184AA6A1984F5F1770D8356505F64E41F + FF955BC8A91561515047FECF8B8A20019801CC19CC58393746CDEE58386E7427 + 40C5D0C9EA6A5027C5E81F1C22D4490DE2168AA246E816FE6D8BC28DA6425802 + AC00D600292BC31DD7B0FA58305ADE066806B400DA9938BCA358700B04EE8DC6 + 04E7A2508E0E846EC185A250C31D0072C000647423E039A016600B180190A111 + 6D05BC00BC649DC0A2489820D6AC8D1DBB0F609DD12283C4AC4C8404A907BC61 + F766260CEF2817DC82F159B33B17064F3D6E0B1744C5EC6E66F70E56D6C3536C + 97FA2F4F529696ADC3C32D9148D4DFECD8FEF5CA8015B94545C59F844544A6B5 + B4B458E13AAE2E2E8A7339D991CC782C8A19335436D7DB37AABCFCB72821775A + EA81745F1FEF67BFDEB963E7BF2C20ACB5B5D51AD7797FD2A46F0BAF162431EE + 16261841A258797ACE897A5E55B50DB7138BC59D911B22360607AF7E58545CEC + B06953EC41954A25C375E4727942D18D6B894818A39EF291E76CAF53150F1EBC + 871B0F1C38B0F1DCD9EC63EB4242FD2A2B2B47E06FE3C78F7B5C7CE3DA0A78BC + 67C453B82883008E6EEE1E87A1BD735FB99D860FBF5BAABC15C23CB19619DFC9 + BC40C245A1A2BBBBCF54BCA9ADFD14B7975A5AFE939696BA694B5CDCE6DADABA + 89F89B4C26532A4B6EAD4062AB8C89426FB6F7EEDD9FB33C2030A3A1A1C14055 + 7373F30E50DA0297D9DADAD62B328FAF77769E960FAF0DC4F0E22E2B65A2C87F + AFA8F870B19F7F726363E3A0DEB841ACBA1F4E67C54C9D32E53EBCFE0DA863A2 + 0BA74F97284AA5724C7844E4D9B6B6B6A1026F6C83BE490DC4924A5FEF4F4A5C + 3E6B96C7A3BE88423BE2704271327CE7AEDD9BA14C424C5CE09EDA6D5BE312D7 + 04AF4E85D75744BF2A18D8447431850A4C63D598F3B9173E8F89DD12DC1BF7BE + BD7B8E2F5DE2771D5EFF005433E3794C21441F8306307EFBC3478E7AA4A76724 + 68341A3353DC229148F3D5BAB55BC2C3C38AE1B586F1720FD4985A7D28E1071B + A3639268074C912FFA72E18D03C949B1F0584EF4F3BC47FF882EF051A31DA928 + 8049C0EDD107EE9BF0F800F084E8A60F35BE83182EC95C14BA00500F9107AF59 + BBB8ACEC7690296E575717C5F7C78FFDC8847E4D741EDE3D2D4D89423B3175C9 + D265474ACB6E4F33453EC3D5E5979CB3D9A1F07897196B4A144B6634F594B180 + 89C0BDA00FDC97E0B1828952CD8C6F37218A8C89E2386FFE8288C78F9F789AE2 + 1E376EECB5BC4B170F2151B0A7181585BAF4C81D3B77EDC9CC542C23BD5C3075 + 4E6D8FDF1A4F744BB630D1E1B9018F29C30163F6EE4BF03B9AFEDDC2DEB8C3D6 + 87E6C6C644D311A5D307C7149CA75051AC18BF3DAC30FE570B0B37F6C6EDE535 + 777F62C2BE1CA29B3E9497AF6A3DA60FED845D7EC195C0C8A8E8BDC2C067636D + DDD4D4DC6C83CB68804C4D498EF3F1F6CA22BA7C429856F3911C4C452928B8E2 + B6212A7A4F5FB9D35292B77A7B7B953051F0EA43883ED076E54027140AE79494 + B42C6150B5B0B0A8EDE8E8188CCB68F08D8ADA10B82A28E867A2CF818C065AEB + AAAAAA993EF3162A6A6A6A0C22F8E8D1A39E9EC93E9DE9E3BB204CF8CDDEDEFE + 757EDE85202727A79F18391685AF0E764F9F3E1BEDED3BFF647D7DBD93903BE7 + 4CF6192F9F79C1426E5836AB0A2E5F5A396AD43B7F31D1F92AC145E9CA94CBCB + CB1D028356E7C3CAF32E6E3F64C89072881FBB030256263536358DC4DF6005FA + 334B91E93379F2E497449F31F71065E8675FCC3EF7F0E1230FDC98E611B0EC86 + 4C9FEE5C065E341B82E481F6F6764B5C67C284F1378BAE17FA11DD1C25C8E86E + F77699E176A8BAFA85B78187D8D834E45DCC4D855CA7B1A444392C705570388C + AAC148CBE58E05B74B4BC289A19BF33CA52B9BFDD8CD3D1DC45E64D069C85132 + 32D243215DA8CBBB9C3F223E7EFB413AF002D1CF43AE1242F4C99B5A280A359E + CEFB61EC67F4D230632A892EDDA77397A7F97C1F41C95E31176F11780A1545CA + 5C9CB6A569BE2D2B13337E9EE6F3644CCCDE69FC68601E52C7BCB08DF49C3E16 + A4E7BE8AEF7D789ACFF74922A24FF3F1BE8AA7F99AFED810F28E4A99E156EC99 + E7116AA2DF10F2CD9D187D6B6546B7B04EA8883EA0637EBE19342786BB6C9CE8 + 8905DC2AA2DF1072DE7ED92573C3F94E961F1DE091C43B590931DCE5F2A303BC + 93D5929E470D6646DA727E7E89914DF8DF7C50FAE5E8000B830F984C1DF4080F + 8BF037E14113216FE990E95FF02F3670DC3FF48F0000000049454E44AE426082} + OnClick = m_PNGButtonCloseClick + end +end diff --git a/NotificationFormUnit.h b/NotificationFormUnit.h new file mode 100644 index 0000000..78bb35a --- /dev/null +++ b/NotificationFormUnit.h @@ -0,0 +1,70 @@ +//--------------------------------------------------------------------------- + +#ifndef NotificationFormUnitH +#define NotificationFormUnitH +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include +#include +#include +#include + +#include "NotificationContentPanelUnit.h" +#include "NotificationADPanelUnit.h" +#include "PNGButton.hpp" +#include "NotificationThreadUnit.h" + +//--------------------------------------------------------------------------- +class TNotificationForm : public TForm +{ +__published: // IDE-managed Components + TPNGButton *m_PNGButtonClose; + void __fastcall FormShow(TObject *Sender); + void __fastcall FormClose(TObject *Sender, TCloseAction &Action); + void __fastcall m_PNGButtonCloseClick(TObject *Sender); +private: // User declarations + int m_ModalResult; + TTimer *m_pNotiShutDownTimer; + + VCTJSON m_VCJsonAD; + VCTJSON m_VCJonNoti; + VCTJSONDB m_VCJsonContent; + void __fastcall ClearJsonDirect(); + + TNotiADPanel *m_pNotiADPanel; + + void __fastcall NotificationTimerProc(TObject* Sender); + TTimer *m_pTextNotiTimer; + int m_iTextNotiIndex; + TUrlLabel *m_pNotiUrl; + void __fastcall NotiChangeMouseEnter(TObject *Sender); + void __fastcall NotiChangeMouseLeave(TObject *Sender); + + TNotiContenPanel *m_pNotiContenPanel; + + TNotificationThread *m_pNotificationThread; + + void __fastcall CreateParams(Vcl::Controls::TCreateParams &Params); + + void __fastcall WMNCHitTest(TWMNCHitTest &Msg); + MESSAGE void __fastcall WMEraseBkgnd(TWMEraseBkgnd &Message); + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(WM_NCHITTEST, TWMNCHitTest, WMNCHitTest) + MESSAGE_HANDLER(WM_ERASEBKGND, TWMEraseBkgnd, WMEraseBkgnd) + END_MESSAGE_MAP( TForm ) + +public: // User declarations + + bool __fastcall ParseJson(); + bool __fastcall LoadImg(); + void __fastcall setPANEL(); + __fastcall TNotificationForm(TComponent* Owner); + __fastcall ~TNotificationForm(); +}; +//--------------------------------------------------------------------------- +extern PACKAGE TNotificationForm *NotificationForm; +#endif diff --git a/NotificationThreadUnit.cpp b/NotificationThreadUnit.cpp new file mode 100644 index 0000000..8ed1dc3 --- /dev/null +++ b/NotificationThreadUnit.cpp @@ -0,0 +1,33 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop + +#include "NotificationThreadUnit.h" +#include "NotificationFormUnit.h" +#pragma package(smart_init) +//--------------------------------------------------------------------------- +__fastcall TNotificationThread::TNotificationThread(bool CreateSuspended, TForm* pForm) + : TThread(CreateSuspended) +{ + m_pForm = pForm; +} +//--------------------------------------------------------------------------- +void __fastcall TNotificationThread::Execute() +{ + + if( ((TNotificationForm *)m_pForm)->ParseJson() && + ((TNotificationForm *)m_pForm)->LoadImg() ) + { + PostMessage(Application->MainForm->Handle, UM_NOTIFICATION, + NOTIFICATION_SHOW_FORM , 0 ); + }else{ + PostMessage(Application->MainForm->Handle, UM_NOTIFICATION, + NOTIFICATION_NO_JSONDATA, 0 ); + } +} +//--------------------------------------------------------------------------- + + + + + diff --git a/NotificationThreadUnit.h b/NotificationThreadUnit.h new file mode 100644 index 0000000..4940f98 --- /dev/null +++ b/NotificationThreadUnit.h @@ -0,0 +1,25 @@ +//--------------------------------------------------------------------------- + +#ifndef NotificationThreadUnitH +#define NotificationThreadUnitH +#include +#include "GlobalUnit.h" +//--------------------------------------------------------------------------- +#define NOTIFICATION_GETNOTI_PERIOD ( 5*1000 ) +#define NOTIFICATION_CUSNOTI_PERIOD ( 5*1000 ) +#define NOTIFICATION_SHOW_CLOSED 0 +#define NOTIFICATION_NO_JSONDATA 1 +#define NOTIFICATION_MENU_JSONDATA 2 +#define NOTIFICATION_SHOW_FORM 3 +//--------------------------------------------------------------------------- +class TNotificationThread : public TThread +{ +private: + TForm * m_pForm; +protected: + void __fastcall Execute(); +public: + __fastcall TNotificationThread(bool CreateSuspended, TForm* pForm); +}; +//--------------------------------------------------------------------------- +#endif diff --git a/PNGButton.hpp b/PNGButton.hpp new file mode 100644 index 0000000..3d08005 --- /dev/null +++ b/PNGButton.hpp @@ -0,0 +1,96 @@ +// CodeGear C++Builder +// Copyright (c) 1995, 2011 by Embarcadero Technologies, Inc. +// All rights reserved + +// (DO NOT EDIT: machine generated header) 'PNGButton.pas' rev: 23.00 (Win32) + +#ifndef PngbuttonHPP +#define PngbuttonHPP + +#pragma delphiheader begin +#pragma option push +#pragma option -w- // All warnings off +#pragma option -Vx // Zero-length empty class member functions +#pragma pack(push,8) +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit +#include // Pascal unit + +//-- user supplied ----------------------------------------------------------- + +namespace Pngbutton +{ +//-- type declarations ------------------------------------------------------- +class DELPHICLASS TPNGButton; +class PASCALIMPLEMENTATION TPNGButton : public Vcl::Controls::TGraphicControl +{ + typedef Vcl::Controls::TGraphicControl inherited; + +private: + System::Classes::TNotifyEvent FOnMouseEnter; + System::Classes::TNotifyEvent FOnMouseLeave; + System::Uitypes::TModalResult FModalResult; + +protected: + int EtatBtn; + bool FDown; + int FStateCount; + Vcl::Imaging::Pngimage::TPngImage* FPngImg; + DYNAMIC void __fastcall MouseDown(System::Uitypes::TMouseButton Button, System::Classes::TShiftState Shift, int X, int Y); + DYNAMIC void __fastcall MouseUp(System::Uitypes::TMouseButton Button, System::Classes::TShiftState Shift, int X, int Y); + MESSAGE void __fastcall MouseEnter(Winapi::Messages::TMessage &Msg); + MESSAGE void __fastcall MouseLeave(Winapi::Messages::TMessage &Msg); + virtual void __fastcall SetEnabled(bool Value); + +public: + __fastcall virtual TPNGButton(System::Classes::TComponent* AOwner); + __fastcall virtual ~TPNGButton(void); + void __fastcall SetStateCount(int value); + void __fastcall SetPngImg(Vcl::Imaging::Pngimage::TPngImage* value); + void __fastcall SetDown(bool value); + virtual void __fastcall Paint(void); + DYNAMIC void __fastcall Click(void); + +__published: + __property Action; + __property Anchors = {default=3}; + __property bool Down = {read=FDown, write=SetDown, default=0}; + __property Enabled = {default=1}; + __property int ImgStates = {read=FStateCount, write=SetStateCount, default=4}; + __property System::Uitypes::TModalResult ModalResult = {read=FModalResult, write=FModalResult, default=0}; + __property ParentShowHint = {default=1}; + __property Vcl::Imaging::Pngimage::TPngImage* PngImg = {read=FPngImg, write=SetPngImg}; + __property PopupMenu; + __property ShowHint; + __property Visible = {default=1}; + __property OnClick; + __property OnContextPopup; + __property OnMouseDown; + __property OnMouseUp; + __property OnMouseMove; + __property System::Classes::TNotifyEvent OnMouseEnter = {read=FOnMouseEnter, write=FOnMouseEnter}; + __property System::Classes::TNotifyEvent OnMouseLeave = {read=FOnMouseLeave, write=FOnMouseLeave}; +}; + + +//-- var, const, procedure --------------------------------------------------- +extern PACKAGE void __fastcall Register(void); + +} /* namespace Pngbutton */ +#if !defined(DELPHIHEADER_NO_IMPLICIT_NAMESPACE_USE) && !defined(NO_USING_NAMESPACE_PNGBUTTON) +using namespace Pngbutton; +#endif +#pragma pack(pop) +#pragma option pop + +#pragma delphiheader end. +//-- end unit ---------------------------------------------------------------- +#endif // PngbuttonHPP diff --git a/PanelDB.cpp b/PanelDB.cpp new file mode 100644 index 0000000..449e18f --- /dev/null +++ b/PanelDB.cpp @@ -0,0 +1,240 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop + +#include "PanelDB.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +//--------------------------------------------------------------------------- +__fastcall TPanelDB::TPanelDB(TComponent* AOwner) + : Vcl::Extctrls::TPanel(AOwner) +{ + ParentColor = false; + Ctl3D = false; + ParentCtl3D = false; + DoubleBuffered = true; + + m_bBkgDrawed = false; + m_bDBCreated = false; + + m_BtnSel = m_BtnFocus = NULL; + m_bLeft = false; + + m_CanvasDr = new TCanvas(); + m_CanvasDr->Font->Name = "Tahoma"; + + m_BMPBkg = NULL; +} +//--------------------------------------------------------------------------- +__fastcall TPanelDB::~TPanelDB() +{ + SAFE_DELETE(m_BMPBkg) + BtnClear(); + DCRelease(); + SAFE_DELETE( m_CanvasDr ); +} +//--------------------------------------------------------------------------- +void __fastcall TPanelDB::CreateWnd(void) +{ + Vcl::Extctrls::TPanel::CreateWnd(); +} +//--------------------------------------------------------------------------- +void __fastcall TPanelDB::CreateParams(Controls::TCreateParams &Params) +{ + Vcl::Extctrls::TPanel::CreateParams(Params); +} +//--------------------------------------------------------------------------- +void __fastcall TPanelDB::WMEraseBkgnd(TWMEraseBkgnd &Message) +{ + Message.Result = true; +} +//--------------------------------------------------------------------------- +void __fastcall TPanelDB::WMSize(Winapi::Messages::TWMSize &Message) +{ + DCRelease(); + DCInit(); +} +//--------------------------------------------------------------------------- +void __fastcall TPanelDB::DCInit() +{ + m_BufDC = CreateCompatibleDC(Canvas->Handle); + m_BufBitmap = CreateCompatibleBitmap(Canvas->Handle, Width, Height); + SelectObject(m_BufDC, m_BufBitmap); + m_CanvasDr->Handle = m_BufDC; + m_bDBCreated = true; +} +//--------------------------------------------------------------------------- +void __fastcall TPanelDB::DCRelease() +{ + DeleteDC(m_BufDC); + DeleteObject(m_BufBitmap); +} +//--------------------------------------------------------------------------- +void __fastcall TPanelDB::Paint() +{ + if( !m_bDBCreated || !m_CanvasDr ) DCInit(); + DoPaintBKG(m_CanvasDr); + + if(FOnPaintBKG) FOnPaintBKG(this, m_CanvasDr, TRect(0, 0, Width, Height)); + + DoPaintLst(m_CanvasDr); + + BitBlt(Canvas->Handle, + 0, 0, Width, Height, + m_CanvasDr->Handle, + 0, 0, SRCCOPY); +} +//--------------------------------------------------------------------------- +void __fastcall TPanelDB::DoPaintBKG(TCanvas *pCanvas) +{ + if( m_BMPBkg && Width==m_BMPBkg->Width && Height==m_BMPBkg->Height) { + StretchBlt(pCanvas->Handle, 0, 0, Width, Height, + m_BMPBkg->Canvas->Handle, 0, 0, Width, Height, + SRCCOPY); + } + else { + m_bBkgDrawed = false; + } + + if( !m_bBkgDrawed) { + + TRect rtThis = TRect(0, 0, Width, Height); + + if( FOnDrawBKG ) { + FOnDrawBKG(this, pCanvas, rtThis); + } + else { + pCanvas->Brush->Color = this->Color; + pCanvas->FillRect(rtThis); + } + + if( !m_BMPBkg ) { + m_BMPBkg = new TBitmap(); + } + m_BMPBkg->SetSize(Width, Height); + StretchBlt(m_BMPBkg->Canvas->Handle, 0, 0,Width, Height, + pCanvas->Handle, 0, 0,Width, Height, + SRCCOPY); + m_bBkgDrawed = true; + } +} +//--------------------------------------------------------------------------- +void __fastcall TPanelDB::DoPaintLst(TCanvas *pCanvas) +{ + BTNLST::iterator lst_FBTNLST; + for( lst_FBTNLST = m_LstBtn.begin(); + lst_FBTNLST != m_LstBtn.end(); + lst_FBTNLST++ ) + { + (*lst_FBTNLST)->Paint(pCanvas); + } +} +//--------------------------------------------------------------------------- +void __fastcall TPanelDB::MouseDown(System::Uitypes::TMouseButton Button, System::Classes::TShiftState Shift, int X, int Y) +{ + TPoint pt = TPoint(X, Y); + TStateBtn *pCur = GetBtnCur(pt); + NULL_RETURN(pCur) + + if( Button==mbLeft ) { + m_bLeft = true; + BtnDown(pCur, pt); + } + else if( Button==mbRight ) { + m_bLeft = false; + BtnDown(pCur, pt, false); + } + + m_BtnSel = pCur; +} +//--------------------------------------------------------------------------- +void __fastcall TPanelDB::MouseUp(System::Uitypes::TMouseButton Button, System::Classes::TShiftState Shift, int X, int Y) +{ + TPoint pt = TPoint(X, Y); + if( Button==mbLeft ) { + BtnUp(m_BtnFocus, m_BtnSel, pt); + } + else if( Button==mbRight ) { + BtnUp(m_BtnFocus, m_BtnSel, pt, false); + } + + if( m_BtnFocus==m_BtnSel && m_BtnSel ) { + if( m_bLeft && m_BtnSel->OnClick ) + m_BtnSel->OnClick(m_BtnSel); + else if( !m_bLeft && m_BtnSel->OnClickR ) + m_BtnSel->OnClickR(m_BtnSel); + } + + m_BtnSel = NULL; +} +//--------------------------------------------------------------------------- +void __fastcall TPanelDB::MouseMove(System::Classes::TShiftState Shift, int X, int Y) +{ + TPoint pt = TPoint(X, Y); + TStateBtn *pCur = GetBtnCur(pt); + + BtnMove(pCur, pt); + + m_BtnFocus = pCur; +} +//--------------------------------------------------------------------------- +void __fastcall TPanelDB::CMMouseLeave(TMessage &Message) +{ + BtnMove(NULL, TPoint(-1, -1)); + + BtnLeave(); + + m_BtnFocus = NULL; + m_BtnSel = NULL; +} +//--------------------------------------------------------------------------- +void __fastcall TPanelDB::Click(void) +{ + if( OnClick ) OnClick(this); +} +//--------------------------------------------------------------------------- +void __fastcall TPanelDB::DblClick(void) +{ + if( m_BtnFocus ) { + if( m_bLeft && m_BtnFocus->OnDBClick ) + m_BtnFocus->OnDBClick(m_BtnFocus); + } + + if( OnDblClick ) OnDblClick(this); +} +//--------------------------------------------------------------------------- +TStateBtn* __fastcall TPanelDB::GetBtnCur(TPoint pt) +{ + TStateBtn *pCur = 0; + BTNLST::iterator lst_FBTNLST; + for( lst_FBTNLST = m_LstBtn.begin(); + lst_FBTNLST!= m_LstBtn.end(); + lst_FBTNLST++ ) + { + pCur = (*lst_FBTNLST)->GetSubCusor( pt ); + if( pCur ) { break; } + } + + return pCur; +} +//--------------------------------------------------------------------------- +void __fastcall TPanelDB::BtnAdd(TStateBtn *pBtn) +{ + m_LstBtn.push_back(pBtn); +} +//--------------------------------------------------------------------------- +void __fastcall TPanelDB::BtnClear() +{ + if(m_LstBtn.size()<=0) return; + + BTNLST::iterator lst_FBTNLST; + for( lst_FBTNLST = m_LstBtn.begin(); + lst_FBTNLST!= m_LstBtn.end(); + lst_FBTNLST++ ) + { + TStateBtn *pBtn = *lst_FBTNLST; + SAFE_DELETE(pBtn) + } + m_LstBtn.clear(); +} +//--------------------------------------------------------------------------- diff --git a/PanelDB.h b/PanelDB.h new file mode 100644 index 0000000..6989f6e --- /dev/null +++ b/PanelDB.h @@ -0,0 +1,76 @@ +//--------------------------------------------------------------------------- +#ifndef PanelDBH +#define PanelDBH +//--------------------------------------------------------------------------- +#include "StateBtn.h" +//--------------------------------------------------------------------------- +//double buffer panel +typedef void __fastcall (__closure *NotifyPaint)(TPanelDB *Sender, TCanvas *pCanvas, TRect rtBKG); +class TPanelDB : public Extctrls::TPanel +{ +private: + + bool m_bDBCreated; + HDC m_BufDC; + HBITMAP m_BufBitmap; + +protected: + + TStateBtn *m_BtnSel, *m_BtnFocus; //may be parent, may be sub + bool m_bLeft; + + bool m_bBkgDrawed; + NotifyPaint FOnDrawBKG, FOnPaintBKG; + + void __fastcall DCInit(); + void __fastcall DCRelease(); + + BTNLST m_LstBtn; + TStateBtn* __fastcall GetBtnCur(TPoint pt); + + virtual void __fastcall BtnDown(TStateBtn *pCur, TPoint pt, bool bLeft=true) {} + virtual void __fastcall BtnUp(TStateBtn *pCur, TStateBtn *pSel, TPoint pt, bool bLeft=true) {} + virtual void __fastcall BtnMove(TStateBtn *pCur, TPoint pt) {} + virtual void __fastcall BtnLeave() {} + + virtual void __fastcall DoPaintBKG(TCanvas *pCanvas); + virtual void __fastcall DoPaintLst(TCanvas *pCanvas); + + virtual void __fastcall Paint(void); + virtual void __fastcall CreateWnd(void); + virtual void __fastcall CreateParams(Controls::TCreateParams &Params); + + DYNAMIC void __fastcall Click(void); + DYNAMIC void __fastcall DblClick(void); + DYNAMIC void __fastcall MouseDown(System::Uitypes::TMouseButton Button, System::Classes::TShiftState Shift, int X, int Y); + DYNAMIC void __fastcall MouseMove(System::Classes::TShiftState Shift, int X, int Y); + DYNAMIC void __fastcall MouseUp(System::Uitypes::TMouseButton Button, System::Classes::TShiftState Shift, int X, int Y); + MESSAGE void __fastcall CMMouseLeave(TMessage &Message); + + MESSAGE void __fastcall WMEraseBkgnd(TWMEraseBkgnd &Message); + MESSAGE void __fastcall WMSize(Winapi::Messages::TWMSize &Message); + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(WM_ERASEBKGND, TWMEraseBkgnd, WMEraseBkgnd) + MESSAGE_HANDLER(WM_SIZE, TWMSize, WMSize) + MESSAGE_HANDLER(CM_MOUSELEAVE, TMessage, CMMouseLeave) + END_MESSAGE_MAP( Vcl::Extctrls::TPanel ) + +public: + + TCanvas *m_CanvasDr; //use for double buffer canvas + TBitmap *m_BMPBkg; //backgroud save + TRect m_RtContent; //content rect + + void __fastcall BtnAdd(TStateBtn *pBtn); + void __fastcall BtnClear(); + + __fastcall TPanelDB(System::Classes::TComponent* AOwner); + __fastcall ~TPanelDB(); + +__published: + + __property NotifyPaint OnDrawBKG = { read=FOnDrawBKG, write=FOnDrawBKG }; + __property NotifyPaint OnPaintBKG = { read=FOnPaintBKG, write=FOnPaintBKG }; +}; +//--------------------------------------------------------------------------- +#endif diff --git a/PayMentFormUnit.cpp b/PayMentFormUnit.cpp new file mode 100644 index 0000000..8dcb893 --- /dev/null +++ b/PayMentFormUnit.cpp @@ -0,0 +1,166 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop + +#include "PayMentFormUnit.h" +#include "GlobalUnit.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma link "GeneralDialogPanel" +#pragma link "TextButton" +#pragma resource "*.dfm" +TPayMentForm *PayMentForm; +#define CLIENT_TOP 23 +#define PANEL_LEFT 20 +#define PANEL_TOP 42 +#define PANEL_BOTTOM 15 +#define PANEL_HEIGHT 150 + +//--------------------------------------------------------------------------- +__fastcall TPayMentForm::TPayMentForm(TComponent* Owner, int iOperation, int nIdCount, + UINT *aIdStyle, int *aStyleCost, + int nCost, int nBalance) + : TForm(Owner) +{ + int nLbHeight = (m_pTextButtonOK->Top - 23 - PANEL_HEIGHT)/2; + char bufBalance[200]; + sprintf( bufBalance, "ǰ˻ %d ", nBalance ); + m_pLabelBlance->Caption = bufBalance; + + m_pPayMentPanel = new TPayMentPanel(m_pGeneralDialogPanel); + m_pPayMentPanel->Parent = m_pGeneralDialogPanel; + m_pPayMentPanel->Left = PANEL_LEFT; + m_pPayMentPanel->Top = 23 + nLbHeight; + m_pPayMentPanel->Width = Width - 2*PANEL_LEFT; + m_pPayMentPanel->Height = PANEL_HEIGHT; + m_pPayMentPanel->SetContent(iOperation, nIdCount, aIdStyle, + aStyleCost, nCost, nBalance); + +/* char bufCost[200]; + if( nBalance>=nCost ){ + sprintf( bufCost, "β %d \nǷ֧?", nCost); + }else{ + m_pTextButtonOK->Visible = false; + sprintf( bufCost, "㣬¼վȡ"); + m_pLabelMessage->Font->Color = CLR_TEXT_LEAVE; + } + m_pLabelMessage->Caption = bufCost; +*/ + m_nUnPayment = nCost - nBalance; + + SetTransparent( this ); +} +//--------------------------------------------------------------------------- + +__fastcall TPayMentForm::~TPayMentForm() +{ + if( m_pPayMentPanel ){ + delete m_pPayMentPanel; + m_pPayMentPanel = NULL; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TPayMentForm::FormShow(TObject *Sender) +{ + int nLbHeight = (m_pTextButtonOK->Top - 23 - PANEL_HEIGHT)/2; + m_pLabelBlance->Left = (Width - m_pLabelBlance->Width)/2; + m_pLabelBlance->Top = 23 + (nLbHeight - m_pLabelBlance->Height)/2; + +/* nLbHeight = Height - (m_pPayMentPanel->Top + m_pPayMentPanel->Height); +// if(m_pTextButtonOK->Visible == false){ +// m_lblRecharge->Left = (m_pTextButtonCancel->Left - m_pLabelMessage->Width)/2; +// }else{ +// m_lblRecharge->Left = (m_pTextButtonOK->Left - m_pLabelMessage->Width)/2; +// } +// m_pLabelMessage->Top = m_pPayMentPanel->Top + m_pPayMentPanel->Height +// + (nLbHeight - m_pLabelMessage->Height)/2; + + m_pTextButtonCancel->Top = m_pPayMentPanel->Top + m_pPayMentPanel->Height + + (nLbHeight - m_pTextButtonCancel->Height)/2; + m_pTextButtonOK->Top = m_pPayMentPanel->Top + m_pPayMentPanel->Height + + (nLbHeight - m_pTextButtonOK->Height)/2; +*/ m_pPayMentPanel->SetSB(); + m_pPayMentPanel->SetFocus(); + + m_pTextButtonOK->Visible = m_nUnPayment<=0; + m_lblRecharge->Visible = m_nUnPayment>0; + m_lblVIP->Visible = g_infoUser.accountInfo.vipPeriod==0; + + if( m_lblVIP->Visible && m_lblRecharge->Visible ){ + m_lblVIP->Top += 3; + m_lblRecharge->Top += 3; + } + else if( m_lblRecharge->Visible ){ + m_lblRecharge->Top = m_lblVIP->Top; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TPayMentForm::RechargeClick(TObject *Sender) +{ +// if(m_pTextButtonOK->Visible == false){ + char strURL[256]; + f_CS_GetWebPageURL( URL_RECHARGE, strURL ); + String StrUrl = (String)strURL; + StrUrl += L"&coin=" + IntToStr(m_nUnPayment); + + ShellExecute(Handle, NULL, StrUrl.c_str(), NULL, NULL, SW_SHOWNORMAL); + +// ModalResult = mrCancel; +// } +} +//--------------------------------------------------------------------------- + +void __fastcall TPayMentForm::RechargeMouseEnter(TObject *Sender) +{ +// if(m_pTextButtonOK->Visible == false){ +// Screen->Cursor = crHandPoint; + m_lblRecharge->Font->Color = clAqua; +// } +} +//--------------------------------------------------------------------------- + +void __fastcall TPayMentForm::RechargeMouseLeave(TObject *Sender) +{ +// if(m_pTextButtonOK->Visible == false){ +// Screen->Cursor = crDefault; + m_lblRecharge->Font->Color = clHighlight; +// } +} +//--------------------------------------------------------------------------- + +void __fastcall TPayMentForm::VIPMouseEnter(TObject *Sender) +{ + m_lblVIP->Font->Color = clAqua; +} +//--------------------------------------------------------------------------- + +void __fastcall TPayMentForm::VIPMouseLeave(TObject *Sender) +{ + m_lblVIP->Font->Color = clHighlight; +} +//--------------------------------------------------------------------------- + +void __fastcall TPayMentForm::VIPClick(TObject *Sender) +{ + char strURL[256]; + f_CS_GetWebPageURL( URL_VIPMEMBER, strURL ); + + String StrUrl = (String)strURL; + ShellExecute(Handle, NULL, StrUrl.c_str(), NULL, NULL, SW_SHOWNORMAL); + +// ModalResult = mrCancel; +} +//--------------------------------------------------------------------------- + +void __fastcall TPayMentForm::FormCreate(TObject *Sender) +{ + m_pGeneralDialogPanel->Font->Size = g_szFont9; + m_pTextButtonOK->FontSize = g_szFont9; + m_pTextButtonCancel->FontSize = g_szFont9; + m_pPayMentPanel->SetTextFontSize( g_szFont9 ); +} +//--------------------------------------------------------------------------- + diff --git a/PayMentFormUnit.dfm b/PayMentFormUnit.dfm new file mode 100644 index 0000000..f0e8360 --- /dev/null +++ b/PayMentFormUnit.dfm @@ -0,0 +1,97 @@ +object PayMentForm: TPayMentForm + Left = 0 + Top = 0 + BorderStyle = bsNone + Caption = 'PayMentForm' + ClientHeight = 261 + ClientWidth = 418 + Color = clBtnFace + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Position = poMainFormCenter + Scaled = False + OnCreate = FormCreate + OnShow = FormShow + TextHeight = 13 + object m_pGeneralDialogPanel: TGeneralDialogPanel + Left = 0 + Top = 0 + Width = 418 + Height = 261 + Caption = #25903#20184#26126#32454 + Color = 5064257 + ParentBackground = False + TabOrder = 0 + object m_pTextButtonOK: TTextButton + Left = 278 + Top = 220 + Width = 56 + Height = 25 + ModalResult = mrYes + ParentShowHint = False + ShowHint = True + Text = #30830#23450 + end + object m_pTextButtonCancel: TTextButton + Left = 342 + Top = 220 + Width = 56 + Height = 25 + ModalResult = mrCancel + ParentShowHint = False + ShowHint = True + Text = #21462#28040 + end + object m_pLabelBlance: TLabel + Left = 143 + Top = 40 + Width = 135 + Height = 14 + Caption = #24403#21069#36134#25143#29616#26377' 0 '#21809#20316#38899#31526 + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object m_lblRecharge: TLabel + Left = 22 + Top = 209 + Width = 144 + Height = 14 + Cursor = crHandPoint + Caption = #36134#25143#20313#39069#19981#36275#65292#35831#20805#20540#20817#25442 + Font.Charset = DEFAULT_CHARSET + Font.Color = clHighlight + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [fsUnderline] + ParentFont = False + OnClick = RechargeClick + OnMouseEnter = RechargeMouseEnter + OnMouseLeave = RechargeMouseLeave + end + object m_lblVIP: TLabel + Left = 22 + Top = 231 + Width = 158 + Height = 14 + Cursor = crHandPoint + Caption = #25104#20026'VIP'#65292#20813#21151#33021#36153#65292#39118#26684'8'#25240 + Font.Charset = DEFAULT_CHARSET + Font.Color = clHighlight + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [fsUnderline] + ParentFont = False + OnClick = VIPClick + OnMouseEnter = VIPMouseEnter + OnMouseLeave = VIPMouseLeave + end + end +end diff --git a/PayMentFormUnit.h b/PayMentFormUnit.h new file mode 100644 index 0000000..ab8dc79 --- /dev/null +++ b/PayMentFormUnit.h @@ -0,0 +1,44 @@ +//--------------------------------------------------------------------------- + +#ifndef PayMentFormUnitH +#define PayMentFormUnitH +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include "GeneralDialogPanel.h" +#include +#include "TextButton.h" +#include "PayMentPanelUnit.h" +//--------------------------------------------------------------------------- +class TPayMentForm : public TForm +{ +__published: // IDE-managed Components + TGeneralDialogPanel *m_pGeneralDialogPanel; + TTextButton *m_pTextButtonOK; + TTextButton *m_pTextButtonCancel; + TLabel *m_pLabelBlance; + TLabel *m_lblRecharge; + TLabel *m_lblVIP; + void __fastcall FormShow(TObject *Sender); + void __fastcall RechargeClick(TObject *Sender); + void __fastcall RechargeMouseEnter(TObject *Sender); + void __fastcall RechargeMouseLeave(TObject *Sender); + void __fastcall VIPMouseEnter(TObject *Sender); + void __fastcall VIPMouseLeave(TObject *Sender); + void __fastcall VIPClick(TObject *Sender); + void __fastcall FormCreate(TObject *Sender); +private: // User declarations + TPayMentPanel *m_pPayMentPanel; + int m_nUnPayment; +public: // User declarations + __fastcall TPayMentForm(TComponent* Owner, int iOperation=0, int nIdCount=0, + UINT *aIdStyle=NULL, int *aStyleCost=NULL, + int nCost=0, int nBalance=0); + __fastcall ~TPayMentForm(); +}; +//--------------------------------------------------------------------------- +extern PACKAGE TPayMentForm *PayMentForm; +//--------------------------------------------------------------------------- +#endif diff --git a/PayMentPanelUnit.cpp b/PayMentPanelUnit.cpp new file mode 100644 index 0000000..50ed59b --- /dev/null +++ b/PayMentPanelUnit.cpp @@ -0,0 +1,456 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop + +#include +#include "PayMentPanelUnit.h" +#include "GlobalUnit.h" + +//--------------------------------------------------------------------------- +#pragma package(smart_init) +//--------------------------------------------------------------------------- +#define LINE_HEIGHT (20) +#define SCOLLBAR_WIDTH (14) +#define STYLE_NAME_WIDTH (Width/2) +#define STYLE_PAY_WIDTH (Width - STYLE_NAME_WIDTH - SCOLLBAR_WIDTH) +#define PANEL_HEIGHT 150 + +const static COLORREF + CLR_TXT_HOT = RGB(171, 186, 207), + CLR_BKG_INTERNAL = RGB(47, 50, 56), + CLR_BKG_INTERNAL_LIGHT = RGB(73, 77, 86), + CLR_CONTENT_DB_LINE_DARK = RGB(32, 35, 39), + CLR_CONTENT_DB_LINE_LIGHT = RGB(76, 81, 87); +//--------------------------------------------------------------------------- +__fastcall TPayMentPanel::TPayMentPanel( TComponent* Owner) + : Vcl::Extctrls::TPanel( Owner ) +{ + m_ScrollBar = NULL; + m_imgInfo = NULL; + + m_iTopLine = 0; + m_iShowLine = 1; + bStylePayShow = true; + DoubleBuffered = true; + ParentCtl3D = false; + Ctl3D = false; +} +//--------------------------------------------------------------------------- + +void __fastcall TPayMentPanel::CreateWnd() +{ + Vcl::Extctrls::TPanel::CreateWnd(); + + SetShowLine(); +} +//--------------------------------------------------------------------------- + +__fastcall TPayMentPanel::~TPayMentPanel() +{ + if( m_ScrollBar ){ + delete m_ScrollBar; + m_ScrollBar = NULL; + } + + if( m_imgInfo ){ + delete m_imgInfo; + m_imgInfo = NULL; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TPayMentPanel::WMEraseBkgnd(TWMEraseBkgnd &Message) +{ + + TRect rect = GetClientRect(); + + TCanvas* tempCanvas = new TCanvas; + tempCanvas->Handle = Message.DC; + + tempCanvas->Brush->Color = CLR_BKG_INTERNAL; //ɫ + tempCanvas->FillRect( rect ); + tempCanvas->Brush->Color = CLR_CONTENT_DB_LINE_DARK; + tempCanvas->FrameRect( rect ); + + delete tempCanvas; + tempCanvas = NULL; +} +//--------------------------------------------------------------------------- + +void __fastcall TPayMentPanel::WMVScroll(Winapi::Messages::TWMScroll &Message) +{ + int minpos, maxpos, page, curpos; + m_ScrollBar->GetScrollRange(&minpos, &maxpos); + page = m_ScrollBar->GetPageSize(); + // Get the current position of scroll box. + curpos = m_ScrollBar->GetScrollPos(); + + // Determine the new position of scroll box. + switch (Message.ScrollCode) + { + case SB_TOP: // Scroll to far top. + curpos = minpos; + break; + + case SB_BOTTOM: // Scroll to far bottom. + curpos = maxpos-page+1; + break; + + case SB_ENDSCROLL: // End scroll. + break; + + case SB_LINEUP: // Scroll left. + if (curpos > minpos) + curpos--; + break; + + case SB_LINEDOWN: // Scroll right. + if (curpos < maxpos-page+1) + curpos++; + break; + + case SB_PAGEUP: // Scroll one page left. + if (curpos > minpos) + curpos = (minpos > curpos-page) ? minpos : curpos-page; + //max(minpos, curpos-page); + break; + + case SB_PAGEDOWN: // Scroll one page right. + if( curposHandle ){ + m_ScrollBar->SetPosition(curpos); +// Paint(); + } + if( m_iTopLine != curpos ){ + m_iTopLine = curpos; +// Invalidate(); + if( m_nAddCost>0 ) { + InvalidateRect(this->Handle, + &TRect(0, LINE_HEIGHT, Width, Height-2*LINE_HEIGHT), + false); + }else{ + InvalidateRect(this->Handle, + &TRect(0, LINE_HEIGHT, Width, Height-LINE_HEIGHT), + false); + } + } + + Message.Result = true; +} +//--------------------------------------------------------------------------- + +void __fastcall TPayMentPanel::WMMouseWheel(TWMMouseWheel &Message) +{ + if( m_ScrollBar && m_ScrollBar->Visible ){ + UINT nSBCode; + + if( Message.WheelDelta>0 ) nSBCode = SB_LINEUP; + else nSBCode = SB_LINEDOWN; + + Perform( WM_VSCROLL, MAKELONG(nSBCode,0), NULL ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TPayMentPanel::SetContent(int iOperation, int nIdCount, + UINT *aIdStyle, int *aStyleCost, + int nCost, int nBalance) +{ + int nCostTotal = 0; + TPROSTYLE *tStyle = NULL; + + STYLEPAY stylePayName; + stylePayName.strStyleName = L""; + stylePayName.strStyleCost = L""; + m_VCStylePay.push_back(stylePayName); + + if( !(iOperation & e_PO_Pay4Compose ) ){ + bStylePayShow = false; + } + else{ + for(int i=0; ipOrigin->detail.strStyleName).c_str(); + + if( aStyleCost[i]>0 ){ + stylePayStyle.strStyleCost = IntToStr(aStyleCost[i]); + nCostTotal += aStyleCost[i]; + + m_VCStylePay.insert( m_VCStylePay.begin()+1, stylePayStyle ); + } + else{ + if( aStyleCost[i]==0 ) + stylePayStyle.strStyleCost = ""; + else if( aStyleCost[i]==-2 ) + stylePayStyle.strStyleCost = "֧"; + + m_VCStylePay.push_back(stylePayStyle); + } + } + } + + m_nAddCost = nCost - nCostTotal; + if( m_nAddCost>0 ) { + STYLEPAY stylePayDefault; + stylePayDefault.strStyleName = L"ܷ"; + stylePayDefault.strStyleCost = IntToStr(m_nAddCost); + m_VCStylePay.push_back(stylePayDefault); + + TPngImage *pPng = new TPngImage(); + m_imgInfo = new TImage(this); + pPng->LoadFromResourceName(int(HInstance), L"imgInfo"); + m_imgInfo->Picture->Assign(pPng); + m_imgInfo->Width = pPng->Width; + m_imgInfo->Height = pPng->Height; + m_imgInfo->Parent = this; + m_imgInfo->ShowHint = true; + SAFE_DELETE(pPng) + + String strInfo = L"ܷϸ\n"; + if( iOperation<=(e_PO_Pay4Basic|e_PO_Pay4Compose) ){ + strInfo += L"\n "; + strInfo += IntToStr(m_nAddCost); + } + else if( iOperation & e_PO_Pay4Midi ){ + if( iOperation & e_PO_Pay4Compose ){ + strInfo += L"\nMIDI "; + strInfo += IntToStr(m_nAddCost); + } + else{ + strInfo += L"\nƵתMIDI "; + strInfo += IntToStr(m_nAddCost); + } + } + else{ + int cost = m_nAddCost; + if( iOperation & e_PO_Pay4Audios ){ + strInfo += L"\nƵ "; + strInfo += IntToStr( 30 ); + cost -= 30; + } + + if( iOperation & e_PO_Pay4Fonts ){ + strInfo += L"\nضԴ "; + strInfo += IntToStr( cost ); + } + } + + m_imgInfo->Hint = strInfo; + } + + STYLEPAY stylePayTotal; + stylePayTotal.strStyleName = L"ϼƣ"; + stylePayTotal.strStyleCost = IntToStr(nCost); + m_VCStylePay.push_back(stylePayTotal); + + if( m_nAddCost>0 ) + m_nStyleNum = m_VCStylePay.size()-3; + else + m_nStyleNum = m_VCStylePay.size()-2; +} +//--------------------------------------------------------------------------- + +void __fastcall TPayMentPanel::CutOffString(String &cutOffStr) +{ + String strTmp = cutOffStr; + TSize size = Canvas->TextExtent( strTmp ); + int nLen = strTmp.Length(); + + if( size.Width >= STYLE_NAME_WIDTH ) + { + nLen = nLen*(STYLE_NAME_WIDTH)/size.Width; + nLen -= 1; + + if(nLen <= 0){ + strTmp = strTmp.SubString(0, 1); + }else{ + strTmp = strTmp.SubString(0, nLen); + strTmp += ".."; + } + + cutOffStr = strTmp; + } +} +//--------------------------------------------------------------------------- + +int __fastcall TPayMentPanel::GetLineNumber() +{ + return m_nStyleNum; +} +//--------------------------------------------------------------------------- + +void __fastcall TPayMentPanel::SetShowLine() +{ + if( bStylePayShow ) { + if( m_nAddCost>0 ) + m_iShowLine = Height/LINE_HEIGHT - 3; + else + m_iShowLine = Height/LINE_HEIGHT - 2; + int totalLine = GetLineNumber(); + if( totalLine>m_iShowLine ){ + m_ScrollBar = new TSkinScrollBar(this); + m_ScrollBar->m_pWndCtrl = this; + m_ScrollBar->Parent = this; + if( m_nAddCost>0 ) + m_ScrollBar->Height = Height-3*LINE_HEIGHT-2; + else + m_ScrollBar->Height = Height-2*LINE_HEIGHT-2; + m_ScrollBar->Left = Width - m_ScrollBar->Width - 1; + m_ScrollBar->Top = LINE_HEIGHT+1; + } + } +} +//--------------------------------------------------------------------------- + +void __fastcall TPayMentPanel::SetSB() +{ + vector::iterator vc_pFind; + for(vc_pFind = m_VCStylePay.begin(); vc_pFind != m_VCStylePay.end(); vc_pFind++){ + CutOffString(vc_pFind->strStyleName); + } + + if( m_ScrollBar ){ + int totalLine = GetLineNumber(); + m_ScrollBar->SetRange( 0, totalLine-1 ); + m_ScrollBar->SetPageSize( m_iShowLine ); + m_ScrollBar->SetPosition( m_iTopLine ); + m_ScrollBar->Visible = true; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TPayMentPanel::SetTextFontSize(int sz) +{ + Canvas->Font->Size = sz; +} +//--------------------------------------------------------------------------- + +void __fastcall TPayMentPanel::Paint(void) +{ + vector::iterator vc_pFind = m_VCStylePay.begin(); + TSize sizeFont; + + Canvas->Font->Color = CLR_TXT_HOT; + Canvas->Brush->Style = bsClear; + + int curX, curY; + + + /////////////////////////////// + sizeFont = Canvas->TextExtent(vc_pFind->strStyleName); + curX = (STYLE_NAME_WIDTH - sizeFont.Width)/2; + curY = (LINE_HEIGHT - sizeFont.Height)/2 ; + Canvas->TextOutW( curX, curY, vc_pFind->strStyleName ); + + sizeFont = Canvas->TextExtent(vc_pFind->strStyleCost); + curX = STYLE_NAME_WIDTH + (STYLE_PAY_WIDTH - sizeFont.Width)/2; + Canvas->TextOutW( curX, curY, vc_pFind->strStyleCost ); + + curY = LINE_HEIGHT; + + ///////////////////////////////// + if( m_nAddCost>0 ) + curY = Height - 2*LINE_HEIGHT; + else + curY = Height - LINE_HEIGHT; + Canvas->Brush->Color = CLR_BKG_INTERNAL_LIGHT; //ɫ + Canvas->FillRect( TRect(1, LINE_HEIGHT, + Width-1, curY ) ); + + ///////////////////////////////// + Canvas->Font->Color = CLR_TXT_HOT; + Canvas->Brush->Style = bsClear; + if( bStylePayShow ){ + + vc_pFind++; + vc_pFind = vc_pFind + m_iTopLine; + sizeFont = Canvas->TextExtent(vc_pFind->strStyleName); + curY = LINE_HEIGHT + (LINE_HEIGHT - sizeFont.Height)/2; + + int nShowAdd = 1; + if( m_nAddCost>0 ) nShowAdd = 2; + + for( int i=m_iTopLine; + (m_nStyleNum > 0) && + (i < m_nStyleNum ) && + (vc_pFind != m_VCStylePay.end()-nShowAdd) && + (i <= m_iTopLine + m_iShowLine -1); + i++, vc_pFind++ ) + { + sizeFont = Canvas->TextExtent(vc_pFind->strStyleName); + curX = (STYLE_NAME_WIDTH - sizeFont.Width)/2; + Canvas->TextOutW( curX, curY, vc_pFind->strStyleName ); + + sizeFont = Canvas->TextExtent(vc_pFind->strStyleCost); + curX = STYLE_NAME_WIDTH + (STYLE_PAY_WIDTH - sizeFont.Width)/2; + Canvas->TextOutW( curX, curY, vc_pFind->strStyleCost); + + curY += LINE_HEIGHT; + } + + ///////////////////////////////// + curY = Height - nShowAdd*LINE_HEIGHT; + + Canvas->Pen->Color = CLR_CONTENT_DB_LINE_DARK; + Canvas->MoveTo( 0, curY-1 ); + Canvas->LineTo( Width, curY-1 ); + Canvas->Pen->Color = CLR_CONTENT_DB_LINE_LIGHT; + Canvas->MoveTo( 0, curY ); + Canvas->LineTo( Width, curY ); + } + + if( m_nAddCost>0 ) { + m_imgInfo->Top = curY + 1; + + vc_pFind = m_VCStylePay.end() -2; + sizeFont = Canvas->TextExtent(vc_pFind->strStyleName); + curX = (STYLE_NAME_WIDTH - sizeFont.Width)/2; + curY += (LINE_HEIGHT - sizeFont.Height)/2 ; + Canvas->TextOutW( curX, curY, vc_pFind->strStyleName ); +// m_lbVip->Left = curX+sizeFont.Width+5; +// m_lbVip->Top = curY; + m_imgInfo->Left = curX + sizeFont.Width + 6; + + sizeFont = Canvas->TextExtent(vc_pFind->strStyleCost); + curX = STYLE_NAME_WIDTH + (STYLE_PAY_WIDTH - sizeFont.Width)/2; + Canvas->TextOutW( curX, curY, vc_pFind->strStyleCost ); + } + + ///////////////////////////// + vc_pFind = m_VCStylePay.end()-1; + sizeFont = Canvas->TextExtent(vc_pFind->strStyleName); + curX = (STYLE_NAME_WIDTH - sizeFont.Width)/2; + curY = Height - LINE_HEIGHT + + (LINE_HEIGHT - sizeFont.Height)/2 ; + + Canvas->TextOutW( curX, curY, vc_pFind->strStyleName ); + + sizeFont = Canvas->TextExtent(vc_pFind->strStyleCost); + curX = STYLE_NAME_WIDTH + (STYLE_PAY_WIDTH - sizeFont.Width)/2; + Canvas->TextOutW( curX, curY, vc_pFind->strStyleCost ); + + curY = Height - LINE_HEIGHT; + Canvas->Pen->Color = CLR_CONTENT_DB_LINE_DARK; + Canvas->MoveTo( 0, curY-1 ); + Canvas->LineTo( Width, curY-1 ); + Canvas->Pen->Color = CLR_CONTENT_DB_LINE_LIGHT; + Canvas->MoveTo( 0, curY ); + Canvas->LineTo( Width, curY ); +} +//--------------------------------------------------------------------------- \ No newline at end of file diff --git a/PayMentPanelUnit.h b/PayMentPanelUnit.h new file mode 100644 index 0000000..008a766 --- /dev/null +++ b/PayMentPanelUnit.h @@ -0,0 +1,60 @@ +//--------------------------------------------------------------------------- +#ifndef PayMentPanelUnitH +#define PayMentPanelUnitH +#include "NotificationExUnit.h" +#include "SkinScrollBarUnit.h" + +//--------------------------------------------------------------------------- +typedef struct tagStylePay{ + String strStyleName; + String strStyleCost; +}STYLEPAY, *PSTYLEPAY; + +//--------------------------------------------------------------------------- +class TPayMentPanel : public Vcl::Extctrls::TPanel +{ + +private: + + vector m_VCStylePay; + + bool bStylePayShow; + int m_iShowLine; + int m_iTopLine; + +// TUrlLabel *m_lbVip; + int m_nAddCost; + int m_nStyleNum; + int m_iOperation; + + TImage *m_imgInfo; + TSkinScrollBar *m_ScrollBar; + + void __fastcall CutOffString(String &cutOffStr); + int __fastcall GetLineNumber(); + void __fastcall SetShowLine(); + + virtual void __fastcall CreateWnd(); + virtual void __fastcall Paint(void); + + MESSAGE void __fastcall WMEraseBkgnd(TWMEraseBkgnd &Message); + MESSAGE void __fastcall WMVScroll(Winapi::Messages::TWMScroll &Message); + MESSAGE void __fastcall WMMouseWheel(TWMMouseWheel &Message); + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(WM_ERASEBKGND, TWMEraseBkgnd, WMEraseBkgnd) + MESSAGE_HANDLER(WM_VSCROLL, TWMVScroll, WMVScroll) + MESSAGE_HANDLER(WM_MOUSEWHEEL, TWMMouseWheel, WMMouseWheel) + END_MESSAGE_MAP( Vcl::Extctrls::TPanel ) + +public: + void __fastcall SetContent(int iOperation=0, int nIdCount=0, + UINT *aIdStyle=NULL, int *aStyleCost=NULL, + int nCost=0, int nBalance=0); + void __fastcall SetSB(); + void __fastcall SetTextFontSize(int sz); + __fastcall TPayMentPanel( TComponent* Owner); + __fastcall ~TPayMentPanel(); +}; +//--------------------------------------------------------------------------- +#endif diff --git a/PlayTimePanel.cpp b/PlayTimePanel.cpp new file mode 100644 index 0000000..261ad60 --- /dev/null +++ b/PlayTimePanel.cpp @@ -0,0 +1,122 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop + +#include "GlobalUnit.h" +#include "stdio.h" +#include "PlayTimePanel.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) + +#define SHOW_LEFT 8 +#define SHOW_TOP 5 +#define SHOW_BOTTOM 24 +#define SHOW_WIDTH_1 6 +#define SHOW_WIDTH_2 15 +#define SHOW_WIDTH_3 22 + +const COLORREF CLR_BACK = RGB( 74, 80, 88 ), + CLR_TEXT = RGB( 201, 214, 229 ); + +__fastcall TPlayTimePanel::TPlayTimePanel(TComponent *Owner) : TPanel(Owner) +{ + memset( m_iTime, 0, sizeof(m_iTime) ); + + m_iLeft[0] = SHOW_LEFT; + m_iRight[0] = m_iLeft[0] + SHOW_WIDTH_3; + m_iLeft[1] = m_iRight[0] + SHOW_WIDTH_1; + m_iRight[1] = m_iLeft[1] + SHOW_WIDTH_2; + m_iLeft[2] = m_iRight[1] + SHOW_WIDTH_1; + m_iRight[2] = m_iLeft[2] + SHOW_WIDTH_3; +} +//--------------------------------------------------------------------------- + +__fastcall TPlayTimePanel::~TPlayTimePanel() +{ + +} +//--------------------------------------------------------------------------- + +void __fastcall TPlayTimePanel::CreateWnd() +{ + TPanel::CreateWnd(); + + Canvas->Font->Name = "Tahoma"; + Canvas->Font->Color = CLR_TEXT; + Canvas->Font->Size = g_szFont9; + Canvas->Font->Pitch = TFontPitch::fpFixed; + Canvas->Font->Quality = TFontQuality::fqClearTypeNatural; + Canvas->Brush->Style = bsClear; + + Hint = "ǰλ()"; + ShowHint = true; +} +//--------------------------------------------------------------------------- + +void __fastcall TPlayTimePanel::Paint() +{ + char strTime[4]; + + sprintf( strTime, "%03d", m_iTime[0] ); + Canvas->TextOut( m_iLeft[0], SHOW_TOP, strTime ); + + sprintf( strTime, "%02d", m_iTime[1] ); + Canvas->TextOut( m_iLeft[1], SHOW_TOP, strTime ); + + sprintf( strTime, "%03d", m_iTime[2] ); + Canvas->TextOut( m_iLeft[2], SHOW_TOP, strTime ); +} +//--------------------------------------------------------------------------- + +void __fastcall TPlayTimePanel::WMEraseBkgnd(TWMEraseBkgnd &Message) +{ + TCanvas* pCanvas = new TCanvas(); + pCanvas->Handle = Message.DC; + + TRect rect = GetClientRect(); + + pCanvas->Brush->Color = CLR_BACK; // Ƶɫ + pCanvas->FillRect(rect); + + pCanvas->Font->Name = "Tahoma"; + pCanvas->Font->Color = CLR_TEXT; + pCanvas->Font->Size = g_szFont9; + pCanvas->Font->Pitch = TFontPitch::fpFixed; + pCanvas->Font->Quality = TFontQuality::fqClearTypeNatural; + pCanvas->Brush->Style = bsClear; + + int iTop = SHOW_TOP - 1; + pCanvas->TextOut( m_iLeft[1] - SHOW_WIDTH_1, iTop, ":" ); + pCanvas->TextOut( m_iLeft[2] - SHOW_WIDTH_1, iTop, ":" ); + + delete pCanvas; +} +//--------------------------------------------------------------------------- + +void __fastcall TPlayTimePanel::SetTime( int iTime[3] ) +{ + TRect rect(0,SHOW_TOP,0,SHOW_BOTTOM); + + if( iTime[0]!=m_iTime[0] ){ + m_iTime[0] = iTime[0]; + rect.left = m_iLeft[0]; + rect.right = m_iRight[0]; + InvalidateRect( Handle, &rect, FALSE ); + } + + if( iTime[1]!=m_iTime[1] ){ + m_iTime[1] = iTime[1]; + rect.left = m_iLeft[1]; + rect.right = m_iRight[1]; + InvalidateRect( Handle, &rect, FALSE ); + } + + if( iTime[2]!=m_iTime[2] ){ + m_iTime[2] = iTime[2]; + rect.left = m_iLeft[2]; + rect.right = m_iRight[2]; + InvalidateRect( Handle, &rect, FALSE ); + } +} +//--------------------------------------------------------------------------- + diff --git a/PlayTimePanel.h b/PlayTimePanel.h new file mode 100644 index 0000000..10edffc --- /dev/null +++ b/PlayTimePanel.h @@ -0,0 +1,36 @@ +//--------------------------------------------------------------------------- + +#ifndef PlayTimePanelH +#define PlayTimePanelH + +//#include +//--------------------------------------------------------------------------- + +class TPlayTimePanel : public TPanel +{ +private: + int m_iTime[3], + m_iLeft[3], + m_iRight[3]; + + MESSAGE void __fastcall WMEraseBkgnd(TWMEraseBkgnd &Message); + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(WM_ERASEBKGND, TWMEraseBkgnd, WMEraseBkgnd) + END_MESSAGE_MAP(TPanel) + +protected: + virtual void __fastcall CreateWnd(); + virtual void __fastcall Paint(); + +public: + __fastcall TPlayTimePanel(TComponent *Owner); + __fastcall ~TPlayTimePanel(); + + void __fastcall SetTime( int iTime[3] ); + +__published: + +}; + +#endif diff --git a/PreStylePanel.cpp b/PreStylePanel.cpp new file mode 100644 index 0000000..62f4d5c --- /dev/null +++ b/PreStylePanel.cpp @@ -0,0 +1,1086 @@ +//--------------------------------------------------------------------------- +#include +#include +#pragma hdrstop + +#include "GlobalUnit.h" +#include "PreStylePanel.h" +#include "UseStylePanel.h" +#include "MessageFormUnit.h" +#include "MultiSwitchProgFormUnit.h" +#include "SwitchTextureForm.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) + +extern int w_xOffDrag, //ͼƬϽ + w_yOffDrag; + +__fastcall TPreStylePanel::TPreStylePanel(TComponent* AOwner) + : TStylePanel(AOwner) +{ + m_strTitle = "Ԥ"; + + AddToolBtn( 3, "imgNewStyle", NewStyle, "½Զ" ); + + memset( m_nIECount, 0, sizeof(m_nIECount) ); +} +//--------------------------------------------------------------------------- + +void TPreStylePanel::Init() +{ + // +// g_pPreStyle = NULL; +// memset( m_nIECount, 0, sizeof(m_nIECount) ); + + TPROSTYLE* pSelStyle = NULL; + if( !g_aRecomStyles.empty() ){ + srand((unsigned)time(NULL)); + int n = rand() % g_aRecomStyles.size(); + + pSelStyle = g_aRecomStyles[n]; + } + + if( pSelStyle ){ + SetPreStyle( pSelStyle->idLoc, pSelStyle->idStyle ); + } +} +//--------------------------------------------------------------------------- + +bool TPreStylePanel::HandleHoverEvent(TPoint ptMouse) +{ + int X = ptMouse.X, + Y = ptMouse.Y; + + TCommonItem* pHoverItem = NULL; + int iHoverLine = -1; + bool bCanDrop = false; + + TCommonItem* pItem = HitTest( X, Y-m_nTitleHeight, NULL ); + if( pItem ){ + if( m_pDropItem && m_pDropItem!=m_pDragItem ){ //ⲿ϶ + if( m_pDropItem->iType==SEGTYPE_STYLE ){ + pHoverItem = (TCommonItem*)m_aItems->Items[0]; + iHoverLine = -m_iTopLine; + } + else if( m_pDropItem->iType==SEGTYPE_TRACK ){ + iHoverLine = (Y - m_nTitleHeight)/m_nItemHeight; + pHoverItem = GetTrackHoverItem( pItem, iHoverLine ); + } + else{ + iHoverLine = (Y - m_nTitleHeight)/m_nItemHeight; + pHoverItem = GetSegmentHoverItem( pItem, iHoverLine ); + } + } + else if( m_pDragItem && m_pDragItem->iType!=SEGTYPE_STYLE + && m_pDragItem->iType!=SEGTYPE_TRACK + && m_pDragItem!=pItem ){ //϶ + if( pItem->iType==m_pDragItem->iType ){ + if( pItem->iType < SEGTYPE_INTRO + || pItem->GetSegNo()<4 && m_pDragItem->GetSegNo()<4 + || pItem->GetSegNo()>=4 && m_pDragItem->GetSegNo()>=4 ){ + pHoverItem = pItem; + iHoverLine = (Y - m_nTitleHeight)/m_nItemHeight; + } + } + } + } + else if( m_pDropItem && m_pDropItem->iType==SEGTYPE_STYLE ){ + bCanDrop = true; + } + + SetUnfoldTimer( pItem, pHoverItem ); + SetHover( pHoverItem, iHoverLine ); + + return pHoverItem!=NULL || bCanDrop; +} +//--------------------------------------------------------------------------- + +void TPreStylePanel::HandleDropEvent( int iState ) +{ + if( !m_pDragItem && m_pDropItem ){ + TPROSTYLE* pTmpStyle = GetStyleInfo( -1, 0 ); + if( pTmpStyle ){ //ǰڱ༭ + TStyleItem* pStyItem = (TStyleItem*)m_aItems->Items[0]; + TStyleItem* pSrcStyItem = m_pDropItem->GetStyleItem(); + + if( pStyItem->pStyle && pStyItem->pStyle->idLoc!=0 && pSrcStyItem->pStyle==pStyItem->pStyle ){ + MessageForm->ShowMessage( "÷ڱ༭Уʹã", + MB_ICONERROR | MB_OK, "" ); + return; + } + } + + Stop(); + + if( m_pDropItem->iType==SEGTYPE_STYLE ){ //滻ǰ + if( !QueryStyleSave() ) + return; + + TStyleItem* pStyItem = (TStyleItem*)m_pDropItem; + SetPreStyle( pStyItem->pStyle->idLoc, pStyItem->pStyle->idStyle ); + + if( g_lstOpusStages.size()==0 ){ + TShiftState Shift( iState ); + if( Shift.Contains( ssCtrl ) && pStyItem->pStyle ){ + if( pStyItem->pStyle->idLoc==0 ) + PostMessage( Parent->Handle, UM_CHANGETT, false, + pStyItem->pStyle->pOrigin->detail.iTempo ); + else if( pStyItem->pStyle->idLoc==1 ) + PostMessage( Parent->Handle, UM_CHANGETT, false, + pStyItem->pStyle->pShare->iTempo ); + else + PostMessage( Parent->Handle, UM_CHANGETT, false, + pStyItem->pStyle->pLocal->iTempo ); + } + } + } + else if( m_pHoverItem ){ + if( m_pDropItem->iType==SEGTYPE_TRACK ){ + TSegmentItem* pSeg = (TSegmentItem*)m_pHoverItem; + if( m_pHoverItem->iType==SEGTYPE_TRACK ) + pSeg = (TSegmentItem*)m_pHoverItem->up; + + AddTrack( pSeg, (TTrackItem*)m_pDropItem ); + } + else{ //Ƭ + TStyleItem* pStyItem = (TStyleItem*)m_aItems->Items[0]; + TSegmentItem* pSrcSeg = (TSegmentItem*)m_pDropItem; + TSegmentItem* pDestSeg = NULL; + + if( !pStyItem->IsUnfold() ){ + SetFold( pStyItem, 0 ); + } + + for( int i=0; iaItems->Count; i++ ){ + TSegmentItem* pTmpSeg = (TSegmentItem*)pStyItem->aItems->Items[i]; + if( pTmpSeg->iSegType==pSrcSeg->iSegType + && pTmpSeg->aItems->Count==pSrcSeg->aItems->Count ){ + bool bSame = true; + for( int j=0; jaItems->Count; j++ ){ + TTrack* pTrk1 = ((TTrackItem*)pTmpSeg->aItems->Items[j])->pTrack; + bool bFound = false; + + for( int k=0; kaItems->Count; k++ ){ + TTrack* pTrk2 = ((TTrackItem*)pSrcSeg->aItems->Items[k])->pTrack; + + if( pTrk1->iStyleLoc==pTrk2->iStyleLoc + && pTrk1->iStyleId==pTrk2->iStyleId + && pTrk1->iSegNo==pTrk2->iSegNo + && pTrk1->iChanNo==pTrk2->iChanNo + && pTrk1->iProg==pTrk2->iProg + && pTrk1->nVol==pTrk2->nVol ){ + bFound = true; + break; + } + } + + if( !bFound ){ + bSame = false; + break; + } + } + + if( bSame ){ + pDestSeg = pTmpSeg; + break; + } + } + } + + bool bAdd = false; + if( !pDestSeg ){ + int index = -1; + if( m_pHoverItem!=pStyItem ){ + for( int i=0; iaItems->Count; i++ ){ + if( m_pHoverItem==pStyItem->aItems->Items[i] ){ + index = i; + break; + } + } + } + + pDestSeg = InsertSegment( index, pSrcSeg ); + bAdd = true; + } + + int iLine = 1;//m_iHoverLine + 1; + TCommonItem* pItem = GetNextItem( pStyItem ); + while( pItem && pItem!=pDestSeg ){ + iLine++; + pItem = GetNextItem( pItem ); + } + + if( bAdd && iLine<=m_iTopLine ) + m_iTopLine++; + + SetSelect( pDestSeg, iLine-m_iTopLine ); + } + } + + ResetScrollBar(); + + ShowSelItem(); + + SetFocus(); + } + else if( m_pDragItem && m_pDragItem==m_pDropItem && m_pHoverItem + && m_pDragItem->iType!=SEGTYPE_STYLE + && m_pDragItem->iType!=SEGTYPE_TRACK + && m_pHoverItem->iType==m_pDragItem->iType ){ + if( m_pHoverItem->next==m_pDragItem || m_pHoverItem->prev==m_pDragItem ){ + SwapSegments( (TSegmentItem*)m_pDragItem, (TSegmentItem*)m_pHoverItem ); + + // int iLine = m_iSelLine; + m_iSelLine = m_iHoverLine; +// m_iHoverLine = iLine; + } + else{ + TStyleItem* pStyItem = (TStyleItem*)m_aItems->Items[0]; + int indFrom = -1, indTo = -1; + for( int i=0; iaItems->Count; i++ ){ + if( m_pHoverItem==pStyItem->aItems->Items[i] ){ + indTo = i; + + if( indFrom>=0 ) + break;; + } + else if( m_pDragItem==pStyItem->aItems->Items[i] ){ + indFrom = i; + + if( indTo>=0 ) + break; + } + } + + MoveSegment( indFrom, indTo ); + } + + m_iSelLine = m_iHoverLine; + + Paint(); + } +} +//--------------------------------------------------------------------------- + +bool TPreStylePanel::StartDrag() +{ + return true; +} +//--------------------------------------------------------------------------- + +void TPreStylePanel::DeleteItem( TCommonItem *pItem, int iLine ) +{ + int sType = pItem->GetSegType(); + vector aSegNo; + + TCommonItem* pUp = NULL; + TStyleItem* pStyItem = (TStyleItem*)m_aItems->Items[0]; + TPROSTYLE* pStyle = pStyItem->pStyle; + + if( pItem->iType==SEGTYPE_TRACK ){ + pUp = pItem->up; + TTrackItem* pTrk = (TTrackItem*)pItem; + + if( pTrk->pStyle->idLoc==(UINT)-1 && pTrk->pStyle->idStyle==0 ){ + if( pUp->aItems->Count==1 ){ //һ + if( QuerySegmentDelete( -1, 0, sType, pItem->GetSegNo() ) ) + f_CM_DeleteTempSegment( -1, 0, sType, pItem->GetSegNo() ); + else + return; + } + } + else if( pStyle->idLoc!=0 && pStyle->idLoc!=(UINT)-1 && pTrk->pStyle==pStyle ){ + aSegNo.push_back( pItem->GetSegNo() ); + } + } + else{ + int iSN = -1; + + for( int i=0; iaItems->Count; i++ ){ + TTrackItem* pTrk = (TTrackItem*)pItem->aItems->Items[i]; + if( pTrk->pStyle->idLoc==(UINT)-1 && pTrk->pStyle->idStyle==0 ){ + iSN = pTrk->GetSegNo(); + break; + } + else if( pStyle && pStyle->idLoc!=0 && pStyle->idLoc!=(UINT)-1 + && pTrk->pStyle==pStyle ){ + bool bAdd = true; + for( int j=0; jGetSegNo() ){ + bAdd = false; + break; + } + } + + if( bAdd ){ + for( int j=0; bAdd && jaItems->Count; j++ ){ + TSegmentItem* pSegItem = (TSegmentItem*)pStyItem->aItems->Items[j]; + if( pSegItem!=pItem && pSegItem->iSegType==pItem->GetSegType() ){ + for( int t=0; taItems->Count; t++ ){ + TTrackItem* pTrkItem = (TTrackItem*)pSegItem->aItems->Items[t]; + if( pTrkItem->pStyle==pStyle && pTrkItem->GetSegNo()==pTrk->GetSegNo() ){ + bAdd = false; + break; + } + } + } + } + } + + if( bAdd ){ + aSegNo.push_back( pTrk->GetSegNo() ); + } + } + } + + if( iSN>=0 ){ + if( QuerySegmentDelete( -1, 0, sType, iSN ) ){ + f_CM_DeleteTempSegment( -1, 0, sType, iSN ); + } + else{ + return; + } + } + + TSegmentItem* pNextSeg = (TSegmentItem*)pItem->next; + while( pNextSeg && pNextSeg->iSegType==sType ){ + if( sType<=SEGTYPE_FILL ){ + pNextSeg->iSegNo--; +// pNextSeg->iInd--; + } + else{ + int iTon = pItem->GetSegNo() < 4 ? 0 : 1, + iNextTon = pNextSeg->iSegNo < 4 ? 0 : 1; + + if( iTon==iNextTon ){ + pNextSeg->iSegNo--; +// pNextSeg->iInd--; + + } + else + break; + } + + pNextSeg = (TSegmentItem*)pNextSeg->next; + } + + if( sType>=SEGTYPE_INTRO ){ + int s = sType - SEGTYPE_INTRO, + n = pItem->GetSegNo()<4 ? 0 : 1; + + m_nIECount[s][n]--; + } + } + + TStylePanel::DeleteItem( pItem, iLine ); + + if( pUp && pUp->aItems->Count==0 ){ + DeleteItem( pUp, iLine-1 ); + } + + if( !aSegNo.empty() ){ + UINT idLoc = pStyle->idLoc, idStyle = pStyle->idStyle; + for( int i=0; iidLoc = -1; + pTmpStyle->idStyle = 0; + g_aTempStyles.push_back( pTmpStyle ); + } + + if( pStyle->idLoc!=0 && pStyle->idLoc!=(UINT)-1 ){ + for( int i=0; iaItems->Count; i++ ){ + TSegmentItem* pSegItem = (TSegmentItem*)pStyItem->aItems->Items[i]; + for( int j=0; jaItems->Count; j++ ){ + TTrackItem* pTrkItem = (TTrackItem*)pSegItem->aItems->Items[j]; + if( pTrkItem->pStyle==pStyle ){ + pTrkItem->pStyle = pTmpStyle; + } + } + } + } + } + + ((TStyleItem*)m_aItems->First())->SetImport(); +} +//--------------------------------------------------------------------------- + +bool TPreStylePanel::QuerySegmentDelete( UINT idLoc, UINT idStyle, int sType, int sNo ) +{ + if( g_pUseStyle ){ + bool bQuery = false; + for( int i=0; !bQuery && iaItems->Count; i++ ){ + TSegmentItem* pSeg = (TSegmentItem*)g_pUseStyle->aItems->Items[i]; + for( int j=0; !bQuery && jaItems->Count; j++ ){ + TTrackItem* pTrk = (TTrackItem*)pSeg->aItems->Items[j]; + if( pTrk->pStyle->idLoc==idLoc && pTrk->pStyle->idStyle==idStyle + && pTrk->GetSegType()==sType && pTrk->GetSegNo()==sNo ){ + bQuery = true; + break; + } + } + } + + if( bQuery ){ + MessageForm->ShowMessage( "ƬʹУ޷ɾ", + MB_ICONERROR | MB_OK, "ɾƬ" ); + return false; + } + } + + return true; +} +//--------------------------------------------------------------------------- + +void TPreStylePanel::RestoreItems() +{ + bool bAuthority = SOFTWARE_ID==e_Pro_Lite || g_bLogon + && (g_infoUser.accountInfo.authority & 0x1000); + + TStyleItem* pStyItem = (TStyleItem*)m_aItems->First(); + TPROSTYLE* info = pStyItem->pStyle; + + for( int s=0; sidLoc==0 ? info->pOrigin->detail.nSegNum[s] + : info->idLoc==1 ? info->pShare->nSegNum[s] + : info->pLocal->nSegNum[s]; + int num = s>4 ); + + if( num>0 ){ + DWORD opts = OPT_DEL | OPT_VOL | (sidLoc==0 ? 100 + : info->idLoc==1 ? info->pShare->nSegVol[s][sn] + : info->pLocal->nSegVol[s][sn]; + TSegmentItem* pSegItem = pStyItem->AddSegment( s, sn, opts, 0, -1, vol ); + + DWORD optsTk = OPT_DEL|OPT_FONTPROG|OPT_VOL; + if( sAddTrack( info, sn, j, optsTk, bAuthority ); + } + + if( pSegItem->aItems->Count>0 ){ + if( s==SEGTYPE_INTRO ){ + pSegItem->nBars = info->idLoc==0 ? info->pOrigin->detail.aIntroBars[sn] + : info->idLoc==1 ? info->pShare->aIEBars[0][sn] + : info->pLocal->aIEBars[0][sn]; + m_nIECount[0][r]++; + } + else if( s==SEGTYPE_ENDING ){ + pSegItem->nBars = info->idLoc==0 ? info->pOrigin->detail.aEndingBars[sn] + : info->idLoc==1 ? info->pShare->aIEBars[1][sn] + : info->pLocal->aIEBars[1][sn]; + m_nIECount[1][r]++; + } + } + else{ + pStyItem->DeleteSegment( pSegItem ); + } + } + } + } + } +} +// --------------------------------------------------------------------------- + +void TPreStylePanel::SetPreStyle( UINT idLoc, UINT idStyle ) +{ + TStyleItem* pStyItem = NULL; + + TPROSTYLE* pInfo = GetStyleInfo( idLoc, idStyle ); + if( pInfo ){ + ClearAllItems(); + memset( m_nIECount, 0, sizeof(m_nIECount) ); + + pStyItem = AddStyle( pInfo, OPT_FONTPROG | OPT_SAVE ); + RestoreItems(); + pStyItem->SetImport(); + + m_pTopItem = pStyItem; + SetFold( pStyItem, 0 ); + + ResetScrollBar(); + Paint(); + } + + g_pPreStyle = pStyItem; +} +// --------------------------------------------------------------------------- + +void __fastcall TPreStylePanel::SetStyleItem( TStyleItem* pStyItem ) +{ + TStylePanel::SetStyleItem( pStyItem ); + + if( pStyItem ){ + //ͳIECount + memset( m_nIECount, 0, sizeof(m_nIECount) ); + for( int i=0; iaItems->Count; i++ ){ + TSegmentItem* pSeg = (TSegmentItem*)pStyItem->aItems->Items[i]; + if( pSeg->iSegType>=SEGTYPE_INTRO ){ + if( pSeg->iSegNo<4 ) + m_nIECount[pSeg->iSegType-SEGTYPE_INTRO][0]++; + else + m_nIECount[pSeg->iSegType-SEGTYPE_INTRO][1]++; + } + } + + pStyItem->SetImport(); + } +} +// --------------------------------------------------------------------------- + +TSegmentItem* TPreStylePanel::InsertSegment( int index, TSegmentItem* pSrcSeg ) +{ + TStyleItem* pStyleItem = (TStyleItem*)m_aItems->First(); + + int ind = 0; + DWORD opts = OPT_DEL|OPT_VOL; + int stype = pSrcSeg->iSegType; + if( stype<=SEGTYPE_FILL ){ + opts |= OPT_BRUSH; + } + + if( index<0 || index>=pStyleItem->aItems->Count ){ + index = 0; + for( int i=0; inSegNum[i]; + } + + if( stype<=SEGTYPE_FILL ){ + ind = pStyleItem->nSegNum[stype]; + index += ind; + } + else{ + int t = stype-SEGTYPE_INTRO, + n = pSrcSeg->iSegNo<4 ? 0 : 1; + ind = m_nIECount[t][n]; + + index += ind; + + if( n==1 ){ + ind += 4; + index += m_nIECount[t][0]; + } + } + } + else{ + if( stype>=SEGTYPE_INTRO && pSrcSeg->iSegNo>=4 ) + ind = 4; + + for( int i=0; iaItems->Count; i++ ){ + TSegmentItem* pTmpSeg = (TSegmentItem*)pStyleItem->aItems->Items[i]; + + if( pTmpSeg->iSegType==stype ){ + if( stype<=SEGTYPE_FILL ){ + if( iiInd++; + pTmpSeg->iSegNo++; + } + } + else{ + int iSrcTon = pSrcSeg->iSegNo < 4 ? 0 : 1, + iTmpTon = pTmpSeg->iSegNo < 4 ? 0 : 1; + + if( iSrcTon==iTmpTon ){ + if( iiInd++; + pTmpSeg->iSegNo++; + } + } + } + } + } + } + + TSegmentItem* pDestSeg = new TSegmentItem( pStyleItem, stype, ind, + opts, 0, ind, pSrcSeg->volume ); + + opts = OPT_DEL|OPT_FONTPROG|OPT_VOL; + + if( stype>SEGTYPE_FILL ){ + pDestSeg->nBars = pSrcSeg->nBars; + + int t = stype-SEGTYPE_INTRO, + n = pDestSeg->iSegNo<4 ? 0 : 1; + m_nIECount[t][n]++; + } + else{ + opts |= OPT_TEXTURE; + } + + for( int i=0; iaItems->Count; i++ ){ + TTrackItem* pSrcItem = (TTrackItem*)pSrcSeg->aItems->Items[i]; + TTrack* pSrcTrack = new TTrack( pSrcItem->pTrack ); + + TTrackItem* pDestItem = pDestSeg->AddTrack( pSrcItem->pStyle, pSrcTrack, opts, true ); + } + + pStyleItem->InsertSegment( index, pDestSeg, 0 ); + m_nTotalLine++; + + pStyleItem->SetImport(); + + return pDestSeg; +} +// --------------------------------------------------------------------------- + +void TPreStylePanel::MoveSegment( int indFrom, int indTo ) +{ + if( indFrom<0 || indTo<0 || indFrom==indTo ) + return; + + TStyleItem* pStyItem = (TStyleItem*)m_aItems->Items[0]; + TSegmentItem *pSegFrom = (TSegmentItem*)pStyItem->aItems->Items[indFrom], + *pSegTo = (TSegmentItem*)pStyItem->aItems->Items[indTo]; + + if( pSegFrom->prev ) + pSegFrom->prev->next = pSegFrom->next; + if( pSegFrom->next ) + pSegFrom->next->prev = pSegFrom->prev; + + if( pSegTo->prev ) + pSegTo->prev->next = pSegFrom; + pSegFrom->prev = pSegTo->prev; + pSegTo->prev = pSegFrom; + pSegFrom->next = pSegTo; + + pSegFrom->iSegNo = pSegTo->iSegNo; + pSegFrom->iInd = pSegTo->iInd; + + if( indFrom>indTo ){ //ɾ + pStyItem->aItems->Delete( indFrom ); + pStyItem->aItems->Insert( indTo, pSegFrom ); + + for( int i=indTo+1; i<=indFrom; i++ ){ + ((TSegmentItem*)pStyItem->aItems->Items[i])->iSegNo++; + ((TSegmentItem*)pStyItem->aItems->Items[i])->iInd++; + } + } + else{ //Ȳɾ + pStyItem->aItems->Insert( indTo, pSegFrom ); + pStyItem->aItems->Delete( indFrom ); + + for( int i=indFrom; iaItems->Items[i])->iSegNo--; + ((TSegmentItem*)pStyItem->aItems->Items[i])->iInd--; + } + } + + +} +// --------------------------------------------------------------------------- + +void TPreStylePanel::SwapSegments( TSegmentItem* pItem1, TSegmentItem* pItem2 ) +{ + if( !pItem1 || !pItem2 || pItem1==pItem2 ) + return; + + TStyleItem* pStyItem = (TStyleItem*)m_aItems->Items[0]; + int ind1 = -1, ind2 = -1; + TCommonItem* pSeg1 = NULL, *pSeg2 = NULL; + + for( int i=0; iaItems->Count; i++ ){ + if( pItem1==pStyItem->aItems->Items[i] + || pItem2==pStyItem->aItems->Items[i] ){ + if( ind1<0 ){ + ind1 = i; + pSeg1 = (TCommonItem*)pStyItem->aItems->Items[i]; + } + else{ + ind2 = i; + pSeg2 = (TCommonItem*)pStyItem->aItems->Items[i]; + break; + } + } + } + + if( pSeg1->prev ) + pSeg1->prev->next = pSeg2; + if( pSeg2->next ) + pSeg2->next->prev = pSeg1; + if( pSeg1->next!=pSeg2 ) + pSeg1->next->prev = pSeg2; + if( pSeg2->prev!=pSeg1 ) + pSeg2->prev->next = pSeg1; + + TCommonItem* pTmpItem = pSeg1->prev; + if( pSeg2->prev!=pSeg1 ) + pSeg1->prev = pSeg2->prev; + else + pSeg1->prev = pSeg2; + pSeg2->prev = pTmpItem; + + pTmpItem = pSeg2->next; + if( pSeg1->next!=pSeg2 ) + pSeg2->next = pSeg1->next; + else + pSeg2->next = pSeg1; + pSeg1->next = pTmpItem; + + pStyItem->aItems->Delete( ind2 ); + pStyItem->aItems->Delete( ind1 ); + pStyItem->aItems->Insert( ind1, pSeg2 ); + pStyItem->aItems->Insert( ind2, pSeg1 ); + + int iInd1 = pItem1->iInd, iSegNo1 = pItem1->iSegNo; + pItem1->iInd = pItem2->iInd; + pItem1->iSegNo = pItem2->iSegNo; + pItem2->iInd = iInd1; + pItem2->iSegNo = iSegNo1; +} +// --------------------------------------------------------------------------- + +void TPreStylePanel::AddTempSegment( TSegmentItem* pSeg ) +{ + Stop(); + + int sType = pSeg->iSegType, + sNo = pSeg->iSegNo; + TStyleItem* pStyItem = (TStyleItem*)m_aItems->Items[0]; + + int index = 0; + for( int i=0; inSegNum[i]; + } + + if( sType<=SEGTYPE_FILL ){ + index += pStyItem->nSegNum[sType]; + } + else{ + int t = sType-SEGTYPE_INTRO, + n = sNo<4 ? 0 : 1; + + index += m_nIECount[t][0] + ( n==1 ? m_nIECount[t][1] : 0 ); + + m_nIECount[t][n]++; + } + + pStyItem->InsertSegment( index, pSeg, 0 ); + pStyItem->SetImport(); + + m_nTotalLine++; + ResetScrollBar(); + + int iLine = 0; + TCommonItem* pItem = pStyItem; + while( pItem && pItem!=pSeg ){ + iLine++; + pItem = GetNextItem( pItem ); + } + + SetSelect( pSeg, iLine-m_iTopLine ); + + ShowSelItem(); + + SetFocus(); +} + +TCommonItem* TPreStylePanel::GetSegmentHoverItem( TCommonItem* pItem, int& iHoverLine ) +{ + TStyleItem* pStyItem = (TStyleItem*)m_aItems->Items[0]; + TCommonItem* pHoverItem = NULL; + + bool bCanDrop = pStyItem->nSegNum[m_pDropItem->iType]<8; + if( bCanDrop && m_pDropItem->iType >= SEGTYPE_INTRO ){ + int t = m_pDropItem->iType-SEGTYPE_INTRO, + n = m_pDropItem->GetSegNo()<4 ? 0 : 1; + bCanDrop = m_nIECount[t][n] < 4; + } + + if( bCanDrop ){ + if( pItem->iType==m_pDropItem->iType ){ + if( pItem->iType < SEGTYPE_INTRO + || pItem->GetSegNo()<4 && m_pDropItem->GetSegNo()<4 + || pItem->GetSegNo()>=4 && m_pDropItem->GetSegNo()>=4){ + pHoverItem = pItem; + } + } + else{ + pHoverItem = pStyItem; + iHoverLine = -m_iTopLine; + } + } + + if( !pHoverItem ) + iHoverLine = -1; + + return pHoverItem; +} +// --------------------------------------------------------------------------- + +void __fastcall TPreStylePanel::DoImportSegment(TObject* Sender) +{ + if( m_pFocItem ){ + PostMessage( Parent->Handle, UM_IMPORTSEGMENT, 0, 0 ); + } +} +// --------------------------------------------------------------------------- + +bool __fastcall TPreStylePanel::CheckModified() +{ + if( m_aItems->Count==0 ) + return false; + + TStyleItem* pStyItem = (TStyleItem*)m_aItems->Items[0]; + + for( int i=0; iaItems->Count; i++ ){ + TSegmentItem* pSeg = (TSegmentItem*)pStyItem->aItems->Items[i]; + for( int j=0; jaItems->Count; j++ ){ + TTrackItem* pTrk = (TTrackItem*)pSeg->aItems->Items[j]; + if( pTrk->pStyle->idLoc==(UINT)-1 && pTrk->pStyle->idStyle==0 ){ + return true; + } + } + } + + return false; +} +// --------------------------------------------------------------------------- + +void __fastcall TPreStylePanel::NewStyle( TObject *Sender ) +{ + if( Sender ){ + if( !QueryStyleSave() ) + return; + } + + ClearAllItems(); + memset( m_nIECount, 0, sizeof(m_nIECount) ); + + TStyleItem* pItem = new TStyleItem( NULL, OPT_FONTPROG | OPT_SAVE ); + pItem->SetImport(); + m_aItems->Add( pItem ); + + m_pTopItem = pItem; + SetFold( pItem, 0 ); + + m_nTotalLine++; + ResetScrollBar(); + Paint(); + + g_pPreStyle = pItem; +} +// --------------------------------------------------------------------------- + +bool TPreStylePanel::QueryStyleSave() +{ + if( CheckModified() ){ + String strMsg = "ǰ༭ķδ棬Ƿ񱣴棿"; + + bool bUsed = false; + if( g_pUseStyle ){ + for( int i=0; !bUsed && iaItems->Count; i++ ){ + TSegmentItem* pSeg = (TSegmentItem*)g_pUseStyle->aItems->Items[i]; + for( int j=0; jaItems->Count; j++ ){ + TTrackItem* pTrk = (TTrackItem*)pSeg->aItems->Items[j]; + if( pTrk->pStyle->idLoc==(UINT)-1 && pTrk->pStyle->idStyle==0 ){ + bUsed = true; + break; + } + } + } + } + + if( bUsed ){ + strMsg += "\n\n棺潫µǰʧЧ"; + } + + int ret = MessageForm->ShowMessage( strMsg, MB_ICONQUESTION|MB_YESNOCANCEL, + "ʾ" ); + if( mrCancel==ret ){ + return false; + } + else if( mrYes==ret ){ + Application->MainForm->Perform( UM_SAVELOCALSTYLE, 0, 0 ); + } + else if( bUsed ){ //յǰ + Application->MainForm->Perform( UM_NEWPROJECT, 0, 0 ); + } + + if( GetStyleInfo( -1, 0 ) ){ + f_CM_DeleteTempStyle( 0 ); + DeleteStyleInfo( -1, 0 ); + } + } + + return true; +} +// --------------------------------------------------------------------------- + +bool __fastcall TPreStylePanel::GetPrebeat( BYTE* pData, int& nSize ) +{ + if( m_aItems->Count==0 ) + return false; + + TStyleItem* pStyItem = GetStyleItem(); + TTrack* pDrumTrk = NULL; + for( int i=0; !pDrumTrk && iaItems->Count; i++ ){ + TSegmentItem* pSeg = (TSegmentItem*)pStyItem->aItems->Items[i]; + int stype = pSeg->GetSegType(); + + if( stype==SEGTYPE_VAR ){ + for( int j=0; jaItems->Count; j++ ){ + TTrack* pTrk = ((TTrackItem*)pSeg->aItems->Items[j])->pTrack; + + if( pTrk->iChanSpec==9 ){ + pDrumTrk = pTrk; + break; + } + } + } + } + + if( pDrumTrk ){ + int nStageNum = 1; + TStage* aStages = new TStage[nStageNum]; + aStages[0].iSegType = SEGTYPE_VAR; + aStages[0].iSegKey = 0; + aStages[0].nBarNum = 4; + aStages[0].aChords = new TBarChords[aStages[0].nBarNum]; + for( int j=0; j<4; j++ ){ + aStages[0].aChords[j].iKey[0] + = aStages[0].aChords[j].iKey[1] + = aStages[0].aChords[j].iKey[2] + = aStages[0].aChords[j].iKey[3] = 0; + aStages[0].aChords[j].iType[0] + = aStages[0].aChords[j].iType[1] + = aStages[0].aChords[j].iType[2] + = aStages[0].aChords[j].iType[3] = 0; + } + + //tracks + aStages[0].nTrkNum = 1; + aStages[0].aTracks = new TComposeTrack[aStages[0].nTrkNum]; + aStages[0].aTracks[0].iStyleLoc = pDrumTrk->iStyleLoc;// >pStyle->idLoc; + aStages[0].aTracks[0].iStyleId = pDrumTrk->iStyleId;// >pStyle->idStyle; + aStages[0].aTracks[0].iSegNo = pDrumTrk->iSegNo; + aStages[0].aTracks[0].iChanNo = pDrumTrk->iChanNo; + aStages[0].aTracks[0].iChanSpec = pDrumTrk->iChanSpec; + aStages[0].aTracks[0].iProg = pDrumTrk->iProg; + aStages[0].aTracks[0].nVol = 110; + + int ret = f_CM_Compose( &nSize, pData, g_iMelodyTimeSignature, g_nMelodyTempo, + nStageNum, aStages, false, NULL, NULL ); + + if( ret==0 ){ + return true; + } + } + + return false; +} +// --------------------------------------------------------------------------- + +void __fastcall TPreStylePanel::DoChangeFontProg(TObject* Sender) +{ + if( Sender ) + SetSelect( m_pFocItem, m_iFocLine ); + + TMultiSwitchProgForm *form = new TMultiSwitchProgForm(this, m_pSelItem); + if( mrOk==form->ShowModal() ){ + for(int i = 0; i < form->ItemChange->Count; i++) { + TTrackItem *Item = (TTrackItem *)form->ItemChange->Items[i]; + //InstrumentChanged(Item); + } + } + delete form; + + if( m_pSelItem->iType==SEGTYPE_STYLE ) + Repaint(); + else + DrawItem( m_pSelItem, m_iSelLine, -1 ); +} +// --------------------------------------------------------------------------- + +void __fastcall TPreStylePanel::DoChangeTexture(TObject* Sender) +{ + Stop( STOP_ALL ); + + if( Sender ) + SetSelect( m_pFocItem, m_iFocLine ); + + TTrackItem *pItem = (TTrackItem *)m_pSelItem ; + TTrack* pTrk = pItem->pTrack; + char progOri = -1; + int st = pItem->GetSegType(); + int sn = pTrk->iSegNo; + + if( pItem->pStyle->idLoc==0 ){ + for( int t=0; t<16; t++ ){ + if( pItem->pStyle->pOrigin->detail.tracks[st][sn][t].no==pTrk->iChanNo ){ + progOri = pItem->pStyle->pOrigin->detail.tracks[st][sn][t].prog; + break; + } + } + + }else if( pItem->pStyle->idLoc!=1 ){ + for( int t=0; t<16; t++ ){ + if( pItem->pStyle->pLocal->trkRef[st][sn][t].chan==pTrk->iChanNo ){ + progOri = pItem->pStyle->pLocal->trkRef[st][sn][t].prog; + break; + } + } + } + + if( progOri!=-1 ) { + TSwitchTextureForm *pProgPar = new TSwitchTextureForm(NULL, (1<iBank, + pTrk->iProg, pItem->pStyle, + pTrk->iChanNo, sn ); + + if(pProgPar->ShowModal() == mrOk){ +/* TStyleItem* pStyleItem = (TStyleItem*)m_aItems->First(); + + for( int s=0; saItems->Count; s++ ){ + TSegmentItem* pSegItem = (TSegmentItem*)pStyleItem->aItems->Items[s]; + + for( int t=0; taItems->Count; t++ ){ + TTrackItem* pTrkItem = (TTrackItem*)pSegItem->aItems->Items[t]; + + if( pTrkItem==pItem ) { +*/ if( pProgPar->m_bSetCur ) { + pTrk->iProg = pProgPar->m_cSetProg; + pTrk->nVol = pProgPar->m_cSetVol; + pTrk->iBank = 0xFF; + } + pTrk->iProgOrig = pProgPar->m_cSetProgOri; + pTrk->iSegNo = pProgPar->m_cSetSegNo; + pTrk->iChanNo = pProgPar->m_cSetchan; + pTrk->nVolOrig = pProgPar->m_cSetVolOri; + pTrk->iStyleLoc = pProgPar->m_pSetStyle->idLoc; + pTrk->iStyleId = pProgPar->m_pSetStyle->idStyle; + pItem->pStyle = pProgPar->m_pSetStyle; +/* + break; + } + } + } +*/ + DrawItem( m_pSelItem, m_iSelLine, -1 ); + } + + delete pProgPar; + } +} +// --------------------------------------------------------------------------- + diff --git a/PreStylePanel.h b/PreStylePanel.h new file mode 100644 index 0000000..149a401 --- /dev/null +++ b/PreStylePanel.h @@ -0,0 +1,48 @@ +//--------------------------------------------------------------------------- + +#ifndef PreStylePanelH +#define PreStylePanelH + +#include "StylePanel.h" +//--------------------------------------------------------------------------- +class TPreStylePanel : public TStylePanel +{ +private: + int m_nIECount[2][2]; + + TCommonItem* GetSegmentHoverItem( TCommonItem* pItem, int& iHoverLine ); + TSegmentItem* InsertSegment( int index, TSegmentItem* pSrcSeg ); + void MoveSegment( int indFrom, int indTo ); + void SwapSegments( TSegmentItem* pItem1, TSegmentItem* pItem2 ); + bool QuerySegmentDelete( UINT idLoc, UINT idStyle, int sType, int sNo ); + bool QueryStyleSave(); +// void InstrumentChanged( TCommonItem *pItem ); + +protected: + virtual void Init(); + virtual bool StartDrag(); + virtual void HandleDropEvent( int iState=0 ); + virtual bool HandleHoverEvent(TPoint ptMouse); + virtual void DeleteItem( TCommonItem *pItem, int iLine ); + virtual void RestoreItems(); + virtual bool CanVSplit(){ return true; }; + + virtual void __fastcall DoImportSegment(TObject* Sender); + virtual void __fastcall DoChangeFontProg(TObject* Sender); + virtual void __fastcall DoChangeTexture(TObject* Sender); + +public: + __fastcall TPreStylePanel(System::Classes::TComponent* AOwner); + + virtual void __fastcall SetStyleItem( TStyleItem* pStyItem ); + virtual bool __fastcall GetPrebeat( BYTE* pData, int& nSize ); + void __fastcall NewStyle( TObject *Sender ); + bool __fastcall CheckModified(); + + void SetPreStyle( UINT idLoc, UINT idStyle ); + void AddTempSegment( TSegmentItem* pSeg ); + TStyleItem* GetStyleItem() { return (TStyleItem*)m_aItems->First(); }; + int GetIECount( int sType, int cType ) { return m_nIECount[sType][cType]; }; +}; + +#endif diff --git a/PredefineProjectFormUnit.cpp b/PredefineProjectFormUnit.cpp new file mode 100644 index 0000000..29ca901 --- /dev/null +++ b/PredefineProjectFormUnit.cpp @@ -0,0 +1,557 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop + +#include "PredefineProjectFormUnit.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma link "GeneralDialogPanel" +#pragma link "SkinTrackBar" +#pragma link "LineEdit" +#pragma link "ComboBoxComponent" +#pragma link "TextButton" +#pragma resource "*.dfm" +TPredefineProjectForm *PredefineProjectForm; + +const BYTE u_arrPredefChords[3][2][8][8] = { //Ԥ + // + { { { 0, 37, 20, 28, 0, 37, 20, 30 }, // 1 6 4 5 1 6 4 5 + { 0, 17, 37, 28, 0, 17, 37, 30 }, // 1 3 6 5 1 3 6 5 + { 0, 37, 20, 17, 37, 20, 28, 0 }, // 1 6 4 3 6 4 5 1 + { 0, 17, 37, 28, 20, 17, 9, 30 }, // 1 3 6 5 4 3 2 5 + { 0, 28, 37, 28, 0, 28, 37, 30 }, // 1 5 6 5 1 5 6 5 + { 0, 37, 28, 20, 17, 9, 28, 0 }, // 1 6 5 4 3 2 5 1 + { 0, 9, 28, 0, 0, 9, 28, 0 }, // 1 2 5 1 1 2 5 1 + { 0, 20, 28, 0, 0, 20, 28, 0 } // 1 4 5 1 1 4 5 1 + }, + { {37, 9, 17, 37, 37, 9, 17, 37 }, // 6 2 3 6 6 2 3 6 + {37, 28, 20, 17, 37, 28, 20, 19 }, // 6 5 4 3 6 5 4 3 + {37, 28, 17, 37, 37, 28, 17, 37 }, // 6 5 3 6 6 5 3 6 + {37, 20, 9, 17, 37, 20, 9, 19 }, // 6 4 2 3 6 4 2 3 + {37, 17, 37, 28, 37, 17, 37, 30 }, // 6 3 6 5 6 3 6 5 + {37, 9, 20, 28, 37, 9, 20, 30 }, // 6 2 4 5 6 2 4 5 + {37, 9, 28, 37, 37, 9, 28, 37 }, // 6 2 5 6 6 2 5 6 + {37, 20, 9, 37, 37, 20, 9, 37 } // 6 4 2 6 6 4 2 6 + } + }, + // + { { { 0, 37, 20, 17, 37, 20, 28, 0 }, // 1 6 4 3 6 4 5 1 + { 0, 37, 28, 20, 17, 9, 28, 0 }, // 1 6 5 4 3 2 5 1 + { 0, 9, 28, 0, 0, 9, 28, 0 }, // 1 2 5 1 1 2 5 1 + { 0, 20, 28, 0, 0, 20, 28, 0 }, // 1 4 5 1 1 4 5 1 + {20, 28, 37, 37, 20, 28, 0, 0 }, // 4 5 6 6 4 5 1 1 + { 9, 28, 0, 28, 37, 9, 28, 0 }, // 2 5 1 5 6 2 5 1 + {20, 28, 17, 37, 20, 9, 28, 0 }, // 4 5 3 6 4 2 5 1 + { 9, 28, 20, 28, 0, 20, 28, 0 } // 2 5 4 5 1 4 5 1 + }, + { {37, 9, 17, 37, 37, 9, 17, 37 }, // 6 2 3 6 6 2 3 6 + {37, 28, 17, 37, 37, 28, 17, 37 }, // 6 5 3 6 6 5 3 6 + {37, 9, 28, 37, 37, 9, 28, 37 }, // 6 2 5 6 6 2 5 6 + {37, 20, 9, 37, 37, 20, 9, 37 }, // 6 4 2 6 6 4 2 6 + { 9, 17, 28, 37, 9, 17, 28, 37 }, // 2 3 5 6 2 3 5 6 + {37, 9, 28, 17, 37, 9, 28, 37 }, // 6 2 5 3 6 2 5 6 + {20, 28, 0, 0, 20, 28, 37, 37 }, // 4 5 1 1 4 5 6 6 + {17, 37, 9, 28, 17, 37, 17, 37 } // 3 6 2 5 3 6 3 6 + } + }, + // + { { { 9, 20, 28, 17, 9, 20, 28, 0 }, // 2 4 5 3 2 4 5 1 + { 9, 28, 0, 28, 37, 28, 0, 30 }, // 2 5 1 5 6 5 1 5 + {20, 17, 9, 28, 0, 17, 9, 30 }, // 4 3 2 5 1 3 2 5 + {17, 9, 37, 17, 9, 28, 0, 30 }, // 3 2 6 3 2 5 1 5 + {20, 0, 20, 0, 20, 0, 20, 30 }, // 4 1 4 1 4 1 4 5 + {20, 28, 0, 0, 20, 28, 0, 0 }, // 4 5 1 1 4 5 1 1 + {20, 17, 9, 0, 20, 17, 9, 0 }, // 4 3 2 1 4 3 2 1 + {28, 20, 28, 20, 0, 28, 20, 30 } // 5 4 5 4 1 5 4 5 + }, + { { 9, 17, 28, 37, 9, 17, 28, 37 }, // 2 3 5 6 2 3 5 6 + {17, 37, 28, 37, 9, 17, 20, 19 }, // 3 6 5 6 2 3 4 3 + {20, 0, 28, 37, 20, 0, 37, 19 }, // 4 1 5 6 4 1 6 3 + {20, 28, 0, 28, 20, 28, 0, 30 }, // 4 5 1 5 4 5 1 5 + { 9, 17, 37, 17, 20, 37, 0, 37 }, // 2 3 6 3 4 6 1 6 + { 9, 37, 9, 37, 9, 37, 9, 19 }, // 2 6 2 6 2 6 2 3 + { 9, 37, 9, 17, 9, 37, 20, 30 }, // 2 6 2 3 2 6 4 5 + {17, 9, 17, 37, 20, 9, 17, 37 } // 3 2 3 6 4 2 3 6 + } + } + }; +//--------------------------------------------------------------------------- + +__fastcall TPredefineProjectForm::TPredefineProjectForm(TComponent* Owner) + : TForm(Owner) +{ + SetTransparent( this ); + InitVariable(); + InitUI(); +} +//--------------------------------------------------------------------------- + +__fastcall TPredefineProjectForm::~TPredefineProjectForm() +{ + if(mTest) { + delete mTest; + mTest = NULL; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TPredefineProjectForm::InitUI() +{ + for(int i = 0; i < KEY_NUM; i++) { + String KeyStr = String(g_strMelodyKey[i]); + if(KeyStr.Length() == 1) { + KeyStr = L" " + KeyStr; + } + mKeyComboBox->AddItem(KeyStr); + } + + mKeyTypeComboBox->AddItem(L""); + mKeyTypeComboBox->AddItem(L"С"); + + mStageComboBox->AddItem(IntToStr(1)); + mStageComboBox->AddItem(IntToStr(2)); + mStageComboBox->AddItem(IntToStr(3)); + + mStageSetComboBox->AddItem(IntToStr(1)); + mStageSetComboBox->AddItem(IntToStr(2)); + + mTSComboBox->AddItem(String(g_strTimeSignature[0])); + mTSComboBox->AddItem(String(g_strTimeSignature[1])); + mTSComboBox->AddItem(String(g_strTimeSignature[2])); + mTSComboBox->AddItem(String(g_strTimeSignature[3])); + + mTempoComboBox->AddItem(L""); + mTempoComboBox->AddItem(L""); + mTempoComboBox->AddItem(L""); + mTempoComboBox->AddItem(L"Կ"); + mTempoComboBox->AddItem(L"ܿ"); + mTempoComboBox->AddItem(L"Զ"); + mTempoComboBox->DefItemIndex = 2; +} +//--------------------------------------------------------------------------- +void __fastcall TPredefineProjectForm::InitVariable() +{ + m_Ts = g_iMelodyTimeSignature; + m_Tempo = g_nMelodyTempo; + m_Key = 0; + m_KeyType = 0; + m_RavStage = 2; + + mLordSong = rand() % 8; + mBridge = rand() % 8; + mRefrain = rand() % 8; + + mPaintBoxDefColor = TColor(0x4D4641); + mPaintBoxFocColor = TColor(0xAA9C91); + + mPaintBoxFlag = true; +} +//--------------------------------------------------------------------------- + + +void __fastcall TPredefineProjectForm::DoShowPreChordPaint(TObject *Sender) +{ + TPaintBox *PaintBox = (TPaintBox *)Sender; + + TRect cRect = PaintBox->ClientRect; + PaintBox->Canvas->Brush->Color = mPaintBoxDefColor; + + if(PaintBox->Canvas->Pen->Color == mPaintBoxFocColor) + PaintBox->Canvas->RoundRect(cRect, 5, 5); + else + PaintBox->Canvas->FillRect(cRect); + + cRect.Right--; + cRect.Left++; + cRect.Top++; + cRect.Bottom--; + + PaintBox->Canvas->Brush->Color = TColor(0xC4B4A8); + PaintBox->Canvas->Pen->Color = TColor(0x302E2C); + PaintBox->Canvas->RoundRect(cRect, 5, 5); + + PaintBox->Canvas->Pen->Color = mPaintBoxDefColor; + + int Preset = 0; + + int Stage = mStageSetComboBox->DefItemIndex; + + if(mStageComboBox->DefItemIndex == 2) { + if(mStageSetComboBox->DefItemIndex == 0) { + Preset = mLordSong; + } + else if(mStageSetComboBox->DefItemIndex == 1) { + Preset = mBridge; + Stage = 2; + } + else if(mStageSetComboBox->DefItemIndex == 2){ + Preset = mRefrain; + Stage = 1; + } + } + else { + if(mStageSetComboBox->DefItemIndex == 0) { + Preset = mLordSong; + } + else if(mStageSetComboBox->DefItemIndex == 1) { + Preset = mRefrain; + } + } + + BYTE *Chord = (BYTE *)u_arrPredefChords[Stage][m_KeyType][Preset]; + + for(int i = 0; i < 8; i++) { + TRect Rect = mChordRect[i]; + int ch = Chord[i]; + + int type = ch & 0x03; + int key = (ch >> 2) + m_Key; + + if( key>11 ) key -= 12; + + DrawChord(PaintBox->Canvas, Rect, key, type); + + if(i != 7) { + PaintBox->Canvas->MoveTo(Rect.Right - 1, Rect.Top); + PaintBox->Canvas->LineTo(Rect.Right - 1, Rect.Bottom); + } + } +} +//--------------------------------------------------------------------------- + +void TPredefineProjectForm::DrawChord(TCanvas *Canvas, TRect Rect, int iKey, int iType) +{ + int iMainKey, iAjustKey; // + TPrefineProjectSetItem::GetChordDisplayKey(iKey, m_Key, iMainKey, iAjustKey); + TPrefineProjectSetItem::UniDrawChord(Canvas, Rect, iMainKey, iAjustKey, iType); +} +//--------------------------------------------------------------------------- + +void __fastcall TPredefineProjectForm::FormCreate(TObject *Sender) +{ + GeneralDialogPanel->Font->Size = g_szFont9; + mTempoLineEdit->SetTextFont(g_strTxtFontName, g_szFont9); + mCancelButton->FontSize = g_szFont9; + mOkButton->FontSize = g_szFont9; + + mKeyComboBox->SetFont(g_strTxtFontName, g_szFont9); + mKeyTypeComboBox->SetFont(g_strTxtFontName, g_szFont9); + mStageComboBox->SetFont(g_strTxtFontName, g_szFont9); + mTSComboBox->SetFont(g_strTxtFontName, g_szFont9); + mTempoComboBox->SetFont(g_strTxtFontName, g_szFont9); + mStageSetComboBox->SetFont(g_strTxtFontName, g_szFont9); + + int ChordWidth = mChordsBox->Width / 8; + + int ChordLeft; + int ChordTop = 1; + int ChordRight; + int ChordBottom = 27; + + for(int i = 0; i < 8; i++) { + ChordLeft = i * ChordWidth; + ChordRight = ChordLeft + ChordWidth; + mChordRect[i] = TRect(ChordLeft, ChordTop, ChordRight, ChordBottom); + } + + mChordRect[0].Left++; + mChordRect[7].Right--; + + mKeyComboBox->DefItemIndex = 0; + mKeyTypeComboBox->DefItemIndex = 0; + mStageComboBox->DefItemIndex = 1; + mStageSetComboBox->DefItemIndex = 0; + mTSComboBox->DefItemIndex = m_Ts; + mTempoLineEdit->Text = IntToStr(m_Tempo); +} +//--------------------------------------------------------------------------- + +void __fastcall TPredefineProjectForm::DoKeyChange(TComboBoxItem *Sender, int Index) + +{ + m_Key = Index; + mChordsBox->Repaint(); +} +//--------------------------------------------------------------------------- + +void __fastcall TPredefineProjectForm::DoKeyTypeChange(TComboBoxItem *Sender, int Index) + +{ + m_KeyType = Index; + mChordsBox->Repaint(); +} +//--------------------------------------------------------------------------- + +void __fastcall TPredefineProjectForm::StageSetChange(TComboBoxItem *Sender, int Index) +{ + mChordsBox->Repaint(); +} +//--------------------------------------------------------------------------- + +void __fastcall TPredefineProjectForm::DoStageCountChange(TComboBoxItem *Sender, int Index) + +{ + mStageSetComboBox->Clear(); + for(int i = 0; i <= Index; i++) { + mStageSetComboBox->AddItem(IntToStr(i + 1)); + } + mStageSetComboBox->DefItemIndex = 0; + StageSetChange(NULL, 0); + m_RavStage = Index + 1; +} +//--------------------------------------------------------------------------- + +void __fastcall TPredefineProjectForm::DoPaintBoxMouseEnter(TObject *Sender) +{ +// TPaintBox *PaintBox = (TPaintBox *)Sender; +// PaintBox->Canvas->Pen->Color = mPaintBoxFocColor; +// PaintBox->Repaint(); + + mPresetMouseOver = true; +} +//--------------------------------------------------------------------------- + +void __fastcall TPredefineProjectForm::DoPaintBoxMouseLeave(TObject *Sender) +{ +// if(!mIsPreSetShow) { +// TPaintBox *PaintBox = (TPaintBox *)Sender; +// PaintBox->Canvas->Pen->Color = mPaintBoxDefColor; +// PaintBox->Repaint(); +// } + + mPresetMouseOver = false; +} +//--------------------------------------------------------------------------- +void __fastcall TPredefineProjectForm::DoPaintBoxMouseDown(TObject *Sender, TMouseButton Button, + TShiftState Shift, int X, int Y) +{ + if(Button == 0) { + if(mPaintBoxFlag) { + if(mTest) { + delete mTest; + mTest = NULL; + } + + mTest = new TPrefineProjectSet(NULL); + mTest->Parent = this; + + int Preset = 0; + + int Stage = mStageSetComboBox->DefItemIndex; + + if(mStageComboBox->DefItemIndex == 2) { + if(mStageSetComboBox->DefItemIndex == 0) { + Preset = mLordSong; + } + else if(mStageSetComboBox->DefItemIndex == 1) { + Preset = mBridge; + Stage = 2; + } + else if(mStageSetComboBox->DefItemIndex == 2){ + Preset = mRefrain; + Stage = 1; + } + } + else { + if(mStageSetComboBox->DefItemIndex == 0) { + Preset = mLordSong; + } + else if(mStageSetComboBox->DefItemIndex == 1) { + Preset = mRefrain; + } + } + + for(int i = 0; i < 8; i++) { + BYTE *Chord = (BYTE *)u_arrPredefChords[Stage][m_KeyType][i]; + TPrefineProjectSetItem *Item = new TPrefineProjectSetItem(mTest); + Item->Key = m_Key; + Item->Index = i; + memcpy(Item->PredefChord, Chord, 8 * sizeof(BYTE)); + mTest->AddItem(Item); + } + + mTest->SelectedIndex = Preset; + + TPoint posClient(0, mChordsBox->Height); + + mTest->OnShow = DoPresetChordShow; + mTest->OnHide = DoPresetChordHide; + + TPoint pos = mChordsBox->ClientToScreen(posClient); + + mTest->Top = pos.Y; + mTest->Left = pos.X + 1; + mTest->Width = mChordsBox->Width - 2; + mTest->Height = 200; + mTest->Show(); + } + + mPaintBoxFlag = !mPaintBoxFlag; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TPredefineProjectForm::DoPresetChordShow(TObject *Sender) +{ + mChordsBox->Canvas->Pen->Color == mPaintBoxFocColor; + + mIsPreSetShow = true; +} +//--------------------------------------------------------------------------- + +void __fastcall TPredefineProjectForm::DoPresetChordHide(TObject *Sender) +{ + if(GetActiveWindow() != Handle) { + mPaintBoxFlag = true; + } + + if(!mPresetMouseOver) + mPaintBoxFlag = true; + + mChordsBox->Canvas->Pen->Color == mPaintBoxDefColor; + + if(mStageComboBox->DefItemIndex == 2) { + if(mStageSetComboBox->DefItemIndex == 0) { + mLordSong = mTest->SelectedIndex; + } + else if(mStageSetComboBox->DefItemIndex == 1) { + mBridge = mTest->SelectedIndex; + } + else if(mStageSetComboBox->DefItemIndex == 2){ + mRefrain = mTest->SelectedIndex; + } + } + else { + if(mStageSetComboBox->DefItemIndex == 0) { + mLordSong = mTest->SelectedIndex; + } + else if(mStageSetComboBox->DefItemIndex == 1) { + mRefrain = mTest->SelectedIndex; + } + } + + mIsPreSetShow = false; + + mChordsBox->Repaint(); +} +//--------------------------------------------------------------------------- + +void __fastcall TPredefineProjectForm::DoTsChange(TComboBoxItem *Sender, int Index) +{ + m_Ts = Index; +} +//--------------------------------------------------------------------------- + +void __fastcall TPredefineProjectForm::DoTempoComboChange(TComboBoxItem *Sender, int Index) +{ + if(Index == 0) { + mTempoLineEdit->Text = IntToStr(55); + } + else if(Index == 1){ + mTempoLineEdit->Text = IntToStr(65); + } + else if(Index == 2) { + mTempoLineEdit->Text = IntToStr(80); + } + else if(Index == 3) { + mTempoLineEdit->Text = IntToStr(110); + } + else if(Index == 4){ + mTempoLineEdit->Text = IntToStr(120); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TPredefineProjectForm::DoTempoEditChange(TObject *Sender) +{ + if(mTempoLineEdit->Text.IsEmpty()) +// mTempoLineEdit->Text = IntToStr(0); + return; + + int Value = StrToInt(mTempoLineEdit->Text); + + if(Value == 55) { + mTempoComboBox->DefItemIndex = 0; + } + else if(Value == 65){ + mTempoComboBox->DefItemIndex = 1; + } + else if(Value == 80) { + mTempoComboBox->DefItemIndex = 2; + } + else if(Value == 110) { + mTempoComboBox->DefItemIndex = 3; + } + else if(Value == 120) { + mTempoComboBox->DefItemIndex = 4; + } + else { + mTempoComboBox->DefItemIndex = 5; + } + + m_Tempo = Value; +} +//--------------------------------------------------------------------------- + +void __fastcall TPredefineProjectForm::mTempoUpDownClick(TObject *Sender, TUDBtnType Button) +{ + int Value = g_nMelodyTempo; + + if(!mTempoLineEdit->Text.IsEmpty()) + Value = StrToInt(mTempoLineEdit->Text); + + if(Button == btNext) + Value += 1; + else + Value -= 1; + + if(Value < 50) { + Value = 50; + } + + if(Value > 200) { + Value = 200; + } + + mTempoLineEdit->Text = IntToStr(Value); +} +//--------------------------------------------------------------------------- + +void __fastcall TPredefineProjectForm::DoGeneraDialogPanelMouseDown(TObject *Sender, + TMouseButton Button, TShiftState Shift, int X, int Y) +{ + GeneralDialogPanel->SetFocus(); +} +//--------------------------------------------------------------------------- +int __fastcall TPredefineProjectForm::ShowModal() +{ + int ret = TForm::ShowModal(); + m_Preset[0] = mLordSong; + + if(mStageComboBox->DefItemIndex == 2) { + m_Preset[1] = mBridge; + m_Preset[2] = mRefrain; + } + else { + m_Preset[1] = mRefrain; + m_Preset[2] = 0; + } + + return ret; +} + +void __fastcall TPredefineProjectForm::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) +{ + switch( Key ){ + case VK_RETURN: + ModalResult = mrOk; + break; + + case VK_ESCAPE: + ModalResult = mrCancel; + break; + } +} +//--------------------------------------------------------------------------- + diff --git a/PredefineProjectFormUnit.dfm b/PredefineProjectFormUnit.dfm new file mode 100644 index 0000000..705552f --- /dev/null +++ b/PredefineProjectFormUnit.dfm @@ -0,0 +1,255 @@ +object PredefineProjectForm: TPredefineProjectForm + Left = 0 + Top = 0 + BorderStyle = bsNone + Caption = 'PredefineProjectForm' + ClientHeight = 260 + ClientWidth = 520 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = 12429980 + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + KeyPreview = True + Position = poMainFormCenter + Scaled = False + OnCreate = FormCreate + OnKeyDown = FormKeyDown + TextHeight = 13 + object GeneralDialogPanel: TGeneralDialogPanel + Left = 0 + Top = 0 + Width = 520 + Height = 260 + Caption = #39044#35774#24037#31243 + Color = 5064257 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentBackground = False + ParentFont = False + TabOrder = 0 + OnMouseDown = DoGeneraDialogPanelMouseDown + object mTsLabel: TLabel + Left = 25 + Top = 58 + Width = 24 + Height = 14 + Caption = #33410#25293 + Font.Charset = DEFAULT_CHARSET + Font.Color = 12429980 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object mTempoLabel: TLabel + Left = 119 + Top = 58 + Width = 24 + Height = 14 + Caption = #36895#24230 + Font.Charset = DEFAULT_CHARSET + Font.Color = 12429980 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object mKeyComboBox: TComboBoxComponent + Left = 340 + Top = 54 + Width = 42 + Height = 24 + ParentShowHint = False + ShowHint = True + Caption = 'C' + OnChange = DoKeyChange + ShowItemCount = 8 + Parent = GeneralDialogPanel + end + object mKeyTypeComboBox: TComboBoxComponent + Left = 434 + Top = 54 + Width = 61 + Height = 24 + ParentShowHint = False + ShowHint = True + Caption = #22823#35843 + OnChange = DoKeyTypeChange + ShowItemCount = 7 + Parent = GeneralDialogPanel + end + object mStageComboBox: TComboBoxComponent + Left = 79 + Top = 114 + Width = 35 + Height = 24 + ParentShowHint = False + ShowHint = True + Caption = '1' + OnChange = DoStageCountChange + ShowItemCount = 5 + Parent = GeneralDialogPanel + end + object mKeyLabel: TLabel + Left = 310 + Top = 58 + Width = 24 + Height = 14 + Caption = #35843#21495 + Font.Charset = DEFAULT_CHARSET + Font.Color = 12429980 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object mStageLabel: TLabel + Left = 25 + Top = 118 + Width = 48 + Height = 14 + Caption = #26059#24459#20998#27573 + Font.Charset = DEFAULT_CHARSET + Font.Color = 12429980 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object mKeyTypeLabel: TLabel + Left = 404 + Top = 58 + Width = 24 + Height = 14 + Caption = #35843#24615 + Font.Charset = DEFAULT_CHARSET + Font.Color = 12429980 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object mCancelButton: TTextButton + Left = 420 + Top = 211 + Width = 75 + Height = 25 + ModalResult = mrCancel + ParentShowHint = False + ShowHint = True + Text = #21462#28040 + end + object mOkButton: TTextButton + Left = 333 + Top = 211 + Width = 75 + Height = 25 + ModalResult = mrOk + ParentShowHint = False + ShowHint = True + Text = #30830#23450 + end + object mChordsBox: TPaintBox + Left = 25 + Top = 154 + Width = 470 + Height = 30 + Cursor = crHandPoint + Hint = #28857#20987#21152#36733#39044#35774 + ParentShowHint = False + ShowHint = True + OnMouseDown = DoPaintBoxMouseDown + OnMouseEnter = DoPaintBoxMouseEnter + OnMouseLeave = DoPaintBoxMouseLeave + OnPaint = DoShowPreChordPaint + end + object mTSComboBox: TComboBoxComponent + Left = 55 + Top = 54 + Width = 42 + Height = 24 + ParentShowHint = False + ShowHint = True + Caption = '4/4' + OnChange = DoTsChange + ShowItemCount = 5 + Parent = GeneralDialogPanel + end + object mTempoComboBox: TComboBoxComponent + Left = 149 + Top = 54 + Width = 61 + Height = 24 + ParentShowHint = False + ShowHint = True + Caption = #20013#36895 + OnChange = DoTempoComboChange + ShowItemCount = 5 + Parent = GeneralDialogPanel + end + object Label1: TLabel + Left = 178 + Top = 118 + Width = 72 + Height = 14 + Caption = #21644#24358#39044#35774#65292#31532 + Font.Charset = DEFAULT_CHARSET + Font.Color = 12429980 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object Label2: TLabel + Left = 297 + Top = 118 + Width = 24 + Height = 14 + Caption = #27573#65306 + Font.Charset = DEFAULT_CHARSET + Font.Color = 12429980 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object mStageSetComboBox: TComboBoxComponent + Left = 256 + Top = 114 + Width = 35 + Height = 24 + ParentShowHint = False + ShowHint = True + Caption = '1' + OnChange = StageSetChange + ShowItemCount = 5 + Parent = GeneralDialogPanel + end + object mTempoLineEdit: TLineEdit + Left = 216 + Top = 54 + Width = 32 + Height = 24 + OnChange = DoTempoEditChange + MaxLength = 3 + NumbersOnly = True + NumberMax = 200 + NumberMin = 50 + Text = '80' + TabOrder = 0 + end + object mTempoUpDown: TUpDown + Left = 247 + Top = 55 + Width = 16 + Height = 22 + TabOrder = 1 + OnClick = mTempoUpDownClick + end + end +end diff --git a/PredefineProjectFormUnit.h b/PredefineProjectFormUnit.h new file mode 100644 index 0000000..49beed5 --- /dev/null +++ b/PredefineProjectFormUnit.h @@ -0,0 +1,102 @@ +//--------------------------------------------------------------------------- + +#ifndef PredefineProjectFormUnitH +#define PredefineProjectFormUnitH +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include "GeneralDialogPanel.h" +#include +#include "SkinTrackBar.h" +#include "LineEdit.h" +#include "ComboBoxComponent.h" +#include "GlobalUnit.h" +#include "TextButton.h" +#include "UpDownUnit.h" +#include "PredefineProjectSetUnit.h" +#include +//--------------------------------------------------------------------------- +class TPredefineProjectForm : public TForm +{ +__published: // IDE-managed Components + TGeneralDialogPanel *GeneralDialogPanel; + TLabel *mTsLabel; + TLabel *mTempoLabel; + TLabel *mKeyLabel; + TLabel *mStageLabel; + TLabel *mKeyTypeLabel; + TLabel *Label1; + TLabel *Label2; + TLineEdit *mTempoLineEdit; + TTextButton *mCancelButton; + TTextButton *mOkButton; + TPaintBox *mChordsBox; + TComboBoxComponent *mKeyComboBox; + TComboBoxComponent *mKeyTypeComboBox; + TComboBoxComponent *mStageComboBox; + TComboBoxComponent *mTSComboBox; + TComboBoxComponent *mTempoComboBox; + TComboBoxComponent *mStageSetComboBox; + UpDownUnit::TUpDown *mTempoUpDown; + + void __fastcall DoShowPreChordPaint(TObject *Sender); + void __fastcall FormCreate(TObject *Sender); + void __fastcall DoKeyChange(TComboBoxItem *Sender, int Index); + void __fastcall DoKeyTypeChange(TComboBoxItem *Sender, int Index); + void __fastcall StageSetChange(TComboBoxItem *Sender, int Index); + void __fastcall DoStageCountChange(TComboBoxItem *Sender, int Index); + void __fastcall DoPaintBoxMouseEnter(TObject *Sender); + void __fastcall DoPaintBoxMouseLeave(TObject *Sender); + void __fastcall DoPaintBoxMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, + int X, int Y); + void __fastcall DoTsChange(TComboBoxItem *Sender, int Index); + void __fastcall DoTempoComboChange(TComboBoxItem *Sender, int Index); + void __fastcall DoTempoEditChange(TObject *Sender); + void __fastcall mTempoUpDownClick(TObject *Sender, TUDBtnType Button); + void __fastcall DoGeneraDialogPanelMouseDown(TObject *Sender, TMouseButton Button, + TShiftState Shift, int X, int Y); + void __fastcall FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift); +private: // User declarations + TRect mChordRect[8]; + + TPrefineProjectSet *mTest; + + TColor mPaintBoxFocColor; + TColor mPaintBoxDefColor; + + int mLordSong; // + int mRefrain; // + int mBridge; // + + bool mPaintBoxFlag; + bool mPresetMouseOver; + bool mIsPreSetShow; + + void __fastcall InitUI(); + void __fastcall InitVariable(); + + void DrawChord(TCanvas *Canvas, TRect Rect, int iKey, int iType); + + void __fastcall DoPresetChordShow(TObject *Sender); + void __fastcall DoPresetChordHide(TObject *Sender); + +public: // User declarations + int m_Ts; + int m_Tempo; + int m_Key; + int m_KeyType; + int m_RavStage; + int m_Preset[3]; + + __fastcall TPredefineProjectForm(TComponent* Owner); + __fastcall ~TPredefineProjectForm(); + + virtual int __fastcall ShowModal(); +}; +//--------------------------------------------------------------------------- +extern PACKAGE TPredefineProjectForm *PredefineProjectForm; +extern const BYTE u_arrPredefChords[3][2][8][8]; +//--------------------------------------------------------------------------- +#endif diff --git a/PredefineProjectSetUnit.cpp b/PredefineProjectSetUnit.cpp new file mode 100644 index 0000000..b2cce0f --- /dev/null +++ b/PredefineProjectSetUnit.cpp @@ -0,0 +1,433 @@ +//--------------------------------------------------------------------------- + +#pragma hdrstop + +#include "PredefineProjectSetUnit.h" +#include "GlobalUnit.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) + +#define ITEM_OVER TColor(RGB(76, 82, 91)) +#define ITEM_SELECTED TColor(RGB(29, 31, 35)) +#define ITEM_DEF TColor(RGB(39, 42, 47)) + +#define ITEM_TEXT_COLOR TColor(RGB(189, 195, 200)) // TColor(RGB(213, 221, 232)) + +#define BORDER TColor(RGB(106, 111, 117)) +#define BACKGRND TColor(RGB(52, 55, 62)) + +#define MARGIN 2 + +//--------------------------------------------------------------------------- +__fastcall TPrefineProjectSetItem::TPrefineProjectSetItem(TWinControl *Parent) : TGraphicControl(Parent) +{ + SetParentComponent(Parent); + + FIsSelected = false; + FIsFocus = false; + + CtrlParent = NULL; +} +//--------------------------------------------------------------------------- +void __fastcall TPrefineProjectSetItem::SetSelected(bool Value) +{ + if(FIsSelected != Value) { + FIsSelected = Value; + Repaint(); + } +} +//--------------------------------------------------------------------------- +void __fastcall TPrefineProjectSetItem::Paint() +{ + Canvas->Brush->Color = BACKGRND; + Canvas->Font->Color = ITEM_TEXT_COLOR;//RGB(200,200,200); + + if(FIsSelected) { + Canvas->Brush->Color = ITEM_SELECTED; + Canvas->FillRect(ClientRect); +// Canvas->Brush->Color = ITEM_SELECTED; +// Canvas->FrameRect(ClientRect); + } + else if(FIsFocus) { + Canvas->Brush->Color = ITEM_OVER; + Canvas->FillRect(ClientRect); +// Canvas->Brush->Color = ITEM_FOC; +// Canvas->FrameRect(ClientRect); + } + else { + Canvas->FillRect(ClientRect); + } + + for(int i = 0; i < 8; i++) { + int l = ClientRect.Left + i * (Width / 8); + int t = ClientRect.Top; + int r = l + (Width / 8); + int b = ClientRect.Bottom - 2; + + TRect Rect(l, t, r, b); + + int ch = PredefChord[i]; + + int type = ch & 0x03; + int key = (ch >> 2) + Key; + + if( key>11 ) key -= 12; + + DrawChord(Canvas, Rect, key, type); + } +} +//--------------------------------------------------------------------------- +void __fastcall TPrefineProjectSetItem::CMMouseEnter(TMessage &Message) +{ + FIsFocus = true; + Repaint(); +} +//--------------------------------------------------------------------------- +void __fastcall TPrefineProjectSetItem::CMMouseLeave(TMessage &Message) +{ + FIsFocus = false; + Repaint(); +} +//--------------------------------------------------------------------------- +void __fastcall TPrefineProjectSetItem::WMLButtonDown(TWMLButtonDown &Message) +{ + IsSelected = true; + + if(CtrlParent) + CtrlParent->DoItemClick(this, Index); +} +//--------------------------------------------------------------------------- +void __fastcall TPrefineProjectSetItem::DrawChord(TCanvas *Canvas, TRect Rect, int iKey, int iType) +{ + int iMainKey, iAjustKey; // + GetChordDisplayKey(iKey, Key, iMainKey, iAjustKey); + UniDrawChord(Canvas, Rect, iMainKey, iAjustKey, iType); +} +//--------------------------------------------------------------------------- + +void __fastcall TPrefineProjectSetItem::GetChordDisplayKey(int iKey, int iBaseKey, int& iMainKey, int& iAjustKey) +{ + iMainKey = -1; + iAjustKey = 0; + + if( iKey<0 ) + return; + + if( !g_bAlphaKey ){ + iKey -= iBaseKey; + if( iKey<0 ) iKey += 12; + } + + switch( iKey ){ + case 0: iMainKey = 0; + break; + case 1: iAjustKey = -1; + case 2: iMainKey = 1; + break; + case 3: iAjustKey = -1; + case 4: iMainKey = 2; + break; + case 6: iAjustKey = 1; + case 5: iMainKey = 3; + break; + case 7: iMainKey = 4; + break; + case 8: iAjustKey = -1; + case 9: iMainKey = 5; + break; + case 10: iAjustKey = -1; + case 11: iMainKey = 6; + break; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TPrefineProjectSetItem::UniDrawChord(TCanvas *Canvas, TRect rcDraw, int iMainKey, int iAjustKey, int iType) +{ + String strMainKey, strAjustKey, strA, strN; + + if( iAjustKey==1 ) strAjustKey = L"#"; + else if( iAjustKey==-1 ) strAjustKey = L"b"; + + if( iType==1 || iType==3 ) strA = L"m"; + if( iType==2 || iType==3 ) strN = L"7"; + + int iMKeyLeft, iATypeLeft, iNTypeLeft, wChord(0), + wMKey(12), wAKey(3), wType(8), wVKey(12), wIKey(6); + + if( !g_bAlphaKey ){ //ĸ + if( iMainKey==0 ){ + wMKey = iType>0 ? 6 : 8; + } + else if( iMainKey==1 ){ + wMKey = iType>0 ? 12 : 16; + } + else if( iMainKey==2 ){ + wIKey = 5; + wMKey = iType>0 ? 16 : 18; + } + else if( iMainKey==3 ){ + wVKey = 11; + wMKey = iType>0 ? 15 : 18; + } + else if( iMainKey==4 ){ + wMKey = iType>0 ? 10 : 16; + } + else if( iMainKey==5 ){ + wVKey = 11; + wIKey = 5; + wMKey = iType>0 ? 17 : 20; + } + else if( iMainKey==6 ){ + wVKey = 11; + wIKey = 5; + wMKey = iType>0 ? 22 : 26; + } + } + else{ //Ӣĸ + if( iMainKey==5 ){ //Aſ + wAKey = 1; + } + else if( iMainKey==3 ){ //F±꿿 + wMKey = 9; + } + } + + wChord += wMKey; + if( iAjustKey!=0 ) wChord += wAKey; + if( strA.Length()>0 ) wChord += wType - 1; + if( strN.Length()>0 ) wChord += wType - 1; + + int iLeft = rcDraw.Left + ( rcDraw.Width() - wChord ) / 2, + iOriTop = rcDraw.top + (rcDraw.Height() - 18) / 2; + + TFont *fntOld = new TFont; + fntOld->Assign( Canvas->Font ); + + Canvas->Font->Name = "Times New Roman"; + Canvas->Font->Quality = TFontQuality::fqClearTypeNatural; +// Canvas->Font->Color = RGB(60,43,23); + Canvas->Font->Style = TFontStyles()<Brush->Style = bsClear; + + // + if( iAjustKey!=0 ){ + int iTop = iOriTop-2; + if( iAjustKey==-1 || !g_bAlphaKey && iMainKey==6 ) + iTop++; + + Canvas->Font->Size = g_szFont8; //С + Canvas->TextOut( iLeft, iTop, strAjustKey ); + + iLeft += wAKey; + } + + int iTop = iOriTop - 1; + Canvas->Font->Size = g_szFont16; //С + if( g_bAlphaKey ){ + strMainKey = g_strAlphaTable[iMainKey]; + Canvas->TextOut( iLeft, iTop, strMainKey ); + } + else{ + int l = iLeft; + if( iMainKey<4 ){ + strMainKey = L"I"; + Canvas->TextOut( l, iTop, strMainKey ); + l += wIKey; + + if( iMainKey==3 ){ + strMainKey = L"V"; + Canvas->TextOut( l, iTop, strMainKey ); + l += wVKey; + } + else if( iMainKey>0 ){ + Canvas->TextOut( l, iTop, strMainKey ); + l += wIKey; + + if( iMainKey==2 ){ + Canvas->TextOut( l, iTop, strMainKey ); + l += wIKey; + } + } + } + else{ + strMainKey = L"V"; + Canvas->TextOut( l, iTop, strMainKey ); + l += wVKey; + + if( iMainKey>4 ){ + strMainKey = L"I"; + Canvas->TextOut( l, iTop, strMainKey ); + l += wIKey; + + if( iMainKey==6 ){ + Canvas->TextOut( l, iTop, strMainKey ); + l += wIKey; + } + } + } + } + + iLeft += wMKey; + iTop = iOriTop + 6; + + //A + if( strA.Length()>0 ){ + Canvas->Font->Size = g_szFont9; + Canvas->TextOut( iLeft+2, iTop, strA ); + + iLeft += wType; + } + + //N + if( strN.Length()>0 ){ + iTop += g_szFont8==g_szFont9 ? 2 : 3; + Canvas->Font->Size = g_szFont8; + Canvas->Font->Style = TFontStyles(); + Canvas->TextOut( iLeft+4, iTop, strN ); + } + + Canvas->Font->Assign( fntOld ); + delete fntOld; +} +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +__fastcall TPrefineProjectSet::TPrefineProjectSet(TComponent *Owner) : TCustomControl(Owner) +{ + mContentArea = new TWinControl(this); + + mItemList = new TList(); + + mItemWidth = 100; + mItemHeight = 25; + + mCurrentItem = NULL; + + OnHide = NULL; + OnShow = NULL; +} +//--------------------------------------------------------------------------- +__fastcall TPrefineProjectSet::~TPrefineProjectSet() +{ + if(mItemList) { + mItemList->Clear(); + delete mItemList; + mItemList = NULL; + } + + if(mContentArea) { + delete mContentArea; + mContentArea = NULL; + } +} +//--------------------------------------------------------------------------- +void __fastcall TPrefineProjectSet::AddItem(TPrefineProjectSetItem *Item) +{ + Item->Width = 400; + Item->Height = mItemHeight; + Item->Top = mItemList->Count * mItemHeight; + Item->Left = 0; + Item->Parent = mContentArea; + Item->CtrlParent = this; + + mItemList->Add(Item); +} +//--------------------------------------------------------------------------- +void __fastcall TPrefineProjectSet::SetSelectedIndex(int Value) +{ + mSelectedIndex = Value; + + TPrefineProjectSetItem *Item = (TPrefineProjectSetItem *)mItemList->Items[Value]; + Item->IsSelected = true; + + DoItemClick(Item, Value); +} +//--------------------------------------------------------------------------- +void __fastcall TPrefineProjectSet::CreateParams(TCreateParams &Params) +{ + TCustomControl::CreateParams(Params); + + Params.Style = 0; + + Params.Style = WS_POPUP; +} +//--------------------------------------------------------------------------- +void __fastcall TPrefineProjectSet::CreateWnd() +{ + TCustomControl::CreateWnd(); + mContentArea->Parent = this; +} +//--------------------------------------------------------------------------- +void __fastcall TPrefineProjectSet::Hide() +{ + TCustomControl::Hide(); + SetActiveWindow(mActiveWndBak); + + if(OnHide) { + OnHide(this); + } +} +//--------------------------------------------------------------------------- +void __fastcall TPrefineProjectSet::Show() +{ + TCustomControl::Show(); + + mActiveWndBak = GetActiveWindow(); + SetActiveWindow(Handle); + + Height = mItemList->Count * mItemHeight + 4; + + if(OnShow) { + OnShow(this); + } +} +//--------------------------------------------------------------------------- +void __fastcall TPrefineProjectSet::DoItemClick(TPrefineProjectSetItem *Item, int Index) +{ + if(mCurrentItem != Item) { + if(mCurrentItem) + mCurrentItem->IsSelected = false; + + mCurrentItem = Item; + + mSelectedIndex = Index; + } + + Hide(); +} +//--------------------------------------------------------------------------- +void __fastcall TPrefineProjectSet::WMEraseBkgnd(TWMEraseBkgnd &Message) +{ + TCanvas* tmpCanvas = new TCanvas(); + tmpCanvas->Handle = Message.DC; + + tmpCanvas->Brush->Color = BACKGRND; + tmpCanvas->FillRect(ClientRect); + + tmpCanvas->Brush->Color = BORDER; + tmpCanvas->FrameRect(ClientRect); + + delete tmpCanvas; +} +//--------------------------------------------------------------------------- +void __fastcall TPrefineProjectSet::WMSize(TWMSize &Message) +{ + mContentArea->Width = Width - 4; + mContentArea->Height = Height - 4; + mContentArea->Top = 2; + mContentArea->Left = 2; + + for(int i = 0; i < mItemList->Count; i++) { + TPrefineProjectSetItem *Item = (TPrefineProjectSetItem *)mItemList->Items[i]; + Item->Width = mContentArea->Width; + } + mItemWidth = mContentArea->Width; +} +//--------------------------------------------------------------------------- +void __fastcall TPrefineProjectSet::WMKillFocus(TMessage &Message) +{ + Hide(); +} +//--------------------------------------------------------------------------- + diff --git a/PredefineProjectSetUnit.h b/PredefineProjectSetUnit.h new file mode 100644 index 0000000..ee0cdd2 --- /dev/null +++ b/PredefineProjectSetUnit.h @@ -0,0 +1,98 @@ +//--------------------------------------------------------------------------- + +#ifndef PredefineProjectSetUnitH +#define PredefineProjectSetUnitH + +#include + +class TPrefineProjectSet; +class TPrefineProjectSetItem; +//--------------------------------------------------------------------------- +class TPrefineProjectSetItem : public TGraphicControl +{ +private: + bool FIsSelected; + bool FIsFocus; + + void __fastcall SetSelected(bool Value); + + MESSAGE void __fastcall CMMouseEnter(TMessage &Message); + MESSAGE void __fastcall CMMouseLeave(TMessage &Message); + MESSAGE void __fastcall WMLButtonDown(TWMLButtonDown &Message); + +protected: + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(CM_MOUSEENTER, TMessage, CMMouseEnter) + MESSAGE_HANDLER(CM_MOUSELEAVE, TMessage, CMMouseLeave) + MESSAGE_HANDLER(WM_LBUTTONDOWN, TWMLButtonDown, WMLButtonDown) + END_MESSAGE_MAP(TGraphicControl) + + virtual void __fastcall Paint(); + +public: + int Key; + BYTE PredefChord[8]; + int Index; + + TPrefineProjectSet *CtrlParent; + + virtual __fastcall TPrefineProjectSetItem(TWinControl *Parent); + + void __fastcall DrawChord(TCanvas *Canvas, TRect Rect, int iKey, int iType); + + static void __fastcall GetChordDisplayKey(int iKey, int iBaseKey, int& iMainKey, int& iAjustKey); + static void __fastcall UniDrawChord(TCanvas *Canvas, TRect rcDraw, int iMainKey, int iAjustKey, int iType); + + __property bool IsSelected = {read = FIsSelected, write = SetSelected}; +}; + +class TPrefineProjectSet : public TCustomControl +{ +private: + TWinControl *mContentArea; + + HWND mActiveWndBak; + + int mItemWidth; + int mItemHeight; + + int mSelectedIndex; + + TList *mItemList; + + TPrefineProjectSetItem *mCurrentItem; + + void __fastcall SetSelectedIndex(int Value); + + MESSAGE void __fastcall WMKillFocus(TMessage &Message); + MESSAGE void __fastcall WMEraseBkgnd(TWMEraseBkgnd &Message); + MESSAGE void __fastcall WMSize(TWMSize &Message); + +protected: + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(WM_KILLFOCUS, TMessage, WMKillFocus) + MESSAGE_HANDLER(WM_ERASEBKGND, TWMEraseBkgnd, WMEraseBkgnd) + MESSAGE_HANDLER(WM_SIZE, TWMSize, WMSize) + END_MESSAGE_MAP(TCustomControl) + + void __fastcall CreateParams(TCreateParams &Params); + void __fastcall CreateWnd(); + +public: + TNotifyEvent OnHide; + TNotifyEvent OnShow; + + __fastcall TPrefineProjectSet(TComponent *Owner); + __fastcall ~TPrefineProjectSet(); + + void __fastcall DoItemClick(TPrefineProjectSetItem *Item, int Index); + + void __fastcall Hide(); + void __fastcall Show(); + + void __fastcall AddItem(TPrefineProjectSetItem *Item); + + __property int SelectedIndex = {read = mSelectedIndex, write = SetSelectedIndex}; +}; + +#endif diff --git a/ProCommon.h b/ProCommon.h new file mode 100644 index 0000000..28088d1 --- /dev/null +++ b/ProCommon.h @@ -0,0 +1,136 @@ +#ifndef _PROCOMMON_H_ +#define _PROCOMMON_H_ + +#pragma once +#include "CommonStruct.h" + +#pragma pack (2) + +//TrackϢ +typedef struct tagTrackRef{ + UINT idLoc; //λid + UINT idStyle; //ID + char segNo; //ԭƬκ + char chan; //ԭͨ + char prog; //ǰ + char vol; //ǰ +/* + tagTrackRef(){ + memset( this, 0, sizeof(tagTrackRef) ); + } +*/ +}TTRACKREF, *PTTRACKREF; + +//ԭϢ +typedef struct tagStyleOrigin{ + WORD cost; //ʹ + WORD score; // (score/100)10 + int paid; //֧ + int state; //״̬ + + TSTYLEDETAIL detail; + + tagStyleOrigin(){ + cost = 0; + score = 0; + paid = 0; + state = 0; + } +}TSTYLEORIGIN, *PTSTYLEORIGIN; + +//طϢ +typedef struct tagStyleLocal{ + short iTempo; //ԭ + short iTimesignature; // ( 0=4/4, 1=3/4, 2=2/4, 3=6/8 ) + + char strStyleName[40]; // UTF8 + char nSegNum[4]; ///ӻ/ǰ/β + char aIEBars[2][8]; //ǰ/βС (0-3 4-7С) + char nSegVol[4][8]; //Ƭ + + TTRACKREF trkRef[4][8][16]; //Ϣ + + tagStyleLocal(){ + memset( this, 0, sizeof(tagStyleLocal) ); + } +}TSTYLELOCAL, *PTSTYLELOCAL; + +//TrackϢ +typedef struct tagShareTrackRef{ + UINT idStyle; //ԭID + char segNo; //ԭƬκ + char chan; //ԭͨ + char prog; //ǰ + char vol; //ǰ +}TSHARETRACKREF, *PTSHARETRACKREF; + +//Ϣ +typedef struct tagStyleShare{ + int idAuthor; //ID + WORD score; // (score/100)10 + + short iTempo; //ԭ + short iTimesignature; // ( 0=4/4, 1=3/4, 2=2/4, 3=6/8 ) + char type[2]; // + char nSegNum[4]; ///ӻ/ǰ/β + char aIEBars[2][8]; //ǰ/βС (0-3 4-7С) + char nSegVol[4][8]; //Ƭ + + //²ֿɱ䳤ȴʹ洢 + char strAuthor[40]; // UTF8 + char strStyleName[40]; // UTF8 + char strDescription[120]; // UTF8 + + TSHARETRACKREF trkRef[4][8][16]; //Ϣ + + tagStyleShare(){ + memset( this, 0, sizeof(tagStyleShare) ); + } +}TSTYLESHARE, *PTSTYLESHARE; + +//רҵṹ +typedef struct tagProStyle{ + UINT idLoc; //λid + UINT idStyle; //ID + + union{ + PTSTYLEORIGIN pOrigin; + PTSTYLELOCAL pLocal; + PTSTYLESHARE pShare; + }; + + tagProStyle(){ + memset( this, 0, sizeof(tagProStyle) ); + } + + ~tagProStyle(){ + if( idLoc==0 ){ + if( pOrigin ) + delete pOrigin; + } + else if( idLoc==1 ){ + if( pShare ) + delete pShare; + } + else{ + if( pLocal ) + delete pLocal; + } + } +}TPROSTYLE, *PTPROSTYLE; + +//Ϣṹ +typedef struct tagMakeStyleInfo{ + short price; // + short cost; //ʹ + TSTYLEDETAIL detail; //ϸϢ + + tagMakeStyleInfo(){ + price = 0; + cost = 0; + } +}TMAKESTYLEINFO, *PMAKETSTYLEINFO; + +#pragma pack() + +#endif //_COMMONSTRUCT_H_ \ No newline at end of file diff --git a/ProgHandlePanel.cpp b/ProgHandlePanel.cpp new file mode 100644 index 0000000..29fdbd1 --- /dev/null +++ b/ProgHandlePanel.cpp @@ -0,0 +1,676 @@ +//--------------------------------------------------------------------------- + +#pragma hdrstop + +#include "ProgHandlePanel.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +//--------------------------------------------------------------------------- +#define ITEM_OVER TColor(RGB(67, 73, 80)) +#define ITEM_SELECTED TColor(RGB(29, 31, 35)) +#define ITEM_DEF TColor(RGB(47, 50, 57)) + +#define ITEM_TEXT_COLOR TColor(RGB(213, 221, 232)) + +#define BORDER TColor(RGB(106, 111, 117)) +#define BACKGRND TColor(RGB(47, 50, 57)) + +#define BORDER_HL TColor(RGB(30, 32, 36)) +#define BACKGRND_HL TColor(RGB(67, 73, 80)) + +#define TEXT_COLOR TColor(RGB(213, 221, 232)) +#define TEXT_DISABLE TColor(RGB(100, 108, 119)) +#define BREAK TColor(RGB(100, 108, 119)) +#define BOARD_FILL TColor(RGB(76, 82, 91)) + +#define MIN(x, y) ((x) < (y) ? (x) : (y)) +#define MAX(x, y) ((x) > (y) ? (x) : (y)) + +#define MARGIN 2 +//--------------------------------------------------------------------------- + +/**************************************************************************** +* +* TProgHandleItem +* +*****************************************************************************/ +__fastcall TProgHandleItem::TProgHandleItem(TProgHandlePanel *OwnerPanel, String Caption) +{ + if(mChildItem == NULL) { + mChildItem = new TList(); + } + + mLevel = 0; + FParent = NULL; + FOwnerPanel = OwnerPanel; + FCaption = Caption; + + FOwnerPanel->AddTopLevelItem(this); +} +//--------------------------------------------------------------------------- +__fastcall TProgHandleItem::TProgHandleItem(TProgHandleItem *Parent, String Caption) +{ + if(mChildItem == NULL) { + mChildItem = new TList(); + } + + FParent = Parent; + FOwnerPanel = Parent->GetOwnerPanel(); + mLevel = Parent->mLevel + 1; + FCaption = Caption; + + FParent->AddChild(this); +} +//--------------------------------------------------------------------------- +__fastcall TProgHandleItem::~TProgHandleItem() +{ + if(mChildItem) { + mChildItem->Clear(); + delete mChildItem; + mChildItem = NULL; + } + + if(mHeaderIconButton) { + delete mHeaderIconButton; + mHeaderIconButton = NULL; + } + + if(mCheckBox) { + delete mCheckBox; + mCheckBox = NULL; + } +} +//--------------------------------------------------------------------------- +void __fastcall TProgHandleItem::AfterConstruction() +{ + FIsUnfold = true; + FIsSelected = false; + FIsFocus = false; + FIsHidden = false; + FIsChecked = true; + + mCanvas = NULL; + + mRect.init(0, 0, 0, 0); + mValidRect.init(0, 0, 0, 0); + mIconRect.init(0, 0, 0, 0); + mCaptionRect.init(0, 0, 0, 0); + + mHeaderIconButton = new TPNGButton(FOwnerPanel); + mHeaderIconButton->Parent = FOwnerPanel; + mHeaderIconButton->ImgStates = 2; + mHeaderIconButton->Visible = true; + mHeaderIconButton->Width = 12; + mHeaderIconButton->Height = 12; + mHeaderIconButton->Top = -12; + mHeaderIconButton->Left = -12; + mHeaderIconButton->OnClick = DoHeaderClick; + + mCheckBox = new TPNGButton(FOwnerPanel); + mCheckBox->Parent = FOwnerPanel; + mCheckBox->ImgStates = 2; + mCheckBox->Visible = true; + mCheckBox->Top = -20; + mCheckBox->Left = -20; + mCheckBox->Width = 20; + mCheckBox->Height = 20; + mCheckBox->OnClick = DoCheckClick; +} +//--------------------------------------------------------------------------- +void __fastcall TProgHandleItem::DrawItem(TCanvas *Canvas, TRect Rect) +{ + if(mRect != Rect) { + mRect = Rect; + + mValidRect = TRect(Rect); + mValidRect.Left += mLevel * 20; + + mIconRect = TRect(mValidRect); + mIconRect.Right = mIconRect.Left + 20; + + mCaptionRect = TRect(mValidRect); + mCaptionRect.Left += 20; + } + + mCanvas = Canvas; + + if(ChildCount > 0) { + if(IsUnfold) + mHeaderIconButton->PngImg->LoadFromResourceName((int)HInstance, L"imgUnfold"); + else + mHeaderIconButton->PngImg->LoadFromResourceName((int)HInstance, L"imgFold"); + + mHeaderIconButton->Top = mIconRect.Top + (mIconRect.Height() - 12) / 2; + mHeaderIconButton->Left = mIconRect.Left + (mIconRect.Width() - 12) / 2; + } + else { + if(FIsChecked) + mCheckBox->PngImg->LoadFromResourceName((int)HInstance, L"imgItemChecked"); + else + mCheckBox->PngImg->LoadFromResourceName((int)HInstance, L"imgItemUnchecked"); + + mCheckBox->Top = mIconRect.Top; + mCheckBox->Left = mIconRect.Left; + } + + if(FIsSelected) + mCanvas->Brush->Color = ITEM_SELECTED; + else if(FIsFocus && !FIsSelected) + mCanvas->Brush->Color = ITEM_OVER; + else + mCanvas->Brush->Color = ITEM_DEF; + + mCanvas->FillRect(mCaptionRect); + + mCanvas->Font->Color = ITEM_TEXT_COLOR; + + int textHeight = mCanvas->TextHeight(FCaption); + + int textLeft = mCaptionRect.Left + 4; + int textTop = mCaptionRect.Top + (mCaptionRect.Height() - textHeight) / 2; + int textRight = mCaptionRect.Right - 4; + int textBottom = textTop + textHeight; + + TRect textRect(textLeft, textTop, textRight, textBottom); + mCanvas->TextRect(textRect, FCaption); +} +//--------------------------------------------------------------------------- +void __fastcall TProgHandleItem::RedrawItem() +{ + if(mCanvas && !FIsHidden) { + DrawItem(mCanvas, mRect); + } +} +//--------------------------------------------------------------------------- +void __fastcall TProgHandleItem::MouseDown(TMouseButton Button, TShiftState Shift, int X, int Y) +{ + if(mCaptionRect.Contains(TPoint(X, Y))) { + if(!FIsSelected){ + FIsSelected = true; + RedrawItem(); + // ѡ + FOwnerPanel->DoSelectedItem(this); + } + } +} +//--------------------------------------------------------------------------- +void __fastcall TProgHandleItem::MouseMove(TShiftState Shift, int X, int Y) +{ + if(mCaptionRect.Contains(TPoint(X, Y))) { + if(!FIsFocus) { + FIsFocus = true; + RedrawItem(); + // ǰ + FOwnerPanel->DoCurrentItem(this); + } + } + else{ + if(FIsFocus) { + FIsFocus = false; + RedrawItem(); + } + } +} +//--------------------------------------------------------------------------- +void __fastcall TProgHandleItem::MouseUp(TMouseButton Button, TShiftState Shift, int X, int Y) +{ + // +} +//--------------------------------------------------------------------------- +TProgHandlePanel *TProgHandleItem::GetOwnerPanel() +{ + return FOwnerPanel; +} +//--------------------------------------------------------------------------- +void __fastcall TProgHandleItem::SetCaption(String Value) +{ + if(FCaption != Value) { + FCaption = Value; + RedrawItem(); + // ֪ͨPanelƱ仯¼ + } +} +//--------------------------------------------------------------------------- +void __fastcall TProgHandleItem::SetUnfold(bool Value) +{ + if(FIsUnfold != Value) { + FIsUnfold = Value; + + RedrawItem(); + // ֪ͨPanel: ṹ仯 + FOwnerPanel->DoItemChange(this); + } +} +//--------------------------------------------------------------------------- +void __fastcall TProgHandleItem::DoHeaderClick(TObject *Sender) +{ + IsUnfold = !IsUnfold; +} +//--------------------------------------------------------------------------- +void __fastcall TProgHandleItem::DoCheckClick(TObject *Sender) +{ + IsChecked = !IsChecked; +} +//--------------------------------------------------------------------------- +void __fastcall TProgHandleItem::SetSelected(bool Value) +{ + if(FIsSelected != Value) { + FIsSelected = Value; + RedrawItem(); + // ֪ͨPanelѡ仯¼ + } +} +//--------------------------------------------------------------------------- +void __fastcall TProgHandleItem::SetHidden(bool Value) +{ + if(FIsHidden != Value) { + FIsHidden = Value; + + if(mHeaderIconButton) + mHeaderIconButton->Visible = !Value; + + if(mCheckBox) + mCheckBox->Visible = !Value; + } +} +//--------------------------------------------------------------------------- +void __fastcall TProgHandleItem::SetChecked(bool Value) +{ + if(FIsChecked != Value) { + FIsChecked = Value; + RedrawItem(); + } +} +//--------------------------------------------------------------------------- +int __fastcall TProgHandleItem::GetChildCount() +{ + return mChildItem->Count; +} +//--------------------------------------------------------------------------- +void TProgHandleItem::AddChild(TProgHandleItem *Child) +{ + mChildItem->Add(Child); + // ֪ͨPanelItem仯 + FOwnerPanel->DoItemChange(this); +} +//--------------------------------------------------------------------------- +TProgHandleItem *TProgHandleItem::Child(int Index) +{ + if(Index >= 0 && Index < ChildCount) { + return (TProgHandleItem *)mChildItem->Items[Index]; + } + + return NULL; +} + +/**************************************************************************** +* +* TProgHandlePanel +* +*****************************************************************************/ +__fastcall TProgHandlePanel::TProgHandlePanel(TComponent *Owner) : TPanel(Owner) +{ + SetParentComponent(Owner); + + mTopLevelItemList = new TList(); + mItemRectList = new TList(); + mItemList = new TList(); + + mCurrentItem = NULL; + + mEndIndex = 0; + + FItemHeight = 20; + + mScrollBar = new TSkinScrollBar(NULL); + mScrollBar->Visible = false; +} +//--------------------------------------------------------------------------- +__fastcall TProgHandlePanel::~TProgHandlePanel() +{ + if(mTopLevelItemList) { + mTopLevelItemList->Clear(); + delete mTopLevelItemList; + mTopLevelItemList = NULL; + } + + if(mItemRectList) { + mItemRectList->Clear(); + delete mItemRectList; + mItemRectList = NULL; + } + + if(mItemList) { + mItemList->Clear(); + delete mItemList; + mItemList = NULL; + } + + if(mScrollBar) { + delete mScrollBar; + mScrollBar = NULL; + } + + if(mCurrentItem) { + delete mCurrentItem; + mCurrentItem = NULL; + } +} +//--------------------------------------------------------------------------- +void __fastcall TProgHandlePanel::AddTopLevelItem(TProgHandleItem* Item) +{ + mTopLevelItemList->Add(Item); + DoItemChange(NULL); +} +//--------------------------------------------------------------------------- +void __fastcall TProgHandlePanel::ScrollPos(int Pos) +{ + if(Pos >= 0 && Pos <= mItemList->Count - mRealShowCount) { + if(mBeginIndex != Pos) { + // + mBeginIndex = Pos; + mEndIndex = mBeginIndex + mRealShowCount; + Paint(); + } + } +} +//--------------------------------------------------------------------------- +TProgHandleItem *TProgHandlePanel::GetItem(int Index) +{ + if(Index >= 0 && Index < mItemList->Count) { + return (TProgHandleItem *) mItemList->Items[Index]; + } + + return NULL; +} +//--------------------------------------------------------------------------- +TProgHandleItem *TProgHandlePanel::GetTopLevelItem(int Index) +{ + if(Index >= 0 && Index < mTopLevelItemList->Count) { + return (TProgHandleItem *) mTopLevelItemList->Items[Index]; + } + + return NULL; +} +//--------------------------------------------------------------------------- +void __fastcall TProgHandlePanel::RecalcItemsRect() +{ + //ʾ + mShowCount = (Height - 2 * MARGIN) / FItemHeight; + // ¼ʾ + mItemRectList->Clear(); + mItemRectList->Add(new TRect(MARGIN, MARGIN, Width - MARGIN, FItemHeight + MARGIN)); + for(int i = 1; i < mShowCount; i++) { + int itemTop = i * FItemHeight + MARGIN; + int itemBottom = itemTop + FItemHeight; + + mItemRectList->Add(new TRect(MARGIN, itemTop, Width - MARGIN, itemBottom)); + } +} +//--------------------------------------------------------------------------- +void __fastcall TProgHandlePanel::Reset() +{ + mRealShowCount = MIN(mItemList->Count, mShowCount); + mEndIndex = mBeginIndex + mRealShowCount; + + while(mEndIndex > mItemList->Count) { + mBeginIndex--; + mEndIndex--; + } + + int Index = mBeginIndex; + while(Index < mEndIndex) { + TProgHandleItem *Item = (TProgHandleItem *)mItemList->Items[Index]; + if(Item->IsSelected) + break; + Index++; + } + + if(Index == mEndIndex) { + DoSelectedItem(NULL); + } + + if(HandleAllocated()) { + if(mItemList->Count > mShowCount) { + mScrollBar->Visible = true; + mScrollBar->SetRange(0, mItemList->Count - 1); + mScrollBar->SetPageSize(mShowCount); + mScrollBar->SetPosition(mBeginIndex); + FItemWidth = Width - mScrollBar->Width - 20; + } + else { + mScrollBar->Visible = false; + FItemWidth = Width; + } + } +} +//--------------------------------------------------------------------------- +void __fastcall TProgHandlePanel::LoadItem(TProgHandleItem* Item) +{ + if(Item->Parent == NULL) { + Item->IsHidden = false; + } + else { + Item->IsHidden = (Item->Parent->IsHidden || !Item->Parent->IsUnfold); + } + + if(!Item->IsHidden) { + mItemList->Add(Item); + } + + for(int i = 0; i < Item->ChildCount; i++) { + TProgHandleItem *Child = Item->Child(i); + LoadItem(Child); + } +} +//--------------------------------------------------------------------------- +void __fastcall TProgHandlePanel::WMSize(TWMSize &Message) +{ + mScrollBar->Height = Height - 2; + mScrollBar->Top = 1; + mScrollBar->Left = Width - mScrollBar->Width - 1; + + RecalcItemsRect(); +} +//--------------------------------------------------------------------------- +void __fastcall TProgHandlePanel::WMEraseBkgnd(TWMEraseBkgnd &Message) +{ + TCanvas* tmpCanvas = new TCanvas(); + tmpCanvas->Handle = Message.DC; + + tmpCanvas->Brush->Color = BACKGRND; // Ƶɫ + tmpCanvas->FillRect(ClientRect); + + tmpCanvas->Brush->Color = BORDER; // Ʊ߿ + tmpCanvas->FrameRect(ClientRect); + + delete tmpCanvas; +} +//--------------------------------------------------------------------------- +void __fastcall TProgHandlePanel::WMMouseWheel(TWMMouseWheel &Message) +{ + UINT nSBCode; + + if(Message.WheelDelta < 0) { + nSBCode = SB_LINEDOWN; + } + else { + nSBCode = SB_LINEUP; + } + + if(mScrollBar->Visible) + Perform(WM_VSCROLL, MAKELONG(nSBCode, 0), NULL); +} +//--------------------------------------------------------------------------- +void __fastcall TProgHandlePanel::CMMouseLeave(TMessage &Message) +{ + MouseMove(TShiftState(0), -1, -1); +} +//--------------------------------------------------------------------------- +void __fastcall TProgHandlePanel::WMVScroll(TWMScroll &Message) +{ + int minpos, maxpos, page, curpos; + + mScrollBar->GetScrollRange(&minpos, &maxpos); + + page = mScrollBar->GetPageSize(); + curpos = mScrollBar->GetScrollPos(); + + switch(Message.ScrollCode) { + case SB_TOP: + curpos = minpos; + break; + + case SB_BOTTOM: + curpos = maxpos - page + 1; + break; + + case SB_ENDSCROLL: + break; + + case SB_LINEUP: + if(curpos > minpos) { + curpos--; + } + break; + + case SB_LINEDOWN: + if(curpos < maxpos - page + 1) { + curpos++; + } + break; + + case SB_PAGEUP: + if(curpos > minpos) { + curpos = MAX(minpos, curpos - page); + } + break; + + case SB_PAGEDOWN: + if(curpos < maxpos) { + curpos = MIN(maxpos - page + 1, curpos + page); + } + break; + + case SB_THUMBPOSITION: + curpos = Message.Pos; + break; + + case SB_THUMBTRACK: + curpos = Message.Pos; + break; + } + + if(Message.ScrollBar != mScrollBar->Handle) { + mScrollBar->SetPosition(curpos); + } + + ScrollPos(curpos); +} +//--------------------------------------------------------------------------- +void __fastcall TProgHandlePanel::AfterConstruction() +{ +} +//--------------------------------------------------------------------------- +void __fastcall TProgHandlePanel::CreateWnd() +{ + TPanel::CreateWnd(); + + mScrollBar->Parent = this; + mScrollBar->m_pWndCtrl = this; + + FItemWidth = Width; + + Reset(); + + RecalcItemsRect(); +} +//--------------------------------------------------------------------------- +void __fastcall TProgHandlePanel::Paint() +{ + Canvas->Lock(); + for(int Index = 0; Index < this->mItemList->Count; Index++) { + TProgHandleItem *item = GetItem(Index); + + if(Index >= mBeginIndex && Index < mEndIndex) { + item->IsHidden = false; + + TRect *Rect = (TRect *) mItemRectList->Items[Index - mBeginIndex]; + item->DrawItem(Canvas, *Rect); + } + else { + item->IsHidden = true; + } + } + Canvas->Unlock(); +} +//--------------------------------------------------------------------------- +void __fastcall TProgHandlePanel::MouseDown(TMouseButton Button, TShiftState Shift, int X, int Y) +{ + TPanel::MouseDown(Button, Shift, X, Y); + for(int Index = mBeginIndex; Index < mEndIndex; Index++) { + TProgHandleItem *item = GetItem(Index); + item->MouseDown(Button, Shift, X, Y); + } +} +//--------------------------------------------------------------------------- +void __fastcall TProgHandlePanel::MouseMove(TShiftState Shift, int X, int Y) +{ + TPanel::MouseMove(Shift, X, Y); + for(int Index = mBeginIndex; Index < mEndIndex; Index++) { + TProgHandleItem *item = GetItem(Index); + item->MouseMove(Shift, X, Y); + } +} +//--------------------------------------------------------------------------- +void __fastcall TProgHandlePanel::MouseUp(TMouseButton Button, TShiftState Shift, int X, int Y) +{ + TPanel::MouseUp(Button, Shift, X, Y); +} +//--------------------------------------------------------------------------- +void __fastcall TProgHandlePanel::DoItemChange(TObject *Sender) +{ + mItemList->Clear(); + for(int i = 0; i < mTopLevelItemList->Count; i++) { + TProgHandleItem *Item = GetTopLevelItem(i); + LoadItem(Item); + } + + if(HandleAllocated()) { + Reset(); + Repaint(); + } +} +//--------------------------------------------------------------------------- +void __fastcall TProgHandlePanel::DoSelectedItem(TObject *Sender) +{ + TProgHandleItem *Item = (TProgHandleItem *)Sender; + + if(mCurrentItem != Sender) { + if(mCurrentItem) + mCurrentItem->IsSelected = false; + + mCurrentItem = Item; + } + + if(FOnSelectedItem) { + FOnSelectedItem(Sender); + } +} +//--------------------------------------------------------------------------- +void __fastcall TProgHandlePanel::DoCurrentItem(TObject *Sender) +{ +} +//--------------------------------------------------------------------------- +int __fastcall TProgHandlePanel::GetTopLevelItemCount() +{ + return mTopLevelItemList->Count; +} +//--------------------------------------------------------------------------- +void __fastcall TProgHandlePanel::SetTextFont(String name, int size) +{ + Canvas->Font->Name = name; + Canvas->Font->Size = size; +} +//--------------------------------------------------------------------------- + diff --git a/ProgHandlePanel.h b/ProgHandlePanel.h new file mode 100644 index 0000000..b86d528 --- /dev/null +++ b/ProgHandlePanel.h @@ -0,0 +1,165 @@ +//--------------------------------------------------------------------------- + +#ifndef ProgHandlePanelH +#define ProgHandlePanelH + +#include +#include "SkinScrollBarUnit.h" +#include "PNGButton.hpp" +/*--------------------------------------------------------------------------- + TProgHandleItem +---------------------------------------------------------------------------*/ +class TProgHandleItem; +class TProgHandlePanel; +/*--------------------------------------------------------------------------- + TProgHandleItem +---------------------------------------------------------------------------*/ +class TProgHandleItem : public TObject +{ +private: + /***********************************************************************/ + TProgHandleItem *FParent; + TProgHandlePanel *FOwnerPanel; + String FCaption; + bool FIsUnfold; + bool FIsSelected; + bool FIsFocus; + bool FIsHidden; + bool FIsChecked; + /***********************************************************************/ + + /***********************************************************************/ + int mLevel; + TRect mRect; + TRect mValidRect; + TRect mIconRect; + TRect mCaptionRect; + TList *mChildItem; + TCanvas *mCanvas; + TPNGButton *mHeaderIconButton; + TPNGButton *mCheckBox; + /***********************************************************************/ + + void __fastcall DoHeaderClick(TObject *Sender); + void __fastcall DoCheckClick(TObject *Sender); + + void __fastcall SetCaption(String Value); + void __fastcall SetUnfold(bool Value); + void __fastcall SetSelected(bool Value); + void __fastcall SetHidden(bool Value); + void __fastcall SetChecked(bool Value); + + int __fastcall GetChildCount(); + +protected: + void __fastcall AfterConstruction(); + +public: + void *Data; + __fastcall TProgHandleItem(TProgHandlePanel *OwnerPanel, String Caption); + __fastcall TProgHandleItem(TProgHandleItem *Parent, String Caption); + __fastcall ~TProgHandleItem(); + + /***********************************************************************/ + void __fastcall DrawItem(TCanvas *Canvas, TRect Rect); + void __fastcall RedrawItem(); + void __fastcall MouseDown(TMouseButton Button, TShiftState Shift, int X, int Y); + void __fastcall MouseMove(TShiftState Shift, int X, int Y); + void __fastcall MouseUp(TMouseButton Button, TShiftState Shift, int X, int Y); + /***********************************************************************/ + + /***********************************************************************/ + TProgHandlePanel *GetOwnerPanel(); + void AddChild(TProgHandleItem *Child); + TProgHandleItem *Child(int Index); + /***********************************************************************/ + +__published: + __property TProgHandleItem *Parent = {read = FParent}; + __property String Caption = {read = FCaption, write = SetCaption}; + __property int ChildCount = {read = GetChildCount}; + __property bool IsUnfold = {read = FIsUnfold, write = SetUnfold}; + __property bool IsSelected = {read = FIsSelected, write = SetSelected}; + __property bool IsHidden = {read = FIsHidden, write = SetHidden}; + __property bool IsChecked = {read = FIsChecked, write = SetChecked}; +}; +/*--------------------------------------------------------------------------- + TProgHandlePanel +---------------------------------------------------------------------------*/ +class TProgHandlePanel : public TPanel +{ +private: + /***********************************************************************/ + int FItemWidth; + int FItemHeight; + TNotifyEvent FOnSelectedItem; + /***********************************************************************/ + + /***********************************************************************/ + TList *mTopLevelItemList; + TList *mItemRectList; + TList *mItemList; + int mBeginIndex; + int mEndIndex; + int mCurrentItemIndex; + int mShowCount; + int mRealShowCount; + TSkinScrollBar *mScrollBar; + + TProgHandleItem *mCurrentItem; + /***********************************************************************/ + + /***********************************************************************/ + void __fastcall RecalcItemsRect(); + void __fastcall Reset(); + void __fastcall LoadItem(TProgHandleItem* Item); + TProgHandleItem *GetItem(int Index); + int __fastcall GetTopLevelItemCount(); + /***********************************************************************/ + + /***********************************************************************/ + MESSAGE void __fastcall WMSize(TWMSize &Message); + MESSAGE void __fastcall WMEraseBkgnd(TWMEraseBkgnd &Message); + MESSAGE void __fastcall WMMouseWheel(TWMMouseWheel &Message); + MESSAGE void __fastcall CMMouseLeave(TMessage &Message); + MESSAGE void __fastcall WMVScroll(TWMScroll &Message); + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(WM_SIZE, TWMSize, WMSize) + MESSAGE_HANDLER(WM_ERASEBKGND, TWMEraseBkgnd, WMEraseBkgnd) + MESSAGE_HANDLER(WM_MOUSEWHEEL, TWMMouseWheel, WMMouseWheel) + MESSAGE_HANDLER(CM_MOUSELEAVE, TMessage, CMMouseLeave) + MESSAGE_HANDLER(WM_VSCROLL, TWMScroll, WMVScroll) + END_MESSAGE_MAP(TPanel) + /***********************************************************************/ + +protected: + void __fastcall AfterConstruction(); + + virtual void __fastcall CreateWnd(); + virtual void __fastcall Paint(); + + DYNAMIC void __fastcall MouseDown(TMouseButton Button, TShiftState Shift, int X, int Y); + DYNAMIC void __fastcall MouseMove(TShiftState Shift, int X, int Y); + DYNAMIC void __fastcall MouseUp(TMouseButton Button, TShiftState Shift, int X, int Y); + +public: + __fastcall TProgHandlePanel(TComponent *Owner); + __fastcall ~TProgHandlePanel(); + + void __fastcall DoItemChange(TObject *Sender); + void __fastcall DoSelectedItem(TObject *Sender); + void __fastcall DoCurrentItem(TObject *Sender); + + void __fastcall AddTopLevelItem(TProgHandleItem* Item); + void __fastcall ScrollPos(int Pos); + void __fastcall SetTextFont(String name, int size); + + TProgHandleItem *GetTopLevelItem(int Index); + +__published: + __property TNotifyEvent OnSelectedItem = {read = FOnSelectedItem, write = FOnSelectedItem}; + __property int TopLevelItemCount = {read = GetTopLevelItemCount}; +}; +//--------------------------------------------------------------------------- +#endif diff --git a/ProgressFormUnit.cpp b/ProgressFormUnit.cpp new file mode 100644 index 0000000..0b40bef --- /dev/null +++ b/ProgressFormUnit.cpp @@ -0,0 +1,843 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop + +#include "GlobalUnit.h" +#include "ProgressThreadUnit.h"; +#include "ProgressFormUnit.h" +#include "Project.h" +#include "MidiTrack.h" + +#define OPERATION_MM_SAVE 1 +#define OPERATION_MM_LOAD 2 +#define OPERATION_PROJ_LOAD 3 +#define OPERATION_PROJ_SAVE 4 +#define OPERATION_USER_LOGIN 5 +#define OPERATION_USER_CHECKPAYMENT 6 +#define OPERATION_USER_CONFIRMPAYMENT 7 +#define OPERATION_USER_SUBMITQA 8 +#define OPERATION_USER_REGISTER 9 +#define OPERATION_USER_UPLOADSONG 10 +#define OPERATION_USER_SUBMITSCORE 11 +#define OPERATION_USER_UPLOADSTYLE 12 +#define OPERATION_MM_FXAPPLY 13 +#define OPERATION_MM_SAVEMEDIA 14 + +#define STATE_IDLE 0x00 +#define STATE_SAVING 0x01 +#define STATE_SAVE_SUCCESS 0x02 +#define STATE_SAVE_FAILED 0x04 +#define STATE_CONFIRMING 0x10 +#define STATE_CONFIRM_SUCCESS 0x20 +#define STATE_CONFIRM_FAILED 0x40 + +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma link "PNGButton" +#pragma link "GeneralDialogPanel" +#pragma resource "*.dfm" +TProgressForm *ProgressForm; + +//--------------------------------------------------------------------------- +__fastcall TProgressForm::TProgressForm(TComponent* Owner) + : TForm(Owner) +{ + SetTransparent( this ); + + m_nMaxPos = m_pbProgress->Width; + m_nPos = 0; + + m_nParam1 = m_nParam2 = m_nParam3 = m_nParam4 = 0; + m_dblParam1 = m_dblParam2 = 0; + m_pParam1 = m_pParam2 = NULL; + m_pIntParam1 = m_pIntParam2 = NULL; + memset( m_strParam1, 0, sizeof(m_strParam1) ); + memset( m_strBuff, 0, sizeof(m_strBuff) ); + + m_bmpTileLeft = new TBitmap(); + m_bmpTileLeft->LoadFromResourceName(int(HInstance), L"imgProgressLeft"); + m_bmpTileRight = new TBitmap(); + m_bmpTileRight->LoadFromResourceName(int(HInstance), L"imgProgressRight"); + + m_nTileWidth = m_bmpTileLeft->Width; + m_nTileHeight = m_bmpTileLeft->Height; + + m_nNextMinPos = 0; + m_nNextMaxPos = m_nMaxPos; + m_iOperation = m_iOperationResult = 0; + + m_pConfirmThread = NULL; + m_iSaveState = STATE_IDLE; + m_iConfirmResult = m_iFileHandle = 0; + + m_pTimer = new TTimer(this); + m_pTimer->Enabled = false; + m_pTimer->Interval = 200; + m_pTimer->OnTimer = TimerProc; + + m_pThread = new TProgressThread( true, this ); +} +//--------------------------------------------------------------------------- + +__fastcall TProgressForm::~TProgressForm() +{ + if( m_pThread ) + delete m_pThread; + + if( m_pConfirmThread ) + delete m_pConfirmThread; + + if( m_bmpTileLeft ) + delete m_bmpTileLeft; + + if( m_bmpTileRight ) + delete m_bmpTileRight; + + if( m_pTimer ){ + delete m_pTimer; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TProgressForm::ProgressPaint(TObject *Sender) +{ + int x = 0; + //ƽ + if( m_nPos>0 ){ + for( int i=0; iCanvas->Draw( x+m_nTileWidth*i, 0, m_bmpTileLeft ); + } + x += m_nTileWidth; + } + + //Ҳƽ + x = m_nPos; + if( m_nPosCanvas->Draw( x+m_nTileWidth*i, 0, m_bmpTileRight ); + } + x += m_nTileWidth; + } + + // ߿ + m_pbProgress->Canvas->Pen->Color = TColor(0x83807D); + m_pbProgress->Canvas->MoveTo(0, 1); + m_pbProgress->Canvas->LineTo(0, 19); + + // ڱ߿ + m_pbProgress->Canvas->Pen->Color = TColor(0x1B1816); + m_pbProgress->Canvas->MoveTo(1, 1); + m_pbProgress->Canvas->LineTo(1, 19); + + // ڱ߿ + m_pbProgress->Canvas->Pen->Color = TColor(0x1B1816); + m_pbProgress->Canvas->MoveTo(m_pbProgress->Width - 2, 1); + m_pbProgress->Canvas->LineTo(m_pbProgress->Width - 2, 19); + + // ߿ + m_pbProgress->Canvas->Pen->Color = TColor(0x83807D); + m_pbProgress->Canvas->MoveTo(m_pbProgress->Width - 1, 1); + m_pbProgress->Canvas->LineTo(m_pbProgress->Width - 1, 19); +} +//--------------------------------------------------------------------------- + +void __fastcall TProgressForm::UMOperateFailed(TMessage &Message) +{ + m_pThread->WaitFor();// >Terminate(); + m_iOperationResult = Message.WParam; + + if( m_iOperation==OPERATION_MM_SAVEMEDIA ){ + m_iSaveState &= ~STATE_SAVING; + m_iSaveState |= STATE_SAVE_FAILED; + } + + Canceled(); +// ModalResult = mrCancel; +} +//--------------------------------------------------------------------------- + +void __fastcall TProgressForm::UMOperatePercent(TMessage &Message) +{ + TRect rcRedraw( m_nPos, 0, m_nMaxPos, m_nTileHeight ); + + m_nPos = m_nNextMinPos + Message.WParam * (m_nNextMaxPos - m_nNextMinPos) / 100; + rcRedraw.right = m_nPos; + + InvalidateRect( m_panelProgress->Handle, &rcRedraw, false ); + +/* if( m_iOperation==OPERATION_MM_SAVEMEDIA ){ + if( m_iSaveState95 ){ + StartConfirm(); + } + } +*/ +} +//--------------------------------------------------------------------------- + +void __fastcall TProgressForm::UMOperateComplete(TMessage &Message) +{ + m_pThread->WaitFor();// >Terminate(); + m_iOperationResult = Message.WParam; + + if( m_iOperation==OPERATION_MM_SAVEMEDIA ){ + m_iSaveState &= ~STATE_SAVING; + m_iSaveState |= STATE_SAVE_SUCCESS; + + if( m_iSaveState & STATE_CONFIRM_SUCCESS ){ + ModalResult = mrOk; + } + else{ + if( m_iFileHandle==0 && FileExists(m_strParam1) ){ + m_iFileHandle = FileOpen( m_strParam1, fmOpenRead|fmShareExclusive ); + } + + if( m_iSaveStateWaitFor(); +// m_pThread->Terminate(); + + ModalResult = mrOk; +} +//--------------------------------------------------------------------------- + +void __fastcall TProgressForm::UMPaymentConfirmed(TMessage &Message) +{ + m_pTimer->Enabled = false; + m_pConfirmThread->WaitFor(); +// m_pConfirmThread->Terminate(); + + m_iSaveState &= ~STATE_CONFIRMING; + + if( m_iConfirmResult==0 ){ + m_iSaveState |= STATE_CONFIRM_SUCCESS; + + if( m_iSaveState & STATE_SAVE_SUCCESS ){ + if( m_iFileHandle>0 ){ + FileClose( m_iFileHandle ); + m_iFileHandle = 0; + } + + ModalResult = mrOk; + } + else if( m_iSaveState & STATE_SAVE_FAILED ) + Canceled(); + + DebugPrint( "Payment confirmed.\n" ); + } + else{ + m_iSaveState |= STATE_CONFIRM_FAILED; + m_iOperationResult = m_iConfirmResult; + + //ModalResult = mrCancel; + Canceled(); + } +} +//--------------------------------------------------------------------------- + +void TProgressForm::StartConfirm() +{ + if( m_iSaveStateInterval = 60000; //1 + m_pTimer->Enabled = true; + + m_pConfirmThread = new TProgressThread( true, this ); + m_pConfirmThread->Start(); + + DebugPrint( "Start confirm thread.\n" ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TProgressForm::FormCreate(TObject *Sender) +{ + m_DialogPanel->Font->Size = g_szFont9; + + // TForm λþ + TPoint mfPoint = Application->MainForm->ClientToScreen(TPoint(0, 0)); + + int mfHeight = Application->MainForm->Height; + int mfWidth = Application->MainForm->Width; + + Top = (mfHeight - Height) / 2 + mfPoint.Y; + Left = (mfWidth - Width) / 2 + mfPoint.X; + + // Բ + HRGN hRgn = CreateRoundRectRgn( 0, 0, m_panelProgress->Width+1, + m_panelProgress->Height+1, 3, 3 ); + SetWindowRgn( m_panelProgress->Handle, hRgn, false ); + DeleteObject( hRgn ); +} +//--------------------------------------------------------------------------- + +int __fastcall TProgressForm::MM_SaveMedia( int iSaveType, int iFileType, LPCTSTR strFileName, + int iOp, int nIdCount, UINT aIdStyle[] ) +{ + wcscpy( m_strParam1, strFileName ); + if( iSaveType==0 ){ + iSaveType = SAVE_COMPOSE | SAVE_AUDIO; + m_DialogPanel->Caption = L"ɸ"; + } + else{ + m_DialogPanel->Caption = L"ڱ"; + } + + m_nParam1 = iFileType; + m_nParam2 = iSaveType; + m_nParam3 = nIdCount; + m_nParam4 = iOp; + m_pParam1 = aIdStyle; + + m_iOperation = OPERATION_MM_SAVEMEDIA; + m_pThread->Start(); + + return ShowModal(); +} +//--------------------------------------------------------------------------- + +int __fastcall TProgressForm::MM_Load( LPCTSTR strFileName, int iFileType ) +{ + wcscpy( m_strParam1, strFileName ); + m_iOperation = OPERATION_MM_LOAD; + m_nParam1 = iFileType; + + m_DialogPanel->Caption = L"ڴ"; + + m_pThread->Start(); + + return ShowModal(); +} +//--------------------------------------------------------------------------- + +int __fastcall TProgressForm::MM_AudioFxApply( double dblBegin, double dblEnd ) +{ + m_dblParam1 = dblBegin; + m_dblParam2 = dblEnd; + m_iOperation = OPERATION_MM_FXAPPLY; + m_DialogPanel->Caption = L"ڴ"; + + m_pThread->Start(); + + return ShowModal(); +} + +int __fastcall TProgressForm::Project_Save( LPCTSTR strFileName ) +{ + wcscpy( m_strParam1, strFileName ); + m_iOperation = OPERATION_PROJ_SAVE; + m_DialogPanel->Caption = L"ڱ"; + m_pThread->Start(); + + return ShowModal(); +} +//--------------------------------------------------------------------------- + +int __fastcall TProgressForm::Project_Load( LPCTSTR strFileName ) +{ + wcscpy( m_strParam1, strFileName ); + m_iOperation = OPERATION_PROJ_LOAD; + m_DialogPanel->Caption = L"ڴ"; + m_pThread->Start(); + + return ShowModal(); +} +//--------------------------------------------------------------------------- + +int __fastcall TProgressForm::User_Login() +{ + m_iOperation = OPERATION_USER_LOGIN; + m_DialogPanel->Caption = L"ڵ¼"; + m_pTimer->Enabled = true; + m_pThread->Start(); + + return ShowModal(); +} +//--------------------------------------------------------------------------- + +int __fastcall TProgressForm::User_Register( int isEmailOrMobile ) +{ + m_nParam1 = isEmailOrMobile; + m_iOperation = OPERATION_USER_REGISTER; + m_DialogPanel->Caption = L"ע"; + m_pTimer->Enabled = true; + m_pThread->Start(); + + return ShowModal(); +} +//--------------------------------------------------------------------------- + +int __fastcall TProgressForm::User_CheckPayment( int iOperation, int nIdCount, + UINT aIdStyle[], int aStyleCost[], + int* pCost , int* pBalance ) +{ + m_nParam1 = nIdCount; + m_pParam1 = aIdStyle; + m_pParam2 = aStyleCost; + m_pIntParam2 = pCost; + m_pIntParam1 = pBalance; + m_nParam2 = iOperation; + m_iOperation = OPERATION_USER_CHECKPAYMENT; + m_DialogPanel->Caption = L"ڼȨ"; + m_pTimer->Enabled = true; + m_pThread->Start(); + + return ShowModal(); +} +//--------------------------------------------------------------------------- + +int __fastcall TProgressForm::User_ConfirmPayment( int iOperation, int nIdCount, + UINT aIdStyle[], int* pBalance ) +{ + m_nParam1 = nIdCount; + m_pParam1 = aIdStyle; + m_pIntParam1 = pBalance; + m_nParam2 = iOperation; + m_iOperation = OPERATION_USER_CONFIRMPAYMENT; + m_DialogPanel->Caption = L"֧"; + m_pTimer->Enabled = true; + m_pThread->Start(); + + return ShowModal(); +} +//--------------------------------------------------------------------------- + +int __fastcall TProgressForm::User_SubmitQuestin( LPCSTR strQuestion ) +{ + //wcscpy( m_strParam, strQuestion ); + strcpy( m_strBuff, strQuestion ); + m_iOperation = OPERATION_USER_SUBMITQA; + m_DialogPanel->Caption = L"ύ"; + m_pTimer->Enabled = true; + m_pThread->Start(); + + return ShowModal(); +} +//--------------------------------------------------------------------------- + +int __fastcall TProgressForm::User_StyleScore( UINT idStyle, int iType, int* pScrUser, int* pScrAverage ) +{ + //add laq + m_iOperation = OPERATION_USER_SUBMITSCORE; + + if( *pScrUser<0 ) + m_DialogPanel->Caption = L"ڻȡ"; + else + m_DialogPanel->Caption = L"ύ"; + + m_nParam1 = idStyle; + m_nParam2 = iType; + m_pIntParam1 = pScrUser; + m_pIntParam2 = pScrAverage; + + m_pTimer->Enabled = true; + m_pThread->Start(); + + return ShowModal(); +} +//--------------------------------------------------------------------------- +int __fastcall TProgressForm::User_UploadSong( LPCTSTR strFileName, TSHAREINFO* pShareInfo ) +{ + m_iOperation = OPERATION_USER_UPLOADSONG; + + if( pShareInfo ){ + wcscpy( m_strParam1, strFileName ); + m_DialogPanel->Caption = L"ϴ"; + m_pParam1 = (void*)pShareInfo; + } + else{ + m_DialogPanel->Caption = L"֤ϴ"; + m_pTimer->Enabled = true; + } + + m_pThread->Start(); + + return ShowModal(); +} +//--------------------------------------------------------------------------- + +int __fastcall TProgressForm::User_StyleUpload( int iType, int nDataSize, char* pData ) +{ + m_iOperation = OPERATION_USER_UPLOADSTYLE; + + m_DialogPanel->Caption = L"ϴ"; + m_pParam1 = (void*)pData; + m_nParam1 = nDataSize; + m_nParam2 = iType; + + m_pThread->Start(); + + return ShowModal(); +} +//--------------------------------------------------------------------------- + +void __fastcall TProgressForm::Operation() +{ + switch( m_iOperation ){ + case OPERATION_MM_SAVEMEDIA: + if( m_iSaveState==STATE_IDLE ){ + m_iSaveState = STATE_SAVING; + + if( m_nParam1==FILETYPE_MIDI ){ + if( m_nParam2 & SAVE_COMPOSE ){ + BYTE *pData = new BYTE[2000000]; + int nSize = 2000000, ret = 0, + iTrack = m_nParam2 & 0xFF; + + if( iTrack==0 ) + ret = GetComposeData( g_lstOpusStages, g_iMelodyKey, nSize, pData, true ); + else + ret = GetMidiTrackData( nSize, pData, iTrack-1, -1, -1, NULL, NULL ); + + if( ret==0 ){ + f_MM_SaveMidi( NULL, pData, nSize, -1, ((AnsiString)m_strParam1).c_str(), m_nParam1 ); + PostMessage( Handle, MSG_OPERATE_COMPLETE, 0, 0 ); + } + else { + DebugPrint("Compose error.\n"); + PostMessage( Handle, MSG_OPERATE_FAILED, -1, 0 ); + } + + delete[] pData; + } + else{ //FILETYPE_TRANSMID = 0 + f_MM_Save( Handle, m_nParam2, ((AnsiString)m_strParam1).c_str(), g_iMelodyKey << 8 ); + } + } + else{ + int iTrack = m_nParam2 & 0xFF; + + if( (m_nParam2 & SAVE_COMPOSE) && iTrack>0 ){ + BYTE *pData = new BYTE[2000000]; + int nSize = 2000000, ret = 0; + + ret = GetMidiTrackData( nSize, pData, iTrack-1, -1, -1, NULL, NULL ); + if( ret==0 ){ + int iBank = g_aMidiTracks[iTrack-1]->bank; + f_MM_SaveMidi( Handle, pData, nSize, iBank, ((AnsiString)m_strParam1).c_str(), m_nParam1 ); + } + else { + DebugPrint("Get midi data error.\n"); + PostMessage( Handle, MSG_OPERATE_FAILED, -1, 0 ); + } + + delete[] pData; + } + else{ + bool bMuted = false; + + if( iTrack==0 ) + SetTrackParams( false ); + else if( IsTrackMute(ST_AUDIO, iTrack-1) ){ + bMuted = true; + f_MM_SetAudioTrackParam( iTrack-1, 0, + (float)(g_aAudioTracks[iTrack-1]->volume / 100.0) ); + } + + f_MM_Save( Handle, m_nParam2, ((AnsiString)m_strParam1).c_str(), m_nParam1 ); + + if( iTrack==0 ) + SetTrackParams( true ); + else if( bMuted ){ + f_MM_SetAudioTrackParam( iTrack-1, 0, 0 ); + } + } + } + } + else if( m_iSaveState & STATE_CONFIRMING ){ + int nBalance; + m_iConfirmResult = f_CS_ConfirmPayment( g_infoUser.accountInfo.ID, m_nParam4, + m_nParam3, (UINT*)m_pParam1, &nBalance ); + + if( SOFTWARE_ID!=e_Pro_Lite && ( m_iConfirmResult==e_VerifyInsufficient + || m_iConfirmResult==0 )) + g_infoUser.accountInfo.balance = nBalance; + + PostMessage( Handle, MSG_PAYMENTCONFIRMED, -1, 0 ); + } + break; + + case OPERATION_MM_LOAD: + if( m_nParam1==FILETYPE_MIDI ){ + m_iOperationResult = f_MM_LoadMidiMelody( Handle, ((AnsiString)m_strParam1).c_str() ); + } + else{ + m_iOperationResult = f_MM_LoadAudio(Handle, ((AnsiString)m_strParam1).c_str(), + m_nParam1 - 1, g_iMelodyTimeSignature, g_nMelodyTempo); + } + + if( m_iOperationResult!=S_OK ){ + PostMessage( Handle, MSG_OPERATE_FAILED, m_iOperationResult, 0 ); + } + else + PostMessage( Handle, MSG_OPERATE_COMPLETE, 0, 0 ); + + break; + + case OPERATION_MM_FXAPPLY: + m_iOperationResult = f_MM_AudioFxProcess( g_iSelAudio, m_dblParam1, m_dblParam2, Handle ); + + if( m_iOperationResult!=S_OK ) + PostMessage( Handle, MSG_OPERATE_FAILED, m_iOperationResult, 0 ); + else + PostMessage( Handle, MSG_OPERATE_COMPLETE, 0, 0 ); + + break; + + case OPERATION_PROJ_SAVE: + if( SaveProject( ((AnsiString)m_strParam1).c_str(), PROJ_MODE_NORMAL, Handle )==TRUE ){ + } + else{ + } + + break; + + case OPERATION_PROJ_LOAD: + if( LoadProject( ((AnsiString)m_strParam1).c_str(), Handle )==TRUE ){ + } + else{ + } + break; + + case OPERATION_USER_LOGIN: + m_iOperationResult = f_CS_Login( &g_infoUser, true ); + PostMessage( Handle, MSG_OPERATE_COMPLETE, m_iOperationResult, 0 ); + break; + + case OPERATION_USER_REGISTER: + m_iOperationResult = f_CS_Register( &g_infoUser, m_nParam1 ); + if( m_iOperationResult==0 ){ + PostMessage( Application->MainForm->Handle, MSG_NETWORKMESSAGE, + MAKELONG( 0, e_loginResponse ), (LPARAM)&g_infoUser ); + } + + PostMessage( Handle, MSG_OPERATE_COMPLETE, m_iOperationResult, 0 ); + break; + + case OPERATION_USER_CHECKPAYMENT: + m_iOperationResult = f_CS_CheckPayment( g_infoUser.accountInfo.ID, m_nParam2, + m_nParam1, (UINT*)m_pParam1, (int*)m_pParam2, + m_pIntParam2, m_pIntParam1 ); + PostMessage( Handle, MSG_OPERATE_COMPLETE, m_iOperationResult, 0 ); + break; + + case OPERATION_USER_CONFIRMPAYMENT: + m_iOperationResult = f_CS_ConfirmPayment( g_infoUser.accountInfo.ID, m_nParam2, + m_nParam1, (UINT*)m_pParam1, m_pIntParam1 ); + PostMessage( Handle, MSG_OPERATE_COMPLETE, m_iOperationResult, 0 ); + break; + + case OPERATION_USER_SUBMITQA: + + m_iOperationResult = f_CS_SubmitQnA( g_infoUser.accountInfo.ID, m_strBuff ); + PostMessage( Handle, MSG_OPERATE_COMPLETE, m_iOperationResult, 0 ); + break; + + case OPERATION_USER_SUBMITSCORE: + m_iOperationResult = f_CS_StyleScore( g_infoUser.accountInfo.ID, + m_nParam1, m_nParam2, + m_pIntParam1, m_pIntParam2 ); + PostMessage( Handle, MSG_OPERATE_COMPLETE, m_iOperationResult, 0 ); + break; + + case OPERATION_USER_UPLOADSONG: + { + TSONGINFO infoSong; + if( m_pParam1 ){ + +// memcpy( &infoSong, &g_infoSong, sizeof(TSONGINFO) ); + + string strTmp = GBToUTF8(g_infoSong.strSongName); + strcpy( infoSong.strSongName, strTmp.c_str() ); + + strTmp = GBToUTF8(g_infoSong.strSinger); + strcpy( infoSong.strSinger, strTmp.c_str() ); + + strTmp = GBToUTF8(g_infoSong.strOriginal); + strcpy( infoSong.strOriginal, strTmp.c_str() ); + + strTmp = GBToUTF8(g_infoSong.strArranger); + strcpy( infoSong.strArranger, strTmp.c_str() ); + + strTmp = GBToUTF8(g_infoSong.strLyricist); + strcpy( infoSong.strLyricist, strTmp.c_str() ); + + strTmp = GBToUTF8(g_infoSong.strComposer); + strcpy( infoSong.strComposer, strTmp.c_str() ); + + strTmp = GBToUTF8(g_infoSong.strDescription); + strcpy( infoSong.strDescription, strTmp.c_str() ); + + memcpy( infoSong.iMusicStyle, g_infoSong.iMusicStyle, sizeof(char)*4 ); + memcpy( infoSong.aStyleIDs, g_infoSong.aStyleIDs, sizeof(UINT)*32 ); + infoSong.iCreation = g_infoSong.iCreation; + infoSong.iSubmit = g_infoSong.iSubmit; + infoSong.size = g_infoSong.size; + infoSong.iTempo = g_infoSong.iTempo; + infoSong.iTS = g_infoSong.iTS; + infoSong.iSingerType = g_infoSong.iSingerType; + infoSong.cpjPrice = g_infoSong.cpjPrice; + infoSong.cpjVersion = g_infoSong.cpjVersion; + + int lenght; + if( g_infoSong.strIconName ){ + lenght = strlen(g_infoSong.strIconName); + infoSong.strIconName = new char[lenght+1]; + strcpy( infoSong.strIconName, g_infoSong.strIconName ); + infoSong.strIconName[lenght] = '\0'; + } + + if( g_infoSong.strLyric ){ + strTmp = GBToUTF8(g_infoSong.strLyric); + lenght = strlen(strTmp.c_str()); + infoSong.strLyric = new char[lenght+1]; + strcpy( infoSong.strLyric, strTmp.c_str() ); + infoSong.strLyric[lenght] = '\0'; + } + + if( g_infoSong.strCpjName ){ + lenght = strlen(g_infoSong.strCpjName); + infoSong.strCpjName = new char[lenght+1]; + strcpy( infoSong.strCpjName, g_infoSong.strCpjName ); + infoSong.strCpjName[lenght] = '\0'; + } + + infoSong.strMp3Name = new char[((AnsiString)m_strParam1).Length()+1]; + strcpy( infoSong.strMp3Name, ((AnsiString)m_strParam1).c_str() ); + } + + m_iOperationResult = f_CS_UploadSong( g_infoUser.accountInfo.ID, + m_pParam1 ? &infoSong : NULL, + Handle, + (TSHAREINFO*)m_pParam1 ); + PostMessage( Handle, MSG_OPERATE_COMPLETE, m_iOperationResult, 0 ); + + +// SAFE_DELETE(infoSong.strIconName) +// SAFE_DELETE(infoSong.strLyric) +// SAFE_DELETE(infoSong.strMp3Name) + + break; + } + case OPERATION_USER_UPLOADSTYLE: + m_iOperationResult = f_CS_UploadStyle( m_nParam2, g_infoUser.accountInfo.ID, + m_nParam1, (char*)m_pParam1, Handle ); + PostMessage( Handle, MSG_OPERATE_COMPLETE, m_iOperationResult, 0 ); + break; + + default: + PostMessage( Handle, MSG_OPERATE_FAILED, -1, 0 ); + break; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TProgressForm::OnCanceled(TObject *Sender) +{ + if( m_iOperation>0 ){ + m_iOperationResult = e_UserCanceled; + Canceled(); + } +} +//--------------------------------------------------------------------------- + +void TProgressForm::Canceled() +{ + DebugPrint( "Canceled.\n" ); + + if( m_iOperation==OPERATION_MM_SAVEMEDIA ){ + if( m_iSaveState & STATE_SAVING ){ + f_MM_UserCanceled(); + m_pThread->WaitFor(); + } + if( m_iSaveState & STATE_CONFIRMING ){ + m_pTimer->Enabled = false; + f_CS_CancelOperation(); + m_pConfirmThread->WaitFor(); + } + + if( m_iFileHandle>0 ){ + FileClose( m_iFileHandle ); + m_iFileHandle = 0; + } + + if( FileExists( m_strParam1 ) ) + DeleteFile( m_strParam1 ); + } + else{ + if( m_iOperation==OPERATION_MM_LOAD || m_iOperation==OPERATION_MM_SAVE ){ + f_MM_UserCanceled(); + } + else if( m_iOperation==OPERATION_USER_LOGIN + || m_iOperation==OPERATION_USER_REGISTER + || m_iOperation==OPERATION_USER_CHECKPAYMENT + || m_iOperation==OPERATION_USER_CONFIRMPAYMENT + || m_iOperation==OPERATION_USER_SUBMITQA + || m_iOperation==OPERATION_USER_UPLOADSONG ){ + m_pTimer->Enabled = false; + f_CS_CancelOperation(); + } + + m_pThread->WaitFor(); + } + + m_iOperation = 0; + ModalResult = mrCancel; + DebugPrint( "exit progress.\n" ); +} +//--------------------------------------------------------------------------- + +void __fastcall TProgressForm::TimerProc(TObject* Sender) +{ + if( m_pTimer->Interval==200 ){ + m_nPos += 20; + + if( m_nPos>=m_nMaxPos ){ + m_nPos -= m_nMaxPos; + } + + m_pbProgress->Invalidate(); + } + else{ + m_iOperationResult = e_WaitTimeout; + Canceled(); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TProgressForm::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) +{ + switch( Key ){ + case VK_ESCAPE: + Canceled(); + break; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TProgressForm::FormClose(TObject *Sender, TCloseAction &Action) +{ + if( m_iFileHandle>0 ){ + FileClose( m_iFileHandle ); + m_iFileHandle = 0; + } +} +//--------------------------------------------------------------------------- + diff --git a/ProgressFormUnit.dfm b/ProgressFormUnit.dfm new file mode 100644 index 0000000..0c36883 --- /dev/null +++ b/ProgressFormUnit.dfm @@ -0,0 +1,67 @@ +object ProgressForm: TProgressForm + Left = 0 + Top = 0 + ParentCustomHint = False + BiDiMode = bdLeftToRight + BorderIcons = [] + BorderStyle = bsNone + ClientHeight = 100 + ClientWidth = 400 + Color = clBtnFace + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + KeyPreview = True + ParentBiDiMode = False + Position = poMainFormCenter + Scaled = False + OnClose = FormClose + OnCreate = FormCreate + OnKeyDown = FormKeyDown + TextHeight = 13 + object m_DialogPanel: TGeneralDialogPanel + Left = 0 + Top = 0 + Width = 400 + Height = 100 + Color = 5064257 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentBackground = False + ParentFont = False + TabOrder = 0 + OnCanceled = OnCanceled + object m_panelProgress: TPanel + Left = 40 + Top = 50 + Width = 320 + Height = 20 + BevelOuter = bvNone + Caption = 'm_panelProgress' + Ctl3D = False + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentCtl3D = False + ParentFont = False + ShowCaption = False + TabOrder = 0 + object m_pbProgress: TPaintBox + Left = 0 + Top = 0 + Width = 320 + Height = 20 + Align = alClient + OnPaint = ProgressPaint + end + end + end +end diff --git a/ProgressFormUnit.h b/ProgressFormUnit.h new file mode 100644 index 0000000..49b798f --- /dev/null +++ b/ProgressFormUnit.h @@ -0,0 +1,114 @@ +//--------------------------------------------------------------------------- + +#ifndef ProgressFormUnitH +#define ProgressFormUnitH +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include +#include +#include "PNGButton.hpp" +#include "GlobalUnit.h" +#include +#include "GeneralDialogPanel.h" +//--------------------------------------------------------------------------- + +class TProgressForm : public TForm +{ +__published: // IDE-managed Components + TPaintBox *m_pbProgress; + TGeneralDialogPanel *m_DialogPanel; + TPanel *m_panelProgress; + void __fastcall ProgressPaint(TObject *Sender); + void __fastcall FormCreate(TObject *Sender); + void __fastcall FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift); + void __fastcall OnCanceled(TObject *Sender); + void __fastcall FormClose(TObject *Sender, TCloseAction &Action); + +private: // User declarations + TBitmap *m_bmpTileLeft, + *m_bmpTileRight; + + TThread *m_pThread; + TTimer *m_pTimer; + + int m_nTileWidth, + m_nTileHeight, + m_nMaxPos, + m_nPos, + m_iOperation, + m_iOperationResult; + TCHAR m_strParam1[256]; + char m_strBuff[256]; + void* m_pParam1, *m_pParam2; + + int m_nNextMinPos, + m_nNextMaxPos; + + UINT m_nParam1, m_nParam2; + double m_dblParam1, m_dblParam2; + int *m_pIntParam1, *m_pIntParam2; + + //SaveMediaר + UINT m_nParam3, m_nParam4; + TThread *m_pConfirmThread; + int m_iSaveState, + m_iConfirmResult, + m_iFileHandle; + + void __fastcall TimerProc(TObject* Sender); + void StartConfirm(); + void Canceled(); + + MESSAGE void __fastcall UMOperateFailed(TMessage &Message); + MESSAGE void __fastcall UMOperatePercent(TMessage &Message); + MESSAGE void __fastcall UMOperateComplete(TMessage &Message); + MESSAGE void __fastcall UMOperateNextRange(TMessage &Message); + MESSAGE void __fastcall UMRecordComplete(TMessage &Message); + MESSAGE void __fastcall UMPaymentConfirmed(TMessage &Message); + + BEGIN_MESSAGE_MAP + void __fastcall TimerProc(TObject* Sender); + MESSAGE_HANDLER(MSG_OPERATE_FAILED, TMessage, UMOperateFailed) + MESSAGE_HANDLER(MSG_OPERATE_PERCENT, TMessage, UMOperatePercent) + MESSAGE_HANDLER(MSG_OPERATE_COMPLETE, TMessage, UMOperateComplete) + MESSAGE_HANDLER(MSG_OPERATE_NEXTRANGE, TMessage, UMOperateNextRange) + MESSAGE_HANDLER(MSG_RECORD_COMPLETE, TMessage, UMRecordComplete) + MESSAGE_HANDLER(MSG_PAYMENTCONFIRMED, TMessage, UMPaymentConfirmed) + END_MESSAGE_MAP(TForm) + +public: // User declarations + TMessage m_MsgTransparent; + + __fastcall TProgressForm(TComponent* Owner); + __fastcall ~TProgressForm(); + + int __fastcall MM_SaveMedia( int iSaveType, int iFileType, LPCTSTR strFileName, + int iOp, int nIdCount, UINT aIdStyle[] ); +// int __fastcall MM_Save( int iSaveType, LPCTSTR strFileName, int iFileType ); + int __fastcall MM_Load( LPCTSTR strFileName, int iFileType ); + int __fastcall MM_AudioFxApply( double dblBegin, double dblEnd ); + int __fastcall Project_Save( LPCTSTR strFileName ); + int __fastcall Project_Load( LPCTSTR strFileName ); + int __fastcall User_Register( int isEmailOrMobile ); + int __fastcall User_Login(); + int __fastcall User_CheckPayment( int iOperation, int nIdCount, + UINT aIdStyle[], int aStyleCost[], + int* pCost, int* pBalance ); + int __fastcall User_ConfirmPayment( int iOperation, int nIdCount, + UINT aIdStyle[], int* pUserBalance ); + int __fastcall User_SubmitQuestin( LPCSTR strQuestion ); + int __fastcall User_StyleScore( UINT idStyle, int iType, int* pScrUser, int* pScrAverage );//add by laq + int __fastcall User_UploadSong( LPCTSTR strFileName, TSHAREINFO* pShareInfo ); + int __fastcall User_StyleUpload( int iType, int nDataSize, char* pData ); + + void __fastcall Operation(); + void __fastcall SetOperationResult( int iRes ) { m_iOperationResult=iRes; }; + int __fastcall GetOpertaionResult() { return m_iOperationResult; }; +}; +//--------------------------------------------------------------------------- +extern PACKAGE TProgressForm *ProgressForm; +//--------------------------------------------------------------------------- +#endif diff --git a/ProgressThreadUnit.cpp b/ProgressThreadUnit.cpp new file mode 100644 index 0000000..7286627 --- /dev/null +++ b/ProgressThreadUnit.cpp @@ -0,0 +1,37 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop + +#include "ProgressThreadUnit.h" +#include "ProgressFormUnit.h" +#pragma package(smart_init) +//--------------------------------------------------------------------------- + +// Important: Methods and properties of objects in VCL can only be +// used in a method called using Synchronize, for example: +// +// Synchronize(&UpdateCaption); +// +// where UpdateCaption could look like: +// +// void __fastcall TProgressThread::UpdateCaption() +// { +// Form1->Caption = "Updated in a thread"; +// } +//--------------------------------------------------------------------------- + +__fastcall TProgressThread::TProgressThread(bool CreateSuspended, TForm* pForm) + : TThread(CreateSuspended) +{ + m_pForm = pForm; +} +//--------------------------------------------------------------------------- +void __fastcall TProgressThread::Execute() +{ + //---- Place thread code here ---- + ((TProgressForm*)m_pForm)->Operation(); + + Terminate(); +} +//--------------------------------------------------------------------------- diff --git a/ProgressThreadUnit.h b/ProgressThreadUnit.h new file mode 100644 index 0000000..ede7314 --- /dev/null +++ b/ProgressThreadUnit.h @@ -0,0 +1,18 @@ +//--------------------------------------------------------------------------- + +#ifndef ProgressThreadUnitH +#define ProgressThreadUnitH +//--------------------------------------------------------------------------- +#include +//--------------------------------------------------------------------------- +class TProgressThread : public TThread +{ +private: + TForm * m_pForm; +protected: + void __fastcall Execute(); +public: + __fastcall TProgressThread(bool CreateSuspended, TForm* pForm); +}; +//--------------------------------------------------------------------------- +#endif diff --git a/Project.cpp b/Project.cpp new file mode 100644 index 0000000..eef1914 --- /dev/null +++ b/Project.cpp @@ -0,0 +1,2526 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop + +#include "GlobalUnit.h" +#include "Project.h" +#include "StyleItem.h" +#include "MidiTrack.h" +#include "Undo.h" + +//--------------------------------------------------------------------------- +#pragma package(smart_init) + + +typedef struct tagTempStyleMap //ʱӳ +{ + UINT idTemp; + UINT idLoc; + UINT idStyle; +} TTempStyleMap, *PTTempStyleMap; + +const char *g_strProjError[11] = { + "ȫֻ򲿷ɫʧЧʹȱʡɫ", + "ֶʧЧʹȫַ滻", + "ЧʧЧ", + "򿪹ʧܣ\n\nļ", + "򿪹ʧܣ\n\nڰ汾볢ôڰ", + "򿪹ʧܣ\n\n汾̫£°", + "򿪹ʧܣ\n\n޷ʶİ汾", + "򿪹ʧܣ\n\nļ", + "򿪹ʧܣ\n\nƵݱƻ", + "򿪹ʧܣ\n\nʹõķδػʧЧ", + "򿪹ʧܣ\n\nʹñطȵ¼"}; + +const DWORD g_dwProjectVersion = MAKELONG(7, 5); //ver 5.6 +//ver 2.0-2.1 3.0-3.1 4.0-4.1 5.0-5.1ãжڰ汾 +//ver 3.2 רҵ湤 +//ver 3.3 g_bPredefineд֧Audio +//ver 4.2 TPPRSTYLEṹ֧Ʒ/֧¼ +//ver 4.3 ֱ֧TBar/TOpusStageṹ +//ver 4.4 g_bMidiMelodyд +//ver 5.2 VIP湤, ¼̹ܷ֧ʶϢ, TTrackϢԭʼ +//ver 5.3 ӹģʽ־ iMode=0,1,2 +//ver 5.4 TTrackiBank +//ver 5.5 ExtendFont +//ver 5.6 BaseTrackʽ +//ver 5.7 Ƶӵ17 + +vector u_aTempStyleMap; //ʱӳ +wstring g_strLastProjSavePath, // ϴα湤· + g_strProjectName, // ļ + g_strAutoProjName; // Զļ + //g_strFontFile_SVD; // ɫļ(ѱ) + +vectorg_lstRecentProject; // Ĺļ +HANDLE g_hProjectEvent; // ļд + +int g_iMelodyKey_SVD = -1, // ɵ(ѱ) + g_nMelodyTempo_SVD = 75; // ٶ(ѱ) + +float g_fRecordVolume_SVD = -1, //¼(ѱ) + g_fSpeakerVolume_SVD = -1; //(ѱ) + +char g_strSoundFont_SVD[80]; //ȫɫ(ѱ) + +TUndoLite* u_pProjLite = NULL, + * u_pAutoLite = NULL; + +void ClearProjStyleMap() +{ + for( int i=0; ipOrigin->state!=e_Downloaded ){ + if( f_CS_DownloadStyle( idStyle, NULL )!=0 ){ + pStyle = NULL; + } + else{ + pStyle->pOrigin->state = e_Downloaded; + } + } + + return pStyle; +} + +void UpdateRecentProject(wstring wstrProj) +{ + // б + wchar_t strTemp[MAX_PATH]; + + wstring strLowerProjName, strLowerCompName; + wcscpy(strTemp, wstrProj.c_str()); + strLowerProjName = _wcslwr(strTemp); + + BOOL bInList = FALSE; + for (int i = 0; i < g_lstRecentProject.size(); i++) { + wcscpy(strTemp, g_lstRecentProject[i].c_str()); + strLowerCompName = _wcslwr(strTemp); + if (strLowerProjName.compare(strLowerCompName) == 0) { + if (i > 0) { + vector::iterator iterStr = + g_lstRecentProject.begin() + i; + g_lstRecentProject.erase(iterStr); + g_lstRecentProject.insert(g_lstRecentProject.begin(), + wstrProj); + } + + bInList = TRUE; + + break; + } + } + + if (!bInList) { + g_lstRecentProject.insert(g_lstRecentProject.begin(), + wstrProj); + } +} + +void CheckLocId( UINT& idLoc, UINT& idStyle ) +{ + if( idLoc==(UINT)-1 ){ + for( int k=0; kidTemp ){ + idLoc = u_aTempStyleMap[k]->idLoc; + idStyle = u_aTempStyleMap[k]->idStyle; + + break; + } + } + } +} + +void KeepLocSegment( LOCSEGLIST& aLocSegs, UINT& idLoc, UINT& idStyle, + int iSegType, int iSegNo ) +{ + bool bKeep = false; + DWORD dwSeg = MAKELONG( iSegType, iSegNo ); + for( int k=0; kidLoc + && idStyle==aLocSegs[k]->idStyle ){ + for( int t=0; taSegs.size(); t++ ){ + if( dwSeg==aLocSegs[k]->aSegs[t] ){ + bKeep = true; + break; + } + } + + if( !bKeep ){ + aLocSegs[k]->aSegs.push_back( dwSeg ); + bKeep = true; + break; + } + } + } + + if( !bKeep ){ + TLocSegment* pLocSeg = new TLocSegment; + pLocSeg->idLoc = idLoc; + pLocSeg->idStyle = idStyle; + pLocSeg->aSegs.push_back( dwSeg ); + aLocSegs.push_back( pLocSeg ); + } + + CheckLocId( idLoc, idStyle ); +} + +void SaveOpusStages( TOpusStageList& lstStages, LOCSEGLIST& lstLocSeg, FILE* pFile ) +{ + int num = lstStages.size(); + fwrite( &num, sizeof(int), 1, pFile ); + + for( int i=0; iiSegType, sizeof(char), 1, pFile ); + fwrite( &pStage->iSegNo, sizeof(char), 1, pFile ); + fwrite( &pStage->iSegKey, sizeof(char), 1, pFile ); + fwrite( &pStage->nVol, sizeof(char), 1, pFile ); + + int count = pStage->aBars.size(); + fwrite( &count, sizeof(int), 1, pFile ); + + for( int j=0; jaBars[j]; + fwrite( &pBar->aChords, sizeof(TBarChords), 1, pFile ); + fwrite( &pBar->iBarKey, sizeof(char), 1, pFile ); + } + count = pStage->aTracks.size(); + fwrite( &count, sizeof(int), 1, pFile ); + + for( int j=0; jaTracks[j]; + UINT idLoc = pTrack->iStyleLoc, + idStyle = pTrack->iStyleId; + + //¼طƬ + if( idLoc!=0 ){ + KeepLocSegment( lstLocSeg, idLoc, idStyle, pStage->iSegType, pTrack->iSegNo ); + } + + fwrite( &idLoc, sizeof(UINT), 1, pFile ); + fwrite( &idStyle, sizeof(UINT), 1, pFile ); + fwrite( &pTrack->iSegNo, sizeof(BYTE), 1, pFile ); + fwrite( &pTrack->iChanNo, sizeof(BYTE), 1, pFile ); + fwrite( &pTrack->iChanSpec, sizeof(BYTE), 1, pFile ); + fwrite( &pTrack->iProg, sizeof(BYTE), 1, pFile ); + fwrite( &pTrack->iProgOrig, sizeof(BYTE), 1, pFile ); + fwrite( &pTrack->nVol, sizeof(BYTE), 1, pFile ); + fwrite( &pTrack->nVolOrig, sizeof(BYTE), 1, pFile ); + fwrite( &pTrack->iBank, sizeof(BYTE), 1, pFile ); + fwrite( &pTrack->iFile, sizeof(BYTE), 1, pFile ); + } + } +} + +BOOL SaveProject( LPCSTR strProjectName, int iSaveMode, HWND hNotifyWnd ) +{ + wstring wstrProj = str2wstr( strProjectName ); + DebugPrint("Saving project: %s...", strProjectName); + + WaitForSingleObject(g_hProjectEvent, INFINITE); + + BOOL bSuccess = FALSE; + FILE *pFile = NULL; + + if ((pFile = fopen( strProjectName, "w+b" )) != NULL) { + UINT lFileSize = 0; + fpos_t posFileSize = 0; + + // 汾 + fwrite(&g_dwProjectVersion, sizeof(DWORD), 1, pFile); + + // Ԥļ + fgetpos(pFile, &posFileSize); + fwrite(&lFileSize, sizeof(UINT), 1, pFile); + + // ģʽ־ + fwrite(&iSaveMode, sizeof(int), 1, pFile); + + // ҪϢ + fwrite(&g_iMelodyTimeSignature, sizeof(int), 1, pFile); // ĺ + fwrite(&g_nMelodyTempo, sizeof(int), 1, pFile); // ٶ + fwrite(&g_iMelodyKey, sizeof(int), 1, pFile); // + + // ȫɫ + //string strFont = wstr2str( g_strFontFile ); + string strFontUTF8 = GBToUTF8( g_strSoundFont );//strFont.c_str() ); + int nFontNameLen = strFontUTF8.length() + 1; + fwrite(&nFontNameLen, sizeof(int), 1, pFile); + fwrite( strFontUTF8.c_str(), sizeof(char), nFontNameLen, pFile); + + fwrite( &g_bExtFont, sizeof(bool), 1, pFile ); + + // ֵ + fwrite(&g_fRecordVolume, sizeof(float), 1, pFile); + fwrite(&g_fSpeakerVolume, sizeof(float), 1, pFile); + fwrite(&g_fMusicVolume, sizeof(float), 1, pFile); + + int iMute = g_bComposeMute ? 1 : 0; + fwrite(&iMute, sizeof(int), 1, pFile); + + LOCSEGLIST aLocSegs; //ʹõıطƬб + // Theme + g_Theme.WriteProj( aLocSegs, pFile ); + // Opus + g_Opus.WriteProj( aLocSegs, pFile ); + // MidiTrack + g_Midi.WriteProj( pFile ); + + //ʹõԴ + vector lstBank; + g_Theme.GetSpecBanks( lstBank ); + g_Midi.GetSpecBanks( lstBank ); + //g_Opus.GetSpecBanks( lstBank ); + + int nCount = lstBank.size(); + fwrite(&nCount, sizeof(int), 1, pFile); + for( int i=0; istrFontName; + BYTE len = strlen( strFontName ); + + fwrite(&len, sizeof(BYTE), 1, pFile); + fwrite( strFontName, sizeof(char), len, pFile); + } + else{ +/* char* name = strrchr(g_lstVSTi[iBank-0x80]->strFileName, '\\' ) + 1, + *ext = strrchr( g_lstVSTi[iBank-0x80]->strFileName, '.' ); + BYTE len = ext>name ? ext - name : strlen(name); +*/ + DWORD uniqueID = g_lstVSTi[iBank-0x80]->uniqueID; + fwrite( &uniqueID, sizeof(DWORD), 1, pFile ); +// fwrite(&len, sizeof(BYTE), 1, pFile); +// fwrite( name, sizeof(char), len, pFile); + + BYTE cmprMem[100000]; + int lenMem = 100000; + + if( f_MM_HandleVSTiPreset( iBank, lenMem, cmprMem, false )==S_OK ){ + fwrite( &lenMem, sizeof(int), 1, pFile ); + fwrite( cmprMem, 1, lenMem, pFile ); + } + else{ + lenMem = 0; + fwrite( &lenMem, sizeof(int), 1, pFile ); + } + } + } + + // Audio + if( iSaveMode==PROJ_MODE_UPLOAD ){ + int num = 0; + fwrite( &num, sizeof(int), 1, pFile ); + } + else{ + g_Audio.WriteProj( pFile ); + } + + //PreStylePanel + TStyleItem* pSty = g_pPreStyle; + + UINT idLoc = 0, idStyle = 0; + if( pSty->pStyle ){ + idLoc = pSty->pStyle->idLoc; + idStyle = pSty->pStyle->idStyle; + + CheckLocId( idLoc, idStyle ); + } + + fwrite( &idLoc, sizeof(UINT), 1, pFile ); + fwrite( &idStyle, sizeof(UINT), 1, pFile ); + + int num = pSty->aItems->Count; + fwrite( &num, sizeof(int), 1, pFile ); + for( int i=0; iaItems->Items[i]; + + fwrite( &pSeg->iSegType, sizeof(char), 1, pFile ); + fwrite( &pSeg->iSegNo, sizeof(char), 1, pFile ); + fwrite( &pSeg->volume, sizeof(char), 1, pFile ); + fwrite( &pSeg->nBars, sizeof(int), 1, pFile ); + + int count = pSeg->aItems->Count; + fwrite( &count, sizeof(int), 1, pFile ); + for( int j=0; jaItems->Items[j]; + TTrack* pTrack = pTrk->pTrack; + UINT idLoc = pTrack->iStyleLoc, + idStyle = pTrack->iStyleId; + + CheckLocId( idLoc, idStyle ); + + fwrite( &idLoc, sizeof(UINT), 1, pFile ); + fwrite( &idStyle, sizeof(UINT), 1, pFile ); + + fwrite( &pTrack->iSegNo, sizeof(char), 1, pFile ); + fwrite( &pTrack->iChanNo, sizeof(char), 1, pFile ); + fwrite( &pTrack->iChanSpec, sizeof(char), 1, pFile ); + fwrite( &pTrack->iProg, sizeof(char), 1, pFile ); + fwrite( &pTrack->iProgOrig, sizeof(char), 1, pFile ); + fwrite( &pTrack->nVol, sizeof(char), 1, pFile ); + fwrite( &pTrack->nVolOrig, sizeof(char), 1, pFile ); + } + } + + //Ԥ + fwrite( &g_iPreStage, sizeof(int), 1, pFile ); + //ͼģʽ + int iContentView = 0; + Application->MainForm->Perform( UM_GETCONTENTVIEW, (NativeInt)&iContentView, 0 ); + fwrite(&iContentView, sizeof(int), 1, pFile); + //Ԥ蹤 + fwrite( &g_bPredefine, sizeof(bool), 1, pFile ); + //MIDI빤 + fwrite( &g_bMidiMelody, sizeof(bool), 1, pFile ); + + //汾ط + num = aLocSegs.size(); + fwrite( &num, sizeof(int), 1, pFile ); + + for( int i=0; iaSegs.size(); + WORD (*aSegs)[2] = new WORD[nSegNum][2]; + + for( int j=0; jaSegs.size(); j++ ){ + aSegs[j][0] = LOWORD( pLocSeg->aSegs[j] ); + aSegs[j][1] = HIWORD( pLocSeg->aSegs[j] ); + } + + int len = 1000000; + BYTE* mem = new BYTE[1000000]; + UINT idLoc = pLocSeg->idLoc, + idStyle = pLocSeg->idStyle; + + if( idLoc==(UINT)-1 ){ + for( int k=0; kidTemp ){ + idLoc = u_aTempStyleMap[k]->idLoc; + idStyle = u_aTempStyleMap[k]->idStyle; + + break; + } + } + } + + fwrite( &idLoc, sizeof(UINT), 1, pFile ); + fwrite( &idStyle, sizeof(UINT), 1, pFile ); + + f_CM_ProjBackupStyle( pLocSeg->idLoc, pLocSeg->idStyle, + nSegNum, aSegs, len, mem ); + + fwrite( &len, sizeof(int), 1, pFile ); + if( len>0 ) + fwrite( mem, 1, len, pFile ); + + delete[] mem; + delete[] aSegs; + delete aLocSegs[i]; + } + + aLocSegs.clear(); + + // ļ + lFileSize = ftell(pFile); + + fclose( pFile ); + + int lCSSize = f_CS_SaveProject( strProjectName ); + if( lCSSize>0 ){ + lFileSize += lCSSize; + } + + long lMMSize = f_MM_SaveProject( iSaveMode, hNotifyWnd, strProjectName ); + + if( lMMSize>0 ){ + lFileSize += lMMSize; + } + + pFile = fopen( strProjectName, "r+b" ); + fsetpos(pFile, &posFileSize); + fwrite(&lFileSize, sizeof(UINT), 1, pFile); + + fclose(pFile); + + bSuccess = TRUE; + + if( iSaveMode==PROJ_MODE_NORMAL ){ + g_bProjStylePaid = false; + UpdateSVDVars(); + UpdateRecentProject( wstrProj ); + PostMessage(hNotifyWnd, MSG_OPERATE_COMPLETE, 0, 0); + + u_pProjLite = g_Undo.GetLastLite(); + ClearAutoProj(); + } + else if( iSaveMode==PROJ_MODE_AUTO ){ + SetAutoSaveReg(true); + } + + if( iSaveMode!=PROJ_MODE_UPLOAD ){ + u_pAutoLite = g_Undo.GetLastLite(); + } + } + + if (SetEvent(g_hProjectEvent) == 0) { + DWORD dwError = GetLastError(); + DebugPrint("Set Event error! err=%d", dwError); + } + + DebugPrint("saving done\n"); + + if( iSaveMode==PROJ_MODE_NORMAL ){ + if (bSuccess) { + g_strProjectName = wstrProj; + g_strLastProjSavePath = ExtractFilePath( g_strProjectName.c_str() ).c_str(); + } + else{ + PostMessage(hNotifyWnd, MSG_OPERATE_FAILED, E_PROJ_FILENOTEXIST, 0); + } + } + + return bSuccess; +} + +BOOL LoadProject(LPCSTR strProjectName, HWND hNotifyWnd) { + DebugPrint("Opening project...."); + + WaitForSingleObject(g_hProjectEvent, INFINITE); + + BOOL bSuccess = FALSE; + int iError = E_PROJ_NOERROR; + int iLoadMode = hNotifyWnd==NULL ? PROJ_MODE_AUTO : PROJ_MODE_NORMAL, + + // ȫֱ + g_bPredefine = false; + g_bProjStylePaid = false; + g_bMidiMelody = false; + g_iMelodyKey = -1; + g_fMusicVolume = 1; + g_bComposeMute = false; + g_iViewMode = 3; + ClearGlobalVars(); + ClearStyleMap(); + + FILE *pFile = NULL; + if ((pFile = fopen(strProjectName, "rb")) != NULL) { + DWORD dwProjectVersion; + WORD wMajVersion, wMinVersion; + UINT lFileSize = 0; + fpos_t posBegin = 0; + int iContentView = 1; + + // ȡ汾 + fread(&dwProjectVersion, sizeof(DWORD), 1, pFile); + if( LOWORD(dwProjectVersion)<2 ){ + wMajVersion = LOWORD(dwProjectVersion); + wMinVersion = HIWORD(dwProjectVersion); + dwProjectVersion = MAKELONG( wMinVersion, wMajVersion ); + } + else{ + wMajVersion = HIWORD( dwProjectVersion ); + wMinVersion = LOWORD( dwProjectVersion ); + } + + // ȡļ + fread(&lFileSize, sizeof(UINT), 1, pFile); + // ļ + fgetpos(pFile, &posBegin); + fseek(pFile, 0, SEEK_END); + if (lFileSize != ftell(pFile)) { + iError = E_PROJ_FILECRUPT; + goto STATEMENT_FALSE; + } + else { + fsetpos(pFile, &posBegin); + } + + if( wMajVersion<1 || wMajVersion==2 && wMinVersion>8 + || wMajVersion==3 && wMinVersion>3 + || wMajVersion==4 && wMinVersion>4 ){ //ʶ汾 + iError = E_PROJ_INVALIDVERSION; + goto STATEMENT_FALSE; + } + else if( wMajVersion<2 ) { //1.0ϰ汾 + iError = E_PROJ_EARLERVERSION; + goto STATEMENT_FALSE; + } + else if( dwProjectVersion>g_dwProjectVersion ) { //ڰ汾 + iError = E_PROJ_LATERVERSION; + goto STATEMENT_FALSE; + } + + if( wMajVersion>5 || wMajVersion==5 && wMinVersion>=3 || wMajVersion==2 && wMinVersion>=7 ) + fread(&iLoadMode, sizeof(int), 1, pFile); + + if( wMajVersion==5 ) + iError = LoadVersion5( pFile, dwProjectVersion, hNotifyWnd, &iContentView ); + else if( wMajVersion==4 ) + iError = LoadVersion4( pFile, dwProjectVersion, hNotifyWnd ); + else if( wMajVersion==3 ) + iError = LoadVersion3( pFile, dwProjectVersion, hNotifyWnd ); + else if( wMajVersion==2 ) + iError = LoadVersion2( pFile, dwProjectVersion, hNotifyWnd, iLoadMode ); + + long lPos = ftell( pFile ); + fclose( pFile ); + pFile = NULL; + + if (iError>E_PROJ_FATALERROR ) { + goto STATEMENT_FALSE; + } + + if( wMajVersion>=4 || wMajVersion==2 && wMinVersion>=6 ){ + int nCSSize = f_CS_LoadProject( strProjectName, lPos, dwProjectVersion ); + if( nCSSize<0 ){ + iError = E_PROJ_FILECRUPT; + goto STATEMENT_FALSE; + } + + lPos += nCSSize; + } + + lFileSize = f_MM_LoadProject( iLoadMode, hNotifyWnd, strProjectName, lPos, dwProjectVersion ); + + if( lFileSize<0 ){ + iError = E_PROJ_CANTLOADAUDIO; + goto STATEMENT_FALSE; + } + + g_bWeakup = g_Theme.IsWeadup(); + + for( int i=g_aAudioTracks.size()-1; i>=0; i-- ){ + if( ilstBars.size()>0 + && f_MM_AudioGetLength(i)>=0 ){ + if( wMajVersion>=5 ){ //ȡϢ + for( int k=0; klstBars.size(); k++ ){ + TWaveBar* pBar = g_aAudioTracks[i]->lstBars[k]; + + for( int j=0; jaVols[j] = f_MM_GetAudioVolume( i, k + j/(double)POINTS_PER_BAR ); + } + } + } + + f_MM_SetStreamVolume( 0x10+i, g_aAudioTracks[i]->IsMute() ? 0 + : g_aAudioTracks[i]->volume / 100.0 ); + } + else{ + DeleteAudioTrack( i, false ); + f_MM_AudioDeleteTrack( i ); + } + } + + bSuccess = TRUE; + + if( hNotifyWnd ) + PostMessage(hNotifyWnd, MSG_OPERATE_COMPLETE, iError, 0); + + PostMessage( Application->MainFormHandle, UM_SETCONTENTVIEW, iContentView, 0 ); + } + else { + iError = E_PROJ_FILENOTEXIST; + } + +STATEMENT_FALSE: + if( pFile ){ + fclose( pFile ); + pFile = NULL; + } + + if (SetEvent(g_hProjectEvent) == 0) { + DWORD dwError = GetLastError(); + DebugPrint("Set Event error! err=%d", dwError); + } + + DebugPrint("opening done\n"); + + if( iLoadMode!=PROJ_MODE_AUTO ) { //add by tj 2013/12/31 + if (!bSuccess) { + PostMessage(hNotifyWnd, MSG_OPERATE_FAILED, iError, 0); + } + else { + UpdateSVDVars(); + g_strProjectName = str2wstr( strProjectName ); + g_strLastProjSavePath = ExtractFilePath( g_strProjectName.c_str() ).c_str(); + UpdateRecentProject(g_strProjectName); + } + } + + return bSuccess; +} + +TPROSTYLE* GetProjStyle( UINT idLoc, UINT idStyle, STYLELIST& aUnsolvedStyles ) +{ + TPROSTYLE* pInfo = CheckStyle( idLoc, idStyle ); + + if( !pInfo && idLoc!=0 && idLoc!=(UINT)-1 ){ + for( int t=0; tidLoc==idLoc + && aUnsolvedStyles[t]->idStyle==idStyle ){ + pInfo = aUnsolvedStyles[t]; + break; + } + } + + if( !pInfo ){ + pInfo = new TPROSTYLE; + pInfo->idLoc = idLoc; + pInfo->idStyle = idStyle; + aUnsolvedStyles.push_back( pInfo ); + } + } + + return pInfo; +} + +int LoadOpusStages( TOpusStageList& lstStages, STYLELIST& aUnsolvedStyles, FILE* pFile, DWORD dwVersion ) +{ + WORD wMajVersion = HIWORD( dwVersion ), + wMinVersion = LOWORD( dwVersion ); + int num, nBars = 0; + fread( &num, sizeof(int), 1, pFile ); + + for( int i=0; iiSegType, sizeof(char), 1, pFile ); + fread( &pStage->iSegNo, sizeof(char), 1, pFile ); + fread( &pStage->iSegKey, sizeof(char), 1, pFile ); + fread( &pStage->nVol, sizeof(char), 1, pFile ); + + int count; + fread( &count, sizeof(int), 1, pFile ); + for( int j=0; jaChords, sizeof(TBarChords), 1, pFile ); + fread( &pBar->iBarKey, sizeof(char), 1, pFile ); + pStage->aBars.push_back( pBar ); + } + nBars += count; + + fread( &count, sizeof(int), 1, pFile ); + for( int j=0; jiStyleLoc, sizeof(UINT), 1, pFile ); + fread( &pTrack->iStyleId, sizeof(UINT), 1, pFile ); + fread( &pTrack->iSegNo, sizeof(BYTE), 1, pFile ); + fread( &pTrack->iChanNo, sizeof(BYTE), 1, pFile ); + fread( &pTrack->iChanSpec, sizeof(BYTE), 1, pFile ); + fread( &pTrack->iProg, sizeof(BYTE), 1, pFile ); + fread( &pTrack->iProgOrig, sizeof(BYTE), 1, pFile ); + fread( &pTrack->nVol, sizeof(BYTE), 1, pFile ); + fread( &pTrack->nVolOrig, sizeof(BYTE), 1, pFile ); + fread( &pTrack->iBank, sizeof(BYTE), 1, pFile ); + if( wMajVersion==5 && wMinVersion>=6 ) + fread( &pTrack->iFile, sizeof(BYTE), 1, pFile ); + + TPROSTYLE* pTrackStyle = GetProjStyle( pTrack->iStyleLoc, pTrack->iStyleId, aUnsolvedStyles ); + if( !pTrackStyle ){ //ЧķID + return E_PROJ_INVALIDSTYLE; + } + + if( wMajVersion==5 && wMinVersion<4 ){ + if( pTrack->iBank!=0 ) + pTrack->nVol |= 0x80; + + pTrack->iBank = 0xFF; + } + + pStage->aTracks.push_back( pTrack ); + } + + lstStages.push_back( pStage ); + } + + return nBars; +} + +int LoadVersion5( FILE *pFile, DWORD dwVersion, HWND hNotifyWnd, int* iContentView ) +{ + char strFont[MAX_PATH]; + string strStyleName; + bool bUseful; + int iError = E_PROJ_NOERROR; + WORD wMinVersion = LOWORD( dwVersion ); + int nSize, iMelodyKey, iMelodyTimeSignature, nMelodyTempo; + + // Ҫ + fread(&iMelodyTimeSignature, sizeof(int), 1, pFile); + fread(&nMelodyTempo, sizeof(int), 1, pFile); + fread(&iMelodyKey, sizeof(int), 1, pFile); + + if( g_iMelodyTimeSignature!=iMelodyTimeSignature ){ + SetMelodyTS(iMelodyTimeSignature); + SelectStyle(); + PostMessage( Application->MainFormHandle, UM_CHANGETT, true, -1 ); + } + + SetMelodyTempo(nMelodyTempo); + g_iMelodyKey = iMelodyKey; + + // ȡɫļ + fread(&nSize, sizeof(int), 1, pFile); + + if (nSize > 0) { + fread(strFont, sizeof(char), nSize, pFile); + strcpy( g_strSoundFont, strFont ); + } + + if( wMinVersion>=5 ) + fread( &g_bExtFont, sizeof(bool), 1, pFile ); + + // ֵ + fread(&g_fRecordVolume, sizeof(float), 1, pFile); + if( g_fRecordVolume>1 ) g_fRecordVolume = 1; + if( g_fRecordVolume<0 ) g_fRecordVolume = 0; + + fread(&g_fSpeakerVolume, sizeof(float), 1, pFile); + if( g_fSpeakerVolume>1 ) g_fSpeakerVolume= 1; + if( g_fSpeakerVolume<0 ) g_fSpeakerVolume= 0; + + fread(&g_fMusicVolume, sizeof(float), 1, pFile); + if( g_fMusicVolume>1 ) g_fMusicVolume = 1; + if( g_fMusicVolume<0 ) g_fMusicVolume = 0; + + int iMute; + fread(&iMute, sizeof(int), 1, pFile); + g_bComposeMute = iMute!=0; + + f_MM_SetStreamVolume( 0, g_fSpeakerVolume ); + f_MM_SetStreamVolume( 1, g_fRecordVolume ); + f_MM_SetStreamVolume( 4, g_bComposeMute ? 0 : g_fMusicVolume ); + + STYLELIST aUnsolvedStyles; + + iError = g_Theme.ReadProj( aUnsolvedStyles, pFile, dwVersion ); + if( iError!=E_PROJ_NOERROR ) + return iError; + + iError = g_Opus.ReadProj( aUnsolvedStyles, pFile, dwVersion ); + if( iError!=E_PROJ_NOERROR ) + return iError; + + if( wMinVersion>=6 ){ + iError = g_Midi.ReadProj( pFile, dwVersion ); + if( iError!=E_PROJ_NOERROR ) + return iError; + } + + if( wMinVersion>=4 ){ + //ʹõԴ + bool bReset = false; + BANKMAPLIST lstBank; + int nCount; + + fread(&nCount, sizeof(int), 1, pFile); + for( int i=0; iiBankOld, sizeof(BYTE), 1, pFile); + + if( pMap->iBankOld<0x80 ){ + fread(&len, sizeof(BYTE), 1, pFile); + fread(strFont, sizeof(char), len, pFile); + strFont[len] = '\0'; + for( int j=0; jstrFontName, strFont ) ){ + iBankNew = j; + break; + } + } + } + else{ + DWORD uniqueID = 0; + fread( &uniqueID, sizeof(DWORD), 1, pFile ); + + BYTE cmprMem[100000]; + int lenMem = 100000; + fread( &lenMem, sizeof(int), 1, pFile ); + + if( lenMem>0 ) + fread( cmprMem, 1, lenMem, pFile ); + + for( int j=0; juniqueID ){ + if( f_MM_LoadVSTi( j+0x80, g_lstVSTi[j]->strFileName )==S_OK ){ + iBankNew = j + 0x80; + + f_MM_HandleVSTiPreset( iBankNew, lenMem, cmprMem, true ); + } + + break; + } + } + } + + pMap->iBankNew = iBankNew; + lstBank.push_back( pMap ); + + if( pMap->iBankOld!=pMap->iBankNew ) + bReset = true; + + if( iBankNew==0xFF ) + iError |= E_PROJ_INVALIDFONT; + } + + if( bReset ){ + g_Theme.SetSpecBanks( lstBank ); + g_Opus.SetSpecBanks( lstBank ); + //g_Midi.SetSpecBanks( lstBank ); + g_Midi.ClearMidiTracks(); + } + } + + g_Midi.SortMidiTracks(); + + iError |= g_Audio.ReadProj( pFile, dwVersion ); + if( iError > E_PROJ_FATALERROR ) + return iError; + + //PreStylePanel +// bool bAuthority = g_bLogon && (g_infoUser.accountInfo.authority & 0x1000); + + UINT idPreLoc, idPreStyle; + fread( &idPreLoc, sizeof(UINT), 1, pFile ); + fread( &idPreStyle, sizeof(UINT), 1, pFile ); + + TPROSTYLE* info = CheckStyle( idPreLoc, idPreStyle );//GetProjStyle( idPreLoc, idPreStyle, aUnsolvedStyles ); + TStyleItem* pSty = new TStyleItem( info, OPT_FONTPROG | OPT_SAVE ); + + int num; + fread( &num, sizeof(int), 1, pFile ); + for( int i=0; iAddSegment( st, sn, opts, 0, -1, vol ); + pSeg->nBars = bars; + + int count; +// TTrackItem* pTrkPrev = NULL; + fread( &count, sizeof(int), 1, pFile ); + for( int j=0; jiSegNo, sizeof(char), 1, pFile ); + fread( &pTrk->iChanNo, sizeof(char), 1, pFile ); + fread( &pTrk->iChanSpec, sizeof(char), 1, pFile ); + fread( &pTrk->iProg, sizeof(char), 1, pFile ); + fread( &pTrk->iProgOrig, sizeof(char), 1, pFile ); + fread( &pTrk->nVol, sizeof(char), 1, pFile ); + fread( &pTrk->nVolOrig, sizeof(char), 1, pFile ); + + if( wMinVersion<4 ){ + bool bMute = false; + fread( &bMute, sizeof(bool), 1, pFile ); + + if( bMute ) + pTrk->nVol |= 0x80; + } + + TPROSTYLE* pInfo = CheckStyle( idItemLoc, idItemStyle );//GetProjStyle( idItemLoc, idItemStyle, aUnsolvedStyles ); + + if( !pInfo ){ + delete pTrk; + continue; + } + + DWORD dwTrkOpt = OPT_DEL|OPT_FONTPROG|OPT_VOL; + if( pSeg->iSegType<=SEGTYPE_FILL ) + dwTrkOpt |= OPT_TEXTURE; + + pTrk->iStyleLoc = idItemLoc; + pTrk->iStyleId = idItemStyle; + pSeg->AddTrack( pInfo, pTrk, dwTrkOpt, true ); + } + + if( pSeg->aItems->Count==0 ){ + pSty->DeleteSegment( pSeg ); + } + else if( !pSty->pStyle ){ + pSty->pStyle = ((TTrackItem*)pSeg->aItems->Items[0])->pStyle; + } + } + + if( pSty->pStyle && pSty->aItems->Count>0 ){ + g_pPreStyle = pSty; + } + else + delete pSty; + + //Ԥ + fread( &g_iPreStage, sizeof(int), 1, pFile ); + //ͼģʽ + fread( iContentView, sizeof(int), 1, pFile ); + //Ԥ蹤 + fread( &g_bPredefine, sizeof(bool), 1, pFile ); + //MIDI빤 + fread( &g_bMidiMelody, sizeof(bool), 1, pFile ); + + //ط + BYTE* mem = new BYTE[1000000]; + + fread( &num, sizeof(int), 1, pFile ); + for( int i=0; i0 ){ + fread( mem, 1, len, pFile ); + + for( int j=0; jidLoc && idStyle==pInfo->idStyle ){ + int id = f_CM_ProjRestoreStyle( len, mem ); + + if( id>0 ){ + g_Theme.SetTempStyle( idLoc, idStyle, id ); + g_Opus.SetTempStyle( idLoc, idStyle, id ); + + TTempStyleMap* pMap = new TTempStyleMap; + pMap->idTemp = id; + pMap->idLoc = pInfo->idLoc; + pMap->idStyle = pInfo->idStyle; + u_aTempStyleMap.push_back( pMap ); + + pInfo->idLoc = -1; + pInfo->idStyle = id; + g_aTempStyles.push_back( pInfo ); + + aUnsolvedStyles.erase( aUnsolvedStyles.begin() + j ); + } + + break; + } + } + } + } + + delete[] mem; + + if( !aUnsolvedStyles.empty() ){ + for( int i=0; iMainFormHandle, UM_CHANGETT, true, -1 ); + } + + SetMelodyTempo(nMelodyTempo); + g_iMelodyKey = iMelodyKey; + + // ȡɫļ + fread(&nSize, sizeof(int), 1, pFile); + + if (nSize > 0) { + fread(strFont, sizeof(char), nSize, pFile); + strcpy( g_strSoundFont, strFont ); + } + + // ֵ + fread(&g_fRecordVolume, sizeof(float), 1, pFile); + if( g_fRecordVolume>1 ) g_fRecordVolume = 1; + if( g_fRecordVolume<0 ) g_fRecordVolume = 0; + + fread(&g_fSpeakerVolume, sizeof(float), 1, pFile); + if( g_fSpeakerVolume>1 ) g_fSpeakerVolume= 1; + if( g_fSpeakerVolume<0 ) g_fSpeakerVolume= 0; + + float fAudioVolume = 1; + fread(&fAudioVolume, sizeof(float), 1, pFile); + if( fAudioVolume>1 ) fAudioVolume = 1; + if( fAudioVolume<0 ) fAudioVolume = 0; + + fread(&g_fMusicVolume, sizeof(float), 1, pFile); + if( g_fMusicVolume>1 ) g_fMusicVolume = 1; + if( g_fMusicVolume<0 ) g_fMusicVolume = 0; + + f_MM_SetStreamVolume( 0, g_fSpeakerVolume ); + f_MM_SetStreamVolume( 1, g_fRecordVolume ); + f_MM_SetStreamVolume( 4, g_fMusicVolume ); + + TBarList lstBars; + vector lstStages; + // g_lstRawBars + int num; + fread( &num, sizeof(int), 1, pFile ); + + if( num>0 ){ + for( int i=0; iaVols, sizeof(DWORD), POINTS_PER_BAR, pFile ); + + g_aAudioTracks[0]->lstBars.push_back( pWvBar ); + + TBar* pBar = new TBar; + fread( &pBar->aChords, sizeof(TBarChords), 1, pFile ); + + if( HIWORD( dwVersion )>4 || wMinVersion>=3 ) + fread( &pBar->iBarKey, sizeof(char), 1, pFile ); + else + pBar->iBarKey = iMelodyKey; + + lstBars.push_back( pBar ); + } + + AudioEffectsDefault( 0, false ); + g_aAudioTracks[0]->volume = (int)(fAudioVolume * 100); + } + + // g_lstRawStages + fread( &num, sizeof(int), 1, pFile ); + for( int i=0; i0 ){ + pAudioTrack = new TAudioTrack; + pAudioTrack->volume = (int)(fAudioVolume * 100); + g_aAudioTracks.push_back( pAudioTrack ); + g_aAudioTracks[0]->Hide();// = true; + + for( int i=0; iiSegType = iSegType; + pStage->iSegNo = iSegNo; + pStage->iSegKey = iMelodyKey; + } + else{ + fread( &pStage->iSegType, sizeof(char), 1, pFile ); + fread( &pStage->iSegNo, sizeof(char), 1, pFile ); + fread( &pStage->iSegKey, sizeof(char), 1, pFile ); + } + + int count; + fread( &count, sizeof(int), 1, pFile ); + for( int j=0; jaVols, sizeof(DWORD), POINTS_PER_BAR, pFile ); + pAudioTrack->lstBars.push_back( pWvBar ); + + TBar* pBar = new TBar; + fread( &pBar->aChords, sizeof(TBarChords), 1, pFile ); + + if( HIWORD( dwVersion )>4 || wMinVersion>=3 ) + fread( &pBar->iBarKey, sizeof(char), 1, pFile ); + else + pBar->iBarKey = iMelodyKey; + + pStage->aBars.push_back( pBar ); + } + + fread( &count, sizeof(int), 1, pFile ); + for( int j=0; jiStyleLoc = track.iStyleLoc; + pTrk->iStyleId = track.iStyleId; + pTrk->iSegNo = track.iSegNo; + pTrk->iChanNo = track.iChanNo; + pTrk->iChanSpec = track.iChanSpec; + pTrk->iProg = track.iProg; + pTrk->nVol = track.nVol; + + pStage->aTracks.push_back( pTrk ); + } + + g_lstOpusStages.push_back( pStage ); + } + + g_Opus.CountBars(); + } + + //g_aAudioEffects + for( int i=0; i=pAudioTrack->lstBars.size()-1 ){ + int iType = g_aAudioEffectTypes[i]; + + if( iType!=FX_PITCH ){ + int nSize = GetFxParamNum( iType ); + float* pParams = new float[nSize]; + int iPreset = pAE.iPreset; + + int nPresetCount = GetFxPresetCount( iType ); + + if( pAE.bOn ) + memcpy( pParams, pAE.aParams, sizeof(float)*nSize ); + else{ + if( iPreset>=nPresetCount ) + iPreset = 0; + + GetFxPreset( iType, iPreset, pParams ); + } + + TAudioFx* pFx = new TAudioFx( iType, iPreset, pParams, nSize, !pAE.bOn ); + pAudioTrack->lstFxs.push_back( pFx ); + } + } + else{ + iError |= E_PROJ_INVALIDFX; + } + } + } + + //AudStylePanelϢ + //PreStylePanel/UseStylePanelϢ + bool bAuthority = g_bLogon && (g_infoUser.accountInfo.authority & 0x1000), + bNoAuthority = false, + bInvalid = false; + STYLELIST aUnsolvedStyles; + TStyleItem *pPreStyle = NULL, + *pUseStyle = NULL; + + for( int n=0; n<2; n++ ){ + TStyleItem*& pSty = n==0 ? pPreStyle : pUseStyle; + pSty = new TStyleItem; + + UINT idStyItemLoc, idStyItemStyle; + fread( &idStyItemLoc, sizeof(UINT), 1, pFile ); + fread( &idStyItemStyle, sizeof(UINT), 1, pFile ); + fread( &pSty->iType, sizeof(char), 1, pFile ); + fread( &pSty->nBars, sizeof(int), 1, pFile ); + + int nSegNum[4]; + fread( nSegNum, sizeof(int), 4, pFile ); + for( int i=0; i<4; i++ ){ + pSty->nSegNum[i] = nSegNum[i]; + } + + DWORD iOpt; + fread( &num, sizeof(int), 1, pFile ); + for( int i=0; ibAutoSpec = n==0; + + fread( &pSeg->iType, sizeof(char), 1, pFile ); + fread( &pSeg->iSegType, sizeof(char), 1, pFile ); + fread( &pSeg->iSegNo, sizeof(char), 1, pFile ); + fread( &pSeg->iInd, sizeof(char), 1, pFile ); + fread( &pSeg->volume, sizeof(char), 1, pFile ); + fread( &pSeg->nBars, sizeof(int), 1, pFile ); + fread( pSeg->aChanUsed, sizeof(bool), 16, pFile ); + + int count; + fread( &count, sizeof(int), 1, pFile ); + for( int j=0; j0 ){ + pStage = g_lstOpusStages[i]; + pStage->nVol = pSeg->volume; + } + + TTrackItem* pTrkPrev = NULL; + fread( &count, sizeof(int), 1, pFile ); + for( int j=0; jiType, sizeof(char), 1, pFile ); + fread( &idItemLoc, sizeof(UINT), 1, pFile ); + fread( &idItemStyle, sizeof(UINT), 1, pFile ); + + char iSegType; + fread( &iSegType, sizeof(char), 1, pFile ); + // fread( &pTrk->iSegType, sizeof(char), 1, pFile ); + fread( &pTrack->iSegNo, sizeof(char), 1, pFile ); + fread( &pTrack->iChanNo, sizeof(char), 1, pFile ); + fread( &pTrack->iChanSpec, sizeof(char), 1, pFile ); + fread( &pTrack->iProg, sizeof(char), 1, pFile ); + fread( &pTrack->iProgOrig, sizeof(char), 1, pFile ); + fread( &pTrack->nVol, sizeof(char), 1, pFile ); + fread( &pTrack->nVolOrig, sizeof(char), 1, pFile ); + + bool bMute = false; + fread( &bMute, sizeof(bool), 1, pFile ); + if( bMute ) + pTrack->nVol |= 0x80; + + int cn; + fread( &cn, sizeof(int), 1, pFile ); + for( int k=0; kidLoc==idItemLoc + && aUnsolvedStyles[t]->idStyle==idItemStyle ){ + pInfo = aUnsolvedStyles[t]; + break; + } + } + + if( !pInfo ){ + pInfo = new TPROSTYLE; + pInfo->idLoc = idItemLoc; + pInfo->idStyle = idItemStyle; + aUnsolvedStyles.push_back( pInfo ); + } + } + else{ + bInvalid = true; + + delete pTrk; + delete pTrack; + delete pSeg; + + goto STYLE_CHECK_OVER; + } + } + + pTrk->pStyle = pInfo; + pTrack->iStyleLoc = pInfo->idLoc; + pTrack->iStyleId = pInfo->idStyle; + + pTrk->aOptions->Add( (void*)OPT_DEL ); + pTrk->aOptions->Add( (void*)OPT_VOL ); + + if( pSeg->iSegType<=SEGTYPE_FILL ) + pTrk->aOptions->Add( (void*)OPT_TEXTURE ); + + if( n==0 ){ + pTrk->aOptions->Add( (void*)OPT_FONTPROG ); + pTrk->pTrack = pTrack; + pTrk->bOwnTrack = true; + } + else if( pStage ){ + TTrack* pTrackSet = pStage->aTracks[j]; + pTrackSet->iProgOrig = pTrack->iProg; + pTrackSet->nVolOrig = pTrack->nVolOrig; + pTrackSet->nVol = pTrack->nVol; + + pTrk->pTrack = pTrackSet; + delete pTrack; + } + + pTrk->up = pSeg; + if( pTrkPrev ){ + pTrk->prev = pTrkPrev; + pTrkPrev->next = pTrk; + } + pTrkPrev = pTrk; + + pSeg->aItems->Add( pTrk ); + } + + if( pSeg->aItems->Count>0 || n>0 ){ + pSeg->aOptions->Add( (void*)OPT_DEL ); + pSeg->aOptions->Add( (void*)OPT_VOL ); + if( pSeg->iTypeaOptions->Add( (void*)OPT_BRUSH ); + + pSeg->up = pSty; + if( pSegPrev ){ + pSeg->prev = pSegPrev; + pSegPrev->next = pSeg; + } + pSegPrev = pSeg; + + pSty->aItems->Add( pSeg ); + } + else{ + delete pSeg; + } + } + + TPROSTYLE* info = NULL; + if( bAuthority || idStyItemLoc==0 || idStyItemLoc==1 ) + info = CheckStyle( idStyItemLoc, idStyItemStyle ); + + if( !info ){ + if( n==1 && idStyItemLoc!=0 && idStyItemLoc!=1 && idStyItemLoc!=(UINT)-1 ){ + for( int t=0; tidLoc==idStyItemLoc + && aUnsolvedStyles[t]->idStyle==idStyItemStyle ){ + info = aUnsolvedStyles[t]; + break; + } + } + + if( !info ){ + info = new TPROSTYLE; + info->idLoc = idStyItemLoc; + info->idStyle = idStyItemStyle; + aUnsolvedStyles.push_back( info ); + } + } + + if( !info && pSty->aItems->Count>0 ){ + for( int i=0; iaItems->Count; i++ ){ + TSegmentItem* pSeg = (TSegmentItem*)pSty->aItems->Items[i]; + + if( pSeg->aItems->Count>0 ){ + info = ((TTrackItem*)pSeg->aItems->Items[0])->pStyle; + break; + } + } + } + } + + if( info && ( pSty->aItems->Count>0 || n>0 ) ){ + pSty->pStyle = info; + + if( n==0 ){ + pSty->aOptions->Add((void*)OPT_FONTPROG); + pSty->aOptions->Add((void*)OPT_SAVE); + } + } + else{ + delete pSty; + pSty = NULL; + + if( n>0 ){ + bInvalid = true; + goto STYLE_CHECK_OVER; + } + } + } + +STYLE_CHECK_OVER: + if( bInvalid ){ + if( pPreStyle ){ + delete pPreStyle; + } + + if( pUseStyle ){ + delete pUseStyle; + } + + return E_PROJ_INVALIDSTYLE; + } + else{ + g_pPreStyle = pPreStyle; + g_pUseStyle = pUseStyle; + } + + //Ԥ + fread( &g_iPreStage, sizeof(int), 1, pFile ); + //ͼģʽ + int iViewMode; + fread( &iViewMode, sizeof(int), 1, pFile ); + //Ԥ蹤 + fread( &g_bPredefine, sizeof(bool), 1, pFile ); + //MIDI빤 + if( HIWORD( dwVersion )>4 || wMinVersion>=4 ) + fread( &g_bMidiMelody, sizeof(bool), 1, pFile ); + + //ط + BYTE* mem = new BYTE[1000000]; + + fread( &num, sizeof(int), 1, pFile ); + for( int i=0; i0 ){ + fread( mem, 1, len, pFile ); + + for( int j=0; jidLoc && idStyle==pInfo->idStyle ){ + int id = f_CM_ProjRestoreStyle( len, mem ); + + if( id>0 ){ + for( int s=0; saTracks.size(); t++ ){ + TTrack* pTrack = pStage->aTracks[t]; + if( pTrack->iStyleLoc==idLoc && pTrack->iStyleId==idStyle ){ + pTrack->iStyleLoc = -1; + pTrack->iStyleId = id; + } + } + } + + TTempStyleMap* pMap = new TTempStyleMap; + pMap->idTemp = id; + pMap->idLoc = pInfo->idLoc; + pMap->idStyle = pInfo->idStyle; + u_aTempStyleMap.push_back( pMap ); + + pInfo->idLoc = -1; + pInfo->idStyle = id; + g_aTempStyles.push_back( pInfo ); + + aUnsolvedStyles.erase( aUnsolvedStyles.begin() + j ); + } + + break; + } + } + } + } + + delete[] mem; + + if( !aUnsolvedStyles.empty() ){ + for( int i=0; iMainFormHandle, UM_CHANGETT, true, -1 ); + } + + TPROSTYLE* pStyle = CheckStyle( 0, idStyle ); + if( !pStyle ) + return E_PROJ_INVALIDSTYLE; + + SetMelodyTempo(nMelodyTempo); + g_iMelodyKey = iMelodyKey; + + // ȡɫļ + fread(&nSize, sizeof(int), 1, pFile); + + if (nSize > 0) { + fread(strFont, sizeof(char), nSize, pFile); + strcpy( g_strSoundFont, strFont ); + } + + // ֵ + fread(&g_fRecordVolume, sizeof(float), 1, pFile); + if( g_fRecordVolume>1 ) g_fRecordVolume = 1; + if( g_fRecordVolume<0 ) g_fRecordVolume = 0; + + fread(&g_fSpeakerVolume, sizeof(float), 1, pFile); + if( g_fSpeakerVolume>1 ) g_fSpeakerVolume= 1; + if( g_fSpeakerVolume<0 ) g_fSpeakerVolume= 0; + + float fAudioVolume = 1; + fread(&fAudioVolume, sizeof(float), 1, pFile); + if( fAudioVolume>1 ) fAudioVolume = 1; + if( fAudioVolume<0 ) fAudioVolume = 0; + + fread(&g_fMusicVolume, sizeof(float), 1, pFile); + if( g_fMusicVolume>1 ) g_fMusicVolume = 1; + if( g_fMusicVolume<0 ) g_fMusicVolume = 0; + + f_MM_SetStreamVolume( 0, g_fSpeakerVolume ); + f_MM_SetStreamVolume( 1, g_fRecordVolume ); + f_MM_SetStreamVolume( 4, g_fMusicVolume ); + + // g_lstRawBars + TBarList lstBars; + int num; + fread( &num, sizeof(int), 1, pFile ); + + if( num>0 ){ + for( int i=0; iaVols, sizeof(DWORD), POINTS_PER_BAR, pFile ); + g_aAudioTracks[0]->lstBars.push_back( pWvBar ); + + TBar* pBar = new TBar; + fread( &pBar->aChords, sizeof(TBarChords), 1, pFile ); + + pBar->iBarKey = iMelodyKey; + lstBars.push_back( pBar ); + } + + AudioEffectsDefault( 0, false ); + g_aAudioTracks[0]->volume = (int)(fAudioVolume * 100); + } + + // g_lstRawStages + vector lstStages; + fread( &num, sizeof(int), 1, pFile ); + for( int i=0; i0 ){ + pAudioTrack = new TAudioTrack; + pAudioTrack->volume = (int)(fAudioVolume * 100); + g_aAudioTracks.push_back( pAudioTrack ); + g_aAudioTracks[0]->Hide();// = true; + + for( int i=0; iiSegType = iSegType; + pStage->iSegNo = iSegNo; + pStage->iSegKey = iMelodyKey; + + if( pStage->iSegType>=SEGTYPE_INTRO ){ + if( pStage->iSegNo % 2 ) + pStage->iSegNo = pStage->iSegNo/2 + 4; + else + pStage->iSegNo /= 2; + } + + int count; + fread( &count, sizeof(int), 1, pFile ); + for( int j=0; jaVols, sizeof(DWORD), POINTS_PER_BAR, pFile ); + pAudioTrack->lstBars.push_back( pWvBar ); + + TBar* pBar = new TBar; + fread( &pBar->aChords, sizeof(TBarChords), 1, pFile ); + + pBar->iBarKey = iMelodyKey; + pStage->aBars.push_back( pBar ); + } + + fread( &count, sizeof(int), 1, pFile ); + for( int j=0; jiStyleId = trkOld.iStyleId; + pTrack->iStyleLoc = trkOld.iStyleLoc; + pTrack->iSegNo = trkOld.iSegNo; + if( pStage->iSegType>=SEGTYPE_INTRO ){ + if( pTrack->iSegNo % 2 ) + pTrack->iSegNo = pTrack->iSegNo/2 + 4; + else + pTrack->iSegNo /= 2; + } + pTrack->iChanNo = trkOld.iChanNo; + pTrack->iChanSpec = trkOld.iChanSpec; + pTrack->iProg = trkOld.iProg; + pTrack->nVol = trkOld.nVol; + + pStage->aTracks.push_back( pTrack ); + } + + g_lstOpusStages.push_back( pStage ); + } + + g_Opus.CountBars(); + } + + //g_aAudioEffects + for( int i=0; i=pAudioTrack->lstBars.size()-1 ){ + int iType = g_aAudioEffectTypes[i]; + + if( iType!=FX_PITCH ){ + int nSize = GetFxParamNum( iType ); + float* pParams = new float[nSize]; + int iPreset = pAE.iPreset; + + int nPresetCount = GetFxPresetCount( iType ); + + if( pAE.bOn ) + memcpy( pParams, pAE.aParams, sizeof(float)*nSize ); + else{ + if( iPreset>=nPresetCount ) + iPreset = 0; + + GetFxPreset( iType, iPreset, pParams ); + } + + TAudioFx* pFx = new TAudioFx( iType, iPreset, pParams, nSize, !pAE.bOn ); + pAudioTrack->lstFxs.push_back( pFx ); + } + } + else{ + iError |= E_PROJ_INVALIDFX; + } + } + } + + //AudStylePanelϢ + //PreStylePanel/UseStylePanelϢ + TStyleItem *pPreStyle = NULL, + *pUseStyle = NULL; + bool bInvalid = false; + + for( int n=0; n<2; n++ ){ + int idStyItemStyle; + TStyleItem*& pSty = n==0 ? pPreStyle : pUseStyle; + pSty = new TStyleItem; + + fread( &pSty->iType, sizeof(char), 1, pFile ); + fread( &idStyItemStyle, sizeof(UINT), 1, pFile ); + + fread( &pSty->nBars, sizeof(int), 1, pFile ); + int nSegNum[4]; + fread( nSegNum, sizeof(int), 4, pFile ); + for( int i=0; i<4; i++ ){ + pSty->nSegNum[i] = nSegNum[i]; + } + + DWORD iOpt; + fread( &num, sizeof(int), 1, pFile ); + for( int i=0; i0 ) + pStage = g_lstOpusStages[i]; + + int idSegItemStyle; + TSegmentItem* pSeg = new TSegmentItem; + pSeg->bAutoSpec = n==0; + + fread( &pSeg->iType, sizeof(char), 1, pFile ); + fread( &idSegItemStyle, sizeof(UINT), 1, pFile ); + + fread( &pSeg->iSegType, sizeof(char), 1, pFile ); + fread( &pSeg->iSegNo, sizeof(char), 1, pFile ); + if( pSeg->iSegType>=SEGTYPE_INTRO ){ + if( pSeg->iSegNo % 2 ) + pSeg->iSegNo = pSeg->iSegNo/2 + 4; + else + pSeg->iSegNo /= 2; + } + + fread( &pSeg->iInd, sizeof(char), 1, pFile ); + fread( &pSeg->volume, sizeof(char), 1, pFile ); + fread( &pSeg->nBars, sizeof(int), 1, pFile ); + fread( pSeg->aChanUsed, sizeof(bool), 16, pFile ); + + if( n>0 ){ + pStage = g_lstOpusStages[i]; + pStage->nVol = pSeg->volume; + } + + //Options + int count; + fread( &count, sizeof(int), 1, pFile ); + for( int j=0; jaOptions->Add( (void*)OPT_DEL ); + pSeg->aOptions->Add( (void*)OPT_VOL ); + if( pSeg->iTypeaOptions->Add( (void*)OPT_BRUSH ); + + TTrackItem* pTrkPrev = NULL; + fread( &count, sizeof(int), 1, pFile ); + for( int j=0; jiType, sizeof(char), 1, pFile ); + fread( &idTrkItemStyle, sizeof(UINT), 1, pFile ); + + char iSegType; + fread( &iSegType, sizeof(char), 1, pFile ); + // fread( &pTrk->iSegType, sizeof(char), 1, pFile ); + fread( &pTrack->iSegNo, sizeof(char), 1, pFile ); + if( iSegType>=SEGTYPE_INTRO ){ + if( pTrack->iSegNo % 2 ) + pTrack->iSegNo = pTrack->iSegNo/2 + 4; + else + pTrack->iSegNo /= 2; + } + fread( &pTrack->iChanNo, sizeof(char), 1, pFile ); + fread( &pTrack->iChanSpec, sizeof(char), 1, pFile ); + fread( &pTrack->iProg, sizeof(char), 1, pFile ); + fread( &pTrack->iProgOrig, sizeof(char), 1, pFile ); + fread( &pTrack->nVol, sizeof(char), 1, pFile ); + fread( &pTrack->nVolOrig, sizeof(char), 1, pFile ); + + bool bMute = false; + fread( &bMute, sizeof(bool), 1, pFile ); + if( bMute ) + pTrack->nVol |= 0x80; + + int cn; + fread( &cn, sizeof(int), 1, pFile ); + for( int k=0; kpStyle = CheckStyle( 0, idTrkItemStyle ); + if( pTrk->pStyle ){ + pTrk->aOptions->Add( (void*)OPT_DEL ); + pTrk->aOptions->Add( (void*)OPT_VOL ); + + if( pSeg->iSegType<=SEGTYPE_FILL ) + pTrk->aOptions->Add( (void*)OPT_TEXTURE ); + + if( n==0 ){ + pTrk->aOptions->Add( (void*)OPT_FONTPROG ); + + pTrack->iStyleLoc = 0; + pTrack->iStyleId = idTrkItemStyle; + pTrk->pTrack = pTrack; + pTrk->bOwnTrack = true; + } + else if( pStage ){ + TTrack* pTrackSet = pStage->aTracks[j]; + pTrackSet->iProgOrig = pTrack->iProgOrig; + pTrackSet->nVolOrig = pTrack->nVolOrig; + pTrackSet->nVol = pTrack->nVol; + + pTrk->pTrack = pTrackSet; + delete pTrack; + } + + pTrk->up = pSeg; + if( pTrkPrev ){ + pTrk->prev = pTrkPrev; + pTrkPrev->next = pTrk; + } + pTrkPrev = pTrk; + + pSeg->aItems->Add( pTrk ); + } + else{ + delete pTrk; + delete pTrack; + delete pSeg; + + if( n>0 ){ + bInvalid = true; + goto STYLE_LOAD_OVER; + } + } + } + + if( pSeg->nBars==0 && pSeg->iType>=SEGTYPE_INTRO ){ + TPROSTYLE* info = CheckStyle( 0, idSegItemStyle ); + if( !info && pSeg->aItems->Count>0 ){ + info = ((TTrackItem*)pSeg->aItems->Items[0])->pStyle; + } + + if( info ){ + if( pSeg->iSegType==SEGTYPE_INTRO ) + pSeg->nBars = info->pOrigin->detail.aIntroBars[pSeg->iSegNo]; + else if( pSeg->iSegType==SEGTYPE_ENDING ) + pSeg->nBars = info->pOrigin->detail.aEndingBars[pSeg->iSegNo]; + } + } + + if( n==0 && pSeg->aItems->Count==0 ){ + delete pSeg; + } + else{ + pSeg->up = pSty; + if( pSegPrev ){ + pSeg->prev = pSegPrev; + pSegPrev->next = pSeg; + } + pSegPrev = pSeg; + + pSty->aItems->Add( pSeg ); + } + } + + TPROSTYLE* info = CheckStyle( 0, idStyItemStyle ); + if( !info && pSty->aItems->Count>0 ){ + for( int i=0; iaItems->Count; i++ ){ + TSegmentItem* pSeg = (TSegmentItem*)pSty->aItems->Items[i]; + + if( pSeg->aItems->Count>0 ){ + info = ((TTrackItem*)pSeg->aItems->Items[0])->pStyle; + break; + } + } + } + + if( info && ( pSty->aItems->Count>0 || n>0 ) ){ + pSty->pStyle = info; + + if( n==0 ){ + pSty->aOptions->Add((void*)OPT_FONTPROG); + pSty->aOptions->Add((void*)OPT_SAVE); + } + } + else{ + delete pSty; + pSty = NULL; + + if( n>0 ){ + bInvalid = true; + goto STYLE_LOAD_OVER; + } + } + } + +STYLE_LOAD_OVER: + if( bInvalid ){ + if( pPreStyle ){ + delete pPreStyle; + } + + if( pUseStyle ){ + delete pUseStyle; + } + + return E_PROJ_INVALIDSTYLE; + } + else{ + g_pPreStyle = pPreStyle; + g_pUseStyle = pUseStyle; + } + + g_Theme.Build( lstBars, lstStages ); + + //Ԥ + fread( &g_iPreStage, sizeof(int), 1, pFile ); + //ͼģʽ + int iViewMode; + fread( &iViewMode, sizeof(int), 1, pFile ); + + //Ԥ蹤 + if( wMinVersion>=3 ) + fread( &g_bPredefine, sizeof(bool), 1, pFile ); + + return iError; +} + +int LoadVersion2( FILE *pFile, DWORD dwVersion, HWND hNotifyWnd, int iLoadMode ) +{ + int nSize, iMelodyKey, iMelodyTimeSignature, nMelodyTempo, nMelodyBarNum, + nMelodyStageNum, nComposeStageNum, nCompleteBarNum; + char strFont[MAX_PATH]; + string strStyleName; + bool bUseful; + int iError = E_PROJ_NOERROR; + WORD wMinVersion = LOWORD( dwVersion ); + + // Ҫ + UINT idStyle = 0, iStyleType; + fread(&iStyleType, sizeof(DWORD), 1, pFile); // + fread(&idStyle, sizeof(UINT), 1, pFile); + + if( wMinVersion!=3 ){ + fread(&g_bMidiMelody, sizeof(bool), 1, pFile); + } + + fread(&iMelodyTimeSignature, sizeof(int), 1, pFile); + fread(&nMelodyTempo, sizeof(int), 1, pFile); + fread(&iMelodyKey, sizeof(int), 1, pFile); + + if( g_iMelodyTimeSignature!=iMelodyTimeSignature ){ + SetMelodyTS(iMelodyTimeSignature); + SelectStyle(); + PostMessage( Application->MainFormHandle, UM_CHANGETT, true, -1 ); + } + + TPROSTYLE* pStyle = CheckStyle( 0, idStyle );//GetStyleInfo( 0, idStyle ); + if( !pStyle ) + return E_PROJ_INVALIDSTYLE; + + SetMelodyTempo(nMelodyTempo); + g_iMelodyKey = iMelodyKey; + + // ȡɫļ + fread(&nSize, sizeof(int), 1, pFile); + + if( nSize>0 ){ + fread(strFont, sizeof(char), nSize, pFile); + strcpy( g_strSoundFont, strFont ); + } + + // ֵ + fread(&g_fRecordVolume, sizeof(float), 1, pFile); + if( g_fRecordVolume>1 ) g_fRecordVolume = 1; + if( g_fRecordVolume<0 ) g_fRecordVolume = 0; + + fread(&g_fSpeakerVolume, sizeof(float), 1, pFile); + if( g_fSpeakerVolume>1 ) g_fSpeakerVolume= 1; + if( g_fSpeakerVolume<0 ) g_fSpeakerVolume= 0; + + float fAudioVolume = 1; + fread(&fAudioVolume, sizeof(float), 1, pFile); + if( fAudioVolume>1 ) fAudioVolume = 1; + if( fAudioVolume<0 ) fAudioVolume = 0; + + fread(&g_fMusicVolume, sizeof(float), 1, pFile); + if( g_fMusicVolume>1 ) g_fMusicVolume = 1; + if( g_fMusicVolume<0 ) g_fMusicVolume = 0; + + f_MM_SetStreamVolume( 0, g_fSpeakerVolume ); + f_MM_SetStreamVolume( 1, g_fRecordVolume ); + f_MM_SetStreamVolume( 4, g_fMusicVolume ); + + // ʼ + TBarList lstBars; + vector lstStages; + + // g_lstRawBars + int num; + fread( &num, sizeof(int), 1, pFile ); + if( num>0 ){ + for( int i=0; iaChords.iKey[0] = pBar->aChords.iKey[1] + = (iChords[0] / 4 + iMelodyKey) % KEY_NUM; + pBar->aChords.iType[0] = pBar->aChords.iType[1] = iChords[0] % 4; + + if( iChords[1]==-1 ){ + pBar->aChords.iKey[2] = pBar->aChords.iKey[3] = pBar->aChords.iKey[0]; + pBar->aChords.iType[2] = pBar->aChords.iType[3] = pBar->aChords.iType[0]; + } + else{ + pBar->aChords.iKey[2] = pBar->aChords.iKey[3] + = (iChords[1] / 4 + iMelodyKey) % KEY_NUM;; + pBar->aChords.iType[2] = pBar->aChords.iType[3] = iChords[1] % 4; + } + + pBar->iBarKey = iMelodyKey; + lstBars.push_back( pBar ); + + fread(&iFill, sizeof(char), 1, pFile); + + TWaveBar* pWvBar = new TWaveBar; + + if( iLoadMode!=PROJ_MODE_UPLOAD || wMinVersion<8 ) + fread( pWvBar->aVols, sizeof(DWORD), POINTS_PER_BAR, pFile ); + + if( iLoadMode==PROJ_MODE_UPLOAD ) + delete pWvBar; + else + g_aAudioTracks[0]->lstBars.push_back( pWvBar ); + } + + AudioEffectsDefault( 0, false ); + g_aAudioTracks[0]->volume = (int)(fAudioVolume * 100); + } + + // g_lstRawStages + fread( &num, sizeof(int), 1, pFile ); + for( int i=0; i0 ){ + if( iLoadMode!=PROJ_MODE_UPLOAD ){ + pAudioTrack = new TAudioTrack; + pAudioTrack->volume = (int)(fAudioVolume * 100); + g_aAudioTracks.push_back( pAudioTrack ); + g_aAudioTracks[0]->Hide();// = true; + } + + for( int i=0; i lstSegType, lstSegNo, lstSegBars; + int iMelodyStage, nStageBars, iVar, idStageStyle; + + fread( &iMelodyStage, sizeof(int), 1, pFile ); + fread( &nStageBars, sizeof(int), 1, pFile ); + fread( &iVar, sizeof(int), 1, pFile ); + fread( &idStageStyle, sizeof(UINT), 1, pFile ); + + vector lstFill; + int nFillNum; + fread(&nFillNum, sizeof(int), 1, pFile); + for (int j = 0; j < nFillNum; j++) { + DWORD dwFill; + fread(&dwFill, sizeof(DWORD), 1, pFile); + lstFill.push_back( dwFill ); + } + + TPROSTYLE* pStageStyle = CheckStyle( 0, idStageStyle ); + + if( !pStageStyle ){ + idStageStyle = idStyle; + pStageStyle = pStyle; + + iError |= E_PROJ_INVALSTAGESTYLE; + } + + int iBarStart = 0; + if( iMelodyStage<0x100 ){ // + if( iMelodyStage>0 ) + iBarStart = lstStages[iMelodyStage-1] + 1; + + if( nFillNum>0 ){ + int iBar = 0; + for( int j=0; jiBar ){ + lstSegType.push_back( SEGTYPE_VAR ); + lstSegNo.push_back( iVar ); + lstSegBars.push_back( iPos-iBar ); + } + + lstSegType.push_back( SEGTYPE_FILL ); + lstSegNo.push_back( iNo ); + lstSegBars.push_back( 1 ); + + iBar = iPos+1; + } + } + else{ + lstSegType.push_back( SEGTYPE_VAR ); + lstSegNo.push_back( iVar ); + lstSegBars.push_back( nStageBars ); + } + } + else if( iMelodyStage<0x110 ){ //ǰ + lstSegType.push_back( SEGTYPE_INTRO ); + int iNo = iMelodyStage - 0x100; + lstSegNo.push_back( iNo ); + lstSegBars.push_back( nStageBars ); + + } + else{ //β + lstSegType.push_back( SEGTYPE_ENDING ); + int iNo = iMelodyStage - 0x110; + lstSegNo.push_back( iNo ); + lstSegBars.push_back( nStageBars ); + } + + for( int k=0; kiSegKey = iMelodyKey; + pStage->iSegType = lstSegType[k]; + pStage->iSegNo = lstSegNo[k]; + pStage->nVol = 100; + + for( int j=0; jaBars.push_back( pBar ); + + TWaveBar* pWvBar = NULL; + if( pAudioTrack ){ + pWvBar = new TWaveBar; + pAudioTrack->lstBars.push_back( pWvBar ); + } + + pBar->iBarKey = iMelodyKey; + if( pStage->iSegTypelstBars[iBarStart], + sizeof(DWORD)*POINTS_PER_BAR ); + + iBarStart++; + } + } + + //ǰ//βС + if( pStage->iSegTypeaBars[0]->aChords.iType[0]; + if( cType==1 || cType==3 ){ + for( int j=g_lstOpusStages.size()-1; j>=0; j-- ){ + if( g_lstOpusStages[j]->iSegType==SEGTYPE_INTRO ){ + if( g_lstOpusStages[j]->iSegNo<4 ){ + g_lstOpusStages[j]->iSegNo += 4; + + for( int t=0; taTracks.size(); t++ ){ + TTrack* pTrk = g_lstOpusStages[j]->aTracks[t]; + pTrk->iSegNo += 4; + } + } + } + else{ + break; + } + } + } + } + else if( !g_lstOpusStages.empty() ){ + if( g_lstOpusStages.back()->iSegTypeaBars[0]->aChords.iType[0]; + if( cType==1 || cType==3 ){ + pStage->iSegNo += 4; + } + } + else if( g_lstOpusStages.back()->iSegNo>=4 ) + pStage->iSegNo += 4; + } + + TSTYLEDETAIL& detail = pStageStyle->pOrigin->detail; + for( int j=0; detail.tracks[lstSegType[k]][lstSegNo[k]][j].no>=0; j++ ){ + TTrack* pTrack = new TTrack; + pTrack->iStyleId = idStageStyle; + pTrack->iSegNo = pStage->iSegNo; + pTrack->iChanNo = pTrack->iChanSpec + = detail.tracks[lstSegType[k]][lstSegNo[k]][j].no; + pTrack->iProg = pTrack->iProgOrig + = detail.tracks[lstSegType[k]][lstSegNo[k]][j].prog; + pTrack->nVol = pTrack->nVolOrig + = detail.tracks[lstSegType[k]][lstSegNo[k]][j].vol; + + pStage->aTracks.push_back( pTrack ); + } + + + g_lstOpusStages.push_back( pStage ); + } + } + + g_Opus.CountBars(); + } + + // ȫ¼Ϣ + int iComposeKey; + fread(&iComposeKey, sizeof(int), 1, pFile); + + // ȫС + fread(&nCompleteBarNum, sizeof(int), 1, pFile); + if( nCompleteBarNum ){ + for( int i=0; ilstBars[i] : &barWave; + fread( pWvBar->aVols, sizeof(DWORD), POINTS_PER_BAR, pFile ); + } + } + + for( int n=0; n<2; n++ ){ + TStyleItem* pSty = new TStyleItem; + + pSty->pStyle = pStyle; + + if( n==0 ){ + pSty->aOptions->Add((void*)OPT_FONTPROG); + pSty->aOptions->Add((void*)OPT_SAVE); + g_pPreStyle = pSty; + } + else{ + g_pUseStyle = pSty; + } + } + + g_Theme.Build( lstBars, lstStages ); + + // ҳ + int iPage; + fread(&iPage, sizeof(int), 1, pFile); + /* if( iPage==2 ) + g_iViewMode = 2; + else if( iPage==1 || iPage==4 ) + g_iViewMode = 1; + else + g_iViewMode = 3; +*/ + g_iPreStage = 3; + + //Ч + int nFxNum; + fread( &nFxNum, sizeof(int), 1, pFile ); + if( nFxNum>0 ){ + int aAudioEffects[11]; + fread( aAudioEffects, sizeof(int), nFxNum, pFile ); + + if( pAudioTrack ){ + for( int i=0; i0 ){ + int iType = g_aAudioEffectTypes[i]; + + if( iType!=FX_PITCH ){ + int nSize = GetFxParamNum( iType ); + float* pParams = new float[nSize]; + int iPreset = aAudioEffects[i] - 1; + + GetFxPreset( iType, iPreset, pParams ); + + TAudioFx* pFx = new TAudioFx( iType, iPreset, pParams, nSize ); + pAudioTrack->lstFxs.push_back( pFx ); + } + } + } + } + } + else if( pAudioTrack ){ + AudioEffectsDefault( 1, false ); + } + + //Ԥ蹤 + if( wMinVersion>=5 ) + fread( &g_bPredefine, sizeof(bool), 1, pFile ); + + return iError; +} + +BOOL HasProjectModified( bool bAuto ) +{ + if( g_Undo.GetLastLite()!=(bAuto ? u_pAutoLite : u_pProjLite)) + return TRUE; + + if( bAuto || g_Theme.Empty() ) + return FALSE; + + if( g_bProjStylePaid || g_fRecordVolume_SVD != g_fRecordVolume + || g_fSpeakerVolume_SVD != g_fSpeakerVolume + || g_iMelodyKey_SVD != g_iMelodyKey + || g_nMelodyTempo_SVD != g_nMelodyTempo + //|| g_strFontFile_SVD.compare(g_strFontFile) ){ + || strcmp( g_strSoundFont_SVD, g_strSoundFont )){ + return TRUE; + } + + return FALSE; +} + +void ClearSVDVars() { + //g_strFontFile_SVD.clear(); + g_strSoundFont_SVD[0] = 0; + g_iMelodyKey_SVD = -1; + g_nMelodyTempo_SVD = g_nMelodyTempo; + g_fRecordVolume_SVD = g_fRecordVolume; + g_fSpeakerVolume_SVD = g_fSpeakerVolume; +} + +void UpdateSVDVars() +{ + ClearSVDVars(); + + // ҪϢ + g_iMelodyKey_SVD = g_iMelodyKey; + g_nMelodyTempo_SVD = g_nMelodyTempo; + + // ɫ + //g_strFontFile_SVD = g_strFontFile; + strcpy( g_strSoundFont_SVD, g_strSoundFont ); + + // ֵ + g_fRecordVolume_SVD = g_fRecordVolume; + g_fSpeakerVolume_SVD = g_fSpeakerVolume; +} + +int CanSaveProj() +{ +// int ret = E_PROJ_NOERROR; +/* + bool bHasUnlocalStyle = false; + for( int i=0; !bHasUnlocalStyle && iaTracks.size(); j++ ){ + if( pStage->aTracks[j]->iStyleLoc==(UINT)-1 + && pStage->aTracks[j]->iStyleId!=0 ){ + bHasUnlocalStyle = true; + break; + } + } + } + + if( bHasUnlocalStyle ) + return E_PROJ_NOLOCALTEMPSTYLE; +*/ + if( g_pUseStyle && (!g_pUseStyle->pStyle || GetStyleInfo( -1, 0 )) ) + return E_PROJ_UNSAVEDTEMPSTYLE; + + + return E_PROJ_NOERROR; +} + +void ClearAutoProj() +{ + SetAutoSaveReg( false ); + + if( FileExists( g_strAutoProjName.c_str() ) ) + DeleteFile( g_strAutoProjName.c_str() ); + + DebugPrint("delete auto Save project file...."); +} + +void SaveAutoProj() +{ + if( HasProjectModified(true) && CanSaveProj()==E_PROJ_NOERROR ){ + DebugPrint("auto Save project...."); + AnsiString strProjectName = g_strAutoProjName.c_str(); + + SaveProject( strProjectName.c_str() ); + } +} + diff --git a/Project.h b/Project.h new file mode 100644 index 0000000..9bb3aa1 --- /dev/null +++ b/Project.h @@ -0,0 +1,66 @@ +//--------------------------------------------------------------------------- + +#ifndef ProjectH +#define ProjectH +//--------------------------------------------------------------------------- +#define E_ERROR_BASE 0x80000000 + +#define E_PROJ_NOERROR 0x00 +#define E_PROJ_INVALIDFONT 0x01 +#define E_PROJ_INVALSTAGESTYLE 0x02 +#define E_PROJ_INVALIDFX 0x04 +#define E_PROJ_FATALERROR 0x100 +#define E_PROJ_FILENOTEXIST 0x103 //ļ +#define E_PROJ_EARLERVERSION 0x104 //ڰ汾 +#define E_PROJ_LATERVERSION 0x105 //ڰ汾 +#define E_PROJ_INVALIDVERSION 0x106 //޷ʶİ汾 +#define E_PROJ_FILECRUPT 0x107 //ļ +#define E_PROJ_CANTLOADAUDIO 0x108 //Ƶʧ +#define E_PROJ_INVALIDSTYLE 0x109 //Чķ +#define E_PROJ_NOAUTHURITY 0x110 //δ¼ʹñط +#define E_PROJ_UNSAVEDTEMPSTYLE 0x200 //δʱ + +#define PROJ_MODE_AUTO 0 +#define PROJ_MODE_NORMAL 1 +#define PROJ_MODE_UPLOAD 2 + +extern const DWORD g_dwProjectVersion; + +BOOL SaveProject( LPCSTR strProjectName, int iSaveMode=0, HWND hNotifyWnd=NULL ); +BOOL LoadProject( LPCSTR strProjectName, HWND hNotifyWnd ); +int LoadVersion2( FILE *pFile, DWORD dwVersion, HWND hNotifyWnd, int iLoadMode ); +int LoadVersion3( FILE *pFile, DWORD dwVersion, HWND hNotifyWnd ); +int LoadVersion4( FILE *pFile, DWORD dwVersion, HWND hNotifyWnd ); +int LoadVersion5( FILE *pFile, DWORD dwVersion, HWND hNotifyWnd, int* iContentView ); + +void ClearSVDVars(); +void UpdateSVDVars(); +void UpdateRecentProject(wstring wstrProj);//б +BOOL HasProjectModified( bool bAuto=false ); +void ClearAutoProj(); +void SaveAutoProj(); +int CanSaveProj(); + +void ClearProjStyleMap(); +TPROSTYLE* CheckStyle( int idLoc, int idStyle ); + +void SaveOpusStages( TOpusStageList& lstStages, LOCSEGLIST& lstLocSeg, FILE* pFile ); +int LoadOpusStages( TOpusStageList& lstStages, STYLELIST& aUnsolvedStyles, FILE* pFile, DWORD dwVersion ); + +extern const char *g_strProjError[11]; +extern vector g_lstRecentProject; //Ĺļ +extern HANDLE g_hProjectEvent; //ļд +extern wstring g_strLastProjSavePath, // ϴα湤· + g_strProjectName, // ļ + g_strAutoProjName; // Զļ + //g_strFontFile_SVD; // ɫļ(ѱ) + +extern char g_strSoundFont_SVD[]; //ȫɫ(ѱ) + +extern int g_iMelodyKey_SVD, // ɵ(ѱ) + g_nMelodyTempo_SVD; // ٶ(ѱ) + +extern float g_fRecordVolume_SVD, //¼(ѱ) + g_fSpeakerVolume_SVD; //(ѱ) + +#endif diff --git a/QRcodePanel.cpp b/QRcodePanel.cpp new file mode 100644 index 0000000..0ed4066 --- /dev/null +++ b/QRcodePanel.cpp @@ -0,0 +1,128 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop + +#include "GlobalUnit.h" +#include "QRcodePanel.h" + +#define LEN_BKG_EXTERNAL_ROUND 1 +#define LEN_BKG_EXTERNAL_FRMAE 1 +const COLORREF CLR_BKG_EXTERNAL_ROUND = RGB(107, 115, 126), + CLR_BKG_EXTERNAL_FRMAE = RGB(145, 156, 170), + CLR_BKG_INTERNAL = RGB(255, 255, 255 ); +//--------------------------------------------------------------------------- +#pragma package(smart_init) + +__fastcall TQRcodePanel::TQRcodePanel(TComponent* AOwner, String strTitle ) + : TPanel(AOwner) +{ + m_strTitle = strTitle; + m_nQRwidth = 0; + m_pQRdata = NULL; +} +//--------------------------------------------------------------------------- + +__fastcall TQRcodePanel::~TQRcodePanel() +{ + +} +//--------------------------------------------------------------------------- + +void __fastcall TQRcodePanel::CreateWnd(void) +{ + Vcl::Extctrls::TPanel::CreateWnd(); +} +//--------------------------------------------------------------------------- + +void __fastcall TQRcodePanel::WMEraseBkgnd(Winapi::Messages::TWMEraseBkgnd &Message) +{ + TRect rect = GetClientRect(); + + TCanvas* tempCanvas = new TCanvas; + tempCanvas->Handle = Message.DC; + + TRect rectFill = rect; + rectFill.Top = rectFill.Top + LEN_BKG_EXTERNAL_ROUND; + rectFill.Left = rectFill.Left + LEN_BKG_EXTERNAL_ROUND; + rectFill.Right = rectFill.Right - LEN_BKG_EXTERNAL_ROUND; + rectFill.Bottom = rectFill.Bottom - LEN_BKG_EXTERNAL_ROUND; + + tempCanvas->Brush->Color = CLR_BKG_INTERNAL; + + tempCanvas->FillRect( rectFill ); + + //==========Բ + int X,Y; + // + Y = 0; + X = 0; + tempCanvas->Pixels[X][Y] = CLR_BKG_EXTERNAL_ROUND; + X = Width - LEN_BKG_EXTERNAL_ROUND; + tempCanvas->Pixels[X][Y] = CLR_BKG_EXTERNAL_ROUND; + + // + Y = Height - LEN_BKG_EXTERNAL_ROUND; + + X = 0; + tempCanvas->Pixels[X][Y] = CLR_BKG_EXTERNAL_ROUND; + X = Width - LEN_BKG_EXTERNAL_ROUND; + tempCanvas->Pixels[X][Y] = CLR_BKG_EXTERNAL_ROUND; + + //===========߿ + tempCanvas->Pen->Color = CLR_BKG_EXTERNAL_FRMAE; + + tempCanvas->MoveTo( LEN_BKG_EXTERNAL_FRMAE, 0 ); + tempCanvas->LineTo( Width-LEN_BKG_EXTERNAL_FRMAE, 0 ); + + tempCanvas->MoveTo( LEN_BKG_EXTERNAL_FRMAE, Height-LEN_BKG_EXTERNAL_FRMAE ); + tempCanvas->LineTo( Width-LEN_BKG_EXTERNAL_FRMAE, Height-LEN_BKG_EXTERNAL_FRMAE ); + + tempCanvas->MoveTo( 0, LEN_BKG_EXTERNAL_FRMAE ); + tempCanvas->LineTo( 0, Height-LEN_BKG_EXTERNAL_FRMAE ); + + tempCanvas->MoveTo( Width-LEN_BKG_EXTERNAL_FRMAE, LEN_BKG_EXTERNAL_FRMAE ); + tempCanvas->LineTo( Width-LEN_BKG_EXTERNAL_FRMAE, Height-LEN_BKG_EXTERNAL_FRMAE ); + + //Ʊ + tempCanvas->Font->Size = g_szFont9; + tempCanvas->Font->Color = clBlack; + + TSize size = tempCanvas->TextExtent( m_strTitle ); + int x = (Width - size.Width) / 2, + y = Height - 5 - size.Height; + + tempCanvas->TextOut( x, y, m_strTitle ); + + delete tempCanvas; + + Message.Result = true; +} +//--------------------------------------------------------------------------- + +void __fastcall TQRcodePanel::Paint() +{ + int scale = (Width - 16) / m_nQRwidth; + + int left = ( Width - m_nQRwidth * scale ) / 2, + top = ( Height - 16 - m_nQRwidth * scale ) / 2; + + unsigned char *pSrcData = m_pQRdata; + + for( int i=0; iPixels[x+n][y+m] = clBlack; + } + } + } + pSrcData++; + } + } +} +//--------------------------------------------------------------------------- + diff --git a/QRcodePanel.h b/QRcodePanel.h new file mode 100644 index 0000000..9cdc54b --- /dev/null +++ b/QRcodePanel.h @@ -0,0 +1,34 @@ +//--------------------------------------------------------------------------- + +#ifndef QRcodePanelH +#define QRcodePanelH + +//--------------------------------------------------------------------------- + +class TQRcodePanel : public Vcl::Extctrls::TPanel +{ +private: + String m_strTitle; + int m_nQRwidth; + unsigned char * m_pQRdata; +protected: + virtual void __fastcall CreateWnd(); + virtual void __fastcall Paint(); + + MESSAGE void __fastcall WMEraseBkgnd(Winapi::Messages::TWMEraseBkgnd &Message); + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(WM_ERASEBKGND, TWMEraseBkgnd, WMEraseBkgnd) + END_MESSAGE_MAP(Vcl::Extctrls::TPanel) + +public: + __fastcall virtual TQRcodePanel( System::Classes::TComponent* AOwner, String strTitle ); + __fastcall ~TQRcodePanel(); + + void __fastcall SetQRData( int width, unsigned char * pData ) + { m_nQRwidth = width, m_pQRdata = pData; }; +}; + +//--------------------------------------------------------------------------- + +#endif diff --git a/RadioBtn.h b/RadioBtn.h new file mode 100644 index 0000000..a729a61 --- /dev/null +++ b/RadioBtn.h @@ -0,0 +1,55 @@ +//--------------------------------------------------------------------------- + +#ifndef RadioBtnH +#define RadioBtnH +//--------------------------------------------------------------------------- +#include +#include +#include +#include +//--------------------------------------------------------------------------- +class PACKAGE TRadioBtn :public TPanel { + +private: + + bool FChecked; + bool FEnabled; + String FCaption; + void __fastcall SetCaption(String FCaptionTmp); + void __fastcall SetFont(TFont *FFontTmp); + void __fastcall SetChecked(bool bChecked); + void __fastcall SetEnabled(bool bEnabled); + + + TLabel *m_lbCaption; + TRadioButton *m_pRaBtn; + + void __fastcall Onclicked(TObject *Sender); + void __fastcall SetCheckedSameparent(TWinControl* pCtrl); + void __fastcall SetChildBounds(); + COLORREF __fastcall TransformColor(COLORREF icolor, int nNum, bool bplus=true); + + void __fastcall MouseMoveEvent(System::TObject* Sender, System::Classes::TShiftState Shift, int X, int Y); + + virtual void __fastcall CreateWnd(); + virtual void __fastcall CreateParams(Controls::TCreateParams &Params); + virtual void __fastcall Paint(void); + + DYNAMIC void __fastcall Click(void); + MESSAGE void __fastcall WMSize(Winapi::Messages::TWMSize &Message); + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(WM_SIZE, TWMSize, WMSize) + END_MESSAGE_MAP( TPanel ) + +public: + + __fastcall TRadioBtn(System::Classes::TComponent* AOwner); + __fastcall ~TRadioBtn(void); + +__published: + __property Font = {write=SetFont}; + __property String Caption = {read=FCaption, write=SetCaption}; + __property bool Checked = {read=FChecked, write=SetChecked, default=false}; + __property bool Enabled = {read=FEnabled, write=SetEnabled, default=true}; +}; +#endif diff --git a/RegisterFormUnit.cpp b/RegisterFormUnit.cpp new file mode 100644 index 0000000..d941e11 --- /dev/null +++ b/RegisterFormUnit.cpp @@ -0,0 +1,274 @@ +//--------------------------------------------------------------------------- + +#include +#include +#include +#include "GlobalUnit.h" +#pragma hdrstop + +#include "RegisterFormUnit.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma link "GeneralDialogPanel" +#pragma link "LineEdit" +#pragma link "TextButton" +#pragma link "CKBox" +#pragma resource "*.dfm" + +TRegisterForm *RegisterForm; + +const char *g_pPattern[4] = {"^[_a-zA-Z0-9\\xA1-\\xFE\\.-]{3,16}$", + "^[_a-zA-Z0-9\\.-]+@([_a-zA-Z0-9]+\\.)+[a-zA-Z0-9]{2,3}$", + "^[\\x21-\\x7E]{3,16}$", + "^[\\x21-\\x7E]{6,16}$" + }; +//--------------------------------------------------------------------------- + +__fastcall TRegisterForm::TRegisterForm(TComponent* Owner) + : TForm(Owner) +{ + m_PasswordEdit->PasswordChar = L'*'; + m_ConfirmEdit->PasswordChar = L'*'; + + for( int i=0; iClassNameIs( TLabel::ClassName() ) ) + ((TLabel*)Components[i])->ControlStyle>>csOpaque; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TRegisterForm::FormCreate(TObject *Sender) +{ + m_DialogPanel->Font->Size = g_szFont9; + m_UserEdit->SetTextFont(g_strTxtFontName, g_szFont9); + m_PasswordEdit->SetTextFont(g_strTxtFontName, g_szFont9); + m_ConfirmEdit->SetTextFont(g_strTxtFontName, g_szFont9); + m_ckAgree->Font->Size = g_szFont9; + m_OkButton->FontSize = g_szFont11; + +// FUserName = String(g_infoUser.strUserName); +// m_UserEdit->Text = FUserName; +} +//--------------------------------------------------------------------------- + +void __fastcall TRegisterForm::FormShow(TObject *Sender) +{ + Layout(); +} +//--------------------------------------------------------------------------- + +bool __fastcall TRegisterForm::CheckInput(const char * pText, int type) +{ + bool bRet = false; + pcre *pPcre = NULL; + int nOffset = -1; + const char *pPattern = g_pPattern[type]; + const char *pErrMsg = NULL; + + if( NULL == (pPcre = pcre_compile(pPattern, 0, &pErrMsg, &nOffset, NULL)) ){ + printf("pcre_compile ErrMsg=%s\n", pErrMsg); + } + else{ + if( pcre_exec(pPcre, NULL, pText, strlen(pText), 0, NULL, 0) < 0 ){ + printf("%s doesn't match %s\n", pText, pPattern); + } + else{ + printf("%s matches %s\n", pText, pPattern); + bRet = true; + } + + pcre_free(pPcre); + } + + return bRet; +} +//--------------------------------------------------------------------------- + +void __fastcall TRegisterForm::DoCommitInfo(TObject *Sender) +{ + m_UserEdit->Text = m_UserEdit->Text.Trim(); + m_PasswordEdit->Text = m_PasswordEdit->Text.Trim(); + m_ConfirmEdit->Text = m_ConfirmEdit->Text.Trim(); + m_VerifyEdit->Text = m_VerifyEdit->Text.Trim(); + + if(m_UserEdit->Text.IsEmpty()){ + m_UserEdit->SetFocus(); + } + else if(m_PasswordEdit->Text.IsEmpty()){ + m_PasswordEdit->SetFocus(); + } + else if(m_ConfirmEdit->Text.IsEmpty()){ + m_ConfirmEdit->SetFocus(); + } + else{ + bool bCheckOk = true; + AnsiString astrUN = m_UserEdit->Text; + if( !CheckInput(astrUN.c_str(), 0) && !CheckInput(astrUN.c_str(), 1 )){ + m_UserEdit->Text = ""; + m_UserEdit->SetFocus(); + bCheckOk = false; + } + else{ + AnsiString astrPW = m_PasswordEdit->Text; + if(!CheckInput(astrPW.c_str(), 3)){ + m_PasswordEdit->Text = ""; + m_ConfirmEdit->Text = ""; + m_PasswordEdit->SetFocus(); + bCheckOk = false; + } + } + + if(m_PasswordEdit->Text.Compare(m_ConfirmEdit->Text)){ + m_ConfirmEdit->Text = ""; + m_ConfirmEdit->SetFocus(); + bCheckOk = false; + } + + if(bCheckOk){ + FUserName = m_UserEdit->Text; + FPassword = m_PasswordEdit->Text; + ModalResult = mrOk; + + string strUN = AnsiString(FUserName).c_str(); + string strPW = AnsiString(FPassword).c_str(); + string strVF = AnsiString(FVerify).c_str(); + } + } +} +//--------------------------------------------------------------------------- + +void __fastcall TRegisterForm::DoReturnLableClick(TObject *Sender) +{ +// Layout(); + ModalResult = mrCancel; +} +//--------------------------------------------------------------------------- + +void __fastcall TRegisterForm::Layout() +{ +// if( FIsLogin ){ +// m_DialogPanel->Caption = L"¼"; +// m_OkButton->Text = L"¼"; +// m_ReturnLabel->Caption = L"עû "; +// m_ReturnLabel->Hint = L"עû"; +// } +// else{ +// m_DialogPanel->Caption = L"ע"; +// m_OkButton->Text = L"ע"; +// m_ReturnLabel->Caption = L"˻ "; +// m_ReturnLabel->Hint = L"ʹ˻¼"; +// } + +// m_ckAgree->Checked = true; +// m_ConfirmEdit->Text = ""; +// m_ReturnLabel->Left = m_OkButton->Left + m_OkButton->Width - m_ReturnLabel->Width; +// +// m_ConfirmLabel->Visible = !FIsLogin; +// m_ConfirmEdit->Visible = !FIsLogin; +// m_IsAutoLogin->Visible = FIsLogin; +// m_ckAgree->Visible = !FIsLogin; +// m_lblAgreement->Visible = !FIsLogin; + + if( m_UserEdit->Text.IsEmpty() ){ + m_UserEdit->SetFocus(); + } + else if( m_VerifyEdit->Text.IsEmpty() ){ + m_ConfirmEdit->SetFocus(); + } + else if( m_PasswordEdit->Text.IsEmpty() ){ + m_PasswordEdit->SetFocus(); + } + else if( m_ConfirmEdit->Text.IsEmpty() ){ + m_ConfirmEdit->SetFocus(); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TRegisterForm::SetUserName(String Value) +{ + if(FUserName != Value){ + FUserName = Value; + m_UserEdit->Text = Value; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TRegisterForm::SetPassWord(String Value) +{ + if(FPassword != Value){ + FPassword = Value; + m_PasswordEdit->Text = Value; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TRegisterForm::SetConfirm(String Value) +{ + if(FConfirm != Value){ + FConfirm = Value; + m_ConfirmEdit->Text = Value; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TRegisterForm::SetVerify(String Value) +{ + if(FVerify != Value){ + FVerify = Value; + m_VerifyEdit->Text = Value; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TRegisterForm::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) +{ + switch( Key ){ + case VK_RETURN: + DoCommitInfo(NULL); + break; + + case VK_ESCAPE: + ModalResult = mrCancel; + break; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TRegisterForm::AgreementMouseEnter(TObject *Sender) +{ + m_lblAgreement->Font->Color = RGB(0, 255, 255); +} +//--------------------------------------------------------------------------- + +void __fastcall TRegisterForm::AgreementMouseLeave(TObject *Sender) +{ + m_lblAgreement->Font->Color = RGB(0, 200, 200); +} +//--------------------------------------------------------------------------- + +void __fastcall TRegisterForm::AgreementClick(TObject *Sender) +{ + char strURL[256]; + f_CS_GetWebPageURL( URL_USERAGREEMENT, strURL ); + ShellExecute(Handle, NULL, ((String)strURL).c_str(), NULL, NULL, SW_SHOWNORMAL); +} +//--------------------------------------------------------------------------- + +void __fastcall TRegisterForm::ReturnLabelMouseEnter(TObject *Sender) +{ + m_ReturnLabel->Font->Color = RGB(225, 235, 245); +} +//--------------------------------------------------------------------------- + +void __fastcall TRegisterForm::ReturnLabelMouseLeave(TObject *Sender) +{ + m_ReturnLabel->Font->Color = RGB(191,203,218); +} +//--------------------------------------------------------------------------- + +void __fastcall TRegisterForm::AgreeChange(TObject *Sender) +{ + m_OkButton->Enabled = m_ckAgree->Checked; +} +//--------------------------------------------------------------------------- + diff --git a/RegisterFormUnit.dfm b/RegisterFormUnit.dfm new file mode 100644 index 0000000..1b884dc --- /dev/null +++ b/RegisterFormUnit.dfm @@ -0,0 +1,241 @@ +object RegisterForm: TRegisterForm + Left = 0 + Top = 0 + ParentCustomHint = False + BorderStyle = bsNone + Caption = 'MainForm' + ClientHeight = 235 + ClientWidth = 377 + Color = 5064257 + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + KeyPreview = True + Position = poMainFormCenter + Scaled = False + OnCreate = FormCreate + OnKeyDown = FormKeyDown + OnShow = FormShow + TextHeight = 13 + object m_DialogPanel: TGeneralDialogPanel + Left = 0 + Top = 0 + Width = 377 + Height = 235 + Align = alClient + Caption = #27880#20876 + Color = 5064257 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentBackground = False + ParentFont = False + TabOrder = 0 + ExplicitHeight = 222 + object m_ReturnLabel: TLabel + Left = 289 + Top = 199 + Width = 60 + Height = 19 + Cursor = crHandPoint + Hint = #28857#20987#27880#20876#26032#29992#25143 + ParentCustomHint = False + Alignment = taCenter + Caption = #24050#26377#36134#25143 + Font.Charset = DEFAULT_CHARSET + Font.Color = 14339007 + Font.Height = -13 + Font.Name = 'Microsoft YaHei UI' + Font.Style = [fsItalic, fsUnderline] + Font.Quality = fqClearTypeNatural + ParentFont = False + ParentShowHint = False + ShowAccelChar = False + ShowHint = True + OnClick = DoReturnLableClick + OnMouseEnter = ReturnLabelMouseEnter + OnMouseLeave = ReturnLabelMouseLeave + end + object m_UserNameLabel: TLabel + Left = 22 + Top = 41 + Width = 40 + Height = 14 + Caption = #29992#25143#21517':' + Font.Charset = DEFAULT_CHARSET + Font.Color = 14339007 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentFont = False + end + object m_PasswordLabel: TLabel + Left = 198 + Top = 38 + Width = 36 + Height = 14 + Caption = #23494#30721#65306 + Font.Charset = DEFAULT_CHARSET + Font.Color = 14339007 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentFont = False + end + object m_ConfirmLabel: TLabel + Left = 198 + Top = 92 + Width = 60 + Height = 14 + Caption = #30830#35748#23494#30721#65306 + Font.Charset = DEFAULT_CHARSET + Font.Color = 14339007 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentFont = False + end + object m_OkButton: TTextButton + Left = 258 + Top = 148 + Width = 93 + Height = 36 + ParentShowHint = False + ShowHint = True + OnClick = DoCommitInfo + Text = #27880#20876 + end + object m_lblAgreement: TLabel + Left = 87 + Top = 202 + Width = 72 + Height = 14 + Cursor = crHandPoint + Hint = #28857#20987#38405#35835#29992#25143#21327#35758 + ParentCustomHint = False + Alignment = taCenter + BiDiMode = bdLeftToRight + Caption = #12298#29992#25143#21327#35758#12299 + Color = 5064257 + Font.Charset = DEFAULT_CHARSET + Font.Color = 13158400 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [fsUnderline] + ParentBiDiMode = False + ParentColor = False + ParentFont = False + ParentShowHint = False + ShowAccelChar = False + ShowHint = True + OnClick = AgreementClick + OnMouseEnter = AgreementMouseEnter + OnMouseLeave = AgreementMouseLeave + end + object m_SendButton: TTextButton + Left = 25 + Top = 148 + Width = 93 + Height = 36 + ParentShowHint = False + ShowHint = True + OnClick = DoCommitInfo + Text = #21457#36865#39564#35777#30721 + end + object m_VerifyLabel: TLabel + Left = 23 + Top = 92 + Width = 48 + Height = 14 + Caption = #39564#35777#30721#65306 + Font.Charset = DEFAULT_CHARSET + Font.Color = 14339007 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentFont = False + end + object m_ConfirmEdit: TLineEdit + Left = 198 + Top = 109 + Width = 156 + Height = 25 + ParentCustomHint = False + HintText = #35831#20877#27425#36755#20837#23494#30721 + PasswordChar = '*' + NumberMax = -1 + NumberMin = -1 + Color = 15591652 + TabOrder = 2 + end + object m_PasswordEdit: TLineEdit + Left = 198 + Top = 58 + Width = 156 + Height = 25 + ParentCustomHint = False + HintText = #35831#36755#20837#23494#30721 + PasswordChar = '*' + NumberMax = -1 + NumberMin = -1 + Color = 15591652 + TabOrder = 1 + end + object m_UserEdit: TLineEdit + Left = 21 + Top = 58 + Width = 156 + Height = 25 + ParentCustomHint = False + HintText = #35831#36755#20837#37038#31665 + NumberMax = -1 + NumberMin = -1 + Color = 15591652 + TabOrder = 0 + end + object m_ckAgree: TCKBox + Left = 22 + Top = 202 + Width = 59 + Height = 16 + Caption = #24050#38405#35835 + Ctl3D = False + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = 14339007 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentColor = True + ParentCtl3D = False + ParentDoubleBuffered = False + ParentFont = False + TabOrder = 3 + Checked = True + BoxColor = 3748912 + OnChange = AgreeChange + end + object m_VerifyEdit: TLineEdit + Left = 22 + Top = 109 + Width = 156 + Height = 25 + ParentCustomHint = False + HintText = #35831#36755#20837#39564#35777#30721 + PasswordChar = '*' + NumberMax = -1 + NumberMin = -1 + Color = 15591652 + TabOrder = 4 + end + end +end diff --git a/RegisterFormUnit.h b/RegisterFormUnit.h new file mode 100644 index 0000000..7636315 --- /dev/null +++ b/RegisterFormUnit.h @@ -0,0 +1,72 @@ +//--------------------------------------------------------------------------- + +#ifndef RegisterFormUnitH +#define RegisterFormUnitH +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include +#include "GeneralDialogPanel.h" +#include "LineEdit.h" +#include "TextButton.h" +#include "CKBox.h" +//--------------------------------------------------------------------------- +class TRegisterForm : public TForm +{ +__published: // IDE-managed Components + TGeneralDialogPanel *m_DialogPanel; + TLineEdit *m_UserEdit; + TLineEdit *m_PasswordEdit; + TLineEdit *m_ConfirmEdit; + TLineEdit *m_VerifyEdit; + TLabel *m_ReturnLabel; + TLabel *m_UserNameLabel; + TLabel *m_PasswordLabel; + TLabel *m_ConfirmLabel; + TLabel *m_VerifyLabel; + TLabel *m_lblAgreement; + TCKBox *m_ckAgree; + TTextButton *m_OkButton; + TTextButton *m_SendButton; + void __fastcall DoReturnLableClick(TObject *Sender); + void __fastcall DoCommitInfo(TObject *Sender); + void __fastcall DoAutoCheck(TObject *Sender); + void __fastcall FormCreate(TObject *Sender); + void __fastcall FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift); + void __fastcall AgreementMouseEnter(TObject *Sender); + void __fastcall AgreementMouseLeave(TObject *Sender); + void __fastcall AgreementClick(TObject *Sender); + void __fastcall ReturnLabelMouseEnter(TObject *Sender); + void __fastcall ReturnLabelMouseLeave(TObject *Sender); + void __fastcall AgreeChange(TObject *Sender); + void __fastcall FormShow(TObject *Sender); + +private: // User declarations + String FUserName, + FPassword, + FConfirm, + FVerify; + + bool __fastcall CheckInput(const char * pText, int type); + + void __fastcall Layout(); + void __fastcall SetUserName(String Value); + void __fastcall SetPassWord(String Value); + void __fastcall SetConfirm(String Value); + void __fastcall SetVerify(String Value); + +public: // User declarations + __fastcall TRegisterForm(TComponent* Owner); + +__published: + __property String UserName = {read = FUserName, write = SetUserName}; + __property String PassWord = {read = FPassword, write = SetPassWord}; + __property String Confirm = {read = FConfirm, write = SetConfirm}; + __property String Verify = {read = FVerify, write = SetVerify}; +}; +//--------------------------------------------------------------------------- +extern PACKAGE TRegisterForm *RegisterForm; +//--------------------------------------------------------------------------- +#endif diff --git a/Res/Chords/#.png b/Res/Chords/#.png new file mode 100644 index 0000000..83f6a6d Binary files /dev/null and b/Res/Chords/#.png differ diff --git a/Res/Chords/2.png b/Res/Chords/2.png new file mode 100644 index 0000000..37a3d40 Binary files /dev/null and b/Res/Chords/2.png differ diff --git a/Res/Chords/4.png b/Res/Chords/4.png new file mode 100644 index 0000000..21da953 Binary files /dev/null and b/Res/Chords/4.png differ diff --git a/Res/Chords/6.png b/Res/Chords/6.png new file mode 100644 index 0000000..b270283 Binary files /dev/null and b/Res/Chords/6.png differ diff --git a/Res/Chords/7.png b/Res/Chords/7.png new file mode 100644 index 0000000..eeec5c9 Binary files /dev/null and b/Res/Chords/7.png differ diff --git a/Res/Chords/I.png b/Res/Chords/I.png new file mode 100644 index 0000000..d4577fc Binary files /dev/null and b/Res/Chords/I.png differ diff --git a/Res/Chords/Maj.png b/Res/Chords/Maj.png new file mode 100644 index 0000000..b7d9fca Binary files /dev/null and b/Res/Chords/Maj.png differ diff --git a/Res/Chords/V.png b/Res/Chords/V.png new file mode 100644 index 0000000..5892390 Binary files /dev/null and b/Res/Chords/V.png differ diff --git a/Res/Chords/b.png b/Res/Chords/b.png new file mode 100644 index 0000000..14498ce Binary files /dev/null and b/Res/Chords/b.png differ diff --git a/Res/Chords/min.png b/Res/Chords/min.png new file mode 100644 index 0000000..e5c15ba Binary files /dev/null and b/Res/Chords/min.png differ diff --git a/Res/Chords/s.png b/Res/Chords/s.png new file mode 100644 index 0000000..825ffa8 Binary files /dev/null and b/Res/Chords/s.png differ diff --git a/Res/Content/AudioIcon.bmp b/Res/Content/AudioIcon.bmp new file mode 100644 index 0000000..623d1a4 Binary files /dev/null and b/Res/Content/AudioIcon.bmp differ diff --git a/Res/Content/MidiIcon.bmp b/Res/Content/MidiIcon.bmp new file mode 100644 index 0000000..7f1ac49 Binary files /dev/null and b/Res/Content/MidiIcon.bmp differ diff --git a/Res/Content/PlayCursor.bmp b/Res/Content/PlayCursor.bmp new file mode 100644 index 0000000..7c8bfb6 Binary files /dev/null and b/Res/Content/PlayCursor.bmp differ diff --git a/Res/Content/PlayCursor1.bmp b/Res/Content/PlayCursor1.bmp new file mode 100644 index 0000000..0a97a97 Binary files /dev/null and b/Res/Content/PlayCursor1.bmp differ diff --git a/Res/Copper/music_cover_default.bmp b/Res/Copper/music_cover_default.bmp new file mode 100644 index 0000000..527aeae Binary files /dev/null and b/Res/Copper/music_cover_default.bmp differ diff --git a/Res/Copper/round.png b/Res/Copper/round.png new file mode 100644 index 0000000..4b84f12 Binary files /dev/null and b/Res/Copper/round.png differ diff --git a/Res/Effect/Loop.png b/Res/Effect/Loop.png new file mode 100644 index 0000000..22b7579 Binary files /dev/null and b/Res/Effect/Loop.png differ diff --git a/Res/Effect/PowerOff.png b/Res/Effect/PowerOff.png new file mode 100644 index 0000000..5b93e0a Binary files /dev/null and b/Res/Effect/PowerOff.png differ diff --git a/Res/Effect/PowerOn.png b/Res/Effect/PowerOn.png new file mode 100644 index 0000000..31b09ea Binary files /dev/null and b/Res/Effect/PowerOn.png differ diff --git a/Res/Effect/Tab_SF2.png b/Res/Effect/Tab_SF2.png new file mode 100644 index 0000000..54959c3 Binary files /dev/null and b/Res/Effect/Tab_SF2.png differ diff --git a/Res/Effect/Tab_VSTi.png b/Res/Effect/Tab_VSTi.png new file mode 100644 index 0000000..5578c8b Binary files /dev/null and b/Res/Effect/Tab_VSTi.png differ diff --git a/Res/Effect/add.png b/Res/Effect/add.png new file mode 100644 index 0000000..b231afb Binary files /dev/null and b/Res/Effect/add.png differ diff --git a/Res/Effect/power_off.png b/Res/Effect/power_off.png new file mode 100644 index 0000000..14e2a7d Binary files /dev/null and b/Res/Effect/power_off.png differ diff --git a/Res/Effect/power_on.png b/Res/Effect/power_on.png new file mode 100644 index 0000000..32189aa Binary files /dev/null and b/Res/Effect/power_on.png differ diff --git a/Res/Help/help_btn.png b/Res/Help/help_btn.png new file mode 100644 index 0000000..1868c7f Binary files /dev/null and b/Res/Help/help_btn.png differ diff --git a/Res/Help/help_btn_right.png b/Res/Help/help_btn_right.png new file mode 100644 index 0000000..97f2f9c Binary files /dev/null and b/Res/Help/help_btn_right.png differ diff --git a/Res/Main/BlackPress.bmp b/Res/Main/BlackPress.bmp new file mode 100644 index 0000000..adec424 Binary files /dev/null and b/Res/Main/BlackPress.bmp differ diff --git a/Res/Main/ExtFontOff.png b/Res/Main/ExtFontOff.png new file mode 100644 index 0000000..201c9ae Binary files /dev/null and b/Res/Main/ExtFontOff.png differ diff --git a/Res/Main/ExtFontOn.png b/Res/Main/ExtFontOn.png new file mode 100644 index 0000000..8892749 Binary files /dev/null and b/Res/Main/ExtFontOn.png differ diff --git a/Res/Main/VolLevel.jpg b/Res/Main/VolLevel.jpg new file mode 100644 index 0000000..be51810 Binary files /dev/null and b/Res/Main/VolLevel.jpg differ diff --git a/Res/Main/WhiteDualPress.bmp b/Res/Main/WhiteDualPress.bmp new file mode 100644 index 0000000..7e1e7d4 Binary files /dev/null and b/Res/Main/WhiteDualPress.bmp differ diff --git a/Res/Main/WhiteLeftPress.bmp b/Res/Main/WhiteLeftPress.bmp new file mode 100644 index 0000000..ff83100 Binary files /dev/null and b/Res/Main/WhiteLeftPress.bmp differ diff --git a/Res/Main/WhiteRightPress.bmp b/Res/Main/WhiteRightPress.bmp new file mode 100644 index 0000000..29232e1 Binary files /dev/null and b/Res/Main/WhiteRightPress.bmp differ diff --git a/Res/Main/audio.png b/Res/Main/audio.png new file mode 100644 index 0000000..f0f52a9 Binary files /dev/null and b/Res/Main/audio.png differ diff --git a/Res/Main/brush.cur b/Res/Main/brush.cur new file mode 100644 index 0000000..fa34b19 Binary files /dev/null and b/Res/Main/brush.cur differ diff --git a/Res/Main/brushadd.cur b/Res/Main/brushadd.cur new file mode 100644 index 0000000..1a8e68e Binary files /dev/null and b/Res/Main/brushadd.cur differ diff --git a/Res/Main/brushno.cur b/Res/Main/brushno.cur new file mode 100644 index 0000000..76a395a Binary files /dev/null and b/Res/Main/brushno.cur differ diff --git a/Res/Main/kb.png b/Res/Main/kb.png new file mode 100644 index 0000000..095f705 Binary files /dev/null and b/Res/Main/kb.png differ diff --git a/Res/Main/keyboard.png b/Res/Main/keyboard.png new file mode 100644 index 0000000..5027bc4 Binary files /dev/null and b/Res/Main/keyboard.png differ diff --git a/Res/Main/logo.png b/Res/Main/logo.png new file mode 100644 index 0000000..077e797 Binary files /dev/null and b/Res/Main/logo.png differ diff --git a/Res/Main/mibutton.png b/Res/Main/mibutton.png new file mode 100644 index 0000000..3f782b0 Binary files /dev/null and b/Res/Main/mibutton.png differ diff --git a/Res/Main/notice.png b/Res/Main/notice.png new file mode 100644 index 0000000..800b10c Binary files /dev/null and b/Res/Main/notice.png differ diff --git a/Res/Main/open.png b/Res/Main/open.png new file mode 100644 index 0000000..f51a08c Binary files /dev/null and b/Res/Main/open.png differ diff --git a/Res/Main/pause.png b/Res/Main/pause.png new file mode 100644 index 0000000..8753167 Binary files /dev/null and b/Res/Main/pause.png differ diff --git a/Res/Main/play.png b/Res/Main/play.png new file mode 100644 index 0000000..e7b4297 Binary files /dev/null and b/Res/Main/play.png differ diff --git a/Res/Main/record.png b/Res/Main/record.png new file mode 100644 index 0000000..59c9a52 Binary files /dev/null and b/Res/Main/record.png differ diff --git a/Res/Main/save.png b/Res/Main/save.png new file mode 100644 index 0000000..c1aee46 Binary files /dev/null and b/Res/Main/save.png differ diff --git a/Res/Main/stop.png b/Res/Main/stop.png new file mode 100644 index 0000000..efe7d68 Binary files /dev/null and b/Res/Main/stop.png differ diff --git a/Res/Main/upload.png b/Res/Main/upload.png new file mode 100644 index 0000000..93f2a35 Binary files /dev/null and b/Res/Main/upload.png differ diff --git a/Res/Main/view_chord_l.png b/Res/Main/view_chord_l.png new file mode 100644 index 0000000..f5365fe Binary files /dev/null and b/Res/Main/view_chord_l.png differ diff --git a/Res/Main/view_chord_r.png b/Res/Main/view_chord_r.png new file mode 100644 index 0000000..3ca0ddd Binary files /dev/null and b/Res/Main/view_chord_r.png differ diff --git a/Res/Main/view_style_l.png b/Res/Main/view_style_l.png new file mode 100644 index 0000000..4b8d68a Binary files /dev/null and b/Res/Main/view_style_l.png differ diff --git a/Res/Main/view_style_r.png b/Res/Main/view_style_r.png new file mode 100644 index 0000000..c1bc73e Binary files /dev/null and b/Res/Main/view_style_r.png differ diff --git a/Res/Main/view_track_l.png b/Res/Main/view_track_l.png new file mode 100644 index 0000000..3ad2afb Binary files /dev/null and b/Res/Main/view_track_l.png differ diff --git a/Res/Main/view_track_r.png b/Res/Main/view_track_r.png new file mode 100644 index 0000000..03c73e9 Binary files /dev/null and b/Res/Main/view_track_r.png differ diff --git a/Res/MessageBox/ask.png b/Res/MessageBox/ask.png new file mode 100644 index 0000000..217349b Binary files /dev/null and b/Res/MessageBox/ask.png differ diff --git a/Res/MessageBox/error.png b/Res/MessageBox/error.png new file mode 100644 index 0000000..344e75c Binary files /dev/null and b/Res/MessageBox/error.png differ diff --git a/Res/MessageBox/info.png b/Res/MessageBox/info.png new file mode 100644 index 0000000..e8b71f0 Binary files /dev/null and b/Res/MessageBox/info.png differ diff --git a/Res/MessageBox/prompt.png b/Res/MessageBox/prompt.png new file mode 100644 index 0000000..af4bf7b Binary files /dev/null and b/Res/MessageBox/prompt.png differ diff --git a/Res/Progress/ProgressLeft.bmp b/Res/Progress/ProgressLeft.bmp new file mode 100644 index 0000000..6469fd5 Binary files /dev/null and b/Res/Progress/ProgressLeft.bmp differ diff --git a/Res/Progress/ProgressRight.bmp b/Res/Progress/ProgressRight.bmp new file mode 100644 index 0000000..49a19dd Binary files /dev/null and b/Res/Progress/ProgressRight.bmp differ diff --git a/Res/Record/BeatHint1.png b/Res/Record/BeatHint1.png new file mode 100644 index 0000000..dc9b2d5 Binary files /dev/null and b/Res/Record/BeatHint1.png differ diff --git a/Res/Record/BeatHint2.png b/Res/Record/BeatHint2.png new file mode 100644 index 0000000..6f4a8c8 Binary files /dev/null and b/Res/Record/BeatHint2.png differ diff --git a/Res/Record/BeatHint3.png b/Res/Record/BeatHint3.png new file mode 100644 index 0000000..afe4924 Binary files /dev/null and b/Res/Record/BeatHint3.png differ diff --git a/Res/Record/BeatHint4.png b/Res/Record/BeatHint4.png new file mode 100644 index 0000000..a0d69c0 Binary files /dev/null and b/Res/Record/BeatHint4.png differ diff --git a/Res/Scrollbar/LineDown.bmp b/Res/Scrollbar/LineDown.bmp new file mode 100644 index 0000000..4fff68d Binary files /dev/null and b/Res/Scrollbar/LineDown.bmp differ diff --git a/Res/Scrollbar/LineLeft.bmp b/Res/Scrollbar/LineLeft.bmp new file mode 100644 index 0000000..2f68cf6 Binary files /dev/null and b/Res/Scrollbar/LineLeft.bmp differ diff --git a/Res/Scrollbar/LineRight.bmp b/Res/Scrollbar/LineRight.bmp new file mode 100644 index 0000000..0bc2315 Binary files /dev/null and b/Res/Scrollbar/LineRight.bmp differ diff --git a/Res/Scrollbar/LineUp.bmp b/Res/Scrollbar/LineUp.bmp new file mode 100644 index 0000000..56791ef Binary files /dev/null and b/Res/Scrollbar/LineUp.bmp differ diff --git a/Res/Setup/tap.png b/Res/Setup/tap.png new file mode 100644 index 0000000..c04e411 Binary files /dev/null and b/Res/Setup/tap.png differ diff --git a/Res/Setup/tapHover.png b/Res/Setup/tapHover.png new file mode 100644 index 0000000..8a833a6 Binary files /dev/null and b/Res/Setup/tapHover.png differ diff --git a/Res/Setup/tapNor.png b/Res/Setup/tapNor.png new file mode 100644 index 0000000..f47da02 Binary files /dev/null and b/Res/Setup/tapNor.png differ diff --git a/Res/Style/addchan.png b/Res/Style/addchan.png new file mode 100644 index 0000000..511cb15 Binary files /dev/null and b/Res/Style/addchan.png differ diff --git a/Res/Style/addsegment.png b/Res/Style/addsegment.png new file mode 100644 index 0000000..55a709b Binary files /dev/null and b/Res/Style/addsegment.png differ diff --git a/Res/Style/alpha_chord.png b/Res/Style/alpha_chord.png new file mode 100644 index 0000000..e77120b Binary files /dev/null and b/Res/Style/alpha_chord.png differ diff --git a/Res/Style/channel.png b/Res/Style/channel.png new file mode 100644 index 0000000..c8f32bd Binary files /dev/null and b/Res/Style/channel.png differ diff --git a/Res/Style/collect.png b/Res/Style/collect.png new file mode 100644 index 0000000..bad53e1 Binary files /dev/null and b/Res/Style/collect.png differ diff --git a/Res/Style/download.png b/Res/Style/download.png new file mode 100644 index 0000000..a290efd Binary files /dev/null and b/Res/Style/download.png differ diff --git a/Res/Style/eff_wav.png b/Res/Style/eff_wav.png new file mode 100644 index 0000000..4b0fd7b Binary files /dev/null and b/Res/Style/eff_wav.png differ diff --git a/Res/Style/effect_show.png b/Res/Style/effect_show.png new file mode 100644 index 0000000..f2716fb Binary files /dev/null and b/Res/Style/effect_show.png differ diff --git a/Res/Style/item_checked.png b/Res/Style/item_checked.png new file mode 100644 index 0000000..c9cec73 Binary files /dev/null and b/Res/Style/item_checked.png differ diff --git a/Res/Style/item_unchecked.png b/Res/Style/item_unchecked.png new file mode 100644 index 0000000..63976a2 Binary files /dev/null and b/Res/Style/item_unchecked.png differ diff --git a/Res/Style/newstyle.png b/Res/Style/newstyle.png new file mode 100644 index 0000000..5102841 Binary files /dev/null and b/Res/Style/newstyle.png differ diff --git a/Res/Style/pylon.png b/Res/Style/pylon.png new file mode 100644 index 0000000..7ae06f6 Binary files /dev/null and b/Res/Style/pylon.png differ diff --git a/Res/Style/star1.png b/Res/Style/star1.png new file mode 100644 index 0000000..ea19899 Binary files /dev/null and b/Res/Style/star1.png differ diff --git a/Res/Style/star2.png b/Res/Style/star2.png new file mode 100644 index 0000000..734645f Binary files /dev/null and b/Res/Style/star2.png differ diff --git a/Res/Style/star3.png b/Res/Style/star3.png new file mode 100644 index 0000000..2143ae1 Binary files /dev/null and b/Res/Style/star3.png differ diff --git a/Res/Style/style_arrows_close.png b/Res/Style/style_arrows_close.png new file mode 100644 index 0000000..86c4ea3 Binary files /dev/null and b/Res/Style/style_arrows_close.png differ diff --git a/Res/Style/style_arrows_open.png b/Res/Style/style_arrows_open.png new file mode 100644 index 0000000..0212b06 Binary files /dev/null and b/Res/Style/style_arrows_open.png differ diff --git a/Res/Style/style_brush.png b/Res/Style/style_brush.png new file mode 100644 index 0000000..0058bdb Binary files /dev/null and b/Res/Style/style_brush.png differ diff --git a/Res/Style/style_choose.png b/Res/Style/style_choose.png new file mode 100644 index 0000000..e93a660 Binary files /dev/null and b/Res/Style/style_choose.png differ diff --git a/Res/Style/style_delete.png b/Res/Style/style_delete.png new file mode 100644 index 0000000..80eb21a Binary files /dev/null and b/Res/Style/style_delete.png differ diff --git a/Res/Style/style_prog.png b/Res/Style/style_prog.png new file mode 100644 index 0000000..3e3b484 Binary files /dev/null and b/Res/Style/style_prog.png differ diff --git a/Res/Style/stylecharge.png b/Res/Style/stylecharge.png new file mode 100644 index 0000000..cb3476b Binary files /dev/null and b/Res/Style/stylecharge.png differ diff --git a/Res/Style/stylesave.png b/Res/Style/stylesave.png new file mode 100644 index 0000000..fd235cd Binary files /dev/null and b/Res/Style/stylesave.png differ diff --git a/Res/Style/styleupload.png b/Res/Style/styleupload.png new file mode 100644 index 0000000..f2f7d0c Binary files /dev/null and b/Res/Style/styleupload.png differ diff --git a/Res/Style/tab_collect.png b/Res/Style/tab_collect.png new file mode 100644 index 0000000..e0784cc Binary files /dev/null and b/Res/Style/tab_collect.png differ diff --git a/Res/Style/tab_local.png b/Res/Style/tab_local.png new file mode 100644 index 0000000..cffc8a1 Binary files /dev/null and b/Res/Style/tab_local.png differ diff --git a/Res/Style/tab_online.png b/Res/Style/tab_online.png new file mode 100644 index 0000000..8f7238b Binary files /dev/null and b/Res/Style/tab_online.png differ diff --git a/Res/Style/tab_recom.png b/Res/Style/tab_recom.png new file mode 100644 index 0000000..ebdb9e2 Binary files /dev/null and b/Res/Style/tab_recom.png differ diff --git a/Res/Style/tab_release.png b/Res/Style/tab_release.png new file mode 100644 index 0000000..5edd169 Binary files /dev/null and b/Res/Style/tab_release.png differ diff --git a/Res/Style/tab_select.png b/Res/Style/tab_select.png new file mode 100644 index 0000000..678a22d Binary files /dev/null and b/Res/Style/tab_select.png differ diff --git a/Res/Style/tab_share.png b/Res/Style/tab_share.png new file mode 100644 index 0000000..b3684e5 Binary files /dev/null and b/Res/Style/tab_share.png differ diff --git a/Res/Style/texture.png b/Res/Style/texture.png new file mode 100644 index 0000000..92bcfef Binary files /dev/null and b/Res/Style/texture.png differ diff --git a/Res/Style/trackoff.png b/Res/Style/trackoff.png new file mode 100644 index 0000000..2ca5265 Binary files /dev/null and b/Res/Style/trackoff.png differ diff --git a/Res/Style/trackon.png b/Res/Style/trackon.png new file mode 100644 index 0000000..b34700a Binary files /dev/null and b/Res/Style/trackon.png differ diff --git a/Res/Style/uncollect.png b/Res/Style/uncollect.png new file mode 100644 index 0000000..8c8acd3 Binary files /dev/null and b/Res/Style/uncollect.png differ diff --git a/Res/Style/volume.png b/Res/Style/volume.png new file mode 100644 index 0000000..364d709 Binary files /dev/null and b/Res/Style/volume.png differ diff --git a/Res/Style/wav_eff.png b/Res/Style/wav_eff.png new file mode 100644 index 0000000..4c4add4 Binary files /dev/null and b/Res/Style/wav_eff.png differ diff --git a/Res/Style/wave.png b/Res/Style/wave.png new file mode 100644 index 0000000..c701d4f Binary files /dev/null and b/Res/Style/wave.png differ diff --git a/Res/Style/wave_show.png b/Res/Style/wave_show.png new file mode 100644 index 0000000..71389c1 Binary files /dev/null and b/Res/Style/wave_show.png differ diff --git a/Res/System/ac_pro.png b/Res/System/ac_pro.png new file mode 100644 index 0000000..bf0b612 Binary files /dev/null and b/Res/System/ac_pro.png differ diff --git a/Res/System/close.png b/Res/System/close.png new file mode 100644 index 0000000..b52153a Binary files /dev/null and b/Res/System/close.png differ diff --git a/Res/System/logo.png b/Res/System/logo.png new file mode 100644 index 0000000..bd9b2c5 Binary files /dev/null and b/Res/System/logo.png differ diff --git a/Res/System/max.png b/Res/System/max.png new file mode 100644 index 0000000..6e5dded Binary files /dev/null and b/Res/System/max.png differ diff --git a/Res/System/menu_arrows.png b/Res/System/menu_arrows.png new file mode 100644 index 0000000..a53c3f8 Binary files /dev/null and b/Res/System/menu_arrows.png differ diff --git a/Res/System/menu_down.png b/Res/System/menu_down.png new file mode 100644 index 0000000..901e547 Binary files /dev/null and b/Res/System/menu_down.png differ diff --git a/Res/System/menu_up.png b/Res/System/menu_up.png new file mode 100644 index 0000000..51efd86 Binary files /dev/null and b/Res/System/menu_up.png differ diff --git a/Res/System/min.png b/Res/System/min.png new file mode 100644 index 0000000..bbfed8c Binary files /dev/null and b/Res/System/min.png differ diff --git a/Res/System/recover.png b/Res/System/recover.png new file mode 100644 index 0000000..c02680a Binary files /dev/null and b/Res/System/recover.png differ diff --git a/Res/System/splash.jpg b/Res/System/splash.jpg new file mode 100644 index 0000000..2931e42 Binary files /dev/null and b/Res/System/splash.jpg differ diff --git a/Res/UserInfo/UserIcon.png b/Res/UserInfo/UserIcon.png new file mode 100644 index 0000000..3f5dead Binary files /dev/null and b/Res/UserInfo/UserIcon.png differ diff --git a/Res/UserInfo/user_coin.png b/Res/UserInfo/user_coin.png new file mode 100644 index 0000000..4db76c4 Binary files /dev/null and b/Res/UserInfo/user_coin.png differ diff --git a/Res/UserInfo/user_fans.png b/Res/UserInfo/user_fans.png new file mode 100644 index 0000000..8eb9450 Binary files /dev/null and b/Res/UserInfo/user_fans.png differ diff --git a/Res/UserInfo/user_music.png b/Res/UserInfo/user_music.png new file mode 100644 index 0000000..6ecbe8d Binary files /dev/null and b/Res/UserInfo/user_music.png differ diff --git a/Res/UserInfo/user_pops.png b/Res/UserInfo/user_pops.png new file mode 100644 index 0000000..c1ff89c Binary files /dev/null and b/Res/UserInfo/user_pops.png differ diff --git a/Res/UserInfo/user_zone.png b/Res/UserInfo/user_zone.png new file mode 100644 index 0000000..901734c Binary files /dev/null and b/Res/UserInfo/user_zone.png differ diff --git a/Res/Vip/icon_vip_off.png b/Res/Vip/icon_vip_off.png new file mode 100644 index 0000000..662491b Binary files /dev/null and b/Res/Vip/icon_vip_off.png differ diff --git a/Res/Vip/icon_vip_on.PNG b/Res/Vip/icon_vip_on.PNG new file mode 100644 index 0000000..c5d74cd Binary files /dev/null and b/Res/Vip/icon_vip_on.PNG differ diff --git a/Res/Vip/icon_vip_on5.png b/Res/Vip/icon_vip_on5.png new file mode 100644 index 0000000..9aeb53f Binary files /dev/null and b/Res/Vip/icon_vip_on5.png differ diff --git a/SaveFormUnit.cpp b/SaveFormUnit.cpp new file mode 100644 index 0000000..6dba5d8 --- /dev/null +++ b/SaveFormUnit.cpp @@ -0,0 +1,309 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop + +#include "SaveFormUnit.h" +#include "GlobalUnit.h" +#include "Project.h" +#include +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma link "GeneralDialogPanel" +#pragma link "PNGButton" +#pragma link "LineEdit" +#pragma link "TextButton" +#pragma link "CKBox" +#pragma link "ComboBoxComponent" +#pragma resource "*.dfm" +TSaveForm *SaveForm; + +//--------------------------------------------------------------------------- +__fastcall TSaveForm::TSaveForm(TComponent* Owner, int iType) + : TForm(Owner) +{ + SetTransparent( this ); + + memset( m_aTypeIndex, -1, sizeof( m_aTypeIndex ) ); + + int ind = 0; + if( iType & SAVE_PROJECT ){ + m_aTypeIndex[ind++] = FILETYPE_CPJ; + } + + if( (( iType & SAVE_COMPOSE ) || ( iType & SAVE_AUDIO )) + && ( !g_bUpdateMandatory || SOFTWARE_ID==e_Pro_Lite ) ){ + m_aTypeIndex[ind++] = FILETYPE_MP3; + m_aTypeIndex[ind++] = FILETYPE_WAVE; + m_aTypeIndex[ind++] = FILETYPE_MIDI; + } + + FSaveType = -1; + FMediaOption = iType==SAVE_ALL ? g_iLastSaveOption & 0x0F00 : iType; + + m_DefName = L"untitle-"; + m_DefName += g_strTSName[g_iMelodyTimeSignature]; + m_DefName += L"-"; + m_DefName += IntToStr(g_nMelodyTempo); + + m_MediaPath = String(g_strLastSavePath.c_str()); + m_ProjPath = String(g_strLastProjSavePath.c_str()); + + String basePath; + basePath.sprintf(L"%s", g_strUserPath.c_str()); + + if( m_MediaPath.IsEmpty() ){ + m_MediaPath = basePath + L"Save"; + + if(!DirectoryExists(m_MediaPath, false)) + ForceDirectories(m_MediaPath); + + m_MediaPath += L"\\";// + m_DefName + L".mp3"; + } + + if( m_ProjPath.IsEmpty() ){ + m_ProjPath = basePath + L"Projects"; + + if(!DirectoryExists(m_ProjPath, false)) + ForceDirectories(m_ProjPath); + + m_ProjPath += L"\\";// + m_DefName + L".cpj"; + } + + if( strlen( g_infoSong.strSongName )>0 ){ + m_MediaPath += g_infoSong.strSongName; + m_ProjPath += g_infoSong.strSongName; + } + else{ + m_MediaPath += m_DefName; + m_ProjPath += m_DefName; + } + + m_MediaPath += L".mp3"; + m_ProjPath += L".cpj"; +} +//--------------------------------------------------------------------------- + +void __fastcall TSaveForm::BtnBrowseClick(TObject *Sender) +{ + TSaveDialog * pDlg = new TSaveDialog(NULL); + pDlg->Options << ofCreatePrompt << ofOverwritePrompt; + pDlg->Title = L"Ϊ"; + pDlg->FileName = ExtractFileName(m_editFileName->Text); + pDlg->InitialDir = ExtractFilePath(m_editFileName->Text); + + switch( m_aTypeIndex[m_SaveTypeCombo->DefItemIndex] ){ + case FILETYPE_CPJ: + if(m_editFileName->Text.Length() == 0) + pDlg->FileName = m_DefName; + + pDlg->Filter = "ļ(*.cpj)|*.cpj"; + pDlg->DefaultExt = "cpj"; + break; + case FILETYPE_MP3: + pDlg->Filter = "MP3ļ(*.mp3)|*.mp3"; + pDlg->DefaultExt = "mp3"; + break; + case FILETYPE_WAVE: + pDlg->Filter = "WAVEļ(*.wav)|*.wav"; + pDlg->DefaultExt = "wav"; + break; + case FILETYPE_MIDI: + pDlg->Filter = "MIDIļ(*.mid)|*.mid"; + pDlg->DefaultExt = "mid"; + break; + default: + pDlg->Filter = "ļ(*.*)|*.*"; + break; + + }; + + if(pDlg->Execute()){ + m_editFileName->Text = pDlg->FileName; + } + + delete pDlg; + +} +//--------------------------------------------------------------------------- + +void __fastcall TSaveForm::FileNameChange(TObject *Sender) +{ + FFilePath = m_editFileName->Text; + + String fileExt = ExtractFileExt(m_editFileName->Text); + + if(FilePath.IsEmpty()) + { + m_btnOk->Enabled = false; + return; + } + + int iType = m_aTypeIndex[m_SaveTypeCombo->DefItemIndex]; + + if( iType==FILETYPE_CPJ ){ + // 湤 + if(fileExt.CompareIC(L".cpj") == 0) + m_btnOk->Enabled = true; + else + m_btnOk->Enabled = false; + + m_ProjPath = FFilePath; + } + else{ + bool bPostfixGood = true; + if( iType==FILETYPE_MP3 ){ + if( fileExt.CompareIC(L".mp3") ) + bPostfixGood = false; + } + else if( iType==FILETYPE_WAVE ){ + if( fileExt.CompareIC(L".wav") ) + bPostfixGood = false; + } + else if( iType==FILETYPE_MIDI ){ + if( fileExt.CompareIC(L".mid") ) + bPostfixGood = false; + } + + m_btnOk->Enabled = bPostfixGood && FMediaOption; + m_MediaPath = FFilePath; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TSaveForm::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) +{ + switch(Key) + { + case VK_RETURN: + if(m_btnOk->Enabled) + ModalResult = mrOk; + break; + + case VK_ESCAPE: + ModalResult = mrCancel; + break; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TSaveForm::DoComboChange(TComboBoxItem *Sender, int Index) +{ + int iType = m_aTypeIndex[Index]; + + if( m_aTypeIndex[0]!=FILETYPE_CPJ || iType==FILETYPE_CPJ ){ + m_ComposeCheck->Visible = false; + m_SongCheck->Visible = false; + } + + if( iType==FILETYPE_CPJ ){ + m_editFileName->Text = ChangeFileExt( m_ProjPath, L".cpj" ); + } + else{ + m_editFileName->Text = ChangeFileExt(m_MediaPath, iType==FILETYPE_MP3 ? L".mp3" + : iType==FILETYPE_WAVE ? L".wav" + : L".mid"); + + if( m_aTypeIndex[0]==FILETYPE_CPJ ){ + if( iType==FILETYPE_MIDI ){ + m_ComposeCheck->Visible = false; + m_ComposeCheck->Checked = true; + + m_SongCheck->Visible = false; + m_SongCheck->Checked = false; + } + else{ + m_ComposeCheck->Visible = true; + m_SongCheck->Visible = true; + m_SongCheck->Enabled = iType!=FILETYPE_MIDI + && (( g_iPreStage==0 && g_aAudioTracks[0]->lstBars.size()>0 ) + || g_iPreStage>0 && g_aAudioTracks.size()>1 ); + } + } + } + + FSaveType = iType; + + FileNameChange(NULL); +} +//--------------------------------------------------------------------------- + +void __fastcall TSaveForm::DoComposeCheck(TObject *Sender) +{ + if( m_ComposeCheck->Checked ){ + FMediaOption |= SAVE_COMPOSE; + } + else{ + FMediaOption &= ~SAVE_COMPOSE; + } + + m_btnOk->Enabled = FMediaOption!=0; +} +//--------------------------------------------------------------------------- + +void __fastcall TSaveForm::DoSongCheck(TObject *Sender) +{ + if( m_SongCheck->Checked ){ + FMediaOption |= SAVE_AUDIO; + } + else{ + FMediaOption &= ~SAVE_AUDIO; + } + + m_btnOk->Enabled = FMediaOption!=0; +} +//--------------------------------------------------------------------------- + +void __fastcall TSaveForm::SetMediaOption(int Value) +{ + if(FMediaOption != Value) + { + FMediaOption = Value; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TSaveForm::FormCreate(TObject *Sender) +{ + DialogPanel->Font->Size = g_szFont9; + m_btnOk->FontSize = g_szFont9; + m_btnBrowse->FontSize = g_szFont9; + m_btnCancel->FontSize = g_szFont9; + m_SongCheck->Font->Size = g_szFont9; + m_ComposeCheck->Font->Size = g_szFont9; + m_SaveTypeCombo->SetFont(g_strTxtFontName, g_szFont9); + m_editFileName->SetTextFont(g_strTxtFontName, g_szFont9); + + m_ComposeCheck->Checked = (bool)(FMediaOption & SAVE_COMPOSE); + m_SongCheck->Checked = (bool)(FMediaOption & SAVE_AUDIO) && ( g_iPreStage>0 && g_aAudioTracks.size()>1 + || g_iPreStage==0 && g_aAudioTracks[0]->lstBars.size()>0 ); + + int ind = -1; + + for( int i=0; i<4; i++ ){ + if( m_aTypeIndex[i]==FILETYPE_CPJ ){ + m_SaveTypeCombo->AddItem("ļ(*.cpj)"); + } + else if( m_aTypeIndex[i]==FILETYPE_MP3 ){ + m_SaveTypeCombo->AddItem("MP3ļ(*.mp3)"); + } + else if( m_aTypeIndex[i]==FILETYPE_WAVE ){ + m_SaveTypeCombo->AddItem("WAVEļ(*.wav)"); + } + else if( m_aTypeIndex[i]==FILETYPE_MIDI ){ + m_SaveTypeCombo->AddItem("MIDIļ(*.mid))"); + } + else{ + break; + } + + if( ind<0 || g_iLastSaveType==m_aTypeIndex[i] ) + ind = i; + } + + m_SaveTypeCombo->DefItemIndex = ind; + + DoComboChange(NULL, ind); +} +//--------------------------------------------------------------------------- + diff --git a/SaveFormUnit.dfm b/SaveFormUnit.dfm new file mode 100644 index 0000000..bcce6db --- /dev/null +++ b/SaveFormUnit.dfm @@ -0,0 +1,155 @@ +object SaveForm: TSaveForm + Left = 0 + Top = 0 + BorderStyle = bsNone + Caption = 'SaveForm' + ClientHeight = 210 + ClientWidth = 410 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = 14339007 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + KeyPreview = True + Position = poMainFormCenter + Scaled = False + OnCreate = FormCreate + OnKeyDown = FormKeyDown + TextHeight = 14 + object DialogPanel: TGeneralDialogPanel + Left = 0 + Top = 0 + Width = 410 + Height = 210 + Caption = #23548#20986#20026 + Color = 5064257 + Font.Charset = DEFAULT_CHARSET + Font.Color = 14339007 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentBackground = False + ParentFont = False + TabOrder = 0 + object m_sdFileNameLabel: TLabel + Left = 33 + Top = 98 + Width = 56 + Height = 14 + Caption = #25991' '#20214' '#21517#65306 + end + object m_btnBrowse: TTextButton + Left = 321 + Top = 94 + Width = 48 + Height = 23 + ParentShowHint = False + ShowHint = True + OnClick = BtnBrowseClick + Text = #27983#35272 + end + object m_btnCancel: TTextButton + Left = 294 + Top = 151 + Width = 75 + Height = 30 + ModalResult = mrCancel + ParentShowHint = False + ShowHint = True + Text = #21462#28040 + end + object m_btnOk: TTextButton + Left = 213 + Top = 151 + Width = 75 + Height = 30 + ModalResult = mrOk + ParentShowHint = False + ShowHint = True + Text = #30830#23450 + end + object m_SaveTypeCombo: TComboBoxComponent + Left = 99 + Top = 51 + Width = 270 + Height = 24 + ParentShowHint = False + ShowHint = True + OnChange = DoComboChange + ItemHeight = 18 + ShowItemCount = 5 + Parent = DialogPanel + end + object m_SaveTypeLabel: TLabel + Left = 33 + Top = 55 + Width = 60 + Height = 14 + Caption = #25991#20214#31867#22411#65306 + Transparent = True + end + object m_editFileName: TLineEdit + Left = 99 + Top = 94 + Width = 216 + Height = 24 + OnChange = FileNameChange + HintText = #35831#36873#25321#20445#23384#25991#20214#36335#24452 + NumberMax = -1 + NumberMin = -1 + Color = 15591652 + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + TabOrder = 0 + TabStop = False + end + object m_SongCheck: TCKBox + Left = 97 + Top = 155 + Width = 54 + Height = 18 + Caption = #24405#38899 + Ctl3D = False + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = 14339007 + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentColor = True + ParentCtl3D = False + ParentDoubleBuffered = False + ParentFont = False + TabOrder = 1 + TabStop = True + BoxColor = 3157548 + OnChange = DoSongCheck + end + object m_ComposeCheck: TCKBox + Left = 33 + Top = 155 + Width = 57 + Height = 18 + Caption = #20276#22863 + Ctl3D = False + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = 14339007 + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentColor = True + ParentCtl3D = False + ParentDoubleBuffered = False + ParentFont = False + TabOrder = 2 + TabStop = True + BoxColor = 3157548 + OnChange = DoComposeCheck + end + end +end diff --git a/SaveFormUnit.h b/SaveFormUnit.h new file mode 100644 index 0000000..eb6f0e8 --- /dev/null +++ b/SaveFormUnit.h @@ -0,0 +1,65 @@ +//--------------------------------------------------------------------------- + +#ifndef SaveFormUnitH +#define SaveFormUnitH +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include +#include "GeneralDialogPanel.h" +#include "PNGButton.hpp" +#include "LineEdit.h" +#include "TextButton.h" +#include "CKBox.h" +#include "ComboBoxComponent.h" +#include +//--------------------------------------------------------------------------- +class TSaveForm : public TForm +{ +__published: // IDE-managed Components + TGeneralDialogPanel *DialogPanel; + TLabel *m_sdFileNameLabel; + TLineEdit *m_editFileName; + TTextButton *m_btnBrowse; + TTextButton *m_btnCancel; + TTextButton *m_btnOk; + TCKBox *m_SongCheck; + TCKBox *m_ComposeCheck; + TComboBoxComponent *m_SaveTypeCombo; + TLabel *m_SaveTypeLabel; + + void __fastcall BtnBrowseClick(TObject *Sender); + void __fastcall FileNameChange(TObject *Sender); + void __fastcall FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift); + void __fastcall DoComboChange(TComboBoxItem *Sender, int Index); + void __fastcall DoComposeCheck(TObject *Sender); + void __fastcall DoSongCheck(TObject *Sender); + void __fastcall FormCreate(TObject *Sender); +// void __fastcall DoMessage(tagMSG &Msg, bool &Handled); + +private: // User declarations + int m_aTypeIndex[4]; + int FMediaOption, + FSaveType; // 0 : 1 mp3 2 wav 3 mid + + String FFilePath, + m_MediaPath, + m_ProjPath, + m_DefName; + + void __fastcall DoOpenDlgTypeChange(TObject *Sender); + void __fastcall SetMediaOption(int Value); + +public: // User declarations + __fastcall TSaveForm(TComponent* Owner, int iType); + + __property int MediaOption = {read = FMediaOption}; + __property int SaveType = {read = FSaveType}; + __property String FilePath = {read = FFilePath}; +}; +//--------------------------------------------------------------------------- +extern PACKAGE TSaveForm *SaveForm; +//--------------------------------------------------------------------------- +#endif diff --git a/SaveLocalStyleFormUnit.cpp b/SaveLocalStyleFormUnit.cpp new file mode 100644 index 0000000..a16286e --- /dev/null +++ b/SaveLocalStyleFormUnit.cpp @@ -0,0 +1,167 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop + +#include "GlobalUnit.h" +#include "SaveLocalStyleFormUnit.h" +#include "MessageFormUnit.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma link "GeneralDialogPanel" +#pragma link "LineEdit" +#pragma link "TextButton" +#pragma resource "*.dfm" +TSaveLocalStyleForm *SaveLocalStyleForm; + +//--------------------------------------------------------------------------- +__fastcall TSaveLocalStyleForm::TSaveLocalStyleForm(TComponent* Owner, TStyleItem* pStyItem) + : TForm(Owner) +{ + m_pStyItem = pStyItem; + if( pStyItem->pStyle && pStyItem->pStyle->idLoc!=0 && pStyItem->pStyle->idLoc!=(UINT)-1 ){ + m_editName->Text = UTF8ToMBCS(pStyItem->pStyle->pLocal->strStyleName).c_str(); + } + else{ + m_editName->Text = m_editName->Text.sprintf( L"Զ%d", f_CM_GetNextLocalID() ); + } + + SetTransparent( this ); +} +//--------------------------------------------------------------------------- + +void __fastcall TSaveLocalStyleForm::FormShow(TObject *Sender) +{ + m_editName->SetFocus(); +} +//--------------------------------------------------------------------------- + +void __fastcall TSaveLocalStyleForm::OkClick(TObject *Sender) +{ + if( m_editName->Text.Length()==0 ){ + m_editName->SetFocus(); + } + else{ + ModalResult = mrOk; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TSaveLocalStyleForm::Save(TPROSTYLE * pStyle) +{ + for( int i=0; iaItems->Count; i++ ){ + TSegmentItem* pSeg = (TSegmentItem*)m_pStyItem->aItems->Items[i]; + int segType = pSeg->iSegType, + segNo = pSeg->iSegNo; + + if( segType==SEGTYPE_VAR ) + pStyle->pLocal->nSegNum[segType]++; + else if( segType==SEGTYPE_FILL ) + pStyle->pLocal->nSegNum[segType]++; + else{ + int nMaj = pStyle->pLocal->nSegNum[segType] & 0x0F, + nMin = pStyle->pLocal->nSegNum[segType] >> 4; + + if( segNo<4 ) + nMaj++; + else + nMin++; + + pStyle->pLocal->nSegNum[segType] = ( nMin<<4 ) + nMaj; + pStyle->pLocal->aIEBars[segType-2][segNo] = pSeg->nBars; + } + + pStyle->pLocal->nSegVol[segType][segNo] = pSeg->volume; + + for( int j=0; jaItems->Count; j++ ){ + TTrack* pTrk = ((TTrackItem*)pSeg->aItems->Items[j])->pTrack; + pStyle->pLocal->trkRef[segType][segNo][j].idLoc = pTrk->iStyleLoc;// >pStyle->idLoc; + pStyle->pLocal->trkRef[segType][segNo][j].idStyle = pTrk->iStyleId;// >pStyle->idStyle; + pStyle->pLocal->trkRef[segType][segNo][j].segNo = pTrk->iSegNo; + pStyle->pLocal->trkRef[segType][segNo][j].chan = pTrk->iChanNo; + pStyle->pLocal->trkRef[segType][segNo][j].prog = pTrk->iProg;// >progCurr; + pStyle->pLocal->trkRef[segType][segNo][j].vol = pTrk->nVol;// >volCurr; + } + } + + f_CM_SaveLocalStyle( pStyle ); + + if( m_pStyItem->pStyle!=pStyle ) + m_pStyItem->pStyle = pStyle; + + for( int i=0; iaItems->Count; i++ ){ + TSegmentItem* pSeg = (TSegmentItem*)m_pStyItem->aItems->Items[i]; + for( int j=0; jaItems->Count; j++ ){ + TTrackItem* pTrk = (TTrackItem*)pSeg->aItems->Items[j]; + if( pTrk->pStyle->idLoc==(UINT)-1 && pTrk->pStyle->idStyle==0 ){ + pTrk->pStyle = pStyle; + pTrk->pTrack->iStyleLoc = pStyle->idLoc; + pTrk->pTrack->iStyleId = pStyle->idStyle; + } + } + } + + if( g_pUseStyle ){ + if( !g_pUseStyle->pStyle || g_pUseStyle->pStyle->idLoc==(UINT)-1 + && g_pUseStyle->pStyle->idStyle==0 ){ + g_pUseStyle->pStyle = pStyle; + } + + for( int i=0; iaItems->Count; i++ ){ + TSegmentItem* pSeg = (TSegmentItem*)g_pUseStyle->aItems->Items[i]; + for( int j=0; jaItems->Count; j++ ){ + TTrackItem* pTrk = (TTrackItem*)pSeg->aItems->Items[j]; + if( pTrk->pStyle->idLoc==(UINT)-1 && pTrk->pStyle->idStyle==0 ){ + pTrk->pStyle = pStyle; + g_lstOpusStages[i]->aTracks[j]->iStyleLoc = pStyle->idLoc; + g_lstOpusStages[i]->aTracks[j]->iStyleId = pStyle->idStyle; + } + } + } + } + + f_CM_DeleteTempStyle( 0 ); + DeleteStyleInfo( -1, 0 ); +} +//--------------------------------------------------------------------------- + +void __fastcall TSaveLocalStyleForm::NameChange(TObject *Sender) +{ + TLineEdit* pEdit = ((TLineEdit*)Sender); + + AnsiString strName = pEdit->Text.Trim(); + string strTmp = GBToUTF8(strName.c_str()); + + if( strTmp.length()>pEdit->MaxLength ){ + pEdit->OnChange = NULL; + pEdit->Text = pEdit->Text.SubString( 0, pEdit->Text.Length()-1 ); + pEdit->SelStart = pEdit->Text.Length(); + pEdit->OnChange = NameChange; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TSaveLocalStyleForm::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) +{ + switch( Key ){ + case VK_RETURN: + if(m_btnOk->Enabled) + OkClick(NULL); + break; + + case VK_ESCAPE: + ModalResult = mrCancel; + break; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TSaveLocalStyleForm::FormCreate(TObject *Sender) +{ + m_panelBk->Font->Size = g_szFont9; + m_btnCancel->FontSize = g_szFont9; + m_btnOk->FontSize = g_szFont9; + m_editName->SetTextFont(g_strTxtFontName, g_szFont9); +} +//--------------------------------------------------------------------------- + diff --git a/SaveLocalStyleFormUnit.dfm b/SaveLocalStyleFormUnit.dfm new file mode 100644 index 0000000..3067bc3 --- /dev/null +++ b/SaveLocalStyleFormUnit.dfm @@ -0,0 +1,86 @@ +object SaveLocalStyleForm: TSaveLocalStyleForm + Left = 0 + Top = 0 + BorderIcons = [] + BorderStyle = bsNone + Caption = 'SaveLocalStyleForm' + ClientHeight = 143 + ClientWidth = 303 + Color = clBtnFace + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + KeyPreview = True + Position = poMainFormCenter + Scaled = False + OnCreate = FormCreate + OnKeyDown = FormKeyDown + OnShow = FormShow + TextHeight = 13 + object m_panelBk: TGeneralDialogPanel + Left = 0 + Top = 0 + Width = 303 + Height = 143 + Align = alClient + Caption = #20445#23384#39118#26684 + Color = 5064257 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentBackground = False + ParentFont = False + TabOrder = 0 + object m_lblName: TLabel + Left = 32 + Top = 47 + Width = 36 + Height = 14 + Caption = #21517#31216#65306 + Font.Charset = DEFAULT_CHARSET + Font.Color = 14339007 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + Layout = tlCenter + end + object m_btnCancel: TTextButton + Left = 161 + Top = 97 + Width = 75 + Height = 24 + ModalResult = mrCancel + ParentShowHint = False + ShowHint = True + Text = #21462#28040 + end + object m_btnOk: TTextButton + Left = 74 + Top = 97 + Width = 75 + Height = 24 + ParentShowHint = False + ShowHint = True + OnClick = OkClick + Text = #30830#23450 + end + object m_editName: TLineEdit + Left = 74 + Top = 43 + Width = 191 + Height = 24 + OnChange = NameChange + MaxLength = 39 + NumberMax = -1 + NumberMin = -1 + Color = 15591652 + TabOrder = 0 + end + end +end diff --git a/SaveLocalStyleFormUnit.h b/SaveLocalStyleFormUnit.h new file mode 100644 index 0000000..dd017e5 --- /dev/null +++ b/SaveLocalStyleFormUnit.h @@ -0,0 +1,41 @@ +//--------------------------------------------------------------------------- + +#ifndef SaveLocalStyleFormUnitH +#define SaveLocalStyleFormUnitH +//--------------------------------------------------------------------------- +#include +#include +#include +#include + +#include "StyleItem.h" +#include "GeneralDialogPanel.h" +#include "LineEdit.h" +#include "TextButton.h" +#include +//--------------------------------------------------------------------------- +class TSaveLocalStyleForm : public TForm +{ +__published: // IDE-managed Components + TLabel *m_lblName; + TGeneralDialogPanel *m_panelBk; + TTextButton *m_btnCancel; + TTextButton *m_btnOk; + TLineEdit *m_editName; + void __fastcall OkClick(TObject *Sender); + void __fastcall FormShow(TObject *Sender); + void __fastcall NameChange(TObject *Sender); + void __fastcall FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift); + void __fastcall FormCreate(TObject *Sender); +private: // User declarations + TStyleItem * m_pStyItem; +public: // User declarations + + __fastcall TSaveLocalStyleForm(TComponent* Owner, TStyleItem* pStyItem ); + + void __fastcall Save(TPROSTYLE * pStyle); +}; +//--------------------------------------------------------------------------- +extern PACKAGE TSaveLocalStyleForm *SaveLocalStyleForm; +//--------------------------------------------------------------------------- +#endif diff --git a/ScoreFormUnit.cpp b/ScoreFormUnit.cpp new file mode 100644 index 0000000..f866634 --- /dev/null +++ b/ScoreFormUnit.cpp @@ -0,0 +1,245 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop + +#include "ScoreFormUnit.h" +//#include "GlobalUnit.h" +#include "ProgressFormUnit.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma link "GeneralDialogPanel" +#pragma link "TextButton" +#pragma resource "*.dfm" +TScoreForm *ScoreForm; + +#define WIDTH 245 // +#define HEIGHT 33 + +TPoint FrameRoute[] = { + TPoint(0, 5), + TPoint(300, 5), + TPoint(305, 0), + TPoint(310, 5), + TPoint(340, 5), + TPoint(340, 120), + TPoint(0, 120), +}; +//--------------------------------------------------------------------------- +__fastcall TScoreForm::TScoreForm(TComponent* Owner) + : TForm(Owner) +{ + SetTransparent( this ); + + m_PngScoreA = new TPngImage(); + m_PngScoreA->LoadFromResourceName(int(HInstance), L"imgScore"); + m_PngScoreB = new TPngImage(); + m_PngScoreB->LoadFromResourceName(int(HInstance), L"imgUnScore"); + + m_PNGNetScore[0] = PNGButton1; + m_PNGNetScore[1] = PNGButton2; + m_PNGNetScore[2] = PNGButton3; + m_PNGNetScore[3] = PNGButton4; + m_PNGNetScore[4] = PNGButton5; + m_PNGNetScore[5] = PNGButton6; + m_PNGNetScore[6] = PNGButton7; + m_PNGNetScore[7] = PNGButton8; + m_PNGNetScore[8] = PNGButton9; + m_PNGNetScore[9] = PNGButton10; + + m_PNGMyScore[0] = PNGButton11; + m_PNGMyScore[1] = PNGButton12; + m_PNGMyScore[2] = PNGButton13; + m_PNGMyScore[3] = PNGButton14; + m_PNGMyScore[4] = PNGButton15; + m_PNGMyScore[5] = PNGButton16; + m_PNGMyScore[6] = PNGButton17; + m_PNGMyScore[7] = PNGButton18; + m_PNGMyScore[8] = PNGButton19; + m_PNGMyScore[9] = PNGButton20; + + for(int i=0;i<10;i++){ + m_PNGMyScore[i]->Tag = i+1 + 100; + } + + MyScore = -1; +} +//--------------------------------------------------------------------------- + +void TScoreForm::SetScoreWindow(bool DownorUp) +{ + if(DownorUp){ + FrameRoute[0] = TPoint(0, 5); + FrameRoute[1] = TPoint(300, 5); + FrameRoute[2] = TPoint(305, 0); + FrameRoute[3] = TPoint(310, 5); + FrameRoute[4] = TPoint(340, 5); + FrameRoute[5] = TPoint(340, 120); + FrameRoute[6] = TPoint(0, 120); +// this->Repaint(); + } + else{ + FrameRoute[0] = TPoint(0, 120); + FrameRoute[1] = TPoint(300, 120); + FrameRoute[2] = TPoint(305, 125); + FrameRoute[3] = TPoint(310, 120); + FrameRoute[4] = TPoint(340, 120); + FrameRoute[5] = TPoint(340, 5); + FrameRoute[6] = TPoint(0, 5); +// this->Repaint(); + } + + HRGN hRgn; + hRgn = CreatePolygonRgn(FrameRoute,7, ALTERNATE); + SetWindowRgn(Handle, hRgn, true); + DeleteObject(hRgn); +} +//--------------------------------------------------------------------------- + +void TScoreForm::SetNetScore( int iScore, const char* strName ) +{ + char buf[8]; + int score10 = (int)(iScore/10.0 + 0.5); + sprintf( buf, "%.1f", score10 / 10.0 ); + + m_StyleName->Caption = strName; + m_NetScore->Caption = buf; + + int iStar = (iScore + 50)/100; + for( int i=0;iPngImg = m_PngScoreA; + m_PNGNetScore[i]->Invalidate(); + } + for( int i=iStar;i<10;i++ ){ + m_PNGNetScore[i]->PngImg = m_PngScoreB; + m_PNGNetScore[i]->Invalidate(); + } +} +//--------------------------------------------------------------------------- + +void TScoreForm::SetMyScore(int iScore,bool bChange) +{ + int iStar = 0; + + if( iScore<0 ) + iScore = 0; + + if( bChange ) + MyScore = iScore; + + if( iScore==0 ){ + m_MyScore->Visible = false; + } + else{ + char buf[8]; + iStar = iScore/100; + sprintf( buf, "%d", iStar ); + m_MyScore->Caption = buf; + m_MyScore->Visible = true; + } + + for( int i=0;iTag/100 == 1 ){ + m_PNGMyScore[i]->PngImg = m_PngScoreA; + m_PNGMyScore[i]->Tag = m_PNGMyScore[i]->Tag%100; + m_PNGMyScore[i]->Invalidate(); + } + } + for( int i=iStar;i<10;i++ ){ + if( m_PNGMyScore[i]->Tag/100 == 0 ){ + m_PNGMyScore[i]->PngImg = m_PngScoreB; + m_PNGMyScore[i]->Tag = m_PNGMyScore[i]->Tag + 100; + m_PNGMyScore[i]->Invalidate(); + } + } +} +//--------------------------------------------------------------------------- + +void __fastcall TScoreForm::BtnMouseEnter(TObject *Sender) +{ + int number = ((TPNGButton*)Sender)->Tag%100*100; + SetMyScore( number,false ); +} +//--------------------------------------------------------------------------- +void __fastcall TScoreForm::BtnMouseLeave(TObject *Sender) +{ + TPoint pt; + pt = Mouse->CursorPos; + TPoint pt2; + pt2 = ScreenToClient(pt); + if( pt2.YTop+2 || pt2.Y>m_PNGMyScore[1]->Top + m_PNGMyScore[1]->Height-2 + || pt2.X < (m_PNGMyScore[0]->Left+2) + || pt2.X > (m_PNGMyScore[9]->Left + m_PNGMyScore[9]->Width-2) ){ + SetMyScore( MyScore ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TScoreForm::BtnClick(TObject *Sender) +{ + MyScore = ((TPNGButton*)Sender)->Tag*100; + m_btnOk->Enabled = true; +} +//--------------------------------------------------------------------------- + +void __fastcall TScoreForm::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) +{ + switch( Key ){ + case VK_RETURN: + case ' ': + if( m_btnOk->Enabled ) + ModalResult = mrOk; + break; + + case VK_ESCAPE: + ModalResult = mrCancel; + break; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TScoreForm::FormPaint(TObject *Sender) +{ + Canvas->Brush->Color = RGB(39, 42, 47); + Canvas->FillRect(GetClientRect()); + /* Ʊ߿ */ + Canvas->Brush->Color = RGB(100, 108, 119); + TRect ret = this->GetClientRect(); + ret.Top = 5; + ret.Bottom = 120; + Canvas->FrameRect(ret); + + Canvas->Brush->Color = RGB(39, 42, 47); + ret.init( FrameRoute[1].X,FrameRoute[1].Y,FrameRoute[3].X,FrameRoute[3].Y ); + Canvas->FrameRect(ret); + + Canvas->Pen->Color = RGB(100, 108, 119); + + Canvas->MoveTo(FrameRoute[1].X, FrameRoute[1].Y); + Canvas->LineTo(FrameRoute[2].X, FrameRoute[2].Y); + + Canvas->MoveTo(FrameRoute[2].X-1, FrameRoute[2].Y); + Canvas->LineTo(FrameRoute[3].X-1, FrameRoute[3].Y); +} +//--------------------------------------------------------------------------- + +void __fastcall TScoreForm::FormClose(TObject *Sender, TCloseAction &Action) +{ + if(m_PngScoreA){ + delete m_PngScoreA; + m_PngScoreA = NULL; + } + if(m_PngScoreB){ + delete m_PngScoreB; + m_PngScoreB = NULL; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TScoreForm::FormCreate(TObject *Sender) +{ + m_btnOk->FontSize = g_szFont9; + m_btnCanel->FontSize = g_szFont9; +} +//--------------------------------------------------------------------------- + diff --git a/ScoreFormUnit.dfm b/ScoreFormUnit.dfm new file mode 100644 index 0000000..89d41e3 --- /dev/null +++ b/ScoreFormUnit.dfm @@ -0,0 +1,3397 @@ +object ScoreForm: TScoreForm + Left = 0 + Top = 0 + BorderStyle = bsNone + Caption = 'ScoreForm' + ClientHeight = 125 + ClientWidth = 340 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + KeyPreview = True + Position = poDefault + Scaled = False + OnClose = FormClose + OnCreate = FormCreate + OnKeyDown = FormKeyDown + OnPaint = FormPaint + TextHeight = 13 + object Label1: TLabel + Left = 12 + Top = 14 + Width = 75 + Height = 16 + Caption = #39118#26684#21517#31216#65306 + Font.Charset = DEFAULT_CHARSET + Font.Color = 13158340 + Font.Height = -13 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object Label3: TLabel + Left = 12 + Top = 39 + Width = 75 + Height = 16 + Caption = #24403#21069#35780#20998#65306 + Font.Charset = DEFAULT_CHARSET + Font.Color = 13158340 + Font.Height = -13 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object Label5: TLabel + Left = 12 + Top = 63 + Width = 75 + Height = 16 + Caption = #25105#30340#35780#20998#65306 + Font.Charset = DEFAULT_CHARSET + Font.Color = 13158340 + Font.Height = -13 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object m_btnCanel: TTextButton + Left = 252 + Top = 87 + Width = 40 + Height = 23 + ModalResult = mrCancel + ParentShowHint = False + ShowHint = True + Text = #21462#28040 + end + object m_btnOk: TTextButton + Left = 203 + Top = 87 + Width = 40 + Height = 23 + ModalResult = mrOk + ParentShowHint = False + ShowHint = True + Enabled = False + Text = #25552#20132 + end + object m_MyScore: TLabel + Left = 303 + Top = 61 + Width = 29 + Height = 18 + Alignment = taCenter + AutoSize = False + Caption = '0' + Font.Charset = DEFAULT_CHARSET + Font.Color = 13158340 + Font.Height = -16 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + Layout = tlCenter + end + object m_NetScore: TLabel + Left = 303 + Top = 37 + Width = 29 + Height = 18 + Alignment = taCenter + AutoSize = False + Caption = '10.0' + Font.Charset = DEFAULT_CHARSET + Font.Color = 13158340 + Font.Height = -16 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + Layout = tlCenter + end + object m_StyleName: TLabel + Left = 95 + Top = 12 + Width = 91 + Height = 18 + Caption = 'm_StyleName' + Font.Charset = DEFAULT_CHARSET + Font.Color = 13158340 + Font.Height = -15 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object PNGButton1: TPNGButton + Tag = 1 + Left = 88 + Top = 39 + Width = 21 + Height = 15 + ImgStates = 3 + PngImg.Data = { + 89504E470D0A1A0A0000000D494844520000003F0000000F0806000000532517 + 72000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F33000008774944415478DAB5967B5053571E + C7EFCDFB0D7910082041824900157917A458BBA0F5C5D21D5F38756774B5CED6 + DDB1B5EEBAD6CE62655A2B6DC745A5752B3BDABAB3E37665AD3AD6D515AD5345 + 4110820425120C84007987BC937B93BBE7CA651B3591FED33BF39DCC3DF7E473 + 7FDFFBFB9DDF39308661107EC1300CC5BA369757F1762F5BFD9E62EFB63A701B + 88352F1C0E451B8609518018402C20F6E8E09090DDABDBE6295634A6A6A638C1 + 989710CEC7416128F61595A91F7824846EA8B6C1CB4B7F1213FE09E6E9D7FFF0 + D187F2C49477CF74DE5AB5E3F4979708D08BCC4F0747022213A2E30102712D16 + 8BC077BD73BB1025D53EE69276C92ACB6F30188C49F0CC4D041B24DE810B2304 + CDC4B4B4B46E8FF320B513A971BBB2AAAB6664CE641E7EE3A557E6D6D76CBC4D + 8261BACDE37A90B77F47051877CC607E3A403C333422C827D9098542BC07ED5D + D9693ADB511882A95E2834EC2BCBDE919E9E6E04CF5D401E201F912D04088DC8 + 584CA6FA567BB6A0530B9810D54F8286C9352FCFC89CC93CEBDAAE8F4E25C5C5 + 2F7DFBF4F1EE139BDE2EBFA2EEFEFDA6137FF92B0189661E2682A412013289EC + 70F05FABD5CAF75EEDD8CD46B08273A30F7AD749E7958CB2E1A6945F949D67B3 + D94E225037F1EB8F2859E8454CF337577633BC48C17F5D86DE95BC5925E6444E + 93ACA6EA454C349A7952EBBB1FCA59747A5100415ECE4848DADC74FDE2D58397 + CEDC3BF7BBF76B1449A94293CBF11585446E1B73D8EEACFEE28071BA2C23CC53 + 224B124551BE6740978D9A6CF302F6C99CB8005675C731D6D1E532696A12322B + 12E8ACF80087DE4AE5F3D4B4B4A46E664AE23085427144942C427069914C47CF + C36CBFC134CF67B6E5B09DFEAA9E90B3A30F736BAAC8C20A0189161F12705BE9 + 22BE9A2597767367A73ECB0C469A67A8F61D39CC67716AC92412FE4521B36B72 + E2BE61787CCBC9C3470328A22B952917FF7955EDBA74A158C863B204F89C208A + 4EE8EDE6F72B0EFEE96B601E214A1E37CFEAEBEB1389D58603AC30BC8234952D + C813426CE301B7A92D60FBB74024B4068DD69C526E62A580C68CA7C3641EF424 + CD98D541830F850B155F4BA552079129DC3C1367B26EDC3FC0088656C0D814D3 + 0B856DE690DFD4C346015364F58D1A7316845995F1645A3C0D83A79824C8EAE1 + D00F31AA8AA799BE48F3FC92D98AA5C736BE75944567B05FFDE4BD9306877502 + 3CD203DD01C233AC00CA074AAA2D5E34BF61CDA6952AFD906AE5E1FD6F823135 + 30EF2582C4CB9379E9D27F521FF7F455FE2A595E47A750587F37F45FF062213B + 9D4E37C9E5F27EB026EDBDBDBDB30C06C31CB06E05323A57F69A38A362C4ED78 + F09D73746F7979B9AAA4A4C44C98C73F2A03670E76F654BEC648ACA391C8AC6F + 91890B7E188BC94C0BD364153451C558D0F3E006D51DC9F4479AC79B47BE5292 + FAEBD36FFE7103C8B475EDB18F370F5BCD1A306E2102C02B420C9A60555DF586 + 4FFB0CC3F6B5C70E7E8E84D0B3607C90C8FCFFB7A0AEAE2E716B6B6B01629BAC + DE9A5DFA7A9804B9EEF3498D4249D2E3B4B434339FCF0F8020D94089C8A8A968 + 7E90BE65CCE3B09F18E83C259B33A775C9922A754646869DE8D470243360B255 + D726295FC7C824D7E34C61A32845F21CD3A7D517659A025B26021EFBBF2C8F00 + 531EC90C449AC7E1F140C52F6528AA4F6E7EE70D6F30D091BF7F470DD1289E4C + 5B995B9CDCB87EAB4A6FB338571EFEE0B83BE0BF8A671DAFBE88358F6789E6F5 + 7AE3F02CDCBDDB59C8F0052B56A766AD42A9E4417871FE3E91488437220C6487 + 3CAA1D92F0BB869A1C88DFF50FBDBA452C91DC292B2B552995CA71E2DD28F1FE + A79854A7A7621933795598491DE4AEA97C8AA9D70C4A2897EF364D8610D705DF + 588B3839F95926F26CC3C383C6D772F999DFEEA917F3E2C2602DAF02F723D3E6 + 8172461A4EF4345E3D7FEEB32B670F81FBEEE98FF3CC5687679F1D0C06056AB5 + 5ADADEDE5EB48826DACAA1D161DBBCB40F727373CD53FF09C3376FDE94E61B7C + 47DBEC86EF8D5CEA3F172E5CA802D9C18374105B141A51514F310BDD94AD6C0A + 0D0E2ECE7D8E99D93972B40B757CEF90C4456546EDF64073DBF67CFAADC16E19 + 5F73ECE3DF5CD959CF48E50B97B60F694E816D6E16688C173B1E6B6E6DFDEAC8 + 763077F499AD6EFA22135B521C8220828B17BF9B5FE4841B5C186A9B54A63429 + 3942263C66C983B3D2AFDFEEEF8DCF332175FA805BE555A4348075394804E924 + 965B381653A9B53778C9980D29CD6E9251D84C446BC86316E75CEFD0F4C767F6 + 8DD78D434115569C1595196B9FCFE9AFFFFC8721F3C4700237CE97CA17958279 + E1308605D46323D7841C6EC1C4A45D537DA47E03986B8861FEC91AC5B7257C39 + B5B4B4E4BEE26336DB4201238FC144B96152167833FE76C402213D74342C7386 + 82C313B3457B162D5A84078A9FCE5CC47A8FC9CCD7799A27E190115414CA0E86 + B3F0B2C76008B1D3E01EAA1F91B9C121CA5598199519D53C97C12CEAAFFFA21D + 9CEA609DC538DAFCC395DB2DF7DAC6762EA991AF2E585806B6C338AD797C002C + 89E560FA500CF3F845279A24EF6F5F3617ADE7CE3A0D4E75B035E833DEB58DF5 + 683C3673093F593A9727CE6353A81C93DF33D4C146B6AD5DBB7600FAF16486C4 + 661E2F5AE666022604DBC341636FC0D1A30B7BCDB9D478A982C2CD6392C81C2B + EA1FEA4FE74565462DFB8DA5AFFE727D71C52787AF9ED75E56DF6B03635AA25C + 1280E46F2D5E51B6627E117745E3BE75E07EE005E6F14309D3E7F3B1CF36352F + CF650BF75C1AEC7BA40B38FB1212C4460E8713B0D96C6C702E972C4C942E2890 + 48F9977DC6ED3B77BEF3109A3A88F8239ADD73CC6F3E6B5AAEC4987BAE4D0C3D + 32C081E79885EC8405F30549FC5BAC60546634F37853990354407CA1874469FB + 88729302C908C85D68EA1C10CBFC9373B856AB651D3FDE3C47AFD7CF65B15898 + 42211F2D2828B426274B508DE611BDBBFB9E58A7D3252108EA552A15AABD7BF7 + 8E403F9EC3433F17F37F481BBAFB015CE0A40000000049454E44AE426082} + end + object PNGButton10: TPNGButton + Tag = 10 + Left = 278 + Top = 39 + Width = 21 + Height = 15 + ImgStates = 3 + PngImg.Data = { + 89504E470D0A1A0A0000000D494844520000003F0000000F0806000000532517 + 72000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F33000008774944415478DAB5967B5053571E + C7EFCDFB0D7910082041824900157917A458BBA0F5C5D21D5F38756774B5CED6 + DDB1B5EEBAD6CE62655A2B6DC745A5752B3BDABAB3E37665AD3AD6D515AD5345 + 4110820425120C84007987BC937B93BBE7CA651B3591FED33BF39DCC3DF7E473 + 7FDFFBFB9DDF39308661107EC1300CC5BA369757F1762F5BFD9E62EFB63A701B + 88352F1C0E451B8609518018402C20F6E8E09090DDABDBE6295634A6A6A638C1 + 989710CEC7416128F61595A91F7824846EA8B6C1CB4B7F1213FE09E6E9D7FFF0 + D187F2C49477CF74DE5AB5E3F4979708D08BCC4F0747022213A2E30102712D16 + 8BC077BD73BB1025D53EE69276C92ACB6F30188C49F0CC4D041B24DE810B2304 + CDC4B4B4B46E8FF320B513A971BBB2AAAB6664CE641E7EE3A557E6D6D76CBC4D + 8261BACDE37A90B77F47051877CC607E3A403C333422C827D9098542BC07ED5D + D9693ADB511882A95E2834EC2BCBDE919E9E6E04CF5D401E201F912D04088DC8 + 584CA6FA567BB6A0530B9810D54F8286C9352FCFC89CC93CEBDAAE8F4E25C5C5 + 2F7DFBF4F1EE139BDE2EBFA2EEFEFDA6137FF92B0189661E2682A412013289EC + 70F05FABD5CAF75EEDD8CD46B08273A30F7AD749E7958CB2E1A6945F949D67B3 + D94E225037F1EB8F2859E8454CF337577633BC48C17F5D86DE95BC5925E6444E + 93ACA6EA454C349A7952EBBB1FCA59747A5100415ECE4848DADC74FDE2D58397 + CEDC3BF7BBF76B1449A94293CBF11585446E1B73D8EEACFEE28071BA2C23CC53 + 224B124551BE6740978D9A6CF302F6C99CB8005675C731D6D1E532696A12322B + 12E8ACF80087DE4AE5F3D4B4B4A46E664AE23085427144942C427069914C47CF + C36CBFC134CF67B6E5B09DFEAA9E90B3A30F736BAAC8C20A0189161F12705BE9 + 22BE9A2597767367A73ECB0C469A67A8F61D39CC67716AC92412FE4521B36B72 + E2BE61787CCBC9C3470328A22B952917FF7955EDBA74A158C863B204F89C208A + 4EE8EDE6F72B0EFEE96B601E214A1E37CFEAEBEB1389D58603AC30BC8234952D + C813426CE301B7A92D60FBB74024B4068DD69C526E62A580C68CA7C3641EF424 + CD98D541830F850B155F4BA552079129DC3C1367B26EDC3FC0088656C0D814D3 + 0B856DE690DFD4C346015364F58D1A7316845995F1645A3C0D83A79824C8EAE1 + D00F31AA8AA799BE48F3FC92D98AA5C736BE75944567B05FFDE4BD9306877502 + 3CD203DD01C233AC00CA074AAA2D5E34BF61CDA6952AFD906AE5E1FD6F823135 + 30EF2582C4CB9379E9D27F521FF7F455FE2A595E47A750587F37F45FF062213B + 9D4E37C9E5F27EB026EDBDBDBDB30C06C31CB06E05323A57F69A38A362C4ED78 + F09D73746F7979B9AAA4A4C44C98C73F2A03670E76F654BEC648ACA391C8AC6F + 91890B7E188BC94C0BD364153451C558D0F3E006D51DC9F4479AC79B47BE5292 + FAEBD36FFE7103C8B475EDB18F370F5BCD1A306E2102C02B420C9A60555DF586 + 4FFB0CC3F6B5C70E7E8E84D0B3607C90C8FCFFB7A0AEAE2E716B6B6B01629BAC + DE9A5DFA7A9804B9EEF3498D4249D2E3B4B434339FCF0F8020D94089C8A8A968 + 7E90BE65CCE3B09F18E83C259B33A775C9922A754646869DE8D470243360B255 + D726295FC7C824D7E34C61A32845F21CD3A7D517659A025B26021EFBBF2C8F00 + 531EC90C449AC7E1F140C52F6528AA4F6E7EE70D6F30D091BF7F470DD1289E4C + 5B995B9CDCB87EAB4A6FB338571EFEE0B83BE0BF8A671DAFBE88358F6789E6F5 + 7AE3F02CDCBDDB59C8F0052B56A766AD42A9E4417871FE3E91488437220C6487 + 3CAA1D92F0BB869A1C88DFF50FBDBA452C91DC292B2B552995CA71E2DD28F1FE + A79854A7A7621933795598491DE4AEA97C8AA9D70C4A2897EF364D8610D705DF + 588B3839F95926F26CC3C383C6D772F999DFEEA917F3E2C2602DAF02F723D3E6 + 8172461A4EF4345E3D7FEEB32B670F81FBEEE98FF3CC5687679F1D0C06056AB5 + 5ADADEDE5EB48826DACAA1D161DBBCB40F727373CD53FF09C3376FDE94E61B7C + 47DBEC86EF8D5CEA3F172E5CA802D9C18374105B141A51514F310BDD94AD6C0A + 0D0E2ECE7D8E99D93972B40B757CEF90C4456546EDF64073DBF67CFAADC16E19 + 5F73ECE3DF5CD959CF48E50B97B60F694E816D6E16688C173B1E6B6E6DFDEAC8 + 763077F499AD6EFA22135B521C8220828B17BF9B5FE4841B5C186A9B54A63429 + 3942263C66C983B3D2AFDFEEEF8DCF332175FA805BE555A4348075394804E924 + 965B381653A9B53778C9980D29CD6E9251D84C446BC86316E75CEFD0F4C767F6 + 8DD78D434115569C1595196B9FCFE9AFFFFC8721F3C4700237CE97CA17958279 + E1308605D46323D7841C6EC1C4A45D537DA47E03986B8861FEC91AC5B7257C39 + B5B4B4E4BEE26336DB4201238FC144B96152167833FE76C402213D74342C7386 + 82C313B3457B162D5A84078A9FCE5CC47A8FC9CCD7799A27E190115414CA0E86 + B3F0B2C76008B1D3E01EAA1F91B9C121CA5598199519D53C97C12CEAAFFFA21D + 9CEA609DC538DAFCC395DB2DF7DAC6762EA991AF2E585806B6C338AD797C002C + 89E560FA500CF3F845279A24EF6F5F3617ADE7CE3A0D4E75B035E833DEB58DF5 + 683C3673093F593A9727CE6353A81C93DF33D4C146B6AD5DBB7600FAF16486C4 + 661E2F5AE666022604DBC341636FC0D1A30B7BCDB9D478A982C2CD6392C81C2B + EA1FEA4FE74565462DFB8DA5AFFE727D71C52787AF9ED75E56DF6B03635AA25C + 1280E46F2D5E51B6627E117745E3BE75E07EE005E6F14309D3E7F3B1CF36352F + CF650BF75C1AEC7BA40B38FB1212C4460E8713B0D96C6C702E972C4C942E2890 + 48F9977DC6ED3B77BEF3109A3A88F8239ADD73CC6F3E6B5AAEC4987BAE4D0C3D + 32C081E79885EC8405F30549FC5BAC60546634F37853990354407CA1874469FB + 88729302C908C85D68EA1C10CBFC9373B856AB651D3FDE3C47AFD7CF65B15898 + 42211F2D2828B426274B508DE611BDBBFB9E58A7D3252108EA552A15AABD7BF7 + 8E403F9EC3433F17F37F481BBAFB015CE0A40000000049454E44AE426082} + end + object PNGButton11: TPNGButton + Tag = 1 + Left = 88 + Top = 63 + Width = 21 + Height = 15 + ImgStates = 3 + PngImg.Data = { + 89504E470D0A1A0A0000000D494844520000003F0000000F0806000000532517 + 72000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F33000008774944415478DAB5967B5053571E + C7EFCDFB0D7910082041824900157917A458BBA0F5C5D21D5F38756774B5CED6 + DDB1B5EEBAD6CE62655A2B6DC745A5752B3BDABAB3E37665AD3AD6D515AD5345 + 4110820425120C84007987BC937B93BBE7CA651B3591FED33BF39DCC3DF7E473 + 7FDFFBFB9DDF39308661107EC1300CC5BA369757F1762F5BFD9E62EFB63A701B + 88352F1C0E451B8609518018402C20F6E8E09090DDABDBE6295634A6A6A638C1 + 989710CEC7416128F61595A91F7824846EA8B6C1CB4B7F1213FE09E6E9D7FFF0 + D187F2C49477CF74DE5AB5E3F4979708D08BCC4F0747022213A2E30102712D16 + 8BC077BD73BB1025D53EE69276C92ACB6F30188C49F0CC4D041B24DE810B2304 + CDC4B4B4B46E8FF320B513A971BBB2AAAB6664CE641E7EE3A557E6D6D76CBC4D + 8261BACDE37A90B77F47051877CC607E3A403C333422C827D9098542BC07ED5D + D9693ADB511882A95E2834EC2BCBDE919E9E6E04CF5D401E201F912D04088DC8 + 584CA6FA567BB6A0530B9810D54F8286C9352FCFC89CC93CEBDAAE8F4E25C5C5 + 2F7DFBF4F1EE139BDE2EBFA2EEFEFDA6137FF92B0189661E2682A412013289EC + 70F05FABD5CAF75EEDD8CD46B08273A30F7AD749E7958CB2E1A6945F949D67B3 + D94E225037F1EB8F2859E8454CF337577633BC48C17F5D86DE95BC5925E6444E + 93ACA6EA454C349A7952EBBB1FCA59747A5100415ECE4848DADC74FDE2D58397 + CEDC3BF7BBF76B1449A94293CBF11585446E1B73D8EEACFEE28071BA2C23CC53 + 224B124551BE6740978D9A6CF302F6C99CB8005675C731D6D1E532696A12322B + 12E8ACF80087DE4AE5F3D4B4B4A46E664AE23085427144942C427069914C47CF + C36CBFC134CF67B6E5B09DFEAA9E90B3A30F736BAAC8C20A0189161F12705BE9 + 22BE9A2597767367A73ECB0C469A67A8F61D39CC67716AC92412FE4521B36B72 + E2BE61787CCBC9C3470328A22B952917FF7955EDBA74A158C863B204F89C208A + 4EE8EDE6F72B0EFEE96B601E214A1E37CFEAEBEB1389D58603AC30BC8234952D + C813426CE301B7A92D60FBB74024B4068DD69C526E62A580C68CA7C3641EF424 + CD98D541830F850B155F4BA552079129DC3C1367B26EDC3FC0088656C0D814D3 + 0B856DE690DFD4C346015364F58D1A7316845995F1645A3C0D83A79824C8EAE1 + D00F31AA8AA799BE48F3FC92D98AA5C736BE75944567B05FFDE4BD9306877502 + 3CD203DD01C233AC00CA074AAA2D5E34BF61CDA6952AFD906AE5E1FD6F823135 + 30EF2582C4CB9379E9D27F521FF7F455FE2A595E47A750587F37F45FF062213B + 9D4E37C9E5F27EB026EDBDBDBDB30C06C31CB06E05323A57F69A38A362C4ED78 + F09D73746F7979B9AAA4A4C44C98C73F2A03670E76F654BEC648ACA391C8AC6F + 91890B7E188BC94C0BD364153451C558D0F3E006D51DC9F4479AC79B47BE5292 + FAEBD36FFE7103C8B475EDB18F370F5BCD1A306E2102C02B420C9A60555DF586 + 4FFB0CC3F6B5C70E7E8E84D0B3607C90C8FCFFB7A0AEAE2E716B6B6B01629BAC + DE9A5DFA7A9804B9EEF3498D4249D2E3B4B434339FCF0F8020D94089C8A8A968 + 7E90BE65CCE3B09F18E83C259B33A775C9922A754646869DE8D470243360B255 + D726295FC7C824D7E34C61A32845F21CD3A7D517659A025B26021EFBBF2C8F00 + 531EC90C449AC7E1F140C52F6528AA4F6E7EE70D6F30D091BF7F470DD1289E4C + 5B995B9CDCB87EAB4A6FB338571EFEE0B83BE0BF8A671DAFBE88358F6789E6F5 + 7AE3F02CDCBDDB59C8F0052B56A766AD42A9E4417871FE3E91488437220C6487 + 3CAA1D92F0BB869A1C88DFF50FBDBA452C91DC292B2B552995CA71E2DD28F1FE + A79854A7A7621933795598491DE4AEA97C8AA9D70C4A2897EF364D8610D705DF + 588B3839F95926F26CC3C383C6D772F999DFEEA917F3E2C2602DAF02F723D3E6 + 8172461A4EF4345E3D7FEEB32B670F81FBEEE98FF3CC5687679F1D0C06056AB5 + 5ADADEDE5EB48826DACAA1D161DBBCB40F727373CD53FF09C3376FDE94E61B7C + 47DBEC86EF8D5CEA3F172E5CA802D9C18374105B141A51514F310BDD94AD6C0A + 0D0E2ECE7D8E99D93972B40B757CEF90C4456546EDF64073DBF67CFAADC16E19 + 5F73ECE3DF5CD959CF48E50B97B60F694E816D6E16688C173B1E6B6E6DFDEAC8 + 763077F499AD6EFA22135B521C8220828B17BF9B5FE4841B5C186A9B54A63429 + 3942263C66C983B3D2AFDFEEEF8DCF332175FA805BE555A4348075394804E924 + 965B381653A9B53778C9980D29CD6E9251D84C446BC86316E75CEFD0F4C767F6 + 8DD78D434115569C1595196B9FCFE9AFFFFC8721F3C4700237CE97CA17958279 + E1308605D46323D7841C6EC1C4A45D537DA47E03986B8861FEC91AC5B7257C39 + B5B4B4E4BEE26336DB4201238FC144B96152167833FE76C402213D74342C7386 + 82C313B3457B162D5A84078A9FCE5CC47A8FC9CCD7799A27E190115414CA0E86 + B3F0B2C76008B1D3E01EAA1F91B9C121CA5598199519D53C97C12CEAAFFFA21D + 9CEA609DC538DAFCC395DB2DF7DAC6762EA991AF2E585806B6C338AD797C002C + 89E560FA500CF3F845279A24EF6F5F3617ADE7CE3A0D4E75B035E833DEB58DF5 + 683C3673093F593A9727CE6353A81C93DF33D4C146B6AD5DBB7600FAF16486C4 + 661E2F5AE666022604DBC341636FC0D1A30B7BCDB9D478A982C2CD6392C81C2B + EA1FEA4FE74565462DFB8DA5AFFE727D71C52787AF9ED75E56DF6B03635AA25C + 1280E46F2D5E51B6627E117745E3BE75E07EE005E6F14309D3E7F3B1CF36352F + CF650BF75C1AEC7BA40B38FB1212C4460E8713B0D96C6C702E972C4C942E2890 + 48F9977DC6ED3B77BEF3109A3A88F8239ADD73CC6F3E6B5AAEC4987BAE4D0C3D + 32C081E79885EC8405F30549FC5BAC60546634F37853990354407CA1874469FB + 88729302C908C85D68EA1C10CBFC9373B856AB651D3FDE3C47AFD7CF65B15898 + 42211F2D2828B426274B508DE611BDBBFB9E58A7D3252108EA552A15AABD7BF7 + 8E403F9EC3433F17F37F481BBAFB015CE0A40000000049454E44AE426082} + OnClick = BtnClick + OnMouseEnter = BtnMouseEnter + OnMouseLeave = BtnMouseLeave + end + object PNGButton12: TPNGButton + Tag = 2 + Left = 109 + Top = 63 + Width = 21 + Height = 15 + ImgStates = 3 + PngImg.Data = { + 89504E470D0A1A0A0000000D494844520000003F0000000F0806000000532517 + 72000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F33000008774944415478DAB5967B5053571E + C7EFCDFB0D7910082041824900157917A458BBA0F5C5D21D5F38756774B5CED6 + DDB1B5EEBAD6CE62655A2B6DC745A5752B3BDABAB3E37665AD3AD6D515AD5345 + 4110820425120C84007987BC937B93BBE7CA651B3591FED33BF39DCC3DF7E473 + 7FDFFBFB9DDF39308661107EC1300CC5BA369757F1762F5BFD9E62EFB63A701B + 88352F1C0E451B8609518018402C20F6E8E09090DDABDBE6295634A6A6A638C1 + 989710CEC7416128F61595A91F7824846EA8B6C1CB4B7F1213FE09E6E9D7FFF0 + D187F2C49477CF74DE5AB5E3F4979708D08BCC4F0747022213A2E30102712D16 + 8BC077BD73BB1025D53EE69276C92ACB6F30188C49F0CC4D041B24DE810B2304 + CDC4B4B4B46E8FF320B513A971BBB2AAAB6664CE641E7EE3A557E6D6D76CBC4D + 8261BACDE37A90B77F47051877CC607E3A403C333422C827D9098542BC07ED5D + D9693ADB511882A95E2834EC2BCBDE919E9E6E04CF5D401E201F912D04088DC8 + 584CA6FA567BB6A0530B9810D54F8286C9352FCFC89CC93CEBDAAE8F4E25C5C5 + 2F7DFBF4F1EE139BDE2EBFA2EEFEFDA6137FF92B0189661E2682A412013289EC + 70F05FABD5CAF75EEDD8CD46B08273A30F7AD749E7958CB2E1A6945F949D67B3 + D94E225037F1EB8F2859E8454CF337577633BC48C17F5D86DE95BC5925E6444E + 93ACA6EA454C349A7952EBBB1FCA59747A5100415ECE4848DADC74FDE2D58397 + CEDC3BF7BBF76B1449A94293CBF11585446E1B73D8EEACFEE28071BA2C23CC53 + 224B124551BE6740978D9A6CF302F6C99CB8005675C731D6D1E532696A12322B + 12E8ACF80087DE4AE5F3D4B4B4A46E664AE23085427144942C427069914C47CF + C36CBFC134CF67B6E5B09DFEAA9E90B3A30F736BAAC8C20A0189161F12705BE9 + 22BE9A2597767367A73ECB0C469A67A8F61D39CC67716AC92412FE4521B36B72 + E2BE61787CCBC9C3470328A22B952917FF7955EDBA74A158C863B204F89C208A + 4EE8EDE6F72B0EFEE96B601E214A1E37CFEAEBEB1389D58603AC30BC8234952D + C813426CE301B7A92D60FBB74024B4068DD69C526E62A580C68CA7C3641EF424 + CD98D541830F850B155F4BA552079129DC3C1367B26EDC3FC0088656C0D814D3 + 0B856DE690DFD4C346015364F58D1A7316845995F1645A3C0D83A79824C8EAE1 + D00F31AA8AA799BE48F3FC92D98AA5C736BE75944567B05FFDE4BD9306877502 + 3CD203DD01C233AC00CA074AAA2D5E34BF61CDA6952AFD906AE5E1FD6F823135 + 30EF2582C4CB9379E9D27F521FF7F455FE2A595E47A750587F37F45FF062213B + 9D4E37C9E5F27EB026EDBDBDBDB30C06C31CB06E05323A57F69A38A362C4ED78 + F09D73746F7979B9AAA4A4C44C98C73F2A03670E76F654BEC648ACA391C8AC6F + 91890B7E188BC94C0BD364153451C558D0F3E006D51DC9F4479AC79B47BE5292 + FAEBD36FFE7103C8B475EDB18F370F5BCD1A306E2102C02B420C9A60555DF586 + 4FFB0CC3F6B5C70E7E8E84D0B3607C90C8FCFFB7A0AEAE2E716B6B6B01629BAC + DE9A5DFA7A9804B9EEF3498D4249D2E3B4B434339FCF0F8020D94089C8A8A968 + 7E90BE65CCE3B09F18E83C259B33A775C9922A754646869DE8D470243360B255 + D726295FC7C824D7E34C61A32845F21CD3A7D517659A025B26021EFBBF2C8F00 + 531EC90C449AC7E1F140C52F6528AA4F6E7EE70D6F30D091BF7F470DD1289E4C + 5B995B9CDCB87EAB4A6FB338571EFEE0B83BE0BF8A671DAFBE88358F6789E6F5 + 7AE3F02CDCBDDB59C8F0052B56A766AD42A9E4417871FE3E91488437220C6487 + 3CAA1D92F0BB869A1C88DFF50FBDBA452C91DC292B2B552995CA71E2DD28F1FE + A79854A7A7621933795598491DE4AEA97C8AA9D70C4A2897EF364D8610D705DF + 588B3839F95926F26CC3C383C6D772F999DFEEA917F3E2C2602DAF02F723D3E6 + 8172461A4EF4345E3D7FEEB32B670F81FBEEE98FF3CC5687679F1D0C06056AB5 + 5ADADEDE5EB48826DACAA1D161DBBCB40F727373CD53FF09C3376FDE94E61B7C + 47DBEC86EF8D5CEA3F172E5CA802D9C18374105B141A51514F310BDD94AD6C0A + 0D0E2ECE7D8E99D93972B40B757CEF90C4456546EDF64073DBF67CFAADC16E19 + 5F73ECE3DF5CD959CF48E50B97B60F694E816D6E16688C173B1E6B6E6DFDEAC8 + 763077F499AD6EFA22135B521C8220828B17BF9B5FE4841B5C186A9B54A63429 + 3942263C66C983B3D2AFDFEEEF8DCF332175FA805BE555A4348075394804E924 + 965B381653A9B53778C9980D29CD6E9251D84C446BC86316E75CEFD0F4C767F6 + 8DD78D434115569C1595196B9FCFE9AFFFFC8721F3C4700237CE97CA17958279 + E1308605D46323D7841C6EC1C4A45D537DA47E03986B8861FEC91AC5B7257C39 + B5B4B4E4BEE26336DB4201238FC144B96152167833FE76C402213D74342C7386 + 82C313B3457B162D5A84078A9FCE5CC47A8FC9CCD7799A27E190115414CA0E86 + B3F0B2C76008B1D3E01EAA1F91B9C121CA5598199519D53C97C12CEAAFFFA21D + 9CEA609DC538DAFCC395DB2DF7DAC6762EA991AF2E585806B6C338AD797C002C + 89E560FA500CF3F845279A24EF6F5F3617ADE7CE3A0D4E75B035E833DEB58DF5 + 683C3673093F593A9727CE6353A81C93DF33D4C146B6AD5DBB7600FAF16486C4 + 661E2F5AE666022604DBC341636FC0D1A30B7BCDB9D478A982C2CD6392C81C2B + EA1FEA4FE74565462DFB8DA5AFFE727D71C52787AF9ED75E56DF6B03635AA25C + 1280E46F2D5E51B6627E117745E3BE75E07EE005E6F14309D3E7F3B1CF36352F + CF650BF75C1AEC7BA40B38FB1212C4460E8713B0D96C6C702E972C4C942E2890 + 48F9977DC6ED3B77BEF3109A3A88F8239ADD73CC6F3E6B5AAEC4987BAE4D0C3D + 32C081E79885EC8405F30549FC5BAC60546634F37853990354407CA1874469FB + 88729302C908C85D68EA1C10CBFC9373B856AB651D3FDE3C47AFD7CF65B15898 + 42211F2D2828B426274B508DE611BDBBFB9E58A7D3252108EA552A15AABD7BF7 + 8E403F9EC3433F17F37F481BBAFB015CE0A40000000049454E44AE426082} + OnClick = BtnClick + OnMouseEnter = BtnMouseEnter + OnMouseLeave = BtnMouseLeave + end + object PNGButton13: TPNGButton + Tag = 3 + Left = 130 + Top = 63 + Width = 21 + Height = 15 + ImgStates = 3 + PngImg.Data = { + 89504E470D0A1A0A0000000D494844520000003F0000000F0806000000532517 + 72000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F33000008774944415478DAB5967B5053571E + C7EFCDFB0D7910082041824900157917A458BBA0F5C5D21D5F38756774B5CED6 + DDB1B5EEBAD6CE62655A2B6DC745A5752B3BDABAB3E37665AD3AD6D515AD5345 + 4110820425120C84007987BC937B93BBE7CA651B3591FED33BF39DCC3DF7E473 + 7FDFFBFB9DDF39308661107EC1300CC5BA369757F1762F5BFD9E62EFB63A701B + 88352F1C0E451B8609518018402C20F6E8E09090DDABDBE6295634A6A6A638C1 + 989710CEC7416128F61595A91F7824846EA8B6C1CB4B7F1213FE09E6E9D7FFF0 + D187F2C49477CF74DE5AB5E3F4979708D08BCC4F0747022213A2E30102712D16 + 8BC077BD73BB1025D53EE69276C92ACB6F30188C49F0CC4D041B24DE810B2304 + CDC4B4B4B46E8FF320B513A971BBB2AAAB6664CE641E7EE3A557E6D6D76CBC4D + 8261BACDE37A90B77F47051877CC607E3A403C333422C827D9098542BC07ED5D + D9693ADB511882A95E2834EC2BCBDE919E9E6E04CF5D401E201F912D04088DC8 + 584CA6FA567BB6A0530B9810D54F8286C9352FCFC89CC93CEBDAAE8F4E25C5C5 + 2F7DFBF4F1EE139BDE2EBFA2EEFEFDA6137FF92B0189661E2682A412013289EC + 70F05FABD5CAF75EEDD8CD46B08273A30F7AD749E7958CB2E1A6945F949D67B3 + D94E225037F1EB8F2859E8454CF337577633BC48C17F5D86DE95BC5925E6444E + 93ACA6EA454C349A7952EBBB1FCA59747A5100415ECE4848DADC74FDE2D58397 + CEDC3BF7BBF76B1449A94293CBF11585446E1B73D8EEACFEE28071BA2C23CC53 + 224B124551BE6740978D9A6CF302F6C99CB8005675C731D6D1E532696A12322B + 12E8ACF80087DE4AE5F3D4B4B4A46E664AE23085427144942C427069914C47CF + C36CBFC134CF67B6E5B09DFEAA9E90B3A30F736BAAC8C20A0189161F12705BE9 + 22BE9A2597767367A73ECB0C469A67A8F61D39CC67716AC92412FE4521B36B72 + E2BE61787CCBC9C3470328A22B952917FF7955EDBA74A158C863B204F89C208A + 4EE8EDE6F72B0EFEE96B601E214A1E37CFEAEBEB1389D58603AC30BC8234952D + C813426CE301B7A92D60FBB74024B4068DD69C526E62A580C68CA7C3641EF424 + CD98D541830F850B155F4BA552079129DC3C1367B26EDC3FC0088656C0D814D3 + 0B856DE690DFD4C346015364F58D1A7316845995F1645A3C0D83A79824C8EAE1 + D00F31AA8AA799BE48F3FC92D98AA5C736BE75944567B05FFDE4BD9306877502 + 3CD203DD01C233AC00CA074AAA2D5E34BF61CDA6952AFD906AE5E1FD6F823135 + 30EF2582C4CB9379E9D27F521FF7F455FE2A595E47A750587F37F45FF062213B + 9D4E37C9E5F27EB026EDBDBDBDB30C06C31CB06E05323A57F69A38A362C4ED78 + F09D73746F7979B9AAA4A4C44C98C73F2A03670E76F654BEC648ACA391C8AC6F + 91890B7E188BC94C0BD364153451C558D0F3E006D51DC9F4479AC79B47BE5292 + FAEBD36FFE7103C8B475EDB18F370F5BCD1A306E2102C02B420C9A60555DF586 + 4FFB0CC3F6B5C70E7E8E84D0B3607C90C8FCFFB7A0AEAE2E716B6B6B01629BAC + DE9A5DFA7A9804B9EEF3498D4249D2E3B4B434339FCF0F8020D94089C8A8A968 + 7E90BE65CCE3B09F18E83C259B33A775C9922A754646869DE8D470243360B255 + D726295FC7C824D7E34C61A32845F21CD3A7D517659A025B26021EFBBF2C8F00 + 531EC90C449AC7E1F140C52F6528AA4F6E7EE70D6F30D091BF7F470DD1289E4C + 5B995B9CDCB87EAB4A6FB338571EFEE0B83BE0BF8A671DAFBE88358F6789E6F5 + 7AE3F02CDCBDDB59C8F0052B56A766AD42A9E4417871FE3E91488437220C6487 + 3CAA1D92F0BB869A1C88DFF50FBDBA452C91DC292B2B552995CA71E2DD28F1FE + A79854A7A7621933795598491DE4AEA97C8AA9D70C4A2897EF364D8610D705DF + 588B3839F95926F26CC3C383C6D772F999DFEEA917F3E2C2602DAF02F723D3E6 + 8172461A4EF4345E3D7FEEB32B670F81FBEEE98FF3CC5687679F1D0C06056AB5 + 5ADADEDE5EB48826DACAA1D161DBBCB40F727373CD53FF09C3376FDE94E61B7C + 47DBEC86EF8D5CEA3F172E5CA802D9C18374105B141A51514F310BDD94AD6C0A + 0D0E2ECE7D8E99D93972B40B757CEF90C4456546EDF64073DBF67CFAADC16E19 + 5F73ECE3DF5CD959CF48E50B97B60F694E816D6E16688C173B1E6B6E6DFDEAC8 + 763077F499AD6EFA22135B521C8220828B17BF9B5FE4841B5C186A9B54A63429 + 3942263C66C983B3D2AFDFEEEF8DCF332175FA805BE555A4348075394804E924 + 965B381653A9B53778C9980D29CD6E9251D84C446BC86316E75CEFD0F4C767F6 + 8DD78D434115569C1595196B9FCFE9AFFFFC8721F3C4700237CE97CA17958279 + E1308605D46323D7841C6EC1C4A45D537DA47E03986B8861FEC91AC5B7257C39 + B5B4B4E4BEE26336DB4201238FC144B96152167833FE76C402213D74342C7386 + 82C313B3457B162D5A84078A9FCE5CC47A8FC9CCD7799A27E190115414CA0E86 + B3F0B2C76008B1D3E01EAA1F91B9C121CA5598199519D53C97C12CEAAFFFA21D + 9CEA609DC538DAFCC395DB2DF7DAC6762EA991AF2E585806B6C338AD797C002C + 89E560FA500CF3F845279A24EF6F5F3617ADE7CE3A0D4E75B035E833DEB58DF5 + 683C3673093F593A9727CE6353A81C93DF33D4C146B6AD5DBB7600FAF16486C4 + 661E2F5AE666022604DBC341636FC0D1A30B7BCDB9D478A982C2CD6392C81C2B + EA1FEA4FE74565462DFB8DA5AFFE727D71C52787AF9ED75E56DF6B03635AA25C + 1280E46F2D5E51B6627E117745E3BE75E07EE005E6F14309D3E7F3B1CF36352F + CF650BF75C1AEC7BA40B38FB1212C4460E8713B0D96C6C702E972C4C942E2890 + 48F9977DC6ED3B77BEF3109A3A88F8239ADD73CC6F3E6B5AAEC4987BAE4D0C3D + 32C081E79885EC8405F30549FC5BAC60546634F37853990354407CA1874469FB + 88729302C908C85D68EA1C10CBFC9373B856AB651D3FDE3C47AFD7CF65B15898 + 42211F2D2828B426274B508DE611BDBBFB9E58A7D3252108EA552A15AABD7BF7 + 8E403F9EC3433F17F37F481BBAFB015CE0A40000000049454E44AE426082} + OnClick = BtnClick + OnMouseEnter = BtnMouseEnter + OnMouseLeave = BtnMouseLeave + end + object PNGButton14: TPNGButton + Tag = 4 + Left = 151 + Top = 63 + Width = 21 + Height = 15 + ImgStates = 3 + PngImg.Data = { + 89504E470D0A1A0A0000000D494844520000003F0000000F0806000000532517 + 72000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F33000008774944415478DAB5967B5053571E + C7EFCDFB0D7910082041824900157917A458BBA0F5C5D21D5F38756774B5CED6 + DDB1B5EEBAD6CE62655A2B6DC745A5752B3BDABAB3E37665AD3AD6D515AD5345 + 4110820425120C84007987BC937B93BBE7CA651B3591FED33BF39DCC3DF7E473 + 7FDFFBFB9DDF39308661107EC1300CC5BA369757F1762F5BFD9E62EFB63A701B + 88352F1C0E451B8609518018402C20F6E8E09090DDABDBE6295634A6A6A638C1 + 989710CEC7416128F61595A91F7824846EA8B6C1CB4B7F1213FE09E6E9D7FFF0 + D187F2C49477CF74DE5AB5E3F4979708D08BCC4F0747022213A2E30102712D16 + 8BC077BD73BB1025D53EE69276C92ACB6F30188C49F0CC4D041B24DE810B2304 + CDC4B4B4B46E8FF320B513A971BBB2AAAB6664CE641E7EE3A557E6D6D76CBC4D + 8261BACDE37A90B77F47051877CC607E3A403C333422C827D9098542BC07ED5D + D9693ADB511882A95E2834EC2BCBDE919E9E6E04CF5D401E201F912D04088DC8 + 584CA6FA567BB6A0530B9810D54F8286C9352FCFC89CC93CEBDAAE8F4E25C5C5 + 2F7DFBF4F1EE139BDE2EBFA2EEFEFDA6137FF92B0189661E2682A412013289EC + 70F05FABD5CAF75EEDD8CD46B08273A30F7AD749E7958CB2E1A6945F949D67B3 + D94E225037F1EB8F2859E8454CF337577633BC48C17F5D86DE95BC5925E6444E + 93ACA6EA454C349A7952EBBB1FCA59747A5100415ECE4848DADC74FDE2D58397 + CEDC3BF7BBF76B1449A94293CBF11585446E1B73D8EEACFEE28071BA2C23CC53 + 224B124551BE6740978D9A6CF302F6C99CB8005675C731D6D1E532696A12322B + 12E8ACF80087DE4AE5F3D4B4B4A46E664AE23085427144942C427069914C47CF + C36CBFC134CF67B6E5B09DFEAA9E90B3A30F736BAAC8C20A0189161F12705BE9 + 22BE9A2597767367A73ECB0C469A67A8F61D39CC67716AC92412FE4521B36B72 + E2BE61787CCBC9C3470328A22B952917FF7955EDBA74A158C863B204F89C208A + 4EE8EDE6F72B0EFEE96B601E214A1E37CFEAEBEB1389D58603AC30BC8234952D + C813426CE301B7A92D60FBB74024B4068DD69C526E62A580C68CA7C3641EF424 + CD98D541830F850B155F4BA552079129DC3C1367B26EDC3FC0088656C0D814D3 + 0B856DE690DFD4C346015364F58D1A7316845995F1645A3C0D83A79824C8EAE1 + D00F31AA8AA799BE48F3FC92D98AA5C736BE75944567B05FFDE4BD9306877502 + 3CD203DD01C233AC00CA074AAA2D5E34BF61CDA6952AFD906AE5E1FD6F823135 + 30EF2582C4CB9379E9D27F521FF7F455FE2A595E47A750587F37F45FF062213B + 9D4E37C9E5F27EB026EDBDBDBDB30C06C31CB06E05323A57F69A38A362C4ED78 + F09D73746F7979B9AAA4A4C44C98C73F2A03670E76F654BEC648ACA391C8AC6F + 91890B7E188BC94C0BD364153451C558D0F3E006D51DC9F4479AC79B47BE5292 + FAEBD36FFE7103C8B475EDB18F370F5BCD1A306E2102C02B420C9A60555DF586 + 4FFB0CC3F6B5C70E7E8E84D0B3607C90C8FCFFB7A0AEAE2E716B6B6B01629BAC + DE9A5DFA7A9804B9EEF3498D4249D2E3B4B434339FCF0F8020D94089C8A8A968 + 7E90BE65CCE3B09F18E83C259B33A775C9922A754646869DE8D470243360B255 + D726295FC7C824D7E34C61A32845F21CD3A7D517659A025B26021EFBBF2C8F00 + 531EC90C449AC7E1F140C52F6528AA4F6E7EE70D6F30D091BF7F470DD1289E4C + 5B995B9CDCB87EAB4A6FB338571EFEE0B83BE0BF8A671DAFBE88358F6789E6F5 + 7AE3F02CDCBDDB59C8F0052B56A766AD42A9E4417871FE3E91488437220C6487 + 3CAA1D92F0BB869A1C88DFF50FBDBA452C91DC292B2B552995CA71E2DD28F1FE + A79854A7A7621933795598491DE4AEA97C8AA9D70C4A2897EF364D8610D705DF + 588B3839F95926F26CC3C383C6D772F999DFEEA917F3E2C2602DAF02F723D3E6 + 8172461A4EF4345E3D7FEEB32B670F81FBEEE98FF3CC5687679F1D0C06056AB5 + 5ADADEDE5EB48826DACAA1D161DBBCB40F727373CD53FF09C3376FDE94E61B7C + 47DBEC86EF8D5CEA3F172E5CA802D9C18374105B141A51514F310BDD94AD6C0A + 0D0E2ECE7D8E99D93972B40B757CEF90C4456546EDF64073DBF67CFAADC16E19 + 5F73ECE3DF5CD959CF48E50B97B60F694E816D6E16688C173B1E6B6E6DFDEAC8 + 763077F499AD6EFA22135B521C8220828B17BF9B5FE4841B5C186A9B54A63429 + 3942263C66C983B3D2AFDFEEEF8DCF332175FA805BE555A4348075394804E924 + 965B381653A9B53778C9980D29CD6E9251D84C446BC86316E75CEFD0F4C767F6 + 8DD78D434115569C1595196B9FCFE9AFFFFC8721F3C4700237CE97CA17958279 + E1308605D46323D7841C6EC1C4A45D537DA47E03986B8861FEC91AC5B7257C39 + B5B4B4E4BEE26336DB4201238FC144B96152167833FE76C402213D74342C7386 + 82C313B3457B162D5A84078A9FCE5CC47A8FC9CCD7799A27E190115414CA0E86 + B3F0B2C76008B1D3E01EAA1F91B9C121CA5598199519D53C97C12CEAAFFFA21D + 9CEA609DC538DAFCC395DB2DF7DAC6762EA991AF2E585806B6C338AD797C002C + 89E560FA500CF3F845279A24EF6F5F3617ADE7CE3A0D4E75B035E833DEB58DF5 + 683C3673093F593A9727CE6353A81C93DF33D4C146B6AD5DBB7600FAF16486C4 + 661E2F5AE666022604DBC341636FC0D1A30B7BCDB9D478A982C2CD6392C81C2B + EA1FEA4FE74565462DFB8DA5AFFE727D71C52787AF9ED75E56DF6B03635AA25C + 1280E46F2D5E51B6627E117745E3BE75E07EE005E6F14309D3E7F3B1CF36352F + CF650BF75C1AEC7BA40B38FB1212C4460E8713B0D96C6C702E972C4C942E2890 + 48F9977DC6ED3B77BEF3109A3A88F8239ADD73CC6F3E6B5AAEC4987BAE4D0C3D + 32C081E79885EC8405F30549FC5BAC60546634F37853990354407CA1874469FB + 88729302C908C85D68EA1C10CBFC9373B856AB651D3FDE3C47AFD7CF65B15898 + 42211F2D2828B426274B508DE611BDBBFB9E58A7D3252108EA552A15AABD7BF7 + 8E403F9EC3433F17F37F481BBAFB015CE0A40000000049454E44AE426082} + OnClick = BtnClick + OnMouseEnter = BtnMouseEnter + OnMouseLeave = BtnMouseLeave + end + object PNGButton15: TPNGButton + Tag = 5 + Left = 172 + Top = 63 + Width = 21 + Height = 15 + ImgStates = 3 + PngImg.Data = { + 89504E470D0A1A0A0000000D494844520000003F0000000F0806000000532517 + 72000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F33000008774944415478DAB5967B5053571E + C7EFCDFB0D7910082041824900157917A458BBA0F5C5D21D5F38756774B5CED6 + DDB1B5EEBAD6CE62655A2B6DC745A5752B3BDABAB3E37665AD3AD6D515AD5345 + 4110820425120C84007987BC937B93BBE7CA651B3591FED33BF39DCC3DF7E473 + 7FDFFBFB9DDF39308661107EC1300CC5BA369757F1762F5BFD9E62EFB63A701B + 88352F1C0E451B8609518018402C20F6E8E09090DDABDBE6295634A6A6A638C1 + 989710CEC7416128F61595A91F7824846EA8B6C1CB4B7F1213FE09E6E9D7FFF0 + D187F2C49477CF74DE5AB5E3F4979708D08BCC4F0747022213A2E30102712D16 + 8BC077BD73BB1025D53EE69276C92ACB6F30188C49F0CC4D041B24DE810B2304 + CDC4B4B4B46E8FF320B513A971BBB2AAAB6664CE641E7EE3A557E6D6D76CBC4D + 8261BACDE37A90B77F47051877CC607E3A403C333422C827D9098542BC07ED5D + D9693ADB511882A95E2834EC2BCBDE919E9E6E04CF5D401E201F912D04088DC8 + 584CA6FA567BB6A0530B9810D54F8286C9352FCFC89CC93CEBDAAE8F4E25C5C5 + 2F7DFBF4F1EE139BDE2EBFA2EEFEFDA6137FF92B0189661E2682A412013289EC + 70F05FABD5CAF75EEDD8CD46B08273A30F7AD749E7958CB2E1A6945F949D67B3 + D94E225037F1EB8F2859E8454CF337577633BC48C17F5D86DE95BC5925E6444E + 93ACA6EA454C349A7952EBBB1FCA59747A5100415ECE4848DADC74FDE2D58397 + CEDC3BF7BBF76B1449A94293CBF11585446E1B73D8EEACFEE28071BA2C23CC53 + 224B124551BE6740978D9A6CF302F6C99CB8005675C731D6D1E532696A12322B + 12E8ACF80087DE4AE5F3D4B4B4A46E664AE23085427144942C427069914C47CF + C36CBFC134CF67B6E5B09DFEAA9E90B3A30F736BAAC8C20A0189161F12705BE9 + 22BE9A2597767367A73ECB0C469A67A8F61D39CC67716AC92412FE4521B36B72 + E2BE61787CCBC9C3470328A22B952917FF7955EDBA74A158C863B204F89C208A + 4EE8EDE6F72B0EFEE96B601E214A1E37CFEAEBEB1389D58603AC30BC8234952D + C813426CE301B7A92D60FBB74024B4068DD69C526E62A580C68CA7C3641EF424 + CD98D541830F850B155F4BA552079129DC3C1367B26EDC3FC0088656C0D814D3 + 0B856DE690DFD4C346015364F58D1A7316845995F1645A3C0D83A79824C8EAE1 + D00F31AA8AA799BE48F3FC92D98AA5C736BE75944567B05FFDE4BD9306877502 + 3CD203DD01C233AC00CA074AAA2D5E34BF61CDA6952AFD906AE5E1FD6F823135 + 30EF2582C4CB9379E9D27F521FF7F455FE2A595E47A750587F37F45FF062213B + 9D4E37C9E5F27EB026EDBDBDBDB30C06C31CB06E05323A57F69A38A362C4ED78 + F09D73746F7979B9AAA4A4C44C98C73F2A03670E76F654BEC648ACA391C8AC6F + 91890B7E188BC94C0BD364153451C558D0F3E006D51DC9F4479AC79B47BE5292 + FAEBD36FFE7103C8B475EDB18F370F5BCD1A306E2102C02B420C9A60555DF586 + 4FFB0CC3F6B5C70E7E8E84D0B3607C90C8FCFFB7A0AEAE2E716B6B6B01629BAC + DE9A5DFA7A9804B9EEF3498D4249D2E3B4B434339FCF0F8020D94089C8A8A968 + 7E90BE65CCE3B09F18E83C259B33A775C9922A754646869DE8D470243360B255 + D726295FC7C824D7E34C61A32845F21CD3A7D517659A025B26021EFBBF2C8F00 + 531EC90C449AC7E1F140C52F6528AA4F6E7EE70D6F30D091BF7F470DD1289E4C + 5B995B9CDCB87EAB4A6FB338571EFEE0B83BE0BF8A671DAFBE88358F6789E6F5 + 7AE3F02CDCBDDB59C8F0052B56A766AD42A9E4417871FE3E91488437220C6487 + 3CAA1D92F0BB869A1C88DFF50FBDBA452C91DC292B2B552995CA71E2DD28F1FE + A79854A7A7621933795598491DE4AEA97C8AA9D70C4A2897EF364D8610D705DF + 588B3839F95926F26CC3C383C6D772F999DFEEA917F3E2C2602DAF02F723D3E6 + 8172461A4EF4345E3D7FEEB32B670F81FBEEE98FF3CC5687679F1D0C06056AB5 + 5ADADEDE5EB48826DACAA1D161DBBCB40F727373CD53FF09C3376FDE94E61B7C + 47DBEC86EF8D5CEA3F172E5CA802D9C18374105B141A51514F310BDD94AD6C0A + 0D0E2ECE7D8E99D93972B40B757CEF90C4456546EDF64073DBF67CFAADC16E19 + 5F73ECE3DF5CD959CF48E50B97B60F694E816D6E16688C173B1E6B6E6DFDEAC8 + 763077F499AD6EFA22135B521C8220828B17BF9B5FE4841B5C186A9B54A63429 + 3942263C66C983B3D2AFDFEEEF8DCF332175FA805BE555A4348075394804E924 + 965B381653A9B53778C9980D29CD6E9251D84C446BC86316E75CEFD0F4C767F6 + 8DD78D434115569C1595196B9FCFE9AFFFFC8721F3C4700237CE97CA17958279 + E1308605D46323D7841C6EC1C4A45D537DA47E03986B8861FEC91AC5B7257C39 + B5B4B4E4BEE26336DB4201238FC144B96152167833FE76C402213D74342C7386 + 82C313B3457B162D5A84078A9FCE5CC47A8FC9CCD7799A27E190115414CA0E86 + B3F0B2C76008B1D3E01EAA1F91B9C121CA5598199519D53C97C12CEAAFFFA21D + 9CEA609DC538DAFCC395DB2DF7DAC6762EA991AF2E585806B6C338AD797C002C + 89E560FA500CF3F845279A24EF6F5F3617ADE7CE3A0D4E75B035E833DEB58DF5 + 683C3673093F593A9727CE6353A81C93DF33D4C146B6AD5DBB7600FAF16486C4 + 661E2F5AE666022604DBC341636FC0D1A30B7BCDB9D478A982C2CD6392C81C2B + EA1FEA4FE74565462DFB8DA5AFFE727D71C52787AF9ED75E56DF6B03635AA25C + 1280E46F2D5E51B6627E117745E3BE75E07EE005E6F14309D3E7F3B1CF36352F + CF650BF75C1AEC7BA40B38FB1212C4460E8713B0D96C6C702E972C4C942E2890 + 48F9977DC6ED3B77BEF3109A3A88F8239ADD73CC6F3E6B5AAEC4987BAE4D0C3D + 32C081E79885EC8405F30549FC5BAC60546634F37853990354407CA1874469FB + 88729302C908C85D68EA1C10CBFC9373B856AB651D3FDE3C47AFD7CF65B15898 + 42211F2D2828B426274B508DE611BDBBFB9E58A7D3252108EA552A15AABD7BF7 + 8E403F9EC3433F17F37F481BBAFB015CE0A40000000049454E44AE426082} + OnClick = BtnClick + OnMouseEnter = BtnMouseEnter + OnMouseLeave = BtnMouseLeave + end + object PNGButton16: TPNGButton + Tag = 6 + Left = 193 + Top = 63 + Width = 21 + Height = 15 + ImgStates = 3 + PngImg.Data = { + 89504E470D0A1A0A0000000D494844520000003F0000000F0806000000532517 + 72000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F33000008774944415478DAB5967B5053571E + C7EFCDFB0D7910082041824900157917A458BBA0F5C5D21D5F38756774B5CED6 + DDB1B5EEBAD6CE62655A2B6DC745A5752B3BDABAB3E37665AD3AD6D515AD5345 + 4110820425120C84007987BC937B93BBE7CA651B3591FED33BF39DCC3DF7E473 + 7FDFFBFB9DDF39308661107EC1300CC5BA369757F1762F5BFD9E62EFB63A701B + 88352F1C0E451B8609518018402C20F6E8E09090DDABDBE6295634A6A6A638C1 + 989710CEC7416128F61595A91F7824846EA8B6C1CB4B7F1213FE09E6E9D7FFF0 + D187F2C49477CF74DE5AB5E3F4979708D08BCC4F0747022213A2E30102712D16 + 8BC077BD73BB1025D53EE69276C92ACB6F30188C49F0CC4D041B24DE810B2304 + CDC4B4B4B46E8FF320B513A971BBB2AAAB6664CE641E7EE3A557E6D6D76CBC4D + 8261BACDE37A90B77F47051877CC607E3A403C333422C827D9098542BC07ED5D + D9693ADB511882A95E2834EC2BCBDE919E9E6E04CF5D401E201F912D04088DC8 + 584CA6FA567BB6A0530B9810D54F8286C9352FCFC89CC93CEBDAAE8F4E25C5C5 + 2F7DFBF4F1EE139BDE2EBFA2EEFEFDA6137FF92B0189661E2682A412013289EC + 70F05FABD5CAF75EEDD8CD46B08273A30F7AD749E7958CB2E1A6945F949D67B3 + D94E225037F1EB8F2859E8454CF337577633BC48C17F5D86DE95BC5925E6444E + 93ACA6EA454C349A7952EBBB1FCA59747A5100415ECE4848DADC74FDE2D58397 + CEDC3BF7BBF76B1449A94293CBF11585446E1B73D8EEACFEE28071BA2C23CC53 + 224B124551BE6740978D9A6CF302F6C99CB8005675C731D6D1E532696A12322B + 12E8ACF80087DE4AE5F3D4B4B4A46E664AE23085427144942C427069914C47CF + C36CBFC134CF67B6E5B09DFEAA9E90B3A30F736BAAC8C20A0189161F12705BE9 + 22BE9A2597767367A73ECB0C469A67A8F61D39CC67716AC92412FE4521B36B72 + E2BE61787CCBC9C3470328A22B952917FF7955EDBA74A158C863B204F89C208A + 4EE8EDE6F72B0EFEE96B601E214A1E37CFEAEBEB1389D58603AC30BC8234952D + C813426CE301B7A92D60FBB74024B4068DD69C526E62A580C68CA7C3641EF424 + CD98D541830F850B155F4BA552079129DC3C1367B26EDC3FC0088656C0D814D3 + 0B856DE690DFD4C346015364F58D1A7316845995F1645A3C0D83A79824C8EAE1 + D00F31AA8AA799BE48F3FC92D98AA5C736BE75944567B05FFDE4BD9306877502 + 3CD203DD01C233AC00CA074AAA2D5E34BF61CDA6952AFD906AE5E1FD6F823135 + 30EF2582C4CB9379E9D27F521FF7F455FE2A595E47A750587F37F45FF062213B + 9D4E37C9E5F27EB026EDBDBDBDB30C06C31CB06E05323A57F69A38A362C4ED78 + F09D73746F7979B9AAA4A4C44C98C73F2A03670E76F654BEC648ACA391C8AC6F + 91890B7E188BC94C0BD364153451C558D0F3E006D51DC9F4479AC79B47BE5292 + FAEBD36FFE7103C8B475EDB18F370F5BCD1A306E2102C02B420C9A60555DF586 + 4FFB0CC3F6B5C70E7E8E84D0B3607C90C8FCFFB7A0AEAE2E716B6B6B01629BAC + DE9A5DFA7A9804B9EEF3498D4249D2E3B4B434339FCF0F8020D94089C8A8A968 + 7E90BE65CCE3B09F18E83C259B33A775C9922A754646869DE8D470243360B255 + D726295FC7C824D7E34C61A32845F21CD3A7D517659A025B26021EFBBF2C8F00 + 531EC90C449AC7E1F140C52F6528AA4F6E7EE70D6F30D091BF7F470DD1289E4C + 5B995B9CDCB87EAB4A6FB338571EFEE0B83BE0BF8A671DAFBE88358F6789E6F5 + 7AE3F02CDCBDDB59C8F0052B56A766AD42A9E4417871FE3E91488437220C6487 + 3CAA1D92F0BB869A1C88DFF50FBDBA452C91DC292B2B552995CA71E2DD28F1FE + A79854A7A7621933795598491DE4AEA97C8AA9D70C4A2897EF364D8610D705DF + 588B3839F95926F26CC3C383C6D772F999DFEEA917F3E2C2602DAF02F723D3E6 + 8172461A4EF4345E3D7FEEB32B670F81FBEEE98FF3CC5687679F1D0C06056AB5 + 5ADADEDE5EB48826DACAA1D161DBBCB40F727373CD53FF09C3376FDE94E61B7C + 47DBEC86EF8D5CEA3F172E5CA802D9C18374105B141A51514F310BDD94AD6C0A + 0D0E2ECE7D8E99D93972B40B757CEF90C4456546EDF64073DBF67CFAADC16E19 + 5F73ECE3DF5CD959CF48E50B97B60F694E816D6E16688C173B1E6B6E6DFDEAC8 + 763077F499AD6EFA22135B521C8220828B17BF9B5FE4841B5C186A9B54A63429 + 3942263C66C983B3D2AFDFEEEF8DCF332175FA805BE555A4348075394804E924 + 965B381653A9B53778C9980D29CD6E9251D84C446BC86316E75CEFD0F4C767F6 + 8DD78D434115569C1595196B9FCFE9AFFFFC8721F3C4700237CE97CA17958279 + E1308605D46323D7841C6EC1C4A45D537DA47E03986B8861FEC91AC5B7257C39 + B5B4B4E4BEE26336DB4201238FC144B96152167833FE76C402213D74342C7386 + 82C313B3457B162D5A84078A9FCE5CC47A8FC9CCD7799A27E190115414CA0E86 + B3F0B2C76008B1D3E01EAA1F91B9C121CA5598199519D53C97C12CEAAFFFA21D + 9CEA609DC538DAFCC395DB2DF7DAC6762EA991AF2E585806B6C338AD797C002C + 89E560FA500CF3F845279A24EF6F5F3617ADE7CE3A0D4E75B035E833DEB58DF5 + 683C3673093F593A9727CE6353A81C93DF33D4C146B6AD5DBB7600FAF16486C4 + 661E2F5AE666022604DBC341636FC0D1A30B7BCDB9D478A982C2CD6392C81C2B + EA1FEA4FE74565462DFB8DA5AFFE727D71C52787AF9ED75E56DF6B03635AA25C + 1280E46F2D5E51B6627E117745E3BE75E07EE005E6F14309D3E7F3B1CF36352F + CF650BF75C1AEC7BA40B38FB1212C4460E8713B0D96C6C702E972C4C942E2890 + 48F9977DC6ED3B77BEF3109A3A88F8239ADD73CC6F3E6B5AAEC4987BAE4D0C3D + 32C081E79885EC8405F30549FC5BAC60546634F37853990354407CA1874469FB + 88729302C908C85D68EA1C10CBFC9373B856AB651D3FDE3C47AFD7CF65B15898 + 42211F2D2828B426274B508DE611BDBBFB9E58A7D3252108EA552A15AABD7BF7 + 8E403F9EC3433F17F37F481BBAFB015CE0A40000000049454E44AE426082} + OnClick = BtnClick + OnMouseEnter = BtnMouseEnter + OnMouseLeave = BtnMouseLeave + end + object PNGButton17: TPNGButton + Tag = 7 + Left = 214 + Top = 63 + Width = 21 + Height = 15 + ImgStates = 3 + PngImg.Data = { + 89504E470D0A1A0A0000000D494844520000003F0000000F0806000000532517 + 72000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F33000008774944415478DAB5967B5053571E + C7EFCDFB0D7910082041824900157917A458BBA0F5C5D21D5F38756774B5CED6 + DDB1B5EEBAD6CE62655A2B6DC745A5752B3BDABAB3E37665AD3AD6D515AD5345 + 4110820425120C84007987BC937B93BBE7CA651B3591FED33BF39DCC3DF7E473 + 7FDFFBFB9DDF39308661107EC1300CC5BA369757F1762F5BFD9E62EFB63A701B + 88352F1C0E451B8609518018402C20F6E8E09090DDABDBE6295634A6A6A638C1 + 989710CEC7416128F61595A91F7824846EA8B6C1CB4B7F1213FE09E6E9D7FFF0 + D187F2C49477CF74DE5AB5E3F4979708D08BCC4F0747022213A2E30102712D16 + 8BC077BD73BB1025D53EE69276C92ACB6F30188C49F0CC4D041B24DE810B2304 + CDC4B4B4B46E8FF320B513A971BBB2AAAB6664CE641E7EE3A557E6D6D76CBC4D + 8261BACDE37A90B77F47051877CC607E3A403C333422C827D9098542BC07ED5D + D9693ADB511882A95E2834EC2BCBDE919E9E6E04CF5D401E201F912D04088DC8 + 584CA6FA567BB6A0530B9810D54F8286C9352FCFC89CC93CEBDAAE8F4E25C5C5 + 2F7DFBF4F1EE139BDE2EBFA2EEFEFDA6137FF92B0189661E2682A412013289EC + 70F05FABD5CAF75EEDD8CD46B08273A30F7AD749E7958CB2E1A6945F949D67B3 + D94E225037F1EB8F2859E8454CF337577633BC48C17F5D86DE95BC5925E6444E + 93ACA6EA454C349A7952EBBB1FCA59747A5100415ECE4848DADC74FDE2D58397 + CEDC3BF7BBF76B1449A94293CBF11585446E1B73D8EEACFEE28071BA2C23CC53 + 224B124551BE6740978D9A6CF302F6C99CB8005675C731D6D1E532696A12322B + 12E8ACF80087DE4AE5F3D4B4B4A46E664AE23085427144942C427069914C47CF + C36CBFC134CF67B6E5B09DFEAA9E90B3A30F736BAAC8C20A0189161F12705BE9 + 22BE9A2597767367A73ECB0C469A67A8F61D39CC67716AC92412FE4521B36B72 + E2BE61787CCBC9C3470328A22B952917FF7955EDBA74A158C863B204F89C208A + 4EE8EDE6F72B0EFEE96B601E214A1E37CFEAEBEB1389D58603AC30BC8234952D + C813426CE301B7A92D60FBB74024B4068DD69C526E62A580C68CA7C3641EF424 + CD98D541830F850B155F4BA552079129DC3C1367B26EDC3FC0088656C0D814D3 + 0B856DE690DFD4C346015364F58D1A7316845995F1645A3C0D83A79824C8EAE1 + D00F31AA8AA799BE48F3FC92D98AA5C736BE75944567B05FFDE4BD9306877502 + 3CD203DD01C233AC00CA074AAA2D5E34BF61CDA6952AFD906AE5E1FD6F823135 + 30EF2582C4CB9379E9D27F521FF7F455FE2A595E47A750587F37F45FF062213B + 9D4E37C9E5F27EB026EDBDBDBDB30C06C31CB06E05323A57F69A38A362C4ED78 + F09D73746F7979B9AAA4A4C44C98C73F2A03670E76F654BEC648ACA391C8AC6F + 91890B7E188BC94C0BD364153451C558D0F3E006D51DC9F4479AC79B47BE5292 + FAEBD36FFE7103C8B475EDB18F370F5BCD1A306E2102C02B420C9A60555DF586 + 4FFB0CC3F6B5C70E7E8E84D0B3607C90C8FCFFB7A0AEAE2E716B6B6B01629BAC + DE9A5DFA7A9804B9EEF3498D4249D2E3B4B434339FCF0F8020D94089C8A8A968 + 7E90BE65CCE3B09F18E83C259B33A775C9922A754646869DE8D470243360B255 + D726295FC7C824D7E34C61A32845F21CD3A7D517659A025B26021EFBBF2C8F00 + 531EC90C449AC7E1F140C52F6528AA4F6E7EE70D6F30D091BF7F470DD1289E4C + 5B995B9CDCB87EAB4A6FB338571EFEE0B83BE0BF8A671DAFBE88358F6789E6F5 + 7AE3F02CDCBDDB59C8F0052B56A766AD42A9E4417871FE3E91488437220C6487 + 3CAA1D92F0BB869A1C88DFF50FBDBA452C91DC292B2B552995CA71E2DD28F1FE + A79854A7A7621933795598491DE4AEA97C8AA9D70C4A2897EF364D8610D705DF + 588B3839F95926F26CC3C383C6D772F999DFEEA917F3E2C2602DAF02F723D3E6 + 8172461A4EF4345E3D7FEEB32B670F81FBEEE98FF3CC5687679F1D0C06056AB5 + 5ADADEDE5EB48826DACAA1D161DBBCB40F727373CD53FF09C3376FDE94E61B7C + 47DBEC86EF8D5CEA3F172E5CA802D9C18374105B141A51514F310BDD94AD6C0A + 0D0E2ECE7D8E99D93972B40B757CEF90C4456546EDF64073DBF67CFAADC16E19 + 5F73ECE3DF5CD959CF48E50B97B60F694E816D6E16688C173B1E6B6E6DFDEAC8 + 763077F499AD6EFA22135B521C8220828B17BF9B5FE4841B5C186A9B54A63429 + 3942263C66C983B3D2AFDFEEEF8DCF332175FA805BE555A4348075394804E924 + 965B381653A9B53778C9980D29CD6E9251D84C446BC86316E75CEFD0F4C767F6 + 8DD78D434115569C1595196B9FCFE9AFFFFC8721F3C4700237CE97CA17958279 + E1308605D46323D7841C6EC1C4A45D537DA47E03986B8861FEC91AC5B7257C39 + B5B4B4E4BEE26336DB4201238FC144B96152167833FE76C402213D74342C7386 + 82C313B3457B162D5A84078A9FCE5CC47A8FC9CCD7799A27E190115414CA0E86 + B3F0B2C76008B1D3E01EAA1F91B9C121CA5598199519D53C97C12CEAAFFFA21D + 9CEA609DC538DAFCC395DB2DF7DAC6762EA991AF2E585806B6C338AD797C002C + 89E560FA500CF3F845279A24EF6F5F3617ADE7CE3A0D4E75B035E833DEB58DF5 + 683C3673093F593A9727CE6353A81C93DF33D4C146B6AD5DBB7600FAF16486C4 + 661E2F5AE666022604DBC341636FC0D1A30B7BCDB9D478A982C2CD6392C81C2B + EA1FEA4FE74565462DFB8DA5AFFE727D71C52787AF9ED75E56DF6B03635AA25C + 1280E46F2D5E51B6627E117745E3BE75E07EE005E6F14309D3E7F3B1CF36352F + CF650BF75C1AEC7BA40B38FB1212C4460E8713B0D96C6C702E972C4C942E2890 + 48F9977DC6ED3B77BEF3109A3A88F8239ADD73CC6F3E6B5AAEC4987BAE4D0C3D + 32C081E79885EC8405F30549FC5BAC60546634F37853990354407CA1874469FB + 88729302C908C85D68EA1C10CBFC9373B856AB651D3FDE3C47AFD7CF65B15898 + 42211F2D2828B426274B508DE611BDBBFB9E58A7D3252108EA552A15AABD7BF7 + 8E403F9EC3433F17F37F481BBAFB015CE0A40000000049454E44AE426082} + OnClick = BtnClick + OnMouseEnter = BtnMouseEnter + OnMouseLeave = BtnMouseLeave + end + object PNGButton18: TPNGButton + Tag = 8 + Left = 235 + Top = 63 + Width = 21 + Height = 15 + ImgStates = 3 + PngImg.Data = { + 89504E470D0A1A0A0000000D494844520000003F0000000F0806000000532517 + 72000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F33000008774944415478DAB5967B5053571E + C7EFCDFB0D7910082041824900157917A458BBA0F5C5D21D5F38756774B5CED6 + DDB1B5EEBAD6CE62655A2B6DC745A5752B3BDABAB3E37665AD3AD6D515AD5345 + 4110820425120C84007987BC937B93BBE7CA651B3591FED33BF39DCC3DF7E473 + 7FDFFBFB9DDF39308661107EC1300CC5BA369757F1762F5BFD9E62EFB63A701B + 88352F1C0E451B8609518018402C20F6E8E09090DDABDBE6295634A6A6A638C1 + 989710CEC7416128F61595A91F7824846EA8B6C1CB4B7F1213FE09E6E9D7FFF0 + D187F2C49477CF74DE5AB5E3F4979708D08BCC4F0747022213A2E30102712D16 + 8BC077BD73BB1025D53EE69276C92ACB6F30188C49F0CC4D041B24DE810B2304 + CDC4B4B4B46E8FF320B513A971BBB2AAAB6664CE641E7EE3A557E6D6D76CBC4D + 8261BACDE37A90B77F47051877CC607E3A403C333422C827D9098542BC07ED5D + D9693ADB511882A95E2834EC2BCBDE919E9E6E04CF5D401E201F912D04088DC8 + 584CA6FA567BB6A0530B9810D54F8286C9352FCFC89CC93CEBDAAE8F4E25C5C5 + 2F7DFBF4F1EE139BDE2EBFA2EEFEFDA6137FF92B0189661E2682A412013289EC + 70F05FABD5CAF75EEDD8CD46B08273A30F7AD749E7958CB2E1A6945F949D67B3 + D94E225037F1EB8F2859E8454CF337577633BC48C17F5D86DE95BC5925E6444E + 93ACA6EA454C349A7952EBBB1FCA59747A5100415ECE4848DADC74FDE2D58397 + CEDC3BF7BBF76B1449A94293CBF11585446E1B73D8EEACFEE28071BA2C23CC53 + 224B124551BE6740978D9A6CF302F6C99CB8005675C731D6D1E532696A12322B + 12E8ACF80087DE4AE5F3D4B4B4A46E664AE23085427144942C427069914C47CF + C36CBFC134CF67B6E5B09DFEAA9E90B3A30F736BAAC8C20A0189161F12705BE9 + 22BE9A2597767367A73ECB0C469A67A8F61D39CC67716AC92412FE4521B36B72 + E2BE61787CCBC9C3470328A22B952917FF7955EDBA74A158C863B204F89C208A + 4EE8EDE6F72B0EFEE96B601E214A1E37CFEAEBEB1389D58603AC30BC8234952D + C813426CE301B7A92D60FBB74024B4068DD69C526E62A580C68CA7C3641EF424 + CD98D541830F850B155F4BA552079129DC3C1367B26EDC3FC0088656C0D814D3 + 0B856DE690DFD4C346015364F58D1A7316845995F1645A3C0D83A79824C8EAE1 + D00F31AA8AA799BE48F3FC92D98AA5C736BE75944567B05FFDE4BD9306877502 + 3CD203DD01C233AC00CA074AAA2D5E34BF61CDA6952AFD906AE5E1FD6F823135 + 30EF2582C4CB9379E9D27F521FF7F455FE2A595E47A750587F37F45FF062213B + 9D4E37C9E5F27EB026EDBDBDBDB30C06C31CB06E05323A57F69A38A362C4ED78 + F09D73746F7979B9AAA4A4C44C98C73F2A03670E76F654BEC648ACA391C8AC6F + 91890B7E188BC94C0BD364153451C558D0F3E006D51DC9F4479AC79B47BE5292 + FAEBD36FFE7103C8B475EDB18F370F5BCD1A306E2102C02B420C9A60555DF586 + 4FFB0CC3F6B5C70E7E8E84D0B3607C90C8FCFFB7A0AEAE2E716B6B6B01629BAC + DE9A5DFA7A9804B9EEF3498D4249D2E3B4B434339FCF0F8020D94089C8A8A968 + 7E90BE65CCE3B09F18E83C259B33A775C9922A754646869DE8D470243360B255 + D726295FC7C824D7E34C61A32845F21CD3A7D517659A025B26021EFBBF2C8F00 + 531EC90C449AC7E1F140C52F6528AA4F6E7EE70D6F30D091BF7F470DD1289E4C + 5B995B9CDCB87EAB4A6FB338571EFEE0B83BE0BF8A671DAFBE88358F6789E6F5 + 7AE3F02CDCBDDB59C8F0052B56A766AD42A9E4417871FE3E91488437220C6487 + 3CAA1D92F0BB869A1C88DFF50FBDBA452C91DC292B2B552995CA71E2DD28F1FE + A79854A7A7621933795598491DE4AEA97C8AA9D70C4A2897EF364D8610D705DF + 588B3839F95926F26CC3C383C6D772F999DFEEA917F3E2C2602DAF02F723D3E6 + 8172461A4EF4345E3D7FEEB32B670F81FBEEE98FF3CC5687679F1D0C06056AB5 + 5ADADEDE5EB48826DACAA1D161DBBCB40F727373CD53FF09C3376FDE94E61B7C + 47DBEC86EF8D5CEA3F172E5CA802D9C18374105B141A51514F310BDD94AD6C0A + 0D0E2ECE7D8E99D93972B40B757CEF90C4456546EDF64073DBF67CFAADC16E19 + 5F73ECE3DF5CD959CF48E50B97B60F694E816D6E16688C173B1E6B6E6DFDEAC8 + 763077F499AD6EFA22135B521C8220828B17BF9B5FE4841B5C186A9B54A63429 + 3942263C66C983B3D2AFDFEEEF8DCF332175FA805BE555A4348075394804E924 + 965B381653A9B53778C9980D29CD6E9251D84C446BC86316E75CEFD0F4C767F6 + 8DD78D434115569C1595196B9FCFE9AFFFFC8721F3C4700237CE97CA17958279 + E1308605D46323D7841C6EC1C4A45D537DA47E03986B8861FEC91AC5B7257C39 + B5B4B4E4BEE26336DB4201238FC144B96152167833FE76C402213D74342C7386 + 82C313B3457B162D5A84078A9FCE5CC47A8FC9CCD7799A27E190115414CA0E86 + B3F0B2C76008B1D3E01EAA1F91B9C121CA5598199519D53C97C12CEAAFFFA21D + 9CEA609DC538DAFCC395DB2DF7DAC6762EA991AF2E585806B6C338AD797C002C + 89E560FA500CF3F845279A24EF6F5F3617ADE7CE3A0D4E75B035E833DEB58DF5 + 683C3673093F593A9727CE6353A81C93DF33D4C146B6AD5DBB7600FAF16486C4 + 661E2F5AE666022604DBC341636FC0D1A30B7BCDB9D478A982C2CD6392C81C2B + EA1FEA4FE74565462DFB8DA5AFFE727D71C52787AF9ED75E56DF6B03635AA25C + 1280E46F2D5E51B6627E117745E3BE75E07EE005E6F14309D3E7F3B1CF36352F + CF650BF75C1AEC7BA40B38FB1212C4460E8713B0D96C6C702E972C4C942E2890 + 48F9977DC6ED3B77BEF3109A3A88F8239ADD73CC6F3E6B5AAEC4987BAE4D0C3D + 32C081E79885EC8405F30549FC5BAC60546634F37853990354407CA1874469FB + 88729302C908C85D68EA1C10CBFC9373B856AB651D3FDE3C47AFD7CF65B15898 + 42211F2D2828B426274B508DE611BDBBFB9E58A7D3252108EA552A15AABD7BF7 + 8E403F9EC3433F17F37F481BBAFB015CE0A40000000049454E44AE426082} + OnClick = BtnClick + OnMouseEnter = BtnMouseEnter + OnMouseLeave = BtnMouseLeave + end + object PNGButton19: TPNGButton + Tag = 9 + Left = 256 + Top = 63 + Width = 21 + Height = 15 + ImgStates = 3 + PngImg.Data = { + 89504E470D0A1A0A0000000D494844520000003F0000000F0806000000532517 + 72000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F33000008774944415478DAB5967B5053571E + C7EFCDFB0D7910082041824900157917A458BBA0F5C5D21D5F38756774B5CED6 + DDB1B5EEBAD6CE62655A2B6DC745A5752B3BDABAB3E37665AD3AD6D515AD5345 + 4110820425120C84007987BC937B93BBE7CA651B3591FED33BF39DCC3DF7E473 + 7FDFFBFB9DDF39308661107EC1300CC5BA369757F1762F5BFD9E62EFB63A701B + 88352F1C0E451B8609518018402C20F6E8E09090DDABDBE6295634A6A6A638C1 + 989710CEC7416128F61595A91F7824846EA8B6C1CB4B7F1213FE09E6E9D7FFF0 + D187F2C49477CF74DE5AB5E3F4979708D08BCC4F0747022213A2E30102712D16 + 8BC077BD73BB1025D53EE69276C92ACB6F30188C49F0CC4D041B24DE810B2304 + CDC4B4B4B46E8FF320B513A971BBB2AAAB6664CE641E7EE3A557E6D6D76CBC4D + 8261BACDE37A90B77F47051877CC607E3A403C333422C827D9098542BC07ED5D + D9693ADB511882A95E2834EC2BCBDE919E9E6E04CF5D401E201F912D04088DC8 + 584CA6FA567BB6A0530B9810D54F8286C9352FCFC89CC93CEBDAAE8F4E25C5C5 + 2F7DFBF4F1EE139BDE2EBFA2EEFEFDA6137FF92B0189661E2682A412013289EC + 70F05FABD5CAF75EEDD8CD46B08273A30F7AD749E7958CB2E1A6945F949D67B3 + D94E225037F1EB8F2859E8454CF337577633BC48C17F5D86DE95BC5925E6444E + 93ACA6EA454C349A7952EBBB1FCA59747A5100415ECE4848DADC74FDE2D58397 + CEDC3BF7BBF76B1449A94293CBF11585446E1B73D8EEACFEE28071BA2C23CC53 + 224B124551BE6740978D9A6CF302F6C99CB8005675C731D6D1E532696A12322B + 12E8ACF80087DE4AE5F3D4B4B4A46E664AE23085427144942C427069914C47CF + C36CBFC134CF67B6E5B09DFEAA9E90B3A30F736BAAC8C20A0189161F12705BE9 + 22BE9A2597767367A73ECB0C469A67A8F61D39CC67716AC92412FE4521B36B72 + E2BE61787CCBC9C3470328A22B952917FF7955EDBA74A158C863B204F89C208A + 4EE8EDE6F72B0EFEE96B601E214A1E37CFEAEBEB1389D58603AC30BC8234952D + C813426CE301B7A92D60FBB74024B4068DD69C526E62A580C68CA7C3641EF424 + CD98D541830F850B155F4BA552079129DC3C1367B26EDC3FC0088656C0D814D3 + 0B856DE690DFD4C346015364F58D1A7316845995F1645A3C0D83A79824C8EAE1 + D00F31AA8AA799BE48F3FC92D98AA5C736BE75944567B05FFDE4BD9306877502 + 3CD203DD01C233AC00CA074AAA2D5E34BF61CDA6952AFD906AE5E1FD6F823135 + 30EF2582C4CB9379E9D27F521FF7F455FE2A595E47A750587F37F45FF062213B + 9D4E37C9E5F27EB026EDBDBDBDB30C06C31CB06E05323A57F69A38A362C4ED78 + F09D73746F7979B9AAA4A4C44C98C73F2A03670E76F654BEC648ACA391C8AC6F + 91890B7E188BC94C0BD364153451C558D0F3E006D51DC9F4479AC79B47BE5292 + FAEBD36FFE7103C8B475EDB18F370F5BCD1A306E2102C02B420C9A60555DF586 + 4FFB0CC3F6B5C70E7E8E84D0B3607C90C8FCFFB7A0AEAE2E716B6B6B01629BAC + DE9A5DFA7A9804B9EEF3498D4249D2E3B4B434339FCF0F8020D94089C8A8A968 + 7E90BE65CCE3B09F18E83C259B33A775C9922A754646869DE8D470243360B255 + D726295FC7C824D7E34C61A32845F21CD3A7D517659A025B26021EFBBF2C8F00 + 531EC90C449AC7E1F140C52F6528AA4F6E7EE70D6F30D091BF7F470DD1289E4C + 5B995B9CDCB87EAB4A6FB338571EFEE0B83BE0BF8A671DAFBE88358F6789E6F5 + 7AE3F02CDCBDDB59C8F0052B56A766AD42A9E4417871FE3E91488437220C6487 + 3CAA1D92F0BB869A1C88DFF50FBDBA452C91DC292B2B552995CA71E2DD28F1FE + A79854A7A7621933795598491DE4AEA97C8AA9D70C4A2897EF364D8610D705DF + 588B3839F95926F26CC3C383C6D772F999DFEEA917F3E2C2602DAF02F723D3E6 + 8172461A4EF4345E3D7FEEB32B670F81FBEEE98FF3CC5687679F1D0C06056AB5 + 5ADADEDE5EB48826DACAA1D161DBBCB40F727373CD53FF09C3376FDE94E61B7C + 47DBEC86EF8D5CEA3F172E5CA802D9C18374105B141A51514F310BDD94AD6C0A + 0D0E2ECE7D8E99D93972B40B757CEF90C4456546EDF64073DBF67CFAADC16E19 + 5F73ECE3DF5CD959CF48E50B97B60F694E816D6E16688C173B1E6B6E6DFDEAC8 + 763077F499AD6EFA22135B521C8220828B17BF9B5FE4841B5C186A9B54A63429 + 3942263C66C983B3D2AFDFEEEF8DCF332175FA805BE555A4348075394804E924 + 965B381653A9B53778C9980D29CD6E9251D84C446BC86316E75CEFD0F4C767F6 + 8DD78D434115569C1595196B9FCFE9AFFFFC8721F3C4700237CE97CA17958279 + E1308605D46323D7841C6EC1C4A45D537DA47E03986B8861FEC91AC5B7257C39 + B5B4B4E4BEE26336DB4201238FC144B96152167833FE76C402213D74342C7386 + 82C313B3457B162D5A84078A9FCE5CC47A8FC9CCD7799A27E190115414CA0E86 + B3F0B2C76008B1D3E01EAA1F91B9C121CA5598199519D53C97C12CEAAFFFA21D + 9CEA609DC538DAFCC395DB2DF7DAC6762EA991AF2E585806B6C338AD797C002C + 89E560FA500CF3F845279A24EF6F5F3617ADE7CE3A0D4E75B035E833DEB58DF5 + 683C3673093F593A9727CE6353A81C93DF33D4C146B6AD5DBB7600FAF16486C4 + 661E2F5AE666022604DBC341636FC0D1A30B7BCDB9D478A982C2CD6392C81C2B + EA1FEA4FE74565462DFB8DA5AFFE727D71C52787AF9ED75E56DF6B03635AA25C + 1280E46F2D5E51B6627E117745E3BE75E07EE005E6F14309D3E7F3B1CF36352F + CF650BF75C1AEC7BA40B38FB1212C4460E8713B0D96C6C702E972C4C942E2890 + 48F9977DC6ED3B77BEF3109A3A88F8239ADD73CC6F3E6B5AAEC4987BAE4D0C3D + 32C081E79885EC8405F30549FC5BAC60546634F37853990354407CA1874469FB + 88729302C908C85D68EA1C10CBFC9373B856AB651D3FDE3C47AFD7CF65B15898 + 42211F2D2828B426274B508DE611BDBBFB9E58A7D3252108EA552A15AABD7BF7 + 8E403F9EC3433F17F37F481BBAFB015CE0A40000000049454E44AE426082} + OnClick = BtnClick + OnMouseEnter = BtnMouseEnter + OnMouseLeave = BtnMouseLeave + end + object PNGButton2: TPNGButton + Tag = 2 + Left = 109 + Top = 39 + Width = 21 + Height = 15 + ImgStates = 3 + PngImg.Data = { + 89504E470D0A1A0A0000000D494844520000003F0000000F0806000000532517 + 72000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F33000008774944415478DAB5967B5053571E + C7EFCDFB0D7910082041824900157917A458BBA0F5C5D21D5F38756774B5CED6 + DDB1B5EEBAD6CE62655A2B6DC745A5752B3BDABAB3E37665AD3AD6D515AD5345 + 4110820425120C84007987BC937B93BBE7CA651B3591FED33BF39DCC3DF7E473 + 7FDFFBFB9DDF39308661107EC1300CC5BA369757F1762F5BFD9E62EFB63A701B + 88352F1C0E451B8609518018402C20F6E8E09090DDABDBE6295634A6A6A638C1 + 989710CEC7416128F61595A91F7824846EA8B6C1CB4B7F1213FE09E6E9D7FFF0 + D187F2C49477CF74DE5AB5E3F4979708D08BCC4F0747022213A2E30102712D16 + 8BC077BD73BB1025D53EE69276C92ACB6F30188C49F0CC4D041B24DE810B2304 + CDC4B4B4B46E8FF320B513A971BBB2AAAB6664CE641E7EE3A557E6D6D76CBC4D + 8261BACDE37A90B77F47051877CC607E3A403C333422C827D9098542BC07ED5D + D9693ADB511882A95E2834EC2BCBDE919E9E6E04CF5D401E201F912D04088DC8 + 584CA6FA567BB6A0530B9810D54F8286C9352FCFC89CC93CEBDAAE8F4E25C5C5 + 2F7DFBF4F1EE139BDE2EBFA2EEFEFDA6137FF92B0189661E2682A412013289EC + 70F05FABD5CAF75EEDD8CD46B08273A30F7AD749E7958CB2E1A6945F949D67B3 + D94E225037F1EB8F2859E8454CF337577633BC48C17F5D86DE95BC5925E6444E + 93ACA6EA454C349A7952EBBB1FCA59747A5100415ECE4848DADC74FDE2D58397 + CEDC3BF7BBF76B1449A94293CBF11585446E1B73D8EEACFEE28071BA2C23CC53 + 224B124551BE6740978D9A6CF302F6C99CB8005675C731D6D1E532696A12322B + 12E8ACF80087DE4AE5F3D4B4B4A46E664AE23085427144942C427069914C47CF + C36CBFC134CF67B6E5B09DFEAA9E90B3A30F736BAAC8C20A0189161F12705BE9 + 22BE9A2597767367A73ECB0C469A67A8F61D39CC67716AC92412FE4521B36B72 + E2BE61787CCBC9C3470328A22B952917FF7955EDBA74A158C863B204F89C208A + 4EE8EDE6F72B0EFEE96B601E214A1E37CFEAEBEB1389D58603AC30BC8234952D + C813426CE301B7A92D60FBB74024B4068DD69C526E62A580C68CA7C3641EF424 + CD98D541830F850B155F4BA552079129DC3C1367B26EDC3FC0088656C0D814D3 + 0B856DE690DFD4C346015364F58D1A7316845995F1645A3C0D83A79824C8EAE1 + D00F31AA8AA799BE48F3FC92D98AA5C736BE75944567B05FFDE4BD9306877502 + 3CD203DD01C233AC00CA074AAA2D5E34BF61CDA6952AFD906AE5E1FD6F823135 + 30EF2582C4CB9379E9D27F521FF7F455FE2A595E47A750587F37F45FF062213B + 9D4E37C9E5F27EB026EDBDBDBDB30C06C31CB06E05323A57F69A38A362C4ED78 + F09D73746F7979B9AAA4A4C44C98C73F2A03670E76F654BEC648ACA391C8AC6F + 91890B7E188BC94C0BD364153451C558D0F3E006D51DC9F4479AC79B47BE5292 + FAEBD36FFE7103C8B475EDB18F370F5BCD1A306E2102C02B420C9A60555DF586 + 4FFB0CC3F6B5C70E7E8E84D0B3607C90C8FCFFB7A0AEAE2E716B6B6B01629BAC + DE9A5DFA7A9804B9EEF3498D4249D2E3B4B434339FCF0F8020D94089C8A8A968 + 7E90BE65CCE3B09F18E83C259B33A775C9922A754646869DE8D470243360B255 + D726295FC7C824D7E34C61A32845F21CD3A7D517659A025B26021EFBBF2C8F00 + 531EC90C449AC7E1F140C52F6528AA4F6E7EE70D6F30D091BF7F470DD1289E4C + 5B995B9CDCB87EAB4A6FB338571EFEE0B83BE0BF8A671DAFBE88358F6789E6F5 + 7AE3F02CDCBDDB59C8F0052B56A766AD42A9E4417871FE3E91488437220C6487 + 3CAA1D92F0BB869A1C88DFF50FBDBA452C91DC292B2B552995CA71E2DD28F1FE + A79854A7A7621933795598491DE4AEA97C8AA9D70C4A2897EF364D8610D705DF + 588B3839F95926F26CC3C383C6D772F999DFEEA917F3E2C2602DAF02F723D3E6 + 8172461A4EF4345E3D7FEEB32B670F81FBEEE98FF3CC5687679F1D0C06056AB5 + 5ADADEDE5EB48826DACAA1D161DBBCB40F727373CD53FF09C3376FDE94E61B7C + 47DBEC86EF8D5CEA3F172E5CA802D9C18374105B141A51514F310BDD94AD6C0A + 0D0E2ECE7D8E99D93972B40B757CEF90C4456546EDF64073DBF67CFAADC16E19 + 5F73ECE3DF5CD959CF48E50B97B60F694E816D6E16688C173B1E6B6E6DFDEAC8 + 763077F499AD6EFA22135B521C8220828B17BF9B5FE4841B5C186A9B54A63429 + 3942263C66C983B3D2AFDFEEEF8DCF332175FA805BE555A4348075394804E924 + 965B381653A9B53778C9980D29CD6E9251D84C446BC86316E75CEFD0F4C767F6 + 8DD78D434115569C1595196B9FCFE9AFFFFC8721F3C4700237CE97CA17958279 + E1308605D46323D7841C6EC1C4A45D537DA47E03986B8861FEC91AC5B7257C39 + B5B4B4E4BEE26336DB4201238FC144B96152167833FE76C402213D74342C7386 + 82C313B3457B162D5A84078A9FCE5CC47A8FC9CCD7799A27E190115414CA0E86 + B3F0B2C76008B1D3E01EAA1F91B9C121CA5598199519D53C97C12CEAAFFFA21D + 9CEA609DC538DAFCC395DB2DF7DAC6762EA991AF2E585806B6C338AD797C002C + 89E560FA500CF3F845279A24EF6F5F3617ADE7CE3A0D4E75B035E833DEB58DF5 + 683C3673093F593A9727CE6353A81C93DF33D4C146B6AD5DBB7600FAF16486C4 + 661E2F5AE666022604DBC341636FC0D1A30B7BCDB9D478A982C2CD6392C81C2B + EA1FEA4FE74565462DFB8DA5AFFE727D71C52787AF9ED75E56DF6B03635AA25C + 1280E46F2D5E51B6627E117745E3BE75E07EE005E6F14309D3E7F3B1CF36352F + CF650BF75C1AEC7BA40B38FB1212C4460E8713B0D96C6C702E972C4C942E2890 + 48F9977DC6ED3B77BEF3109A3A88F8239ADD73CC6F3E6B5AAEC4987BAE4D0C3D + 32C081E79885EC8405F30549FC5BAC60546634F37853990354407CA1874469FB + 88729302C908C85D68EA1C10CBFC9373B856AB651D3FDE3C47AFD7CF65B15898 + 42211F2D2828B426274B508DE611BDBBFB9E58A7D3252108EA552A15AABD7BF7 + 8E403F9EC3433F17F37F481BBAFB015CE0A40000000049454E44AE426082} + end + object PNGButton20: TPNGButton + Tag = 10 + Left = 278 + Top = 63 + Width = 21 + Height = 15 + ImgStates = 3 + PngImg.Data = { + 89504E470D0A1A0A0000000D494844520000003F0000000F0806000000532517 + 72000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F33000008774944415478DAB5967B5053571E + C7EFCDFB0D7910082041824900157917A458BBA0F5C5D21D5F38756774B5CED6 + DDB1B5EEBAD6CE62655A2B6DC745A5752B3BDABAB3E37665AD3AD6D515AD5345 + 4110820425120C84007987BC937B93BBE7CA651B3591FED33BF39DCC3DF7E473 + 7FDFFBFB9DDF39308661107EC1300CC5BA369757F1762F5BFD9E62EFB63A701B + 88352F1C0E451B8609518018402C20F6E8E09090DDABDBE6295634A6A6A638C1 + 989710CEC7416128F61595A91F7824846EA8B6C1CB4B7F1213FE09E6E9D7FFF0 + D187F2C49477CF74DE5AB5E3F4979708D08BCC4F0747022213A2E30102712D16 + 8BC077BD73BB1025D53EE69276C92ACB6F30188C49F0CC4D041B24DE810B2304 + CDC4B4B4B46E8FF320B513A971BBB2AAAB6664CE641E7EE3A557E6D6D76CBC4D + 8261BACDE37A90B77F47051877CC607E3A403C333422C827D9098542BC07ED5D + D9693ADB511882A95E2834EC2BCBDE919E9E6E04CF5D401E201F912D04088DC8 + 584CA6FA567BB6A0530B9810D54F8286C9352FCFC89CC93CEBDAAE8F4E25C5C5 + 2F7DFBF4F1EE139BDE2EBFA2EEFEFDA6137FF92B0189661E2682A412013289EC + 70F05FABD5CAF75EEDD8CD46B08273A30F7AD749E7958CB2E1A6945F949D67B3 + D94E225037F1EB8F2859E8454CF337577633BC48C17F5D86DE95BC5925E6444E + 93ACA6EA454C349A7952EBBB1FCA59747A5100415ECE4848DADC74FDE2D58397 + CEDC3BF7BBF76B1449A94293CBF11585446E1B73D8EEACFEE28071BA2C23CC53 + 224B124551BE6740978D9A6CF302F6C99CB8005675C731D6D1E532696A12322B + 12E8ACF80087DE4AE5F3D4B4B4A46E664AE23085427144942C427069914C47CF + C36CBFC134CF67B6E5B09DFEAA9E90B3A30F736BAAC8C20A0189161F12705BE9 + 22BE9A2597767367A73ECB0C469A67A8F61D39CC67716AC92412FE4521B36B72 + E2BE61787CCBC9C3470328A22B952917FF7955EDBA74A158C863B204F89C208A + 4EE8EDE6F72B0EFEE96B601E214A1E37CFEAEBEB1389D58603AC30BC8234952D + C813426CE301B7A92D60FBB74024B4068DD69C526E62A580C68CA7C3641EF424 + CD98D541830F850B155F4BA552079129DC3C1367B26EDC3FC0088656C0D814D3 + 0B856DE690DFD4C346015364F58D1A7316845995F1645A3C0D83A79824C8EAE1 + D00F31AA8AA799BE48F3FC92D98AA5C736BE75944567B05FFDE4BD9306877502 + 3CD203DD01C233AC00CA074AAA2D5E34BF61CDA6952AFD906AE5E1FD6F823135 + 30EF2582C4CB9379E9D27F521FF7F455FE2A595E47A750587F37F45FF062213B + 9D4E37C9E5F27EB026EDBDBDBDB30C06C31CB06E05323A57F69A38A362C4ED78 + F09D73746F7979B9AAA4A4C44C98C73F2A03670E76F654BEC648ACA391C8AC6F + 91890B7E188BC94C0BD364153451C558D0F3E006D51DC9F4479AC79B47BE5292 + FAEBD36FFE7103C8B475EDB18F370F5BCD1A306E2102C02B420C9A60555DF586 + 4FFB0CC3F6B5C70E7E8E84D0B3607C90C8FCFFB7A0AEAE2E716B6B6B01629BAC + DE9A5DFA7A9804B9EEF3498D4249D2E3B4B434339FCF0F8020D94089C8A8A968 + 7E90BE65CCE3B09F18E83C259B33A775C9922A754646869DE8D470243360B255 + D726295FC7C824D7E34C61A32845F21CD3A7D517659A025B26021EFBBF2C8F00 + 531EC90C449AC7E1F140C52F6528AA4F6E7EE70D6F30D091BF7F470DD1289E4C + 5B995B9CDCB87EAB4A6FB338571EFEE0B83BE0BF8A671DAFBE88358F6789E6F5 + 7AE3F02CDCBDDB59C8F0052B56A766AD42A9E4417871FE3E91488437220C6487 + 3CAA1D92F0BB869A1C88DFF50FBDBA452C91DC292B2B552995CA71E2DD28F1FE + A79854A7A7621933795598491DE4AEA97C8AA9D70C4A2897EF364D8610D705DF + 588B3839F95926F26CC3C383C6D772F999DFEEA917F3E2C2602DAF02F723D3E6 + 8172461A4EF4345E3D7FEEB32B670F81FBEEE98FF3CC5687679F1D0C06056AB5 + 5ADADEDE5EB48826DACAA1D161DBBCB40F727373CD53FF09C3376FDE94E61B7C + 47DBEC86EF8D5CEA3F172E5CA802D9C18374105B141A51514F310BDD94AD6C0A + 0D0E2ECE7D8E99D93972B40B757CEF90C4456546EDF64073DBF67CFAADC16E19 + 5F73ECE3DF5CD959CF48E50B97B60F694E816D6E16688C173B1E6B6E6DFDEAC8 + 763077F499AD6EFA22135B521C8220828B17BF9B5FE4841B5C186A9B54A63429 + 3942263C66C983B3D2AFDFEEEF8DCF332175FA805BE555A4348075394804E924 + 965B381653A9B53778C9980D29CD6E9251D84C446BC86316E75CEFD0F4C767F6 + 8DD78D434115569C1595196B9FCFE9AFFFFC8721F3C4700237CE97CA17958279 + E1308605D46323D7841C6EC1C4A45D537DA47E03986B8861FEC91AC5B7257C39 + B5B4B4E4BEE26336DB4201238FC144B96152167833FE76C402213D74342C7386 + 82C313B3457B162D5A84078A9FCE5CC47A8FC9CCD7799A27E190115414CA0E86 + B3F0B2C76008B1D3E01EAA1F91B9C121CA5598199519D53C97C12CEAAFFFA21D + 9CEA609DC538DAFCC395DB2DF7DAC6762EA991AF2E585806B6C338AD797C002C + 89E560FA500CF3F845279A24EF6F5F3617ADE7CE3A0D4E75B035E833DEB58DF5 + 683C3673093F593A9727CE6353A81C93DF33D4C146B6AD5DBB7600FAF16486C4 + 661E2F5AE666022604DBC341636FC0D1A30B7BCDB9D478A982C2CD6392C81C2B + EA1FEA4FE74565462DFB8DA5AFFE727D71C52787AF9ED75E56DF6B03635AA25C + 1280E46F2D5E51B6627E117745E3BE75E07EE005E6F14309D3E7F3B1CF36352F + CF650BF75C1AEC7BA40B38FB1212C4460E8713B0D96C6C702E972C4C942E2890 + 48F9977DC6ED3B77BEF3109A3A88F8239ADD73CC6F3E6B5AAEC4987BAE4D0C3D + 32C081E79885EC8405F30549FC5BAC60546634F37853990354407CA1874469FB + 88729302C908C85D68EA1C10CBFC9373B856AB651D3FDE3C47AFD7CF65B15898 + 42211F2D2828B426274B508DE611BDBBFB9E58A7D3252108EA552A15AABD7BF7 + 8E403F9EC3433F17F37F481BBAFB015CE0A40000000049454E44AE426082} + OnClick = BtnClick + OnMouseEnter = BtnMouseEnter + OnMouseLeave = BtnMouseLeave + end + object PNGButton3: TPNGButton + Tag = 3 + Left = 130 + Top = 39 + Width = 21 + Height = 15 + ImgStates = 3 + PngImg.Data = { + 89504E470D0A1A0A0000000D494844520000003F0000000F0806000000532517 + 72000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F33000008774944415478DAB5967B5053571E + C7EFCDFB0D7910082041824900157917A458BBA0F5C5D21D5F38756774B5CED6 + DDB1B5EEBAD6CE62655A2B6DC745A5752B3BDABAB3E37665AD3AD6D515AD5345 + 4110820425120C84007987BC937B93BBE7CA651B3591FED33BF39DCC3DF7E473 + 7FDFFBFB9DDF39308661107EC1300CC5BA369757F1762F5BFD9E62EFB63A701B + 88352F1C0E451B8609518018402C20F6E8E09090DDABDBE6295634A6A6A638C1 + 989710CEC7416128F61595A91F7824846EA8B6C1CB4B7F1213FE09E6E9D7FFF0 + D187F2C49477CF74DE5AB5E3F4979708D08BCC4F0747022213A2E30102712D16 + 8BC077BD73BB1025D53EE69276C92ACB6F30188C49F0CC4D041B24DE810B2304 + CDC4B4B4B46E8FF320B513A971BBB2AAAB6664CE641E7EE3A557E6D6D76CBC4D + 8261BACDE37A90B77F47051877CC607E3A403C333422C827D9098542BC07ED5D + D9693ADB511882A95E2834EC2BCBDE919E9E6E04CF5D401E201F912D04088DC8 + 584CA6FA567BB6A0530B9810D54F8286C9352FCFC89CC93CEBDAAE8F4E25C5C5 + 2F7DFBF4F1EE139BDE2EBFA2EEFEFDA6137FF92B0189661E2682A412013289EC + 70F05FABD5CAF75EEDD8CD46B08273A30F7AD749E7958CB2E1A6945F949D67B3 + D94E225037F1EB8F2859E8454CF337577633BC48C17F5D86DE95BC5925E6444E + 93ACA6EA454C349A7952EBBB1FCA59747A5100415ECE4848DADC74FDE2D58397 + CEDC3BF7BBF76B1449A94293CBF11585446E1B73D8EEACFEE28071BA2C23CC53 + 224B124551BE6740978D9A6CF302F6C99CB8005675C731D6D1E532696A12322B + 12E8ACF80087DE4AE5F3D4B4B4A46E664AE23085427144942C427069914C47CF + C36CBFC134CF67B6E5B09DFEAA9E90B3A30F736BAAC8C20A0189161F12705BE9 + 22BE9A2597767367A73ECB0C469A67A8F61D39CC67716AC92412FE4521B36B72 + E2BE61787CCBC9C3470328A22B952917FF7955EDBA74A158C863B204F89C208A + 4EE8EDE6F72B0EFEE96B601E214A1E37CFEAEBEB1389D58603AC30BC8234952D + C813426CE301B7A92D60FBB74024B4068DD69C526E62A580C68CA7C3641EF424 + CD98D541830F850B155F4BA552079129DC3C1367B26EDC3FC0088656C0D814D3 + 0B856DE690DFD4C346015364F58D1A7316845995F1645A3C0D83A79824C8EAE1 + D00F31AA8AA799BE48F3FC92D98AA5C736BE75944567B05FFDE4BD9306877502 + 3CD203DD01C233AC00CA074AAA2D5E34BF61CDA6952AFD906AE5E1FD6F823135 + 30EF2582C4CB9379E9D27F521FF7F455FE2A595E47A750587F37F45FF062213B + 9D4E37C9E5F27EB026EDBDBDBDB30C06C31CB06E05323A57F69A38A362C4ED78 + F09D73746F7979B9AAA4A4C44C98C73F2A03670E76F654BEC648ACA391C8AC6F + 91890B7E188BC94C0BD364153451C558D0F3E006D51DC9F4479AC79B47BE5292 + FAEBD36FFE7103C8B475EDB18F370F5BCD1A306E2102C02B420C9A60555DF586 + 4FFB0CC3F6B5C70E7E8E84D0B3607C90C8FCFFB7A0AEAE2E716B6B6B01629BAC + DE9A5DFA7A9804B9EEF3498D4249D2E3B4B434339FCF0F8020D94089C8A8A968 + 7E90BE65CCE3B09F18E83C259B33A775C9922A754646869DE8D470243360B255 + D726295FC7C824D7E34C61A32845F21CD3A7D517659A025B26021EFBBF2C8F00 + 531EC90C449AC7E1F140C52F6528AA4F6E7EE70D6F30D091BF7F470DD1289E4C + 5B995B9CDCB87EAB4A6FB338571EFEE0B83BE0BF8A671DAFBE88358F6789E6F5 + 7AE3F02CDCBDDB59C8F0052B56A766AD42A9E4417871FE3E91488437220C6487 + 3CAA1D92F0BB869A1C88DFF50FBDBA452C91DC292B2B552995CA71E2DD28F1FE + A79854A7A7621933795598491DE4AEA97C8AA9D70C4A2897EF364D8610D705DF + 588B3839F95926F26CC3C383C6D772F999DFEEA917F3E2C2602DAF02F723D3E6 + 8172461A4EF4345E3D7FEEB32B670F81FBEEE98FF3CC5687679F1D0C06056AB5 + 5ADADEDE5EB48826DACAA1D161DBBCB40F727373CD53FF09C3376FDE94E61B7C + 47DBEC86EF8D5CEA3F172E5CA802D9C18374105B141A51514F310BDD94AD6C0A + 0D0E2ECE7D8E99D93972B40B757CEF90C4456546EDF64073DBF67CFAADC16E19 + 5F73ECE3DF5CD959CF48E50B97B60F694E816D6E16688C173B1E6B6E6DFDEAC8 + 763077F499AD6EFA22135B521C8220828B17BF9B5FE4841B5C186A9B54A63429 + 3942263C66C983B3D2AFDFEEEF8DCF332175FA805BE555A4348075394804E924 + 965B381653A9B53778C9980D29CD6E9251D84C446BC86316E75CEFD0F4C767F6 + 8DD78D434115569C1595196B9FCFE9AFFFFC8721F3C4700237CE97CA17958279 + E1308605D46323D7841C6EC1C4A45D537DA47E03986B8861FEC91AC5B7257C39 + B5B4B4E4BEE26336DB4201238FC144B96152167833FE76C402213D74342C7386 + 82C313B3457B162D5A84078A9FCE5CC47A8FC9CCD7799A27E190115414CA0E86 + B3F0B2C76008B1D3E01EAA1F91B9C121CA5598199519D53C97C12CEAAFFFA21D + 9CEA609DC538DAFCC395DB2DF7DAC6762EA991AF2E585806B6C338AD797C002C + 89E560FA500CF3F845279A24EF6F5F3617ADE7CE3A0D4E75B035E833DEB58DF5 + 683C3673093F593A9727CE6353A81C93DF33D4C146B6AD5DBB7600FAF16486C4 + 661E2F5AE666022604DBC341636FC0D1A30B7BCDB9D478A982C2CD6392C81C2B + EA1FEA4FE74565462DFB8DA5AFFE727D71C52787AF9ED75E56DF6B03635AA25C + 1280E46F2D5E51B6627E117745E3BE75E07EE005E6F14309D3E7F3B1CF36352F + CF650BF75C1AEC7BA40B38FB1212C4460E8713B0D96C6C702E972C4C942E2890 + 48F9977DC6ED3B77BEF3109A3A88F8239ADD73CC6F3E6B5AAEC4987BAE4D0C3D + 32C081E79885EC8405F30549FC5BAC60546634F37853990354407CA1874469FB + 88729302C908C85D68EA1C10CBFC9373B856AB651D3FDE3C47AFD7CF65B15898 + 42211F2D2828B426274B508DE611BDBBFB9E58A7D3252108EA552A15AABD7BF7 + 8E403F9EC3433F17F37F481BBAFB015CE0A40000000049454E44AE426082} + end + object PNGButton4: TPNGButton + Tag = 4 + Left = 151 + Top = 39 + Width = 21 + Height = 15 + ImgStates = 3 + PngImg.Data = { + 89504E470D0A1A0A0000000D494844520000003F0000000F0806000000532517 + 72000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F33000008774944415478DAB5967B5053571E + C7EFCDFB0D7910082041824900157917A458BBA0F5C5D21D5F38756774B5CED6 + DDB1B5EEBAD6CE62655A2B6DC745A5752B3BDABAB3E37665AD3AD6D515AD5345 + 4110820425120C84007987BC937B93BBE7CA651B3591FED33BF39DCC3DF7E473 + 7FDFFBFB9DDF39308661107EC1300CC5BA369757F1762F5BFD9E62EFB63A701B + 88352F1C0E451B8609518018402C20F6E8E09090DDABDBE6295634A6A6A638C1 + 989710CEC7416128F61595A91F7824846EA8B6C1CB4B7F1213FE09E6E9D7FFF0 + D187F2C49477CF74DE5AB5E3F4979708D08BCC4F0747022213A2E30102712D16 + 8BC077BD73BB1025D53EE69276C92ACB6F30188C49F0CC4D041B24DE810B2304 + CDC4B4B4B46E8FF320B513A971BBB2AAAB6664CE641E7EE3A557E6D6D76CBC4D + 8261BACDE37A90B77F47051877CC607E3A403C333422C827D9098542BC07ED5D + D9693ADB511882A95E2834EC2BCBDE919E9E6E04CF5D401E201F912D04088DC8 + 584CA6FA567BB6A0530B9810D54F8286C9352FCFC89CC93CEBDAAE8F4E25C5C5 + 2F7DFBF4F1EE139BDE2EBFA2EEFEFDA6137FF92B0189661E2682A412013289EC + 70F05FABD5CAF75EEDD8CD46B08273A30F7AD749E7958CB2E1A6945F949D67B3 + D94E225037F1EB8F2859E8454CF337577633BC48C17F5D86DE95BC5925E6444E + 93ACA6EA454C349A7952EBBB1FCA59747A5100415ECE4848DADC74FDE2D58397 + CEDC3BF7BBF76B1449A94293CBF11585446E1B73D8EEACFEE28071BA2C23CC53 + 224B124551BE6740978D9A6CF302F6C99CB8005675C731D6D1E532696A12322B + 12E8ACF80087DE4AE5F3D4B4B4A46E664AE23085427144942C427069914C47CF + C36CBFC134CF67B6E5B09DFEAA9E90B3A30F736BAAC8C20A0189161F12705BE9 + 22BE9A2597767367A73ECB0C469A67A8F61D39CC67716AC92412FE4521B36B72 + E2BE61787CCBC9C3470328A22B952917FF7955EDBA74A158C863B204F89C208A + 4EE8EDE6F72B0EFEE96B601E214A1E37CFEAEBEB1389D58603AC30BC8234952D + C813426CE301B7A92D60FBB74024B4068DD69C526E62A580C68CA7C3641EF424 + CD98D541830F850B155F4BA552079129DC3C1367B26EDC3FC0088656C0D814D3 + 0B856DE690DFD4C346015364F58D1A7316845995F1645A3C0D83A79824C8EAE1 + D00F31AA8AA799BE48F3FC92D98AA5C736BE75944567B05FFDE4BD9306877502 + 3CD203DD01C233AC00CA074AAA2D5E34BF61CDA6952AFD906AE5E1FD6F823135 + 30EF2582C4CB9379E9D27F521FF7F455FE2A595E47A750587F37F45FF062213B + 9D4E37C9E5F27EB026EDBDBDBDB30C06C31CB06E05323A57F69A38A362C4ED78 + F09D73746F7979B9AAA4A4C44C98C73F2A03670E76F654BEC648ACA391C8AC6F + 91890B7E188BC94C0BD364153451C558D0F3E006D51DC9F4479AC79B47BE5292 + FAEBD36FFE7103C8B475EDB18F370F5BCD1A306E2102C02B420C9A60555DF586 + 4FFB0CC3F6B5C70E7E8E84D0B3607C90C8FCFFB7A0AEAE2E716B6B6B01629BAC + DE9A5DFA7A9804B9EEF3498D4249D2E3B4B434339FCF0F8020D94089C8A8A968 + 7E90BE65CCE3B09F18E83C259B33A775C9922A754646869DE8D470243360B255 + D726295FC7C824D7E34C61A32845F21CD3A7D517659A025B26021EFBBF2C8F00 + 531EC90C449AC7E1F140C52F6528AA4F6E7EE70D6F30D091BF7F470DD1289E4C + 5B995B9CDCB87EAB4A6FB338571EFEE0B83BE0BF8A671DAFBE88358F6789E6F5 + 7AE3F02CDCBDDB59C8F0052B56A766AD42A9E4417871FE3E91488437220C6487 + 3CAA1D92F0BB869A1C88DFF50FBDBA452C91DC292B2B552995CA71E2DD28F1FE + A79854A7A7621933795598491DE4AEA97C8AA9D70C4A2897EF364D8610D705DF + 588B3839F95926F26CC3C383C6D772F999DFEEA917F3E2C2602DAF02F723D3E6 + 8172461A4EF4345E3D7FEEB32B670F81FBEEE98FF3CC5687679F1D0C06056AB5 + 5ADADEDE5EB48826DACAA1D161DBBCB40F727373CD53FF09C3376FDE94E61B7C + 47DBEC86EF8D5CEA3F172E5CA802D9C18374105B141A51514F310BDD94AD6C0A + 0D0E2ECE7D8E99D93972B40B757CEF90C4456546EDF64073DBF67CFAADC16E19 + 5F73ECE3DF5CD959CF48E50B97B60F694E816D6E16688C173B1E6B6E6DFDEAC8 + 763077F499AD6EFA22135B521C8220828B17BF9B5FE4841B5C186A9B54A63429 + 3942263C66C983B3D2AFDFEEEF8DCF332175FA805BE555A4348075394804E924 + 965B381653A9B53778C9980D29CD6E9251D84C446BC86316E75CEFD0F4C767F6 + 8DD78D434115569C1595196B9FCFE9AFFFFC8721F3C4700237CE97CA17958279 + E1308605D46323D7841C6EC1C4A45D537DA47E03986B8861FEC91AC5B7257C39 + B5B4B4E4BEE26336DB4201238FC144B96152167833FE76C402213D74342C7386 + 82C313B3457B162D5A84078A9FCE5CC47A8FC9CCD7799A27E190115414CA0E86 + B3F0B2C76008B1D3E01EAA1F91B9C121CA5598199519D53C97C12CEAAFFFA21D + 9CEA609DC538DAFCC395DB2DF7DAC6762EA991AF2E585806B6C338AD797C002C + 89E560FA500CF3F845279A24EF6F5F3617ADE7CE3A0D4E75B035E833DEB58DF5 + 683C3673093F593A9727CE6353A81C93DF33D4C146B6AD5DBB7600FAF16486C4 + 661E2F5AE666022604DBC341636FC0D1A30B7BCDB9D478A982C2CD6392C81C2B + EA1FEA4FE74565462DFB8DA5AFFE727D71C52787AF9ED75E56DF6B03635AA25C + 1280E46F2D5E51B6627E117745E3BE75E07EE005E6F14309D3E7F3B1CF36352F + CF650BF75C1AEC7BA40B38FB1212C4460E8713B0D96C6C702E972C4C942E2890 + 48F9977DC6ED3B77BEF3109A3A88F8239ADD73CC6F3E6B5AAEC4987BAE4D0C3D + 32C081E79885EC8405F30549FC5BAC60546634F37853990354407CA1874469FB + 88729302C908C85D68EA1C10CBFC9373B856AB651D3FDE3C47AFD7CF65B15898 + 42211F2D2828B426274B508DE611BDBBFB9E58A7D3252108EA552A15AABD7BF7 + 8E403F9EC3433F17F37F481BBAFB015CE0A40000000049454E44AE426082} + end + object PNGButton5: TPNGButton + Tag = 5 + Left = 172 + Top = 39 + Width = 21 + Height = 15 + ImgStates = 3 + PngImg.Data = { + 89504E470D0A1A0A0000000D494844520000003F0000000F0806000000532517 + 72000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F33000008774944415478DAB5967B5053571E + C7EFCDFB0D7910082041824900157917A458BBA0F5C5D21D5F38756774B5CED6 + DDB1B5EEBAD6CE62655A2B6DC745A5752B3BDABAB3E37665AD3AD6D515AD5345 + 4110820425120C84007987BC937B93BBE7CA651B3591FED33BF39DCC3DF7E473 + 7FDFFBFB9DDF39308661107EC1300CC5BA369757F1762F5BFD9E62EFB63A701B + 88352F1C0E451B8609518018402C20F6E8E09090DDABDBE6295634A6A6A638C1 + 989710CEC7416128F61595A91F7824846EA8B6C1CB4B7F1213FE09E6E9D7FFF0 + D187F2C49477CF74DE5AB5E3F4979708D08BCC4F0747022213A2E30102712D16 + 8BC077BD73BB1025D53EE69276C92ACB6F30188C49F0CC4D041B24DE810B2304 + CDC4B4B4B46E8FF320B513A971BBB2AAAB6664CE641E7EE3A557E6D6D76CBC4D + 8261BACDE37A90B77F47051877CC607E3A403C333422C827D9098542BC07ED5D + D9693ADB511882A95E2834EC2BCBDE919E9E6E04CF5D401E201F912D04088DC8 + 584CA6FA567BB6A0530B9810D54F8286C9352FCFC89CC93CEBDAAE8F4E25C5C5 + 2F7DFBF4F1EE139BDE2EBFA2EEFEFDA6137FF92B0189661E2682A412013289EC + 70F05FABD5CAF75EEDD8CD46B08273A30F7AD749E7958CB2E1A6945F949D67B3 + D94E225037F1EB8F2859E8454CF337577633BC48C17F5D86DE95BC5925E6444E + 93ACA6EA454C349A7952EBBB1FCA59747A5100415ECE4848DADC74FDE2D58397 + CEDC3BF7BBF76B1449A94293CBF11585446E1B73D8EEACFEE28071BA2C23CC53 + 224B124551BE6740978D9A6CF302F6C99CB8005675C731D6D1E532696A12322B + 12E8ACF80087DE4AE5F3D4B4B4A46E664AE23085427144942C427069914C47CF + C36CBFC134CF67B6E5B09DFEAA9E90B3A30F736BAAC8C20A0189161F12705BE9 + 22BE9A2597767367A73ECB0C469A67A8F61D39CC67716AC92412FE4521B36B72 + E2BE61787CCBC9C3470328A22B952917FF7955EDBA74A158C863B204F89C208A + 4EE8EDE6F72B0EFEE96B601E214A1E37CFEAEBEB1389D58603AC30BC8234952D + C813426CE301B7A92D60FBB74024B4068DD69C526E62A580C68CA7C3641EF424 + CD98D541830F850B155F4BA552079129DC3C1367B26EDC3FC0088656C0D814D3 + 0B856DE690DFD4C346015364F58D1A7316845995F1645A3C0D83A79824C8EAE1 + D00F31AA8AA799BE48F3FC92D98AA5C736BE75944567B05FFDE4BD9306877502 + 3CD203DD01C233AC00CA074AAA2D5E34BF61CDA6952AFD906AE5E1FD6F823135 + 30EF2582C4CB9379E9D27F521FF7F455FE2A595E47A750587F37F45FF062213B + 9D4E37C9E5F27EB026EDBDBDBDB30C06C31CB06E05323A57F69A38A362C4ED78 + F09D73746F7979B9AAA4A4C44C98C73F2A03670E76F654BEC648ACA391C8AC6F + 91890B7E188BC94C0BD364153451C558D0F3E006D51DC9F4479AC79B47BE5292 + FAEBD36FFE7103C8B475EDB18F370F5BCD1A306E2102C02B420C9A60555DF586 + 4FFB0CC3F6B5C70E7E8E84D0B3607C90C8FCFFB7A0AEAE2E716B6B6B01629BAC + DE9A5DFA7A9804B9EEF3498D4249D2E3B4B434339FCF0F8020D94089C8A8A968 + 7E90BE65CCE3B09F18E83C259B33A775C9922A754646869DE8D470243360B255 + D726295FC7C824D7E34C61A32845F21CD3A7D517659A025B26021EFBBF2C8F00 + 531EC90C449AC7E1F140C52F6528AA4F6E7EE70D6F30D091BF7F470DD1289E4C + 5B995B9CDCB87EAB4A6FB338571EFEE0B83BE0BF8A671DAFBE88358F6789E6F5 + 7AE3F02CDCBDDB59C8F0052B56A766AD42A9E4417871FE3E91488437220C6487 + 3CAA1D92F0BB869A1C88DFF50FBDBA452C91DC292B2B552995CA71E2DD28F1FE + A79854A7A7621933795598491DE4AEA97C8AA9D70C4A2897EF364D8610D705DF + 588B3839F95926F26CC3C383C6D772F999DFEEA917F3E2C2602DAF02F723D3E6 + 8172461A4EF4345E3D7FEEB32B670F81FBEEE98FF3CC5687679F1D0C06056AB5 + 5ADADEDE5EB48826DACAA1D161DBBCB40F727373CD53FF09C3376FDE94E61B7C + 47DBEC86EF8D5CEA3F172E5CA802D9C18374105B141A51514F310BDD94AD6C0A + 0D0E2ECE7D8E99D93972B40B757CEF90C4456546EDF64073DBF67CFAADC16E19 + 5F73ECE3DF5CD959CF48E50B97B60F694E816D6E16688C173B1E6B6E6DFDEAC8 + 763077F499AD6EFA22135B521C8220828B17BF9B5FE4841B5C186A9B54A63429 + 3942263C66C983B3D2AFDFEEEF8DCF332175FA805BE555A4348075394804E924 + 965B381653A9B53778C9980D29CD6E9251D84C446BC86316E75CEFD0F4C767F6 + 8DD78D434115569C1595196B9FCFE9AFFFFC8721F3C4700237CE97CA17958279 + E1308605D46323D7841C6EC1C4A45D537DA47E03986B8861FEC91AC5B7257C39 + B5B4B4E4BEE26336DB4201238FC144B96152167833FE76C402213D74342C7386 + 82C313B3457B162D5A84078A9FCE5CC47A8FC9CCD7799A27E190115414CA0E86 + B3F0B2C76008B1D3E01EAA1F91B9C121CA5598199519D53C97C12CEAAFFFA21D + 9CEA609DC538DAFCC395DB2DF7DAC6762EA991AF2E585806B6C338AD797C002C + 89E560FA500CF3F845279A24EF6F5F3617ADE7CE3A0D4E75B035E833DEB58DF5 + 683C3673093F593A9727CE6353A81C93DF33D4C146B6AD5DBB7600FAF16486C4 + 661E2F5AE666022604DBC341636FC0D1A30B7BCDB9D478A982C2CD6392C81C2B + EA1FEA4FE74565462DFB8DA5AFFE727D71C52787AF9ED75E56DF6B03635AA25C + 1280E46F2D5E51B6627E117745E3BE75E07EE005E6F14309D3E7F3B1CF36352F + CF650BF75C1AEC7BA40B38FB1212C4460E8713B0D96C6C702E972C4C942E2890 + 48F9977DC6ED3B77BEF3109A3A88F8239ADD73CC6F3E6B5AAEC4987BAE4D0C3D + 32C081E79885EC8405F30549FC5BAC60546634F37853990354407CA1874469FB + 88729302C908C85D68EA1C10CBFC9373B856AB651D3FDE3C47AFD7CF65B15898 + 42211F2D2828B426274B508DE611BDBBFB9E58A7D3252108EA552A15AABD7BF7 + 8E403F9EC3433F17F37F481BBAFB015CE0A40000000049454E44AE426082} + end + object PNGButton6: TPNGButton + Tag = 6 + Left = 193 + Top = 39 + Width = 21 + Height = 15 + ImgStates = 3 + PngImg.Data = { + 89504E470D0A1A0A0000000D494844520000003F0000000F0806000000532517 + 72000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F33000008774944415478DAB5967B5053571E + C7EFCDFB0D7910082041824900157917A458BBA0F5C5D21D5F38756774B5CED6 + DDB1B5EEBAD6CE62655A2B6DC745A5752B3BDABAB3E37665AD3AD6D515AD5345 + 4110820425120C84007987BC937B93BBE7CA651B3591FED33BF39DCC3DF7E473 + 7FDFFBFB9DDF39308661107EC1300CC5BA369757F1762F5BFD9E62EFB63A701B + 88352F1C0E451B8609518018402C20F6E8E09090DDABDBE6295634A6A6A638C1 + 989710CEC7416128F61595A91F7824846EA8B6C1CB4B7F1213FE09E6E9D7FFF0 + D187F2C49477CF74DE5AB5E3F4979708D08BCC4F0747022213A2E30102712D16 + 8BC077BD73BB1025D53EE69276C92ACB6F30188C49F0CC4D041B24DE810B2304 + CDC4B4B4B46E8FF320B513A971BBB2AAAB6664CE641E7EE3A557E6D6D76CBC4D + 8261BACDE37A90B77F47051877CC607E3A403C333422C827D9098542BC07ED5D + D9693ADB511882A95E2834EC2BCBDE919E9E6E04CF5D401E201F912D04088DC8 + 584CA6FA567BB6A0530B9810D54F8286C9352FCFC89CC93CEBDAAE8F4E25C5C5 + 2F7DFBF4F1EE139BDE2EBFA2EEFEFDA6137FF92B0189661E2682A412013289EC + 70F05FABD5CAF75EEDD8CD46B08273A30F7AD749E7958CB2E1A6945F949D67B3 + D94E225037F1EB8F2859E8454CF337577633BC48C17F5D86DE95BC5925E6444E + 93ACA6EA454C349A7952EBBB1FCA59747A5100415ECE4848DADC74FDE2D58397 + CEDC3BF7BBF76B1449A94293CBF11585446E1B73D8EEACFEE28071BA2C23CC53 + 224B124551BE6740978D9A6CF302F6C99CB8005675C731D6D1E532696A12322B + 12E8ACF80087DE4AE5F3D4B4B4A46E664AE23085427144942C427069914C47CF + C36CBFC134CF67B6E5B09DFEAA9E90B3A30F736BAAC8C20A0189161F12705BE9 + 22BE9A2597767367A73ECB0C469A67A8F61D39CC67716AC92412FE4521B36B72 + E2BE61787CCBC9C3470328A22B952917FF7955EDBA74A158C863B204F89C208A + 4EE8EDE6F72B0EFEE96B601E214A1E37CFEAEBEB1389D58603AC30BC8234952D + C813426CE301B7A92D60FBB74024B4068DD69C526E62A580C68CA7C3641EF424 + CD98D541830F850B155F4BA552079129DC3C1367B26EDC3FC0088656C0D814D3 + 0B856DE690DFD4C346015364F58D1A7316845995F1645A3C0D83A79824C8EAE1 + D00F31AA8AA799BE48F3FC92D98AA5C736BE75944567B05FFDE4BD9306877502 + 3CD203DD01C233AC00CA074AAA2D5E34BF61CDA6952AFD906AE5E1FD6F823135 + 30EF2582C4CB9379E9D27F521FF7F455FE2A595E47A750587F37F45FF062213B + 9D4E37C9E5F27EB026EDBDBDBDB30C06C31CB06E05323A57F69A38A362C4ED78 + F09D73746F7979B9AAA4A4C44C98C73F2A03670E76F654BEC648ACA391C8AC6F + 91890B7E188BC94C0BD364153451C558D0F3E006D51DC9F4479AC79B47BE5292 + FAEBD36FFE7103C8B475EDB18F370F5BCD1A306E2102C02B420C9A60555DF586 + 4FFB0CC3F6B5C70E7E8E84D0B3607C90C8FCFFB7A0AEAE2E716B6B6B01629BAC + DE9A5DFA7A9804B9EEF3498D4249D2E3B4B434339FCF0F8020D94089C8A8A968 + 7E90BE65CCE3B09F18E83C259B33A775C9922A754646869DE8D470243360B255 + D726295FC7C824D7E34C61A32845F21CD3A7D517659A025B26021EFBBF2C8F00 + 531EC90C449AC7E1F140C52F6528AA4F6E7EE70D6F30D091BF7F470DD1289E4C + 5B995B9CDCB87EAB4A6FB338571EFEE0B83BE0BF8A671DAFBE88358F6789E6F5 + 7AE3F02CDCBDDB59C8F0052B56A766AD42A9E4417871FE3E91488437220C6487 + 3CAA1D92F0BB869A1C88DFF50FBDBA452C91DC292B2B552995CA71E2DD28F1FE + A79854A7A7621933795598491DE4AEA97C8AA9D70C4A2897EF364D8610D705DF + 588B3839F95926F26CC3C383C6D772F999DFEEA917F3E2C2602DAF02F723D3E6 + 8172461A4EF4345E3D7FEEB32B670F81FBEEE98FF3CC5687679F1D0C06056AB5 + 5ADADEDE5EB48826DACAA1D161DBBCB40F727373CD53FF09C3376FDE94E61B7C + 47DBEC86EF8D5CEA3F172E5CA802D9C18374105B141A51514F310BDD94AD6C0A + 0D0E2ECE7D8E99D93972B40B757CEF90C4456546EDF64073DBF67CFAADC16E19 + 5F73ECE3DF5CD959CF48E50B97B60F694E816D6E16688C173B1E6B6E6DFDEAC8 + 763077F499AD6EFA22135B521C8220828B17BF9B5FE4841B5C186A9B54A63429 + 3942263C66C983B3D2AFDFEEEF8DCF332175FA805BE555A4348075394804E924 + 965B381653A9B53778C9980D29CD6E9251D84C446BC86316E75CEFD0F4C767F6 + 8DD78D434115569C1595196B9FCFE9AFFFFC8721F3C4700237CE97CA17958279 + E1308605D46323D7841C6EC1C4A45D537DA47E03986B8861FEC91AC5B7257C39 + B5B4B4E4BEE26336DB4201238FC144B96152167833FE76C402213D74342C7386 + 82C313B3457B162D5A84078A9FCE5CC47A8FC9CCD7799A27E190115414CA0E86 + B3F0B2C76008B1D3E01EAA1F91B9C121CA5598199519D53C97C12CEAAFFFA21D + 9CEA609DC538DAFCC395DB2DF7DAC6762EA991AF2E585806B6C338AD797C002C + 89E560FA500CF3F845279A24EF6F5F3617ADE7CE3A0D4E75B035E833DEB58DF5 + 683C3673093F593A9727CE6353A81C93DF33D4C146B6AD5DBB7600FAF16486C4 + 661E2F5AE666022604DBC341636FC0D1A30B7BCDB9D478A982C2CD6392C81C2B + EA1FEA4FE74565462DFB8DA5AFFE727D71C52787AF9ED75E56DF6B03635AA25C + 1280E46F2D5E51B6627E117745E3BE75E07EE005E6F14309D3E7F3B1CF36352F + CF650BF75C1AEC7BA40B38FB1212C4460E8713B0D96C6C702E972C4C942E2890 + 48F9977DC6ED3B77BEF3109A3A88F8239ADD73CC6F3E6B5AAEC4987BAE4D0C3D + 32C081E79885EC8405F30549FC5BAC60546634F37853990354407CA1874469FB + 88729302C908C85D68EA1C10CBFC9373B856AB651D3FDE3C47AFD7CF65B15898 + 42211F2D2828B426274B508DE611BDBBFB9E58A7D3252108EA552A15AABD7BF7 + 8E403F9EC3433F17F37F481BBAFB015CE0A40000000049454E44AE426082} + end + object PNGButton7: TPNGButton + Tag = 7 + Left = 214 + Top = 39 + Width = 21 + Height = 15 + ImgStates = 3 + PngImg.Data = { + 89504E470D0A1A0A0000000D494844520000003F0000000F0806000000532517 + 72000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F33000008774944415478DAB5967B5053571E + C7EFCDFB0D7910082041824900157917A458BBA0F5C5D21D5F38756774B5CED6 + DDB1B5EEBAD6CE62655A2B6DC745A5752B3BDABAB3E37665AD3AD6D515AD5345 + 4110820425120C84007987BC937B93BBE7CA651B3591FED33BF39DCC3DF7E473 + 7FDFFBFB9DDF39308661107EC1300CC5BA369757F1762F5BFD9E62EFB63A701B + 88352F1C0E451B8609518018402C20F6E8E09090DDABDBE6295634A6A6A638C1 + 989710CEC7416128F61595A91F7824846EA8B6C1CB4B7F1213FE09E6E9D7FFF0 + D187F2C49477CF74DE5AB5E3F4979708D08BCC4F0747022213A2E30102712D16 + 8BC077BD73BB1025D53EE69276C92ACB6F30188C49F0CC4D041B24DE810B2304 + CDC4B4B4B46E8FF320B513A971BBB2AAAB6664CE641E7EE3A557E6D6D76CBC4D + 8261BACDE37A90B77F47051877CC607E3A403C333422C827D9098542BC07ED5D + D9693ADB511882A95E2834EC2BCBDE919E9E6E04CF5D401E201F912D04088DC8 + 584CA6FA567BB6A0530B9810D54F8286C9352FCFC89CC93CEBDAAE8F4E25C5C5 + 2F7DFBF4F1EE139BDE2EBFA2EEFEFDA6137FF92B0189661E2682A412013289EC + 70F05FABD5CAF75EEDD8CD46B08273A30F7AD749E7958CB2E1A6945F949D67B3 + D94E225037F1EB8F2859E8454CF337577633BC48C17F5D86DE95BC5925E6444E + 93ACA6EA454C349A7952EBBB1FCA59747A5100415ECE4848DADC74FDE2D58397 + CEDC3BF7BBF76B1449A94293CBF11585446E1B73D8EEACFEE28071BA2C23CC53 + 224B124551BE6740978D9A6CF302F6C99CB8005675C731D6D1E532696A12322B + 12E8ACF80087DE4AE5F3D4B4B4A46E664AE23085427144942C427069914C47CF + C36CBFC134CF67B6E5B09DFEAA9E90B3A30F736BAAC8C20A0189161F12705BE9 + 22BE9A2597767367A73ECB0C469A67A8F61D39CC67716AC92412FE4521B36B72 + E2BE61787CCBC9C3470328A22B952917FF7955EDBA74A158C863B204F89C208A + 4EE8EDE6F72B0EFEE96B601E214A1E37CFEAEBEB1389D58603AC30BC8234952D + C813426CE301B7A92D60FBB74024B4068DD69C526E62A580C68CA7C3641EF424 + CD98D541830F850B155F4BA552079129DC3C1367B26EDC3FC0088656C0D814D3 + 0B856DE690DFD4C346015364F58D1A7316845995F1645A3C0D83A79824C8EAE1 + D00F31AA8AA799BE48F3FC92D98AA5C736BE75944567B05FFDE4BD9306877502 + 3CD203DD01C233AC00CA074AAA2D5E34BF61CDA6952AFD906AE5E1FD6F823135 + 30EF2582C4CB9379E9D27F521FF7F455FE2A595E47A750587F37F45FF062213B + 9D4E37C9E5F27EB026EDBDBDBDB30C06C31CB06E05323A57F69A38A362C4ED78 + F09D73746F7979B9AAA4A4C44C98C73F2A03670E76F654BEC648ACA391C8AC6F + 91890B7E188BC94C0BD364153451C558D0F3E006D51DC9F4479AC79B47BE5292 + FAEBD36FFE7103C8B475EDB18F370F5BCD1A306E2102C02B420C9A60555DF586 + 4FFB0CC3F6B5C70E7E8E84D0B3607C90C8FCFFB7A0AEAE2E716B6B6B01629BAC + DE9A5DFA7A9804B9EEF3498D4249D2E3B4B434339FCF0F8020D94089C8A8A968 + 7E90BE65CCE3B09F18E83C259B33A775C9922A754646869DE8D470243360B255 + D726295FC7C824D7E34C61A32845F21CD3A7D517659A025B26021EFBBF2C8F00 + 531EC90C449AC7E1F140C52F6528AA4F6E7EE70D6F30D091BF7F470DD1289E4C + 5B995B9CDCB87EAB4A6FB338571EFEE0B83BE0BF8A671DAFBE88358F6789E6F5 + 7AE3F02CDCBDDB59C8F0052B56A766AD42A9E4417871FE3E91488437220C6487 + 3CAA1D92F0BB869A1C88DFF50FBDBA452C91DC292B2B552995CA71E2DD28F1FE + A79854A7A7621933795598491DE4AEA97C8AA9D70C4A2897EF364D8610D705DF + 588B3839F95926F26CC3C383C6D772F999DFEEA917F3E2C2602DAF02F723D3E6 + 8172461A4EF4345E3D7FEEB32B670F81FBEEE98FF3CC5687679F1D0C06056AB5 + 5ADADEDE5EB48826DACAA1D161DBBCB40F727373CD53FF09C3376FDE94E61B7C + 47DBEC86EF8D5CEA3F172E5CA802D9C18374105B141A51514F310BDD94AD6C0A + 0D0E2ECE7D8E99D93972B40B757CEF90C4456546EDF64073DBF67CFAADC16E19 + 5F73ECE3DF5CD959CF48E50B97B60F694E816D6E16688C173B1E6B6E6DFDEAC8 + 763077F499AD6EFA22135B521C8220828B17BF9B5FE4841B5C186A9B54A63429 + 3942263C66C983B3D2AFDFEEEF8DCF332175FA805BE555A4348075394804E924 + 965B381653A9B53778C9980D29CD6E9251D84C446BC86316E75CEFD0F4C767F6 + 8DD78D434115569C1595196B9FCFE9AFFFFC8721F3C4700237CE97CA17958279 + E1308605D46323D7841C6EC1C4A45D537DA47E03986B8861FEC91AC5B7257C39 + B5B4B4E4BEE26336DB4201238FC144B96152167833FE76C402213D74342C7386 + 82C313B3457B162D5A84078A9FCE5CC47A8FC9CCD7799A27E190115414CA0E86 + B3F0B2C76008B1D3E01EAA1F91B9C121CA5598199519D53C97C12CEAAFFFA21D + 9CEA609DC538DAFCC395DB2DF7DAC6762EA991AF2E585806B6C338AD797C002C + 89E560FA500CF3F845279A24EF6F5F3617ADE7CE3A0D4E75B035E833DEB58DF5 + 683C3673093F593A9727CE6353A81C93DF33D4C146B6AD5DBB7600FAF16486C4 + 661E2F5AE666022604DBC341636FC0D1A30B7BCDB9D478A982C2CD6392C81C2B + EA1FEA4FE74565462DFB8DA5AFFE727D71C52787AF9ED75E56DF6B03635AA25C + 1280E46F2D5E51B6627E117745E3BE75E07EE005E6F14309D3E7F3B1CF36352F + CF650BF75C1AEC7BA40B38FB1212C4460E8713B0D96C6C702E972C4C942E2890 + 48F9977DC6ED3B77BEF3109A3A88F8239ADD73CC6F3E6B5AAEC4987BAE4D0C3D + 32C081E79885EC8405F30549FC5BAC60546634F37853990354407CA1874469FB + 88729302C908C85D68EA1C10CBFC9373B856AB651D3FDE3C47AFD7CF65B15898 + 42211F2D2828B426274B508DE611BDBBFB9E58A7D3252108EA552A15AABD7BF7 + 8E403F9EC3433F17F37F481BBAFB015CE0A40000000049454E44AE426082} + end + object PNGButton8: TPNGButton + Tag = 8 + Left = 235 + Top = 39 + Width = 21 + Height = 15 + ImgStates = 3 + PngImg.Data = { + 89504E470D0A1A0A0000000D494844520000003F0000000F0806000000532517 + 72000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F33000008774944415478DAB5967B5053571E + C7EFCDFB0D7910082041824900157917A458BBA0F5C5D21D5F38756774B5CED6 + DDB1B5EEBAD6CE62655A2B6DC745A5752B3BDABAB3E37665AD3AD6D515AD5345 + 4110820425120C84007987BC937B93BBE7CA651B3591FED33BF39DCC3DF7E473 + 7FDFFBFB9DDF39308661107EC1300CC5BA369757F1762F5BFD9E62EFB63A701B + 88352F1C0E451B8609518018402C20F6E8E09090DDABDBE6295634A6A6A638C1 + 989710CEC7416128F61595A91F7824846EA8B6C1CB4B7F1213FE09E6E9D7FFF0 + D187F2C49477CF74DE5AB5E3F4979708D08BCC4F0747022213A2E30102712D16 + 8BC077BD73BB1025D53EE69276C92ACB6F30188C49F0CC4D041B24DE810B2304 + CDC4B4B4B46E8FF320B513A971BBB2AAAB6664CE641E7EE3A557E6D6D76CBC4D + 8261BACDE37A90B77F47051877CC607E3A403C333422C827D9098542BC07ED5D + D9693ADB511882A95E2834EC2BCBDE919E9E6E04CF5D401E201F912D04088DC8 + 584CA6FA567BB6A0530B9810D54F8286C9352FCFC89CC93CEBDAAE8F4E25C5C5 + 2F7DFBF4F1EE139BDE2EBFA2EEFEFDA6137FF92B0189661E2682A412013289EC + 70F05FABD5CAF75EEDD8CD46B08273A30F7AD749E7958CB2E1A6945F949D67B3 + D94E225037F1EB8F2859E8454CF337577633BC48C17F5D86DE95BC5925E6444E + 93ACA6EA454C349A7952EBBB1FCA59747A5100415ECE4848DADC74FDE2D58397 + CEDC3BF7BBF76B1449A94293CBF11585446E1B73D8EEACFEE28071BA2C23CC53 + 224B124551BE6740978D9A6CF302F6C99CB8005675C731D6D1E532696A12322B + 12E8ACF80087DE4AE5F3D4B4B4A46E664AE23085427144942C427069914C47CF + C36CBFC134CF67B6E5B09DFEAA9E90B3A30F736BAAC8C20A0189161F12705BE9 + 22BE9A2597767367A73ECB0C469A67A8F61D39CC67716AC92412FE4521B36B72 + E2BE61787CCBC9C3470328A22B952917FF7955EDBA74A158C863B204F89C208A + 4EE8EDE6F72B0EFEE96B601E214A1E37CFEAEBEB1389D58603AC30BC8234952D + C813426CE301B7A92D60FBB74024B4068DD69C526E62A580C68CA7C3641EF424 + CD98D541830F850B155F4BA552079129DC3C1367B26EDC3FC0088656C0D814D3 + 0B856DE690DFD4C346015364F58D1A7316845995F1645A3C0D83A79824C8EAE1 + D00F31AA8AA799BE48F3FC92D98AA5C736BE75944567B05FFDE4BD9306877502 + 3CD203DD01C233AC00CA074AAA2D5E34BF61CDA6952AFD906AE5E1FD6F823135 + 30EF2582C4CB9379E9D27F521FF7F455FE2A595E47A750587F37F45FF062213B + 9D4E37C9E5F27EB026EDBDBDBDB30C06C31CB06E05323A57F69A38A362C4ED78 + F09D73746F7979B9AAA4A4C44C98C73F2A03670E76F654BEC648ACA391C8AC6F + 91890B7E188BC94C0BD364153451C558D0F3E006D51DC9F4479AC79B47BE5292 + FAEBD36FFE7103C8B475EDB18F370F5BCD1A306E2102C02B420C9A60555DF586 + 4FFB0CC3F6B5C70E7E8E84D0B3607C90C8FCFFB7A0AEAE2E716B6B6B01629BAC + DE9A5DFA7A9804B9EEF3498D4249D2E3B4B434339FCF0F8020D94089C8A8A968 + 7E90BE65CCE3B09F18E83C259B33A775C9922A754646869DE8D470243360B255 + D726295FC7C824D7E34C61A32845F21CD3A7D517659A025B26021EFBBF2C8F00 + 531EC90C449AC7E1F140C52F6528AA4F6E7EE70D6F30D091BF7F470DD1289E4C + 5B995B9CDCB87EAB4A6FB338571EFEE0B83BE0BF8A671DAFBE88358F6789E6F5 + 7AE3F02CDCBDDB59C8F0052B56A766AD42A9E4417871FE3E91488437220C6487 + 3CAA1D92F0BB869A1C88DFF50FBDBA452C91DC292B2B552995CA71E2DD28F1FE + A79854A7A7621933795598491DE4AEA97C8AA9D70C4A2897EF364D8610D705DF + 588B3839F95926F26CC3C383C6D772F999DFEEA917F3E2C2602DAF02F723D3E6 + 8172461A4EF4345E3D7FEEB32B670F81FBEEE98FF3CC5687679F1D0C06056AB5 + 5ADADEDE5EB48826DACAA1D161DBBCB40F727373CD53FF09C3376FDE94E61B7C + 47DBEC86EF8D5CEA3F172E5CA802D9C18374105B141A51514F310BDD94AD6C0A + 0D0E2ECE7D8E99D93972B40B757CEF90C4456546EDF64073DBF67CFAADC16E19 + 5F73ECE3DF5CD959CF48E50B97B60F694E816D6E16688C173B1E6B6E6DFDEAC8 + 763077F499AD6EFA22135B521C8220828B17BF9B5FE4841B5C186A9B54A63429 + 3942263C66C983B3D2AFDFEEEF8DCF332175FA805BE555A4348075394804E924 + 965B381653A9B53778C9980D29CD6E9251D84C446BC86316E75CEFD0F4C767F6 + 8DD78D434115569C1595196B9FCFE9AFFFFC8721F3C4700237CE97CA17958279 + E1308605D46323D7841C6EC1C4A45D537DA47E03986B8861FEC91AC5B7257C39 + B5B4B4E4BEE26336DB4201238FC144B96152167833FE76C402213D74342C7386 + 82C313B3457B162D5A84078A9FCE5CC47A8FC9CCD7799A27E190115414CA0E86 + B3F0B2C76008B1D3E01EAA1F91B9C121CA5598199519D53C97C12CEAAFFFA21D + 9CEA609DC538DAFCC395DB2DF7DAC6762EA991AF2E585806B6C338AD797C002C + 89E560FA500CF3F845279A24EF6F5F3617ADE7CE3A0D4E75B035E833DEB58DF5 + 683C3673093F593A9727CE6353A81C93DF33D4C146B6AD5DBB7600FAF16486C4 + 661E2F5AE666022604DBC341636FC0D1A30B7BCDB9D478A982C2CD6392C81C2B + EA1FEA4FE74565462DFB8DA5AFFE727D71C52787AF9ED75E56DF6B03635AA25C + 1280E46F2D5E51B6627E117745E3BE75E07EE005E6F14309D3E7F3B1CF36352F + CF650BF75C1AEC7BA40B38FB1212C4460E8713B0D96C6C702E972C4C942E2890 + 48F9977DC6ED3B77BEF3109A3A88F8239ADD73CC6F3E6B5AAEC4987BAE4D0C3D + 32C081E79885EC8405F30549FC5BAC60546634F37853990354407CA1874469FB + 88729302C908C85D68EA1C10CBFC9373B856AB651D3FDE3C47AFD7CF65B15898 + 42211F2D2828B426274B508DE611BDBBFB9E58A7D3252108EA552A15AABD7BF7 + 8E403F9EC3433F17F37F481BBAFB015CE0A40000000049454E44AE426082} + end + object PNGButton9: TPNGButton + Tag = 9 + Left = 256 + Top = 39 + Width = 21 + Height = 15 + ImgStates = 3 + PngImg.Data = { + 89504E470D0A1A0A0000000D494844520000003F0000000F0806000000532517 + 72000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F33000008774944415478DAB5967B5053571E + C7EFCDFB0D7910082041824900157917A458BBA0F5C5D21D5F38756774B5CED6 + DDB1B5EEBAD6CE62655A2B6DC745A5752B3BDABAB3E37665AD3AD6D515AD5345 + 4110820425120C84007987BC937B93BBE7CA651B3591FED33BF39DCC3DF7E473 + 7FDFFBFB9DDF39308661107EC1300CC5BA369757F1762F5BFD9E62EFB63A701B + 88352F1C0E451B8609518018402C20F6E8E09090DDABDBE6295634A6A6A638C1 + 989710CEC7416128F61595A91F7824846EA8B6C1CB4B7F1213FE09E6E9D7FFF0 + D187F2C49477CF74DE5AB5E3F4979708D08BCC4F0747022213A2E30102712D16 + 8BC077BD73BB1025D53EE69276C92ACB6F30188C49F0CC4D041B24DE810B2304 + CDC4B4B4B46E8FF320B513A971BBB2AAAB6664CE641E7EE3A557E6D6D76CBC4D + 8261BACDE37A90B77F47051877CC607E3A403C333422C827D9098542BC07ED5D + D9693ADB511882A95E2834EC2BCBDE919E9E6E04CF5D401E201F912D04088DC8 + 584CA6FA567BB6A0530B9810D54F8286C9352FCFC89CC93CEBDAAE8F4E25C5C5 + 2F7DFBF4F1EE139BDE2EBFA2EEFEFDA6137FF92B0189661E2682A412013289EC + 70F05FABD5CAF75EEDD8CD46B08273A30F7AD749E7958CB2E1A6945F949D67B3 + D94E225037F1EB8F2859E8454CF337577633BC48C17F5D86DE95BC5925E6444E + 93ACA6EA454C349A7952EBBB1FCA59747A5100415ECE4848DADC74FDE2D58397 + CEDC3BF7BBF76B1449A94293CBF11585446E1B73D8EEACFEE28071BA2C23CC53 + 224B124551BE6740978D9A6CF302F6C99CB8005675C731D6D1E532696A12322B + 12E8ACF80087DE4AE5F3D4B4B4A46E664AE23085427144942C427069914C47CF + C36CBFC134CF67B6E5B09DFEAA9E90B3A30F736BAAC8C20A0189161F12705BE9 + 22BE9A2597767367A73ECB0C469A67A8F61D39CC67716AC92412FE4521B36B72 + E2BE61787CCBC9C3470328A22B952917FF7955EDBA74A158C863B204F89C208A + 4EE8EDE6F72B0EFEE96B601E214A1E37CFEAEBEB1389D58603AC30BC8234952D + C813426CE301B7A92D60FBB74024B4068DD69C526E62A580C68CA7C3641EF424 + CD98D541830F850B155F4BA552079129DC3C1367B26EDC3FC0088656C0D814D3 + 0B856DE690DFD4C346015364F58D1A7316845995F1645A3C0D83A79824C8EAE1 + D00F31AA8AA799BE48F3FC92D98AA5C736BE75944567B05FFDE4BD9306877502 + 3CD203DD01C233AC00CA074AAA2D5E34BF61CDA6952AFD906AE5E1FD6F823135 + 30EF2582C4CB9379E9D27F521FF7F455FE2A595E47A750587F37F45FF062213B + 9D4E37C9E5F27EB026EDBDBDBDB30C06C31CB06E05323A57F69A38A362C4ED78 + F09D73746F7979B9AAA4A4C44C98C73F2A03670E76F654BEC648ACA391C8AC6F + 91890B7E188BC94C0BD364153451C558D0F3E006D51DC9F4479AC79B47BE5292 + FAEBD36FFE7103C8B475EDB18F370F5BCD1A306E2102C02B420C9A60555DF586 + 4FFB0CC3F6B5C70E7E8E84D0B3607C90C8FCFFB7A0AEAE2E716B6B6B01629BAC + DE9A5DFA7A9804B9EEF3498D4249D2E3B4B434339FCF0F8020D94089C8A8A968 + 7E90BE65CCE3B09F18E83C259B33A775C9922A754646869DE8D470243360B255 + D726295FC7C824D7E34C61A32845F21CD3A7D517659A025B26021EFBBF2C8F00 + 531EC90C449AC7E1F140C52F6528AA4F6E7EE70D6F30D091BF7F470DD1289E4C + 5B995B9CDCB87EAB4A6FB338571EFEE0B83BE0BF8A671DAFBE88358F6789E6F5 + 7AE3F02CDCBDDB59C8F0052B56A766AD42A9E4417871FE3E91488437220C6487 + 3CAA1D92F0BB869A1C88DFF50FBDBA452C91DC292B2B552995CA71E2DD28F1FE + A79854A7A7621933795598491DE4AEA97C8AA9D70C4A2897EF364D8610D705DF + 588B3839F95926F26CC3C383C6D772F999DFEEA917F3E2C2602DAF02F723D3E6 + 8172461A4EF4345E3D7FEEB32B670F81FBEEE98FF3CC5687679F1D0C06056AB5 + 5ADADEDE5EB48826DACAA1D161DBBCB40F727373CD53FF09C3376FDE94E61B7C + 47DBEC86EF8D5CEA3F172E5CA802D9C18374105B141A51514F310BDD94AD6C0A + 0D0E2ECE7D8E99D93972B40B757CEF90C4456546EDF64073DBF67CFAADC16E19 + 5F73ECE3DF5CD959CF48E50B97B60F694E816D6E16688C173B1E6B6E6DFDEAC8 + 763077F499AD6EFA22135B521C8220828B17BF9B5FE4841B5C186A9B54A63429 + 3942263C66C983B3D2AFDFEEEF8DCF332175FA805BE555A4348075394804E924 + 965B381653A9B53778C9980D29CD6E9251D84C446BC86316E75CEFD0F4C767F6 + 8DD78D434115569C1595196B9FCFE9AFFFFC8721F3C4700237CE97CA17958279 + E1308605D46323D7841C6EC1C4A45D537DA47E03986B8861FEC91AC5B7257C39 + B5B4B4E4BEE26336DB4201238FC144B96152167833FE76C402213D74342C7386 + 82C313B3457B162D5A84078A9FCE5CC47A8FC9CCD7799A27E190115414CA0E86 + B3F0B2C76008B1D3E01EAA1F91B9C121CA5598199519D53C97C12CEAAFFFA21D + 9CEA609DC538DAFCC395DB2DF7DAC6762EA991AF2E585806B6C338AD797C002C + 89E560FA500CF3F845279A24EF6F5F3617ADE7CE3A0D4E75B035E833DEB58DF5 + 683C3673093F593A9727CE6353A81C93DF33D4C146B6AD5DBB7600FAF16486C4 + 661E2F5AE666022604DBC341636FC0D1A30B7BCDB9D478A982C2CD6392C81C2B + EA1FEA4FE74565462DFB8DA5AFFE727D71C52787AF9ED75E56DF6B03635AA25C + 1280E46F2D5E51B6627E117745E3BE75E07EE005E6F14309D3E7F3B1CF36352F + CF650BF75C1AEC7BA40B38FB1212C4460E8713B0D96C6C702E972C4C942E2890 + 48F9977DC6ED3B77BEF3109A3A88F8239ADD73CC6F3E6B5AAEC4987BAE4D0C3D + 32C081E79885EC8405F30549FC5BAC60546634F37853990354407CA1874469FB + 88729302C908C85D68EA1C10CBFC9373B856AB651D3FDE3C47AFD7CF65B15898 + 42211F2D2828B426274B508DE611BDBBFB9E58A7D3252108EA552A15AABD7BF7 + 8E403F9EC3433F17F37F481BBAFB015CE0A40000000049454E44AE426082} + end +end diff --git a/ScoreFormUnit.h b/ScoreFormUnit.h new file mode 100644 index 0000000..05f1680 --- /dev/null +++ b/ScoreFormUnit.h @@ -0,0 +1,74 @@ +//--------------------------------------------------------------------------- + +#ifndef ScoreFormUnitH +#define ScoreFormUnitH +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include "GeneralDialogPanel.h" +#include "TextButton.h" +#include +#include "PNGButton.hpp" + +//--------------------------------------------------------------------------- +class TScoreForm : public TForm +{ +__published: // IDE-managed Components + TTextButton *m_btnOk; + TTextButton *m_btnCanel; + TLabel *Label1; + TLabel *Label3; + TLabel *Label5; + TLabel *m_StyleName; + TLabel *m_NetScore; + TLabel *m_MyScore; + TPNGButton *PNGButton1; + TPNGButton *PNGButton2; + TPNGButton *PNGButton3; + TPNGButton *PNGButton4; + TPNGButton *PNGButton5; + TPNGButton *PNGButton6; + TPNGButton *PNGButton7; + TPNGButton *PNGButton8; + TPNGButton *PNGButton9; + TPNGButton *PNGButton10; + TPNGButton *PNGButton11; + TPNGButton *PNGButton12; + TPNGButton *PNGButton13; + TPNGButton *PNGButton14; + TPNGButton *PNGButton15; + TPNGButton *PNGButton16; + TPNGButton *PNGButton17; + TPNGButton *PNGButton18; + TPNGButton *PNGButton19; + TPNGButton *PNGButton20; + + void __fastcall BtnMouseEnter(TObject *Sender); + void __fastcall BtnMouseLeave(TObject *Sender); + void __fastcall BtnClick(TObject *Sender); + void __fastcall FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift); + void __fastcall FormPaint(TObject *Sender); + void __fastcall FormClose(TObject *Sender, TCloseAction &Action); + void __fastcall FormCreate(TObject *Sender); +private: // User declarations + TPNGButton *m_PNGNetScore[10]; + TPNGButton *m_PNGMyScore[10]; + + TPngImage *m_PngScoreA; + TPngImage *m_PngScoreB; + +public: // User declarations + int MyScore; + + void SetNetScore( int iScore, const char* strName ); + void SetMyScore( int iScore, bool bChange=true ); + void SetScoreWindow(bool DownorUp); + + __fastcall TScoreForm(TComponent* Owner); +}; +//--------------------------------------------------------------------------- +extern PACKAGE TScoreForm *ScoreForm; +//--------------------------------------------------------------------------- +#endif diff --git a/ScrollViewUnit.cpp b/ScrollViewUnit.cpp new file mode 100644 index 0000000..33f7353 --- /dev/null +++ b/ScrollViewUnit.cpp @@ -0,0 +1,202 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop + +#include "ScrollViewUnit.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +//--------------------------------------------------------------------------- +__fastcall TScrollView::TScrollView(TComponent* Owner) + : TPanelDB( Owner ) +{ + m_ScrollBar = NULL; + m_iTotalLine = 0; + m_iTopLine = 0; + m_iShowLine = 0; + + FBorder = 0; + FScrollBarWidth = 0; +} +//--------------------------------------------------------------------------- +__fastcall TScrollView::~TScrollView() +{ + SAFE_DELETE(m_ScrollBar) +} +//--------------------------------------------------------------------------- +void __fastcall TScrollView::WMEraseBkgnd(TWMEraseBkgnd &Message) +{ + Message.Result = true; +} +//--------------------------------------------------------------------------- +void __fastcall TScrollView::WMSize(Winapi::Messages::TWMSize &Message) +{ + TPanelDB::WMSize(Message); + + SBSizeChange(); + + if( FChangeSize ) + FChangeSize(this, m_RtContent); +} +//--------------------------------------------------------------------------- +void __fastcall TScrollView::WMVScroll(Winapi::Messages::TWMScroll &Message) +{ + if( !m_ScrollBar ) return; + + int minpos, maxpos, page, curpos; + m_ScrollBar->GetScrollRange(&minpos, &maxpos); + page = m_ScrollBar->GetPageSize(); + // Get the current position of scroll box. + curpos = m_ScrollBar->GetScrollPos(); + + // Determine the new position of scroll box. + switch (Message.ScrollCode) + { + case SB_TOP: // Scroll to far top. + curpos = minpos; + break; + + case SB_BOTTOM: // Scroll to far bottom. + curpos = maxpos-page+1; + break; + + case SB_ENDSCROLL: // End scroll. + break; + + case SB_LINEUP: // Scroll left. + if (curpos > minpos) + curpos--; + break; + + case SB_LINEDOWN: // Scroll right. + if (curpos < maxpos-page+1) + curpos++; + break; + + case SB_PAGEUP: // Scroll one page left. + if (curpos > minpos) + curpos = (minpos > curpos-page) ? minpos : curpos-page; + //max(minpos, curpos-page); + break; + + case SB_PAGEDOWN: // Scroll one page right. + if( curposHandle ){ + m_ScrollBar->SetPosition(curpos); + } + if( m_iTopLine != curpos ){ + m_iTopLine = curpos; + } + + Message.Result = true; + + if( OnChangeSBPos ) OnChangeSBPos( this, Message.ScrollCode, m_iTopLine ); + if( FOnMouseWheel ) FOnMouseWheel(this); +} +//--------------------------------------------------------------------------- +void __fastcall TScrollView::WMMouseWheel(TWMMouseWheel &Message) +{ + if( m_ScrollBar && m_ScrollBar->Visible ){ + + UINT nSBCode; + + if( Message.WheelDelta>0 ) nSBCode = SB_LINEUP; + else nSBCode = SB_LINEDOWN; + + Perform( WM_VSCROLL, MAKELONG(nSBCode,0), NULL ); + } +} +//--------------------------------------------------------------------------- +void __fastcall TScrollView::SBSizeChange() +{ + int nTitle = 0; + int nBottom = 0; + if( FOnHgtTitle ) nTitle = FOnHgtTitle(this); + if( FOnHgtBottom ) nBottom = FOnHgtBottom(this); + + if(m_ScrollBar && m_iTotalLine>m_iShowLine && m_iTotalLine && m_iShowLine ){ + + m_ScrollBar->Left = Width - m_ScrollBar->Width - FBorder; + if(0==nTitle) { + m_ScrollBar->Top = FBorder; + } + else { + m_ScrollBar->Top = nTitle; + } + + if(0==nBottom) + m_ScrollBar->Height = Height-m_ScrollBar->Top-FBorder; + else + m_ScrollBar->Height = Height-m_ScrollBar->Top-nBottom; + + m_RtContent = TRect(FBorder, m_ScrollBar->Top, + FBorder+Width-2*FBorder-m_ScrollBar->Width, + m_ScrollBar->Top+m_ScrollBar->Height); + + }else { + + int iLeft, iTop, iWidth, iHeight; + + if(0==nTitle) + iTop = FBorder; + else + iTop = nTitle; + + if(0==nBottom) + iHeight = Height-iTop-FBorder; + else + iHeight = Height-iTop-nBottom; + + m_RtContent = TRect(FBorder, iTop, FBorder+Width-2*FBorder, iTop+iHeight); + } +} +//--------------------------------------------------------------------------- +bool __fastcall TScrollView::SetSB(int iTotalLine, int iShowLine, int iTopLine) +{ + bool bSucess = false; + + if( !m_ScrollBar ) { + m_ScrollBar = new TSkinScrollBar(this); + m_ScrollBar->m_pWndCtrl = this; + m_ScrollBar->Parent = this; + } + m_iTotalLine = iTotalLine; + m_iShowLine = iShowLine; + m_iTopLine = iTopLine; + SBSizeChange(); + + if( m_iTotalLine>m_iShowLine ) + { + m_ScrollBar->SetRange(0, iTotalLine-1); + m_ScrollBar->SetPageSize(iShowLine); + if(iTopLine>iTotalLine-iShowLine+1) { + iTopLine = iTotalLine-iShowLine+1; + } + m_ScrollBar->SetPosition(iTopLine); + m_ScrollBar->Visible = true; + m_ScrollBar->Invalidate(); + + bSucess = true; + + }else{ + if(m_ScrollBar) m_ScrollBar->Visible = false; + } + + FScrollBarWidth = m_ScrollBar->Width; + + return bSucess; +} +//--------------------------------------------------------------------------- diff --git a/ScrollViewUnit.h b/ScrollViewUnit.h new file mode 100644 index 0000000..96b9dfe --- /dev/null +++ b/ScrollViewUnit.h @@ -0,0 +1,72 @@ +//--------------------------------------------------------------------------- + +#ifndef ScrollViewUnitH +#define ScrollViewUnitH +//--------------------------------------------------------------------------- +#include "SkinScrollBarUnit.h" +#include "PanelDB.h" + +typedef void __fastcall (__closure *ChangeSBPos)(TObject *Sender, short ScrollCode, int iTopLine); +typedef void __fastcall (__closure *ChangeSize)(TObject *Sender, TRect rtPanelDB); +typedef int __fastcall (__closure *TNotiScoll)(TObject *Sender); + +class TScrollView: public TPanelDB +{ + +private: + + TNotiScoll FOnHgtTitle; + TNotiScoll FOnHgtBottom; + TNotiScoll FOnMouseWheel; + + ChangeSize FChangeSize; + ChangeSBPos FChangeSBPos; + + TSkinScrollBar *m_ScrollBar; + int m_iTotalLine; + int m_iShowLine; + int m_iTopLine; + void __fastcall SBSizeChange(); + + int FBorder; + int FScrollBarWidth; + +protected: + + MESSAGE void __fastcall WMEraseBkgnd(TWMEraseBkgnd &Message); + MESSAGE void __fastcall WMSize(Winapi::Messages::TWMSize &Message); + MESSAGE void __fastcall WMVScroll(Winapi::Messages::TWMScroll &Message); + MESSAGE void __fastcall WMMouseWheel(TWMMouseWheel &Message); + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(WM_ERASEBKGND, TWMEraseBkgnd, WMEraseBkgnd) + MESSAGE_HANDLER(WM_SIZE, TWMSize, WMSize) + MESSAGE_HANDLER(WM_VSCROLL, TWMVScroll, WMVScroll) + MESSAGE_HANDLER(WM_MOUSEWHEEL, TWMMouseWheel, WMMouseWheel) + END_MESSAGE_MAP( TPanelDB ) + +public: + + __fastcall TScrollView(TComponent* Owner); + __fastcall ~TScrollView(); + + bool __fastcall SetSB(int iTotalLine, int iShowLine, int iTopLine); + +__published: + + __property ChangeSBPos OnChangeSBPos= { read=FChangeSBPos, write=FChangeSBPos }; + __property ChangeSize OnChangeSize = { read=FChangeSize, write=FChangeSize }; + __property TNotiScoll OnHgtTitle = { read=FOnHgtTitle, write=FOnHgtTitle }; + __property TNotiScoll OnHgtBottom = { read=FOnHgtBottom, write=FOnHgtBottom }; + __property TNotiScoll OnMouseWheel = { read=FOnMouseWheel,write=FOnMouseWheel }; + __property int Border = { read=FBorder, write=FBorder }; + __property int ScrollBarWidth = { read=FScrollBarWidth, write=FScrollBarWidth, default=0 }; +}; +/* * * * * +read me + +if the tittle panel is exsit, the border setting has no effect, +you should draw border in title canvas, the same as bottom panel. + +* * * * */ +#endif diff --git a/SetUpFormUnit.cpp b/SetUpFormUnit.cpp new file mode 100644 index 0000000..d4e9b46 --- /dev/null +++ b/SetUpFormUnit.cpp @@ -0,0 +1,286 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop + +#include "SetUpFormUnit.h" +#include +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma link "GeneralDialogPanel" +#pragma link "PNGButton" +#pragma link "LineEdit" +#pragma link "TextButton" +#pragma resource "*.dfm" +TSetUpForm *SetUpForm; +//--------------------------------------------------------------------------- + +static const COLORREF + colLable = RGB(156, 170, 189); + +#define SPEED_MIN 50 +#define SPEED_MAX 200 +//--------------------------------------------------------------------------- +__fastcall TSetUpForm::TSetUpForm(TComponent* Owner) + : TForm(Owner) +{ + +} + +//--------------------------------------------------------------------------- +void __fastcall TSetUpForm::FormCreate(TObject *Sender) +{ + m_pBKGPanel->Font->Size = g_szFont9; + m_pEDspeed->SetTextFont(g_strTxtFontName, g_szFont9); + m_pBtnCancel->FontSize = g_szFont9; + m_pBtnOK->FontSize = g_szFont9; + + m_plbSpeed->Font->Color = colLable; + m_pLBSpeedMin->Font->Color = colLable; + m_pLBSpeedMax->Font->Color = colLable; + + m_plbBeat->Font->Color = colLable; + m_pLBBeat44->Font->Color = colLable; + m_pLBBeat43->Font->Color = colLable; + m_pLBBeat42->Font->Color = colLable; + m_pLBBeat86->Font->Color = colLable; + + ///////////////////////////// + m_pPNGBTPlayTry->Visible = true; + m_pPNGBTPlaying->Visible = false; + + + m_pSpeedUD->Position = g_nMelodyTempo; + m_pEDspeed->Text = IntToStr(g_nMelodyTempo); + m_btnSpeed->Hint = L"ٶ\nո"; + m_iTS = g_iMelodyTimeSignature; + m_nTempo = g_nMelodyTempo; + + m_pTBBeat->Max = 3; + m_pTBBeat->Min = 0; + m_pTBBeat->Position = g_iMelodyTimeSignature; + m_pTBBeat->Enabled = g_Theme.Empty();// g_lstRawBars.empty(); + + m_pTBSpeed->Max = 200; + m_pTBSpeed->Min = 50; + m_pTBSpeed->Position = g_nMelodyTempo; + + HRESULT hResult = f_MM_CreateRealTimeMIDIStream( true ); + if (hResult != S_OK) { + DebugPrint("Create realtime midi stream error.\n"); + } + + SetTransparent( this ); +} +//--------------------------------------------------------------------------- + + +void __fastcall TSetUpForm::m_pEDspeedChange(TObject *Sender) +{ + String str = m_pEDspeed->Text; + + int n = str.Length(); + if (n == 0) + return; + + bool flag = false; + for (int i = 1; i <= n; i++) { + if (str[i] < '0' || str[i] > '9') { + m_pEDspeed->Clear(); + flag = true; + break; + } + } + + if (!flag) { + int iSpeed = StrToInt(str); + if ( iSpeed > SPEED_MAX ) + m_pEDspeed->Text = iSpeed = SPEED_MAX; + + if( iSpeed>=SPEED_MIN && iSpeed<=SPEED_MAX ) { + m_pSpeedUD->Position = iSpeed; + m_pTBSpeed->Position = iSpeed; + + f_MM_SetTempo( iSpeed ); + m_nTempo = iSpeed; + } + } +} +//--------------------------------------------------------------------------- + +void __fastcall TSetUpForm::PNGBTPlay(TObject *Sender) +{ + TPNGButton *pPlay = (TPNGButton *)Sender; + if(pPlay == m_pPNGBTPlayTry) { + f_MM_Stop(); + f_MM_Play( Handle, 0, TYPE_BEAT ); + + m_pPNGBTPlayTry->Hide(); + m_pPNGBTPlaying->Show(); + + }else if(pPlay == m_pPNGBTPlaying){ + f_MM_Stop(); + + m_pPNGBTPlayTry->Show(); + m_pPNGBTPlaying->Hide(); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TSetUpForm::FormClose(TObject *Sender, TCloseAction &Action) +{ + f_MM_Stop(); + + HRESULT hResult = f_MM_FreeRealTimeMIDIStream(); + if (hResult != S_OK) { + DebugPrint("Free realtime midi stream error.\n"); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TSetUpForm::m_btnSpeedMouseDown(TObject *Sender, TMouseButton Button, + TShiftState Shift, int X, int Y) +{ + if( m_pPNGBTPlaying->Visible ){ + f_MM_Stop(); + + m_pPNGBTPlayTry->Show(); + m_pPNGBTPlaying->Hide(); + } + + static int nDownNums = 0; + static DWORD timeIni = 0; + static DWORD timeSAverage = 0; + DWORD timeCur = timeGetTime(); + static DWORD timePre = timeCur; + DWORD nCalTime; + + HRESULT hRet = f_MM_RealTimeMIDINoteOn( 42 ); //36 + bool bTempo200 = (timeCur-timePre) < (60000/200)?(timeCur-timePre!=0?1:0):0; + static int i=1; + i++; + //ϴʱ + // һٶʱ + // nDownNumsͳʼʱ + if( timeCur-timePre > 60000/50 ) { + nDownNums = 0; + timeIni = 0; + } + nDownNums++; + + if( nDownNums<=3 ) { + if( bTempo200 ) { + nDownNums--; + }else if(nDownNums != 1){ + timeIni += timeCur - timePre; + } + } + if( nDownNums>=3 && !bTempo200){ + + if(nDownNums==3){ + nCalTime = timeSAverage = timeIni/2; + }else{ //ƽ + nCalTime = timeCur - timePre; + nCalTime = (nCalTime + timeSAverage*3)/4; + timeSAverage = nCalTime; + } + + int nTempo = 0; + if( nCalTime ) + nTempo = 60000/nCalTime; + if( nTempo>=50 && nTempo<=200 ){ + m_pSpeedUD->Position = nTempo; + m_pTBSpeed->Position = nTempo; + m_pEDspeed->Text = IntToStr(nTempo); + + f_MM_SetTempo( nTempo ); + m_nTempo = nTempo; + } + } + + timePre = timeCur; +} +//--------------------------------------------------------------------------- + +void __fastcall TSetUpForm::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) + +{ + switch( Key ){ + case VK_SPACE: + m_btnSpeedMouseDown( NULL, mbLeft, TShiftState(NULL), 0, 0 ); + m_btnSpeed->SetDown(true); + break; + + case VK_ESCAPE: + ModalResult = mrCancel; + break; + + case VK_RETURN: + ModalResult = mrOk; + break; + + default: + break; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TSetUpForm::FormKeyUp(TObject *Sender, WORD &Key, TShiftState Shift) + +{ + switch( Key ){ + case VK_SPACE: +// m_btnSpeedMouseDown( NULL, mbLeft, TShiftState(NULL),0 ,0 ); + m_btnSpeed->SetDown(false); + break; + + default: + break; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TSetUpForm::SkinTrackBarChange(TObject *Sender) +{ + TSkinTrackBar *pTB = (TSkinTrackBar *)Sender; + if( pTB == m_pTBSpeed) { + int iSpeed = pTB->Position; + m_pSpeedUD->Position = iSpeed; + m_pEDspeed->Text = IntToStr(iSpeed); + + f_MM_SetTempo( iSpeed ); + m_nTempo = iSpeed; + + }else { + f_MM_Stop(); + + f_MM_SetTimeSignature( pTB->Position ); + m_iTS = pTB->Position; + + if( m_pPNGBTPlaying->Visible ) + f_MM_Play( Handle, 0, TYPE_BEAT ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TSetUpForm::EventUDOnClicked(TObject *Sender, TUDBtnType Button) +{ + if(Button == btNext) + m_pSpeedUD->Position += 1; + else + m_pSpeedUD->Position -= 1; + + if(m_pSpeedUD->Position > SPEED_MAX) + m_pSpeedUD->Position = SPEED_MAX; + else if(m_pSpeedUD->Position < SPEED_MIN) + m_pSpeedUD->Position = SPEED_MIN; + + m_pTBSpeed->Position = m_pSpeedUD->Position; + m_pEDspeed->Text = IntToStr(m_pSpeedUD->Position); + + f_MM_SetTempo( m_pSpeedUD->Position ); + m_nTempo = m_pSpeedUD->Position; +} +//--------------------------------------------------------------------------- + + diff --git a/SetUpFormUnit.dfm b/SetUpFormUnit.dfm new file mode 100644 index 0000000..f189547 --- /dev/null +++ b/SetUpFormUnit.dfm @@ -0,0 +1,723 @@ +object SetUpForm: TSetUpForm + Left = 0 + Top = 0 + ParentCustomHint = False + BorderStyle = bsNone + Caption = 'SetUpForm' + ClientHeight = 238 + ClientWidth = 418 + Color = clBtnFace + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + KeyPreview = True + Position = poMainFormCenter + Scaled = False + OnClose = FormClose + OnCreate = FormCreate + OnKeyDown = FormKeyDown + OnKeyUp = FormKeyUp + TextHeight = 13 + object m_pBKGPanel: TGeneralDialogPanel + Left = 0 + Top = 0 + Width = 418 + Height = 238 + Caption = #33410#25293#36895#24230#35774#32622 + Color = 5064257 + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentBackground = False + ParentDoubleBuffered = False + ParentFont = False + TabOrder = 0 + object m_plbSpeed: TLabel + Left = 32 + Top = 144 + Width = 24 + Height = 14 + Caption = #36895#24230 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object m_plbBeat: TLabel + Left = 32 + Top = 72 + Width = 24 + Height = 14 + Caption = #33410#25293 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object m_pLBBeat44: TLabel + Left = 91 + Top = 43 + Width = 19 + Height = 14 + Caption = '4/4' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object m_pLBBeat43: TLabel + Left = 148 + Top = 43 + Width = 19 + Height = 14 + Caption = '3/4' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object m_pLBBeat42: TLabel + Left = 207 + Top = 43 + Width = 19 + Height = 14 + Caption = '2/4' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object m_pLBBeat86: TLabel + Left = 266 + Top = 43 + Width = 19 + Height = 14 + Caption = '6/8' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object m_pLBSpeedMin: TLabel + Left = 93 + Top = 119 + Width = 14 + Height = 14 + Caption = '50' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object m_pLBSpeedMax: TLabel + Left = 264 + Top = 119 + Width = 21 + Height = 14 + Caption = '200' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object m_pPNGBTPlayTry: TPNGButton + Left = 352 + Top = 65 + Width = 39 + Height = 26 + Hint = #33410#25293#36895#24230#35797#21548 + ParentShowHint = False + PngImg.Data = { + 89504E470D0A1A0A0000000D494844520000009C0000001A0806000000425135 + 88000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F33000006DB4944415478DAED9B5B6C145518 + C7FF33B3B33BBB5DD8DEA08514684B34F000229840A284105E105120808A2682 + D110F4498C898A3E9878892646DF34F1816022C4A080968A260A4DA3D2126805 + 6AA55269BB157ABFEF76BBF7F53BB3B3A49576BBBB7366B60FFB255FE6ECCCB6 + FBDB737E73CE999D33422C16C3AA071E44B6E26AE3956487454A0BA59552D1B6 + 166DBF5911A50C530629FDDA36AC1D9B936C6BD63E143591614A246B4F499220 + 30E12291884CAF1D942E6D2B67813544E9A31CD5B6EC356BC402CAC59495940B + 29E799CCC7383C947D946D945D94C3DA3127652165A9C6E9D498CD0A269857E3 + E9A11C62AF49B82035BCACF130AE3C93EB6C72DD8D6B7C5E122E9410CEB5F5D1 + C7BEE8E9ED7D320B5053A2B4A4E4E44F3FFE701071F15885DDB773D7EEEA0EB7 + 7B71B6D9CA972DEBFAEECCA9ED546C4DE0EEDABDF7D3F6F6F6EDD966ABA8A8A8 + 3E73EA9BC354EC21E1BC245C01B5E997D4A68F679B8DDAF42CB5E97E126E3821 + DC5282742FAD5C916D3674B6B5B06E79192B5216536E22B66FE710DB1E2AD66A + BB5610DBAF56C5098BC5121F324411822018CEC2DA2D168DB2B643381C46D0EF + 656C1BE9500B310D50B992B6B7363CB239DBD586FADF6A18DB72AA9FB68470AC + E26ECCA1465DC92A0EF1A17407B17D3687D85EA6E2F7DAAE75C456E570E6C322 + CB249D0CD144E1A2245C381C42381482CF3BC2D89EA0430DC4D445E555B4BD3E + 87845B4DC235258453E1526DD4283BAB2261AA5C297E5673AC60AD515753B189 + 7229E5D3C4F6D11C627B9D8A5F6BBB1E26B613F35C4590AD36B59713937C6634 + 1A41241C517B41BD6CAA705AEF160A06E0191D646CCFD0A1DF89A993CA6B69DB + 90AA7031F6BF884F14E26CE0586F9A70EBE8FF3666249C7FC287C2375E40DFB1 + D390BA8760B52971480EF13FE1CA299F25B6F7E610DBDB543CAEED62C3FDB1F9 + 050B6065C2512F274924DD0C8DE59F9840D19117D177F414C49E21F56F32658B + AAED16567BB720093736DCCFD80ED0A15A62EA4857B8A07F02AE837B3078FA67 + 48FD23EA092472AA37DDC2793D63283BFE2124A7030355E7E1397E0EB6884090 + 567548D1137A853381ED1EE15C850BEF0A6721E184193E87271B9BBF85270937 + 3AD4A74B38DFB817A51FBF06C9A160F8421DBC55B5B046898DBE93A0B3DE740B + E7191B41C9D177D58A6311F1FA3078A21AE10B97A1508FC2E632990E177A8533 + 812D63E178B2F1166EDC3B86E20F5E81E850D4D7519F1F23D53508D735C1A64D + 17321D66B908E7FAFC08A43CC794FD0177173C5F9D85A5B50B8A6287C420336B + 545DC219CCA64B385E6C460837EF9D436A0F37398277FA305E5503A9A30F361B + 0DB319D41B17E1EC9F1C8698679FF6F84443338227CFC33E1E54E750E90C173C + 8433984D9770BCD88C104E79F30044BB32ED717F732B42E7EAA04C84D4F95D3A + C32C17E184F70F51F76B9FF13D31BA1A0BFC520FF1FC1538249B3A4F4965B8E0 + 219CC16CBA84E3C5668470C2E17D1015DBCC6C91288217AF42ACFB138A6455E7 + 77A90CB35C840BBCF51C048732EB7BA3A35EC4CE5D84F3C66D2876C7AC3D0A0F + E10C66D3251C2F3623840B1EDA09C16E9BF5BD318F0FB1DA46386EF5C2A628B3 + F6765C841B7D756F4A7089B0D4FF85A2BA9BF1C96792E0219CC16CBA84E3C566 + 8470DEE7B782AE105267BB760BF97FB4CF3AE7E4225CEF4BDB0025858A1B1885 + BDE62A0A7A3CEA84D88C1ECE60365DC2F1623342B8C17D9B52136ED803DBA51B + 70F58FD38584493D9C7B3F7D1125095C3004FBA51614FFDD03BB4C7311D9BC39 + 9CC16CBA84E3C56684705DBBD683BEC8CC6FA2CF52AEB5A1A07D0036E2922D26 + CEE15A9FDA80D80C6783ADE55F94347660BE688DFF626DF255AAC16CBA84E3C5 + 668470EE6D6B10B34EBF8AC9DAD68DE2E63BC813E5F84960F6556AD30E82B34D + 8593FB46B0E8723B8AFC5479ECF7A40C6E8DF010CE60365DC2F1623342B89B5B + 56927053E76396410F1636DD467E80A4B36576BB8B8B700D5B57DE3D1B245F00 + 0BAE776249BF9FE61B0E751299CD3B0D06B3E9128E179B11C2356F5C8E981C17 + 4EF20751D0D28D45C3019AD629F10B836CDD6960F704EB37572066115148738D + 8A4E0F9C567BCABF67A5D0A8BAEEA51ACC96F1CD7BC67669CB728DAD1BE5EEB1 + 385B8A73C8C9C1FBE63DBB977A6D7D19629208577B3FCABAC7E19095947F6B4B + 16FA578BF82770BDD289B27F06512858D3FEC53E59E85D9E64025BC6CB93027E + 3F9AEF7761F1CD7EE4435625CD948DF7F2A460C08F96250E94BA47902FC869DF + 4D4816D30997D602CCA8BAD234AC56163BA37986DE059826B065BC0093B13149 + 12EBE1F404EF059889D5C3A228D049C3B7DEA65B80995B629E3A5B6E89799A31 + DD12F3DC43342944EE219ACC62BA8768728F0926E7CA3D269879DDDDFB9860EE + 41E8A4917B103A8D98ED41E8FF0013A48036FFAB77F70000000049454E44AE42 + 6082} + ShowHint = True + OnClick = PNGBTPlay + end + object m_pPNGBTPlaying: TPNGButton + Left = 352 + Top = 65 + Width = 39 + Height = 26 + Hint = #20851#38381#33410#25293#36895#24230#35797#21548 + ParentShowHint = False + PngImg.Data = { + 89504E470D0A1A0A0000000D494844520000009C0000001A0806000000425135 + 88000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F33000004C64944415478DAED9B7D6893471C + C72FC9F3A45D4C8DD1698B4263EBCB3A5DDD6C1D28DABD20B88DD6971237CAFA + C7A6C806F32F19634C6463228E21E25F1514D9F48F8EB22DA8D3B229145FAA28 + D85659F7D26DAE35424B5B37B3D898B5C99374DF4B2F9BCEDAE4FA3C777984E7 + 073FEE9EE71EC827779FDC13B83BDBE8E828297F7A29C9555CEB689BA8D98E54 + 904E643E2B15765F5624911A32861C66A5C6DA4CC9F64CC5B2A44486FB62A2F1 + 74381CC446854B24122AAE5D480F2BD51CB0C69151649895F49A0EA217391B59 + 8A9C852C90CC4739869083C86E641F32C4DADCC8E9C822C6E966CCB2820A1661 + 3CFDC8DBF41AC2C530F02AE3A15C5324F7D9BD7D7797F145205C3C2D9CE7E557 + AA0FF60F0CBC9603A8FBA2A8B0F0CBEFBE6D7E8B8C89473B6CC1865AFFC91BC1 + E0EC5CB3CDF5F9FA8E1D0DD4A0FA5B1AB7D6FFEABE9E9E9E9A5CB39594949C3C + 1AF86A1BAAFD102E02E1BC18D32318D3B5B966C3989EC098BE01E14269E18A01 + 192C2E2DCB351BB9D9DD45A7651FAD221F473E0FB6AF4DC4B611D573EC5619D8 + 5A9DF96EA228CAD82BC36E27369B4D380B1DB7D164928E1DD1348DC4862394AD + 0A4D5D60FA03F55294BF2F5FF562AEBB8D5CBE7086B2CD43FF74A785A31DF7B3 + 8906F549DA7164EC55BA1E6CFB4DC4F60EAAC7D9AD4AB07DE3724F238AAA423A + 95D8250A9784709A16275A3C4EA291BF28DB3A34B583A90FF57294DF9B48B825 + 10AE332D5C0ACE4483BA04D54E6431B20E6C9F9A88ED7D549BD8AD9560FBA2C0 + 3383A8CEBCD42C67A7B39C2CE1D8EC168F8D90A1F09F94ED75345D04D34DD42B + 50B69B48B84A08D73129E112F8922323C3A95F5736417FF97979F9C4A128199F + FD9F707391F560DB6522B61DA836B25BF4757F78AA77267152E130CB391C90EE + 21C2FDC7A665FCAC3136E5A16CC9D4B869A9D92D06E1EE846E51B637D1740E4C + 3778854BD2D7722C46B44496FDE650F19D9DC49E45BFE9162E7A3742AADE6EC8 + EAD974B41ED84A5C53DC199FD32B9C04B60784F34C9FF5AF700A84A3FFE344B3 + D1FF6FDA3DC2856F0FEA126E381A25CBEA3EE4626B6BDA49F25DAE8CCFE916EE + 4E38449EE3ECB8F3E8B8A91E6FC6E7F40A27816DD2C219C966B47091A13079B6 + EE232EB62B4D1F13778127E3738608B762F33E2EB84B9F6D93269C60365DC219 + C52642B8A5FEED5C6C5703BBE5095759FF09175C7BE307D28413CCA64B38A3D8 + 4408F7D4DA77B9D87E38B1579E70E57EBEF77D6760A734E104B3E912CE283611 + C23DB1662B17DB2FA71BE409B7B0FA3D2EB85F9BF748134E309B2EE18C621321 + 5CC90B5BB8D87ACE1E92279C6F35DFAF21D8D2204D38C16CBA84338A4D847073 + 56D473B1F55E6A94275CD1CA4D5C70FD173F97269C60365DC219C52642B89915 + 7E2EB65B1D0179C2792BEAB8E0421D4DD28413CCA64B38A3D84408E75954CDC5 + 16FEA9599E70AEC5EBB9E0A23F1E97269C60365DC219C52642B8C7E6AFE662FB + FB7A8B3CE1D4F92F71C1C5AF9F92269C60365DC219C5264238D557C5C7166C95 + 231C5DA2D1E6ACE282537A2F485BDA12CCA66B69CB2836114B5B5A61251FDB40 + BB9CA52D6BF1DE5ABC97BA782F32ACED49D9C5A3BE3DC9DA80993D9BB5019333 + C6DB80696D31CF9ECDDA62CE19E36D31B70ED16411D6219AC9C5788768AC6382 + 137359C70427DF770F1E13B40E424F18D641688EC87410FA1FF0936827C0A298 + CF0000000049454E44AE426082} + ShowHint = True + OnClick = PNGBTPlay + end + object m_pBtnOK: TTextButton + Left = 132 + Top = 187 + Width = 57 + Height = 27 + ModalResult = mrOk + ParentShowHint = False + ShowHint = True + Text = #30830#23450 + end + object m_pBtnCancel: TTextButton + Left = 234 + Top = 187 + Width = 57 + Height = 27 + ModalResult = mrCancel + ParentShowHint = False + ShowHint = True + Text = #21462#28040 + end + object m_btnSpeed: TPNGButton + Left = 354 + Top = 134 + Width = 37 + Height = 37 + ImgStates = 3 + ParentShowHint = False + PngImg.Data = { + 89504E470D0A1A0A0000000D494844520000006F0000002508060000004C06B7 + 6A000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F3300000F644944415478DAE55B0977145516 + BE55DD9D4E67051242509238C816213080CB080E82238E38CEBF9D739C516764 + 3882E30288804110954589242490AD3BBDCEFDEE7BF7D5ABEAEEA4B3E0F11C0A + DB4AD2E9AAAFEE77EF7797F7129C7AE7EF355AE551ABD5E4C55F913979970802 + FC872FF86C5EBFC5F12C620A5A254F81D4AA55AAD6F8C5677C1D01544C164C18 + 52885710CAD74FC368CF3AA615C9D39B56AB15AA54CCAB23D74EC3C343D4DFBF + 95BABA3A29D79EE37317CDCFCF53BE90E7F3024D4D4DD2DDBBF768315FA0542A + 25AF304C6D88C11A61EAEAECA4DD7BF6D0E0F641EAEDEEA58ECE0EEAE9EDA5D9 + 274F687161919ECC3DA189071374EBE64D9A5F58F84D30F5F674D3D8D8180D0D + 0DD1E6CD9BA99B6D84F3CCCC0CCDB1AD70BE77EF1E5DBD7A959ECCCEAD1AD3B2 + E4D5ACE754CA65013334B483464747690B0388C25E023FFA0CD5EC67CDFFA619 + E0F8F83883BC6FC0A5D3E269017BDADA8C14C7B47BF76E3AFACAABD4DFD7D732 + A6A9478FE8E2975FD0AD5BB79E0AA6B1B10374E2C409DABA752022961A441E45 + 044D4E3EA473E7CE3191D75AC6D4903CE7450CA45C2ED1962D5BE8E0C183EC35 + 9B621EE183A9BBB0F73B78CDCC3CA66FBEF986A6A7A7299DCE50985A9DC72731 + 6DDFFE1C1D3B7E9CFAFAFBD78CE9D1D4145D387F9E1E3CF86543300D0F0FD3DB + A74FD3B66D032C9535AA8050BC87482C5758466BC683F8FA21BF52E914A56DB4 + A5405418D0AFBF3EA48F3FFA8855EBEE8A98EAC85340954A99CAA512EDDAB58B + F6EDDB275EE0FD167B9AF5267B7617C4BFD078551806F2133DE09D376EDCA0EF + BFFF9ED2990C834EB764AC24A6C3478ED091A32F27BCD2E69A5AE4E9314C362A + CDBDBCA8E4A8B974F12BBA7CE9D2BA301D3B769C5E3F7E4CC80159A5628996F8 + 552C16A9C8EF97CB464A6BF6EE202CCDE4B5F13DDBDADA28DB96A10CBF402680 + 7E76FE025DB8707E594C75E449F833204800A26D7070D09240D63055F12821AF + 6A13B27F417E49B84B220E8C472119077AFD1A4D4C4C4814421A002CEE18F587 + 62AA56AA74E2E4491A1979A12E8AAA926F6C61D0CCA1E0F1521C0475D17AE7CE + 4F74EEEC59F6F4705598608377CF9CA19D2FBE28F7055185C212E7FE253E1784 + C012FFAC5231050CEE253802DC27A40C9303E2DADBDBB976C8F2392B8402EF0F + B76FD33F3FF8406CD908538C3C21863DA4542AD2014EB4035BB7CA8D6A96B98A + 250B1E044356383937ABA2529C748D21527253902839C91AEBE1E4245DE3449D + C9B4897C34D376C504593A71F2143DBF63C860B2F7AC5A47AA2A367E51034C14 + 18470ADD2B70C6D0EBFD7CFF1E13F889C855AB98DE3DF31E0D8F8CC8BD8B4CD4 + 623E4F0B8B792110DF973908AA5A8136B0131C29CD4EDC260466A9B323C70561 + 4EBE07BEBBEC5420B01126479E6A77B1B844232F8CD0D08E61615FDE13FDD62A + AAEAAA2931982D8BDD05AD670B61AAE7964410EA5FF3DEFDBB74E7A73B0C34EB + B43D294D8AE9D01F8FD09E7DA3B168F1097378AACB182AF4707944FAD7BC7963 + 9CAE7C7DA9254CAFBCFA1AED3F30263F5B6279CC73658DEA3ACF11572E950557 + 124BF2889C3D64894C73F4B54B359FE35796E514EF5DBF7695BEFCE2F33A4C8E + 3C3C38220ECCEF1BDDEF4965CD465B445AD923AF9944A9915C42B6246A4F53B3 + 7973FCDBEBE2AD88C0A42C28A6BEBE7E3AFEE737638674C45512E459D9A48498 + 0BA6204E9EC3630954437F7AEE2C17568F96C534303040A7DE3A2D3F2B717481 + 309057585A92FC56B50EBD1C71316520936E9007DBB359210F4466382A71FCE7 + DF1F72453A19C324E469E22DB1F78CBEB45FF4D7072BA4D952B86C8D24C97785 + FCA29299B6A56F2A8C64540FE4051098612FD3C4AC0FADC5C0A9B7FF4A9DDCC7 + 4598E2125EB18DB0EFE9896146CCC3032BE3BEA4ABB3E258E03EF0938FFF152B + 169298DE39F3BE60F2A3AEB05414995C29DA568A42C8687BB62D167DC0F4E107 + FF881730204FBD098DEED0F0489D3469B4C5F39D270975639FC8507EDE4BBB26 + 342E55F7EEDE91C6D9F72AC5B47DFBF374E0D06157F0C8ED542A3DD29A4966D2 + 304E3A7D12439D6E44F7B876E532B7103F37C4F4DCF33BE8D0E1A3E2A86591D0 + A2445CA9B476E292383399B444202A51D80D0172E5F245FAE5E7FB0E5370F2F4 + FB3568F8D25241AAB82C274B292A28915792A459894A4A8393003BFA6944A292 + A7F75962D944B597CDB68BA68BA12CA63FBDF126757575BBEB6B65D98CB4DA32 + 9802CFB192248689527C7E7E8EFEF7E97F1B627AFD8D93D4D3D3233F0379883C + 10A7D5EE7A0FAD8A4120220F91088F9A9D9DA5CF3E3DEB300979A89A70D31D5E + 912206401567CB5BE4166D0DAA2D7A975653DA3A20C768999CBCCF7D2E5E4027 + 64418CC29890A08FBE764CAEA1875FB9C1991C99ABC0A4B8E49C0A633FF3EF73 + F1F30B54E4886A84296509854C82384D231B7568DA0181699BF7F0BC5F7D7EDE + 610ADE7CFB6F3548411B87E2662E0CC24475A55E2E91D880B86612952450A290 + A26A34798F99E929065594DC870398B60E0CD2CE5D7B63442BD9A611A7BA886B + 15937BE9F70DEEF1E3ED9BF470E2410C53BFC594B6E4694A59AF5C36C22BF9CF + A61ABDD70F8C69D2620A4EFCE5BD5A89CBDE0E96A6F6F69C8912F369EF49E286 + 5ACE48CB1AABC97511CD85429E1659AA32ECD96228C6B473F7A83854B3894723 + 895C0DA6E4CFFC6BC848EFD114FD706B3C86E98517F752DFD6013709D1B4B291 + C4F91855DA6B7672F368F221FD74FB3BC1C4E49DA92D7118F6F46C32E199C80F + CD8ED594C0CD3EEFAE01602C3FB3B38F59CF8DA1806974EC30575C1D313CBF05 + 26BD4E3EBF48E3572FC730ED7D698C3A3ABBC556A135EA46479D8F555F7010D8 + 6871618EBEFBF6AA600A4EBC05F20AD4DDBB395648E854C27F607FB2B15A1075 + 51524B4A5F95661FCF483236862A7095F9B2B418FEDA97FF501B89C97DED55D1 + 90A96B5F7F19C3B477FF416AE3EF653264E52CF65C1B4C9E1EC002D92EB103DD + B87E4530057F66F28A208F238F82643E081C891BB168A96D85BF4412B51B4473 + 1C796DD650C0B4FFD0CBB6470B6DEF18C6AAD88DC2E457CF70229353ABD2325C + BFF2550CD31E8E3C8CAACC586FE519E8461CBADC04F25034DDE4C8032617791D + DCE305185F51642CA90A838D2130465CCD56B16A24321EBFB8301FF3F2DDA307 + C45006836937367225BCD1AAB7A9606D85CD06BB397E35866964E76E311C644B + FAAD0623B48D3C741C07E220DBC8BB3F71D12291A7392FEBCDCDEA96E71392B5 + 26E22892A446DB03A48762607E7E19F9030C9575D116DAF9A890B84E02EB88B3 + 8376E0D02844497EE7C75B314C83CFED903C9CE5E20ED864CDED29469FC97525 + C1B2C4451DF2F0C42FF76DCEB3D5263C1B8351A2206AA463C3DB70D90A6D45E2 + AC24B9EAAC1A7D0DCD2CCB74A21AABECFAB76DE706BDC7CE4AED74C611184D6A + 564BA02FD726DA2A8E383323AD882ACCCFCFD2D4AF0F62987A366DA6AEEE5E26 + AF5D487C9AD1E7471D485B2A14687EEE89D406526D4A9F57642DAD941848D6E5 + 98D07A7AB80E029B11A7063325B6C92DA512379EA94CD45331A61C4B795FFF40 + B49C233D4FDAAE039ABD1EAB25B08E385D2D912D0C654BA459567A34F590F218 + DB7998D01C6FDABC45222FD7D129EDD5D3CA7D9AEBD046E5171724F21ECF4CCB + 6C55FA3C99B0944A2259DAC9AB24B9719623315557E9B5469CD998E3935671F2 + 64A6EF288321DD6E9AC19850D440A69C1AC82A8525CF126896995A23D027CE8C + D73CE264E85E76F8A00690A7D8D4471655CBB4694B9FE4BD0E260F04365B3E5A + CFE12F3D81B8457EA1607A3CFD481C58262CFE6C5356793D43A877AB5CB908F4 + AAD065EEEEAA4A3FDA54962ADE540286C4F51ACD11FBB70D5226DD164967DA8C + 8BCCE2643A92D015F2B29F77ABD630421E482B9B45537CAD92592A175932271A + 624271D796CDF1B98B3A31DCC8E51A2E1FADE7D02178018BBBF37352CC1597F2 + 7C5E88669BFEAA02989595DAC0445FE84955E836C9F883E5C0AD8E3B23297114 + 49931B220B7991774BD4D9AD15DA3B2527F820AA67D39668DA60F1C0F340A069 + 9653764669476F8908D44A575B01142720A9ACC4D988726B9418023F9E96F71B + 61C26773B94E91CEAEEE1E211039B095ED13AD12073CC871206E7E6ED6162B0B + F2AC6E55C15FCFC32F03B05BFFB252E9EF27C4B95EA6A215024AF46F35B7505A + F156E02B5EA54942803E7C72ED0C551664CA44973A53CA11975202EDFBBA9668 + 1CCB80723DA51DB49BDD5E88B49223D0AC9A54DCFB902754938D30C14EB8278A + 06449F1208074CAE57AE8DB88A0412A26D6EF6899C512C496AF1EC54B7920E86 + 7515D8787BBCC233ABCF2947AE91505F9EACB1B42DA89AAD137E4557AD461378 + 3C283C78B9556B1CDD3DBD1653E8F6353A026D1E8C2D3725222FB6BC658B1347 + 5C595705CC73C3603896C3845C049B803090077C2052095F0B811A717058250E + 51572C16041F726BDD4ABA3EA0264854376A5CAD3C85B454DA152ECDAABC46D5 + 9CC9776543A2AD30D53950ADB5B25F04D5154856C29D7CDA8D3942A05385B001 + A6AA5301B33BAE62232E924B1C705E5495AD6042FE832D90F31C811D4C204787 + F67FAD56C0AE9FE3A85E5C0471B3D21620E7C186C8734DF7B0988B985D5152E1 + 705F21050C9133882CA86AD5E935F076B980AC467913145B8AFB930BBBBC84CF + 499F840AB3859D5A452C5BD9A658B717BAD6C1ED304ED935C3C6E4556CAED348 + F3F32F3069330CEF6E0993B513B080C0CECE6EEA84847204AA9AF869461D3656 + 895B8752D55BE0885BE0685B5898B3C4559BDAA9E9BE4D686E9E3F2C3BC3DCCC + 33DEF3C9BE0FCD2FFA60648B836AA229B72327BC8D87C9617B5BB6B524AF9810 + 11B2D705C36AB7D129E5ADD0A7DC70C12D3FE9F0DBF598DE760E5B59E29FCC0E + F5FAABC004B25148C01E202BD7D121F2293D201B5DB6314814DA5C687D5CB188 + C3601B053B81B4044C5E7E7151C884CD50183593E265774CE36110C2881AB2C1 + A524D6152C816E6549142C1E6922791C1990167FC3D16A76270353282BCC19E7 + C94110AF82A3878CCAA8AACBC13A968BD6E0B0291611B81E4CB013BEC7E74122 + 0A0B481DCE266A2219F5651285080A204830CE200DD7C4EFAD64A765FF564156 + 89D16BD83C0029D42853B974555D147A36FABCDE8AFF41620104392EAD72B286 + BF0B504CC0E2E68A6E19CB6E226AA206BAE35BDB19356028A3C1F563123BF159 + 0B3D95F38CED494DA1679C5CE5BBE4154C5AC881FC56ECB4F25F0955AAAE3283 + BECB7E976A2D72ECA61FB6BF12066264E8B65686DA93ADE54862C2C36226ABD7 + 6B6DEA539559AA6EB3DB684C2011BDA33AB72E67352EA26ACED9D1BB0A692D62 + 5AD3DFE795A5542E4A0599DCD3E2361DA5D246EFADF73CEDBF8583EC45ED0B39 + 8345068A5635B4577CDA9840A034F5FCB5EF3C6A271C2605B4D9FD981BF8F779 + 8DC03DAB7F85FA7BC4D432798D003E4B7FFFFD7BC4F47F162E9C177B73E76400 + 00000049454E44AE426082} + ShowHint = True + OnMouseDown = m_btnSpeedMouseDown + end + object m_pSpeedUD: TUpDown + Left = 321 + Top = 141 + Width = 14 + Height = 21 + Hint = #24494#35843#36895#24230 + Min = 50 + Max = 200 + ParentShowHint = False + Position = 50 + ShowHint = True + TabOrder = 0 + OnClick = EventUDOnClicked + end + object m_pEDspeed: TLineEdit + Left = 295 + Top = 140 + Width = 26 + Height = 23 + Hint = #35831#36755#20837'50-200' + OnChange = m_pEDspeedChange + NumberMax = -1 + NumberMin = -1 + TabOrder = 1 + TabStop = False + end + object m_pTBBeat: TSkinTrackBar + Left = 89 + Top = 59 + Width = 193 + Height = 41 + Hint = '0' + Caption = 'm_pTBBeat' + FullRepaint = False + ParentColor = True + TabOrder = 2 + OnChange = SkinTrackBarChange + end + object m_pTBSpeed: TSkinTrackBar + Left = 89 + Top = 131 + Width = 193 + Height = 41 + Hint = '0' + Caption = 'm_pTBSpeed' + FullRepaint = False + ParentColor = True + TabOrder = 3 + OnChange = SkinTrackBarChange + end + end +end diff --git a/SetUpFormUnit.h b/SetUpFormUnit.h new file mode 100644 index 0000000..9d06207 --- /dev/null +++ b/SetUpFormUnit.h @@ -0,0 +1,69 @@ +//--------------------------------------------------------------------------- + +#ifndef SetUpFormUnitH +#define SetUpFormUnitH +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include +#include "SkinTrackBar.h" +#include "GeneralDialogPanel.h" +#include +#include +#include "PNGButton.hpp" +#include "GlobalUnit.h" +#include "MessageFormUnit.h" +#include "LineEdit.h" +#include "UpDownUnit.h" +#include "TextButton.h" +//--------------------------------------------------------------------------- + +class TSetUpForm : public TForm +{ +__published: // IDE-managed Components + TGeneralDialogPanel *m_pBKGPanel; + + TLabel *m_plbBeat; + TLabel *m_pLBBeat44; + TLabel *m_pLBBeat43; + TLabel *m_pLBBeat42; + TLabel *m_pLBBeat86; + TSkinTrackBar *m_pTBSpeed; + TPNGButton *m_pPNGBTPlayTry; + TPNGButton *m_pPNGBTPlaying; + + TLabel *m_plbSpeed; + UpDownUnit::TUpDown *m_pSpeedUD; + TLabel *m_pLBSpeedMin; + TLabel *m_pLBSpeedMax; + TLineEdit *m_pEDspeed; + TPNGButton *m_btnSpeed; + TSkinTrackBar *m_pTBBeat; + + TTextButton *m_pBtnOK; + TTextButton *m_pBtnCancel; + + void __fastcall FormCreate(TObject *Sender); + void __fastcall m_pEDspeedChange(TObject *Sender); + void __fastcall PNGBTPlay(TObject *Sender); +// void __fastcall FormActivate(TObject *Sender); + void __fastcall FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift); + void __fastcall FormKeyUp(TObject *Sender, WORD &Key, TShiftState Shift); + void __fastcall FormClose(TObject *Sender, TCloseAction &Action); + void __fastcall m_btnSpeedMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, + int X, int Y); + void __fastcall SkinTrackBarChange(TObject *Sender); + void __fastcall EventUDOnClicked(TObject *Sender, TUDBtnType Button); + +public: // User declarations + int m_iTS, + m_nTempo; + + __fastcall TSetUpForm(TComponent* Owner); +}; +//--------------------------------------------------------------------------- +extern PACKAGE TSetUpForm *SetUpForm; +//--------------------------------------------------------------------------- +#endif diff --git a/ShowUserInfoPanel.cpp b/ShowUserInfoPanel.cpp new file mode 100644 index 0000000..f713702 --- /dev/null +++ b/ShowUserInfoPanel.cpp @@ -0,0 +1,511 @@ +//--------------------------------------------------------------------------- + +#pragma hdrstop + +#include "ShowUserInfoPanel.h" +#include "GlobalUnit.h" +#include "ImgCopperFormUnit.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) + +#define BORDER_COLOR TColor(RGB(100, 108, 119)) +#define BK_COLOR TColor(RGB(39, 42, 47)) +#define SEPARATOR_COLOR TColor(RGB(152, 154, 156)) +#define FONT_COLOR TColor(RGB(152, 154, 156)) +#define FONT_COLOR_HI TColor(RGB(255, 255, 255)) + +#define VIPHEIGHT 24 +#define SHOWHEIGHT 190 +//--------------------------------------------------------------------------- +const static String LabelStr[] = { + L"", + L"ֵ", + L"˿", + L"", + L"ռδϢ", + L"ע", + L"˿ռ" +}; +const static TPoint FrameRoute[] = { + TPoint(0, 5), + TPoint(225, 5), + TPoint(230, 0), + TPoint(235, 5), + TPoint(250, 5), + TPoint(250, SHOWHEIGHT), + TPoint(0, SHOWHEIGHT) +}; +const static String ResStr[] = { + L"UserInfo_Coin", + L"UserInfo_Pops", + L"UserInfo_Fans", + L"UserInfo_Music", + L"UserInfo_Zone", + L"UserInfo_Icon", +}; +//--------------------------------------------------------------------------- +__fastcall TShowUserInfo::TShowUserInfo(TComponent *Owner) + : TWinControl(Owner) +{ + Parent = Application->MainForm; + + ApplicationEvents = new TApplicationEvents(Application->MainForm); + ApplicationEvents->OnMessage = DoHandleMessage; + +// FBalance = 0; +// FPops = 0; +// FFans = 0; +// FSongs = 0; + + m_ImageList = new TList(); + m_ValueList = new TList(); + + TLabel *Label = new TLabel(this); + //Label->Color = + Label->Transparent = true; + Label->Top = 102;//+VIPHEIGHT; + Label->Left = 50;// + 25; + Label->Width = 100; + Label->WordWrap = false; + Label->AutoSize = false; + Label->Font->Color = FONT_COLOR; + Label->Font->Size = g_szFont10; + Label->Alignment = taCenter; + Label->Caption = ""; + Label->Parent = this; + Label->ShowHint = true; + Label->EllipsisPosition = epEndEllipsis; + Label->OnMouseEnter = DoLabelMouseEnter; + Label->OnMouseLeave = DoLabelMouseLeave; + Label->Cursor = crHandPoint; + Label->OnClick = DoObjectClick; + m_ValueList->Add(Label); + + TPngImage *pngImage = new TPngImage(); + pngImage->LoadFromResourceName(int(HInstance), ResStr[5]); + + m_UserIcon = new TImage(this); + m_UserIcon->Picture->Graphic = pngImage; + m_UserIcon->Width = 64; + m_UserIcon->Height = 64; + m_UserIcon->Left = 68;// + 25; + m_UserIcon->Top = 30; + m_UserIcon->ShowHint = true; + m_UserIcon->Hint = ""; + m_UserIcon->Parent = this; +// m_UserIcon->AutoSize = false; +// m_UserIcon->Center = true; + m_UserIcon->Stretch = true; + m_UserIcon->Cursor = crHandPoint; + m_UserIcon->OnClick = DoObjectClick; + + m_imgVip = new TImage(this); + m_imgVip->Width = 35; + m_imgVip->Height = VIPHEIGHT - 8; + m_imgVip->Top = 30 + 2; //m_UserIcon->Top+m_UserIcon->Height+10; + m_imgVip->Left = 132 + 15;//(Width-m_imgVip->Width)/2; + m_imgVip->Parent = this; + m_imgVip->OnClick = DoObjectClick; + m_imgVip->Stretch = true; + m_imgVip->Cursor = crHandPoint; + m_imgVip->ShowHint = true; + + TPngImage *pImgVip = new TPngImage(); +// m_imgVip->Visible = false; + if(-1==g_infoUser.accountInfo.vipPeriod){ + pImgVip->LoadFromResourceName(int(HInstance), L"vipForever"); + m_imgVip->Hint = L"VIPԱ"; + + }else if( 0==g_infoUser.accountInfo.vipPeriod ) { + pImgVip->LoadFromResourceName(int(HInstance), L"vipNone"); + m_imgVip->Hint = L"ΪVIPԱ\nΪVIP֮µ¼"; + }else { + pImgVip->LoadFromResourceName(int(HInstance), L"vipTimer"); + String strDay = L"VIPȨʣ"; + int nDay = g_infoUser.accountInfo.vipPeriod/(60*60*24); + int nAdd = g_infoUser.accountInfo.vipPeriod%(60*60*24)==0?0:1; + strDay += IntToStr(nDay+nAdd); + strDay += L"\nڣ֮µ¼"; + m_imgVip->Hint = strDay; + } + m_imgVip->Picture->Assign(pImgVip); + SAFE_DELETE(pImgVip) + +// for(int i = 0; i < 4; i++) + { + TPngImage *png = new TPngImage(); + png->LoadFromResourceName(int(HInstance), ResStr[0]); + + TImage *Image = new TImage(this); + Image->Picture->Graphic = png; + Image->Top = 60+16;//125+VIPHEIGHT; + Image->Left = 132 + 10;//23 + i * 60; + Image->Width = 20; + Image->Height = 16; + Image->Parent = this; + Image->Stretch = true; + Image->ShowHint = true; + Image->Hint = "\nֵһ֮µ¼"; + Image->Cursor = crHandPoint; + Image->OnClick = DoObjectClick; + m_ImageList->Add(Image); + + Label = new TLabel(this); + Label->Transparent = true; + Label->Top = 60 +16;//155+VIPHEIGHT; + Label->Left = 132 + 30 + 2; //5 + i * 60; + Label->Width = 60; + Label->WordWrap = false; + Label->AutoSize = false; + Label->EllipsisPosition = epEndEllipsis; + Label->Font->Color = clYellow; + Label->Font->Name = g_strTxtFontName; + Label->Font->Size = g_szFont11; + Label->Alignment = taLeftJustify; + Label->Caption = IntToStr(g_infoUser.accountInfo.balance); + Label->Parent = this; + Label->OnMouseEnter = DoLabelMouseEnter; + Label->OnMouseLeave = DoLabelMouseLeave; + Label->Cursor = crHandPoint; + Label->OnClick = DoObjectClick; + Label->Hint = "\nֵһ֮µ¼"; + Label->ShowHint = true; + m_ValueList->Add(Label); + } + + m_LogoutBtn = new TTextButton(this); + m_LogoutBtn->Width = 60; + m_LogoutBtn->Text = LabelStr[5]; + m_LogoutBtn->Top = 125+VIPHEIGHT; + m_LogoutBtn->Left = 95;// + 25; + m_LogoutBtn->Parent = this; + m_LogoutBtn->ShowHint = true; + m_LogoutBtn->Hint = "˳¼"; + m_LogoutBtn->FontSize = g_szFont9; + m_LogoutBtn->OnClick = DoObjectClick; + + +// m_ZoneBtn = new TTextButton(this); +// m_ZoneBtn->Width = 60; +// m_ZoneBtn->Text = LabelStr[6]; +// m_ZoneBtn->Top = 190+VIPHEIGHT; +// m_ZoneBtn->Left = 105 + 25; +// m_ZoneBtn->Parent = this; +// m_ZoneBtn->FontSize = g_szFont9; +// m_ZoneBtn->OnClick = DoButtonClick; + + SetTransparent( this ); +} +//--------------------------------------------------------------------------- +__fastcall TShowUserInfo::~TShowUserInfo() +{ + if(m_ImageList){ + m_ImageList->Clear(); + delete m_ImageList; + m_ImageList = NULL; + } + if(m_ValueList){ + m_ValueList->Clear(); + delete m_ValueList; + m_ValueList = NULL; + } + if(m_LogoutBtn){ + delete m_LogoutBtn; + m_LogoutBtn = NULL; + } +// if(m_ZoneBtn){ +// delete m_ZoneBtn; +// m_ZoneBtn = NULL; +// } + if(ApplicationEvents){ + delete ApplicationEvents; + ApplicationEvents = NULL; + } + + if(m_imgVip){ + delete m_imgVip; + m_imgVip = NULL; + } + +} +//--------------------------------------------------------------------------- +void __fastcall TShowUserInfo::CreateParams(TCreateParams &Params) +{ + TWinControl::CreateParams(Params); + + Params.Style = 0; + Params.Style = WS_POPUP; +} +//--------------------------------------------------------------------------- +void __fastcall TShowUserInfo::CreateWnd() +{ + Width = 250; + Height = SHOWHEIGHT; + + TWinControl::CreateWnd(); + + HRGN hRgn; + hRgn = CreatePolygonRgn(FrameRoute,7, ALTERNATE); + SetWindowRgn(Handle, hRgn, true); + DeleteObject(hRgn); +} +//--------------------------------------------------------------------------- +void __fastcall TShowUserInfo::DoObjectClick(TObject *Sender) +{ + if(Sender == m_LogoutBtn) + m_ModalResult = 1; + else if(Sender == m_UserIcon || Sender == m_ValueList->Items[0]) + m_ModalResult = 2; + else if(Sender == m_imgVip ) + m_ModalResult = 3; + else if(Sender == m_ValueList->Items[1] || Sender==m_ImageList->Items[0]) + m_ModalResult = 4; + + Hide(); +} +//--------------------------------------------------------------------------- +void __fastcall TShowUserInfo::DoHandleMessage(MSG &Msg, bool &Handled) +{ + if(Msg.message == WM_NCLBUTTONDOWN || Msg.message == WM_NCRBUTTONDOWN) + { + m_ModalResult = -1; + Hide(); + } + if(Msg.message == WM_LBUTTONDOWN || Msg.message == WM_RBUTTONDOWN) + { + if(Msg.hwnd != Handle) + { + m_ModalResult = -1; + } + } +} +//--------------------------------------------------------------------------- +void __fastcall TShowUserInfo::DoLabelMouseEnter(TObject *Sender) +{ + ((TLabel *)Sender)->Font->Color = FONT_COLOR_HI; + ((TLabel *)Sender)->Font->Style = TFontStyles()<Font->Color = FONT_COLOR; + ((TLabel *)Sender)->Font->Style = TFontStyles(); +} +//--------------------------------------------------------------------------- + +void __fastcall TShowUserInfo::SetUserName(String Value) +{ + if(FUserName != Value) { + FUserName = Value; + ((TLabel *)m_ValueList->Items[0])->Caption = Value; + + String strHint = "û"; + strHint += g_infoUser.strUserName; + strHint += "\n ƣ"; + strHint += g_infoUser.strNickName; + strHint += "\n"; + strHint += IntToStr(g_infoUser.accountInfo.balance); + strHint += "\n\n鿴"; + m_UserIcon->Hint = strHint; + + ((TLabel *)m_ValueList->Items[0])->Hint = strHint; + } +} +//--------------------------------------------------------------------------- + +//void __fastcall TShowUserInfo::SetBalance(int Value) +//{ +// if(FBalance != Value) { +// FBalance = Value; +// ((TLabel *)m_ValueList->Items[1])->Caption = IntToStr(Value); +// } +//} +////--------------------------------------------------------------------------- +//void __fastcall TShowUserInfo::SetPops(int Value) +//{ +// if(FPops != Value) { +// FPops = Value; +// ((TLabel *)m_ValueList->Items[2])->Caption = IntToStr(Value); +// } +//} +////--------------------------------------------------------------------------- +//void __fastcall TShowUserInfo::SetFans(int Value) +//{ +// if(FFans != Value) { +// FFans = Value; +// ((TLabel *)m_ValueList->Items[3])->Caption = IntToStr(Value); +// } +//} +////--------------------------------------------------------------------------- +//void __fastcall TShowUserInfo::SetSongs(int Value) +//{ +// if(FSongs != Value) { +// FSongs = Value; +// ((TLabel *)m_ValueList->Items[4])->Caption = IntToStr(Value); +// } +//} +////--------------------------------------------------------------------------- +//void __fastcall TShowUserInfo::SetZones(int Value) +//{ +// if(FZones != Value){ +// FZones = Value; +// ((TLabel *)m_ValueList->Items[5])->Caption = IntToStr(Value); +// } +//} +////--------------------------------------------------------------------------- +int __fastcall TShowUserInfo::ShowModal() +{ + Application->ModalStarted(); + + m_bakActiveWnd = GetActiveWindow(); + + TWinControl::Show(); + + String nickName = String(g_infoUser.strNickName); + + if(nickName.IsEmpty()) { + UserName = String(g_infoUser.strUserName);//L"ID:" + IntToStr(g_infoUser.accountInfo.ID); + } + else { + UserName = nickName; + } + +// Balance = g_infoUser.accountInfo.balance; +// Pops = g_infoUser.accountInfo.pops; +// Fans = g_infoUser.accountInfo.fans; +// Songs = g_infoUser.accountInfo.songs; +// Zones = f_CS_GetNewNoticeNum( g_infoUser.accountInfo.ID ); + + String strHeaderPath = g_strUserPath.c_str(); + strHeaderPath += L"header\\"; + + String strIconFile = strHeaderPath + g_infoUser.strIconFile; + if( FileExists( strIconFile ) ) { + GetPic(strIconFile, true); + m_UserIcon->Picture->LoadFromFile( strIconFile ); + } + + m_ModalResult = 0; + + m_IsActive = false; + SendMessage(Handle, WM_ACTIVATE, WA_ACTIVE, 0); + m_IsActive = true; + + while(m_ModalResult == 0) { + Application->HandleMessage(); + + if(Application->Terminated) + m_ModalResult = -1; + } + + TWinControl::Hide(); + + SetActiveWindow(m_bakActiveWnd); + + Application->ModalFinished(); + + return m_ModalResult; +} +//--------------------------------------------------------------------------- +void __fastcall TShowUserInfo::WMEraseBkgnd(TWMEraseBkgnd &Message) +{ + TCanvas *canvas = new TCanvas(); + canvas->Handle = Message.DC; + /* Ʊ */ + canvas->Brush->Color = BK_COLOR; + canvas->FillRect(GetClientRect()); + /* Ʊ߿ */ + canvas->Pen->Color = BORDER_COLOR; + canvas->MoveTo(FrameRoute[0].X, FrameRoute[0].Y); + canvas->LineTo(FrameRoute[1].X, FrameRoute[1].Y); + canvas->MoveTo(FrameRoute[1].X, FrameRoute[1].Y); + canvas->LineTo(FrameRoute[2].X, FrameRoute[2].Y); + canvas->MoveTo(FrameRoute[2].X, FrameRoute[2].Y); + canvas->LineTo(FrameRoute[3].X, FrameRoute[3].Y); + canvas->MoveTo(FrameRoute[3].X, FrameRoute[3].Y); + canvas->LineTo(FrameRoute[4].X-1, FrameRoute[4].Y); + canvas->MoveTo(FrameRoute[4].X-1, FrameRoute[4].Y); + canvas->LineTo(FrameRoute[5].X-1, FrameRoute[5].Y-1); + canvas->MoveTo(FrameRoute[5].X-1, FrameRoute[5].Y-1); + canvas->LineTo(FrameRoute[6].X, FrameRoute[6].Y-1); + canvas->MoveTo(FrameRoute[6].X, FrameRoute[6].Y-1); + canvas->LineTo(FrameRoute[0].X, FrameRoute[0].Y); + /* Ʒָ */ + canvas->Pen->Color = SEPARATOR_COLOR; + canvas->MoveTo(10, 108+VIPHEIGHT); + canvas->LineTo(240, 108+VIPHEIGHT); + + delete canvas; +} +//--------------------------------------------------------------------------- +void __fastcall TShowUserInfo::WMKillFocus(TMessage &Message) +{ + if(m_IsActive && m_ModalResult == 0) + m_ModalResult = -1; +} +//--------------------------------------------------------------------------- +void __fastcall TShowUserInfo::WMPaint(TWMPaint &Message) +{ + PaintHandler(Message); +} +//--------------------------------------------------------------------------- +//void __fastcall TShowUserInfo::UserIconClick(TObject *Sender) +//{ +// m_ModalResult = 2; +// Hide(); +// +// String strHeaderPath = g_strUserPath.c_str(); +// strHeaderPath += L"header\\"; +// +// String strIconFile = strHeaderPath + g_infoUser.strIconFile; +// if( !FileExists( strIconFile ) ) +// strIconFile = strHeaderPath + L"default.jpg"; +// GetPic(strIconFile, true); +// +// TPicture *pPic = new TPicture(); +// pPic->LoadFromFile( strIconFile ); +// +// TImgCopperForm *pTImgCopperForm = new TImgCopperForm(this, TRect(0, 0, 90, 90), pPic); +// pTImgCopperForm->Caption = L"༭ͷ"; +// pTImgCopperForm->Width = 260; +// pTImgCopperForm->Height = 300; +// +// if( mrOk==pTImgCopperForm->ShowModal() ) { +// +// bool bUploadUsrIcon = false; +// if( NULL==g_pTThreadHttpPostUsrIcon ) { +// +// bUploadUsrIcon = true; +// +// }else if( !g_pTThreadHttpPostUsrIcon->Started || +// (g_pTThreadHttpPostUsrIcon->Started && g_pTThreadHttpPostUsrIcon->Finished) ) +// { +// bUploadUsrIcon = true; +// } +// +// if( bUploadUsrIcon ){ +// +// SAFE_DELETE(g_pTThreadHttpPostUsrIcon) +// g_pTThreadHttpPostUsrIcon +// = new TThreadHttpPostUsrIcon(true, this, +// pTImgCopperForm->m_strCopperPath); +// g_pTThreadHttpPostUsrIcon->Priority = tpIdle; +// g_pTThreadHttpPostUsrIcon->Start(); +// } +// } +// +// SAFE_DELETE(pTImgCopperForm); +// SAFE_DELETE(pPic); +//} +//--------------------------------------------------------------------------- + +//void __fastcall TShowUserInfo::VIPClick(TObject *Sender) +//{ +// char strURL[256]; +// f_CS_GetWebPageURL( URL_VIPMEMBER, strURL ); +// String urlVIP = strURL; +// if( urlVIP.Length() ) { +// ShellExecute(Handle, NULL, urlVIP.c_str(), NULL, NULL, SW_SHOWNORMAL); +// } +//} +////--------------------------------------------------------------------------- diff --git a/ShowUserInfoPanel.h b/ShowUserInfoPanel.h new file mode 100644 index 0000000..d613bba --- /dev/null +++ b/ShowUserInfoPanel.h @@ -0,0 +1,84 @@ +//--------------------------------------------------------------------------- + +#ifndef ShowUserInfoPanelH +#define ShowUserInfoPanelH + +#include +#include +#include +#include "TextButton.h" +//--------------------------------------------------------------------------- +class TShowUserInfo : public TWinControl +{ +private: + String FUserName; + +// int FBalance, +// FPops, +// FFans, +// FSongs, +// FZones; + + TList *m_ImageList, + *m_ValueList; + + TImage *m_UserIcon; +// void __fastcall UserIconClick(TObject *Sender); + TImage *m_imgVip; +// void __fastcall VIPClick(TObject *Sender); + + TTextButton *m_LogoutBtn; +// *m_ZoneBtn; + + HWND m_bakActiveWnd; + + int m_ModalResult; + + bool m_IsActive; + + TApplicationEvents *ApplicationEvents; + +// void __fastcall DoButtonClick(TObject *Sender); + void __fastcall DoHandleMessage(MSG &Msg, bool &Handled); + void __fastcall DoLabelMouseEnter(TObject *Sender); + void __fastcall DoLabelMouseLeave(TObject *Sender); + void __fastcall DoObjectClick(TObject *Sender); + + void __fastcall SetUserName(String Value); +// void __fastcall SetBalance(int Value); +// void __fastcall SetPops(int Value); +// void __fastcall SetFans(int Value); +// void __fastcall SetSongs(int Value); +// void __fastcall SetZones(int Value); + + MESSAGE void __fastcall WMEraseBkgnd(TWMEraseBkgnd &Message); + MESSAGE void __fastcall WMKillFocus(TMessage &Message); + MESSAGE void __fastcall WMPaint(TWMPaint &Message); + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(WM_ERASEBKGND, TWMEraseBkgnd, WMEraseBkgnd) + MESSAGE_HANDLER(WM_KILLFOCUS, TMessage, WMKillFocus) + MESSAGE_HANDLER(WM_PAINT, TWMPaint, WMPaint) + END_MESSAGE_MAP(TWinControl) + +protected: + virtual void __fastcall CreateParams(TCreateParams &Params); + virtual void __fastcall CreateWnd(); + +public: + __fastcall TShowUserInfo(TComponent *Owner); + __fastcall ~TShowUserInfo(); + + int __fastcall ShowModal(); + +__published: + __property String UserName = {read = FUserName, write = SetUserName}; +// __property int Balance = {read = FBalance, write = SetBalance}; +// __property int Pops = {read = FPops, write = SetPops}; +// __property int Fans = {read = FFans, write = SetFans}; +// __property int Songs = {read = FSongs, write = SetSongs}; +// __property int Zones = {read = FZones, write = SetZones}; +}; +//--------------------------------------------------------------------------- +#endif +//--------------------------------------------------------------------------- diff --git a/SkinHintWindow.cpp b/SkinHintWindow.cpp new file mode 100644 index 0000000..78c70c1 --- /dev/null +++ b/SkinHintWindow.cpp @@ -0,0 +1,108 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop + +#include "SkinHintWindow.h" + +#define CLR_BORDER RGB( 100, 108, 119 ) +#define CLR_BKGRND_NOR RGB( 39, 42, 47 ) +//--------------------------------------------------------------------------- +#pragma package(smart_init) +//--------------------------------------------------------------------------- +__fastcall TSkinHintWindow::TSkinHintWindow(TComponent* Owner) + : THintWindow(Owner) +{ +} +//--------------------------------------------------------------------------- + +__fastcall TSkinHintWindow::~TSkinHintWindow() +{ +} +//--------------------------------------------------------------------------- + +void __fastcall TSkinHintWindow::Paint(void) +{ + TRect rect = ClientRect; + // Ʊ + Canvas->Brush->Color = CLR_BKGRND_NOR; + Canvas->FillRect(rect); + + // Ʊ߿ + Canvas->Pen->Color = CLR_BORDER; + Canvas->Rectangle(rect); + + // + Canvas->Brush->Style = bsClear; + rect.left += 5; + rect.top += 3; + + DrawText( Canvas->Handle, Caption.c_str(), -1, (RECT*)&rect, DT_LEFT|DT_NOPREFIX|DT_WORDBREAK); +} +//--------------------------------------------------------------------------- + +void __fastcall TSkinHintWindow::NCPaint(HDC hdc) +{ + //Invalidate(); +} +//--------------------------------------------------------------------------- + +void __fastcall TSkinHintWindow::CreateParams(TCreateParams &Params) +{ + THintWindow::CreateParams(Params); + // ȥHintڵı߿ + Params.Style = Params.Style & ~WS_BORDER; +} +//--------------------------------------------------------------------------- + +void __fastcall TSkinHintWindow::ActivateHint(const TRect &Rect, const String AHint) +{ + FActivating = true; + try + { + Caption = AHint; + TRect r = Rect; + r.Left -= 2; + r.Right += 2; + r.Top -= 2; + r.Bottom += 4; + + // + UpdateBoundsRect(r); + // HintڴĻԵʱĵ + if(r.Top + Height > Screen->DesktopHeight) + r.Top = Screen->DesktopHeight - Height; + if(r.Left + Width > Screen->DesktopWidth) + r.Left = Screen->DesktopWidth - Width; + if(r.Left < Screen->DesktopLeft) + r.Left = Screen->DesktopLeft; + if(r.Bottom < Screen->DesktopTop) + r.Bottom = Screen->DesktopTop; + + // һ + HRGN hRgn = CreateRectRgn(0, 0, r.Width(), r.Height()); + //HRGN hRgn = CreateRoundRectRgn(0, 0, r.Width(), r.Height(), 4, 4); + // ָĴ״ + SetWindowRgn(Handle, hRgn, true); + DeleteObject( hRgn ); + + // ı䴰ڵλ,Z Order,һЩ + SetWindowPos(Handle, HWND_TOPMOST, r.Left, r.Top, r.Width(), + r.Height(), SWP_SHOWWINDOW | SWP_NOACTIVATE); + // ػ + Invalidate(); + } + __finally + { + // FActivating = false; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TSkinHintWindow::ShowHintWindow( const TPoint &Point, const String Ahint ) +{ + TRect rHint = CalcHintRect( 300, Ahint, NULL ); + OffsetRect( rHint, Point.x, Point.y ); + ActivateHint( rHint, Ahint ); +} +//--------------------------------------------------------------------------- + diff --git a/SkinHintWindow.h b/SkinHintWindow.h new file mode 100644 index 0000000..0cd7869 --- /dev/null +++ b/SkinHintWindow.h @@ -0,0 +1,22 @@ +//--------------------------------------------------------------------------- + +#ifndef SkinHintWindowH +#define SkinHintWindowH + +//--------------------------------------------------------------------------- + +class TSkinHintWindow : public THintWindow +{ + bool FActivating; + + void __fastcall Paint(void); + virtual void __fastcall NCPaint(HDC hdc); + virtual void __fastcall CreateParams(TCreateParams &Params); + virtual void __fastcall ActivateHint(const TRect &Rect, const String AHint); +public: + __fastcall TSkinHintWindow(TComponent* Owner); + __fastcall ~TSkinHintWindow(); + void __fastcall ShowHintWindow( const TPoint &Point, const String Ahint ); +}; + +#endif diff --git a/SkinScrollBarUnit.cpp b/SkinScrollBarUnit.cpp new file mode 100644 index 0000000..4f922bf --- /dev/null +++ b/SkinScrollBarUnit.cpp @@ -0,0 +1,906 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop + +#include +#include "SkinScrollBarUnit.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) + +//add by tj 2013/11/21 +#define PIXEL_EXTERNAL_FRAME 1 +#define PIXEL_EX2INTERNAL 1 +#define PIXEL_INTERNAL_FARME 1 +#define PIXEL_INTERNAL_BOUND 1 +#define PIXEL_INTERNAL_LINE 6 //add by tj 2013/12/10 + + +static const COLORREF + RGB_EXTERNAL_FRAME = RGB(29,31,35), + RGB_EXTERNAL_NOR = RGB(60,66,72), + RGB_EXTERNAL_HIG = RGB(74,80,88), + RGB_INTERNAL_NOR = RGB(39,42,47), //272a2f + RGB_INTERNAL_HIG = RGB(74,80,88), //4a5058 + RGB_INTERNAL_PUSH = RGB(50,54,60), //32363c + RGB_INTERNAL_LINE_NOR = RGB(25,27,30), //191b1e + RGB_INTERNAL_LINE_HIG = RGB(58,63,69), //3a3f45 + RGB_INTERNAL_LINE_PUSH = RGB(38,41,45), //26292d + RGB_INTERNAL_LINE_NOR_TRANS[6] ={ RGB(44,47,53), //2c2f35 + RGB(47,51,57), + RGB(52,55,62), + RGB(56,59,67), + RGB(57,59,69), + RGB(59,61,71) + }, + RGB_INTERNAL_LINE_HIG_TRANS[6] ={ RGB(79,86,94),//4f565e + RGB(83,90,99), + RGB(87,94,104), + RGB(91,99,109), + RGB(92,100,111), + RGB(94,104,115), + }, + RGB_INTERNAL_LINE_PUSH_TRANS[6] ={ RGB(55,59,66), //373b42 + RGB(60,65,72), + RGB(64,69,77), + RGB(69,75,83), + RGB(70,77,86), + RGB(72,79,88) + }, + RGB_INTERNAL_FRAME_NOR = RGB(34,36,41), + RGB_INTERNAL_ROUND_BKG_N_NOR = RGB(41,44,49), + RGB_INTERNAL_ROUND_BKG_N_HIG = RGB(51,55,61), + RGB_INTERNAL_ROUND_BKG_H_NOR = RGB(43,46,52), + RGB_INTERNAL_ROUND_BKG_H_HIG = RGB(56,61,67); +//--------------------------------------------------------------------------- +TBitmap *u_pPicLineUp = NULL, + *u_pPicLineDown = NULL, + *u_pPicLineLeft = NULL, + *u_pPicLineRight = NULL; + +int u_nPicRef = 0; + +void InitialPictures() +{ + if( u_nPicRef==0 ){ + u_pPicLineUp = new TBitmap(); + u_pPicLineUp->LoadFromResourceName(int(HInstance), L"SBLineUp"); + u_pPicLineDown = new TBitmap(); + u_pPicLineDown->LoadFromResourceName(int(HInstance), L"SBLineDown"); + u_pPicLineLeft = new TBitmap(); + u_pPicLineLeft->LoadFromResourceName(int(HInstance), L"SBLineLeft"); + u_pPicLineRight = new TBitmap(); + u_pPicLineRight->LoadFromResourceName(int(HInstance), L"SBLineRight"); + } + + u_nPicRef++; +} + +void ReleasePictures() +{ + u_nPicRef--; + + if( u_nPicRef==0 ){ + delete u_pPicLineUp; + delete u_pPicLineDown; + delete u_pPicLineLeft; + delete u_pPicLineRight; + } +} +//--------------------------------------------------------------------------- + +__fastcall TSkinScrollBar::TSkinScrollBar(TComponent* AOwner, bool bVertical) + : TScrollBar(AOwner) +{ + Visible = false; + ParentCtl3D = false; //add by tj 2013/11/14 + InitialPictures(); + + Kind = bVertical ? sbVertical : sbHorizontal; + + if( bVertical ) + Width = u_pPicLineUp->Height;//add by tj 2013/11/19 + else + Height = u_pPicLineLeft->Width; + + DoubleBuffered = TRUE; + + m_nThumbSize = 0; + m_nThumbPos = bVertical ? Width : Height; + m_nPreThumbPos = bVertical ? Width : Height; +// m_nTileHeight = 18; //add by tj 2013/11/14 + + m_nTrackPos = m_nMax = m_nMin = m_nPos = m_nPage = 0; + m_iClicked = -1; + m_iHitPrev = -1; + + m_bAction = m_bPause = m_bNotify = m_bDrag = m_bTrace = false; + + m_pCanvas = new TControlCanvas(); + m_pCanvas->Control = this; + Ctl3D = false; + + //곤ڰµļʱ + m_pTimer = new TTimer(this); + m_pTimer->Enabled = false; + m_pTimer->OnTimer = TimerProc; + + OnMouseEnter = CMMouseEnter; + OnMouseLeave = CMMouseLeave; +} +//--------------------------------------------------------------------------- + +__fastcall TSkinScrollBar::~TSkinScrollBar() +{ + if( m_pCanvas ){ + delete m_pCanvas; + m_pCanvas = NULL; + } + + if( m_pTimer ){ + delete m_pTimer; + m_pTimer = NULL; + } + + ReleasePictures(); +} +//--------------------------------------------------------------------------- + +int TSkinScrollBar::HitTest( int X, int Y ) +{ + if( Kind==sbVertical ){ + if( Y<0 ) + return -1; + else if( YWidth/3 ) + m_pCanvas->Draw( x, y, pPic ); + else{ + TRect tmpRect; + + if( bVertical ){ + tmpRect.Left = x; + tmpRect.Right = tmpRect.Left + wid*3; + tmpRect.Top = y; + tmpRect.Bottom = tmpRect.top + wid; + } + else{ + tmpRect.Left = x; + tmpRect.Right = tmpRect.Left + wid; + tmpRect.Top = y; + tmpRect.Bottom = tmpRect.top + wid*3; + } + + m_pCanvas->StretchDraw( tmpRect, pPic); + } +} +//--------------------------------------------------------------------------- + +void TSkinScrollBar::DrawThumb( int iState, bool bEraseBk, int iPageUD ) +{ + bool bVertical = Kind==sbVertical; + + TRect rectDraw; + int wid = bVertical ? Width : Height, + len = bVertical ? Height : Width; + + LONG &rFixBegin = bVertical ? rectDraw.Left : rectDraw.Top, + &rFixEnd = bVertical ? rectDraw.Right : rectDraw.Bottom, + &rVarBegin = bVertical ? rectDraw.Top : rectDraw.Left, + &rVarEnd = bVertical ? rectDraw.Bottom : rectDraw.Right; + + //=========================== + // + + rFixBegin = PIXEL_EXTERNAL_FRAME; + rFixEnd = wid - rFixBegin;//rectDraw.Left; + + // / +// if(iPageUD == SB_PAGEUP || iState== STATE_PUSH ){ + m_pCanvas->Brush->Color = RGB_EXTERNAL_HIG; + m_pCanvas->Pen->Color = RGB_EXTERNAL_HIG; +// }else { +// m_pCanvas->Brush->Color = RGB_EXTERNAL_NOR; +// m_pCanvas->Pen->Color = RGB_EXTERNAL_NOR; +// } + + if( bEraseBk ) //ػ + rVarBegin = wid; + else if( m_nPreThumbPosRectangle(rectDraw.Left, rectDraw.Top, + rectDraw.Right, rectDraw.Bottom); + } + + // /ҹ +// if( iPageUD==SB_PAGEDOWN || iState==STATE_PUSH ){ + m_pCanvas->Brush->Color = RGB_EXTERNAL_HIG; + m_pCanvas->Pen->Color = RGB_EXTERNAL_HIG; +// }else { +// m_pCanvas->Brush->Color = RGB_EXTERNAL_NOR; +// m_pCanvas->Pen->Color = RGB_EXTERNAL_NOR; +// } + + rVarBegin = m_nThumbPos + m_nThumbSize; + + if( bEraseBk ) + rVarEnd = len - wid; + else if( m_nPreThumbPos>m_nThumbPos ){ ///Ϊǰײֵ + rVarEnd = m_nThumbSize + m_nPreThumbPos; + if( rVarEnd > len-wid ) + rVarEnd = len - wid; + }else + rVarEnd = len - wid; ///ңΪǰײֵ + + if( rVarEnd > rVarBegin ){ + m_pCanvas->Rectangle(rectDraw.Left, rectDraw.Top, + rectDraw.Right, rectDraw.Bottom); + } + + //=========================== + // + if( m_nThumbSize>0 ){ + //=========================== + // / + if( iState==STATE_NORMAL || iState == STATE_HIGHLIGHT ){ + m_pCanvas->Brush->Color = RGB_EXTERNAL_NOR; + m_pCanvas->Pen->Color = RGB_EXTERNAL_NOR; + }else if( iState== STATE_PUSH ){ + m_pCanvas->Brush->Color = RGB_EXTERNAL_HIG; + m_pCanvas->Pen->Color = RGB_EXTERNAL_HIG; + } + + rVarBegin = m_nThumbPos; + rVarEnd = m_nThumbPos + m_nThumbSize; + + /// + rFixBegin = PIXEL_EXTERNAL_FRAME; + rFixEnd = rFixBegin + PIXEL_EX2INTERNAL; + m_pCanvas->Rectangle(rectDraw.Left, rectDraw.Top, + rectDraw.Right, rectDraw.Bottom); + /// + rFixBegin = wid - PIXEL_EXTERNAL_FRAME-PIXEL_EX2INTERNAL; + rFixEnd = wid - PIXEL_EXTERNAL_FRAME; + m_pCanvas->Rectangle(rectDraw.Left, rectDraw.Top, + rectDraw.Right, rectDraw.Bottom); + + //=========================== + // + if(iState == STATE_NORMAL){ + m_pCanvas->Brush->Color = RGB_INTERNAL_NOR; + m_pCanvas->Pen->Color = RGB_INTERNAL_NOR; + }else if(iState == STATE_HIGHLIGHT){ + m_pCanvas->Brush->Color = RGB_INTERNAL_NOR;//HIG; + m_pCanvas->Pen->Color = RGB_INTERNAL_NOR;//HIG; + }else if(iState == STATE_PUSH){ + m_pCanvas->Brush->Color = RGB_INTERNAL_PUSH; + m_pCanvas->Pen->Color = RGB_INTERNAL_PUSH; + } + + rFixBegin = PIXEL_EXTERNAL_FRAME+PIXEL_EX2INTERNAL+PIXEL_INTERNAL_FARME; + rFixEnd = wid - rFixBegin; + rVarBegin = m_nThumbPos + PIXEL_INTERNAL_BOUND; + rVarEnd = m_nThumbPos + m_nThumbSize - PIXEL_INTERNAL_BOUND; + m_pCanvas->Rectangle(rectDraw.Left, rectDraw.Top, + rectDraw.Right, rectDraw.Bottom); + + //add by tj 2013/12/10 + // / + //=========================== + // + COLORREF colLine, *colLineTrans, *colLineLight; + if(iState == STATE_NORMAL){ + colLine = RGB_INTERNAL_LINE_NOR; + colLineTrans = (COLORREF *)RGB_INTERNAL_LINE_NOR_TRANS; + }else{// if(iState == STATE_HIGHLIGHT){ + colLine = RGB_INTERNAL_LINE_HIG; + colLineTrans = (COLORREF *)RGB_INTERNAL_LINE_HIG_TRANS; +// }else if(iState == STATE_PUSH){ +// colLine = RGB_INTERNAL_LINE_PUSH; +// colLineTrans = (COLORREF *)RGB_INTERNAL_LINE_PUSH_TRANS; + } + + int X = rFixBegin + (wid - 2*rFixBegin - PIXEL_INTERNAL_LINE) / 2, + Y = m_nThumbPos + m_nThumbSize/2 - 3; + + for(int i=0; i<3; i++){ + int iPixlX = bVertical ? X : Y+1, + iPixlY = bVertical ? Y+1 : X; + + for(int j=0; j<6; j++){ + m_pCanvas->Pixels[iPixlX][iPixlY] = colLineTrans[j]; + + if( bVertical ) + iPixlX++; + else + iPixlY++; + } + + iPixlX = bVertical ? X : Y; + iPixlY = bVertical ? Y : X; + m_pCanvas->Pen->Color = colLine; + m_pCanvas->MoveTo(iPixlX,iPixlY); + + if( bVertical ) + iPixlX = wid - iPixlX; + else + iPixlY = wid - iPixlY; + + m_pCanvas->LineTo(iPixlX,iPixlY); + + Y += 3; + } + + //=========================== + // ߿ + m_pCanvas->Brush->Color = RGB_INTERNAL_FRAME_NOR; + m_pCanvas->Pen->Color = RGB_INTERNAL_FRAME_NOR; + + rFixBegin = PIXEL_EXTERNAL_FRAME + PIXEL_EX2INTERNAL; + rFixEnd = wid - (PIXEL_EXTERNAL_FRAME+PIXEL_EX2INTERNAL); + rVarBegin = m_nThumbPos; + rVarEnd = m_nThumbPos + m_nThumbSize; + m_pCanvas->FrameRect( rectDraw ); +/* ///ϱ߿ + rFixBegin = PIXEL_EXTERNAL_FRAME + PIXEL_EX2INTERNAL; + rFixEnd = PIXEL_EXTERNAL_FRAME + PIXEL_EX2INTERNAL + PIXEL_INTERNAL_FARME; + m_pCanvas->Rectangle(rectDraw.Left, rectDraw.Top, + rectDraw.Right, rectDraw.Bottom); + ///±߿ + rFixBegin = wid - (PIXEL_EXTERNAL_FRAME+PIXEL_EX2INTERNAL+PIXEL_INTERNAL_FARME); + rFixEnd = wid - (PIXEL_EXTERNAL_FRAME+PIXEL_EX2INTERNAL); + m_pCanvas->Rectangle(rectDraw.Left, rectDraw.Top, + rectDraw.Right, rectDraw.Bottom); + + ///߿ + rFixBegin = PIXEL_EXTERNAL_FRAME + PIXEL_EX2INTERNAL + PIXEL_INTERNAL_FARME; + rFixEnd = wid - rFixBegin; + rVarBegin = m_nThumbPos; + rVarEnd = m_nThumbPos + PIXEL_INTERNAL_BOUND; + m_pCanvas->Rectangle(rectDraw.Left, rectDraw.Top, + rectDraw.Right, rectDraw.Bottom); + + ///ұ߿ + rVarBegin = m_nThumbPos + m_nThumbSize-PIXEL_INTERNAL_BOUND; + rVarEnd = m_nThumbPos + m_nThumbSize; + m_pCanvas->Rectangle(rectDraw.Left, rectDraw.Top, + rectDraw.Right, rectDraw.Bottom); +*/ + //=========================== + // +/* if(iState == STATE_NORMAL){ + m_pCanvas->Pen->Color = RGB_INTERNAL_ROUND_BKG_N_NOR; + }else if(iState == STATE_HIGHLIGHT ){ + m_pCanvas->Pen->Color = RGB_INTERNAL_ROUND_BKG_N_HIG; + }else if( iState == STATE_PUSH){ + m_pCanvas->Pen->Color = RGB_INTERNAL_ROUND_BKG_H_HIG; + } + + //Ͻ + rFixBegin = PIXEL_EXTERNAL_FRAME + PIXEL_EX2INTERNAL; + rVarBegin = m_nThumbPos; + m_pCanvas->Pixels[rectDraw.Left][rectDraw.Top] = m_pCanvas->Pen->Color; + + //½ + rVarBegin = m_nThumbPos + m_nThumbSize - PIXEL_INTERNAL_BOUND; + m_pCanvas->Pixels[rectDraw.Left][rectDraw.Top] = m_pCanvas->Pen->Color; + + //Ͻ + rFixBegin = Width - (PIXEL_EXTERNAL_FRAME+PIXEL_EX2INTERNAL+PIXEL_INTERNAL_BOUND); + rVarBegin = m_nThumbPos; + m_pCanvas->Pixels[rectDraw.Left][rectDraw.Top] = m_pCanvas->Pen->Color; + + //½ + rVarBegin = m_nThumbPos + m_nThumbSize - PIXEL_INTERNAL_BOUND; + m_pCanvas->Pixels[rectDraw.Left][rectDraw.Top] = m_pCanvas->Pen->Color; +*/ + } + + m_nPreThumbPos = m_nThumbPos; +} +//--------------------------------------------------------------------------- + +void TSkinScrollBar::DrawBound() +{ + bool bVertical = Kind==sbVertical; + TRect rectDraw; + int wid = bVertical ? Width : Height, + len = bVertical ? Height : Width; + LONG &rFixBegin = bVertical ? rectDraw.Left : rectDraw.Top, + &rFixEnd = bVertical ? rectDraw.Right : rectDraw.Bottom, + &rVarBegin = bVertical ? rectDraw.Top : rectDraw.Left, + &rVarEnd = bVertical ? rectDraw.Bottom : rectDraw.Right; + + + m_pCanvas->Brush->Color = RGB_EXTERNAL_FRAME; + m_pCanvas->Pen->Color = RGB_EXTERNAL_FRAME; + + rVarBegin = wid; + rVarEnd = len - wid; + + rFixBegin = 0; + rFixEnd = rFixBegin + PIXEL_EXTERNAL_FRAME; + m_pCanvas->Rectangle(rectDraw.Left, rectDraw.Top, + rectDraw.Right, rectDraw.Bottom); + + rFixBegin = wid - PIXEL_EXTERNAL_FRAME; + rFixEnd = wid; + m_pCanvas->Rectangle(rectDraw.Left, rectDraw.Top, + rectDraw.Right, rectDraw.Bottom); +} +//--------------------------------------------------------------------------- + +void __fastcall TSkinScrollBar::PaintWindow(HDC DC) +{ + if( !m_pCanvas->Handle ) + m_pCanvas->Handle = DC; + + // /ͷ + int iState = m_iHitPrev==SB_LINEUP ? STATE_HIGHLIGHT : STATE_NORMAL; + DrawArrow( SB_LINEUP, iState ); + + // ƻ + iState = m_iHitPrev==SB_THUMBTRACK ? STATE_HIGHLIGHT : STATE_NORMAL; + DrawThumb( iState, true ); + + // /Ҽͷ + iState = m_iHitPrev==SB_LINEDOWN ? STATE_HIGHLIGHT : STATE_NORMAL; + DrawArrow( SB_LINEDOWN, iState ); + + // /±߿ + DrawBound(); +} +//--------------------------------------------------------------------------- + +void __fastcall TSkinScrollBar::WMPaint(TWMPaint &Message) +{ + PaintHandler(Message); +} +//--------------------------------------------------------------------------- + +void __fastcall TSkinScrollBar::SetPosition(int Value, bool bRedraw) +{ + if( m_nPos!=Value ){ + m_nPos = Value; + + CalcThumbPos(); + if( bRedraw ) DrawThumb( STATE_NORMAL, false ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TSkinScrollBar::SetPageSize(int Value, bool bRedraw) +{ + if( m_nPage!=Value ){ + m_nPage = Value; + + CalcThumbSize(); + if( bRedraw ){ + DrawThumb( STATE_NORMAL, true ); + Invalidate(); + } + } +} +//--------------------------------------------------------------------------- + +void __fastcall TSkinScrollBar::SetRange(int AMin, int AMax, bool bRedraw) +{ + if( m_nMin!=AMin || m_nMax!=AMax ){ + m_nMin = AMin; + m_nMax = AMax; + + CalcThumbSize(); + if( bRedraw ){ + DrawThumb( STATE_NORMAL, true ); + Invalidate(); + } + } +} +//--------------------------------------------------------------------------- + +int __fastcall TSkinScrollBar::GetScrollPos() +{ + return m_nPos; +} +//--------------------------------------------------------------------------- + +void __fastcall TSkinScrollBar::GetScrollRange(int* nMin, int* nMax) +{ + *nMin = m_nMin; + *nMax = m_nMax; +} +//--------------------------------------------------------------------------- + +int __fastcall TSkinScrollBar::GetPageSize() +{ + return m_nPage; +} +//--------------------------------------------------------------------------- + +void __fastcall TSkinScrollBar::WMLButtonDown(TWMMouse &Message) +{ + SetCapture(Handle); + + m_bAction = true; + m_pWndCtrl->SetFocus(); + + bool bVertical = Kind==sbVertical; + int iHit = HitTest( Message.XPos, Message.YPos ); + + if( iHit==SB_THUMBTRACK ){ + m_bDrag = TRUE; + m_nDragPoint = bVertical ? Message.YPos : Message.XPos; + m_nDragPos = m_nPos; + m_nTrackPos = m_nDragPos; + DrawThumb( STATE_PUSH, false ); + } + else{ + m_iClicked = iHit; + if( m_pWndCtrl ) + m_pWndCtrl->Perform( bVertical ? WM_VSCROLL : WM_HSCROLL, + MAKELONG(m_iClicked,0), LPARAM(Handle) ); + + m_pTimer->Interval = TIME_DELAY; + m_pTimer->Enabled = true; + m_bPause = false; + + int nNewPos = m_nPos; + if( iHit==SB_LINEUP || iHit==SB_LINEDOWN ){ + DrawArrow( iHit, STATE_PUSH ); + nNewPos += (iHit==SB_LINEUP) ? -1 : 1; + } + else if( iHit==SB_PAGEUP || iHit==SB_PAGEDOWN ){ + nNewPos += (iHit==SB_PAGEUP) ? -m_nPage : m_nPage; + } + + int nLenInSi = m_nMax-m_nMin-m_nPage+1; + if( nNewPosnLenInSi ) + nNewPos = nLenInSi; + + if( nNewPos!=m_nPos ){ + m_nPos = nNewPos; + CalcThumbPos(); + //add by tj 2013/11/14 + DrawThumb( STATE_NORMAL, false, iHit ); + } + } +} +//--------------------------------------------------------------------------- + +void __fastcall TSkinScrollBar::WMLButtonUp(TWMMouse &Message) +{ + ReleaseCapture(); + + if( m_bDrag ){ + m_bDrag = false; + m_pWndCtrl->Perform( Kind==sbVertical ? WM_VSCROLL : WM_HSCROLL, + MAKELONG(SB_THUMBPOSITION, m_nTrackPos), LPARAM(Handle) ); + if( m_nTrackPos!=m_nPos ){ + m_nPos = m_nTrackPos; + } + + m_nTrackPos = 0; + CalcThumbPos(); + + int iHit = HitTest( Message.XPos, Message.YPos ); + if( iHit==SB_THUMBTRACK ) + DrawThumb( STATE_HIGHLIGHT, false ); + else + DrawThumb( STATE_NORMAL, false ); + } + else if( m_iClicked!=-1 ){ + m_pTimer->Enabled = false; + if( m_bNotify ){ + m_bNotify = false; + } + + if( m_iClicked==SB_LINEUP || m_iClicked==SB_LINEDOWN ) + DrawArrow( m_iClicked, STATE_NORMAL ); + + //add by tj 2013/11/14 + if( m_iClicked==SB_PAGEUP || m_iClicked==SB_PAGEDOWN ) + DrawThumb( STATE_NORMAL, false); + + m_iClicked = -1; + } + + m_bAction = false; +} +//--------------------------------------------------------------------------- + +void __fastcall TSkinScrollBar::WMLButtonDblClk(TWMMouse &Message) +{ + int uHit = HitTest( Message.XPos, Message.YPos ); + if( uHit!=SB_THUMBTRACK ){ + m_iClicked = uHit; + + WMLButtonDown( Message ); + m_bAction = false; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TSkinScrollBar::WMMouseMove(TWMMouse &Message) +{ + Commctrl::TTrackMouseEvent tme; + if( !m_bTrace && (Message.Keys & MK_LBUTTON) ){ + tme.cbSize = sizeof(tme); + tme.hwndTrack = Handle; + tme.dwFlags = TME_LEAVE; + tme.dwHoverTime = 1; + m_bTrace = _TrackMouseEvent(&tme); + } + + if( m_bDrag ){ + bool bVertical = Kind==sbVertical; + int nDragLen = (bVertical ? Message.YPos : Message.XPos) - m_nDragPoint, + nTrackLen = (bVertical ? Height-2*Width : Width-2*Height) - m_nThumbSize, + nLenInSi = m_nMax - m_nMin - m_nPage + 1, + nSlide = nTrackLen==0 ? 0 : nDragLen * nLenInSi / nTrackLen, + nNewPos = m_nDragPos + nSlide; + + if( nNewPosnLenInSi ) + nNewPos = nLenInSi; + + if( nNewPos!=m_nTrackPos ){ + m_nTrackPos = nNewPos; + CalcThumbPos(); + DrawThumb( STATE_PUSH, false ); + m_pWndCtrl->Perform( bVertical ? WM_VSCROLL : WM_HSCROLL, + MAKELONG(SB_THUMBTRACK, m_nTrackPos), LPARAM(Handle) ); + } + } + else if( m_iClicked!=-1 ){ + int iState, + iHit = HitTest( Message.XPos, Message.YPos ); + if( iHit==m_iClicked ){ + m_bPause = false; + iState = STATE_PUSH; //add by tj 2013/11/18 + } + else{ + m_bPause = true; + iState = STATE_NORMAL; + } + + if( m_iClicked==SB_LINEUP || m_iClicked==SB_LINEDOWN ) + DrawArrow( m_iClicked, iState ); + } + else{ + int iHit = HitTest( Message.XPos, Message.YPos ); + if( iHit!=m_iHitPrev ){ + if( m_iHitPrev!=-1 ){ + if( m_iHitPrev==SB_THUMBTRACK ) + DrawThumb( STATE_NORMAL, FALSE ); + else if( m_iHitPrev==SB_LINEUP || m_iHitPrev==SB_LINEDOWN ) + DrawArrow( m_iHitPrev, STATE_NORMAL ); + } + + if( iHit!=-1 ){ + if( iHit==SB_THUMBTRACK ) + DrawThumb( STATE_HIGHLIGHT, FALSE ); + else if( iHit==SB_LINEUP || iHit==SB_LINEDOWN ) + DrawArrow( iHit, STATE_HIGHLIGHT ); + } + + m_iHitPrev = iHit; + } + } +} + +//--------------------------------------------------------------------------- + +void __fastcall TSkinScrollBar::CMMouseEnter(TObject *Sender) +{ + TPoint pt( Mouse->CursorPos.x, Mouse->CursorPos.y ); + pt = ScreenToClient( pt ); + + int iHit = HitTest( pt.x, pt.y ); + if( iHit!=-1 ){ + if( iHit==SB_THUMBTRACK ) + DrawThumb( STATE_HIGHLIGHT, FALSE ); + else if( iHit==SB_LINEUP || iHit==SB_LINEDOWN ) + DrawArrow( iHit, STATE_HIGHLIGHT ); + + m_iHitPrev = iHit; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TSkinScrollBar::CMMouseLeave(TObject *Sender) +{ + if( m_iHitPrev!=-1 ){ + if( m_iHitPrev==SB_THUMBTRACK ) + DrawThumb( STATE_NORMAL, false ); + else if( m_iHitPrev==SB_LINEUP || m_iHitPrev==SB_LINEDOWN ) + DrawArrow( m_iHitPrev, STATE_NORMAL ); + + m_iHitPrev = -1; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TSkinScrollBar::TimerProc(TObject* Sender) +{ + if( m_pTimer->Interval==TIME_DELAY ){ + m_bNotify = true; + + m_pTimer->Enabled = false; + m_pTimer->Interval = TIME_NOTIFY; + m_pTimer->Enabled = true; + } + else if( m_pTimer->Interval==TIME_NOTIFY && !m_bPause ){ + int nNewPos = m_nPos; + //add by tj 2013/11/14 + bool bPageUD = false; + int iHit; + + switch( m_iClicked ){ + case SB_LINEUP: + nNewPos -= 1; + if( m_nPos==m_nMin ){ + m_pTimer->Enabled = false; + return; + } + break; + + case SB_LINEDOWN: + nNewPos += 1; + if( m_nPos==m_nMax ){ + m_pTimer->Enabled = false; + return; + } + break; + + case SB_PAGEUP: + case SB_PAGEDOWN: + { + TPoint pt; + GetCursorPos(&pt); + pt = ScreenToClient(pt); + + iHit = HitTest( pt.X, pt.Y ); + if( iHit==SB_THUMBTRACK ){ + m_pTimer->Enabled = false; + return; + } + nNewPos += (m_iClicked==SB_PAGEUP) ? -m_nPage+1 : m_nPage-1; + bPageUD = true; + } + break; + } + + int nLenInSi = m_nMax-m_nMin-m_nPage+1; + if( nNewPosnLenInSi ) + nNewPos = nLenInSi; + + if( nNewPos!=m_nPos ){ + m_nPos = nNewPos; + CalcThumbPos(); + //add by tj 2013/11/14 + if(bPageUD) + DrawThumb( STATE_NORMAL, false, iHit ); + else + DrawThumb( STATE_NORMAL, false ); + } + + m_pWndCtrl->Perform( Kind==sbVertical ? WM_VSCROLL : WM_HSCROLL, + MAKELONG(m_iClicked,0), LPARAM(Handle) ); + } +} +//--------------------------------------------------------------------------- + diff --git a/SkinScrollBarUnit.h b/SkinScrollBarUnit.h new file mode 100644 index 0000000..879ead0 --- /dev/null +++ b/SkinScrollBarUnit.h @@ -0,0 +1,96 @@ +//--------------------------------------------------------------------------- + +#ifndef SkinScrollBarUnitH +#define SkinScrollBarUnitH + +#define TIME_DELAY 200 +#define TIME_NOTIFY 100 +#define THUMB_BORDER 7 +#define THUMB_MINSIZE (THUMB_BORDER * 2) + +#define STATE_NORMAL 0 +#define STATE_HIGHLIGHT 1 +#define STATE_PUSH 2 + +class TSkinScrollBar : public TScrollBar +{ +private: +// int m_nTileHeight, //add by tj 2013/11/18 + int m_nThumbSize, + m_nThumbPos, + m_nPreThumbPos, + m_nDragPos, + m_nDragPoint, + m_iClicked, + m_iHitPrev, + m_nMax, + m_nMin, + m_nPos, + m_nPage, + m_nTrackPos; + + bool m_bPause, + m_bNotify, + m_bDrag, + m_bTrace, + m_bAction; + + TTimer *m_pTimer; + TControlCanvas *m_pCanvas; + + int HitTest( int X, int Y ); + void CalcThumbSize(); + void CalcThumbPos(); + void DrawArrow( int iDirection, int iState ); + void DrawThumb( int iState, bool bEraseBk, int iPageUD=-1 ); + void DrawBound(); + + void __fastcall TimerProc(TObject* Sender); + + MESSAGE void __fastcall WMPaint(Winapi::Messages::TWMPaint &Message); + MESSAGE void __fastcall WMLButtonDown(TWMMouse &Message); + MESSAGE void __fastcall WMLButtonUp(TWMMouse &Message); + MESSAGE void __fastcall WMLButtonDblClk(TWMMouse &Message); +// MESSAGE void __fastcall WMRButtonDown(TWMMouse &Message){}; //add by tj 2013/11/18 + MESSAGE void __fastcall WMRButtonUp(TWMMouse &Message){}; //add by tj 2013/11/18 + MESSAGE void __fastcall WMMouseMove(TWMMouse &Message); +// MESSAGE void __fastcall SBMSetScrollInfo(TMessage &Message); +// MESSAGE void __fastcall SBMGetScrollInfo(TMessage &Message); + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(WM_PAINT, TWMPaint, WMPaint) + MESSAGE_HANDLER(WM_LBUTTONDOWN, TWMLButtonDown, WMLButtonDown) + MESSAGE_HANDLER(WM_LBUTTONUP, TWMLButtonUp, WMLButtonUp) + MESSAGE_HANDLER(WM_LBUTTONDBLCLK, TWMLButtonDblClk, WMLButtonDblClk) +// MESSAGE_HANDLER(WM_RBUTTONDOWN, TWMRButtonDown, WMRButtonDown) + MESSAGE_HANDLER(WM_RBUTTONUP, TWMRButtonUp, WMRButtonUp) //add by tj 2013/11/18 + MESSAGE_HANDLER(WM_MOUSEMOVE, TWMMouseMove, WMMouseMove) //add by tj 2013/11/18 +// MESSAGE_HANDLER(CM_MOUSELEAVE, TMessage, CMMouseLeave) //add by tj 2013/11/25 12:35 +// MESSAGE_HANDLER(SBM_SETSCROLLINFO, TMessage, SBMSetScrollInfo) +// MESSAGE_HANDLER(SBM_GETSCROLLINFO, TMessage, SBMGetScrollInfo) + END_MESSAGE_MAP(TScrollBar) + +protected: + virtual void __fastcall PaintWindow(HDC DC); + +public: + TWinControl *m_pWndCtrl; + + __fastcall virtual TSkinScrollBar(System::Classes::TComponent* AOwner, bool bVertical=true);//ȱʡֱ + __fastcall ~TSkinScrollBar(); + + void __fastcall CMMouseEnter(TObject *Sender); + void __fastcall CMMouseLeave(TObject *Sender); //add by tj 2013/11/25 12:35 + + bool IsDraging(){ return m_bDrag; }; + bool IsOperable(){ return m_nMax > m_nMin; }; + void __fastcall SetPosition(int Value, bool bRedraw=true); + void __fastcall SetPageSize(int Value, bool bRedraw=true); + void __fastcall SetRange(int AMin, int AMax, bool bRedraw=true); + void __fastcall GetScrollRange(int* nMin, int* nMax); + int __fastcall GetScrollPos(); + int __fastcall GetPageSize(); +}; + +//--------------------------------------------------------------------------- +#endif diff --git a/SkinTrackBar.h b/SkinTrackBar.h new file mode 100644 index 0000000..79205ea --- /dev/null +++ b/SkinTrackBar.h @@ -0,0 +1,105 @@ +//--------------------------------------------------------------------------- + +#ifndef SkinTrackBarH +#define SkinTrackBarH + +#include "vcl.h" + +//--------------------------------------------------------------------------- + +class PACKAGE TSkinTrackBar : public TPanel +{ +private: + TPaintBox *Slider; + + int FPosition; + bool FOrientation, + FEnabled; + TNotifyEvent FOnChange; + + int FMax, + FMin; + int FPageSize; + + bool bDown; + bool bMouse; + + void __fastcall Paint(void){}; + + void __fastcall DrawH(TWMMouse &Message); + void __fastcall DrawV(TWMMouse &Message); + + void __fastcall SetMax(int Value); + void __fastcall SetMin(int Value); + + void __fastcall SetPosition(int iPosition); + void __fastcall SetOrientation(bool bOrientation); + void __fastcall SetEnabled(bool bEnabled); + + void __fastcall SliderPaint(System::TObject* Sender); + + void __fastcall CMMouseEnter(System::TObject* Sender); + void __fastcall CMMouseLeave(System::TObject* Sender); + void __fastcall CMMouseDown(System::TObject* Sender, System::Uitypes::TMouseButton Button, System::Classes::TShiftState Shift, int X, int Y); + + MESSAGE void __fastcall WMMouseWheel(TWMMouseWheel &Message); + MESSAGE void __fastcall WMSize(TWMSize &Message); + MESSAGE void __fastcall WMEraseBkgnd(TWMEraseBkgnd &Message); + MESSAGE void __fastcall WMLButtonDown(TWMLButtonDown &Message); + MESSAGE void __fastcall WMLButtonUp(TWMLButtonUp &Message); + MESSAGE void __fastcall WMMouseMove(TWMMouse &Message); + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(WM_SIZE, TWMSize, WMSize) + MESSAGE_HANDLER(WM_LBUTTONDOWN, TWMLButtonDown, WMLButtonDown) + MESSAGE_HANDLER(WM_LBUTTONUP, TWMLButtonUp, WMLButtonUp) + MESSAGE_HANDLER(WM_MOUSEWHEEL, TWMMouseWheel, WMMouseWheel) + MESSAGE_HANDLER(WM_ERASEBKGND, TWMEraseBkgnd, WMEraseBkgnd) + MESSAGE_HANDLER(WM_MOUSEMOVE, TWMMouseMove, WMMouseMove) + END_MESSAGE_MAP(TPanel) + +public: + void __fastcall TMouseWheelEvent(System::TObject* Sender, System::Classes::TShiftState Shift, int WheelDelta, const System::Types::TPoint &MousePos, bool &Handled); + __fastcall TSkinTrackBar(System::Classes::TComponent* AOwner); + __fastcall ~TSkinTrackBar(); + +__published: + __property bool Orientation = {read=FOrientation, write=SetOrientation, default=true}; + __property TNotifyEvent OnChange = {read = FOnChange, write = FOnChange ,default = NULL}; + + __property bool Enabled = {read = FEnabled, write = SetEnabled, default=true }; + __property int Max = {read = FMax, write = SetMax, default = 100}; + __property int Min = {read = FMin, write = SetMin, default = 0}; + __property int PageSize = {read = FPageSize, write = FPageSize, default = 1}; + __property int Position = {read = FPosition, write = SetPosition, stored=FPosition, default = 0}; +}; + +#endif + +/************************************************************ +ʹ˵ + 1ڲ + ÷OrientationֵMax,СֵMin,λPosition + 2ⲿӿ + OnChange Ϊ TNotifyEvent + 3ʹ + + p_Track = new TSkinTrackBar(GeneralDialogPanel1); + p_Track->Parent = GeneralDialogPanel1; + + p_Track->Top = 50; + p_Track->Left = 100; + p_Track->Width = 100; + p_Track->Height = 100; + + p_Track->Position = 30; //ʼλ + + p_Track->ParentBackground = true; //Ƿ񱳾͸Ϊtrue򱳾Ϊ Parentı---ĬΪtrue + + p_Track->Orientation = false; //鷽 Ϊ true ,Ϊfalse ĬΪ true + + p_Track->OnChange = Change; //ⲿӿChange + + p_Track->Show(); + +************************************************************/ diff --git a/SplashFormUnit.cpp b/SplashFormUnit.cpp new file mode 100644 index 0000000..23f7451 --- /dev/null +++ b/SplashFormUnit.cpp @@ -0,0 +1,24 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop + +#include "SplashFormUnit.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma resource "*.dfm" +TSplashForm *SplashForm; +//--------------------------------------------------------------------------- +__fastcall TSplashForm::TSplashForm(TComponent* Owner) + : TForm(Owner) +{ + m_lblProgress->ControlStyle>>csOpaque; +} +//--------------------------------------------------------------------------- + +void __fastcall TSplashForm::ShowProgress( String strMsg ) +{ + m_lblProgress->Caption = strMsg; + Update(); +} +//--------------------------------------------------------------------------- + diff --git a/SplashFormUnit.dfm b/SplashFormUnit.dfm new file mode 100644 index 0000000..071ea09 --- /dev/null +++ b/SplashFormUnit.dfm @@ -0,0 +1,1063 @@ +object SplashForm: TSplashForm + Left = 0 + Top = 0 + Margins.Left = 4 + Margins.Top = 4 + Margins.Right = 4 + Margins.Bottom = 4 + BorderIcons = [] + BorderStyle = bsNone + Caption = 'SplashForm' + ClientHeight = 148 + ClientWidth = 400 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -14 + Font.Name = 'Tahoma' + Font.Style = [] + Position = poScreenCenter + Scaled = False + PixelsPerInch = 120 + TextHeight = 17 + object m_imgBk: TImage + Left = 0 + Top = 0 + Width = 400 + Height = 148 + Margins.Left = 4 + Margins.Top = 4 + Margins.Right = 4 + Margins.Bottom = 4 + Align = alClient + Picture.Data = { + 0A544A504547496D616765367E0000FFD8FFE1190B4578696600004D4D002A00 + 000008000C010000030000000101900000010100030000000100C80000010200 + 03000000030000009E0106000300000001000200000112000300000001000100 + 00011500030000000100030000011A000500000001000000A4011B0005000000 + 01000000AC012800030000000100020000013100020000001E000000B4013200 + 0200000014000000D28769000400000001000000E80000012000080008000800 + 2DC6C000002710002DC6C00000271041646F62652050686F746F73686F702043 + 5336202857696E646F77732900323031353A30373A31312031383A33323A3437 + 0000000004900000070000000430323231A001000300000001FFFF0000A00200 + 040000000100000190A003000400000001000000940000000000000006010300 + 030000000100060000011A0005000000010000016E011B000500000001000001 + 7601280003000000010002000002010004000000010000017E02020004000000 + 01000017850000000000000048000000010000004800000001FFD8FFE20C5849 + 43435F50524F46494C4500010100000C484C696E6F021000006D6E7472524742 + 2058595A2007CE00020009000600310000616373704D53465400000000494543 + 20735247420000000000000000000000000000F6D6000100000000D32D485020 + 2000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000011637072740000015000000033646573 + 63000001840000006C77747074000001F000000014626B707400000204000000 + 147258595A00000218000000146758595A0000022C000000146258595A000002 + 4000000014646D6E640000025400000070646D6464000002C400000088767565 + 640000034C0000008676696577000003D4000000246C756D69000003F8000000 + 146D6561730000040C0000002474656368000004300000000C72545243000004 + 3C0000080C675452430000043C0000080C625452430000043C0000080C746578 + 7400000000436F70797269676874202863292031393938204865776C6574742D + 5061636B61726420436F6D70616E790000646573630000000000000012735247 + 422049454336313936362D322E31000000000000000000000012735247422049 + 454336313936362D322E31000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000058595A + 20000000000000F35100010000000116CC58595A200000000000000000000000 + 000000000058595A200000000000006FA2000038F50000039058595A20000000 + 00000062990000B785000018DA58595A2000000000000024A000000F840000B6 + CF64657363000000000000001649454320687474703A2F2F7777772E6965632E + 636800000000000000000000001649454320687474703A2F2F7777772E696563 + 2E63680000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000064657363000000000000002E494543 + 2036313936362D322E312044656661756C742052474220636F6C6F7572207370 + 616365202D207352474200000000000000000000002E4945432036313936362D + 322E312044656661756C742052474220636F6C6F7572207370616365202D2073 + 5247420000000000000000000000000000000000000000000064657363000000 + 000000002C5265666572656E63652056696577696E6720436F6E646974696F6E + 20696E2049454336313936362D322E3100000000000000000000002C52656665 + 72656E63652056696577696E6720436F6E646974696F6E20696E204945433631 + 3936362D322E3100000000000000000000000000000000000000000000000000 + 0076696577000000000013A4FE00145F2E0010CF140003EDCC0004130B00035C + 9E0000000158595A2000000000004C09560050000000571FE76D656173000000 + 0000000001000000000000000000000000000000000000028F00000002736967 + 20000000004352542063757276000000000000040000000005000A000F001400 + 19001E00230028002D00320037003B00400045004A004F00540059005E006300 + 68006D00720077007C00810086008B00900095009A009F00A400A900AE00B200 + B700BC00C100C600CB00D000D500DB00E000E500EB00F000F600FB0101010701 + 0D01130119011F0125012B01320138013E0145014C0152015901600167016E01 + 75017C0183018B0192019A01A101A901B101B901C101C901D101D901E101E901 + F201FA0203020C0214021D0226022F02380241024B0254025D02670271027A02 + 84028E029802A202AC02B602C102CB02D502E002EB02F50300030B0316032103 + 2D03380343034F035A03660372037E038A039603A203AE03BA03C703D303E003 + EC03F9040604130420042D043B0448045504630471047E048C049A04A804B604 + C404D304E104F004FE050D051C052B053A05490558056705770586059605A605 + B505C505D505E505F6060606160627063706480659066A067B068C069D06AF06 + C006D106E306F507070719072B073D074F076107740786079907AC07BF07D207 + E507F8080B081F08320846085A086E0882089608AA08BE08D208E708FB091009 + 25093A094F09640979098F09A409BA09CF09E509FB0A110A270A3D0A540A6A0A + 810A980AAE0AC50ADC0AF30B0B0B220B390B510B690B800B980BB00BC80BE10B + F90C120C2A0C430C5C0C750C8E0CA70CC00CD90CF30D0D0D260D400D5A0D740D + 8E0DA90DC30DDE0DF80E130E2E0E490E640E7F0E9B0EB60ED20EEE0F090F250F + 410F5E0F7A0F960FB30FCF0FEC1009102610431061107E109B10B910D710F511 + 131131114F116D118C11AA11C911E81207122612451264128412A312C312E313 + 03132313431363138313A413C513E5140614271449146A148B14AD14CE14F015 + 12153415561578159B15BD15E0160316261649166C168F16B216D616FA171D17 + 411765178917AE17D217F7181B18401865188A18AF18D518FA19201945196B19 + 9119B719DD1A041A2A1A511A771A9E1AC51AEC1B141B3B1B631B8A1BB21BDA1C + 021C2A1C521C7B1CA31CCC1CF51D1E1D471D701D991DC31DEC1E161E401E6A1E + 941EBE1EE91F131F3E1F691F941FBF1FEA20152041206C209820C420F0211C21 + 48217521A121CE21FB22272255228222AF22DD230A23382366239423C223F024 + 1F244D247C24AB24DA250925382568259725C725F726272657268726B726E827 + 182749277A27AB27DC280D283F287128A228D429062938296B299D29D02A022A + 352A682A9B2ACF2B022B362B692B9D2BD12C052C392C6E2CA22CD72D0C2D412D + 762DAB2DE12E162E4C2E822EB72EEE2F242F5A2F912FC72FFE3035306C30A430 + DB3112314A318231BA31F2322A3263329B32D4330D3346337F33B833F1342B34 + 65349E34D83513354D358735C235FD3637367236AE36E937243760379C37D738 + 143850388C38C839053942397F39BC39F93A363A743AB23AEF3B2D3B6B3BAA3B + E83C273C653CA43CE33D223D613DA13DE03E203E603EA03EE03F213F613FA23F + E24023406440A640E74129416A41AC41EE4230427242B542F7433A437D43C044 + 034447448A44CE45124555459A45DE4622466746AB46F04735477B47C0480548 + 4B489148D7491D496349A949F04A374A7D4AC44B0C4B534B9A4BE24C2A4C724C + BA4D024D4A4D934DDC4E254E6E4EB74F004F494F934FDD5027507150BB510651 + 50519B51E65231527C52C75313535F53AA53F65442548F54DB5528557555C256 + 0F565C56A956F75744579257E0582F587D58CB591A596959B85A075A565AA65A + F55B455B955BE55C355C865CD65D275D785DC95E1A5E6C5EBD5F0F5F615FB360 + 05605760AA60FC614F61A261F56249629C62F06343639763EB6440649464E965 + 3D659265E7663D669266E8673D679367E9683F689668EC6943699A69F16A486A + 9F6AF76B4F6BA76BFF6C576CAF6D086D606DB96E126E6B6EC46F1E6F786FD170 + 2B708670E0713A719571F0724B72A67301735D73B87414747074CC7528758575 + E1763E769B76F8775677B37811786E78CC792A798979E77A467AA57B047B637B + C27C217C817CE17D417DA17E017E627EC27F237F847FE5804780A8810A816B81 + CD8230829282F4835783BA841D848084E3854785AB860E867286D7873B879F88 + 04886988CE8933899989FE8A648ACA8B308B968BFC8C638CCA8D318D988DFF8E + 668ECE8F368F9E9006906E90D6913F91A89211927A92E3934D93B69420948A94 + F4955F95C99634969F970A977597E0984C98B89924999099FC9A689AD59B429B + AF9C1C9C899CF79D649DD29E409EAE9F1D9F8B9FFAA069A0D8A147A1B6A226A2 + 96A306A376A3E6A456A4C7A538A5A9A61AA68BA6FDA76EA7E0A852A8C4A937A9 + A9AA1CAA8FAB02AB75ABE9AC5CACD0AD44ADB8AE2DAEA1AF16AF8BB000B075B0 + EAB160B1D6B24BB2C2B338B3AEB425B49CB513B58AB601B679B6F0B768B7E0B8 + 59B8D1B94AB9C2BA3BBAB5BB2EBBA7BC21BC9BBD15BD8FBE0ABE84BEFFBF7ABF + F5C070C0ECC167C1E3C25FC2DBC358C3D4C451C4CEC54BC5C8C646C6C3C741C7 + BFC83DC8BCC93AC9B9CA38CAB7CB36CBB6CC35CCB5CD35CDB5CE36CEB6CF37CF + B8D039D0BAD13CD1BED23FD2C1D344D3C6D449D4CBD54ED5D1D655D6D8D75CD7 + E0D864D8E8D96CD9F1DA76DAFBDB80DC05DC8ADD10DD96DE1CDEA2DF29DFAFE0 + 36E0BDE144E1CCE253E2DBE363E3EBE473E4FCE584E60DE696E71FE7A9E832E8 + BCE946E9D0EA5BEAE5EB70EBFBEC86ED11ED9CEE28EEB4EF40EFCCF058F0E5F1 + 72F1FFF28CF319F3A7F434F4C2F550F5DEF66DF6FBF78AF819F8A8F938F9C7FA + 57FAE7FB77FC07FC98FD29FDBAFE4BFEDCFF6DFFFFFFED000C41646F62655F43 + 4D0002FFEE000E41646F626500648000000001FFDB0084000C08080809080C09 + 090C110B0A0B11150F0C0C0F1518131315131318110C0C0C0C0C0C110C0C0C0C + 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C010D0B0B0D0E0D10 + 0E0E10140E0E0E14140E0E0E0E14110C0C0C0C0C11110C0C0C0C0C0C110C0C0C + 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0CFFC0001108003B + 00A003012200021101031101FFDD0004000AFFC4013F00000105010101010101 + 00000000000000030001020405060708090A0B01000105010101010101000000 + 00000000010002030405060708090A0B1000010401030204020507060805030C + 33010002110304211231054151611322718132061491A1B14223241552C16233 + 347282D14307259253F0E1F163733516A2B283264493546445C2A3743617D255 + E265F2B384C3D375E3F3462794A485B495C4D4E4F4A5B5C5D5E5F55666768696 + A6B6C6D6E6F637475767778797A7B7C7D7E7F711000202010204040304050607 + 070605350100021103213112044151617122130532819114A1B14223C152D1F0 + 332462E1728292435315637334F1250616A2B283072635C2D2449354A3176445 + 55367465E2F2B384C3D375E3F34694A485B495C4D4E4F4A5B5C5D5E5F5566676 + 8696A6B6C6D6E6F62737475767778797A7B7C7FFDA000C03010002110311003F + 00F554924925292492494A496775FEAECE8DD2AECE2DF52C680CA29EF65AF3E9 + D1576FA563BDFF00B95FE9171F8BFE31B3E863FEDB563E5BAA8F519497D166DF + CEBA9AF2058CCA6B3E85CCAF65947E8FFED3FE9EB7461290B082407D052589D0 + 7EB774BEB973F1E816D192C68B0537B434BD876FE9687B1D657757EFAFE8BFFC + 2316DA69041A229376A4956CBEA3D3F08D63372A9C637BB6522EB1B597BBF72B + F51CDDEFD7F3567E47D6FF00AB78D916635B9CCF5A971AED6B439FB5E3E9D6E7 + 54C7B3D467E7B3F31253B292A75F57E9B6F4C7756AF21AFC0656FB5D90D92D0C + AF77ACEFDEFD1FA6FDED43ABAF748B6DB29194C65948ACDACB66A2DF599EBD2D + 77AE2BF7BAAF7FA7FCE57FE11253A0920333B0ACADF6D77D6FAABFE72C6BDA5A + DFEBB81DAD427757E98D7B5872AA97CEDF7B634FE54ED6A6CA708FCD211F334B + A309CBE5899790B6E2482CCCC4B1BB99756F683B4B9AF6913CEDE7E928FDBF0F + D5F47D667A9B77C6E1F4676CFF009C971C3F786BE2AE09FEE9D3C1B092832DAE + C04D6E0F03425A41FC8A69C0DECB76524924929FFFD0F55492492529249240A9 + F3FF00AC5D66ECCEAB7B6E86748E9EE7552F6C865ED6BEB6E7DA5BB1EEADD956 + 7ECE6E2FFE85FF00C1AE5F2BD5B6D75C0372F2FD4DCE70008B1DFBAC65AD6FD1 + FF0006C7D7FD75E8FD53EAE62E4F5236BEB165595B7D6ACC412DF69F6FF2DB66 + E77FDB8B96C9E95895160353DAE7E73A9F5AB7B7D3763BADB7D170F52CF65BE8 + 359FA6FA1FA35660634386F4FCD10D244CBAE8E45D7BEAC8C4EA1D2DF5F4ECCA + 1DEDADCC7329DDE1FA486D34DADF52BB58DBBF3D7A9F46EA8CEABD3EACB0CF4A + C7002EA37071AEC80E754E737FADBEB77F84A5F5DABCF31F07A5753BA8C4B0D8 + EB2DBB258DC57B6E6077A6DDF8DEABF636BB3F45B6EB3D27ECFE6D965BF4D7A1 + F46E938BD23019878B532A603B9CDADA1A0B8FD276D606A6E62081A7ABF62AA2 + 0FA6EBC5E3FEB864E0BFABE63B3373F1B199838763609606BEEB3ADF561FCA77 + ECBE9D42CFA69FAC7556F2316E78B1F6DE6D3D41D8D26E7D994EB1D8987D72AC + 6C7FE77F48CA98BA9EB9D13EAAF50C9B9B92E6E3753CE67A27259FCE09FD583B + 6D81F437D6D9F62F52CAFF0058AFD4C3AEC59FFF008DF60E651A67D4EA725921 + D560E031CEADE357D373313D467B1FEDB58A14B4ECA73ADE91F56BA3609A6EC0 + EA358C9B0E6122CCAB8576F56D9974B5992DAB09D92CAACCFF00D2DF6E47DA19 + 8FFCDFAD65B5ADE9D85475FCBA2FBBA4E4E4E2514B33323ACB2B06EC9BDD767E + 4E455531CCDBFA3B716BAF76FF004286558F4FF34BB9674AC2666E0E531C037A + 7633F1B1AAD080DB8D03D4DDF4B76CC5F499FF0018878DF57FA7D57666465359 + 996E7641BDCFBD8C71682CAB1EAC7AE5BFCDD75D15B58929CF38D8581D2B0C57 + 4E1D1EA9FB5641C0A9ACC77FA553ED6DB5B1BB7D567A9F67F4FD4B3DFF00BE83 + 59AEBDF46CB9B65F2F3AEE3B439BB0977ACCF76D6D6C7FB7FD2ADDC9E9F53DED + 78B7D06D551AAA635ACDAC612DF59CD658D733DD5B1957BFF475B102CE838D0C + 65367A5B776F3B58F2F738B6CF55FBDBFCE7B3FCCFD1FF0036A8F31832CE729C + 403DB6BAF97FEFDBD833E28638C0C883FA5BD5FAA43FEE1A0DA29B7A15545205 + 872EE15E3FA8D04B48FD15AFFA76FD1AA9BDED7D4ADFEC9CA88F43A747FE173F + F9359B95F593A2F4CEAAEC4CA7656464749A9A1ECAB1DCF633D46B3F5873A96F + D27B2EAAAFF8343B7EBC74DCC751F62B73EA17878A5B56197FAA5BFCE7A7EA56 + FF00E6B6B93A3CB0E1065124811808C08DA3D7E6FDF94FF4D69E64F154660091 + 94CCA62475974F978BE48C3F43E77A0E8A58FC06DADA6AA0BDCFDC296ED638B5 + CEA859B7F96D62BEB0FEADF5FE91D43774EE9C2E6BB06BACBDB7D6EADDB5FB83 + 1C77FE73B62DC5671C4C61189DC44035FBDD5AD9642592521746448BFDDFD152 + 49249EB1FFD1F554965FA5F59FFEE4E0FF00EC3DBFFBD697A5F59FFEE4E0FF00 + EC3DBFFBD69FC03F7E3FF3BFEF56F11FDD3F83A892CBF4BEB3FF00DC9C1FFD87 + B7FF007AD2F4BEB3FF00DC9C1FFD87B7FF007AD2F6C7EFC7FE77FDEAB88FEE9F + C1D0BE917566B2E7324101ED30E1236CB4FCD63E57D53C3CAB18FBAEB1CD63D8 + F3510CD8EF4CEEAEB73767F35B9ACDED6FF83FD17F37BD58F4BEB3FF00DC9C1F + FD87B7FF007AD2F4BEB3FF00DC9C1FFD87B7FF007AD11131DB2447F8DFF7A826 + F781FC16E9BF57F17073AFEA05EFC8CBC81B4DB644B5BF4BD366D1F9CFF7BD6A + ACBF4BEB3FFDC9C1FF00D87B7FF7AD2F4BEB3FFDC9C1FF00D87B7FF7AD230B36 + 7244FF008DFF007AA06B4113F8303D01CD39029CCB29AF2C59F680D6D65CE758 + 6F76E6DAE639D5B5BF6AFE6D9FE869FE6FF59FB4D73F53BA79C963F7463561ED + 66236BADB586DAEB0DF46D6307EAF75377A1655B7FEFEADFA7F59BFEE4E0FF00 + EC3DBFFBD69BD3FACDFF0072707FF61EDFFDEB43DB1FBF1FF9DFF7A9E23FBA7F + 072CFD4C73F2720BAEA9B8AFAC534B7D163DE58F34BF268BF780C6623DD8DB6A + C6C6F47D2F5ADF4BD2565DF53F1DEE76FC873AB2F25B57A75ED6545F6E47A54F + B7F45732DC8B7D1CC67E9B1E97ECA3D2FE715BF4FEB37FDCAC1FFD87B7FF007A + D3FA5F59FF00EE4E0FFEC3DBFF00BD69700FDF8FFCEFFBD5711FDD3F835B37EA + C3736E7645D93BED732B6973E9ADFAB2039BFA46BBF55B23D5FB1FF33F69FD3A + 9E17D54E9B85974E65526FA0822D73585EE01B9348165DB3D67FE872D957D3FA + 1898C8DE97D67FFB9383FF00B0F6FF00EF5A5E97D67FFB9383FF00B0F6FF00EF + 5A5C03F7E3FF003BFEF55C47F74FE0E2F54FA97D4B2FADE7F53C5EA35D15E7B1 + 8C34594BACDAE6575D55DF2DC8A98FB69B29F5EADF56C43A7EA5F5BA9B88C3D4 + 71AC660C7A4D7E35BEEDAD3437ED1B7347AFB687D95337FD0DFF00E916F7A5F5 + 9FFEE4E0FF00EC3DBFFBD697A5F59FFEE4E0FF00EC3DBFFBD68F00FDF8FF00CE + FF00BD5711FDD3F834FA07D5CCCE9BD5737A9E66557916E757556E6D553AB683 + 56FF007FE96FC9FA7BFDFF00F09FA4FF0008BA0597E97D67FF00B9383FFB0F6F + FEF5A5E97D67FF00B9383FFB0F6FFEF5A1C03F7E3FF3BFEF55C47F74FE0EA24B + 2FD2FACFFF0072707FF61EDFFDEB4BD2FACFFF0072707FF61EDFFDEB4B807EFC + 7FE77FDEAB88FEE9FC1FFFD2F554924925292492494A49249252932749252934 + 84E924A5A427492494A4924925292492494A4924925292492494FF00FFD9FFED + 228450686F746F73686F7020332E30003842494D04040000000000371C015A00 + 031B25471C015A00031B25471C015A00031B25471C015A00031B25471C015A00 + 031B25471C015A00031B25471C020000020074003842494D0425000000000010 + F6CB6C6528BBB2469235BA9CD034A2EB3842494D043A0000000000F300000010 + 0000000100000000000B7072696E744F75747075740000000600000000436C72 + 53656E756D00000000436C7253000000005247424300000000496E7465656E75 + 6D00000000496E746500000000496D6720000000004D70426C626F6F6C010000 + 000F7072696E745369787465656E426974626F6F6C000000000B7072696E7465 + 724E616D65544558540000000100000000000F7072696E7450726F6F66536574 + 75704F626A6300000005682168378BBE7F6E00000000000A70726F6F66536574 + 75700000000100000000426C746E656E756D0000000C6275696C74696E50726F + 6F660000000970726F6F66434D594B003842494D043B00000000022D00000010 + 000000010000000000127072696E744F75747075744F7074696F6E7300000017 + 000000004370746E626F6F6C0000000000436C6272626F6F6C00000000005267 + 734D626F6F6C000000000043726E43626F6F6C0000000000436E7443626F6F6C + 00000000004C626C73626F6F6C00000000004E677476626F6F6C000000000045 + 6D6C44626F6F6C0000000000496E7472626F6F6C000000000042636B674F626A + 630000000100000000000052474243000000030000000052642020646F756240 + 6FE000000000000000000047726E20646F7562406FE000000000000000000042 + 6C2020646F7562406FE000000000000000000042726454556E744623526C7400 + 0000000000000000000000426C6420556E744623526C74000000000000000000 + 00000052736C74556E74462350786C4072C000000000000000000A766563746F + 7244617461626F6F6C010000000050675073656E756D00000000506750730000 + 000050675043000000004C656674556E744623526C7400000000000000000000 + 0000546F7020556E744623526C7400000000000000000000000053636C20556E + 74462350726340590000000000000000001063726F705768656E5072696E7469 + 6E67626F6F6C000000000E63726F7052656374426F74746F6D6C6F6E67000000 + 000000000C63726F70526563744C6566746C6F6E67000000000000000D63726F + 705265637452696768746C6F6E67000000000000000B63726F7052656374546F + 706C6F6E6700000000003842494D03ED000000000010012C000000010002012C + 0000000100023842494D042600000000000E000000000000000000003F800000 + 3842494D03F200000000000A0000FFFFFFFFFFFF00003842494D040D00000000 + 00040000001E3842494D04190000000000040000001E3842494D03F300000000 + 0009000000000000000001003842494D271000000000000A0001000000000000 + 00023842494D03F5000000000048002F66660001006C66660006000000000001 + 002F6666000100A1999A0006000000000001003200000001005A000000060000 + 00000001003500000001002D000000060000000000013842494D03F800000000 + 00700000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800000000 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800000000FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800000000FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFF03E800003842494D04000000000000020006 + 3842494D040200000000000E00000000000000000000000000003842494D0430 + 00000000000701010101010101003842494D042D000000000006000100000009 + 3842494D0408000000000010000000010000024000000240000000003842494D + 041E000000000004000000003842494D041A0000000003410000000600000000 + 0000000000000094000001900000000600730070006C00610073006800000001 + 0000000000000000000000000000000000000001000000000000000000000190 + 0000009400000000000000000000000000000000010000000000000000000000 + 000000000000000010000000010000000000006E756C6C000000020000000662 + 6F756E64734F626A630000000100000000000052637431000000040000000054 + 6F70206C6F6E6700000000000000004C6566746C6F6E67000000000000000042 + 746F6D6C6F6E670000009400000000526768746C6F6E67000001900000000673 + 6C69636573566C4C73000000014F626A6300000001000000000005736C696365 + 0000001200000007736C69636549446C6F6E67000000000000000767726F7570 + 49446C6F6E6700000000000000066F726967696E656E756D0000000C45536C69 + 63654F726967696E0000000D6175746F47656E65726174656400000000547970 + 65656E756D0000000A45536C6963655479706500000000496D67200000000662 + 6F756E64734F626A630000000100000000000052637431000000040000000054 + 6F70206C6F6E6700000000000000004C6566746C6F6E67000000000000000042 + 746F6D6C6F6E670000009400000000526768746C6F6E67000001900000000375 + 726C54455854000000010000000000006E756C6C544558540000000100000000 + 00004D7367655445585400000001000000000006616C74546167544558540000 + 000100000000000E63656C6C54657874497348544D4C626F6F6C010000000863 + 656C6C546578745445585400000001000000000009686F727A416C69676E656E + 756D0000000F45536C696365486F727A416C69676E0000000764656661756C74 + 0000000976657274416C69676E656E756D0000000F45536C6963655665727441 + 6C69676E0000000764656661756C740000000B6267436F6C6F7254797065656E + 756D0000001145536C6963654247436F6C6F7254797065000000004E6F6E6500 + 000009746F704F75747365746C6F6E67000000000000000A6C6566744F757473 + 65746C6F6E67000000000000000C626F74746F6D4F75747365746C6F6E670000 + 00000000000B72696768744F75747365746C6F6E6700000000003842494D0428 + 00000000000C000000023FF00000000000003842494D04110000000000010100 + 3842494D0414000000000004000000093842494D040C0000000017A100000001 + 000000A00000003B000001E000006EA00000178500180001FFD8FFE20C584943 + 435F50524F46494C4500010100000C484C696E6F021000006D6E747252474220 + 58595A2007CE00020009000600310000616373704D5346540000000049454320 + 735247420000000000000000000000000000F6D6000100000000D32D48502020 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000001163707274000001500000003364657363 + 000001840000006C77747074000001F000000014626B70740000020400000014 + 7258595A00000218000000146758595A0000022C000000146258595A00000240 + 00000014646D6E640000025400000070646D6464000002C40000008876756564 + 0000034C0000008676696577000003D4000000246C756D69000003F800000014 + 6D6561730000040C0000002474656368000004300000000C725452430000043C + 0000080C675452430000043C0000080C625452430000043C0000080C74657874 + 00000000436F70797269676874202863292031393938204865776C6574742D50 + 61636B61726420436F6D70616E79000064657363000000000000001273524742 + 2049454336313936362D322E3100000000000000000000001273524742204945 + 4336313936362D322E3100000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000058595A20 + 000000000000F35100010000000116CC58595A20000000000000000000000000 + 0000000058595A200000000000006FA2000038F50000039058595A2000000000 + 000062990000B785000018DA58595A2000000000000024A000000F840000B6CF + 64657363000000000000001649454320687474703A2F2F7777772E6965632E63 + 6800000000000000000000001649454320687474703A2F2F7777772E6965632E + 6368000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000064657363000000000000002E49454320 + 36313936362D322E312044656661756C742052474220636F6C6F757220737061 + 6365202D207352474200000000000000000000002E4945432036313936362D32 + 2E312044656661756C742052474220636F6C6F7572207370616365202D207352 + 4742000000000000000000000000000000000000000000006465736300000000 + 0000002C5265666572656E63652056696577696E6720436F6E646974696F6E20 + 696E2049454336313936362D322E3100000000000000000000002C5265666572 + 656E63652056696577696E6720436F6E646974696F6E20696E20494543363139 + 36362D322E310000000000000000000000000000000000000000000000000000 + 76696577000000000013A4FE00145F2E0010CF140003EDCC0004130B00035C9E + 0000000158595A2000000000004C09560050000000571FE76D65617300000000 + 00000001000000000000000000000000000000000000028F0000000273696720 + 000000004352542063757276000000000000040000000005000A000F00140019 + 001E00230028002D00320037003B00400045004A004F00540059005E00630068 + 006D00720077007C00810086008B00900095009A009F00A400A900AE00B200B7 + 00BC00C100C600CB00D000D500DB00E000E500EB00F000F600FB01010107010D + 01130119011F0125012B01320138013E0145014C0152015901600167016E0175 + 017C0183018B0192019A01A101A901B101B901C101C901D101D901E101E901F2 + 01FA0203020C0214021D0226022F02380241024B0254025D02670271027A0284 + 028E029802A202AC02B602C102CB02D502E002EB02F50300030B03160321032D + 03380343034F035A03660372037E038A039603A203AE03BA03C703D303E003EC + 03F9040604130420042D043B0448045504630471047E048C049A04A804B604C4 + 04D304E104F004FE050D051C052B053A05490558056705770586059605A605B5 + 05C505D505E505F6060606160627063706480659066A067B068C069D06AF06C0 + 06D106E306F507070719072B073D074F076107740786079907AC07BF07D207E5 + 07F8080B081F08320846085A086E0882089608AA08BE08D208E708FB09100925 + 093A094F09640979098F09A409BA09CF09E509FB0A110A270A3D0A540A6A0A81 + 0A980AAE0AC50ADC0AF30B0B0B220B390B510B690B800B980BB00BC80BE10BF9 + 0C120C2A0C430C5C0C750C8E0CA70CC00CD90CF30D0D0D260D400D5A0D740D8E + 0DA90DC30DDE0DF80E130E2E0E490E640E7F0E9B0EB60ED20EEE0F090F250F41 + 0F5E0F7A0F960FB30FCF0FEC1009102610431061107E109B10B910D710F51113 + 1131114F116D118C11AA11C911E81207122612451264128412A312C312E31303 + 132313431363138313A413C513E5140614271449146A148B14AD14CE14F01512 + 153415561578159B15BD15E0160316261649166C168F16B216D616FA171D1741 + 1765178917AE17D217F7181B18401865188A18AF18D518FA19201945196B1991 + 19B719DD1A041A2A1A511A771A9E1AC51AEC1B141B3B1B631B8A1BB21BDA1C02 + 1C2A1C521C7B1CA31CCC1CF51D1E1D471D701D991DC31DEC1E161E401E6A1E94 + 1EBE1EE91F131F3E1F691F941FBF1FEA20152041206C209820C420F0211C2148 + 217521A121CE21FB22272255228222AF22DD230A23382366239423C223F0241F + 244D247C24AB24DA250925382568259725C725F726272657268726B726E82718 + 2749277A27AB27DC280D283F287128A228D429062938296B299D29D02A022A35 + 2A682A9B2ACF2B022B362B692B9D2BD12C052C392C6E2CA22CD72D0C2D412D76 + 2DAB2DE12E162E4C2E822EB72EEE2F242F5A2F912FC72FFE3035306C30A430DB + 3112314A318231BA31F2322A3263329B32D4330D3346337F33B833F1342B3465 + 349E34D83513354D358735C235FD3637367236AE36E937243760379C37D73814 + 3850388C38C839053942397F39BC39F93A363A743AB23AEF3B2D3B6B3BAA3BE8 + 3C273C653CA43CE33D223D613DA13DE03E203E603EA03EE03F213F613FA23FE2 + 4023406440A640E74129416A41AC41EE4230427242B542F7433A437D43C04403 + 4447448A44CE45124555459A45DE4622466746AB46F04735477B47C04805484B + 489148D7491D496349A949F04A374A7D4AC44B0C4B534B9A4BE24C2A4C724CBA + 4D024D4A4D934DDC4E254E6E4EB74F004F494F934FDD5027507150BB51065150 + 519B51E65231527C52C75313535F53AA53F65442548F54DB5528557555C2560F + 565C56A956F75744579257E0582F587D58CB591A596959B85A075A565AA65AF5 + 5B455B955BE55C355C865CD65D275D785DC95E1A5E6C5EBD5F0F5F615FB36005 + 605760AA60FC614F61A261F56249629C62F06343639763EB6440649464E9653D + 659265E7663D669266E8673D679367E9683F689668EC6943699A69F16A486A9F + 6AF76B4F6BA76BFF6C576CAF6D086D606DB96E126E6B6EC46F1E6F786FD1702B + 708670E0713A719571F0724B72A67301735D73B87414747074CC7528758575E1 + 763E769B76F8775677B37811786E78CC792A798979E77A467AA57B047B637BC2 + 7C217C817CE17D417DA17E017E627EC27F237F847FE5804780A8810A816B81CD + 8230829282F4835783BA841D848084E3854785AB860E867286D7873B879F8804 + 886988CE8933899989FE8A648ACA8B308B968BFC8C638CCA8D318D988DFF8E66 + 8ECE8F368F9E9006906E90D6913F91A89211927A92E3934D93B69420948A94F4 + 955F95C99634969F970A977597E0984C98B89924999099FC9A689AD59B429BAF + 9C1C9C899CF79D649DD29E409EAE9F1D9F8B9FFAA069A0D8A147A1B6A226A296 + A306A376A3E6A456A4C7A538A5A9A61AA68BA6FDA76EA7E0A852A8C4A937A9A9 + AA1CAA8FAB02AB75ABE9AC5CACD0AD44ADB8AE2DAEA1AF16AF8BB000B075B0EA + B160B1D6B24BB2C2B338B3AEB425B49CB513B58AB601B679B6F0B768B7E0B859 + B8D1B94AB9C2BA3BBAB5BB2EBBA7BC21BC9BBD15BD8FBE0ABE84BEFFBF7ABFF5 + C070C0ECC167C1E3C25FC2DBC358C3D4C451C4CEC54BC5C8C646C6C3C741C7BF + C83DC8BCC93AC9B9CA38CAB7CB36CBB6CC35CCB5CD35CDB5CE36CEB6CF37CFB8 + D039D0BAD13CD1BED23FD2C1D344D3C6D449D4CBD54ED5D1D655D6D8D75CD7E0 + D864D8E8D96CD9F1DA76DAFBDB80DC05DC8ADD10DD96DE1CDEA2DF29DFAFE036 + E0BDE144E1CCE253E2DBE363E3EBE473E4FCE584E60DE696E71FE7A9E832E8BC + E946E9D0EA5BEAE5EB70EBFBEC86ED11ED9CEE28EEB4EF40EFCCF058F0E5F172 + F1FFF28CF319F3A7F434F4C2F550F5DEF66DF6FBF78AF819F8A8F938F9C7FA57 + FAE7FB77FC07FC98FD29FDBAFE4BFEDCFF6DFFFFFFED000C41646F62655F434D + 0002FFEE000E41646F626500648000000001FFDB0084000C08080809080C0909 + 0C110B0A0B11150F0C0C0F1518131315131318110C0C0C0C0C0C110C0C0C0C0C + 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C010D0B0B0D0E0D100E + 0E10140E0E0E14140E0E0E0E14110C0C0C0C0C11110C0C0C0C0C0C110C0C0C0C + 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0CFFC0001108003B00 + A003012200021101031101FFDD0004000AFFC4013F0000010501010101010100 + 000000000000030001020405060708090A0B0100010501010101010100000000 + 000000010002030405060708090A0B1000010401030204020507060805030C33 + 010002110304211231054151611322718132061491A1B14223241552C1623334 + 7282D14307259253F0E1F163733516A2B283264493546445C2A3743617D255E2 + 65F2B384C3D375E3F3462794A485B495C4D4E4F4A5B5C5D5E5F55666768696A6 + B6C6D6E6F637475767778797A7B7C7D7E7F71100020201020404030405060707 + 0605350100021103213112044151617122130532819114A1B14223C152D1F033 + 2462E1728292435315637334F1250616A2B283072635C2D2449354A317644555 + 367465E2F2B384C3D375E3F34694A485B495C4D4E4F4A5B5C5D5E5F556667686 + 96A6B6C6D6E6F62737475767778797A7B7C7FFDA000C03010002110311003F00 + F554924925292492494A496775FEAECE8DD2AECE2DF52C680CA29EF65AF3E9D1 + 576FA563BDFF00B95FE9171F8BFE31B3E863FEDB563E5BAA8F519497D166DFCE + BA9AF2058CCA6B3E85CCAF65947E8FFED3FE9EB7461290B082407D052589D07E + B774BEB973F1E816D192C68B0537B434BD876FE9687B1D657757EFAFE8BFFC23 + 16DA69041A229376A4956CBEA3D3F08D63372A9C637BB6522EB1B597BBF72BF5 + 1CDDEFD7F3567E47D6FF00AB78D916635B9CCF5A971AED6B439FB5E3E9D6E754 + C7B3D467E7B3F31253B292A75F57E9B6F4C7756AF21AFC0656FB5D90D92D0CAF + 77ACEFDEFD1FA6FDED43ABAF748B6DB29194C65948ACDACB66A2DF599EBD2D77 + AE2BF7BAAF7FA7FCE57FE11253A0920333B0ACADF6D77D6FAABFE72C6BDA5ADF + EBB81DAD427757E98D7B5872AA97CEDF7B634FE54ED6A6CA708FCD211F334BA3 + 09CBE5899790B6E2482CCCC4B1BB99756F683B4B9AF6913CEDE7E928FDBF0FD5 + F47D667A9B77C6E1F4676CFF009C971C3F786BE2AE09FEE9D3C1B092832DAEC0 + 4D6E0F03425A41FC8A69C0DECB76524924929FFFD0F55492492529249240A9F3 + FF00AC5D66ECCEAB7B6E86748E9EE7552F6C865ED6BEB6E7DA5BB1EEADD9567E + CE6E2FFE85FF00C1AE5F2BD5B6D75C0372F2FD4DCE70008B1DFBAC65AD6FD1FF + 0006C7D7FD75E8FD53EAE62E4F5236BEB165595B7D6ACC412DF69F6FF2DB66E7 + 7FDB8B96C9E95895160353DAE7E73A9F5AB7B7D3763BADB7D170F52CF65BE835 + 9FA6FA1FA35660634386F4FCD10D244CBAE8E45D7BEAC8C4EA1D2DF5F4ECCA1D + EDADCC7329DDE1FA486D34DADF52BB58DBBF3D7A9F46EA8CEABD3EACB0CF4AC7 + 002EA37071AEC80E754E737FADBEB77F84A5F5DABCF31F07A5753BA8C4B0D8EB + 2DBB258DC57B6E6077A6DDF8DEABF636BB3F45B6EB3D27ECFE6D965BF4D7A1F4 + 6E938BD23019878B532A603B9CDADA1A0B8FD276D606A6E62081A7ABF62AA20F + A6EBC5E3FEB864E0BFABE63B3373F1B199838763609606BEEB3ADF561FCA77EC + BE9D42CFA69FAC7556F2316E78B1F6DE6D3D41D8D26E7D994EB1D8987D72AC6C + 7FE77F48CA98BA9EB9D13EAAF50C9B9B92E6E3753CE67A27259FCE09FD583B6D + 81F437D6D9F62F52CAFF0058AFD4C3AEC59FFF008DF60E651A67D4EA725921D5 + 60E031CEADE357D373313D467B1FEDB58A14B4ECA73ADE91F56BA3609A6EC0EA + 358C9B0E6122CCAB8576F56D9974B5992DAB09D92CAACCFF00D2DF6E47DA198F + FCDFAD65B5ADE9D85475FCBA2FBBA4E4E4E2514B33323ACB2B06EC9BDD767E4E + 455531CCDBFA3B716BAF76FF004286558F4FF34BB9674AC2666E0E531C037A76 + 33F1B1AAD080DB8D03D4DDF4B76CC5F499FF0018878DF57FA7D5766646535999 + 6E7641BDCFBD8C71682CAB1EAC7AE5BFCDD75D15B58929CF38D8581D2B0C574E + 1D1EA9FB5641C0A9ACC77FA553ED6DB5B1BB7D567A9F67F4FD4B3DFF00BE8359 + AEBDF46CB9B65F2F3AEE3B439BB0977ACCF76D6D6C7FB7FD2ADDC9E9F53DED78 + B7D06D551AAA635ACDAC612DF59CD658D733DD5B1957BFF475B102CE838D0C65 + 367A5B776F3B58F2F738B6CF55FBDBFCE7B3FCCFD1FF0036A8F31832CE729C40 + 3DB6BAF97FEFDBD833E28638C0C883FA5BD5FAA43FEE1A0DA29B7A1554520587 + 2EE15E3FA8D04B48FD15AFFA76FD1AA9BDED7D4ADFEC9CA88F43A747FE173FF9 + 359B95F593A2F4CEAAEC4CA7656464749A9A1ECAB1DCF633D46B3F5873A96FD2 + 7B2EAAAFF8343B7EBC74DCC751F62B73EA17878A5B56197FAA5BFCE7A7EA56FF + 00E6B6B93A3CB0E1065124811808C08DA3D7E6FDF94FF4D69E64F15466009194 + CCA62475974F978BE48C3F43E77A0E8A58FC06DADA6AA0BDCFDC296ED638B5CE + A859B7F96D62BEB0FEADF5FE91D43774EE9C2E6BB06BACBDB7D6EADDB5FB831C + 77FE73B62DC5671C4C61189DC44035FBDD5AD9642592521746448BFDDFD15249 + 249EB1FFD1F554965FA5F59FFEE4E0FF00EC3DBFFBD697A5F59FFEE4E0FF00EC + 3DBFFBD69FC03F7E3FF3BFEF56F11FDD3F83A892CBF4BEB3FF00DC9C1FFD87B7 + FF007AD2F4BEB3FF00DC9C1FFD87B7FF007AD2F6C7EFC7FE77FDEAB88FEE9FC1 + D0BE917566B2E7324101ED30E1236CB4FCD63E57D53C3CAB18FBAEB1CD63D8F3 + 510CD8EF4CEEAEB73767F35B9ACDED6FF83FD17F37BD58F4BEB3FF00DC9C1FFD + 87B7FF007AD2F4BEB3FF00DC9C1FFD87B7FF007AD11131DB2447F8DFF7A826F7 + 81FC16E9BF57F17073AFEA05EFC8CBC81B4DB644B5BF4BD366D1F9CFF7BD6AAC + BF4BEB3FFDC9C1FF00D87B7FF7AD2F4BEB3FFDC9C1FF00D87B7FF7AD230B3672 + 44FF008DFF007AA06B4113F8303D01CD39029CCB29AF2C59F680D6D65CE7586F + 76E6DAE639D5B5BF6AFE6D9FE869FE6FF59FB4D73F53BA79C963F7463561ED66 + 236BADB586DAEB0DF46D6307EAF75377A1655B7FEFEADFA7F59BFEE4E0FF00EC + 3DBFFBD69BD3FACDFF0072707FF61EDFFDEB43DB1FBF1FF9DFF7A9E23FBA7F07 + 2CFD4C73F2720BAEA9B8AFAC534B7D163DE58F34BF268BF780C6623DD8DB6AC6 + C6F47D2F5ADF4BD2565DF53F1DEE76FC873AB2F25B57A75ED6545F6E47A54FB7 + F45732DC8B7D1CC67E9B1E97ECA3D2FE715BF4FEB37FDCAC1FFD87B7FF007AD3 + FA5F59FF00EE4E0FFEC3DBFF00BD69700FDF8FFCEFFBD5711FDD3F835B37EAC3 + 736E7645D93BED732B6973E9ADFAB2039BFA46BBF55B23D5FB1FF33F69FD3A9E + 17D54E9B85974E65526FA0822D73585EE01B9348165DB3D67FE872D957D3FA18 + 98C8DE97D67FFB9383FF00B0F6FF00EF5A5E97D67FFB9383FF00B0F6FF00EF5A + 5C03F7E3FF003BFEF55C47F74FE0E2F54FA97D4B2FADE7F53C5EA35D15E7B18C + 34594BACDAE6575D55DF2DC8A98FB69B29F5EADF56C43A7EA5F5BA9B88C3D471 + AC660C7A4D7E35BEEDAD3437ED1B7347AFB687D95337FD0DFF00E916F7A5F59F + FEE4E0FF00EC3DBFFBD697A5F59FFEE4E0FF00EC3DBFFBD68F00FDF8FF00CEFF + 00BD5711FDD3F834FA07D5CCCE9BD5737A9E66557916E757556E6D553AB68356 + FF007FE96FC9FA7BFDFF00F09FA4FF0008BA0597E97D67FF00B9383FFB0F6FFE + F5A5E97D67FF00B9383FFB0F6FFEF5A1C03F7E3FF3BFEF55C47F74FE0EA24B2F + D2FACFFF0072707FF61EDFFDEB4BD2FACFFF0072707FF61EDFFDEB4B807EFC7F + E77FDEAB88FEE9FC1FFFD2F554924925292492494A4924925293274925293484 + E924A5A427492494A4924925292492494A4924925292492494FF00FFD9003842 + 494D042100000000005500000001010000000F00410064006F00620065002000 + 500068006F0074006F00730068006F00700000001300410064006F0062006500 + 2000500068006F0074006F00730068006F007000200043005300360000000100 + 3842494D0FA000000000011C6D616E6949524652000001103842494D416E4473 + 000000F000000010000000010000000000006E756C6C00000003000000004146 + 53746C6F6E6700000000000000004672496E566C4C73000000014F626A630000 + 00010000000000006E756C6C0000000300000000467249446C6F6E6770613B6B + 000000004672446C6C6F6E67000003E80000000046724741646F7562403E0000 + 000000000000000046537473566C4C73000000014F626A630000000100000000 + 00006E756C6C0000000400000000467349446C6F6E6700000000000000004146 + 726D6C6F6E67000000000000000046734672566C4C73000000016C6F6E677061 + 3B6B000000004C436E746C6F6E670000000100003842494D526F6C6C00000008 + 00000000000000003842494D0FA100000000001C6D6672690000000200000010 + 000000010000000000000001000000003842494D040600000000000700040000 + 00010100FFE11360687474703A2F2F6E732E61646F62652E636F6D2F7861702F + 312E302F003C3F787061636B657420626567696E3D22EFBBBF222069643D2257 + 354D304D7043656869487A7265537A4E54637A6B633964223F3E203C783A786D + 706D65746120786D6C6E733A783D2261646F62653A6E733A6D6574612F222078 + 3A786D70746B3D2241646F626520584D5020436F726520352E332D6330313120 + 36362E3134353636312C20323031322F30322F30362D31343A35363A32372020 + 202020202020223E203C7264663A52444620786D6C6E733A7264663D22687474 + 703A2F2F7777772E77332E6F72672F313939392F30322F32322D7264662D7379 + 6E7461782D6E7323223E203C7264663A4465736372697074696F6E207264663A + 61626F75743D222220786D6C6E733A6372733D22687474703A2F2F6E732E6164 + 6F62652E636F6D2F63616D6572612D7261772D73657474696E67732F312E302F + 2220786D6C6E733A70686F746F73686F703D22687474703A2F2F6E732E61646F + 62652E636F6D2F70686F746F73686F702F312E302F2220786D6C6E733A786D70 + 3D22687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F2220 + 786D6C6E733A64633D22687474703A2F2F7075726C2E6F72672F64632F656C65 + 6D656E74732F312E312F2220786D6C6E733A786D704D4D3D22687474703A2F2F + 6E732E61646F62652E636F6D2F7861702F312E302F6D6D2F2220786D6C6E733A + 73744576743D22687474703A2F2F6E732E61646F62652E636F6D2F7861702F31 + 2E302F73547970652F5265736F757263654576656E74232220786D6C6E733A73 + 745265663D22687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E + 302F73547970652F5265736F757263655265662322206372733A416C72656164 + 794170706C6965643D2254727565222070686F746F73686F703A4C6567616379 + 495054434469676573743D223534434137363135314134453846323839334437 + 464543374238413531394332222070686F746F73686F703A436F6C6F724D6F64 + 653D22332220786D703A437265617465446174653D22323031322D30382D3135 + 5432313A34373A33342B30383A30302220786D703A4D6F64696679446174653D + 22323031352D30372D31315431383A33323A34372B30383A30302220786D703A + 4D65746164617461446174653D22323031352D30372D31315431383A33323A34 + 372B30383A30302220786D703A43726561746F72546F6F6C3D2241646F626520 + 50686F746F73686F70204353352057696E646F7773222064633A666F726D6174 + 3D22696D6167652F6A7065672220786D704D4D3A496E7374616E636549443D22 + 786D702E6969643A353445423542324342383237453531314231393042343639 + 33373342314446322220786D704D4D3A446F63756D656E7449443D22786D702E + 6469643A39414442374546454230453745313131423744324431423336394646 + 323531372220786D704D4D3A4F726967696E616C446F63756D656E7449443D22 + 786D702E6469643A394144423745464542304537453131314237443244314233 + 3639464632353137223E203C786D704D4D3A486973746F72793E203C7264663A + 5365713E203C7264663A6C692073744576743A616374696F6E3D227361766564 + 222073744576743A696E7374616E636549443D22786D702E6969643A39414442 + 3745464542304537453131314237443244314233363946463235313722207374 + 4576743A7768656E3D22323031322D30382D31365432323A35323A35372B3038 + 3A3030222073744576743A736F6674776172654167656E743D2241646F626520 + 50686F746F73686F70204353352057696E646F7773222073744576743A636861 + 6E6765643D222F222F3E203C7264663A6C692073744576743A616374696F6E3D + 227361766564222073744576743A696E7374616E636549443D22786D702E6969 + 643A383141363733333534454346453231313831303438454330333638423932 + 3137222073744576743A7768656E3D22323031332D30362D30375431363A3438 + 3A35342B30383A3030222073744576743A736F6674776172654167656E743D22 + 41646F62652050686F746F73686F70204353352057696E646F77732220737445 + 76743A6368616E6765643D222F222F3E203C7264663A6C692073744576743A61 + 6374696F6E3D22636F6E766572746564222073744576743A706172616D657465 + 72733D2266726F6D20696D6167652F6A70656720746F206170706C6963617469 + 6F6E2F766E642E61646F62652E70686F746F73686F70222F3E203C7264663A6C + 692073744576743A616374696F6E3D2264657269766564222073744576743A70 + 6172616D65746572733D22636F6E7665727465642066726F6D20696D6167652F + 6A70656720746F206170706C69636174696F6E2F766E642E61646F62652E7068 + 6F746F73686F70222F3E203C7264663A6C692073744576743A616374696F6E3D + 227361766564222073744576743A696E7374616E636549443D22786D702E6969 + 643A383241363733333534454346453231313831303438454330333638423932 + 3137222073744576743A7768656E3D22323031332D30362D30375431363A3438 + 3A35342B30383A3030222073744576743A736F6674776172654167656E743D22 + 41646F62652050686F746F73686F70204353352057696E646F77732220737445 + 76743A6368616E6765643D222F222F3E203C7264663A6C692073744576743A61 + 6374696F6E3D227361766564222073744576743A696E7374616E636549443D22 + 786D702E6969643A353345423542324342383237453531314231393042343639 + 3337334231444632222073744576743A7768656E3D22323031352D30372D3131 + 5431383A33323A34372B30383A3030222073744576743A736F66747761726541 + 67656E743D2241646F62652050686F746F73686F7020435336202857696E646F + 777329222073744576743A6368616E6765643D222F222F3E203C7264663A6C69 + 2073744576743A616374696F6E3D22636F6E766572746564222073744576743A + 706172616D65746572733D2266726F6D206170706C69636174696F6E2F766E64 + 2E61646F62652E70686F746F73686F7020746F20696D6167652F6A706567222F + 3E203C7264663A6C692073744576743A616374696F6E3D226465726976656422 + 2073744576743A706172616D65746572733D22636F6E7665727465642066726F + 6D206170706C69636174696F6E2F766E642E61646F62652E70686F746F73686F + 7020746F20696D6167652F6A706567222F3E203C7264663A6C69207374457674 + 3A616374696F6E3D227361766564222073744576743A696E7374616E63654944 + 3D22786D702E6969643A35344542354232434238323745353131423139304234 + 36393337334231444632222073744576743A7768656E3D22323031352D30372D + 31315431383A33323A34372B30383A3030222073744576743A736F6674776172 + 654167656E743D2241646F62652050686F746F73686F7020435336202857696E + 646F777329222073744576743A6368616E6765643D222F222F3E203C2F726466 + 3A5365713E203C2F786D704D4D3A486973746F72793E203C786D704D4D3A4465 + 726976656446726F6D2073745265663A696E7374616E636549443D22786D702E + 6969643A35334542354232434238323745353131423139304234363933373342 + 31444632222073745265663A646F63756D656E7449443D22786D702E6469643A + 3941444237454645423045374531313142374432443142333639464632353137 + 222073745265663A6F726967696E616C446F63756D656E7449443D22786D702E + 6469643A39414442374546454230453745313131423744324431423336394646 + 32353137222F3E203C2F7264663A4465736372697074696F6E3E203C2F726466 + 3A5244463E203C2F783A786D706D6574613E2020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 2020202020202020202020202020202020202020202020202020202020202020 + 202020202020202020202020202020202020203C3F787061636B657420656E64 + 3D2277223F3EFFEE000E41646F626500640000000001FFDB0084000604040405 + 040605050609060506090B080606080B0C0A0A0B0A0A0C100C0C0C0C0C0C100C + 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C010707070D + 0C0D18101018140E0E0E14140E0E0E0E14110C0C0C0C0C11110C0C0C0C0C0C11 + 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0CFFC00011 + 080094019003011100021101031101FFDD00040032FFC401A200000007010101 + 01010000000000000000040503020601000708090A0B01000202030101010101 + 00000000000000010002030405060708090A0B10000201030302040206070304 + 02060273010203110400052112314151061361227181143291A10715B14223C1 + 52D1E1331662F0247282F12543345392A2B26373C235442793A3B33617546474 + C3D2E2082683090A181984944546A4B456D355281AF2E3F3C4D4E4F465758595 + A5B5C5D5E5F566768696A6B6C6D6E6F637475767778797A7B7C7D7E7F7384858 + 68788898A8B8C8D8E8F82939495969798999A9B9C9D9E9F92A3A4A5A6A7A8A9A + AABACADAEAFA110002020102030505040506040803036D010002110304211231 + 4105511361220671819132A1B1F014C1D1E1234215526272F133243443821692 + 5325A263B2C20773D235E2448317549308090A18192636451A2764745537F2A3 + B3C32829D3E3F38494A4B4C4D4E4F465758595A5B5C5D5E5F5465666768696A6 + B6C6D6E6F6475767778797A7B7C7D7E7F738485868788898A8B8C8D8E8F83949 + 5969798999A9B9C9D9E9F92A3A4A5A6A7A8A9AAABACADAEAFAFFDA000C030100 + 02110311003F00F54E2AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762 + AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5 + 5D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8A + BB15762AEC55FFD0F54E2AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB157 + 62AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AE + C55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D + 8ABB15762AEC55FFD1F54E2AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB1 + 5762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762 + AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5 + 5D8ABB15762AEC55FFD2F54E2AEC55D8ABB15762AEC55D80ABB02BB15762AEC5 + 5D8ABC67F31FF3B351D23CCB2693A12C2F1591115D5C381206BB2399B6236E1F + BA0DE9BFED4A8F1FF2F2CBC180487ABF8BE969C9908E4A5A77FCE46886DA2B9D + 6F4763632B7A6B7F62DC90301528D1C9F65E9F171F53272D11E8588CFDE19E68 + 9F9B3E42D61A38E1D523B6B894724B7BB06DDC8EBB73A2B7FB16CC79E09C7986 + D19227AB2D8E58E58D648DC3C6C2AAEA41047B1194B35D8ABB15762AEC55D885 + 76495D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5 + 5D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55FFD3F54E2AEC55D8AB + B15762AEC55D80ABB02BB15762AEC558BFE63F9BA3F2B795AEF5007FD28A14B5 + 502A4C8D45040EF42C3FEB9CB31438A54C672A0F94B4FB4B986C26BEB981AEE5 + D41CCB7D306E9273E71B91B9AC4E1591B3706A31E4E340091DCBADBCEB7FA5EA + D7973A969B05E691A99116B7A405E10BD77592203FB97FF7644EBF65BE1CABC4 + E2F272461872083D7574D48C5D68178F71A52B092DA597FDEAB2604B2C7381F6 + E2563FDE0FD9FB5975EDBB8928709A289D3B5BF3669F651EB1E5ED52E74B1348 + D14B6D0CA4A25C250C91B444942BB878EABF146EB909628CC6E1788C4BDF3F25 + 7F372F3CC6A741F31CD13F98614F5239E34F4D6741F6871FB3EAC6376E3F0B2F + FAB9AED469F8371C9C8C79389EB998CDAEC55D8ABB10AC33CD5F9C7F96BE55D4 + 8E99AEEB71DADFA80CF6C914F70E8080473F42397D3241A80FC724A89B1FCCEF + 22EA1E53BFF3569DA9A5DE8BA623BDDCB1ABABA18D791531481240EDB7052BF1 + 7ECE2AF39B6FF9C95BCBF885D693E40D6EFAC2427D0BA8D1995C0343BC71C89D + 46FC5DB1555FFA187F30FF00E5B5D7BFE454BFF54715643F969F9D561E75F305 + F79765D16F744D62C603752DB5DFFBEC3221AD423A3D654F8593ECB62AF4AA0C + 55E71A07E6ADE6BDF9BBAB793F4CB28A6D0F45B76FAFEA819B98BB5655282954 + E21CBC5C08E7CD1DF9714E2CAA5BA6FE7B69377F99FAD7972EAEB4DD3BCB7A3C + 463FD29797496F24B78ACAAE91891951D15BD44F847FBAFD4E7F1AAE2ACCFF00 + E567FE5AFF00D4DBA37FDC42D7FEAA62AEFF00959FF96BFF00536E8DFF00710B + 5FFAA98AB203345E97AC1D7D1E3CC4A08E3C7AD6BD2847ED6026940B489FCFBE + 568DCA1BDE45762563908FA0F1DFFD8E6AE5DB5A506B8BEC97FC4BB28F63EA48 + BE1FB6284BFF00CC2F2FC56B2496B21BAB8503D380A489535FE764E2329CBDBB + A78C4981E397F0C7D51E3FF3B85BB1761E7320243823FC52B8CBFD8F135A7FE6 + 2E8335A2497929B5B835F5200B2481773C7E209BF25F8B061EDDC1280333C12F + E28D4A5FECB8573761E71322238E3FC32B8C7FD8F122BFE5607957FE5ACFFC8A + 97FE69CBBF9734BFCEFF00632FF8961FC89A9FE6FF00B28A6D71AB69B6D1C725 + CDCC7024C2B134AC1396C0EDCBE799D93538E00194A3012FA78BD3FEE9D7E3D3 + E49922313331FAB87D5FEE54BFC4DE5EFF00AB9DB7FC8D4FEB95FF002869FF00 + 9F0FF4CDDFC9F9FF00993FF4B249B5DF3EE9BA7087EA9E9EA2652DCBD2954040 + 29B9203F5AE60EB3B6B1E2AE0E1CC65FCD9FFD26E668FB1B265278F8B0F0FF00 + 3A3F57FB94E7FC4DE5EFFAB9DB7FC8D4FEB99DFCA1A7FE7C3FD3387FC9F9FF00 + 993FF4B277F89BCBDFF573B6FF0091A9FD71FE50D3FF003E1FE997F93F3FF327 + FE96498AB2B286520A91504742332C171085F855D8ABB15762AEC55D8ABB1576 + 2AFF00FFD4F54E2AEC55D8ABB15762AEC55D80ABB02BB15762AB649238A36924 + 6091A02CEEC680002A4938ABE7EF3779D74EF3FBA43A648631A76A3716B790CC + 42F1F4F8ADB4869D23747924FF0059DD7F63361A5C744DB8D9A4945EDF699A14 + 3716F3C8B3DE346E1946EB56041763FC9E1FCD995972506AC58CC8DBCFE6D3A6 + B8B637CE5C4A7896B5A903EAC9520103FDD801327FC266263FA9D9C45B7A4D96 + 852DFA1BC334567213CA5B761EA203FB43987AD3BAE65095B1C9013F7B2E9BC8 + 3A7E9F631CDA5DD0BA82E56A5A4223A05256392A9C9760597745F87E1C90B0EB + 65CE8B0B835A4D03CC114AE65B0D4B4F943A7314A30DC159139AB2B0FDAFB2CB + 825922454922321B87D6DF975E7AD37CE1E5E8B51B592333A523BD86360DE9CC + 0548FF0055BED266A324384D39919586539064EC55C480093B01D4E215F34FE5 + 069DE58D7CFE647E62F98F4EB4D5AC85DCF35A7D7E08E748E38564B97E2240C0 + 7EEDE05DBECAAE4958658B9D13FE718352B876E13F9AF5A4862E038D6280AB11 + 41B01CADA5FF0082E38ABD3FCB9A37FCE4F689A0E9FA4E9E9A147656304705BA + 4952E111401CCFF3FF0037F958AA604FFCE5600493E5F006E49AE2A947FCE31F + E94D6FCC9E76F386ACD14B7D773C56867847C05D793CBC2BFEEBA0838E2ACF3F + 3BBF34ED7C85E5492485D5B5FD415A1D26DCD090D4A34EC3FDF70D6BFE53F04C + 55E656179FF2A87F27E292166BAFCC2F3BF19A045F8E7124EA381A5199FEAEB2 + 7F95CEEA5E3F65B1561DE6EFC9ED2F405FCBDF2E5CC0D379B7CC979CB5BBA592 + 46E11BC912FA417970A47EAB72942F2FDDBB73E38ABDDFFE85B7F25BFEA5DFFA + 7CBFFF00AAF8ABBFE85B7F25BFEA5DFF00A7CBFF00FAAF8AA77E7C30697E528E + C2CE2586D8B476B0C4838AC7146A595540FD9023099A5EDDCBC3A723F9F211FF + 007DFEF5DC761E212D4027F80717FBDFF7CC72F2CBEA46D6C6D4D847325909AE + 619E113CA6411B4D216731481760782B3FD955FE6CD365C3E1F0C23E0D8C7C52 + 8E4878B3E2E19659F14E50970FF463C5F4F0FF0039DAE2CBE2714E5E291E2F0C + 6519F870E1E28E287A2338717F4A5C3F5717F352CD26CAED34E17BEAD9456F3C + DE8C66EE0F59CC8A2BF00F4A7A75FF0027E2CC3D2E198C7C778C4672E18F890F + 165C5FD0FDDE5F4B9BA9CB139382B24A518F14BC39F871E1FE97AF1275E66B7F + ABEA5716B69FA322F42DBD5783EAAA64F863E4E6BE8B2A337EC2FABFCB9B1ED0 + 870E49461E0FA21C5C3E1C78FD31E297F939463297F0FABF9AEBF413E2C6253F + 18F1CF878BC49707AA5C30FF0029194A31FE2F47F392AD02CEE09B3844D62BF5 + E72F0C7750092420394347689947229C513D55F8FF00D6CC2D16297A45E21E21 + E28C72438A52F570FD5284BF9B3E18F1FD5FD67335B963523594F8638652C73E + 08FD3C5F4C7247F9DEA9707D3FD57A46BBE5FD2B56F44DF86E16C18A156E2006 + A56BFF00039D6EB3418B3D1C9CA1FE6FD5C3FF0012F2BA4D765C1621CE7FE77D + 3FF49305F27F96749D625BDB9B8574B38DF8DAC5CE87724EE7BF15E19CD765F6 + 7E2CE672958C60F0C63C5F8FA63C2F47DA9AFCBA7118C68CC8F5CABF1F54B899 + 4FFCABDF2AFF00C59FF237371FC85A6F3FF4CEABF96F53E5FE95DFF2AF7CABFF + 00167FC8DC7F90B4DE7FE997F96F53E5FE95C3F2E7CB0C2A12523C448711D83A + 6EE97FA6627B7353DF1FF4ACA8000506C066EDD3B78ABB15762AEC55D8ABB157 + 62AEC55FFFD5F54E2AEC55D8ABB15762AEC55D80ABB02BB15762AF24FCFF00F3 + 95DD9E8A3CB3A4DC7D5F51D4D7FD2EE1480F0DB56842F83CB4A0FE55CC9D361E + 237D1AB24EB67855847A3F943CCDE5BB8D0E392E6CAF6CFEA7E6AB68B94A913F + 32166121F859C06F51B8FD9FB39991C6626C0D9A49046ECC7CD5E5AB2BBD66E2 + EACAEA20B1C6B24B14B22A094803808C92016E1C5997FD5FE6C72C3AB2C13E8C + 58CCC03153B9D87F1C118D0F3736374C775369B4E93D68D0B5BB9DD1454AFC80 + F0CB2037DDB2312CD3CB3AE4090C296974B245222CAF652B213BED201D1D5A9B + 85CC823661974E25B91BA0FCCDE5ED367B99383C72C45DD63756054806BC46FF + 000F1AE031B1BBAE9E2940F25DF96FAA6B1E41F33C57F6DCE5D22EC88B51B4AE + CF193B3AFF00C591FDA4FF0081FDACC5CDA4B1B2619AB9BEB9B1BDB7BDB48AEA + D9C4B04CA1E390742A7A66A88A345CB055F15635F999AD3E89F97DE61D52360B + 35B584E6063D04AC8563FF00928CB8ABC2EC6BE56FF9C46B89B8FA577AE97DBA + 16FADDC886BF4DA47CB24A95F9A354F237FCABBF2C7E5A5F69DAADF6B3A6DA5B + EA77034748D9EDE7BA88CCE8E1C373AFD67948157F93F798AB19000141FE3EA6 + 2AB668E192178E65F3E3C2EA5644700A952284303B10475C55EFBFF38EEFE513 + F96933F9321B9012EA65BA1A89512BDE8890FC4D1D53D3F4CC3C780F857FCBE5 + 8ABC3FF34BC89E73BAF35797EEBCEF7A8FE65F36EA02CE0B0B521A2B4B449238 + D555B71BBCFF00BB55E5F659E4692491B8AAF7DF2FFE4E083F312F7CEDE62D47 + F4C5E2318F40B531F08ACADD49F494024D5E343C529C7E2E72FC523F2555E77F + 985E5E6FCC4FF9C8C8BCBA9A84FA7C3A1696AF3DCDA9A4B1B50CD543FB2CCD73 + 0AB362AC9BFE85AFFEFF009D7FFE47FF006E2ACEBF2EBF2F0792ED2F20FD35A8 + 6B26F24490BEA12FA9E984522918FD9E55F8FF009BE1FE5C5505F98DFE97A8E8 + DA5AB50CF29E6BFEBB2A21FF0089E735DBBEBC98B1DFD67FDD4A318FFBE7A1EC + 3F463CB908FA47FB98CA52FF007883D67548E6D4B58B6D1F4A92EAFA55FABDDD + F0E6E428F81D4201F0AFC3C7ED2F2FF6394EAB5225932C70E333C87F779327AA + 5FD194787F863E9E1FAA0DDA4D398E3C72CD904203F798F1FD3FD28CB8BF8A5E + AE2FA5083503A7E97651DFF9726F4AC1C3C73492C91A9958F2248F4F8F51F65B + 9FC3F0E51E3F858A032619D633C5194A528FAA5EAFE6FF00B1971370C1E2E491 + 8668DE41C328C63197A23E9FE77FB28F0A20DF3DDC7773A795AE5FF498066B95 + 99CB3A121C046F4F646FF23ED2FF00B1CB7C633123E04FF7DF54B8A5EA8FD5E9 + 9707D3FD56AF0840C478F0FDCFD31E18FA65F4FAA3C7F57F5917E5B9746D4751 + 834E97497B2BBD214C901772CC2920243EC9FB6FC9792B7ED7D8FDAC8D04B0E5 + 9C719C671CF07AA3C5EAFE2FF37F8A7C4D1DA11CD8A0720C832473FA65C31E1F + E1FE1FABF863FF004927FE78D4059796EEC8A092E07D5E307BFABB37FC2736CD + 8F6C67F0F4F2EF9FEEE3FE7FD5FEC789C0EC9C1E26A23DD0FDE4BFCCFA7FD970 + B19D1FF2E2DAF34CB6B9B8BB9239678C4863551450FB81BFF939A7D2F60C7263 + 8CA523731C5C3FD676BA9EDE94324A3188A81E1E2FEAA37FE55669FF00F2DD2F + FC0A6647FA1CC7FCF3F28B57FA229FF363F393BFE55669FF00F2DD2FFC0A63FE + 8731FF003CFCA2BFE88A7FCD8FCE480F24C13D879BEFF4D82732DAC292092B50 + 0F0755078FD9E6A4F1FF0082CC7EC881C5AB9E389E2881EAFF0036518FD3FCEF + F8F36F6B4C65D2C724854A463C3FE7478BEAFE67FC75E939D63CC3B15762AEC5 + 5D8ABB15762AEC55D8ABFFD6F54E2AEC55D8ABB15762AEC55D80ABB02BB15762 + AF13FCE1F2E4C3CCC9AAA8F523BA8D17E2150AF18E3C687DB89CD9E8A60C787B + 9C4D444836C445E30F2D5F4AD6F134D3C9F52D2921454324E0FEF5C903FBA8D7 + 67FF002B32E71A9001A61B836C0AD34EBFB437B697459A7858AC7230A7346248 + 61F4B6629D8EEECF09B8844451C91B34520E2E9D464816E011B6490C5217B88C + BF3460B4A552A3E13BEDD7771FCB86DB80D9564D36C6428CD6F13331146D908F + A4532038BBD2624251AEDBE9D02B4714BE995A733CBD40A7D81F01FE565D032E + ABC55DE82D33CE9E62B8BB4862D3A4D76184044B5502DD140140CCEA085E9FB6 + 71333D06EEB33E111DC9E6FA6BF24AEBCD375A1DEDC6BB0A5AA4938363668EB2 + 18E3E346E4EAA8A7930EDFB5F17ED66B75247179FF0012310DBC9E8F98EDAF25 + FF009CA3B9BC8BF28EF62B785E58EE6EAD63BA65A5238964F579B7F93EA471A7 + FACEB88579079BBCF5A079F7CB7E46FCB3F29C37AE209ACE2BD778C2B0114420 + A80A5F9503C92C8E7E05E3CB24A8FF0021EADF99537E63F9D3CD7E48F2E5B6BB + 0CD752587AB34F1C0B1411C9FBA44F52588B728A38B953F97157A37F8CFF00E7 + 263FF2DFE9FF00F49F6FFF006538AA4BE74FCC4FF9C82D3BCA9AADD6AFE4CB0D + 3B4E16CF1DC5F2DE432342261E907545B876660CE3880B8AB31FF9C70D15B4AF + CA2D1BD45E335F99AF641E22695BD33F4C2B1E2AC5BCC84F98BFE729B40D3D1C + 3DB79674F375731F5E12B2BC80FCC996D7157BB62AF95FC987F35B5CFCC9F3BF + 9B7C8C9A7B192F64B192E2FEB4F4564FDD247FF3CE28B9FF00B1C559FF00FD65 + 6FFDA83F1C55E97E49FF00190F2EC3FE3136A75DE527ADF51AFA5C391F4C6FFB + 5C7AD3154835064BEFCCDB484AD56CD1797CD636981FF8274CE6737EF3B46208 + DB18FF00731964FF0075283D1E1FDDF674A5FEA87FDD4A38BFDCC6490DDF97B5 + 1D2CDDDE6ADA745770172C2E0DC08C56A58F00AE8CDCBF97873CD6E5D0E4C265 + 3CB08CC5FD5C7C3FE97865194B8FF9BC3C4EC316BB1E6118E29CA06BE9E0E3FF + 004DC519463C3FCEE2E1414FA735F69C97B69A647636DEA70FAC4973C439A7D8 + 1EB3AD7FD65FF8D5B31E783C4C62708471C6F878A53E0E2FE8FEF65FEE5C8867 + 18F2184F24B24AB8B8630FA7FA5FBA8FFBA4C23D224F56DEDBF404324F709CE1 + 02F6A5D145798A49D332A3A43718F820CA438A3FBEFAA3FCEFADC63AB152978B + 20207865FBAFA65FCCFA13DF21797E6B5BBBDD426F490B56DE3821904BE9FC41 + DD09567E3C688BC5999FF9FF00CAD9F63688C252C86BFD4F863EBE0F5714A32E + 194FE9F4FF001717F39D5F6D6B44E3180E23FE538A51E0E2F4F0C251DA3F57AB + F8787F9AB3CF25B53F30695A14752ACC249F8EFB39A569FCD1A23B7FAAD91ED8 + 2736A31E01FD697F9DFF001318CA5FE7367640F07064CE7FAB1FF37FE2E728C7 + FCD678AA14055140360076CE90079D2BB0AAD240049D80DC9C4950181FE5C56E + F51D635375A3CAE389FF008CAECEE3F04CE63B07D7932E423791FF0077294E5F + EF5E93B73D18F1E31C80FF007118C23FEF99F674EF36EC55D8ABB15762AEC55D + 8ABB15762AFF00FFD7F54E2AEC55D8ABB15762AEC55D80ABB02BB15762A9079C + F42FD2FA3CF6E8DE9CECA7D194004A3D080457E74C9E3998CAC31946C53CC6D3 + CB96CAF0DBAA7116D17A56A9DA38C6E7AFED39F89FF6B36A72DEEE270AA79DBC + BD2DBFE5BEAB736F1AC9736A56756A03F02489CF7FF541CAA592CD37E08FA825 + DA07953CB5E62D12CB519ED1519EDE3F5E688957F50023E2DFFBCAFDB523F672 + 00002996599132C574AF2E5B5D798E7D3A677305BB4BCDD2819846683C78D6A3 + 088B7E49F0C388222E349B4B5F34B688B0BDCCAC0C3690173FDEFA61B9C8E94F + DDC752EFFE4AE3567C989CD230BEABEF3C81633F9CF4ED3A78C43626D8C92FEC + 96E01CBCB21EC588AFFC2AE59C418024E33EF64FA4795ED26BE16F636E2DF4C8 + 9BF751280BC8034E469DCD3AFF0037FA8D8E7CFC11A1F538B0C7C477E4F61D0F + 4F4B2B311AA85A81B0E8001403354E62638AB4CAACA55802A45083B820E21548 + 5A5B286F4E358998152F1A85615F0206495E09E5EFC8AFCE0F28477561E52F3A + DB596973CC67E0F6E0BB3150BC983472D1B8AAAFC2DC7154DBFC03FF0039255A + 7FCAC1B4FF00A454FF00B27C552DF307E4C7E78F99F4F3A47987CF76D71A4CAE + 8D710A41C79706E4B558E3879F161C8233F1E5C7157B7E85A45AE8BA269FA3DA + 7236BA75B4569016DD8A428114B7F9442EF8AB07F28FE59EA5A57E6B79ABCEFA + 8DCC338D5D160D3638F9F34869196F53900A0FEE9107166FB3CBFC9C55E8178B + 70F693A5B304B968DC42ED5E21CA90A4D3C1B15603F917F96D7FE40F263E97A9 + 4914BA95D5D497774D6ECCF18E4AB1A2AB32A13448C13F0FDA66C55E895C554A + E7D5303FA34F5687872E95ED5F6C8CAE8D734C6AC5F262BA3793EFB4DB6BDB91 + 7465D6EEE3645BA7A954E5EEDC998F21CB932FFB0FB5CB4DA5ECC9E28CA5C5C5 + 9F24787C497F0FFC57F5BFD8FF003F6BA9ED28659463C3C382078B87F8A5FF00 + 13FD5FF65FCC4A2F20CF753ACFAEEA336A1C3ECC00954F715279716FE55E3FEB + 6570EC5332259E67357F0FF0FE3FABC0DB2ED7108F0E18471FF4BF8BF1FD6E24 + C7CD3E5A7D5B478AC2CB85B0824592342B44A2AB2F1F87A7DBCCAED1D01CF884 + 2150E097147FD2CA3FC3FD6717B3B5C30E6339DCF8870CBFE2BD5F57D290DDF9 + 2FCDB76235B9BCB297D1411C45A252428E82BE95735B97B2B5792B8A58E5C238 + 63E9FE1FF956ECB1F6A69617C31C8388F14BD52FABFE56275A0E8FADE9BA55DC + 124D6E6E181366218D638D5B8D017E11A13C9BED3716F87365A2D2E6C58A5126 + 1C47FBBE1118C232E1FE2E08C7F8BEAFA9D6EB355872E48C809F0FF94E2329CE + 51E2FE1E294BF854FCB9E51934FBA7D4F52B8FAE6A920A7AA6AC12BB1A337C44 + D3E1E5F0FC1F0657A0ECB38A47264978994FF17F37FCE97ABFDCFA7D2D9AFED3 + 196231E38F87887F0FF3BFCD8FA7FDD7ABD4CAF372EA923F32D86B57B6290E93 + 722D6E3D40CF29764AA007E1AA063D4AE6BBB430E6C900314B8257EA95F07A7F + CD8C9CDD066C58E77963C71AFA7EAF57F9CC625F27F9E668DA29F58578641C64 + 533CC4153D4538669CF65EB6428E5DBF8BD73FF897703B4F44378E2DFF0087D1 + 0FF8A655E5CD06DB45D385AC24C8CCC5E695850B3900569DB65FB39BCD0E8E3A + 7C7C237FE294BF9D274BAED64B51938C8AFE18C7F9B14E7335C4762AEC55D8AB + B15762AEC55D8ABB157FFFD0F54E2AEC55D8ABB15762AEC55D80ABB02BB15762 + AD3A0652A7A1C558A5CE8F1A6A331028D28E483DC9F8FF005F2FF64FFCB97E3C + 9B535CA3D50BE6D4B5B6F295C585C8E4D7B1B40B1FFAFF00698D3AF0AFFB26E2 + BFB596C2E52D917C3BB00B7F2DC9676505B25ECF6C628D228E2818215551B733 + D19FF69BFCACCBDB9344A449B2C634183D0F386AC6E357B9B482DE3999E7FDCC + AC7E25A82194EE6B8889BD8397965FB91695B6B7E71D03CD96DADD8E8E976F74 + AD6F1AEA21A250B2AFDBE511002BAC75FDAFB382584C8B5C65110A253A97CEDA + CDEFE6068EB77A25B5D4F2C263FABDA5ECBE9F1352CEC5A12C812AD5AFDAFE6C + 84A32846CEC886406262F72F2EE9217FD2244552DB85514503B051D9546CBFF3 + 566B65224D96D0299201414C09762A82B9D4DE0D52D6CBEA933C57114D2C97EA + 07D5E1F478D16562410D2733C283F61F10AC365FCDEB592DE7D4B4AF2F6ADABF + 97AD4B7ADAE5AC510819136792049658E7B88D286AF144CBF0B70E59254FE1F3 + BE8B73AB693A7DA335C2EB1A7CBAADB5E250422D623100EE58861EA7AEBC3E1F + F5B154FD99554B310AA3724EC00C55BC55A57575E4A432F88351B6D8AB959585 + 54822A4547883438AB78ABB15754569DFC315762AE0412403B8EA3157541AD3B + 75C55DC97971A8E54AD3BD31572B2B0AA9041EE37C55E6DF9F7E6FF317957C9F + 67A868377F53BC97508EDE497D38A5AC4D04CE578CAAEBF69137A72C215E43A0 + FE65FE7C6B56B7B7569AAC820B3B57BB12B585B94944722C6638D96DD834859F + E15FF270D0425D7FF9CFF9DBA7CEB6F79AABC33BC626119B4B22DC0826A4084D + 3A1E5FCBFB58D054DEE7F313F3CADF46FD2CDE6181E0FABD9DD0892DAD8C852F + A49228942FD5A9CC342DCC72FE5E3CB1D956E83F98DF9E9AD69B7FA85B6BB1A4 + 1A7AB97125B590669138563551016E443EC48E1FCCCB8ECAA1AAFE69FE756930 + 4EDA87996CE1BBB79BD0974E55D366B90C090D548629027061C5D5D95D5BF631 + A0AF61FC84F37F98BCD5E4FBCD435EBBFAE5E45A8496F1CBE9C51522582170BC + 62545FB4EFBD3960297A4E05762AEC55D8ABB15762AEC55D8ABFFFD1F54E2AEC + 55D8ABB15762AEC55D80ABB02BB15762AEC5503A9DBB322CD18AC911E4B5EE47 + 6FF642AA7FC96C415613AB6A06E3589A7B881D60B4409610B46EC1DFBBB150C8 + 38D76F8B33B1CE22357B971E7124F2617AC5ECC252C2A2A7ED3100D49CCC8189 + EA1A240F7319D03424D6FCFB78B17EF747D1F8B6AD75155A2B8BA3F12C31B53E + 2E23FBDA7F2E119003B7365291E0A29BF9F2FAE6E9D99FE12A024629408ABF65 + 47CB2700006ABB2C93F29BF2F56C436AB7A9CF53BC03D491AA4A47D55057ECD7 + AB66AF559F8CD0FA439B8A143CDEC3146B1A0551403315B5762AEC55E3BF9809 + AAEA5ADFE61CBA5ABC975A4F95A1D3A048C12C64BD69AE6609415327A2917C2B + FE4610AC8E3FCD1FCB8D2FCA7A77E89BD8752492186DB4AD16C5E396EE63458D + 61483902197A49CF8AC7FB785520D63CB5E55F327E63F982EB5DB24BAD2BCA5A + 359C096249581649BD6BB903AA10ADC23584F16F857E07C55881B9B2B9F26791 + FCADA9CB60D3DAE88BAD5CB7982EA4834E114C38DB87890A49792C639708FD44 + 8E045F8FE368F156FCABA5C5E63F28F913CBB7AE5B4CD5F5ED535310DAC92C31 + 258E9FEB848E00CC674B6F55E2F4D59F9A2BAFC5FB58AA2AE63B0D061F3369BA + 5CBFA0FCA9A8F9AF4FD16E2486430C7696E9671BDEBAC848F4BD775F45E4E5F0 + FA98AB5647F26742F35F9CB56B35B75F28E9FA2DBE937F15ABBC90CF737B2C8D + 343151A924B2476D023706FD9F89BFBC6C5529D3F42F24E9DE4FF38F9D34B9B4 + C8B5C93489E0B2D0B48BB4BA1A6DB5CA98834CF1BC864B96E63D597FBA4FB11E + 2ACC357F32E8F3798B41D3FCAD796FAC4BE4AF2FEA7AA88AD2413219A2B48ED2 + D5392129C9BD493E1FB5F12FF938AA53A4D8F945E7F205E7976F9753F3F6A579 + 6B7DAD6A914CD2DCC96862326A26EE8CDE9C257F711C5271E0FE9A27D86C55E8 + BF981E76897F2D7CC1ACF966F44D3D986B4379002FF5793D4586693FD6B55769 + 5BFD4C5580F9860FCBDF2D68DAAEA5F97FA93FF8934FD2FF00D3AFAC656BA592 + 0BE9E289AEEF25FDE2BDC4157BA847AA927C32371F4FECAAAE91791BCB9E74D3 + AF3C8F3472AE95A56A57FE6EBDB79CCEB35B2DBF280DDCBC9D1EE24B9FDF2331 + E7C5646FB3C71549F43FCADF2E06FCB6D3EE21946A7AC5A5CEA3E62B9171309E + 5805AABBDBB3AB6D135C5CC4AD1A9556FDE7DAE58ABD23F2634FB3B3D2BCC2BA + 745F57D21F5FBF5D32D56BE9C70DB94B63E9825A8AF2C32C9FECF1563DFF0039 + 49FF0092FF004FFF00B6B43FF50D71842BC7BF2F354B8BFB5D4FCBF15BD9497F + AA2DADBDB07367665A38E5F5245E52DBC91CCC59226E327C7F0FEEF9BE12853D + 47537B2F3C5ADAE81693DE5BE8339F5603636F14F232370BB575B78617685E8C + 9C271C911BE2E38ABD2EE2EB4FB18EEAF749D3A79E1B7B2D2DB43D3E5501C4F1 + 5D5DB42B3063F08B6F5229661F69178F3E3CB9E04A4FF96367AAF192C352BCB8 + B3D6752D4F5090B4732234B25B5A2C8E5D8ABAC913CD227D86556FE66C255DF9 + B525C5F797351BAD32D95A6BABE171E60B78FD132D943116FAB7A91AD658FEB5 + CD6E2666FB122F097E2C42B32FF9C5BFFC97FA87FDB5A6FF00A86B7C055EC581 + 5D8ABB15762AEC55D8ABB15762AFFFD2F54E2AEC55D8ABB15762AEC55D80ABB0 + 2BB15762AEC55C403B1DF15516B2B3635682363E2514FF000C556FE8ED3FFE59 + A2FF00805FE98AA9B689A33EED616CDF3890FF000C415526F2DF9759959B4BB4 + 2CA79293045504771F0E4BC4972B2C7847723A3821885238D50782803F564592 + FC55D8ABB15538EDADA39A59A3891269CA99E555019CA8E2BCD86EDC57615C42 + A12D7CBFA05A5EBDF5A69B6B6F7D2D7D4BA8A08D256AF5E4EAA18FDF92544358 + 58B7D6395BC47EB82977545FDE8E3C2926DF1FC1F07C5FB3F0E2A86BCF2EF97E + F5AD5AF34CB4B96B2FF789A682390C3414FDD7253E9EDFC98AABC1A669B07A1E + 85A4317D59592DB8468BE9AC84170941F00723E2E3F6B1563DE73F2143E61D3A + 3B6B3BD6D1A58EE5AED9E08609A199E452AE2E6DA65686E0372E5FBD5FEF151F + 1552F287E58F97BCBDA4DCD8CC89AAC97D38BABE9AE608151E44411A70B78D16 + 0852345E31A469F0E2A9FDAF977CBF68B325AE99696EB708639D6282341221EA + AE154725FF0025B156F4CF2FE83A4A85D2F4DB5B050BC00B58238405AD78FEED + 57E1AF6C55758687A2E9D2CD369FA7DB59CB70795C496F0C713487C5CA005BFD + 962AAB6FA769F6D6EF6F6F6B1436F21632431C6A88C5FED1650003CBF6B1551D + 3F42D134EB696D34FD3EDACED662CD3416F0C7146E5FED1654015B957E2AE2AE + B3D0742B2B49ACACB4EB5B5B3B8E5F58B68618E38A4E628DCD1542B7207E2E58 + AA2459DA0963984118961431432055E488D4AA29A5554F15F847F2E2ADDBDB5B + 5B47E95BC490C7C99B846A1179392CC6829BB31E4D8AB1FF003F790747F3BE8F + 0E95AACD7105BC170B748F6AC88E5D11E300991251C692B7ECE20AB021FF0038 + B9E400411A86AC08E87D6B6FFB27C36ABA5FF9C60F21CB23CB2EA7ABC92C8C5A + 491A7B72CCC4D4924DBD49271B559FF42B7F97FF00F570D5BFE475B7FD93E36A + AD1FFCE34792E23198B57D690C2184456E201C03D7971A5BFC3CABF1531B5523 + FF0038B9E402493A86AC49EA7D6B6FFB27C6D59EF907C83A3F923479B4AD2A6B + 89EDE7B86BA77BA64770EE891900C6910E34897F67012AC9315762AEC55D8ABB + 15762AEC55D8ABFFD3F54E2AEC55D8ABB15762AEC55D80ABB02BB15762AEC55D + 8ABB15762AEC55D8ABB15762AEC55D8ABB10AEC92BB15762AEC55D8ABB15762A + EC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55 + D8ABB15762AEC55D8ABFFFD4EB7FF2B6FCC1FF00524EBBFF004812FF005CDC7F + 2663FF0055C7FE9E2EB7F3B3FE64FF00D2BBFE56DF983FEA49D77FE9025FEB8F + F2663FF55C7FE9E2BF9D9FF327FE95DFF2B6FCC1FF00524EBBFF004812FF005C + 7F9331FF00AAE3FF004F15FCECFF00993FF4AEFF0095B7E60FFA9275DFFA4097 + FAE3FC998FFD571FFA78AFE767FCC9FF00A577FCADBF307FD493AEFF00D204BF + D71FE4CC7FEAB8FF00D3C57F3B3FE64FFD2BBFE56DF983FEA49D77FE9025FEB8 + FF002663FF0055C7FE9E2BF9D9FF00327FE95DFF002B6FCC1FF524EBBFF4812F + F5C7F9331FFAAE3FF4F15FCECFF993FF004AEFF95B7E60FF00A9275DFF00A409 + 7FAE3FC998FF00D571FF00A78AFE767FCC9FFA577FCADBF307FD493AEFFD204B + FD71FE4CC7FEAB8FFD3C57F3B3FE64FF00D2BBFE56DF983FEA49D77FE9025FEB + 8FF2663FF55C7FE9E2BF9D9FF327FE95DFF2B6FCC1FF00524EBBFF004812FF00 + 5C7F9331FF00AAE3FF004F15FCECFF00993FF4AEFF0095B7E60FFA9275DFFA40 + 97FAE3FC998FFD571FFA78AFE767FCC9FF00A577FCADBF307FD493AEFF00D204 + BFD71FE4CC7FEAB8FF00D3C57F3B3FE64FFD2BBFE56DF983FEA49D77FE9025FE + B8FF002663FF0055C7FE9E2BF9D9FF00327FE95DFF002B6FCC1FF524EBBFF481 + 2FF5C7F9331FFAAE3FF4F15FCECFF993FF004AEFF95B7E60FF00A9275DFF00A4 + 097FAE3FC998FF00D571FF00A78AFE767FCC9FFA577FCADBF307FD493AEFFD20 + 4BFD71FE4CC7FEAB8FFD3C57F3B3FE64FF00D2BBFE56DF983FEA49D77FE9025F + EB8FF2663FF55C7FE9E2BF9D9FF327FE95DFF2B6FCC1FF00524EBBFF004812FF + 005C7F9331FF00AAE3FF004F15FCECFF00993FF4AEFF0095B7E60FFA9275DFFA + 4097FAE3FC998FFD571FFA78AFE767FCC9FF00A577FCADBF307FD493AEFF00D2 + 04BFD71FE4CC7FEAB8FF00D3C57F3B3FE64FFD2BBFE56DF983FEA49D77FE9025 + FEB8FF002663FF0055C7FE9E2BF9D9FF00327FE95DFF002B6FCC1FF524EBBFF4 + 812FF5C7F9331FFAAE3FF4F15FCECFF993FF004AEFF95B7E60FF00A9275DFF00 + A4097FAE3FC998FF00D571FF00A78AFE767FCC9FFA577FCADBF307FD493AEFFD + 204BFD71FE4CC7FEAB8FFD3C57F3B3FE64FF00D2BBFE56DF983FEA49D77FE902 + 5FEB8FF2663FF55C7FE9E2BF9D9FF327FE95DFF2B6FCC1FF00524EBBFF004812 + FF005C7F9331FF00AAE3FF004F15FCECFF00993FF4AEFF0095B7E60FFA9275DF + FA4097FAE3FC998FFD571FFA78AFE767FCC9FF00A577FCADBF307FD493AEFF00 + D204BFD71FE4CC7FEAB8FF00D3C57F3B3FE64FFD2BBFE56DF983FEA49D77FE90 + 25FEB8FF002663FF0055C7FE9E2BF9D9FF00327FE95DFF002B6FCC1FF524EBBF + F4812FF5C7F9331FFAAE3FF4F15FCECFF993FF004AEFF95B7E60FF00A9275DFF + 00A4097FAE3FC998FF00D571FF00A78AFE767FCC9FFA577FCADBF307FD493AEF + FD204BFD71FE4CC7FEAB8FFD3C57F3B3FE64FF00D2BBFE56DF983FEA49D77FE9 + 025FEB8FF2663FF55C7FE9E2BF9D9FF327FE95DFF2B6FCC1FF00524EBBFF0048 + 12FF005C7F9331FF00AAE3FF004F15FCECFF00993FF4AEFF0095B7E60FFA9275 + DFFA4097FAE3FC998FFD571FFA78AFE767FCC9FF00A577FCADBF307FD493AEFF + 00D204BFD71FE4CC7FEAB8FF00D3C57F3B3FE64FFD2BBFE56DF983FEA49D77FE + 9025FEB8FF002663FF0055C7FE9E2BF9D9FF00327FE95DFF002B6FCC1FF524EB + BFF4812FF5C7F9331FFAAE3FF4F15FCECFF993FF004AEFF95B7E60FF00A9275D + FF00A4097FAE3FC998FF00D571FF00A78AFE767FCC9FFA577FCADBF307FD493A + EFFD204BFD71FE4CC7FEAB8FFD3C57F3B3FE64FF00D2BBFE56DF983FEA49D77F + E9025FEB8FF2663FF55C7FE9E2BF9D9FF327FE95DFF2B6FCC1FF00524EBBFF00 + 4812FF005C7F9331FF00AAE3FF004F15FCECFF00993FF4AEFF0095B7E60FFA92 + 75DFFA4097FAE3FC998FFD571FFA78AFE767FCC9FF00A577FCADBF307FD493AE + FF00D204BFD71FE4CC7FEAB8FF00D3C57F3B3FE64FFD2BBFE56DF983FEA49D77 + FE9025FEB8FF002663FF0055C7FE9E2BF9D9FF00327FE95DFF002B6FCC1FF524 + EBBFF4812FF5C7F9331FFAAE3FF4F15FCECFF993FF004AEFF95B7E60FF00A927 + 5DFF00A4097FAE3FC998FF00D571FF00A78AFE767FCC9FFA577FCADBF307FD49 + 3AEFFD204BFD71FE4CC7FEAB8FFD3C57F3B3FE64FF00D2BBFE56DF983FEA49D7 + 7FE9025FEB8FF2663FF55C7FE9E2BF9D9FF327FE95FFD5F54E2AEC55D8ABB157 + 62AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB156B90F + E38ABB90C55DC862AEE43DF1577218ABB90FECC55DC85698AB8303D3156F1576 + 2AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC + 55D8ABB15762AFFFD6F54E2AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB1 + 5762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762 + AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC5 + 5D8ABB15762AEC55FFD7F54E2AEC55D8ABB15762AEC55D8ABB15762AEC55D8AB + B15762AEC55D8ABB15762AEC55D8AB4A6B5C55BC55D8ABB15762AEC55D8ABB15 + 762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762A + EC55D8ABB15762AEC55D8ABFFFD0F54E2AEC55D8ABB15762AEC55D8ABB15762A + EC55D8ABB15762AEC55D8ABB15762AEC55D8AB54F0C55BC55ADEBEDE18ABBE2F + 1C55D46AF5C55BDFC7156B7DB15700DDCE2ADEF4FD58ABB15762AEC55D8ABB15 + 762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762A + FF00FFD1F54E2AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D + 8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB + 15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB15762AEC55D8ABB1576 + 2AEC55FFD9} + end + object m_lblProgress: TLabel + Left = 14 + Top = 119 + Width = 84 + Height = 14 + Margins.Left = 4 + Margins.Top = 4 + Margins.Right = 4 + Margins.Bottom = 4 + Caption = #27491#22312#21021#22987#21270'......' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end +end diff --git a/SplashFormUnit.h b/SplashFormUnit.h new file mode 100644 index 0000000..e7d35cc --- /dev/null +++ b/SplashFormUnit.h @@ -0,0 +1,28 @@ +//--------------------------------------------------------------------------- + +#ifndef SplashFormUnitH +#define SplashFormUnitH + +#include +#include +#include +#include +#include +#include + +//--------------------------------------------------------------------------- +class TSplashForm : public TForm +{ +__published: // IDE-managed Components + TImage *m_imgBk; + TLabel *m_lblProgress; +private: // User declarations +public: // User declarations + __fastcall TSplashForm(TComponent* Owner); + + void __fastcall ShowProgress( String strMsg ); +}; +//--------------------------------------------------------------------------- +extern PACKAGE TSplashForm *SplashForm; +//--------------------------------------------------------------------------- +#endif diff --git a/StateBtn.cpp b/StateBtn.cpp new file mode 100644 index 0000000..7a4def5 --- /dev/null +++ b/StateBtn.cpp @@ -0,0 +1,196 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop + +#include "StateBtn.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +//--------------------------------------------------------------------------- +#include "PanelDB.h" +//--------------------------------------------------------------------------- +__fastcall TStateBtn::TStateBtn(TPanelDB *panel) +{ + m_Panel = panel; + + FIndex = 0; + FLeft = FTop = FWidth = FHeight = 0; + FState = 0; + FStateCount = 4; + + FEnable = true; + FEnter = false; + FDown = false; + FStateCus = false; + + m_UP = m_PRE = m_NEXT = m_PAR = NULL; + m_Data = NULL; +} +//--------------------------------------------------------------------------- +__fastcall TStateBtn::~TStateBtn() +{ + Clear(); +} +//--------------------------------------------------------------------------- +void __fastcall TStateBtn::Clear() +{ + if( m_LstSub.size() ) { + + BTNLST::iterator lst_FBTNLST; + for( lst_FBTNLST = m_LstSub.begin(); + lst_FBTNLST!= m_LstSub.end(); + lst_FBTNLST++ ) + { + TStateBtn *pBtn = *lst_FBTNLST; + SAFE_DELETE(pBtn) + } + m_LstSub.clear(); + } +} +//--------------------------------------------------------------------------- +TRect __fastcall TStateBtn::GetBounds() +{ + TRect rtThis; + if(m_PAR) { + rtThis = TRect(m_PAR->Left+FLeft, m_PAR->Top+FTop, + m_PAR->Left+FLeft+FWidth, m_PAR->Top+FTop+FHeight); + } + else { + rtThis = TRect(FLeft, FTop, FLeft+FWidth, FTop+FHeight); + } + + return rtThis; +} +//--------------------------------------------------------------------------- +BTNLST* __fastcall TStateBtn::GetSub() +{ + return &m_LstSub; +} +//--------------------------------------------------------------------------- +TStateBtn* __fastcall TStateBtn::GetSubCusor(TPoint pt) +{ + TStateBtn *pCur = this; + TRect rt = TRect( Left, Top, Left+Width, Top+Height); + + if( PtInRect( rt, pt ) ) { + + TStateBtn *pSub = 0; + if( m_LstSub.size() ) { + + TPoint ptTmp = pt; + BTNLST::iterator lst_FBTNLST; + for(lst_FBTNLST = m_LstSub.begin(); + lst_FBTNLST != m_LstSub.end(); + lst_FBTNLST++ ) + { + ptTmp = TPoint(pt.X-Left, pt.Y-Top); + pSub = (*lst_FBTNLST)->GetSubCusor(ptTmp); + if( pSub ) return pSub; + } + } + + if( 0==pSub ) return pCur; + } + + return 0; +} +//--------------------------------------------------------------------------- +void __fastcall TStateBtn::SetSub(TStateBtn *pBtn) +{ + m_LstSub.push_back(pBtn); + pBtn->m_PAR = this; +} +//--------------------------------------------------------------------------- +void __fastcall TStateBtn::SetBounds(int nLeft, int nTop, int nWidth, int nHeight) +{ + Left = nLeft; + Top = nTop; + Width = nWidth; + Height = nHeight; +} +//--------------------------------------------------------------------------- +void __fastcall TStateBtn::SetData(void *pData) +{ + m_Data = pData; +} +//---------------------------------------------------------------------------- +bool __fastcall TStateBtn::DoNotifyStateHandle() +{ + if( !FStateCus ) { + + int CurStateTmp = FState; + if( false==FEnable ) { + + CurStateTmp = Bs_DISABLE; + + }else { + + if( FDown ) CurStateTmp = Bs_DOWN; + else if( FEnter ) CurStateTmp = Bs_ENTER; + else CurStateTmp = Bs_NORMAL; + + if( FStateCount<=CurStateTmp ) CurStateTmp = FStateCount-1; + } + + FState = CurStateTmp; + } +// else if( OnNotifyState ) OnNotifyState(this); + + if( OnNotifyState ) OnNotifyState(this); + + return true; +} +//---------------------------------------------------------------------------- +void __fastcall TStateBtn::Paint(TCanvas *Canvas) +{ + if( !DoNotifyStateHandle() ) return; + + TCanvas *CanvasDr = Canvas; + + TRect rtThis = GetBounds(); + + if( NULL==CanvasDr ) CanvasDr = m_Panel->m_CanvasDr; + + if( FNotifyDraw ) // + { + if( FNotifyDraw ) { + + if( !m_PAR && FState==Bs_NORMAL && m_Panel->m_BMPBkg ) { + + StretchBlt(CanvasDr->Handle, + rtThis.left, rtThis.Top, + rtThis.Width(), rtThis.Height(), + m_Panel->m_BMPBkg->Canvas->Handle, + rtThis.left, rtThis.Top, + rtThis.Width(), rtThis.Height(), + SRCCOPY); + } + FNotifyDraw(this, FState, rtThis, CanvasDr); + } + + if( m_LstSub.size() ) { + + BTNLST::iterator lst_FBTNLST; + for(lst_FBTNLST = m_LstSub.begin(); + lst_FBTNLST != m_LstSub.end(); + lst_FBTNLST++ ) + { + (*lst_FBTNLST)->Paint(CanvasDr); + } + } + } + + if( NULL==Canvas ) { + + HDC hDC = GetDC(m_Panel->Handle); + StretchBlt(hDC, rtThis.Left, rtThis.Top, rtThis.Width(), rtThis.Height(), + CanvasDr->Handle, rtThis.Left, rtThis.Top, rtThis.Width(), rtThis.Height(), + SRCCOPY); + DeleteDC(hDC); + } +} +//--------------------------------------------------------------------------- + + + + + diff --git a/StateBtn.h b/StateBtn.h new file mode 100644 index 0000000..5384fd8 --- /dev/null +++ b/StateBtn.h @@ -0,0 +1,127 @@ +//--------------------------------------------------------------------------- + +#ifndef StateBtnH +#define StateBtnH +//--------------------------------------------------------------------------- +#include +#include +using namespace std; +#include +#include +#include +//#define TJCOMPONENT +#ifdef TJCOMPONENT +//#include "GlobalCBEnvUnit.h" +#else +//#include "GlobalUnit.h" +#endif +//--------------------------------------------------------------------------- +#define SAFE_DELETE(p) { if(p) { delete (p); (p)=NULL; } } +#define NULL_RETURN(p) { if(NULL==p) return; } +#define NULL_RETURN0(p) { if(NULL==p) return 0; } + +#define RECTCOMPONENT(COM) \ + TRect(COM->Left, COM->Top, COM->Left+COM->Width, COM->Top+COM->Height); + +#define RECTSET(COM, L, T, W, H) \ + COM->Left = L; \ + COM->Top = T; \ + COM->Width = W; \ + COM->Height = H; + +#define Bs_NORMAL 0 +#define Bs_ENTER 1 +#define Bs_DOWN 2 +#define Bs_DISABLE 3 +//--------------------------------------------------------------------------- +typedef vector VCStr; +typedef vector VCInt; + +class TStateBtn; +class TPanelDB; +typedef list BTNLST; + +typedef void __fastcall (__closure *TNotifyBtn)(TStateBtn *sender); +typedef void __fastcall (__closure *TNotifyDraw)(TStateBtn *sender, int BsTmp, TRect rtTmp, TCanvas *pCanvas); +typedef void __fastcall (__closure *TNotifyBounds)(TStateBtn *sender, TRect &rtCell); +//--------------------------------------------------------------------------- + +class TStateBtn: public TObject +{ + +private: + + int FIndex, + FLeft, FTop, FWidth, FHeight, + FStateCount, FState; + + bool FEnable, FEnter, FDown, FStateCus; + + TNotifyBtn FNotifyState; + TNotifyDraw FNotifyDraw; + + TNotifyBtn FOnClick; + TNotifyBtn FOnClickR; + TNotifyBtn FOnDBClick; + + void __fastcall SetAlphaBlend(bool bAlphaBlend); + void __fastcall SetTrans(bool bTrans); + + BTNLST m_LstSub; + void __fastcall Clear(); + +protected: + + TPanelDB *m_Panel; + +public: + + TStateBtn *m_UP, *m_PRE, *m_NEXT, *m_PAR; + void *m_Data; + + TRect __fastcall GetBounds(); + BTNLST* __fastcall GetSub(); + TStateBtn* __fastcall GetSubCusor(TPoint pt); + + void __fastcall SetSub(TStateBtn *pBtn); + void __fastcall SetBounds(int nLeft, int nTop, int nWidth, int nHeight); + void __fastcall SetData(void *pData); + + bool __fastcall DoNotifyStateHandle(); + void __fastcall Paint(TCanvas *Canvas=NULL); + + __fastcall TStateBtn(TPanelDB *panel); + __fastcall ~TStateBtn(); + +__published: + + __property int Index = { read=FIndex, write=FIndex, default=0 }; + __property int Left = { read=FLeft, write=FLeft, default=0 }; + __property int Top = { read=FTop, write=FTop, default=0 }; + __property int Width = { read=FWidth, write=FWidth, default=0 }; + __property int Height = { read=FHeight, write=FHeight, default=0 }; + __property int StateCount = { read=FStateCount, write=FStateCount, default=4 }; + __property int State = { read=FState, write=FState, default=0 }; + + __property bool Enable = { read=FEnable, write=FEnable, default=true }; + __property bool Enter = { read=FEnter, write=FEnter, default=true }; + __property bool Down = { read=FDown, write=FDown, default=false}; + __property bool StateCus = { read=FStateCus, write=FStateCus, default=false}; + + __property TNotifyBtn OnNotifyState = { read=FNotifyState , write=FNotifyState }; + __property TNotifyDraw OnNotifyDraw = { read=FNotifyDraw , write=FNotifyDraw }; + + __property TNotifyBtn OnClick = { read=FOnClick , write=FOnClick }; + __property TNotifyBtn OnClickR = { read=FOnClickR , write=FOnClickR }; + __property TNotifyBtn OnDBClick = { read=FOnDBClick ,write=FOnDBClick }; +}; +//--------------------------------------------------------------------------- + + +/* * * * * +read me +* * * * */ + +//btn Ը + +#endif \ No newline at end of file diff --git a/StyleItem.cpp b/StyleItem.cpp new file mode 100644 index 0000000..f0b98a0 --- /dev/null +++ b/StyleItem.cpp @@ -0,0 +1,1509 @@ +//--------------------------------------------------------------------------- +#include +#include +#pragma hdrstop + +#include "GlobalUnit.h" +#include "StyleItem.h" +#include "FavorTextureUnit.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) + +TPngImage *u_imgFold = NULL, + *u_imgUnfold = NULL, + *u_imgTrackOn = NULL, + *u_imgTrackOff = NULL, + *u_imgDelete = NULL, + *u_imgDownload = NULL, + *u_imgDownloading = NULL, + *u_imgProg = NULL, + *u_imgTexture = NULL, + *u_imgVolume = NULL, + *u_imgBrush = NULL, + *u_imgCollect = NULL, + *u_imgUnCollect = NULL, + *u_imgScore = NULL, + *u_imgSave = NULL, + *u_imgImport = NULL, + *u_imgUpload = NULL, + *u_imgCharge = NULL; + +COLORREF clrTextStyle = RGB(201, 214, 229), //Style + clrTextHot = RGB( 225, 236, 255 ), // + clrTextDirty = RGB( 226, 232, 187 ), + clrTextDisable = RGB( 126, 131, 137 ), //δ + clrTextLoading = RGB( 105, 197, 235 ), // + clrBackground = RGB(47, 50, 57), //屳 + clrFocback = RGB( 67, 73, 80 ), //㱳 + clrSelback = RGB( 29, 31, 35 ); //ѡб + +TStyleItem *g_pPreStyle = NULL, + *g_pUseStyle = NULL; + +///////////////////////////////////////////////////////////////////////////// +// TCommonItem +__fastcall TCommonItem::TCommonItem() +{ + iType = 0; + dwState = 0; + iFocusCol = 0; + + aOptions = new System::Classes::TList(); + aItems = new System::Classes::TList(); + prev = next = up = NULL; +} + +__fastcall TCommonItem::TCommonItem( char type, DWORD opts ) +{ + iType = type; + dwState = 0; + iFocusCol = 0; + + aOptions = new System::Classes::TList(); + aItems = new System::Classes::TList(); + prev = next = up = NULL; + + if( opts!=0 ){ + for( int i=0; iAdd( (void*)(1<Count; i++ ){ + delete aItems->Items[i]; + } + + aItems->Clear(); +} + +void TCommonItem::RemoveSubItem( TCommonItem* pSub ) +{ + if( pSub->prev ) + pSub->prev->next = pSub->next; + if( pSub->next ) + pSub->next->prev = pSub->prev; + + aItems->Remove( pSub ); + delete pSub; +} + +short __fastcall TCommonItem::GetColume( int X ) +{ + return 0; +} + +bool TCommonItem::IsUnfold() +{ + return dwState & STATE_UNFOLD; +} + +bool TCommonItem::IsSelected() +{ + return dwState & STATE_SELECTED; +} +/* +void __fastcall TCommonItem::SetCollect( bool bSet ) +{ + if( bSet ) + dwState |= STATE_COLLECTED; + else + dwState &= ~STATE_COLLECTED; +} +*/ +void __fastcall TCommonItem::SetFocus( WORD iCol ) +{ + iFocusCol = iCol; +} + +void __fastcall TCommonItem::SetUnfold( bool bSet ) +{ + if( bSet ) + dwState |= STATE_UNFOLD; + else + dwState &= ~STATE_UNFOLD; +} + +void __fastcall TCommonItem::Select( bool bSet ) +{ + if( bSet ) + dwState |= STATE_SELECTED; + else + dwState &= ~STATE_SELECTED; +} + +void __fastcall TCommonItem::SetHover( bool bSet ) +{ + if( bSet ) + dwState |= STATE_HOVER; + else + dwState &= ~STATE_HOVER; +} + +DWORD TCommonItem::GetOption( int iCol ) +{ + for( int i=0; iCount>i ){ + return (DWORD)aOptions->Items[i]; + } + } + + return 0; +} + +int TCommonItem::GetOnlineState() +{ + TStyleItem* pStyItem = GetStyleItem(); + + if( pStyItem && pStyItem->pStyle ){ + if( pStyItem->pStyle->idLoc==0 ) + return pStyItem->pStyle->pOrigin->state; + else if( pStyItem->pStyle->idLoc==1 ){ + if( iType==SEGTYPE_STYLE ){ + int iStyDlState = e_Downloaded; + for( int i=0; iCount; i++ ){ + TSegmentItem* pSeg = (TSegmentItem*)aItems->Items[i]; + int iState = pSeg->GetOnlineState(); + if( iState==e_UnDownload ) + return e_UnDownload; + else if( iState==e_Downloading ) + iStyDlState = iState; + } + + return iStyDlState; + } + else if( iType==SEGTYPE_TRACK ){ + TTrackItem* pTrk = (TTrackItem*)this; + if( pTrk->pStyle->idLoc==0 ) + return pTrk->pStyle->pOrigin->state; + else + return e_Downloaded; + } + else{ + int iSegDlState = e_Downloaded; + for( int i=0; iCount; i++ ){ + TTrackItem* pTrk = (TTrackItem*)aItems->Items[i]; + int iState = pTrk->GetOnlineState(); + if( iState==e_UnDownload ) + return e_UnDownload; + else if( iState==e_Downloading ) + iSegDlState = iState; + } + + return iSegDlState; + } + } + } + + return e_Downloaded; +} + +TStyleItem* TCommonItem::GetStyleItem() +{ + if( iType==SEGTYPE_STYLE ){ + return (TStyleItem*)this; + } + else if( iType==SEGTYPE_TRACK ){ + return (TStyleItem*)up->up; + } + else{ + return (TStyleItem*)up; + } +} + +void TCommonItem::SetOnlineState( int iState ) +{ + TStyleItem* pStyItem = GetStyleItem(); + + if( pStyItem && pStyItem->pStyle ){ + if( pStyItem->pStyle->idLoc==0 ) + pStyItem->pStyle->pOrigin->state = iState; + else if( pStyItem->pStyle->idLoc==1 && iType==SEGTYPE_TRACK ){ + TTrackItem* pTrk = (TTrackItem*)this; + if( pTrk->pStyle->idLoc==0 ) + pTrk->pStyle->pOrigin->state = iState; + } + } +} + +COLORREF TCommonItem::TextColor() +{ + return clrTextStyle; +} + +void __fastcall TCommonItem::DrawItem( TCanvas* Canvas, TRect Rect, WORD iCol ) +{ + int X, Y; + + if( iType!=SEGTYPE_STYLE ){ + Rect.Left += OPTION_WIDTH; + + if( iType==SEGTYPE_TRACK ){ + Rect.Left += OPTION_WIDTH; + } + } + + Canvas->Brush->Color = clrBackground; + + if( iCol==WORD(-1) ){ + //ˢ + TRect rtFresh( 0, Rect.Top, Rect.Left+OPTION_WIDTH, Rect.Bottom ); + Canvas->FillRect( rtFresh ); + } + + if( dwState & STATE_SELECTED ) //ѡб + Canvas->Brush->Color = clrSelback; + else if( dwState & STATE_HOVER || iFocusCol>COL_FOLD ) + Canvas->Brush->Color = clrFocback; + + if( iCol & COL_FOLD ){ + TPngImage *pImg = NULL; + if( aItems->Count>0 ){ //fold + pImg = (dwState & STATE_UNFOLD) ? u_imgUnfold : u_imgFold; + } + else if( iType==SEGTYPE_TRACK ){ //mute + pImg = IsMute() ? u_imgTrackOff : u_imgTrackOn; + } + + if( pImg ){ + RECT rt; + GetClipBox( Canvas->Handle, &rt ); + + int w = pImg->Width/2, + h = pImg->Height, + l = ( iFocusCol==COL_FOLD ) ? w : 0; + + X = Rect.Left + (OPTION_WIDTH - w)/2; + Y = Rect.Top + ( OPTION_HEIGHT - h) / 2; + + int x = X-rt.left, + y = Y-rt.top, + b = y+h; + if( b > Rect.Bottom - rt.top ) + b = Rect.Bottom - rt.top; + + HRGN rgnClip = CreateRectRgn( x, y, x+w, b ); + + SelectClipRgn( Canvas->Handle, rgnClip ); + Canvas->Draw( X-l, Y, pImg ); + SelectClipRgn( Canvas->Handle, NULL ); + DeleteObject(rgnClip); + } + } + + int iOnline = GetOnlineState(); + + if( iCol >= COL_TEXT ){ + // + if( iFocusCol>=COL_TEXT ){ + Canvas->Font->Color = clrTextHot; + } + else if( iOnline==e_UnDownload ){ + Canvas->Font->Color = clrTextDisable; + } + else if( iOnline==e_Downloading ){ + if( iType==SEGTYPE_STYLE ) + Canvas->Font->Color = clrTextLoading; + else + Canvas->Font->Color = clrTextDisable; + } + else{ + Canvas->Font->Color = TextColor(); + } + + String strText = GetCaption(); + + Rect.Left += OPTION_WIDTH; + Y = Rect.Top + ( OPTION_HEIGHT - Canvas->TextHeight(strText) )/2; + + //----ַ------ + int nWidth = Rect.Width() - 4 - 8; + if( iFocusCol > COL_FOLD || dwState & STATE_SELECTED ) + nWidth -= aOptions->Count*OPTION_WIDTH + 2; + + if( Canvas->TextWidth( strText )>nWidth ){ + UnicodeString strShorty = strText; + while( Canvas->TextWidth( strShorty )>nWidth ){ + strShorty = strShorty.SubString( 1, strShorty.Length()-2 ); + } + + strText = strShorty; + strText+="..."; + } + //----------- + Canvas->Brush->Style = bsSolid; + Canvas->TextRect( Rect, Rect.Left+4, Y, strText ); + } + + for( int i=0; iCount; i++ ){ + DWORD iOpt = (DWORD)aOptions->Items[i]; + TPngImage* pImg = NULL; + + if( iOpt==OPT_DEL ){ + pImg = u_imgDelete; + } + else if( iOpt==OPT_DOWNLOAD ){ + if( iOnline==e_Downloading ) + pImg = u_imgDownloading; + else + pImg = u_imgDownload; + } + else if( iOpt==OPT_BRUSH ) + pImg = u_imgBrush; + else if( iOpt==OPT_TEXTURE ) + pImg = u_imgTexture; + else if( iOpt==OPT_FONTPROG ) + pImg = u_imgProg; + else if( iOpt==OPT_VOL ) + pImg = u_imgVolume; + else if( iOpt==OPT_COLLECT ){ + if( IsCollected() ) + pImg = u_imgCollect; + else + pImg = u_imgUnCollect; + } + else if( iOpt==OPT_SCORE ) + pImg = u_imgScore; + else if( iOpt==OPT_SAVE ) + pImg = u_imgSave; + else if( iOpt==OPT_IMPORT ) + pImg = u_imgImport; + else if( iOpt==OPT_UPLOAD ) + pImg = u_imgUpload; + else if( iOpt==OPT_CHARGE ) + pImg = u_imgCharge; + + if( iFocusCol>COL_FOLD || (dwState & STATE_SELECTED) ){ + Rect.Right -= OPTION_WIDTH; + + if( pImg ){ + RECT rt; + GetClipBox( Canvas->Handle, &rt ); + + int w = pImg->Width/3, + h = pImg->Height, + l = ( iFocusCol==(1<<(i+2)) ) ? w : 0; + + X = Rect.Right + (OPTION_WIDTH - w)/2; + Y = Rect.Top + ( OPTION_HEIGHT - h) / 2; + + int x = X-rt.left, + y = Y-rt.top, + b = y+h; + if( b > Rect.Bottom - rt.top ) + b = Rect.Bottom - rt.top; + + HRGN rgnClip = CreateRectRgn( x, y, x+w, b ); + + SelectClipRgn( Canvas->Handle, rgnClip ); + Canvas->Draw( X-l, Y, pImg ); + SelectClipRgn( Canvas->Handle, NULL ); + DeleteObject(rgnClip); + } + } + } +} + +///////////////////////////////////////////////////////////////////////////// +// TTrackItem +__fastcall TTrackItem::TTrackItem() + : TCommonItem(SEGTYPE_TRACK, 0 ) +{ + bOwnTrack = false; + pTrack = NULL; +} + +__fastcall TTrackItem::TTrackItem( TCommonItem* pUpItem, TPROSTYLE* info, + char stype, char sno, char ch, + char prog, char vol, DWORD opts ) + : TCommonItem( SEGTYPE_TRACK, opts ) +{ + pStyle = info; + up = pUpItem; +} + +__fastcall TTrackItem::TTrackItem( TCommonItem* pUpItem, TPROSTYLE* info, TTrack* pTrk, + DWORD opts, bool bOwn ) + : TCommonItem( SEGTYPE_TRACK, opts ) +{ + up = pUpItem; + pStyle = info; + bOwnTrack = bOwn; + pTrack = pTrk; +} + +__fastcall TTrackItem::~TTrackItem() +{ + if( bOwnTrack && pTrack ) + delete pTrack; +} + +void TTrackItem::SetMute( bool bSet ) +{ + if( pTrack ){ + if( bSet ) + pTrack->nVol |= 0x80; + else + pTrack->nVol &= ~0x80; + } +} + +bool TTrackItem::IsCollected() +{ + return IsFavorTexture( pStyle->idLoc, pStyle->idStyle, GetSegType(), + pTrack->iSegNo, pTrack->iChanNo ); +} + +void TTrackItem::StyleId2Str( String& strText ) +{ + char strNo[20]; + if( pStyle->idLoc==0 ){ + sprintf( strNo, "[%d] ", pStyle->idStyle ); + } + else if( pStyle->idLoc==1 ){ + sprintf( strNo, "[S%d] ", pStyle->idStyle ); + } + else if( pStyle->idLoc==(UINT)-1 ){ + sprintf( strNo, "[T%d] ", LOWORD(pStyle->idStyle) ); + } + else{ + sprintf( strNo, "[L%d] ", LOWORD(pStyle->idStyle) ); + } + + strText += strNo; +} + +char TTrackItem::GetSegType() +{ + return ((TSegmentItem*)up)->iSegType; +} + +char TTrackItem::GetSegNo() +{ + if( pTrack ) + return pTrack->iSegNo; +} + +bool TTrackItem::IsMute() +{ + return pTrack ? pTrack->nVol < 0 : false; +} + +void TTrackItem::AddStyleId( String& strText ) +{ + TStyleItem* pStyItem = GetStyleItem(); + + if( pStyItem->pStyle!=pStyle ){ + strText += " "; + + StyleId2Str( strText ); + } +} + +String TTrackItem::GetCaption() +{ + String strText; + + if( pTrack->iBank!=0xFF || pTrack->iProg!=pTrack->iProgOrig + || (pTrack->nVolOrig & 0x7F) != (pTrack->nVol & 0x7F) ){ + strText += "* "; + } + + if( (pTrack->iBank==0xFF || pTrack->iBank<0x80) && pTrack->iChanNo==9 ) + strText += "GM"; + else + strText += GetProgName( pTrack->iBank, pTrack->iChanNo, pTrack->iProg ); + + AddStyleId( strText ); + + return strText; +} + +COLORREF TTrackItem::TextColor() +{ + if( pTrack->iBank!=0xFF ){ + return clrTextDirty; + } + + return GetSegmentColor( GetSegType(), 0, false ); +} + +String TTrackItem::HintText() +{ + String strText = "֯壺"; + + StyleId2Str( strText ); + + char strType_No[8]; + sprintf( strType_No, "%s - %d", NAME_SEG[GetSegType()], pTrack->iSegNo+1 ); + strText += strType_No; + + strText += "\n\nԴ"; + + int iFont = pTrack->iBank==0xFF && !g_bExtFont ? g_idFont: pTrack->iBank; + if( iFont==0xFF ){ + strText += "չɫ"; + } + else if( iFont<0x80 ){ + FONTINFO* pFI = g_lstFonts[iFont]; + + strText += pFI->strFontName; + } + else{ + VSTINFO* pFI = g_lstVSTi[iFont-0x80]; + strText += pFI->strVSTName; + } + + strText += "\n"; + + if( pTrack->iProg!=pTrack->iProgOrig ) + strText += "ǰ"; + strText += ""; + + strText += GetProgName( pTrack->iBank, pTrack->iChanNo, pTrack->iProg ); + + if( pTrack->iProg!=pTrack->iProgOrig ){ + strText += "\nԭʼ"; + strText += GetProgName( 0xFF, pTrack->iChanNo, pTrack->iProgOrig ); + } + strText += "\n\n"; + + if( pTrack->nVol!=pTrack->nVolOrig ) + strText += "ǰ"; + strText += ""; + + if( pTrack->nVol<0 ) + strText += ""; + else + strText += IntToStr( pTrack->nVol ); + + if( pTrack->nVol!=pTrack->nVolOrig ){ + strText += "\nԭʼ"; + strText += IntToStr( pTrack->nVolOrig ); + } + + return strText; +} + +///////////////////////////////////////////////////////////////////////////// +// TSegmentItem +__fastcall TSegmentItem::TSegmentItem() + : TCommonItem(SEGTYPE_SEGMENT, 0) +{ + iSegType = 0; + iSegNo = 0; + iInd = 0; + volume = 0; + nBars = 0; + bAutoSpec = false; + memset( aChanUsed, 0, sizeof(aChanUsed) ); +} + +__fastcall TSegmentItem::TSegmentItem( TCommonItem* pUpItem, char stype, char sno, DWORD opts, + int bars, char ind, char vol, bool bSpec ) + : TCommonItem( SEGTYPE_SEGMENT, opts ) +{ + up = pUpItem; + iSegType = stype; + iSegNo = sno; + iInd = ind; + volume = vol; + nBars = bars; + bAutoSpec = bSpec; + memset( aChanUsed, 0, sizeof(aChanUsed) ); +} + +void TSegmentItem::ClearSubItems() +{ + TCommonItem::ClearSubItems(); + memset( aChanUsed, 0, sizeof(aChanUsed) ); +} + +TTrackItem* __fastcall TSegmentItem::AddTrack( TPROSTYLE* info, TTrack* pTrack, DWORD opts, bool bOwn, int iInd ) +{ + if( !info && !(info = GetStyleInfo( pTrack->iStyleLoc, pTrack->iStyleId ))) + return NULL; + + TTrackItem *pItem = NULL; + + if( iInd>=0 ){ + pItem = new TTrackItem( this, info, pTrack, opts, bOwn ); + if( iSegType==SEGTYPE_VAR || iSegType==SEGTYPE_FILL ) + pItem->aOptions->Add((void*)OPT_BRUSH); + + if( aItems->Count==0 ){ + aItems->Add( pItem ); + } + else if( iIndCount ){ + TCommonItem *pNext = (TCommonItem*)aItems->Items[iInd]; + if( pNext->prev ) + pNext->prev->next = pItem; + pItem->prev = pNext->prev; + pNext->prev = pItem; + pItem->next = pNext; + + aItems->Insert( iInd, pItem ); + } + else{ + TCommonItem *pLast = (TCommonItem*)aItems->Last(); + pLast->next = pItem; + pItem->prev = pLast; + + aItems->Add( pItem ); + } + } + else{ + for( int i=0; iCount; i++ ){ + TTrackItem* pTmp = (TTrackItem*)aItems->Items[i]; + + if( pTrack->iChanNo==9 && pTmp->pTrack->iChanNo==9 ){ + pItem = pTmp; + break; + } + } + + if( pItem ){ + pItem->pStyle = info; + pTrack->iBank = pItem->pTrack->iBank; + pTrack->iChanSpec = pItem->pTrack->iChanSpec; + pTrack->iFile = pItem->pTrack->iFile; + + if( bOwn ) + delete pItem->pTrack; + pItem->pTrack = pTrack; + } + else{ + pItem = new TTrackItem( this, info, pTrack, opts, bOwn ); + if( iSegType==SEGTYPE_VAR || iSegType==SEGTYPE_FILL ) + pItem->aOptions->Add((void*)OPT_BRUSH); + + char ch = pTrack->iChanNo, + chSpec = pTrack->iChanSpec; + if( ch==9 ){ + aChanUsed[9] = true; + } + else if( bAutoSpec ){ + if( !aChanUsed[chSpec] ){ + aChanUsed[chSpec] = true; + } + else if( ch!=9 ){ + for( int i=0; i<16; i++ ){ + if( !aChanUsed[i] ){ + pTrack->iChanSpec = i; + aChanUsed[i] = true; + break; + } + } + } + } + + bool bInserted = false; + if( aItems->Count>0 ){ + if( ch==9 ){ //ֻһֹ죬ڵһ + TTrackItem *pFirst = (TTrackItem*)aItems->First(); + pItem->next = pFirst; + pFirst->prev = pItem; + + aItems->Insert( 0, pItem ); + bInserted = true; + } + else{ + TCommonItem *pLast = (TCommonItem*)aItems->Last(); + + pLast->next = pItem; + pItem->prev = pLast; + } + } + + if( !bInserted ) + aItems->Add( pItem ); + } + } + + return pItem; +} + +TTrackItem* __fastcall TSegmentItem::AddTrack( TPROSTYLE* info, char sno, char ch, + char prog, char vol, DWORD opts ) +{ + TTrack* pTrack = new TTrack; + pTrack->iStyleLoc = info->idLoc; + pTrack->iStyleId = info->idStyle; + pTrack->iSegNo = sno; + pTrack->iChanNo = pTrack->iChanSpec = ch; + pTrack->iProg = pTrack->iProgOrig = prog; + pTrack->nVol = pTrack->nVolOrig = vol; + + return AddTrack( info, pTrack, opts, true ); +} + +TTrackItem* __fastcall TSegmentItem::AddTrack( TPROSTYLE* info, char sn, char tn, + DWORD opts, bool bAddLocal ) +{ + TTrackItem *pItem = NULL; + char st = iSegType; + + if( info->idLoc==0 ){ + TSTYLEORIGIN* pOrigin = info->pOrigin; + if( pOrigin->detail.tracks[st][sn][tn].no>=0 ){ + + pItem = AddTrack( info, sn, + pOrigin->detail.tracks[st][sn][tn].no, + pOrigin->detail.tracks[st][sn][tn].prog, + pOrigin->detail.tracks[st][sn][tn].vol, + opts ); + } + } + else if( info->idLoc==1 ){ + TSTYLESHARE* pShare = info->pShare; + TSHARETRACKREF& trkRef = pShare->trkRef[st][sn][tn]; + UINT idStyle = trkRef.idStyle; + + TPROSTYLE* pTrkInfo = NULL; + + if( idStyle>0 ) + pTrkInfo = GetStyleInfo( 0, idStyle ); + + if( pTrkInfo ){ + int osn = trkRef.segNo; + char chan = trkRef.chan, + prog = trkRef.prog, + vol = trkRef.vol;// & 0x7F; + + if( pTrkInfo!=info ){ + for( int t=0; t<16; t++ ){ + if( pTrkInfo->pOrigin->detail.tracks[st][osn][t].no==chan ){ + prog = pTrkInfo->pOrigin->detail.tracks[st][osn][t].prog; + vol = pTrkInfo->pOrigin->detail.tracks[st][osn][t].vol; + break; + } + } + } + + pItem = AddTrack( pTrkInfo, osn, chan, prog, vol, opts ); + pItem->pTrack->iProg = trkRef.prog; + pItem->pTrack->nVol = trkRef.vol; + } + } + else{ + TSTYLELOCAL* pLocal = info->pLocal; + TTRACKREF& trkRef = pLocal->trkRef[st][sn][tn]; + UINT idLoc = trkRef.idLoc, + idStyle = trkRef.idStyle; + + TPROSTYLE* pTrkInfo = NULL; + if( idStyle>0 && ( bAddLocal || idLoc==0 ) ){ + pTrkInfo = GetStyleInfo( idLoc, idStyle ); + } + + if( pTrkInfo ){ + int osn = trkRef.segNo; + char chan = trkRef.chan, + prog = trkRef.prog, + vol = trkRef.vol;// & 0x7F; + + if( pTrkInfo!=info ){ + for( int t=0; t<16; t++ ){ + if( pTrkInfo->idLoc==0 ){ + if( pTrkInfo->pOrigin->detail.tracks[st][osn][t].no==chan ){ + prog = pTrkInfo->pOrigin->detail.tracks[st][osn][t].prog; + vol = pTrkInfo->pOrigin->detail.tracks[st][osn][t].vol; + break; + } + } + else{ + int nSegNum = info->pLocal->nSegNum[st]; + int iStart = ( st>4 )); + + bool bFind = false; + for( int i=iStart; !bFind && ipLocal->trkRef[st][i][j].idLoc==idLoc + && pTrkInfo->pLocal->trkRef[st][i][j].idStyle==idStyle + && pTrkInfo->pLocal->trkRef[st][i][j].segNo==osn + && pTrkInfo->pLocal->trkRef[st][i][j].chan==chan ){ + prog = pTrkInfo->pLocal->trkRef[st][i][j].prog; + vol = pTrkInfo->pLocal->trkRef[st][i][j].vol; + + bFind = true; + break; + } + else if( pTrkInfo->pLocal->trkRef[st][i][j].idLoc==0 + && pTrkInfo->pLocal->trkRef[st][i][j].idStyle==0 ){ + break; + } + } + } + } + } + } + + pItem = AddTrack( pTrkInfo, osn, chan, prog, vol, opts ); + pItem->pTrack->iProg = trkRef.prog; + pItem->pTrack->nVol = trkRef.vol; + } + } + + return pItem; +} +/* +TTrackItem* __fastcall TSegmentItem::AddTrack( TPROSTYLE* info, char st, char sn, char tn, + DWORD opts, bool bAddLocal ) +{ + TTrackItem *pItem = NULL; + + if( info->idLoc==0 ){ + TSTYLEORIGIN* pOrigin = info->pOrigin; + if( pOrigin->detail.tracks[st][sn][tn].no>=0 ){ + pItem = AddTrack( info, st, sn, + pOrigin->detail.tracks[st][sn][tn].no, + pOrigin->detail.tracks[st][sn][tn].no, + pOrigin->detail.tracks[st][sn][tn].prog, + pOrigin->detail.tracks[st][sn][tn].vol, + opts ); + } + } + else if( info->idLoc==1 ){ + TSTYLESHARE* pShare = info->pShare; + TSHARETRACKREF& trkRef = pShare->trkRef[st][sn][tn]; + UINT idStyle = trkRef.idStyle; + + TPROSTYLE* pTrkInfo = NULL; + + if( idStyle>0 ) + pTrkInfo = GetStyleInfo( 0, idStyle ); + + if( pTrkInfo ){ + int osn = trkRef.segNo; + char chan = trkRef.chan, + prog = trkRef.prog, + vol = trkRef.vol;// & 0x7F; + + if( pTrkInfo!=info ){ + for( int t=0; t<16; t++ ){ + if( pTrkInfo->pOrigin->detail.tracks[st][osn][t].no==chan ){ + prog = pTrkInfo->pOrigin->detail.tracks[st][osn][t].prog; + vol = pTrkInfo->pOrigin->detail.tracks[st][osn][t].vol; + break; + } + } + } + + pItem = AddTrack( pTrkInfo, st, osn, chan, chan, prog, vol, opts ); + pItem->progCurr = trkRef.prog; + pItem->volCurr = trkRef.vol; + } + } + else{ + TSTYLELOCAL* pLocal = info->pLocal; + TTRACKREF& trkRef = pLocal->trkRef[st][sn][tn]; + UINT idLoc = trkRef.idLoc, + idStyle = trkRef.idStyle; + + TPROSTYLE* pTrkInfo = NULL; + if( idStyle>0 && ( bAddLocal || idLoc==0 ) ){ + pTrkInfo = GetStyleInfo( idLoc, idStyle ); + } + + if( pTrkInfo ){ + int osn = trkRef.segNo; + char chan = trkRef.chan, + prog = trkRef.prog, + vol = trkRef.vol;// & 0x7F; + + if( pTrkInfo!=info ){ + for( int t=0; t<16; t++ ){ + if( pTrkInfo->idLoc==0 ){ + if( pTrkInfo->pOrigin->detail.tracks[st][osn][t].no==chan ){ + prog = pTrkInfo->pOrigin->detail.tracks[st][osn][t].prog; + vol = pTrkInfo->pOrigin->detail.tracks[st][osn][t].vol; + break; + } + } + else{ + int nSegNum = info->pLocal->nSegNum[st]; + int iStart = ( st>4 )); + + bool bFind = false; + for( int i=iStart; !bFind && ipLocal->trkRef[st][i][j].idLoc==idLoc + && pTrkInfo->pLocal->trkRef[st][i][j].idStyle==idStyle + && pTrkInfo->pLocal->trkRef[st][i][j].segNo==osn + && pTrkInfo->pLocal->trkRef[st][i][j].chan==chan ){ + prog = pTrkInfo->pLocal->trkRef[st][i][j].prog; + vol = pTrkInfo->pLocal->trkRef[st][i][j].vol; + + bFind = true; + break; + } + else if( pTrkInfo->pLocal->trkRef[st][i][j].idLoc==0 + && pTrkInfo->pLocal->trkRef[st][i][j].idStyle==0 ){ + break; + } + } + } + } + } + } + + pItem = AddTrack( pTrkInfo, st, osn, chan, chan, prog, vol, opts ); + pItem->progCurr = trkRef.prog; + pItem->volCurr = trkRef.vol; + } + } + + return pItem; +} +*/ +void TSegmentItem::DeleteTrack( TCommonItem* pItem ) +{ + if( ((TTrackItem*)pItem)->pTrack->iChanNo==9 ) + aChanUsed[9] = false; + else if( bAutoSpec ) + aChanUsed[((TTrackItem*)pItem)->pTrack->iChanSpec] = false; + + aItems->Remove( pItem ); + delete pItem; +} + +char TSegmentItem::GetIndType() +{ + char type = iSegType; + + if( ((TStyleItem*)up)->nBars>0 && type==SEGTYPE_FILL ) + type = SEGTYPE_VAR; + + return type; +} + +String TSegmentItem::GetCaption() +{ + String strText; + + if( ((TStyleItem*)up)->nBars>0 ){ + if( iSegType<=SEGTYPE_FILL ){ + strText += ""; + strText += String("-") + (int)(iInd+1); + strText += " "; + strText += g_strSegment[iSegType]; + } + else{ + if( iSegType==SEGTYPE_INTRO ){ + int index = iInd; + if( ((TCommonItem*)up->aItems->First())->GetSegType()!=SEGTYPE_INTRO ) + index++; + + if( index==0 ){ + strText += "ǰ"; + } + else{ + strText += ""; + strText += String("-") + index; + } + } + else{ + strText += "β"; + } + } + } + else{ + strText += g_strSegment[iSegType]; + strText += String("-") + (int)(iInd+1); + } + + if( iSegType>=SEGTYPE_INTRO ){ + if( iSegNo<4 ) + strText += " " ; + else + strText += " С" ; + } + + if( nBars>0 ){ + char strNum[20]; + sprintf( strNum, " (%dС)", nBars ); + strText += strNum; + } + + return strText; +} + +COLORREF TSegmentItem::TextColor() +{ + int ty = GetSegType(), + iNo = g_iSegColorMode==0 ? GetSegNo() : aItems->Count; + bool bInc = g_iSegColorMode==0 ? true + : iNo>0 && ((TTrackItem*)aItems->Items[0])->pTrack->iChanNo==9; + + return GetSegmentColor( ty, iNo, bInc ); +} + +///////////////////////////////////////////////////////////////////////////// +// TStyleItem +__fastcall TStyleItem::TStyleItem() + : TCommonItem(SEGTYPE_STYLE, 0) +{ + pStyle = NULL; + nBars = 0; +// nVarNum = nFillNum = nIntroMajNum = nIntroMinNum = nEndingMajNum = nEndingMinNum = 0; + memset( nSegNum, 0, sizeof(int)*4 ); +} + +__fastcall TStyleItem::TStyleItem( TPROSTYLE* info, DWORD opts ) + : TCommonItem( SEGTYPE_STYLE, opts ) +{ + pStyle = info; + nBars = 0; + memset( nSegNum, 0, sizeof(int)*4 ); +// idLoc = info->idLoc; +// idStyle = info->idStyle; +} + +bool TStyleItem::IsCollected() +{ + return IsCollectedStyle( pStyle->idLoc, pStyle->idStyle ); +} + +TSegmentItem* __fastcall TStyleItem::AddSegment( char stype, char sno, DWORD opts, + int bars, char ind, char vol, bool bAutoSpec ) +{ + int index = ind; + if( ind<0 ) + index = sno;//nSegNum[stype]; + + TSegmentItem *pItem = new TSegmentItem( this, stype, sno, opts, bars, index, vol, bAutoSpec ); + + bool bInserted = false; + if( aItems->Count>0 ){ + if( ind<0 ){ + ind = 0; + for( int i=0; i<=stype; i++ ){ + ind += nSegNum[i]; + } + } + + if( bars==0 && ind>=0 && aItems->Count>ind ){ + TCommonItem *pNext = (TCommonItem*)aItems->Items[ind]; + + if( pNext->prev ){ + pItem->prev = pNext->prev; + pNext->prev->next = pItem; + } + + pItem->next = pNext; + pNext->prev = pItem; + + aItems->Insert( ind, pItem ); + bInserted = true; + } + else{ + TCommonItem* pLast = (TCommonItem*)aItems->Last(); + pLast->next = pItem; + pItem->prev = pLast; + } + } + + if( !bInserted ){ + aItems->Add( pItem ); + } + + nSegNum[stype]++; + nBars += bars; + + return pItem; +} + +void TStyleItem::InsertSegment( int ind, TSegmentItem* pItem, int bars ) +{ + if( ind<0 || ind > aItems->Count ) + ind = aItems->Count; + + if( aItems->Count > ind ){ + TCommonItem *pNext = (TCommonItem*)aItems->Items[ind]; + + if( pNext->prev ){ + pItem->prev = pNext->prev; + pNext->prev->next = pItem; + } + + pItem->next = pNext; + pNext->prev = pItem; + + aItems->Insert( ind, pItem ); + } + else{ + if( aItems->Count>0 ){ + TCommonItem* pLast = (TCommonItem*)aItems->Last(); + pLast->next = pItem; + pItem->prev = pLast; + } + aItems->Add( pItem ); + } + +// pItem->iInd = ind; + + nSegNum[pItem->iSegType]++; + nBars += bars; +} + +void TStyleItem::DeleteSegment( TCommonItem* pSeg ) +{ + nSegNum[pSeg->GetSegType()]--; + + if( pSeg->next ){ + int stype = ((TSegmentItem*)pSeg)->GetIndType(); + TSegmentItem* pNext = (TSegmentItem*)pSeg->next; + while( pNext ){ + if( pNext->GetIndType()==stype ) + pNext->iInd--; + + pNext = (TSegmentItem*)pNext->next; + } + } + + aItems->Remove( pSeg ); + delete pSeg; +} + +void TStyleItem::SetDownload() +{ + if( pStyle ){ + if( pStyle->idLoc==0 ){ +// pStyle->pOrigin->state = e_Downloaded; + for( int i=0; iCount; i++ ){ + DWORD iOpt = (DWORD)aOptions->Items[i]; + if( iOpt==OPT_DOWNLOAD ){ + aOptions->Items[i] = (void*)OPT_COLLECT; + break; + } + } + } + else if( pStyle->idLoc==1 ){ + bool bFull = true; + for( int i=0; iCount; i++ ){ + TSegmentItem* pSeg = (TSegmentItem*)aItems->Items[i]; + for( int j=0; jaItems->Count; j++ ){ + TTrackItem* pTrk = (TTrackItem*)pSeg->aItems->Items[j]; + if( pTrk->pStyle->idLoc==0 && pTrk->pStyle->pOrigin->state!=e_Downloaded ){ + bFull = false; + break; + } + } + + if( !bFull ) + break; + } + + if( bFull ){ + for( int i=0; iCount; i++ ){ + DWORD iOpt = (DWORD)aOptions->Items[i]; + if( iOpt==OPT_DOWNLOAD ){ + aOptions->Items[i] = (void*)OPT_COLLECT; + break; + } + } + } + } + } +} + +void TStyleItem::SetImport() +{ + bool bSet = false; + for( int i=0; i<4; i++ ){ + if( nSegNum[i]<8 ){ + bSet = true; + break; + } + } + + int iImport = -1; + for( int i=0; iCount; i++ ){ + DWORD iOpt = (DWORD)aOptions->Items[i]; + if( iOpt==OPT_IMPORT ){ + iImport = i; + break; + } + } + + if( iImport<0 && bSet ){ + aOptions->Add((void*)OPT_IMPORT); + } + else if( iImport>=0 && !bSet ){ + aOptions->Delete( iImport ); + } +} + +void TStyleItem::SetCharge( bool bSet ) +{ + int iCharge = -1; + for( int i=0; iCount; i++ ){ + DWORD iOpt = (DWORD)aOptions->Items[i]; + if( iOpt==OPT_CHARGE ){ + iCharge = i; + break; + } + } + + if( iCharge<0 && bSet ){ + aOptions->Add((void*)OPT_CHARGE); + } + else if( iCharge>=0 && !bSet ){ + aOptions->Delete( iCharge ); + } +} + +void TStyleItem::AddStyleId( String& strText ) +{ + char strNo[20] = ""; + + if( pStyle ){ + if( pStyle->idLoc==0 ){ + if( pStyle->idStyle>0 ){ + sprintf( strNo, "[%d] ", pStyle->idStyle ); + } + else{ + strNo[0] = '\0'; + } + } + else if( pStyle->idLoc==1 ){ + sprintf( strNo, "[S%d] ", pStyle->idStyle ); + } + else if( pStyle->idLoc!=(UINT)-1 ){ + sprintf( strNo, "[L%d] ", LOWORD(pStyle->idStyle) ); + } + } + + strText += strNo; +} + +String TStyleItem::GetCaption() +{ + String strText; + + AddStyleId( strText ); + + if( pStyle ){ + if( pStyle->idLoc==0 ) + strText += UTF8ToMBCS(pStyle->pOrigin->detail.strStyleName).c_str(); + else if( pStyle->idLoc==1 ) + strText += UTF8ToMBCS(pStyle->pShare->strStyleName).c_str(); + else if( pStyle->idLoc!=(UINT)-1 ) + strText += UTF8ToMBCS(pStyle->pLocal->strStyleName).c_str(); + else + strText += "δ֪"; + } + else{ + if( this==g_pPreStyle ) + strText += "½Զ"; + else if( this==g_pUseStyle ) + strText += ""; + } + + if( nBars>0 ){ + char strNum[20]; + sprintf( strNum, " (%d %dС)", aItems->Count, nBars ); + strText += strNum; + } + + return strText; +} + +String TStyleItem::HintText() +{ + String HintStr; + + if( !pStyle ){ + HintStr = "½Զ\n"; + } + else if( pStyle->idLoc==0 ){ + TSTYLEORIGIN* pOrig = pStyle->pOrigin; + HintStr = "\n\n"; + HintStr += "ƣ"; + HintStr += UTF8ToMBCS(pOrig->detail.strStyleName).c_str(); + + HintStr += "\nߣ"; + HintStr += UTF8ToMBCS(pOrig->detail.strAuthor).c_str(); + + HintStr += "\n飺"; + HintStr += UTF8ToMBCS(pOrig->detail.strDescription).c_str(); + + HintStr += "\nͣ"; + String strType; + for( int i=0; i<4; i++ ){ + int type = pOrig->detail.type[i]; + + if( type<0 ) + break; + else{ + if( type<24 ){ + strType += (String)LSZ_STYLTYPES[type] + " "; + } + } + } + if (strType == L"") { + strType = L"δ֪"; + } + HintStr += strType; + + char buf[20]; + HintStr += "\nԭ٣"; + sprintf( buf, "%d", pOrig->detail.iTempo ); + HintStr += buf; + + HintStr += "\n۸"; + if( pOrig->cost==0 ) + strcpy( buf, "" ); + else + sprintf(buf, "%d", pOrig->cost); + HintStr += buf; + + int score10 = (int)(pOrig->score/10.0 + 0.5); + sprintf( buf, "%.1f", score10 / 10.0 ); + + HintStr += "\n֣"; + HintStr += buf; + + HintStr += "\n״̬"; + if( pOrig->state==e_UnDownload ) + HintStr += "δ"; + else if( pOrig->state==e_Downloading ) + HintStr += ""; + else + HintStr += ""; + } + else if( pStyle->idLoc==1 ){ + TSTYLESHARE* pShare = pStyle->pShare; + HintStr = "\n\n"; + HintStr += "ƣ"; + HintStr += UTF8ToMBCS(pShare->strStyleName).c_str(); + + HintStr += "\nߣ"; + HintStr += UTF8ToMBCS(pShare->strAuthor).c_str(); + + HintStr += "\n飺"; + HintStr += UTF8ToMBCS(pShare->strDescription).c_str(); + + HintStr += "\nͣ"; + String strType; + for( int i=0; i<2; i++ ){ + int type = pShare->type[i]; + + if( type<0 ) + break; + else{ + if( type<24 ){ + strType += (String)LSZ_STYLTYPES[type] + " "; + } + } + } + if (strType == L"") { + strType = L"δ֪"; + } + HintStr += strType; + + char buf[20]; + HintStr += "\nԭ٣"; + sprintf( buf, "%d", pShare->iTempo ); + HintStr += buf; + + int score10 = (int)(pShare->score/10.0 + 0.5); + sprintf( buf, "%.1f", score10 / 10.0 ); + + HintStr += "\n֣"; + HintStr += buf; + } + else if( pStyle->pLocal ){ + TSTYLELOCAL* pLocal = pStyle->pLocal; + HintStr = "ط\n\n"; + HintStr += "ƣ"; + HintStr += UTF8ToMBCS(pLocal->strStyleName).c_str(); + + char buf[20]; + HintStr += "\nԭ٣"; + sprintf( buf, "%d", pLocal->iTempo ); + HintStr += buf; + } + + return HintStr; +} +///////////////////////////////////////////////////////////////////////// + +String GetProgName( BYTE iBank, BYTE iChan, BYTE iProg ) +{ + String strText; + + if( iBank!=0xFF && iBank>=0x80 ){ + VSTINFO* pVst = g_lstVSTi[iBank-0x80]; + + bool bSet = false; + for( int i=0; iaPlugins.size(); i++ ){ + if( iChan==pVst->aPlugins[i]->id ){ + return pVst->aPlugins[i]->name; + } + } + + if( !bSet ){ + strText += "ch " + IntToStr( iChan+1 ) + ": "; + strText += pVst->strVSTName; + } + } + else{ + FONTINFO* pFI = NULL; + if( iBank==0xFF ){ + if( g_bExtFont ){ + if(iChan==9) + pFI = g_lstCZFonts[16]; + else + pFI = g_lstCZFonts[iProg/16]; + } + else + pFI = g_lstFonts[g_idFont]; + } + else + pFI = g_lstFonts[iBank]; + + int num = iChan==9 ? pFI->nDrumCount : pFI->nInstCount; + FONTPRESET* pSet = ( iChan==9 ? pFI->aDrums : pFI->aInsts ); + char** strInst = NULL; + + if( iChan==9 ){ + for( int i=0; istrFontName, g_strDefaultSoundSet ) + || !strcmp( pFI->strFontName, "Pop default" ) ) + strInst = GM_INSTRUMENT; + + if( strInst ) + return strInst[iProg]; + else{ + for( int i=0; i TTrackItemList; +typedef vector TSegmentList; + +String GetProgName( BYTE iBank, BYTE iChan, BYTE iProg ); + +extern TStyleItem *g_pPreStyle, + *g_pUseStyle; + +#endif diff --git a/StylePanel.cpp b/StylePanel.cpp new file mode 100644 index 0000000..137f6bd --- /dev/null +++ b/StylePanel.cpp @@ -0,0 +1,2448 @@ +//--------------------------------------------------------------------------- +#include +#include +#pragma hdrstop + +#include "GlobalUnit.h" +#include "StylePanel.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) + +#define MIDI_EVENT_PROGRAM 2 +#define MIDI_EVENT_VOLUME 12 + +#define INSERT_HEIGHT 10 + +extern TImage * w_imgDrag; //϶ͼƬ +extern bool w_bDraging; +extern int w_iDragMode, //϶ģʽ + w_xImgDrag, //͸ͼƬλ + w_yImgDrag, + w_xOldDrag, //͸ͼƬϴλ + w_yOldDrag, + w_xOffDrag, //ͼƬϽ + w_yOffDrag; + +extern COLORREF clrTextStyle, //Style + clrTextHot, // + clrTextDisable, //δ + clrBackground, //屳 + clrFocback, //㱳 + clrSelback; //ѡб + +extern TPngImage *u_imgFold, + *u_imgUnfold, + *u_imgTrackOn, + *u_imgTrackOff, + *u_imgDelete, + *u_imgDownload, + *u_imgDownloading, + *u_imgProg, + *u_imgTexture, + *u_imgVolume, + *u_imgBrush, + *u_imgCollect, + *u_imgUnCollect, + *u_imgScore, + *u_imgSave, + *u_imgImport, + *u_imgUpload, + *u_imgCharge; + +const BYTE u_arrChordPreset[2][4][4] = { //Ԥ + {{0,37,9,30},{0,37,20,28},{0,9,20,28},{0,17,37,30}}, + {{37,9,28,16},{37,17,20,28},{37,0,9,17},{37,28,20,16}} }; + +///////////////////////////////////////////////////////////////////////////// +// TStylePanel +void TStylePanel::LoadImages() +{ + if( u_imgFold ) + delete u_imgFold; + if( u_imgUnfold ) + delete u_imgUnfold; + if( u_imgTrackOn ) + delete u_imgTrackOn; + if( u_imgTrackOff ) + delete u_imgTrackOff; + if( u_imgDelete ) + delete u_imgDelete; + if( u_imgBrush ) + delete u_imgBrush; + if( u_imgVolume ) + delete u_imgVolume; + if( u_imgDownload ) + delete u_imgDownload; + if( u_imgProg ) + delete u_imgProg; + if( u_imgTexture ) + delete u_imgTexture; + if( u_imgCollect ) + delete u_imgCollect; + if( u_imgUnCollect ) + delete u_imgUnCollect; + if( u_imgScore ) + delete u_imgScore; + if( u_imgSave ) + delete u_imgSave; + if( u_imgImport ) + delete u_imgImport; + if( u_imgUpload ) + delete u_imgUpload; + if( u_imgCharge ) + delete u_imgCharge; + + u_imgFold = new TPngImage(); + u_imgFold->LoadFromResourceName(int(HInstance), L"imgFold"); + + u_imgUnfold = new TPngImage(); + u_imgUnfold->LoadFromResourceName(int(HInstance), L"imgUnfold"); + + u_imgTrackOn = new TPngImage(); + u_imgTrackOn->LoadFromResourceName(int(HInstance), L"imgTrackOn"); + + u_imgTrackOff = new TPngImage(); + u_imgTrackOff->LoadFromResourceName(int(HInstance), L"imgTrackOff"); + + u_imgDelete = new TPngImage(); + u_imgDelete->LoadFromResourceName(int(HInstance), L"imgDelete"); + + u_imgBrush = new TPngImage(); + u_imgBrush->LoadFromResourceName(int(HInstance), L"imgBrush"); + + u_imgDownload = new TPngImage(); + u_imgDownload->LoadFromResourceName(int(HInstance), L"imgDownload"); + + u_imgProg = new TPngImage(); + u_imgProg->LoadFromResourceName(int(HInstance), L"imgProg"); + + u_imgTexture = new TPngImage(); + u_imgTexture->LoadFromResourceName(int(HInstance), L"imgTexture"); + + u_imgVolume = new TPngImage(); + u_imgVolume->LoadFromResourceName(int(HInstance), L"imgVolume"); + + u_imgCollect = new TPngImage(); + u_imgCollect->LoadFromResourceName(int(HInstance), L"imgCollect"); + + u_imgUnCollect = new TPngImage(); + u_imgUnCollect->LoadFromResourceName(int(HInstance), L"imgUnCollect"); + + u_imgScore = new TPngImage(); + u_imgScore->LoadFromResourceName(int(HInstance), L"imgStar"); + + u_imgSave = new TPngImage(); + u_imgSave->LoadFromResourceName(int(HInstance), L"imgStyleSave"); + + u_imgImport = new TPngImage(); + u_imgImport->LoadFromResourceName(int(HInstance), L"imgAddSegment"); + + u_imgUpload = new TPngImage(); + u_imgUpload->LoadFromResourceName(int(HInstance), L"imgStyleUpload"); + + u_imgCharge = new TPngImage(); + u_imgCharge->LoadFromResourceName(int(HInstance), L"imgStyleCharge"); +} + +void TStylePanel::FreeImages() +{ + if( u_imgFold ){ + delete u_imgFold; + u_imgFold = NULL; + } + + if( u_imgUnfold ){ + delete u_imgUnfold; + u_imgUnfold = NULL; + } + + if( u_imgTrackOn ){ + delete u_imgTrackOn; + u_imgTrackOn = NULL; + } + + if( u_imgTrackOff ){ + delete u_imgTrackOff; + u_imgTrackOff = NULL; + } + + if( u_imgDelete ){ + delete u_imgDelete; + u_imgDelete = NULL; + } + + if( u_imgBrush ){ + delete u_imgBrush; + u_imgBrush = NULL; + } + + if( u_imgDownload ){ + delete u_imgDownload; + u_imgDownload = NULL; + } + + if( u_imgVolume ){ + delete u_imgVolume; + u_imgVolume = NULL; + } + + if( u_imgProg ){ + delete u_imgProg; + u_imgProg = NULL; + } + + if( u_imgScore ){ + delete u_imgScore; + u_imgScore = NULL; + } + + if( u_imgCollect ){ + delete u_imgCollect; + u_imgCollect = NULL; + } + + if( u_imgUnCollect ){ + delete u_imgUnCollect; + u_imgUnCollect = NULL; + } + + if( u_imgSave ){ + delete u_imgSave; + u_imgSave = NULL; + } + + if( u_imgImport ){ + delete u_imgImport; + u_imgImport = NULL; + } + + if( u_imgUpload ){ + delete u_imgUpload; + u_imgUpload = NULL; + } + + if( u_imgCharge ){ + delete u_imgCharge; + u_imgCharge = NULL; + } +} + +__fastcall TStylePanel::TStylePanel(TComponent* AOwner) + : TToolpalPanel(AOwner) +{ + m_iType = TPTYPE_STYLE; + + m_aItems = new System::Classes::TList(); + + m_pTimer = NULL; + m_nItemHeight = OPTION_HEIGHT; + + m_pTopItem = m_pFocItem = m_pSelItem = m_pPlayItem = NULL; + m_pDragItem = m_pDropItem = m_pHoverItem = NULL; + m_iFocLine = m_iSelLine = m_iHoverLine = -1; + m_nTotalLine = m_iTopLine = 0; + m_iFocCol = 0; + m_bPlaying = false; + + m_VolTrackBar = NULL; + m_editName = NULL; + +// m_Hint = NULL; +// m_HintTimer = NULL; +} +//--------------------------------------------------------------------------- + +void __fastcall TStylePanel::CreateWnd(void) +{ + TToolpalPanel::CreateWnd(); + + OnDblClick = DoubleClick; + OnMouseLeave = MouseLeave; + + m_sbVert = new TSkinScrollBar(NULL); + m_sbVert->Parent = this; + m_sbVert->m_pWndCtrl = this; + m_sbVert->Visible = false; + m_sbVert->Left = ClientWidth - m_sbVert->Width - 1; + m_sbVert->Top = m_nTitleHeight + 1; + m_sbVert->Height = ClientHeight - m_nTitleHeight - 2; + + Canvas->Font->Name = g_strTxtFontName;//"Times New Roman"; + Canvas->Font->Quality = TFontQuality::fqClearTypeNatural; +// if( !strcmp( g_strTxtFontName, "΢ź" ) ){ +// Canvas->Font->Size = g_szFont9; +// } +// else{ +// Canvas->Font->Size = g_szFont8; +// } + Canvas->Font->Size = g_szFont9; + + CalcViewArea(); + + InitItems(); + +// m_PopupMenu = NULL; +} +//--------------------------------------------------------------------------- + +__fastcall TStylePanel::~TStylePanel() +{ +// if( m_PopupMenu ) +// delete m_PopupMenu; + + ClearAllItems(); + + delete m_aItems; + + if( m_pTimer ) + delete m_pTimer; + +// if( m_Hint ) +// delete m_Hint; +// +// if( m_HintTimer ) +// delete m_HintTimer; + + if( m_editName ) + delete m_editName; + + if( m_VolTrackBar ) + delete m_VolTrackBar; +} +//--------------------------------------------------------------------------- + +void __fastcall TStylePanel::DoHandleMessage(MSG &Msg, bool &Handled) +{ + if( !Visible ) + return; + + if( ( Msg.message==WM_LBUTTONDOWN || Msg.message==WM_RBUTTONDOWN ) + && Msg.hwnd!=Handle + && !( Msg.hwnd==m_PopMenu->Handle + || m_editName && Msg.hwnd==m_editName->Handle + || m_VolTrackBar && Msg.hwnd==m_VolTrackBar->Handle )){ + SetFocusedItem( NULL, -1, 0 ); + } + + TToolpalPanel::DoHandleMessage( Msg, Handled ); +} +//--------------------------------------------------------------------------- + +void TStylePanel::ClearAllItems() +{ + Stop( STOP_SELF ); + + m_pTopItem = m_pFocItem = m_pSelItem = NULL; + m_pDragItem = m_pHoverItem = NULL; + m_iFocLine = m_iSelLine = m_iHoverLine = -1; + m_nTotalLine = m_iTopLine = 0; + m_iFocCol = 0; + + for( int i=0; iCount; i++ ){ + delete m_aItems->Items[i]; + } + m_aItems->Clear(); + + if( m_VolTrackBar ){ + delete m_VolTrackBar; + m_VolTrackBar = NULL; + } + + if( m_editName && m_editName->Visible ){ + m_editName->Hide(); + } +} +//--------------------------------------------------------------------------- + +void TStylePanel::CalcViewArea() +{ + m_nItemWidth = ClientWidth - 2; + m_nItemShow = (ClientHeight - m_nTitleHeight - 1) / m_nItemHeight; + if( ((ClientHeight - m_nTitleHeight - 1) % m_nItemHeight ) > 3 ) + m_nItemShow++; +} +//--------------------------------------------------------------------------- + +void TStylePanel::ScrollView( int nPos, bool bRedraw ) +{ + if( m_iTopLine!=nPos ){ + if( m_iTopLineSetPosition( nPos ); + } +} +//--------------------------------------------------------------------------- + +TStyleItem* __fastcall TStylePanel::AddStyle( TPROSTYLE* info, DWORD opts ) +{ + TStyleItem* pItem = new TStyleItem( info, opts ); + + if( m_aItems->Count>0 ){ + TCommonItem *pLast = (TCommonItem*)m_aItems->Last(); + + pLast->next = pItem; + pItem->prev = pLast; + } + else{ + m_pTopItem = pItem; + } + + m_aItems->Add( pItem ); + + m_nTotalLine++; + + return pItem; +} +//--------------------------------------------------------------------------- + +TCommonItem* TStylePanel::GetItem( int iSty, int iSeg, int iTrk ) +{ + TCommonItem* pItem = NULL; + if( iStyCount ){ + TStyleItem* pStyItem = (TStyleItem*)m_aItems->Items[iSty]; + if( iSeg<0 ){ + return pStyItem; + } + else if( iSeg < pStyItem->aItems->Count ){ + TSegmentItem* pSeg = (TSegmentItem*)pStyItem->aItems->Items[iSeg]; + if( iTrk<0 ){ + return pSeg; + } + else if( iTrk < pSeg->aItems->Count ){ + return (TTrackItem*)pSeg->aItems->Items[iTrk]; + } + } + } + + return NULL; +} +//--------------------------------------------------------------------------- + +TCommonItem* TStylePanel::GetNextItem( TCommonItem* pItem ) +{ + TCommonItem* pNextItem = NULL; + + if( (pItem->dwState & STATE_UNFOLD) && pItem->aItems->Count>0 ){ + pNextItem = (TCommonItem*)pItem->aItems->First(); + } + else if( pItem->next ){ + pNextItem = pItem->next; + } + else if( pItem->up && pItem->up->next ){ + pNextItem = pItem->up->next; + } + else if( pItem->up && pItem->up->up && pItem->up->up->next ){ + pNextItem = pItem->up->up->next; + } + + return pNextItem; +} +//--------------------------------------------------------------------------- + +TCommonItem* TStylePanel::GetPrevItem( TCommonItem *pItem ) +{ + TCommonItem* pPrevItem = pItem->prev; + + if( pPrevItem ){ + while( pPrevItem->aItems->Count>0 && (pPrevItem->dwState & STATE_UNFOLD) ){ + pPrevItem = (TCommonItem*)pPrevItem->aItems->Last(); + } + } + else{ + pPrevItem = pItem->up; + } + + return pPrevItem; +} +//--------------------------------------------------------------------------- + +TCommonItem* TStylePanel::HitTest( int X, int Y, WORD* iCol ) +{ + if( Y<0 || Y>Height-1 ) + return NULL; + + TCommonItem* pItem = m_pTopItem, + *pHitItem = NULL; + int h = m_nItemHeight; + + for( int i=0; iaOptions->Count, + offset = 0; + + if( pHitItem->iType!=SEGTYPE_STYLE ){ + offset += OPTION_WIDTH; + + if( pHitItem->iType==SEGTYPE_TRACK ){ + offset += OPTION_WIDTH; + } + } + + leftFold += offset; + rightFold += offset; + leftText += offset; +// rightText += offset; + + WORD col = 0; + if( XleftFold ){ + col = COL_FOLD; + } + else if( X>leftText && XrightText && Xl && X<=r ){ + col = (COL_OPT<<(pHitItem->aOptions->Count-i-1)); + break; + } + + l = r; + r += OPTION_WIDTH; + } + } + else{ + pHitItem = NULL; + } + + if( iCol ) + *iCol = col; + } + + return pHitItem; +} +//--------------------------------------------------------------------------- + +void TStylePanel::InitItems() +{ + // + ClearAllItems(); + + Init(); + + ResetScrollBar(); + Paint(); +} +//--------------------------------------------------------------------------- + +void __fastcall TStylePanel::Paint() +{ + TCommonItem* pItem = m_pTopItem; + + for( int i=0; i 3 ) + page--; + + if( m_nTotalLine>page ){ //ʾ + int range = m_nTotalLine; + + m_sbVert->SetRange( 0, range-1 ); + m_sbVert->SetPageSize( page ); + m_sbVert->SetPosition( 0 ); + + int iRowScroll = 0, iTopLine = m_iTopLine; + if( iTopLine>0 ){ + iRowScroll = min( iTopLine, range-page ); + if( iRowScroll<0 ){ + iRowScroll = 0; + } + } + + ScrollView( iRowScroll ); + } + else{ + m_sbVert->SetRange( 0, 0, false ); + m_sbVert->SetPageSize( 0, false ); + m_sbVert->SetPosition( 0, false ); + + if( m_iTopLine!=0 ){ + m_iTopLine = 0; + m_pTopItem = m_aItems->Count>0 ? (TCommonItem*)m_aItems->Items[0] : NULL; + Paint(); + } + } +} +//--------------------------------------------------------------------------- + +void TStylePanel::ShowSelItem() +{ + bool bPaint = true; + if( m_pSelItem ){ + if( m_iSelLine >= m_nItemShow ){ //Ҫ¹ + ScrollView( m_iSelLine + m_iTopLine - m_nItemShow + 1, true ); + bPaint = false; + } + else if( m_iSelLine<0 ){ //ҪϹ + ScrollView( m_iSelLine + m_iTopLine, true ); + bPaint = false; + } + } + + if( bPaint ){ + Paint(); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TStylePanel::WMSize(Winapi::Messages::TWMSize &Message) +{ + TToolpalPanel::WMSize( Message ); + + CalcViewArea(); + + if( m_sbVert ){ + m_sbVert->Left = Width - m_sbVert->Width - 1; + m_sbVert->Top = m_nTitleHeight + 1; + m_sbVert->Height = Height - m_nTitleHeight - 2; + + ResetScrollBar(); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TStylePanel::WMVScroll(Winapi::Messages::TWMScroll &Message) +{ + if( !m_sbVert->IsOperable() ) + return; + + int minpos, maxpos, page, curpos; + m_sbVert->GetScrollRange(&minpos, &maxpos); + page = m_sbVert->GetPageSize(); + // Get the current position of scroll box. + curpos = m_sbVert->GetScrollPos(); + + // Determine the new position of scroll box. + switch (Message.ScrollCode) + { + case SB_TOP: // Scroll to far top. + curpos = minpos; + break; + + case SB_BOTTOM: // Scroll to far bottom. + curpos = maxpos-page+1; + break; + + case SB_ENDSCROLL: // End scroll. + break; + + case SB_LINEUP: // Scroll left. + if (curpos > minpos) + curpos--; + break; + + case SB_LINEDOWN: // Scroll right. + if (curpos < maxpos-page+1) + curpos++; + break; + + case SB_PAGEUP: // Scroll one page left. + if (curpos > minpos) + curpos = max(minpos, curpos-page); + break; + + case SB_PAGEDOWN: // Scroll one page right. + if( curposHandle ) + m_sbVert->SetPosition(curpos); + + ScrollView(curpos, FALSE); + + Message.Result = true; +} +//--------------------------------------------------------------------------- + +void TStylePanel::SetSelect( TCommonItem *pItem, int iLine ) +{ + if( pItem!=m_pSelItem ){ + if( m_bPlaying ) + Stop(); + + if( m_pSelItem ){ + m_pSelItem->Select( false ); + + if( m_iSelLine>=0 && m_iSelLineSelect( true ); + + if( iLine>=0 && iLinepStyle->idLoc, + idStyle = ((TStyleItem*)pStyle)->pStyle->idStyle; + + int index=-1; + bool bCollected = false; + + for( int i=0; iidLoc==idLoc && g_aCollectStyles[i]->idStyle==idStyle ){ + bCollected = true; + index = i; + break; + } + } + +// pStyle->SetCollect( !bCollected ); + + if( bCollected ){ + //ɾCollect + g_aCollectStyles.erase( g_aCollectStyles.begin() + index ); + f_CM_SetCollectionStyle( false, idLoc, idStyle ); + } + else{ + //ӽ + g_aCollectStyles.push_back( ((TStyleItem*)pStyle)->pStyle ); + f_CM_SetCollectionStyle( true, idLoc, idStyle ); + } +} + +void __fastcall TStylePanel::WMMouseWheel(TWMMouseWheel &Message) +{ + if( m_editName && m_editName->Visible ) + return; + + if( m_VolTrackBar ){ +// if( m_Hint ) +// m_Hint->ReleaseHandle(); //ɾhint + + m_VolTrackBar->Perform( WM_MOUSEWHEEL, MAKELONG(0,Message.WheelDelta), NULL ); + } + else if( m_sbVert->IsOperable() ){ +// if( m_Hint ) +// m_Hint->ReleaseHandle(); //ɾhint + + UINT nSBCode; + + if( Message.WheelDelta>0 ) nSBCode = SB_LINEUP; + else nSBCode = SB_LINEDOWN; + + Perform( WM_VSCROLL, MAKELONG(nSBCode,0), NULL ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TStylePanel::UMMouseMove(TWMMouseMove &Message) +{ + TShiftState Shift(Message.Keys); + + if( m_pDragItem ){ + if( abs(Message.XPos-ptDown.X)>=4 + || abs(Message.YPos-ptDown.Y)>=4 ){ //ʼ϶ + DrawDragImg( m_pDragItem ); + + int left = LEFT_BOUND, + iLine = (ptDown.Y - m_nTitleHeight)/m_nItemHeight, + top = iLine * m_nItemHeight + m_nTitleHeight; + + if( m_pDragItem->iType==SEGTYPE_TRACK ) + left += OPTION_WIDTH * 2; + else if( m_pDragItem->iType!=SEGTYPE_STYLE ) + left += OPTION_WIDTH; + + TPoint pt( left, top ); + pt = ClientToScreen( pt ); + + w_xOldDrag = w_xImgDrag = pt.X; + w_yOldDrag = w_yImgDrag = pt.Y; + + w_xOffDrag = ptDown.X - left; + w_yOffDrag = ptDown.Y - top; + } + } + else if( Shift.Empty() ){ + if( !Focused()) + SetFocus(); + + WORD iCol = 0; + int iHitLine = (Message.YPos - m_nTitleHeight)/m_nItemHeight; + TCommonItem* pItem = NULL; + + if( !m_sbVert->Visible || Message.XPos < m_sbVert->Left ) + pItem = HitTest( Message.XPos, Message.YPos-m_nTitleHeight, &iCol ); + +// pMove.X = Message.XPos; +// pMove.Y = (iHitLine+1)*m_nItemHeight +m_nTitleHeight ;//Message.YPos; + + if( pItem!=m_pFocItem || iCol!=m_iFocCol ){ +// Hint = ""; +// Hint = ""; + Application->CancelHint(); +// Application->ShowHint = false; + + if( pItem ){ + //hint + if( iCol==COL_TEXT ){ + Hint = pItem->HintText(); + } + else if( iCol==COL_FOLD ){ + if( pItem->iType==SEGTYPE_TRACK ){ + Hint = ""; + } + else{ + if( pItem->IsUnfold() ) + Hint = ""; + else + Hint = "չ"; + } + } + else{ + DWORD opt = pItem->GetOption( iCol ); + if( opt==OPT_DEL ){ + Hint = "ɾ"; + } + else if( opt==OPT_DOWNLOAD ){ + Hint = ""; + } + else if( opt==OPT_VOL ){ + int vol=0; + if( pItem->iType==SEGTYPE_TRACK ){ + TTrackItem* pTrk = (TTrackItem*)pItem; + vol = pTrk->pTrack->nVol; + } + else{ + TSegmentItem* pSeg = (TSegmentItem*)pItem; + vol = pSeg->volume; + } + + Hint = ":"+IntToStr(vol); + } + else if( opt==OPT_BRUSH){ + if( pItem->iType==SEGTYPE_TRACK ) + Hint = "ˢ"; + else + Hint = "ˢ"; + } + else if( opt==OPT_TEXTURE ){ + Hint = "֯"; + } + else if( opt==OPT_FONTPROG ){ + if(pItem->iType == SEGTYPE_STYLE) + Hint = "ɫ/"; + else + Hint = "ɫ/"; + } + else if( opt==OPT_COLLECT ){ + if( pItem->iType==SEGTYPE_STYLE ){ + if( pItem->IsCollected() ) + Hint = "ȡղ"; + else + Hint = "ղط"; + } + else if( pItem->iType==SEGTYPE_TRACK ){ + if( pItem->IsCollected() ) + Hint = "ȡ֯ղ"; + else + Hint = "ղ֯"; + } + } + else if( opt==OPT_SCORE ){ + TStyleItem * pStyItem = (TStyleItem*)pItem; + if( pStyItem->pStyle ){ + char buf[8]; + int score10; + if( pStyItem->pStyle->idLoc==0 ) + score10 = (int)(pStyItem->pStyle->pOrigin->score/10.0 + 0.5); + else + score10 = (int)(pStyItem->pStyle->pShare->score/10.0 + 0.5); + sprintf( buf, "%.1f", score10 / 10.0 ); + + Hint = "ǰ֣" + String(buf) + "\n ()"; + } + } + else if( opt==OPT_SAVE ){ + Hint = "Ϊط"; + } + else if( opt==OPT_IMPORT ){ + Hint = "MIDIƬ"; + } + else if( opt==OPT_UPLOAD ){ + Hint = "ԭ\n"; + } + else if( opt==OPT_CHARGE ){ + if( pItem->iType==SEGTYPE_STYLE ) + Hint = ChargeTip( (TStyleItem*)pItem ); + } + } + } + +// Hint = HintStr; +// Application->ShowHint = true; + } + + SetFocusedItem( pItem, iHitLine, iCol ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TStylePanel::WMMouseDown(TWMMouse &Message) +{ + TToolpalPanel::WMMouseDown(Message); + + if( Message.Result==1 ) + return; + +// if( m_HintTimer && m_HintTimer->Enabled ) +// m_HintTimer->Enabled = false; + + if( m_VolTrackBar ){ + delete m_VolTrackBar; + m_VolTrackBar = NULL; + } + + int iHitLine = (Message.YPos - m_nTitleHeight)/m_nItemHeight; + unsigned short iCol = 0; + TCommonItem* pItem = HitTest( Message.XPos, Message.YPos-m_nTitleHeight, &iCol ); + + SetFocusedItem( pItem, iHitLine, iCol ); + + if( !m_pFocItem ){ + SetSelect( NULL, -1 ); + } + else if( Message.Keys & MK_RBUTTON ){ + CMenuItem* pMenuItem = NULL; + m_PopMenu->ClearItems(); + + int index = -1; + if( m_pFocItem->aItems->Count>0 ){ + if( m_pFocItem->IsUnfold() ) + m_PopMenu->CreateMenu( "", "", DoFold ); + else + m_PopMenu->CreateMenu( "չ", "", DoFold ); + } + else if( m_pFocItem->iType==SEGTYPE_TRACK ){ + if( m_pFocItem->IsMute() ) + m_PopMenu->CreateMenu( "ȡ", "", DoMute ); + else + m_PopMenu->CreateMenu( "", "", DoMute ); + } + + if( index!=-1 ) + m_PopMenu->CreateMenu( "-" ); + + int iOnline = m_pFocItem->GetOnlineState(); + if( iOnline==e_Downloaded ){ + m_PopMenu->CreateMenu( "", "", DoPlay ); + pMenuItem = m_PopMenu->CreateMenu( "ֹͣ", "", DoStop ); + pMenuItem->Enabled = m_bPlaying; + + bool bBreak = true; + for( int i=0; iGetOption( COL_OPT<0 && opt!=OPT_CHARGE ){ + if( bBreak ){ + m_PopMenu->CreateMenu( "-" ); + //m_PopupMenu->AddMenuItem( "-" ); + bBreak = false; + } + + if( opt==OPT_DEL ){ + m_PopMenu->CreateMenu( "ɾ", "", DoDelete ); + if( m_pFocItem->iType==SEGTYPE_STYLE ){ + m_PopMenu->CreateMenu( "", "", DoRename ); + } + } + else if( opt==OPT_VOL ){ + m_PopMenu->CreateMenu( "", "", DoAdjustVolume ); + } + else if( opt==OPT_BRUSH ){ + if( m_pFocItem->iType==SEGTYPE_TRACK ) + m_PopMenu->CreateMenu( "ˢ", "", DoUseBrush ); + else + m_PopMenu->CreateMenu( "ˢ", "", DoUseBrush ); + } + else if( opt==OPT_TEXTURE ){ + m_PopMenu->CreateMenu( "֯", "", DoChangeTexture ); + } + else if( opt==OPT_FONTPROG ){ + if(m_pFocItem->iType == SEGTYPE_STYLE){ + m_PopMenu->CreateMenu( "ɫ/", "", DoChangeFontProg ); + + if( !g_lstOpusStages.empty() && ((TStyleItem*)m_pFocItem)->nBars==0 ){ + m_PopMenu->CreateMenu( "-" ); + m_PopMenu->CreateMenu( "滻ʹ÷", "", DoApplyUseStyle ); + } + } + else + m_PopMenu->CreateMenu( "ɫɫ", "", DoChangeFontProg ); + } + else if( opt==OPT_COLLECT ){ + String strMenu; + if( m_pFocItem->iType==SEGTYPE_STYLE ){ + if( m_pFocItem->IsCollected() ) + strMenu = "ȡղ"; + else + strMenu = "ղط"; + } + else if( m_pFocItem->iType==SEGTYPE_TRACK ){ + if( m_pFocItem->IsCollected() ) + strMenu = "ȡ֯ղ"; + else + strMenu = "ղ֯"; + } + if( !strMenu.IsEmpty() ) + m_PopMenu->CreateMenu( strMenu, "", DoCollect ); + } + else if( opt==OPT_SAVE ){ + m_PopMenu->CreateMenu( "-" ); + m_PopMenu->CreateMenu( "Ϊط...", "", DoSaveLocalStyle ); + } + else if( opt==OPT_IMPORT ){ + m_PopMenu->CreateMenu( "MIDIƬ...", "", DoImportSegment ); + } + } + } + + if( m_pFocItem->iType==SEGTYPE_STYLE ){ + if( m_pFocItem!=g_pUseStyle ){ + m_PopMenu->CreateMenu( "-" ); + + pMenuItem = m_PopMenu->CreateMenu( "滻ʹ÷", "", DoApplyUseStyle ); + pMenuItem->Enabled = !g_lstOpusStages.empty(); + + if( m_pFocItem!=g_pPreStyle ){ + m_PopMenu->CreateMenu( "滻Ԥ", "", DoApplyPreStyle ); + + m_PopMenu->CreateMenu( "-" ); + pMenuItem = m_PopMenu->CreateMenu( "ط", "", DoDownload ); + pMenuItem->Enabled = !g_bUpdateMandatory && SOFTWARE_ID!=e_Pro_Lite; + } + } + } + } + else if( iOnline==e_UnDownload ){ + pMenuItem = m_PopMenu->CreateMenu( "ط", "", DoDownload ); + pMenuItem->Enabled = !g_bUpdateMandatory && SOFTWARE_ID!=e_Pro_Lite; + pMenuItem = m_PopMenu->CreateMenu( "ȫ", "", DoDownloadAll ); + pMenuItem->Enabled = !g_bUpdateMandatory && SOFTWARE_ID!=e_Pro_Lite; + } + else{ + m_PopMenu->CreateMenu( "ȡ", "", DoCancelDownload ); + } + + m_PopMenu->Parent = this; + m_PopMenu->Show(Message.XPos,Message.YPos); + } + else if( Message.Keys & MK_LBUTTON ){ + if( m_iFocCol==COL_TEXT ){ // + if( StartDrag() ){ //׼϶ + if( m_pFocItem==m_pSelItem && m_pFocItem->iType==SEGTYPE_STYLE ){ + RenameTiming( 1 ); + } + + SetSelect( m_pFocItem, m_iFocLine ); + + m_pDragItem = m_pFocItem; + + ptDown.X = Message.XPos; + ptDown.Y = Message.YPos; + + SetCapture( Handle ); + } + } + else{ + DWORD opt = m_pFocItem->GetOption( m_iFocCol ); + + if( opt==OPT_VOL ){ // + SetSelect( m_pFocItem, m_iFocLine ); + + DoAdjustVolume( NULL ); + } + else if( opt==OPT_FONTPROG ){ //滻ɫ/ + SetSelect( m_pFocItem, m_iFocLine ); + DoChangeFontProg(NULL); + } + else if( opt==OPT_TEXTURE ){ + SetSelect( m_pFocItem, m_iFocLine ); + DoChangeTexture(NULL); + } + else if( opt==OPT_SAVE ){ + DoSaveLocalStyle( NULL ); + } + else if( opt==OPT_IMPORT ){ + DoImportSegment( NULL ); + } + } + } +} +//--------------------------------------------------------------------------- + +void __fastcall TStylePanel::UMMouseUp(TWMMouse &Message) +{ + TShiftState Shift(Message.Keys); + TCommonItem* pLastItem = NULL; + + if( m_pDragItem ){ + pLastItem = m_pDragItem; + + ReleaseCapture(); + m_pDragItem = NULL; + } + + if( Shift.Contains( ssLeft ) && m_pFocItem && m_iFocCol ){ + WORD iCol = 0; + int iHitLine = (Message.YPos - m_nTitleHeight)/m_nItemHeight; + TCommonItem* pItem = HitTest( Message.XPos, Message.YPos-m_nTitleHeight, &iCol ); + + if( pItem==m_pFocItem && iCol==m_iFocCol ){ + if( m_iFocCol==COL_TEXT ){ + SetSelect( m_pFocItem, m_iFocLine ); + } + else if( m_iFocCol==COL_FOLD ){ + if( m_pFocItem->iType==SEGTYPE_TRACK ){ + DoMute(NULL); + } + else{ + SetFold( m_pFocItem, m_iFocLine ); + } + } + else if( m_pFocItem->GetOption( m_iFocCol )==OPT_DEL ){ + if( m_pSelItem && ( m_pSelItem==m_pFocItem || m_pSelItem==m_pFocItem->up + || m_pFocItem->up && m_pSelItem==m_pFocItem->up->up )){ + Stop(); + } + + DeleteItem( m_pFocItem, m_iFocLine ); + + //ٴѡ񽹵 + pItem = HitTest( Message.XPos, Message.YPos-m_nTitleHeight, &iCol ); + SetFocusedItem( pItem, iHitLine, iCol ); + } + else if( m_pFocItem->GetOption( m_iFocCol )==OPT_DOWNLOAD ){ + DoDownload( NULL ); + } + else if( m_pFocItem->GetOption( m_iFocCol )==OPT_BRUSH ){ + if( m_pFocItem->GetOnlineState()==e_Downloaded ){ + SetSelect( m_pFocItem, m_iFocLine ); + PostMessage( Parent->Handle, UM_SHOWBRUSH, 0, LPARAM(m_pFocItem) ); + } + } + else if( m_pFocItem->GetOption( m_iFocCol )==OPT_COLLECT ){ //ղ + DoCollect(NULL); + //SetCollect(m_pFocItem); + //DrawItem( m_pFocItem,iHitLine,iCol ); + } + else if( m_pFocItem->GetOption( m_iFocCol )==OPT_SCORE ){ // + if( m_pFocItem->GetOnlineState()!=e_Downloaded ){ + DoDownload( NULL ); + } + else{ + SetSelect( m_pFocItem, m_iFocLine ); + + int iTop = Top + m_nTitleHeight + ( m_iFocLine + 1 ) * m_nItemHeight, + iRight = Left + Width - m_sbVert->Width - 2; + PostMessage( Application->MainFormHandle, UM_STYLESCORE, + MAKELONG( iTop, iRight ), + (LPARAM)((TStyleItem*)m_pFocItem)->pStyle ); + } + } + else if( m_pFocItem->GetOption( m_iFocCol )==OPT_UPLOAD ){ // + SetSelect( m_pFocItem, m_iFocLine ); + PostMessage( Parent->Handle, UM_UPLOADSTYLE, 0, LPARAM(m_pFocItem) ); + } + } + } +} +//--------------------------------------------------------------------------- + +void TStylePanel::DrawItem( TCommonItem *pItem, int iLine, WORD iCol ) +{ + TRect rect; + rect.Left = LEFT_BOUND; + rect.Right = Width - RIGHT_BOUND; + rect.Top = iLine * m_nItemHeight + m_nTitleHeight; + rect.Bottom = min( Height-1, (int)(rect.Top + m_nItemHeight) ); + + if( pItem ){ + pItem->DrawItem( Canvas, rect, iCol ); + } + else{ + Canvas->Brush->Color = clrBackground; + Canvas->FillRect( rect ); + } +} +//--------------------------------------------------------------------------- + +void TStylePanel::DrawDragImg( TCommonItem *pDragItem ) +{ + if( pDragItem ){ + w_imgDrag = new TImage(this); + w_imgDrag->Width = Width - LEFT_BOUND - RIGHT_BOUND - OPTION_WIDTH*3; + w_imgDrag->Height = m_nItemHeight-2; + + if( pDragItem->iType==SEGTYPE_TRACK ) + w_imgDrag->Width -= OPTION_WIDTH * 2; + else if( pDragItem->iType!=SEGTYPE_STYLE ) + w_imgDrag->Width -= OPTION_WIDTH; + + TRect rcDraw( 0, 0, w_imgDrag->Width, w_imgDrag->Height ); + + //Ƶɫ + w_imgDrag->Canvas->Brush->Color = clrSelback; + w_imgDrag->Canvas->FillRect( rcDraw ); + + //б + w_imgDrag->Canvas->Font->Assign( Canvas->Font ); + + if( m_pDragItem->iType==SEGTYPE_STYLE ) + w_imgDrag->Canvas->Font->Color = clrTextStyle; + else{ + w_imgDrag->Canvas->Font->Color = pDragItem->TextColor(); + } + + String strCaption = pDragItem->GetCaption(); + int Y = rcDraw.Top + ( OPTION_HEIGHT - Canvas->TextHeight(strCaption) )/2; + rcDraw.Left += LEFT_BOUND + OPTION_WIDTH; + + w_imgDrag->Canvas->Brush->Style = bsSolid; + w_imgDrag->Canvas->TextRect( rcDraw, rcDraw.Left, + Y, strCaption ); + + w_bDraging = true; + w_iDragMode = DM_ADJUSTSTYLE; + } +} +//--------------------------------------------------------------------------- + +bool TStylePanel::ShowDragImg( bool bShow, int iState ) +{ + bool bCanDrop = false; + int w = w_imgDrag->Width, + h = w_imgDrag->Height; + TPoint ptOld( w_xOldDrag, w_yOldDrag ), + ptNew( w_xImgDrag, w_yImgDrag ); + RECT rtInvalid; + + ptOld = ScreenToClient( ptOld ); + ptNew = ScreenToClient( ptNew ); + + if( w_iDragMode==DM_ADJUSTHEIGHT ){ + rtInvalid.left = 1; + rtInvalid.right = Width-1; + rtInvalid.top = Height; + rtInvalid.bottom = 0; + + if( ptOld.Y>0 && ptOld.Y0 && ptOld.Y+h0 && ptNew.Y0 && ptNew.Y+hHeight ) rtInvalid.bottom = Height; + + if( rtInvalid.bottom>rtInvalid.top ){ + InvalidateRect( Handle, &rtInvalid, false ); + } + } + else if( w_iDragMode==DM_ADJUSTSTYLE ){ + TPoint ptMouse( ptNew.X+w_xOffDrag, ptNew.Y+w_yOffDrag ); + + rtInvalid.left = 0; + rtInvalid.right = Width; + rtInvalid.top = Height; + rtInvalid.bottom = 0; + + if( ptOld.Y>0 && ptOld.Y0 && ptOld.Y+h0 && ptOld.X0 && ptOld.X+w0 && ptNew.Y0 && ptNew.Y+h0 && ptNew.X0 && ptNew.X+wLEFT_BOUND && ptMouse.Xm_nTitleHeight && ptMouse.YLEFT_BOUND && ptMouse.Xm_nTitleHeight && ptMouse.YHeight ) rtInvalid.bottom = Height; + if( rtInvalid.left<0 ) rtInvalid.left = 0; + if( rtInvalid.right>Width ) rtInvalid.right = Width; + + if( rtInvalid.bottom>rtInvalid.top && rtInvalid.right>rtInvalid.left ){ + InvalidateRect( Handle, &rtInvalid, false ); + } + + if( bShow && m_pDropItem ){ + //SetScrollTimer( ptMouse ); + SetScrollTimer( ptNew ); + } + } + else + return TToolpalPanel::ShowDragImg( bShow ); + + return bCanDrop; +} +//--------------------------------------------------------------------------- + +void TStylePanel::SetScrollTimer( TPoint ptMouse ) +{ + int X = ptMouse.X, + Y = ptMouse.Y; + + //жǷ + if( m_sbVert->Visible && X>LEFT_BOUND && XHeight-m_nItemHeight && Y0 && Y0 ) + iDirect = -1; + + if( iDirect!=0 ){ + if( !m_pTimer ){ + m_pTimer = new TTimer(this); + m_pTimer->OnTimer = TimerProc; +// m_pTimer->Tag = iDirect; +// m_pTimer->Interval = 500; +// m_pTimer->Enabled = true; + } + else if( m_pTimer->Tag!=iDirect ){ + m_pTimer->Enabled = false; + } + + m_pTimer->Tag = iDirect; + m_pTimer->Interval = 500; + m_pTimer->Enabled = true; + } + else if( m_pTimer && ( m_pTimer->Tag==1 + || m_pTimer->Tag==-1 ) ){ + delete m_pTimer; + m_pTimer = NULL; + } + } +} +//--------------------------------------------------------------------------- + +void TStylePanel::SetUnfoldTimer(TCommonItem *pItem, TCommonItem *pHoverItem) +{ + if( pItem && pItem->aItems->Count>0 && !pItem->IsUnfold() && pItem==pHoverItem){ + if( !m_pTimer ){ + m_pTimer = new TTimer(this); + m_pTimer->OnTimer = TimerProc; + m_pTimer->Enabled = false; + } + + if( pHoverItem!=m_pHoverItem && m_pTimer->Enabled ) + m_pTimer->Enabled = false; + + m_pTimer->Tag = 0; + m_pTimer->Interval = 1500; + m_pTimer->Enabled = true; + } + else{ + if( m_pTimer && m_pTimer->Tag==0 ){ + delete m_pTimer; + m_pTimer = NULL; + } + } +} +//--------------------------------------------------------------------------- + +void TStylePanel::SetFold( TCommonItem *pFoldItem, int iFoldLine ) +{ + if( !pFoldItem ) + return; + + bool bUnfold = !pFoldItem->IsUnfold(); + pFoldItem->SetUnfold( bUnfold ); + + if( bUnfold && pFoldItem==m_pHoverItem && pFoldItem->aItems->Count>0 ){ + TCommonItem* pSubItem = (TCommonItem*)m_pHoverItem->aItems->First(); + while( pSubItem!=m_pHoverItem->next ){ + pSubItem->SetHover( true ); + pSubItem = GetNextItem( pSubItem ); + } + } + + RECT rt; + rt.left = LEFT_BOUND; + rt.top = (iFoldLine>0 ? iFoldLine : 0) * m_nItemHeight + m_nTitleHeight, + rt.right = Width - RIGHT_BOUND; + rt.bottom = Height-1; + InvalidateRect( Handle, &rt, false ); + + //¼ѡк + if( m_pSelItem && m_iSelLine>iFoldLine ){ + if( m_pSelItem->up && ( m_pSelItem->up==pFoldItem || + m_pSelItem->up->up==pFoldItem )){ + m_pSelItem->Select( false ); + m_pSelItem = NULL; + m_iSelLine = -1; + Stop(); + } + else{ + int iSelLine = iFoldLine; + TCommonItem* pItem = pFoldItem; + + while( pItem ){ + if( pItem==m_pSelItem ){ + m_iSelLine = iSelLine; + break; + } + else{ + iSelLine++; + } + + pItem = GetNextItem( pItem ); + } + } + } + + if( pFoldItem->aItems->Count>0 ){ + // + TCommonItem* pSubItem = (TCommonItem*)pFoldItem->aItems->First(); + int count = 0; + while( pSubItem!=pFoldItem->next ){ //ʾ + count++; + pSubItem = GetNextItem( pSubItem ); + } + + if( bUnfold ) + m_nTotalLine += count; + else + m_nTotalLine -= count; + + ResetScrollBar(); + } +} +//--------------------------------------------------------------------------- + +void TStylePanel::DeleteItem( TCommonItem *pItem, int iLine ) +{ + if( !pItem ) + return; + + if( m_pFocItem==pItem || m_pFocItem && m_pFocItem->up==pItem + || m_pFocItem && m_pFocItem->up + && m_pFocItem->up->up==pItem ){ + m_pFocItem = NULL; + m_iFocLine = -1; + m_iFocCol = 0; + } + + if( m_pSelItem==pItem || m_pSelItem && m_pSelItem->up==pItem + || m_pSelItem && m_pSelItem->up + && m_pSelItem->up->up==pItem ){ + m_pSelItem = NULL; + m_iSelLine = -1; + Stop(); + } + + if( pItem->prev ) + pItem->prev->next = pItem->next; + if( pItem->next ) + pItem->next->prev = pItem->prev; + + //¼ѡк + if( iLine>=0 && m_pSelItem && m_iSelLine>iLine ){ + if( m_pSelItem->up && m_pSelItem->up==pItem ){ + m_pSelItem->Select( false ); + m_pSelItem = NULL; + m_iSelLine = -1; + Stop(); + } + else{ + int iSelLine = iLine; + TCommonItem* pTmpItem = GetNextItem(pItem); + + while( pTmpItem ){ + if( pTmpItem==m_pSelItem ){ + m_iSelLine = iSelLine; + break; + } + else{ + iSelLine++; + } + + pTmpItem = GetNextItem( pTmpItem ); + } + } + } + + if( m_pTopItem==pItem ){ + if( pItem->iType==SEGTYPE_TRACK ){ + m_pTopItem = GetNextItem( pItem ); + if( !m_pTopItem ){ + m_pTopItem = GetPrevItem( pItem ); + m_iTopLine--; + } + } + else{ + m_pTopItem = pItem->next ? pItem->next : pItem->prev; + } + } + + if( pItem->iType==SEGTYPE_STYLE ){ + if( pItem->IsUnfold() ){ + m_nTotalLine -= pItem->aItems->Count; + for( int i=0; iaItems->Count; i++ ){ + TSegmentItem* pSeg = (TSegmentItem*)pItem->aItems->Items[i]; + if( pSeg->IsUnfold() ){ + m_nTotalLine -= pSeg->aItems->Count; + } + } + } + + delete pItem; + m_aItems->Remove( pItem ); + + m_nTotalLine--; + } + else{ + TStyleItem * pStyItem = NULL; + if( pItem->iType==SEGTYPE_TRACK ){ + TCommonItem * pUp = pItem->up; + + if( pUp->up->IsUnfold() && pUp->IsUnfold() ) + m_nTotalLine--; + + ((TSegmentItem*)pUp)->DeleteTrack( pItem ); + +// pStyItem = (TStyleItem*)pUp->up; + } + else{ + pStyItem = (TStyleItem*)pItem->up; + + if( pStyItem->IsUnfold() ){ + m_nTotalLine--; + + if( pItem->IsUnfold() ) + m_nTotalLine -= pItem->aItems->Count; + } + + pStyItem->DeleteSegment( pItem ); + } + } + + ResetScrollBar(); + Paint(); +} +//--------------------------------------------------------------------------- + +void TStylePanel::SetHover( TCommonItem *pHoverItem, int iHoverLine ) +{ + if( m_pHoverItem!=pHoverItem ){ + //ԭHover־ + if( m_pHoverItem ){ + m_pHoverItem->SetHover( false ); + if( m_iHoverLine>=0 && m_iHoverLineIsUnfold() && m_pHoverItem->aItems->Count>0 ){ + TCommonItem* pSubItem = (TCommonItem*)m_pHoverItem->aItems->First(); + int iLine = m_iHoverLine+1; + while( pSubItem!=m_pHoverItem->next ){ //ʾ + pSubItem->SetHover( false ); + + if( iLine>=0 && iLineSetHover( true ); + if( iHoverLine>=0 && iHoverLineIsUnfold() && pHoverItem->aItems->Count>0 ){ + TCommonItem* pSubItem = (TCommonItem*)pHoverItem->aItems->First(); + int iLine = iHoverLine+1; + while( pSubItem!=pHoverItem->next ){ //ʾ + pSubItem->SetHover( true ); + + if( iLine>=0 && iLineTag!=0 ){ + ScrollView( m_iTopLine + m_pTimer->Tag ); + + if( m_iTopLine<=0 || m_iTopLine>=m_nTotalLine-m_nItemShow ){ + delete m_pTimer; + m_pTimer = NULL; + } + else if( m_pTimer->Interval>200 ){ + m_pTimer->Interval = 200; + } + } + else{ + SetFold( m_pHoverItem, m_iHoverLine ); + delete m_pTimer; + m_pTimer = NULL; + } + } +} +//--------------------------------------------------------------------------- + +void TStylePanel::Stop( DWORD dwSpec ) +{ + if( dwSpec==STOP_SELF ){ + if( m_bPlaying ) + f_MM_Stop(); + } + else{ + Parent->Perform( UM_STOP, dwSpec, 0 ); + } + + m_pPlayItem = NULL; + m_bPlaying = false; +} +//--------------------------------------------------------------------------- + +void __fastcall TStylePanel::MouseLeave(TObject* Sender) +{ + TPoint pt; + GetCursorPos(&pt); + pt = this->ScreenToClient(pt); + //뿪ǰ + if( pt.X<=0||pt.X>=this->Width - RIGHT_BOUND || pt.Y<=0 || pt.Y>=this->Height ) + { + if( m_VolTrackBar ){ + delete m_VolTrackBar; + m_VolTrackBar=NULL; + } + + SetFocusedItem( NULL, -1, 0 ); + } + else if( m_pFocItem ){ + if( !m_VolTrackBar && !m_PopMenu->Visible ){ + SetFocusedItem( NULL, -1, 0 ); + } + } +// +// if( m_Hint ){ +// m_Hint->ReleaseHandle(); +// delete m_Hint; +// m_Hint = NULL; +// HintStr = ""; +// } +// +// if( m_HintTimer ){ +// m_HintTimer->Enabled = false; +// delete m_HintTimer; +// m_HintTimer = NULL; +// } +} + +TCommonItem* TStylePanel::GetTrackHoverItem( TCommonItem* pItem, int& iHoverLine ) +{ + TCommonItem* pHoverItem = NULL; + + int stDrop = m_pDropItem->GetSegType(), + stHover = pItem->GetSegType(); +// snDrop = m_pDropItem->GetSegNo(), +// snHover = pItem->GetSegNo(); + + if( stDrop!=SEGTYPE_INTRO && stDrop!=SEGTYPE_ENDING && stDrop==stHover ){ + TSegmentItem *pSeg = NULL; + if( pItem->iType!=SEGTYPE_TRACK ) + pSeg = (TSegmentItem*)pItem; + else + pSeg = (TSegmentItem*)pItem->up; + + char chan = ((TTrackItem*)m_pDropItem)->pTrack->iChanNo; + + if( !pSeg->bAutoSpec || pSeg->aItems->Count<16 || chan==9 && pSeg->IsChanUsed(9) ){ + pHoverItem = pItem; + if( pItem->iType==SEGTYPE_TRACK ){ + do{ + iHoverLine--; + pHoverItem = GetPrevItem( pHoverItem ); + } + while( pHoverItem!=pSeg ); + } + } + } + + return pHoverItem; +} +//--------------------------------------------------------------------------- + +TTrackItem* TStylePanel::AddTrack( TSegmentItem* pSeg, TTrackItem* pSrcTrk, bool bOwn ) +{ + TTrackItem* pDestTrk = NULL; + + if( pSeg && pSrcTrk ){ + int nTrksBefore = pSeg->aItems->Count; + DWORD opts = OPT_DEL|OPT_VOL; + if( pSeg->iSegTypepTrack ); + + pDestTrk = pSeg->AddTrack( pSrcTrk->pStyle, pNewTrack, opts, bOwn ); + + int nTrksAfter = pSeg->aItems->Count; + + if( !pSeg->IsUnfold() ){ + SetFold( pSeg, m_iHoverLine ); + } + else if( nTrksAfter!=nTrksBefore ){ + m_nTotalLine += nTrksAfter-nTrksBefore; + } + + if( m_pSelItem ){ + m_pSelItem->Select( false ); + } + + pDestTrk->Select( true ); + m_pSelItem = pDestTrk; + + m_iSelLine = m_iHoverLine; + if( m_pHoverItem->iType!=SEGTYPE_TRACK ){ + m_iSelLine++; + TCommonItem* pItem = GetNextItem( m_pHoverItem ); + + while( pItem!=pDestTrk ){ + m_iSelLine++; + pItem = GetNextItem( pItem ); + } + } + } + + return pDestTrk; +} +//--------------------------------------------------------------------------- + +void __fastcall TStylePanel::DoubleClick(TObject* sender) +{ + if( m_pSelItem && m_iFocCol==COL_TEXT ){ + PlayDemo( m_pSelItem, g_nMelodyTempo ); + } +} +//--------------------------------------------------------------------------- + +void TStylePanel::PlayDemo( TCommonItem *pItem, int tempo ) +{ + if( !pItem ) + return; + + Stop( STOP_ALL ); + + int seed = time(NULL); + + int key = g_iMelodyKey; + if( key<0 || key>11 ) + key = seed % 12; + + char cType = (seed>>1) % 2; + + TStage* aStages = NULL; + int nStageNum = 0; + + if( pItem->iType==SEGTYPE_STYLE ){ // + TStyleItem* pStyle = (TStyleItem*)pItem; + if( tempo<0 ){ + if( pStyle->pStyle->idLoc==0 ) + tempo = pStyle->pStyle->pOrigin->detail.iTempo; + else if( pStyle->pStyle->idLoc==1 ) + tempo = pStyle->pStyle->pShare->iTempo; + else + tempo = pStyle->pStyle->pLocal->iTempo; + } + + int segCount = pStyle->nSegNum[SEGTYPE_VAR]; + int fillNum = pStyle->nSegNum[SEGTYPE_FILL]; + int barNum = fillNum>0 ? 3 : 4; + int repeat = fillNum>0 ? 2 : 1; + + vector aSegments[2]; + for( int i=0; iaItems->Count; i++ ){ + TSegmentItem* pSeg = (TSegmentItem*)pStyle->aItems->Items[i]; + int stype = pSeg->GetSegType(); + + if( stype==SEGTYPE_VAR ) + aSegments[0].push_back( pSeg ); + else if( stype==SEGTYPE_FILL) + aSegments[1].push_back( pSeg ); + } + + nStageNum = segCount * repeat; + aStages = new TStage[nStageNum]; + + for( int s=0; s>(s+2)) % 4; + + for( int k=0; kiSegType; + aStages[i].iSegKey = key; + + //chords + aStages[i].nBarNum = (k==0) ? barNum : 1; + aStages[i].aChords = new TBarChords[aStages[i].nBarNum]; + for( int j=0; jaItems->Count; + aStages[i].aTracks = new TComposeTrack[aStages[i].nTrkNum]; + for( int j=0; jaItems->Items[j]; + TTrack* pTrack = ((TTrackItem*)pSeg->aItems->Items[j])->pTrack; + TComposeTrack& track = aStages[i].aTracks[j]; + + track.iStyleLoc = pTrack->iStyleLoc;// pTrk->pStyle->idLoc; + track.iStyleId = pTrack->iStyleId;// pTrk->pStyle->idStyle; + track.iSegNo = pTrack->iSegNo; + track.iChanNo = pTrack->iChanNo; + track.iChanSpec = pTrack->iChanSpec; + track.iProg = pTrack->iProg;// >progCurr; + track.nVol = pTrack->nVol<0 ? 0 : pTrack->nVol * pSeg->volume / 100.0; + } + } + } + } + else{ + if( tempo<0 ){ + TStyleItem* pStyItem = pItem->GetStyleItem(); + if( pStyItem->pStyle->idLoc==0 ) + tempo = pStyItem->pStyle->pOrigin->detail.iTempo; + else if( pStyItem->pStyle->idLoc==1 ) + tempo = pStyItem->pStyle->pShare->iTempo; + else + tempo = pStyItem->pStyle->pLocal->iTempo; + } + + int stype = pItem->GetSegType(); +// sno = pItem->GetSegNo(); + + int barNum = 4; + if( stype>=SEGTYPE_INTRO ){ + TSegmentItem* pSeg = pItem->iType==SEGTYPE_TRACK + ? (TSegmentItem*)pItem->up + : (TSegmentItem*)pItem; + barNum = pSeg->nBars; + } + + nStageNum = 1; + aStages = new TStage[1]; + aStages->iSegType = stype; + aStages->iSegKey = key; + aStages->nBarNum = barNum; + + int trkNum = 1; + TTrack * pTrk = NULL; + char nSegVol = 100; + if( pItem->iType==SEGTYPE_TRACK ){ + pTrk = ((TTrackItem*)pItem)->pTrack; + nSegVol = ((TSegmentItem*)pItem->up)->volume; + } + else{ + trkNum = pItem->aItems->Count; + nSegVol = ((TSegmentItem*)pItem)->volume; + } + + aStages->nTrkNum = trkNum; + aStages->aTracks = new TComposeTrack[trkNum]; + for( int i=0; iiType!=SEGTYPE_TRACK ) + pTrk = ((TTrackItem*)pItem->aItems->Items[i])->pTrack; + + aStages->aTracks[i].iStyleId = pTrk->iStyleId; + aStages->aTracks[i].iStyleLoc = pTrk->iStyleLoc; + + if( stype>=SEGTYPE_INTRO ){ + cType = (pTrk->iSegNo / 4 + 1) << 4; + int sno = pTrk->iSegNo % 4; + aStages->aTracks[i].iSegNo = sno + cType; + } + else + aStages->aTracks[i].iSegNo = pTrk->iSegNo; + + aStages->aTracks[i].iChanNo = pTrk->iChanNo; + aStages->aTracks[i].iChanSpec = pTrk->iChanSpec; + aStages->aTracks[i].iProg = pTrk->iProg;// >progCurr; + aStages->aTracks[i].nVol = pTrk->nVol<0 ? 0 : pTrk->nVol * nSegVol / 100.0; + } + + if( stype<=SEGTYPE_FILL ){ + int iPreset = (seed>>2) % 4; + + aStages->aChords = new TBarChords[barNum]; + for( int j=0; jaChords[j].iKey[0] + = aStages->aChords[j].iKey[1] + = aStages->aChords[j].iKey[2] + = aStages->aChords[j].iKey[3] = chordKey; + aStages->aChords[j].iType[0] + = aStages->aChords[j].iType[1] + = aStages->aChords[j].iType[2] + = aStages->aChords[j].iType[3] = chordType; + } + } + } + + int len = 1000000; + BYTE* data = new BYTE[len]; + int ret = f_CM_Compose( &len, data, g_iMelodyTimeSignature, tempo, + nStageNum, aStages, false, NULL, NULL ); + + if( ret==0 ){ + f_MM_LoadDemo( data, len ); + f_MM_PlayDemo( Handle, -1, -1, -1, -1, NULL ); + m_pPlayItem = pItem; + m_bPlaying = true; + } + else{ + DebugPrint( "Compose error: %d", ret ); + } + + delete[] data; + + SAFE_DELETE_ARRAY(aStages); +} +//--------------------------------------------------------------------------- + +void TStylePanel::VolumeChanged( TCommonItem *pItem, char volNew ) +{ + char &refVol = pItem->iType==SEGTYPE_TRACK ? ((TTrackItem*)pItem)->pTrack->nVol + : ((TSegmentItem*)pItem)->volume, + volOld = refVol; + + if( volNew==(char)0x80 ){ + pItem->SetMute( !pItem->IsMute() ); + volNew = refVol; + } + else{ + if( volOld<0 ) + volNew |= 0x80; + refVol = volNew; + } + + if( m_bPlaying && ( pItem==m_pSelItem + || pItem->up && ( pItem->up==m_pSelItem + || pItem->up->up && pItem->up->up==m_pSelItem ))){ + int iStartBar, iEndBar, vol, segCount, fillNum, repeat = 1; + + TSegmentItem* pSeg = pItem->iType==SEGTYPE_TRACK + ? (TSegmentItem*)pItem->up + : (TSegmentItem*)pItem; + + if( m_pSelItem->iType==SEGTYPE_STYLE ){ + if( pSeg->iSegType<=SEGTYPE_FILL ){ + segCount = ((TStyleItem*)m_pSelItem)->nSegNum[SEGTYPE_VAR]; + fillNum = ((TStyleItem*)m_pSelItem)->nSegNum[SEGTYPE_FILL]; + int barNum = 1; + + if( pSeg->iSegType==SEGTYPE_VAR ){ + iStartBar = pSeg->iInd * 4; + barNum = fillNum>0 ? 3 : 4; + } + else{ + iStartBar = pSeg->iInd * 4 + 3; + repeat = segCount / fillNum; + } + + iEndBar = iStartBar + barNum; + } + else + repeat = 0; + } + else{ + iStartBar = 0; + + if( m_pSelItem->GetSegType()>=SEGTYPE_INTRO ){ + iEndBar = pSeg->nBars; + } + else + iEndBar = 4; + } + + for( int i=0; ivolume / 100.0; + + if( pItem->iType==SEGTYPE_TRACK ){ + TTrack* pTrk = ((TTrackItem*)pItem)->pTrack; + + vol = pTrk->nVol<0 ? 0 : pTrk->nVol * fSegVol; + f_MM_SetTrackEvent( MIDI_EVENT_VOLUME, iStartBar, iEndBar, + pTrk->iChanSpec, vol, -1 ); + } + else{ + for( int i=0; iaItems->Count; i++ ){ + TTrack* pTrk = ((TTrackItem*)pItem->aItems->Items[i])->pTrack; + + vol = pTrk->nVol<0 ? 0 : pTrk->nVol * fSegVol; + f_MM_SetTrackEvent( MIDI_EVENT_VOLUME, iStartBar, iEndBar, + pTrk->iChanSpec, vol, -1 ); + } + } + + iStartBar += fillNum * 4; + iEndBar = iStartBar + 1; + } + } +} +// --------------------------------------------------------------------------- + +void __fastcall TStylePanel::SetStyleItem( TStyleItem* pStyItem ) +{ + TStyleItem* pOldSty = m_aItems->Count > 0 ? (TStyleItem*)m_aItems->First() : NULL; + if( pOldSty==pStyItem ) + return; + + ClearAllItems(); + + if( pStyItem ){ + m_aItems->Add( pStyItem ); + m_nTotalLine++; + + if( pStyItem->aItems->Count==0 ){ + RestoreItems(); + } + + m_pTopItem = pStyItem; + SetFold( pStyItem, 0 ); + } + + ResetScrollBar(); + Paint(); +} +// --------------------------------------------------------------------------- + +void __fastcall TStylePanel::TrackBarChange(System::TObject* Sender) +{ + TCommonItem *pItem = (TCommonItem*)m_VolTrackBar->Tag; + + if( pItem ){ + VolumeChanged( pItem, m_VolTrackBar->Position ); + } +} +// --------------------------------------------------------------------------- + +//void __fastcall TStylePanel::HintTimerProc(System::TObject* Sender) +//{ +// if( m_HintTimer ) +// m_HintTimer->Enabled = false; +// +// if( m_Hint && HintStr.Length()>0 ){ +// m_Hint->ShowHintWindow( ClientToScreen(pMove), HintStr ); +// Application->Hint = HintStr; +// Hint = HintStr; +// Application->ActivateHint(ClientToScreen(pMove)); +// } +//} +// --------------------------------------------------------------------------- + +void __fastcall TStylePanel::DoDownload(TObject* Sender) +{ + if( m_pFocItem /*&& m_pFocItem->GetOnlineState()==e_UnDownload*/ ){ + TStyleItem* pStyItem = m_pFocItem->GetStyleItem(); + + HRESULT ret = 0; + if( pStyItem->pStyle->idLoc==0 ) + ret = f_CS_DownloadStyle( pStyItem->pStyle->idStyle, Handle ); + else if( pStyItem->pStyle->idLoc==1 ){ + for( int i=0; iaItems->Count; i++ ){ + TSegmentItem* pSeg = (TSegmentItem*)pStyItem->aItems->Items[i]; + for( int j=0; jaItems->Count; j++ ){ + TTrackItem* pTrk = (TTrackItem*)pSeg->aItems->Items[j]; + if( pTrk->pStyle->idLoc==0 && pTrk->pStyle->pOrigin->state==e_UnDownload ){ + ret = f_CS_DownloadStyle( pTrk->pStyle->idStyle, Handle ); + if( ret==0 ) + pTrk->pStyle->pOrigin->state = e_Downloading; + } + } + } + } + + if( ret==0 ){ + m_pFocItem->SetOnlineState( e_Downloading ); + } + else{ + DebugPrint( "DownloadStyle error : %d\n", ret ); + } + } +} +// --------------------------------------------------------------------------- + +void __fastcall TStylePanel::DoDownloadAll(TObject* Sender) +{ + for( int i=0; iCount; i++ ){ + TStyleItem* pItem = (TStyleItem*)m_aItems->Items[i]; + + if( pItem->pStyle && pItem->pStyle->idLoc==0 + && pItem->pStyle->pOrigin->state==e_UnDownload ){ + HRESULT ret = f_CS_DownloadStyle( pItem->pStyle->idStyle, Handle ); + + if( ret==0 ) + pItem->pStyle->pOrigin->state = e_Downloading; + else + DebugPrint( "DownloadStyle error : %d\n", ret ); + } + } + + Paint(); +} +// --------------------------------------------------------------------------- + +void __fastcall TStylePanel::DoCancelDownload(TObject* Sender) +{ + f_CS_CancelOperation(); + + for( int i=0; iCount; i++ ){ + TStyleItem* pItem = (TStyleItem*)m_aItems->Items[i]; + + if( pItem->pStyle && pItem->pStyle->idLoc==0 + && pItem->pStyle->pOrigin->state==e_Downloading ) + pItem->pStyle->pOrigin->state = e_UnDownload; + } + + Paint(); +} +// --------------------------------------------------------------------------- + +void __fastcall TStylePanel::DoPlay(TObject* Sender) +{ + SetSelect( m_pFocItem, m_iFocLine ); + PlayDemo( m_pSelItem, g_nMelodyTempo ); +} +// --------------------------------------------------------------------------- + +void __fastcall TStylePanel::DoStop(TObject* Sender) +{ + Stop(); +} +// --------------------------------------------------------------------------- + +void __fastcall TStylePanel::DoFold(TObject* Sender) +{ + SetFold( m_pFocItem, m_iFocLine ); +} +// --------------------------------------------------------------------------- + +void __fastcall TStylePanel::DoMute(TObject* Sender) +{ +// m_pFocItem->SetMute( !m_pFocItem->IsMute() ); + + VolumeChanged( m_pFocItem, 0x80 ); + DrawItem( m_pFocItem, m_iFocLine, COL_FOLD ); +} +// --------------------------------------------------------------------------- + +void __fastcall TStylePanel::DoAdjustVolume(TObject* Sender) +{ + if( Sender ) + SetSelect( m_pFocItem, m_iFocLine ); + + if( m_pSelItem ){ + if( !m_VolTrackBar ){ + m_VolTrackBar = new TSkinTrackBar(this); + m_VolTrackBar->Parent = this; + m_VolTrackBar->ParentBackground = false; + m_VolTrackBar->Color = RGB(55,56,62);//RGB(69,74,84); + m_VolTrackBar->Orientation = true; + m_VolTrackBar->PageSize = 10; + + m_VolTrackBar->Height = 16; + m_VolTrackBar->Width = 63; + m_VolTrackBar->Min = 0; + } + + m_VolTrackBar->Top = m_iSelLine*m_nItemHeight+m_nTitleHeight + 1; + m_VolTrackBar->Left = Width - RIGHT_BOUND - 3*OPTION_WIDTH; + + m_VolTrackBar->Tag = (int)m_pSelItem; + + char vol = m_pSelItem->iType==SEGTYPE_TRACK ? ((TTrackItem*)m_pSelItem)->pTrack->nVol + : ((TSegmentItem*)m_pSelItem)->volume; + + m_VolTrackBar->Max = m_pSelItem->iType>=SEGTYPE_TRACK ? 127 : 100; + m_VolTrackBar->Position = vol & 0x7F; + + if( vol < 0 ) + m_VolTrackBar->Enabled = false; + + m_VolTrackBar->OnChange = TrackBarChange; + + m_VolTrackBar->SetFocus(); + } +} +// --------------------------------------------------------------------------- + +void __fastcall TStylePanel::DoUseBrush(TObject* Sender) +{ + if( Sender ) + SetSelect( m_pFocItem, m_iFocLine ); + + if( m_pSelItem && m_pSelItem->GetOnlineState()==e_Downloaded ){ + PostMessage( Parent->Handle, UM_SHOWBRUSH, 0, LPARAM(m_pFocItem) ); + } +} +// --------------------------------------------------------------------------- + +void __fastcall TStylePanel::DoDelete(TObject* Sender) +{ + if( m_pSelItem && ( m_pSelItem==m_pFocItem || m_pSelItem==m_pFocItem->up + || m_pFocItem->up && m_pSelItem==m_pFocItem->up->up )){ + Stop(); + } + + DeleteItem( m_pFocItem, m_iFocLine ); +} +// --------------------------------------------------------------------------- + +void __fastcall TStylePanel::SetFocusedItem( TCommonItem* pItem, int iLine, WORD iCol ) +{ +// if( pItem!=m_pFocItem || iCol!=m_iFocCol ){ +// if( m_Hint ){ +// m_Hint->ReleaseHandle(); +// delete m_Hint; +// m_Hint = NULL; +// } +// +// if( m_HintTimer ){ +// m_HintTimer->Enabled = false; +// delete m_HintTimer; +// m_HintTimer = NULL; +// } +// Hint = ""; +// } + +// if( !HintStr.IsEmpty() ){ +// Hint = HintStr; +// if( !m_Hint ){ +// m_Hint = new TSkinHintWindow(this); +// m_HintTimer = new TTimer(this); +// m_HintTimer->Interval = 800; +// m_HintTimer->OnTimer = HintTimerProc; +// } +// +// if( m_HintTimer ){ +// m_HintTimer->Enabled = false; +// m_HintTimer->Enabled = true; +// } +// } + + if( pItem!=m_pFocItem ){ + if( m_pFocItem ){ //ȡǰһ + m_pFocItem->SetFocus( 0 ); + + if( m_iFocLine>=0 ){ + DrawItem( m_pFocItem, m_iFocLine, m_iFocCol ); + } + } + + if( pItem ){ //ʾǰ + pItem->SetFocus( iCol ); + DrawItem( pItem, iLine, iCol ); + } + else{ +// HintStr = ""; + Hint = ""; + } + + m_pFocItem = pItem; + m_iFocLine = iLine; + m_iFocCol = iCol; + } + else{ + if( pItem && iCol!=m_iFocCol ){ + pItem->SetFocus( iCol ); + DrawItem( pItem, iLine, m_iFocCol ); //ȡǰһ + DrawItem( pItem, iLine, iCol ); //ʾǰ + } + + m_iFocLine = iLine; + m_iFocCol = iCol; + } +} +// --------------------------------------------------------------------------- + +void __fastcall TStylePanel::DoApplyPreStyle(TObject* Sender) +{ + if( m_pFocItem && m_pFocItem->GetOnlineState()==e_Downloaded ){ + PostMessage( Parent->Handle, UM_APPLYSTYLE, 0, LPARAM(m_pFocItem) ); + } +} +// --------------------------------------------------------------------------- + +void __fastcall TStylePanel::DoApplyUseStyle(TObject* Sender) +{ + if( m_pFocItem && m_pFocItem->GetOnlineState()==e_Downloaded ){ + PostMessage( Parent->Handle, UM_APPLYSTYLE, 1, LPARAM(m_pFocItem) ); + } +} +// --------------------------------------------------------------------------- + +void __fastcall TStylePanel::DoSaveLocalStyle(TObject* Sender) +{ + if( m_pFocItem ){ + PostMessage( Parent->Handle, UM_SAVELOCALSTYLE, 0, 0 ); + } +} +// --------------------------------------------------------------------------- + + diff --git a/StylePanel.h b/StylePanel.h new file mode 100644 index 0000000..c714aba --- /dev/null +++ b/StylePanel.h @@ -0,0 +1,144 @@ +//--------------------------------------------------------------------------- + +#ifndef StylePanelH +#define StylePanelH + +#include "StyleItem.h" +#include "ToolpalPanel.h" +#include "SkinTrackBar.h" +#include "SkinHintWindow.h" +//#include "PopMenuUnit.h" + +class TStylePanel : public TToolpalPanel +{ +protected: + TCommonItem * m_pTopItem, *m_pFocItem, *m_pSelItem, + *m_pDragItem, *m_pDropItem, *m_pHoverItem, *m_pPlayItem; + int m_nItemShow, m_nTotalLine, + m_nItemHeight, m_nItemWidth, + m_iFocLine, m_iSelLine, m_iTopLine, m_iHoverLine, + m_iFocCol; + + bool m_bPlaying; + + TPoint ptDown; + + System::Classes::TList* m_aItems; + TTimer *m_pTimer; + + TSkinTrackBar* m_VolTrackBar; +// TPopMenuBar *m_PopupMenu; //Ҽ˵ + TEdit* m_editName; + +// TSkinHintWindow* m_Hint; +// TTimer *m_HintTimer; +// TPoint pMove; +// String HintStr; + + virtual void Init()=0; + void CalcViewArea(); + void ScrollView( int nPos, bool bRedraw=true ); + void ResetScrollBar(); + void ShowSelItem(); + + // + void __fastcall TrackBarChange(System::TObject* Sender); + +// void __fastcall HintTimerProc(System::TObject* Sender); + + TCommonItem* GetItem( int iSty, int iSeg, int iTrk ); + TCommonItem* GetNextItem( TCommonItem *pItem ); + TCommonItem* GetPrevItem( TCommonItem *pItem ); + virtual void ClearAllItems(); + virtual void DeleteItem( TCommonItem *pItem, int iLine ); + virtual void RestoreItems(){}; + + TStyleItem* __fastcall AddStyle( TPROSTYLE* info, DWORD opts=0 ); + TTrackItem* AddTrack( TSegmentItem* pSeg, TTrackItem* pDropTrk, bool bOwn=true ); + + TCommonItem* HitTest( int X, int Y, WORD* iCol ); + + void SetFold( TCommonItem *pFoldItem, int iFoldLine ); + void SetHover( TCommonItem *pItem, int iLine ); + virtual void SetSelect( TCommonItem *pItem, int iLine ); + + void DrawItem( TCommonItem *pItem, int iLine, WORD iCol ); + void DrawDragImg( TCommonItem *pDragItem ); + + void SetUnfoldTimer(TCommonItem *pItem, TCommonItem *pHoverItem); + TCommonItem* GetTrackHoverItem( TCommonItem* pItem, int &iHoverLine ); + + virtual bool StartDrag()=0; + virtual void SetScrollTimer(TPoint ptMouse); + virtual void HandleDropEvent( int iState ){}; + virtual bool HandleHoverEvent(TPoint ptMouse){return false;}; + virtual void SetCollect(TCommonItem* pStyItem); //add laq + virtual void PlayDemo( TCommonItem *pItem, int tempo ); + virtual void VolumeChanged( TCommonItem *pItem, char volNew ); + virtual String ChargeTip( TStyleItem* pItem ){ return ""; }; + + virtual void __fastcall DoubleClick(TObject* sender); + void __fastcall TimerProc(TObject* Sender); + void __fastcall MouseLeave(TObject* Sender); + + void __fastcall DoDownload(TObject* Sender); + void __fastcall DoDownloadAll(TObject* Sender); + void __fastcall DoCancelDownload(TObject* Sender); + void __fastcall DoPlay(TObject* Sender); + void __fastcall DoStop(TObject* Sender); + void __fastcall DoFold(TObject* Sender); + void __fastcall DoMute(TObject* Sender); + void __fastcall DoAdjustVolume(TObject* Sender); + void __fastcall DoUseBrush(TObject* Sender); + void __fastcall DoDelete(TObject* Sender); + void __fastcall DoApplyPreStyle(TObject* Sender); + void __fastcall DoApplyUseStyle(TObject* Sender); + void __fastcall DoSaveLocalStyle(TObject* Sender); + + virtual void __fastcall DoHandleMessage(MSG &Msg, bool &Handled); //Ϣ + virtual void __fastcall DoCollect(TObject* Sender){}; + virtual void __fastcall DoChangeFontProg(TObject* Sender){}; + virtual void __fastcall DoChangeTexture(TObject* Sender){}; + virtual void __fastcall DoImportSegment(TObject* Sender){}; + virtual void __fastcall DoRename(TObject* Sender){}; + virtual void __fastcall RenameTiming(int op){}; + + virtual MESSAGE void __fastcall WMMouseDown(TWMMouse &Message); + virtual MESSAGE void __fastcall UMMouseUp(TWMMouse &Message); + virtual MESSAGE void __fastcall WMSize(Winapi::Messages::TWMSize &Message); + MESSAGE void __fastcall WMVScroll(Winapi::Messages::TWMScroll &Message); + MESSAGE void __fastcall WMMouseWheel(TWMMouseWheel &Message); + MESSAGE void __fastcall UMMouseMove(TWMMouse &Message); + + BEGIN_MESSAGE_MAP +// MESSAGE_HANDLER(WM_SIZE, TWMSize, WMSize) + MESSAGE_HANDLER(WM_VSCROLL, TWMVScroll, WMVScroll) + MESSAGE_HANDLER(WM_MOUSEWHEEL, TWMMouseWheel, WMMouseWheel) + MESSAGE_HANDLER(UM_MOUSEMOVE, TWMMouseMove, UMMouseMove) + MESSAGE_HANDLER(UM_MOUSEUP, TWMMouse, UMMouseUp) + END_MESSAGE_MAP(TToolpalPanel) + + virtual void __fastcall CreateWnd(); + virtual void __fastcall Paint(void); + +public: + __fastcall TStylePanel(System::Classes::TComponent* AOwner); + __fastcall ~TStylePanel(); + + static void LoadImages(); + static void FreeImages(); + + void InitItems(); + virtual void __fastcall SetStyleItem( TStyleItem* pStyItem ); + virtual bool __fastcall GetPrebeat( BYTE* pData, int& nSize ){ return false; }; + + void __fastcall SetFocusedItem( TCommonItem* pItem, int iLine, WORD iCol ); + virtual void Stop( DWORD dwSpec=STOP_SELF ); + virtual bool ShowDragImg( bool bShow=true, int iState=0 ); + TCommonItem* GetDragItem(){ return m_pDragItem; }; + TCommonItem* GetDropItem(){ return m_pDropItem; }; + virtual void SetDropItem( TCommonItem* pItem ){ m_pDropItem = pItem; }; +}; + +//--------------------------------------------------------------------------- +#endif diff --git a/StyleSelPanel.cpp b/StyleSelPanel.cpp new file mode 100644 index 0000000..0eb36f5 --- /dev/null +++ b/StyleSelPanel.cpp @@ -0,0 +1,641 @@ +//--------------------------------------------------------------------------- + +#pragma hdrstop + +#include "StyleSelPanel.h" +#include "GlobalUnit.h" +#include +//--------------------------------------------------------------------------- +#pragma package(smart_init) + +#define MAX_WIDTH 400 +#define MIN_WIDTH 200 + +#define FRAME_TOP 20 +#define FRAME_LEFT 14 +#define FRAME_BOTTOM 12 + +#define SEL_LINE 40 //ҳ +#define SEL_HEIGH 15 +#define SEL_RIGHT 20 + +#define BTN_TOP 5 +#define BTN_LEFT 0 +#define BTN_WIDTH 70 +#define BTN_HEIGHT 16 + +#define MAX_EDIT_W 250 +__fastcall SearchItem::SearchItem( System::Classes::TComponent* AOwner ) + : TCKBox(AOwner) +{ + count = 0; +} +__fastcall SearchItem::~SearchItem(void) +{ + +} + +__fastcall TStyleSelPanel::TStyleSelPanel(System::Classes::TComponent* AOwner) +: Vcl::Extctrls::TPanel(AOwner) +{ + Color = RGB(47,50,57); + m_ListStyle = new TList(); + m_ListInstrBtn = new TList(); + + //ӷ + AddStyleButton("",0); + AddStyleButton("ҥ",1); + AddStyleButton("ҡ",2); + AddStyleButton("",3); + AddStyleButton("ʿ",4); + AddStyleButton("",5); + AddStyleButton("ɣ",6); + AddStyleButton("ŵ",7); + AddStyleButton("Բ",8); + AddStyleButton("",-2); //޸Ϊ >9 + AddStyleButton("ȫѡ",-3,false); + AddStyleButton("ȫѡ",-3,false); + + // + AddInstrButton("",2,0,1); + AddInstrButton("",4,2,3,4,5); + AddInstrButton("",8,16,17,18,19,20,21,22,23); + AddInstrButton("ľ",2,24,25); + AddInstrButton("缪",3,25,26,27); + AddInstrButton("ʧ漪",2,29,30); + AddInstrButton("С",1,40); + AddInstrButton("",1,46); + AddInstrButton("",4,48,49,50,51); + AddInstrButton("С",1,56); + AddInstrButton("ͭ",3,61,62,63); + AddInstrButton("˹",4,64,65,66,67); + AddInstrButton("",1,73); + AddInstrButton("ϳ",8,80,81,82,83,84,85,86,87); + AddInstrButton("ϳɱ",8,88,89,90,91,92,93,94,95); + + //ѡ + for( int i=0; i<2; i++ ){ + m_lblSort[i] = new TLabel(this); + m_lblSort[i]->Visible = false; + m_lblSort[i]->Parent = this; + m_lblSort[i]->ControlStyle>>csOpaque; + m_lblSort[i]->Layout = tlCenter; + m_lblSort[i]->Font->Name = g_strTxtFontName; + + m_lblSort[i]->Font->Size = g_szFont9; + m_lblSort[i]->Font->Color = RGB( 156, 170, 189 ); + m_lblSort[i]->Height = BTN_HEIGHT; + m_lblSort[i]->Width = 30; + + m_cbSort[i] = new TComboBoxComponent(NULL); + m_cbSort[i]->Visible = false; + m_cbSort[i]->Parent = this; + m_cbSort[i]->Width = 60; + m_cbSort[i]->Height = BTN_HEIGHT; + m_cbSort[i]->SetFont(g_strTxtFontName, g_szFont9); + m_cbSort[i]->OnChange = SortChanged; + } + + m_lblSort[0]->Caption = "Ƚϣ"; + m_cbSort[0]->AddItem(""); + m_cbSort[0]->AddItem("۸"); + m_cbSort[0]->AddItem(""); + m_cbSort[0]->AddItem("ٶ"); + + m_lblSort[1]->Caption = "У"; + m_cbSort[1]->AddItem("ݼ"); + m_cbSort[1]->AddItem(""); + + m_LineEit = new TLineEdit(this); + m_LineEit->Visible = false; + m_LineEit->Parent = this; + m_LineEit->Color =RGB( 58,63,69 ); + m_LineEit->Font->Name = g_strTxtFontName; + m_LineEit->Font->Size = g_szFont9; + m_LineEit->Font->Color = RGB( 161,170,179 ); + m_LineEit->HintColor = RGB(161,170,179); + m_LineEit->HintText = "()"; + + OnMouseMove = CMMouseMove; + OnMouseDown = CMMouseDown; + + iSelect = SORT; + iMouse = -1; + oldX = 0; + oldY = 0; + oldAddLeft = 0; + + iSortType = 0; + iSortMode = 1; + + m_img = new TPngImage(); + m_img->LoadFromResourceName(int(HInstance), L"imgPylon"); +} + +__fastcall TStyleSelPanel::~TStyleSelPanel(void) +{ + for( int i=0; iCount; i++ ) + delete (SearchItem*)m_ListStyle->Items[i]; + m_ListStyle->Clear(); + delete m_ListStyle; + m_ListStyle = NULL; + + for( int i=0; iCount; i++ ) + delete (SearchItem*)m_ListInstrBtn->Items[i]; + m_ListInstrBtn->Clear(); + delete m_ListStyle; + m_ListStyle = NULL; + + if(m_LineEit){ + delete m_LineEit; + m_LineEit = NULL; + } + + for( int i=0; i<2; i++ ){ + delete m_lblSort[i]; + m_lblSort[i] = NULL; + delete m_cbSort[i]; + m_cbSort[i] = NULL; + } + + if(m_img){ + delete m_img; + m_img = NULL; + } +} + +void __fastcall TStyleSelPanel::CreateWnd(void) +{ + Vcl::Extctrls::TPanel::CreateWnd(); + + Canvas->Font->Name = g_strTxtFontName; + Canvas->Font->Quality = TFontQuality::fqClearTypeNatural; + Canvas->Font->Size = g_szFont9; +} + +void __fastcall TStyleSelPanel::WMEraseBkgnd(TWMEraseBkgnd &Message) +{ + + TRect rect = GetClientRect(); + + TCanvas* tempCanvas = new TCanvas; + tempCanvas->Handle = Message.DC; + + tempCanvas->Brush->Color = RGB(58,63,69); //ⱳ + tempCanvas->FillRect(rect); + + tempCanvas->Brush->Color = RGB(47,50,57); //ڱ + tempCanvas->FillRect(framRet); + + //ϱ + tempCanvas->Pen->Color = RGB(47,50,57); + tempCanvas->MoveTo(rect.Left, rect.Top); + tempCanvas->LineTo(rect.Right,rect.Top); + + tempCanvas->Pen->Color = RGB(30,31,36); // + tempCanvas->MoveTo(framRet.Left,framRet.Top); // + tempCanvas->LineTo(framRet.Left,framRet.Bottom); + tempCanvas->MoveTo(framRet.Left,framRet.Bottom); // + tempCanvas->LineTo(framRet.Right,framRet.Bottom); + tempCanvas->MoveTo(framRet.Right,framRet.Bottom); // + tempCanvas->LineTo(framRet.Right,framRet.Top); + + tempCanvas->MoveTo(framRet.Left,framRet.Top); // + tempCanvas->LineTo(framRet.Right -SEL_RIGHT - 2*SEL_LINE +5,framRet.Top ); + tempCanvas->MoveTo(framRet.Right -SEL_RIGHT,framRet.Top); + tempCanvas->LineTo(framRet.Right,framRet.Top); + + tempCanvas->MoveTo( 0,Height -1 ); + tempCanvas->LineTo( Width,Height -1 ); + + delete tempCanvas; + tempCanvas = NULL; + +} + + +void __fastcall TStyleSelPanel::Paint(void) +{ + for( int i=0; i<3; i++ ){ + if( iSelect!=i ) + DrawTab( i ); + } + DrawTab( iSelect ); +} + +void TStyleSelPanel::DrawTab( int index ) +{ + TPoint *P = new TPoint[4]; + String strText; + int l; + + if( index==INSTR ){ + strText = L""; + P[0].X = framRet.Right - SEL_RIGHT -2*SEL_LINE +5; + P[0].Y = framRet.Top; + P[1].X = framRet.Right - SEL_RIGHT - SEL_LINE + 5; + P[1].Y = framRet.Top; + P[2].X = framRet.Right - SEL_RIGHT - SEL_LINE; + P[2].Y = framRet.Top - SEL_HEIGH; + P[3].X = framRet.Right - SEL_RIGHT - 2*SEL_LINE + 10; + P[3].Y = framRet.Top - SEL_HEIGH; + l = framRet.Right - SEL_RIGHT -2*SEL_LINE+5; + } + else if( index==STYLE ){ + strText = L""; + P[0].X = framRet.Right - SEL_RIGHT -3*SEL_LINE +10; + P[0].Y = framRet.Top; + P[1].X = framRet.Right - SEL_RIGHT - 2*SEL_LINE + 10; + P[1].Y = framRet.Top; + P[2].X = framRet.Right - SEL_RIGHT - 2*SEL_LINE + 5; + P[2].Y = framRet.Top - SEL_HEIGH; + P[3].X = framRet.Right - SEL_RIGHT -3*SEL_LINE +15; + P[3].Y = framRet.Top - SEL_HEIGH; + l = framRet.Right - SEL_RIGHT -3*SEL_LINE+10; + + } + else{ + strText = L""; + P[0].X = framRet.Right - SEL_RIGHT -SEL_LINE; + P[0].Y = framRet.Top; + P[1].X = framRet.Right - SEL_RIGHT; + P[1].Y = framRet.Top; + P[2].X = framRet.Right - SEL_RIGHT -5; + P[2].Y = framRet.Top - SEL_HEIGH; + P[3].X = framRet.Right - SEL_RIGHT -SEL_LINE +5; + P[3].Y = framRet.Top - SEL_HEIGH; + l = framRet.Right - SEL_RIGHT -SEL_LINE; + } + + Canvas->Pen->Color = iSelect==index ? RGB(47,50,57) : RGB(30,31,36); + Canvas->Brush->Color = iSelect==index ? RGB(47,50,57) : RGB(58,63,69); + Canvas->Polygon(P,3); + Canvas->Draw( l, framRet.Top - SEL_HEIGH ,m_img ); + + Canvas->Font->Color = iMouse==index ? RGB(145,164,170) : RGB(120,126,148); +// Canvas->Font->Size = g_szFont8; + Canvas->TextOutW( P[3].X+4, P[3].Y+2, strText ); + + delete[] P; +} + +void __fastcall TStyleSelPanel::CMMouseMove(System::TObject* Sender, + System::Classes::TShiftState Shift, int X, int Y) +{ + TRect rct; + rct.init(framRet.Right-3*SEL_LINE-SEL_RIGHT+10,framRet.Top-SEL_HEIGH, + framRet.Right-SEL_RIGHT,framRet.Top+2); + + if( iSelect!=STYLE && X>framRet.Right-SEL_RIGHT-3*SEL_LINE+10 && XframRet.Top-SEL_HEIGH ) + { + if(iMouse != STYLE){ + iMouse = STYLE; + InvalidateRect(Handle,&rct,true); + } + } + + else if( iSelect!=INSTR && X>framRet.Right-SEL_RIGHT-2*SEL_LINE+5 && XframRet.Top-SEL_HEIGH ) + { + if(iMouse!=INSTR){ + iMouse = INSTR; + + InvalidateRect(Handle,&rct,true); + } + } + + else if( iSelect!=SORT && X>framRet.Right-SEL_LINE-SEL_RIGHT+5 && XframRet.Top-SEL_HEIGH ) + { + if( iMouse != SORT ){ + iMouse = SORT; + InvalidateRect(Handle,&rct,true); + } + + } + else if(iMouse!=-1){ + iMouse = -1; + InvalidateRect(Handle,&rct,true); + } + +} + +void __fastcall TStyleSelPanel::CMMouseDown(System::TObject* Sender, System::Uitypes::TMouseButton Button, + System::Classes::TShiftState Shift, int X, int Y) +{ + int iPos = -1; + + if( iSelect!=STYLE && X>framRet.Right-SEL_RIGHT-3*SEL_LINE+10 && XframRet.Top-SEL_HEIGH ) // + { + iPos = STYLE; + } + else if( iSelect!=INSTR && X>framRet.Right-SEL_RIGHT-2*SEL_LINE+5 && XframRet.Top-SEL_HEIGH ) // + { + iPos = INSTR; + + } + else if( iSelect!=SORT && X>framRet.Right-SEL_LINE-SEL_RIGHT+5 && XframRet.Top-SEL_HEIGH ) + { + iPos = SORT; + } + + if( iPos>=0 ){ + iSelect = iPos; + oldX = 0; + oldY = 0; + + int retHeight = GetHeight(); + if( Height!=retHeight ){ + Height = retHeight; + } + + Parent->Perform( WM_SIZE, 0, MAKELONG( Parent->Width, Parent->Height ) ); + Parent->Invalidate(); + } +} + +int TStyleSelPanel::GetHeight() +{ + framRet.init( FRAME_LEFT, FRAME_TOP, Width - FRAME_LEFT, Height - FRAME_BOTTOM ); + int btnWidth = Width - 2*FRAME_LEFT - BTN_LEFT; + int retHeight = Height; + + if( iSelect == STYLE ){ + int numX = btnWidth/( BTN_LEFT + BTN_WIDTH ); // + int numY = ceil(m_ListStyle->Count/(double)numX ); // + int AddLeft = (btnWidth - ((double)numX)*(BTN_WIDTH + BTN_LEFT))/((double)numX); + + if( oldX!=numX || oldY!=numY || oldAddLeft!=AddLeft ){ + oldX = numX; + oldY = numY; + oldAddLeft = AddLeft; + + for( int i=0; iCount; i++ ) + ((SearchItem*)m_ListInstrBtn->Items[i])->Visible = false; + + for( int i=0; i<2; i++ ){ + m_lblSort[i]->Visible = false; + m_cbSort[i]->Visible = false; + } + + retHeight = numY*(BTN_TOP+BTN_HEIGHT)+FRAME_TOP+FRAME_BOTTOM + BTN_TOP; + + for( int i=0; i= m_ListStyle->Count || m<0 ) + break; + + ((SearchItem*)m_ListStyle->Items[m])->Left = BTN_LEFT+framRet.Left + j*(BTN_WIDTH + BTN_LEFT + AddLeft); + ((SearchItem*)m_ListStyle->Items[m])->Top = BTN_TOP+framRet.Top + i*(BTN_TOP + BTN_HEIGHT); + + ((SearchItem*)m_ListStyle->Items[m])->Visible = true; + } + } + } + } + else if(iSelect == INSTR){ + int numX = btnWidth/( BTN_LEFT+BTN_WIDTH ); // + int numY = ceil(m_ListInstrBtn->Count/(double)numX ); // + int AddLeft = (btnWidth - ((double)numX)*(BTN_WIDTH + BTN_LEFT))/((double)numX); + + if( oldX!=numX || oldY!=numY || oldAddLeft!=AddLeft ){ + oldX = numX; + oldY = numY; + oldAddLeft = AddLeft; + + for( int i=0; iCount; i++ ) + ((SearchItem*)m_ListStyle->Items[i])->Visible = false; + + for( int i=0; i<2; i++ ){ + m_lblSort[i]->Visible = false; + m_cbSort[i]->Visible = false; + } + + retHeight = numY*(BTN_TOP+BTN_HEIGHT)+FRAME_TOP+FRAME_BOTTOM + BTN_TOP; + +// OutputDebugString(IntToStr(AddLeft).c_str()); + for( int i=0; i= m_ListInstrBtn->Count || m<0 ) + break; + + ((SearchItem*)m_ListInstrBtn->Items[m])->Left = BTN_LEFT+framRet.Left + j*(BTN_LEFT + BTN_WIDTH+AddLeft); + ((SearchItem*)m_ListInstrBtn->Items[m])->Top = BTN_TOP+framRet.Top + i*(BTN_TOP + BTN_HEIGHT); + + ((SearchItem*)m_ListInstrBtn->Items[m])->Visible = true; + } + } + } + } + else{ + for( int i=0; iCount; i++ ) + ((SearchItem*)m_ListInstrBtn->Items[i])->Visible = false; + + for( int i=0; iCount; i++ ) + ((SearchItem*)m_ListStyle->Items[i])->Visible = false; + + int numX = btnWidth / ( BTN_LEFT + m_lblSort[0]->Width + m_cbSort[0]->Width + 10 ), + numY = ceil( 2 / (double)numX ); + + for( int i=0; i= 2 || m<0 ) + break; + + m_lblSort[m]->Top = BTN_TOP+framRet.Top + i*(BTN_TOP + BTN_HEIGHT); + m_lblSort[m]->Visible = true; + m_lblSort[m]->Left = pos; + m_cbSort[m]->Top = BTN_TOP+framRet.Top + i*(BTN_TOP + BTN_HEIGHT); + m_cbSort[m]->Visible = true; + m_cbSort[m]->Left = m_lblSort[m]->Left + m_lblSort[m]->Width; + pos = m_cbSort[m]->Left + m_cbSort[m]->Width + 15; + } + } + + m_cbSort[0]->DefItemIndex = iSortType; + m_cbSort[1]->DefItemIndex = iSortMode; + + retHeight = numY*(BTN_TOP + BTN_HEIGHT) + FRAME_TOP + FRAME_BOTTOM + BTN_TOP; + } + + return retHeight; + +/* //LineEdit + m_LineEit->Left = framRet.Left + 3; + m_LineEit->Top = framRet.Top - SEL_HEIGH -3; + + if( framRet.Width()- SEL_RIGHT - 2*SEL_LINE < MAX_EDIT_W ) + m_LineEit->Width = framRet.Width()- SEL_RIGHT - 2*SEL_LINE; + else + m_LineEit->Width = MAX_EDIT_W; + + m_LineEit->Height = SEL_HEIGH-2; + +// if( !m_LineEit->Visible ) //ʾLineEdit +// m_LineEit->Visible = true; +*/ +} + +void __fastcall TStyleSelPanel::WMSize( Winapi::Messages::TWMSize &Message ) +{ + if( Message.Width>FRAME_LEFT && Message.Height>FRAME_BOTTOM ){ + framRet.init( FRAME_LEFT, FRAME_TOP, + Message.Width - FRAME_LEFT, + Message.Height - FRAME_BOTTOM ); + + int retHeight = GetHeight(); + if( Height!=retHeight ){ + Height = retHeight; + } + } + else{ + OutputDebugString( L"error." ); + } +} + +void __fastcall TStyleSelPanel::CMClick(System::TObject* Sender) +{ + if( ((SearchItem*)Sender)==m_ListStyle->Items[m_ListStyle->Count-2] ){ //ȫѡ + ((SearchItem*)m_ListStyle->Items[m_ListStyle->Count-2])->Checked = false; + + for( int i=0; iCount-2; i++ ){ + ((SearchItem*)m_ListStyle->Items[i])->Checked = true; + } + } + else if( ((SearchItem*)Sender)==m_ListStyle->Items[m_ListStyle->Count-1] ){ //ȫѡ + ((SearchItem*)m_ListStyle->Items[m_ListStyle->Count-1])->Checked = false; + + for( int i=0; iCount-2; i++ ){ + ((SearchItem*)m_ListStyle->Items[i])->Checked = false; + } + } + else if(iSelect==INSTR ){ + for( int i=0; iCount; i++ ){ + if( ((SearchItem*)m_ListInstrBtn->Items[i])!=((SearchItem*)Sender)&&((SearchItem*)m_ListInstrBtn->Items[i])->Checked ) + ((SearchItem*)m_ListInstrBtn->Items[i])->Checked = false; + } + } + + if( iSelect==STYLE){ + DStyle.Length = 0; //б + for(int i=0;iCount-2;i++){ //ȥȫѡȫѡť + if( ((SearchItem*)m_ListStyle->Items[i])->Checked ){ + DStyle[DStyle.Length++] = ((SearchItem*)m_ListStyle->Items[i])->Tag; + } + } + } + else if( iSelect==INSTR ){ + DInStr.Length = 0; //б + for( int i=0;iCount;i++ ){ + if( ((SearchItem*)m_ListInstrBtn->Items[i])->Checked ){ + for( int n= 0;n<((SearchItem*)m_ListInstrBtn->Items[i])->count;n++ ){ + DInStr[DInStr.Length++] = ((SearchItem*)m_ListInstrBtn->Items[i])->classify[n]; + } + } + } + } + + PostMessage( Parent->Handle, UM_SEARCH, NULL, NULL );//msg.WParam,msg.LParam ); +} + + +void TStyleSelPanel::AddStyleButton(String sCaption,int iTag,bool bCheck ) +{ + SearchItem *m_StyleBtn = new SearchItem(this); + m_StyleBtn->Parent = this; + m_StyleBtn->Visible = false; + m_StyleBtn->Width = BTN_WIDTH; + m_StyleBtn->Height = BTN_HEIGHT; + m_StyleBtn->BoxColor =RGB( 39,42,47 ); + m_StyleBtn->Font->Color = RGB( 145,164,170 ); + m_StyleBtn->Font->Name = g_strTxtFontName; + m_StyleBtn->Font->Size = g_szFont9; + m_StyleBtn->Caption = sCaption; + m_StyleBtn->Checked = bCheck; + m_StyleBtn->OnClick = CMClick; + m_StyleBtn->Tag = iTag; + + m_ListStyle->Add(m_StyleBtn); +} + +void TStyleSelPanel::AddInstrButton(String sCaption,int num,...) +{ + va_list parg; + + va_start(parg, num); + + SearchItem *m_InstrBtn = new SearchItem(this); + m_InstrBtn->Parent = this; + m_InstrBtn->Visible = false; + m_InstrBtn->Width = BTN_WIDTH; + m_InstrBtn->Height = BTN_HEIGHT; + m_InstrBtn->BoxColor = RGB( 39,42,47 );//RGB( 30,31,36 ); + m_InstrBtn->Font->Color = RGB( 145,164,170 ); + m_InstrBtn->Font->Name = g_strTxtFontName; + m_InstrBtn->Font->Size = g_szFont9; + m_InstrBtn->Caption = sCaption; + m_InstrBtn->OnClick = CMClick; + m_InstrBtn->count = num; + + va_start(parg, num); + for( int i=0;iclassify[i] = arg; + } + va_end(parg); + + m_ListInstrBtn->Add(m_InstrBtn); +} + +void __fastcall TStyleSelPanel::CMMouseEnter(Winapi::Messages::TMessage &Msg) +{ + Screen->Cursor = crDefault; +} + +void TStyleSelPanel::Reset(void) //ðť +{ + for( int i=0;iCount-2;i++ ){ + ((SearchItem*)m_ListStyle->Items[i])->Checked = true; + } + + DStyle.Length = 0; //б + for(int i=0;iCount-2;i++){ //аť + if( ((SearchItem*)m_ListStyle->Items[i])->Checked ){ + DStyle[DStyle.Length++] = ((SearchItem*)m_ListStyle->Items[i])->Tag; + } + } + + for( int i=0;iCount;i++ ){ + ((SearchItem*)m_ListInstrBtn->Items[i])->Checked = false; + } + DInStr.Length = 0; + + int retHeight = GetHeight(); + if( Height!=retHeight ){ + Height = retHeight; + } +} + +void __fastcall TStyleSelPanel::SortChanged(TComboBoxItem *Sender, int Index) +{ + bool bChanged = false; + if( iSortType!=m_cbSort[0]->DefItemIndex ){ + iSortType = m_cbSort[0]->DefItemIndex; + bChanged = true; + } + else if(iSortMode!=m_cbSort[1]->DefItemIndex ){ + iSortMode = m_cbSort[1]->DefItemIndex; + bChanged = true; + } + + if( bChanged ) + PostMessage( Parent->Handle, UM_SEARCH, NULL, NULL ); +} diff --git a/StyleSelPanel.h b/StyleSelPanel.h new file mode 100644 index 0000000..5ef2478 --- /dev/null +++ b/StyleSelPanel.h @@ -0,0 +1,85 @@ +//--------------------------------------------------------------------------- + +#ifndef StyleSelPanelH +#define StyleSelPanelH +//--------------------------------------------------------------------------- +#include +//#include "TextButton.h" +#include "CKBox.h" +#include "LineEdit.h" +#include "ComboBoxComponent.h" +#include "MessageDef.h" + +#define INSTR 0 +#define STYLE 1 +#define SORT 2 + + +class SearchItem : public TCKBox +{ +public: + int count; + char classify[20]; // + + __fastcall SearchItem( System::Classes::TComponent* AOwner ); + __fastcall ~SearchItem(void); +}; + +class TStyleSelPanel : public Vcl::Extctrls::TPanel +{ +private: + TRect framRet; + TPngImage *m_img; + TList *m_ListStyle; + TList *m_ListInstrBtn; + TLineEdit *m_LineEit; + TLabel *m_lblSort[2]; + TComboBoxComponent *m_cbSort[2]; + + int iMouse; + + int oldX; + int oldY; + int oldAddLeft; + + void AddStyleButton(String sCaption,int iTag,bool bCheck = true); + void AddInstrButton(String sCaption,int num,...); + void DrawTab( int index ); + int GetHeight(); +private: + virtual void __fastcall CreateWnd(); + virtual void __fastcall Paint(void); + void __fastcall CMClick(System::TObject* Sender); + void __fastcall SortChanged(TComboBoxItem *Sender, int Index); + + void __fastcall CMMouseMove(System::TObject* Sender, System::Classes::TShiftState Shift, int X, int Y); + void __fastcall CMMouseDown(System::TObject* Sender, System::Uitypes::TMouseButton Button, System::Classes::TShiftState Shift, int X, int Y); + + MESSAGE void __fastcall WMEraseBkgnd(TWMEraseBkgnd &Message); + MESSAGE void __fastcall WMSize(Winapi::Messages::TWMSize &Message); + MESSAGE void __fastcall CMMouseEnter(Winapi::Messages::TMessage &Msg); + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(WM_ERASEBKGND, TWMEraseBkgnd, WMEraseBkgnd) + MESSAGE_HANDLER(WM_SIZE, TWMSize, WMSize) + MESSAGE_HANDLER(CM_MOUSEENTER, TMessage, CMMouseEnter) + END_MESSAGE_MAP(Vcl::Extctrls::TPanel) +public: + int iSelect; // STYLE INSTR + int iSortType; // Time/Cost + int iSortMode; //ģʽ /˳ +// TList *LStyle; //STYLE Χ +// TList *LInStr; //INSTR Χ + System::DynamicArray DStyle; + System::DynamicArray DInStr; + + void Reset(void); + + __fastcall TStyleSelPanel(System::Classes::TComponent* AOwner); + __fastcall ~TStyleSelPanel(void); + + __property Canvas; + __property Width; +}; + +#endif diff --git a/StyleSpecsFormUnit.cpp b/StyleSpecsFormUnit.cpp new file mode 100644 index 0000000..78e1fc6 --- /dev/null +++ b/StyleSpecsFormUnit.cpp @@ -0,0 +1,78 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop + +#include "GlobalUnit.h" +#include "StyleSpecsFormUnit.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma link "GeneralDialogPanel" +#pragma link "TextButton" +#pragma resource "*.dfm" +TStyleSpecsForm *StyleSpecsForm; + +//--------------------------------------------------------------------------- +__fastcall TStyleSpecsForm::TStyleSpecsForm(TComponent* Owner, DWORD dwError) + : TForm(Owner) +{ + m_dwError = dwError; + + Font->Color = RGB(60,43,23); +} + +//--------------------------------------------------------------------------- +__fastcall TStyleSpecsForm::~TStyleSpecsForm() +{ +} + +//--------------------------------------------------------------------------- +void __fastcall TStyleSpecsForm::WMNCHitTest(TWMNCHitTest &Msg) +{ + TForm::Dispatch(&Msg); + + if( Msg.Result==HTCLIENT && Msg.YPosFont->Size = g_szFont9; + m_btnOk->FontSize = g_szFont9; + + m_lblSpecs1->Caption = "14"; + m_lblSpecs2->Caption = "2ӻ2"; + m_lblSpecs3->Caption = "3ǰ2"; + m_lblSpecs4->Caption = "4Сǰ2"; + m_lblSpecs5->Caption = "5β2"; + m_lblSpecs6->Caption = "6Сβ2"; + m_lblSpecs7->Caption = "7ȫɷ϶"; + m_lblSpecs8->Caption = "8ȫɱط϶"; + + m_aLabel[0] = m_lblSpecs1; + m_aLabel[1] = m_lblSpecs2; + m_aLabel[2] = m_lblSpecs3; + m_aLabel[3] = m_lblSpecs4; + m_aLabel[4] = m_lblSpecs5; + m_aLabel[5] = m_lblSpecs6; + m_aLabel[6] = m_lblSpecs7; + m_aLabel[7] = m_lblSpecs8; + + for( int i=0; iFont->Color = ( m_dwError & (1< +#include +#include +#include +#include +#include +#include +#include +#include "GeneralDialogPanel.h" +#include "TextButton.h" +//--------------------------------------------------------------------------- + +#define MAX_LABEL 8 + +class TStyleSpecsForm : public TForm +{ +__published: // IDE-managed Components + TGeneralDialogPanel *m_panBK; + TImage *m_iconError; + TTextButton *m_btnOk; + TLabel *m_lblSpecs1; + TLabel *m_lblSpecs2; + TLabel *m_lblSpecs3; + TLabel *m_lblSpecs4; + TLabel *m_lblSpecs5; + TLabel *m_lblSpecs6; + TLabel *m_lblSpecs8; + TLabel *m_lblSpecs7; + + void __fastcall FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift); + void __fastcall FormCreate(TObject *Sender); + +private: // User declarations + DWORD m_dwError; + + TLabel* m_aLabel[MAX_LABEL]; + void __fastcall WMNCHitTest(TWMNCHitTest &Msg); + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(WM_NCHITTEST, TWMNCHitTest, WMNCHitTest) + END_MESSAGE_MAP(TForm) +public: // User declarations + __fastcall TStyleSpecsForm(TComponent* Owner, DWORD dwError); + __fastcall ~TStyleSpecsForm(); + +}; +//--------------------------------------------------------------------------- +extern PACKAGE TStyleSpecsForm *StyleSpecsForm; +//--------------------------------------------------------------------------- +#endif diff --git a/StyleUploadFormUnit.cpp b/StyleUploadFormUnit.cpp new file mode 100644 index 0000000..c4255bf --- /dev/null +++ b/StyleUploadFormUnit.cpp @@ -0,0 +1,507 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop + +#include "StyleUploadFormUnit.h" +#include "GlobalUnit.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma link "CKBox" +#pragma link "GeneralDialogPanel" +#pragma link "LineEdit" +#pragma link "TextButton" +#pragma resource "*.dfm" + +TStyleUploadForm *StyleUploadForm; +//--------------------------------------------------------------------------- +__fastcall TStyleUploadForm::TStyleUploadForm(TComponent* Owner, TPROSTYLE* pStyle, bool bShare) + : TForm(Owner) +{ + m_bShare = bShare; + m_pStyle = pStyle; + m_iCheckCount = 0; + m_nScore = 0; + + memset( m_iStyleType, -1, MAX_TYPE ); +} +//--------------------------------------------------------------------------- + +void __fastcall TStyleUploadForm::FormCreate(TObject *Sender) +{ + m_GPanelBKG->Font->Size = g_szFont9; + m_btnOk->FontSize = g_szFont9; + m_btnCancel->FontSize = g_szFont9; + m_editStyleName->SetTextFont(g_strTxtFontName, g_szFont9); + m_editAuthor->SetTextFont(g_strTxtFontName, g_szFont9); + m_editCost->SetTextFont(g_strTxtFontName, g_szFont9); + + m_cbTypes[0] = m_checkPop; + m_cbTypes[1] = m_checkFolk; + m_cbTypes[2] = m_checkRock; + m_cbTypes[3] = m_checkDance; + m_cbTypes[4] = m_checkJazz; + m_cbTypes[5] = m_checkBlues; + m_cbTypes[6] = m_checkSamba; + m_cbTypes[7] = m_checkClassic; + m_cbTypes[8] = m_checkWaltz; + m_cbTypes[9] = m_checkIndpent; + m_cbTypes[10] = m_checkCountry; + m_cbTypes[11] = m_checkOthers; + + for(int i=0; i<12; i++ ){ + m_cbTypes[i]->Font->Name = g_strTxtFontName; + m_cbTypes[i]->Font->Size = g_szFont9; + } + + if( m_bShare ){ + PresetType(); + + m_nScore = SystemScore() + 500; + + char buf[16]; + int score10 = (int)(m_nScore/10.0 + 0.5); + sprintf( buf, "%.1f", score10 / 10.0 ); + + m_lblNote->Caption = buf; + m_lblCost->Caption = "ϵͳ֣"; + m_lblCost->Left = m_editCost->Left; + m_editCost->Visible = false; + m_lblProtocol->Visible = false; + m_lblTips->Top = m_btnOk->Top; + m_lblTips->Height = 30; + } + else{ + m_lblTips->Top = m_lblProtocol->Top - 24; + } + + m_editStyleName->Text = UTF8ToMBCS(m_pStyle->pLocal->strStyleName).c_str(); + m_editAuthor->Text = g_infoUser.strNickName; + + SetTransparent( this ); +} +//--------------------------------------------------------------------------- + +void __fastcall TStyleUploadForm::EditNameChange(TObject *Sender) +{ + TLineEdit* pEdit = ((TLineEdit*)Sender); + + AnsiString strName = pEdit->Text.Trim(); + string strTmp = GBToUTF8(strName.c_str()); + + if( strTmp.length()>pEdit->MaxLength ){ + pEdit->OnChange = NULL; + pEdit->Text = pEdit->Text.SubString( 0, pEdit->Text.Length()-1 ); + pEdit->SelStart = pEdit->Text.Length(); + pEdit->OnChange = EditNameChange; + } + + m_btnOk->Enabled = UploadEnabled(); +} +//--------------------------------------------------------------------------- + +void __fastcall TStyleUploadForm::MemoChange(TObject *Sender) +{ + TMemo* memo = (TMemo*)Sender; + + AnsiString strText = memo->Text.Trim(); + string strTmp = GBToUTF8(strText.c_str()); + if( strTmp.length()>memo->MaxLength ){ + memo->OnChange = NULL; + memo->Text = memo->Text.SubString( 0, memo->Text.Length()-1 ); + memo->SelStart = memo->Text.Length(); + memo->OnChange = MemoChange; + } + + m_btnOk->Enabled = UploadEnabled(); +} +//--------------------------------------------------------------------------- + +void __fastcall TStyleUploadForm::CheckBoxClick(TObject *Sender) +{ + int iType = ((TCKBox*)Sender)->Tag; + bool bChecked = ((TCKBox*)Sender)->Checked; + + bool bChanged = false; + + if( bChecked ){ + if( m_iCheckCount==MAX_TYPE ){ + ((TCKBox*)Sender)->Checked = false; + } + else{ + for( int k=0; kEnabled = UploadEnabled(); +} +//--------------------------------------------------------------------------- +void __fastcall TStyleUploadForm::AuthorChange(TObject *Sender) +{ + m_btnOk->Enabled = UploadEnabled(); +} +//--------------------------------------------------------------------------- + +void __fastcall TStyleUploadForm::CostChange(TObject *Sender) +{ + m_btnOk->Enabled = UploadEnabled(); +} +//--------------------------------------------------------------------------- + +void __fastcall TStyleUploadForm::GetShareInfo( TSTYLESHARE* pInfo ) +{ + AnsiString strText = m_editStyleName->Text.Trim(); + string strTmp = GBToUTF8(strText.c_str()); + strcpy( pInfo->strStyleName, strTmp.c_str() ); + + strText = m_editAuthor->Text.Trim(); + strTmp = GBToUTF8(strText.c_str()); + strcpy( pInfo->strAuthor, strTmp.c_str() ); + + strText = m_memoDescription->Text.Trim(); + strTmp = GBToUTF8(strText.c_str()); + strcpy( pInfo->strDescription, strTmp.c_str() ); + + memset( pInfo->type, -1, MAX_TYPE ); + int count = 0; + for( int i=0; iChecked ){ + pInfo->type[count++] = m_cbTypes[i]->Tag; + } + } + + pInfo->score = m_nScore; +} +//--------------------------------------------------------------------------- + +void __fastcall TStyleUploadForm::GetMakeInfo( TMAKESTYLEINFO* pInfo ) +{ + AnsiString strText = m_editStyleName->Text.Trim(); + string strTmp = GBToUTF8(strText.c_str()); + strcpy( pInfo->detail.strStyleName, strTmp.c_str() ); + + strText = m_editAuthor->Text.Trim(); + strTmp = GBToUTF8(strText.c_str()); + strcpy( pInfo->detail.strAuthor, strTmp.c_str() ); + + strText = m_memoDescription->Text.Trim(); + strTmp = GBToUTF8(strText.c_str()); + strcpy( pInfo->detail.strDescription, strTmp.c_str() ); + + memset( pInfo->detail.type, -1, 4 ); + int count = 0; + for( int i=0; iChecked ){ + pInfo->detail.type[count++] = m_cbTypes[i]->Tag; + } + } + + pInfo->cost = StrToInt( m_editCost->Text.Trim() ); +} +//--------------------------------------------------------------------------- + +void TStyleUploadForm::PresetType() +{ + TSTYLELOCAL* pLocal = m_pStyle->pLocal; + + UINT aStyleIDs[MAX_STYLE]; + memset( aStyleIDs, 0, MAX_STYLE*sizeof(UINT) ); + + int count = 0; + for( int i=0; counttrkRef[i][j][k].idLoc==0 + && pLocal->trkRef[i][j][k].idStyle==0 ) + break; + + int id = pLocal->trkRef[i][j][k].idStyle; + + bool bExist = false; + for( int j=0; j=MAX_STYLE ){ + break; + } + } + } + } + } + + for( int i=0; m_iCheckCountpOrigin->detail.type[j]>=0 ){ + char iType = pStyle->pOrigin->detail.type[j]; + char iCB = iType; + if( iType>=TYPE_NUM-1 ){ + iCB = TYPE_NUM-1; + iType = 127; + } + + bool bFound = false; + for( int k=0; kChecked = true; + + for( int k=0; k=MAX_TYPE ){ + break; + } + } + } + } + } +} +//--------------------------------------------------------------------------- + +int TStyleUploadForm::SystemScore() +{ + int score = 0; + + vector aSegID; + for( int s=0; s<4; s++ ){ + int repeat = s<2 ? 1 : 2; //ǰβС + + for( int r=0; rpLocal->trkRef[s][n][t]; + int sn = trkRef.segNo; + + if( trkRef.idStyle==0 ) + break; + + bool bDiffID = true; + for( int i=0; i0 ) + segScore += 5; + + aTrkID[nIDNum] = trkRef.idStyle; + aTrkSN[nIDNum] = sn; + aCount[nIDNum]++; + nIDNum++; + } + else{ + TPROSTYLE* pTrkStyle = GetStyleInfo( 0, trkRef.idStyle ); + TSTYLEDETAIL& detail = pTrkStyle->pOrigin->detail; + + for( int i=0; i<16; i++ ){ + TCHAN& trkOrig = detail.tracks[s][sn][i]; + if( trkOrig.no<0 ) + break; + + if( trkOrig.no==trkRef.chan ){ + if( trkOrig.prog!=trkRef.prog //޸ + || trkOrig.vol!=trkRef.vol ){ + segScore += 5; + } + + break; + } + } + } + } + + int maxCount = aCount[0], iMax = 0; + for( int i=1; imaxCount ){ + maxCount = aCount[i]; + iMax = i; + } + } + + if( segScore<25 ){ + TPROSTYLE* pSegStyle = GetStyleInfo( 0, aTrkID[iMax] ); + TSTYLEDETAIL& detail = pSegStyle->pOrigin->detail; + + int sn = aTrkSN[iMax]; + int tc; + for( tc=0; tc<16 && detail.tracks[s][sn][tc].no>=0; tc++ ); + + if( tc>aCount[iMax] ){ + segScore += 5 * ( tc-aCount[iMax] ); + } + } + + bool bDiffID = true; + for( int i=0; i0 ){ + segScore += 10; + bScore = true; + } + + aSegID.push_back( aTrkID[iMax] ); + } + + if( !bScore && m_pStyle->pLocal->nSegVol[s][n]<100 + && m_pStyle->pLocal->nSegVol[s][n]>50 ){ + segScore += 5; + } + + if( segScore>25 ) + segScore = 25; + + score += segScore; + } + } + } + + if( score>350 ) + score = 350; + + if( score<100 ){ + m_lblTips->Caption = + "ʾϵͳֵ6֣ϴ\n ϵͳֲοûֲ"; + m_lblTips->Font->Color = 0x004040FF; + } + + return score; +} +//--------------------------------------------------------------------------- + +bool TStyleUploadForm::UploadEnabled() +{ + if( m_bShare && m_nScore<600 ){ + return false; + } + + if( m_editStyleName->Text.Trim().IsEmpty() ){ + m_lblTips->Caption = "ʾ"; +// m_editStyleName->SetFocus(); + return false; + } + + if( m_editAuthor->Text.Trim().IsEmpty() ){ + if( m_bShare ) + m_lblTips->Caption = "ʾ"; + else + m_lblTips->Caption = "ʾ"; +// m_editAuthor->SetFocus(); + return false; + } + + if( !m_bShare && m_editCost->Text.Trim().IsEmpty() ){ + m_lblTips->Caption = "ʾʹü۸(0~9999)"; +// m_editCost->SetFocus(); + return false; + } + + if( m_iCheckCount==0 ){ + m_lblTips->Caption = "ʾѡ"; + return false; + } + + if( m_memoDescription->Text.Trim().IsEmpty() ){ + m_lblTips->Caption = "ʾϢ"; +// m_memoDescription->SetFocus(); + return false; + } + + m_lblTips->Caption = ""; + + return true; +} +//--------------------------------------------------------------------------- + +void __fastcall TStyleUploadForm::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) +{ + switch( Key ){ + case VK_RETURN: + if(m_btnOk->Enabled) + ModalResult = mrOk; + break; + + case VK_ESCAPE: + ModalResult = mrCancel; + break; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TStyleUploadForm::ProtocolMouseEnter(TObject *Sender) +{ + m_lblProtocol->Font->Style = TFontStyles()<Font->Color = clAqua; +} +//--------------------------------------------------------------------------- + +void __fastcall TStyleUploadForm::ProtocolMouseLeave(TObject *Sender) +{ + m_lblProtocol->Font->Style = TFontStyles()<Font->Color = clHighlight; +} +//--------------------------------------------------------------------------- + + +void __fastcall TStyleUploadForm::ProtocolClick(TObject *Sender) +{ + String strUrl = g_strServerURL; + strUrl += L"/index.php/Web?tpl=style_agreement"; + ShellExecute(Handle,NULL, strUrl.c_str(), NULL,NULL,SW_SHOWNORMAL); +} +//--------------------------------------------------------------------------- + diff --git a/StyleUploadFormUnit.dfm b/StyleUploadFormUnit.dfm new file mode 100644 index 0000000..f0e21a9 --- /dev/null +++ b/StyleUploadFormUnit.dfm @@ -0,0 +1,541 @@ +object StyleUploadForm: TStyleUploadForm + Left = 0 + Top = 0 + BorderIcons = [] + BorderStyle = bsNone + Caption = 'StyleUploadForm' + ClientHeight = 370 + ClientWidth = 431 + Color = clBtnFace + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + KeyPreview = True + Position = poMainFormCenter + OnCreate = FormCreate + OnKeyDown = FormKeyDown + TextHeight = 13 + object m_GPanelBKG: TGeneralDialogPanel + Left = 0 + Top = 0 + Width = 431 + Height = 370 + Align = alClient + Caption = #22635#20889#39118#26684#20449#24687 + Color = 5064257 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentBackground = False + ParentFont = False + TabOrder = 0 + object m_lblProtocol: TLabel + Left = 30 + Top = 341 + Width = 156 + Height = 14 + Cursor = crHandPoint + Hint = #25552#20132#39118#26684#34920#31034#24744#24050#30693#24713#24182#21516#24847#12298#20276#22863#39118#26684#21512#20316#21327#35758#12299#30340#20869#23481 + ParentCustomHint = False + Caption = #38405#35835#12298#20276#22863#39118#26684#21512#20316#21327#35758#12299 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clHighlight + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + Font.Quality = fqClearTypeNatural + ParentColor = False + ParentFont = False + ParentShowHint = False + ShowAccelChar = False + ShowHint = True + Transparent = True + Layout = tlCenter + OnClick = ProtocolClick + OnMouseEnter = ProtocolMouseEnter + OnMouseLeave = ProtocolMouseLeave + end + object m_lblCost: TLabel + Left = 230 + Top = 97 + Width = 36 + Height = 14 + Caption = #23450#20215#65306 + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentFont = False + ShowAccelChar = False + end + object m_lblDescription: TLabel + Left = 30 + Top = 206 + Width = 36 + Height = 14 + ParentCustomHint = False + Caption = #25551#36848#65306 + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentFont = False + ParentShowHint = False + ShowAccelChar = False + ShowHint = False + end + object m_lblNote: TLabel + Left = 340 + Top = 97 + Width = 58 + Height = 14 + Caption = '('#21809#20316#38899#31526')' + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentFont = False + ShowAccelChar = False + end + object m_lblType: TLabel + Left = 30 + Top = 144 + Width = 36 + Height = 14 + Hint = #27468#26354#39118#26684#12290#26368#22810#21487#36873'4'#31181 + ParentCustomHint = False + Caption = #20998#31867#65306 + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentFont = False + ParentShowHint = False + ShowAccelChar = False + ShowHint = True + end + object m_lblAuthor: TLabel + Left = 30 + Top = 96 + Width = 36 + Height = 14 + Caption = #20316#32773#65306 + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentFont = False + end + object m_lblStyleName: TLabel + Left = 30 + Top = 50 + Width = 36 + Height = 14 + Caption = #21517#31216#65306 + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentFont = False + end + object m_btnOk: TTextButton + Left = 276 + Top = 321 + Width = 52 + Height = 27 + ModalResult = mrOk + ParentShowHint = False + ShowHint = True + Enabled = False + Text = #30830#23450 + end + object m_btnCancel: TTextButton + Left = 342 + Top = 321 + Width = 52 + Height = 27 + ModalResult = mrCancel + ParentShowHint = False + ShowHint = True + Text = #21462#28040 + end + object m_lblTips: TLabel + Left = 30 + Top = 325 + Width = 227 + Height = 16 + ParentCustomHint = False + AutoSize = False + Caption = #25552#31034#65306#35831#36755#20837#39118#26684#25551#36848#20449#24687 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = 14339007 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + Font.Quality = fqClearTypeNatural + ParentColor = False + ParentFont = False + ParentShowHint = False + ShowAccelChar = False + ShowHint = False + Transparent = True + Layout = tlCenter + end + object m_memoDescription: TMemo + Left = 74 + Top = 207 + Width = 322 + Height = 90 + Hint = #35831#36755#20837#39118#26684#25551#36848 + BorderStyle = bsNone + Color = 15591652 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + MaxLength = 116 + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 3 + OnChange = MemoChange + end + object m_editStyleName: TLineEdit + Left = 74 + Top = 46 + Width = 262 + Height = 23 + OnChange = EditNameChange + HintText = #35831#36755#20837#39118#26684#21517#31216 + MaxLength = 36 + NumberMax = -1 + NumberMin = -1 + Color = 15591652 + TabOrder = 0 + end + object m_editAuthor: TLineEdit + Left = 74 + Top = 92 + Width = 127 + Height = 23 + OnChange = AuthorChange + HintText = #35831#36755#20837#20316#32773#21517#31216 + MaxLength = 36 + NumberMax = -1 + NumberMin = -1 + Color = 15591652 + TabOrder = 1 + end + object m_editCost: TLineEdit + Left = 272 + Top = 93 + Width = 64 + Height = 23 + OnChange = CostChange + HintText = '0~9999' + MaxLength = 30 + NumbersOnly = True + NumberMax = 9999 + NumberMin = -1 + Color = 15591652 + TabOrder = 2 + end + object m_checkBlues: TCKBox + Tag = 5 + Left = 175 + Top = 167 + Width = 48 + Height = 18 + Caption = #34013#35843 + Ctl3D = False + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentColor = True + ParentCtl3D = False + ParentDoubleBuffered = False + ParentFont = False + TabOrder = 4 + OnClick = CheckBoxClick + BoxColor = 3157548 + end + object m_checkPop: TCKBox + Left = 69 + Top = 143 + Width = 48 + Height = 18 + Caption = #27969#34892 + Ctl3D = False + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentColor = True + ParentCtl3D = False + ParentDoubleBuffered = False + ParentFont = False + TabOrder = 5 + OnClick = CheckBoxClick + BoxColor = 3157548 + end + object m_checkClassic: TCKBox + Tag = 7 + Left = 120 + Top = 167 + Width = 48 + Height = 18 + Caption = #21476#20856 + Ctl3D = False + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentColor = True + ParentCtl3D = False + ParentDoubleBuffered = False + ParentFont = False + TabOrder = 6 + OnClick = CheckBoxClick + BoxColor = 3157548 + end + object m_checkCountry: TCKBox + Tag = 10 + Left = 282 + Top = 167 + Width = 48 + Height = 18 + Caption = #20065#26449 + Ctl3D = False + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentColor = True + ParentCtl3D = False + ParentDoubleBuffered = False + ParentFont = False + TabOrder = 7 + OnClick = CheckBoxClick + BoxColor = 3157548 + end + object m_checkDance: TCKBox + Tag = 3 + Left = 228 + Top = 143 + Width = 48 + Height = 18 + Caption = #33310#26354 + Ctl3D = False + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentColor = True + ParentCtl3D = False + ParentDoubleBuffered = False + ParentFont = False + TabOrder = 8 + OnClick = CheckBoxClick + BoxColor = 3157548 + end + object m_checkFolk: TCKBox + Tag = 1 + Left = 120 + Top = 143 + Width = 48 + Height = 18 + Caption = #27665#35875 + Ctl3D = False + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentColor = True + ParentCtl3D = False + ParentDoubleBuffered = False + ParentFont = False + TabOrder = 9 + OnClick = CheckBoxClick + BoxColor = 3157548 + end + object m_checkIndpent: TCKBox + Tag = 9 + Left = 228 + Top = 168 + Width = 48 + Height = 18 + Caption = #29420#31435 + Ctl3D = False + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentColor = True + ParentCtl3D = False + ParentDoubleBuffered = False + ParentFont = False + TabOrder = 10 + OnClick = CheckBoxClick + BoxColor = 3157548 + end + object m_checkJazz: TCKBox + Tag = 4 + Left = 282 + Top = 143 + Width = 48 + Height = 18 + Caption = #29237#22763 + Ctl3D = False + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentColor = True + ParentCtl3D = False + ParentDoubleBuffered = False + ParentFont = False + TabOrder = 11 + OnClick = CheckBoxClick + BoxColor = 3157548 + end + object m_checkOthers: TCKBox + Tag = 127 + Left = 336 + Top = 167 + Width = 48 + Height = 18 + Caption = #20854#23427 + Ctl3D = False + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentColor = True + ParentCtl3D = False + ParentDoubleBuffered = False + ParentFont = False + TabOrder = 12 + OnClick = CheckBoxClick + BoxColor = 3157548 + end + object m_checkRock: TCKBox + Tag = 2 + Left = 175 + Top = 143 + Width = 48 + Height = 18 + Caption = #25671#28378 + Ctl3D = False + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentColor = True + ParentCtl3D = False + ParentDoubleBuffered = False + ParentFont = False + TabOrder = 13 + OnClick = CheckBoxClick + BoxColor = 3157548 + end + object m_checkSamba: TCKBox + Tag = 6 + Left = 69 + Top = 168 + Width = 48 + Height = 18 + Caption = #26705#24052 + Ctl3D = False + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentColor = True + ParentCtl3D = False + ParentDoubleBuffered = False + ParentFont = False + TabOrder = 14 + OnClick = CheckBoxClick + BoxColor = 3157548 + end + object m_checkWaltz: TCKBox + Tag = 8 + Left = 336 + Top = 142 + Width = 60 + Height = 18 + Caption = #22278#33310#26354 + Ctl3D = False + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentColor = True + ParentCtl3D = False + ParentDoubleBuffered = False + ParentFont = False + TabOrder = 15 + OnClick = CheckBoxClick + BoxColor = 3157548 + end + end +end diff --git a/StyleUploadFormUnit.h b/StyleUploadFormUnit.h new file mode 100644 index 0000000..2a775e6 --- /dev/null +++ b/StyleUploadFormUnit.h @@ -0,0 +1,86 @@ +//--------------------------------------------------------------------------- + +#ifndef StyleUploadFormUnitH +#define StyleUploadFormUnitH +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include +#include "CKBox.h" +#include "GeneralDialogPanel.h" +#include "LineEdit.h" +#include "TextButton.h" +#include "ProCommon.h" + +#define TYPE_NUM 12 +#define MAX_TYPE 2 +#define MAX_STYLE 16 + +//--------------------------------------------------------------------------- +class TStyleUploadForm : public TForm +{ +__published: // IDE-managed Components + TGeneralDialogPanel *m_GPanelBKG; + TLabel *m_lblCost; + TLabel *m_lblDescription; + TLabel *m_lblNote; + TLabel *m_lblType; + TLabel *m_lblAuthor; + TLabel *m_lblStyleName; + TTextButton *m_btnOk; + TTextButton *m_btnCancel; + //BKGMemoUnit::TMemo *m_memoDescription; + TMemo *m_memoDescription; + TLineEdit *m_editStyleName; + TLineEdit *m_editAuthor; + TLineEdit *m_editCost; + TCKBox *m_checkBlues; + TCKBox *m_checkPop; + TCKBox *m_checkClassic; + TCKBox *m_checkCountry; + TCKBox *m_checkDance; + TCKBox *m_checkFolk; + TCKBox *m_checkIndpent; + TCKBox *m_checkJazz; + TCKBox *m_checkOthers; + TCKBox *m_checkRock; + TCKBox *m_checkSamba; + TCKBox *m_checkWaltz; + TLabel *m_lblTips; + TLabel *m_lblProtocol; + + void __fastcall FormCreate(TObject *Sender); + void __fastcall CheckBoxClick(TObject *Sender); + void __fastcall EditNameChange(TObject *Sender); + void __fastcall MemoChange(TObject *Sender); + void __fastcall AuthorChange(TObject *Sender); + void __fastcall CostChange(TObject *Sender); + void __fastcall FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift); + void __fastcall ProtocolMouseEnter(TObject *Sender); + void __fastcall ProtocolMouseLeave(TObject *Sender); + void __fastcall ProtocolClick(TObject *Sender); + +private: // User declarations + bool m_bShare; + TPROSTYLE* m_pStyle; + int m_iCheckCount; + int m_nScore; + TCKBox* m_cbTypes[TYPE_NUM]; + char m_iStyleType[MAX_TYPE]; + + void PresetType(); + int SystemScore(); + bool UploadEnabled(); + +public: // User declarations + __fastcall TStyleUploadForm(TComponent* Owner, TPROSTYLE* pStyle, bool bShare); + + void __fastcall GetShareInfo( TSTYLESHARE* pInfo ); + void __fastcall GetMakeInfo( TMAKESTYLEINFO* pInfo ); +}; +//--------------------------------------------------------------------------- +extern PACKAGE TStyleUploadForm *StyleUploadForm; +//--------------------------------------------------------------------------- +#endif diff --git a/SwitchProgFormUnit.cpp b/SwitchProgFormUnit.cpp new file mode 100644 index 0000000..375a893 --- /dev/null +++ b/SwitchProgFormUnit.cpp @@ -0,0 +1,382 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop + +#include "SwitchProgFormUnit.h" +#include "GlobalUnit.h" +#include "Instruments.h" +#include "VSTiFormUnit.h" + +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma link "TextButton" +#pragma link "PNGButton" +#pragma link "GeneralDialogPanel" +#pragma link "CKBox" +#pragma resource "*.dfm" + + +TSwitchProgForm *SwitchProgForm; +//--------------------------------------------------------------------------- + +__fastcall TSwitchProgForm::TSwitchProgForm(TComponent* Owner, BYTE iFont, BYTE iProg, BYTE iChno ) + : TForm(Owner) +{ + m_iChno = m_iChnoOrig = iChno; + m_iProg = m_iProgOrig = iProg; + m_iFontOrig = iFont; + m_iFont = ( iFont==0xFF && !g_bExtFont )? g_idFont : iFont; + m_bVSTi = iFont!=0xFF && iFont>=0x80; +} +//--------------------------------------------------------------------------- + +__fastcall TSwitchProgForm::~TSwitchProgForm() +{ + f_MM_Stop(); + + if( m_lvSoundFont ){ + delete m_lvSoundFont; + m_lvSoundFont = NULL; + } + + if( m_lvProgram ){ + delete m_lvProgram; + m_lvProgram = NULL; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TSwitchProgForm::FormCreate(TObject *Sender) +{ + m_BKGPanel->Font->Size = g_szFont9; + m_btnOk->FontSize = g_szFont9; + m_btnCancel->FontSize = g_szFont9; + m_btnSet->FontSize = g_szFont9; + + m_lvSoundFont = new TListPanel(this); + m_lvSoundFont->Parent = m_panFont; + m_lvSoundFont->Align = alClient; +// m_lvSoundFont->Parent = m_BKGPanel; +// m_lvSoundFont->SetBounds( 27, 79, 156, 204 ); + m_lvSoundFont->SetTextFont(g_strTxtFontName, g_szFont9); + + m_lvProgram = new TListPanel(this); + m_lvProgram->Parent = m_panProg; + m_lvProgram->Align = alClient; +// m_lvProgram->Parent = m_BKGPanel; +// m_lvProgram->SetBounds( 201, 79, 156, 204 ); + m_lvProgram->SetTextFont(g_strTxtFontName, g_szFont9); + m_lvProgram->OnDblClick = ProgramDblClick; + + if( m_bVSTi ){ + m_tabVSTi->BringToFront(); + m_tabVSTi->Down = true; + m_tabSF2->Down = false; + m_btnSet->Visible = true; + } + + ResetComponents( true ); + + SetTransparent( this ); +} +//--------------------------------------------------------------------------- + +void TSwitchProgForm::ResetComponents( bool bInit ) +{ + InitSoundFontList(); + InitProgramList(); + + if( !bInit ){ + m_lvSoundFont->ResetScroll(); + m_lvProgram->ResetScroll(); + } + + m_lblProgram->Caption = m_bVSTi ? L"ͨ/" : L"ɫ/"; + + m_btnOk->Enabled = !( m_lvSoundFont->SelectedItemIndex<0 + || m_lvProgram->SelectedItemIndex<0 ); + m_btnSet->Enabled = m_bVSTi && m_lvSoundFont->SelectedItemIndex>=0; +} +//--------------------------------------------------------------------------- + +void __fastcall TSwitchProgForm::InitSoundFontList() +{ + m_lvSoundFont->Clear(); + + int iSel = -1; + if( m_bVSTi ){ + for( int i=0; istrVSTName, DoItemClick ); + pItem->Tag = i + 0x80; + + if( m_iFont==pItem->Tag ){ + iSel = i; + } + + m_lvSoundFont->AddItem( pItem ); + } + } + else{ + for( int i=0; inDrumCount>0 + || m_iChno!=9 && pFont->nInstCount>0 ){ + TListPanelItem* pItem = new TListPanelItem( pFont->strFontName, DoItemClick ); + pItem->Tag = i; + + if( g_bExtFont && m_iFont==0xFF ){ + int ind = m_iProg / 8; + if( g_lstFonts[i]==g_lstCZFonts[ind] ) + iSel = m_lvSoundFont->ItemsCount; + } + else if( i==m_iFont ){ + iSel = m_lvSoundFont->ItemsCount; + } + + m_lvSoundFont->AddItem( pItem ); + } + } + } + + m_lvSoundFont->SelectedItemIndex = iSel; +} + +//--------------------------------------------------------------------------- + +void __fastcall TSwitchProgForm::InitProgramList() +{ + m_lvProgram->Clear(); + + if( m_lvSoundFont->SelectedItemIndex<0 ) + return; + + int ind = -1; + if( m_bVSTi ){ + VSTINFO* pInfo = g_lstVSTi[m_iFont-0x80]; + int iNamedChan = -1, iPlugin = -1; + if( pInfo->aPlugins.size()>0 ){ + iPlugin = 0; + iNamedChan = pInfo->aPlugins[iPlugin]->id; + } + for( int i=0; i<16; i++ ){ + char text[32]; + + if( i==iNamedChan ){ + strcpy( text, pInfo->aPlugins[iPlugin]->name ); + + if( ++iPluginaPlugins.size() ) + iNamedChan = pInfo->aPlugins[iPlugin]->id; + else + iNamedChan = -1; + } + else + sprintf( text, "Channel %d", i+1 ); + + TListPanelItem* pItem = new TListPanelItem( text, DoItemClick ); + pItem->Tag = i; + m_lvProgram->AddItem( pItem ); + + if( m_lvSoundFont->SelectedItemIndex>=0 && pItem->Tag==m_iChno ) + ind = i; + } + } + else{ + FONTINFO* pFI = NULL; + + if( g_bExtFont && m_iFont==0xFF ){ + int ind = m_iProg / 8; + pFI = g_lstCZFonts[ind]; + } + else{ + pFI = g_lstFonts[m_iFont]; + } + + int num = m_iChno==9 ? pFI->nDrumCount : pFI->nInstCount; + FONTPRESET* pSet = ( m_iChno==9 ? pFI->aDrums : pFI->aInsts ); + char** strInst = NULL; + + if( m_iChno!=9 ){ + if( !strcmp( pFI->strFontName, g_strDefaultSoundSet ) || !strcmp( pFI->strFontName, "Pop default" ) ) + strInst = GM_INSTRUMENT; + else{ + bool bExtend = false; + for( int i=0; i<16; i++ ){ + if( pFI == g_lstCZFonts[i] ){ + bExtend = true; + break; + } + } + + if( bExtend ) + strInst = GM_INSTRUMENT; + } + } + + for( int i=0; iTag = pSet[i].id; + m_lvProgram->AddItem( pItem ); + + if( pItem->Tag==m_iProg ) + ind = i; + } + } + + m_lvProgram->SelectedItemIndex = ind; +} +//--------------------------------------------------------------------------- + +void __fastcall TSwitchProgForm::DoItemClick(TListPanel *Sender, int Index) +{ + if( Index<0 || Index>=Sender->ItemsCount ) + return; + + TListPanelItem* pItem = Sender->GetItem( Index ); + int iSel = pItem->Tag; + + if( Sender==m_lvSoundFont && ( m_iFont!=iSel || m_bVSTi ) ){ + bool bReset = m_iFont!=iSel; + + if( bReset ){ + m_iFont = iSel; + m_lvProgram->Clear(); + } + + if( m_bVSTi ){ + ShowVSTiPanel( bReset ); + } + else{ + f_MM_Stop(); + + m_iProg = -1; + InitProgramList(); + m_lvProgram->ResetScroll(); + } + } + else if( Sender==m_lvProgram && ( m_bVSTi && m_iChno!=iSel + || !m_bVSTi && m_iProg!=iSel )){ + f_MM_Stop(); + + if( m_bVSTi ) + m_iChno = iSel; + else + m_iProg = iSel; + } + + m_btnOk->Enabled = !( m_lvSoundFont->SelectedItemIndex<0 + || m_lvProgram->SelectedItemIndex<0 ); + m_btnSet->Enabled = m_bVSTi && m_lvSoundFont->SelectedItemIndex>=0; +} +//--------------------------------------------------------------------------- + +void __fastcall TSwitchProgForm::ProgramDblClick(TObject *Sender) +{ + if( m_lvProgram->SelectedItemIndex>=0 ){ + TListPanelItem* pItem = m_lvProgram->GetItem( m_lvProgram->SelectedItemIndex ); + int iChno = m_bVSTi ? pItem->Tag : -1, + iProg = m_bVSTi ? -1 : pItem->Tag; + char* strFile = m_iFont==0xFF ? NULL : m_iFont<0x80 ? g_lstFonts[m_iFont]->strFileName + : g_lstVSTi[m_iFont-0x80]->strFileName; + + f_MM_PlayDemo( Handle, m_iStartBar, iChno, iProg, m_iFont, strFile ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TSwitchProgForm::VSTSetClick(TObject *Sender) +{ + ShowVSTiPanel( false ); +} +//--------------------------------------------------------------------------- + +void __fastcall TSwitchProgForm::SF2Click(TObject *Sender) +{ + if( m_bVSTi ) + SwitchFontType( false ); +} +//--------------------------------------------------------------------------- + +void __fastcall TSwitchProgForm::VSTiClick(TObject *Sender) +{ + if( !m_bVSTi ) + SwitchFontType( true ); +} +//--------------------------------------------------------------------------- + +void TSwitchProgForm::SwitchFontType( bool bVSTi ) +{ + f_MM_Stop(); + + BYTE iFont = m_iFontOrig; + m_iFont = ( iFont==0xFF && !g_bExtFont )? g_idFont : iFont; + m_iProg = m_iProgOrig; + m_iChno = m_iChnoOrig; + m_bVSTi = bVSTi; + + if( bVSTi ) + m_tabVSTi->BringToFront(); + else + m_tabSF2->BringToFront(); + + m_tabVSTi->Down = bVSTi; + m_tabSF2->Down = !bVSTi; + + ResetComponents(); + m_btnSet->Visible = m_bVSTi; +} +//--------------------------------------------------------------------------- + +void TSwitchProgForm::ShowVSTiPanel( bool bReset ) +{ + //ʾVSTiô + f_MM_Stop(); + + int iChno = m_iChno<0 ? m_iChnoOrig : m_iChno; + TVSTiForm* pVI = new TVSTiForm( NULL, m_iFont, iChno, m_iStartBar, m_lenBar ); + + if( mrOk==pVI->ShowModal() ){ + VSTINFO* pInfo = g_lstVSTi[m_iFont-0x80]; + while( !pInfo->aPlugins.empty() ){ + delete pInfo->aPlugins.back(); + pInfo->aPlugins.pop_back(); + } + + char ch[16]; + char szName[16][64]; + int count = f_MM_GetVSTiPrograms( m_iFont, ch, szName ); + + for( int i=0; iid = ch[i]; + strcpy( pProg->name, szName[i] ); + + pInfo->aPlugins.push_back( pProg ); + } + + m_iChno = pVI->m_iChno; + + InitProgramList(); + m_lvProgram->ResetScroll(); + + if( pVI->IsEditable() ) + f_MM_SaveVSTParams( -1, m_iFont, true ); + } + else{ + if( pVI->IsEditable() ) + f_MM_SaveVSTParams( -1, m_iFont, false ); + + if( bReset ){ + m_iFont = m_iFontOrig; + m_lvSoundFont->SelectedItemIndex = -1; + } + } + + delete pVI; +} +//--------------------------------------------------------------------------- + diff --git a/SwitchProgFormUnit.dfm b/SwitchProgFormUnit.dfm new file mode 100644 index 0000000..4b25fcf --- /dev/null +++ b/SwitchProgFormUnit.dfm @@ -0,0 +1,467 @@ +object SwitchProgForm: TSwitchProgForm + Left = 0 + Top = 0 + BorderStyle = bsNone + Caption = 'SwitchProgForm' + ClientHeight = 335 + ClientWidth = 385 + Color = 5064257 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Position = poMainFormCenter + Scaled = False + OnCreate = FormCreate + TextHeight = 13 + object m_BKGPanel: TGeneralDialogPanel + Left = 0 + Top = 0 + Width = 385 + Height = 335 + Align = alClient + Caption = #38899#33394#36873#25321 + Color = 5064257 + ParentBackground = False + TabOrder = 0 + object m_btnCancel: TTextButton + Left = 301 + Top = 295 + Width = 56 + Height = 25 + ModalResult = mrCancel + ParentShowHint = False + ShowHint = True + Text = #21462#28040 + end + object m_btnOk: TTextButton + Left = 231 + Top = 295 + Width = 56 + Height = 25 + ModalResult = mrOk + ParentShowHint = False + ShowHint = True + Text = #30830#23450 + end + object m_ShapeFont: TShape + Left = 27 + Top = 60 + Width = 156 + Height = 19 + Brush.Color = 2433053 + Pen.Color = 8092539 + end + object m_lblSoundFont: TLabel + Left = 27 + Top = 62 + Width = 156 + Height = 14 + Alignment = taCenter + AutoSize = False + Caption = #38899#33394#24211 + Font.Charset = DEFAULT_CHARSET + Font.Color = 12429980 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object m_ShapeProg: TShape + Left = 201 + Top = 60 + Width = 156 + Height = 19 + Brush.Color = 2433053 + Pen.Color = 8092539 + end + object m_lblProgram: TLabel + Left = 201 + Top = 62 + Width = 156 + Height = 14 + Alignment = taCenter + AutoSize = False + Caption = #38899#33394'/'#20048#22120 + Font.Charset = DEFAULT_CHARSET + Font.Color = 12429980 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object m_btnSet: TTextButton + Left = 112 + Top = 295 + Width = 71 + Height = 25 + Hint = #35774#32622#36873#20013#30340'VSTi' + ParentShowHint = False + ShowHint = True + Visible = False + OnClick = VSTSetClick + Enabled = False + Text = 'VSTi'#35774#32622 + end + object m_tabVSTi: TPNGButton + Left = 75 + Top = 38 + Width = 55 + Height = 22 + Hint = 'VSTi'#38899#33394#24211 + ParentShowHint = False + PngImg.Data = { + 89504E470D0A1A0A0000000D49484452000000DC000000160806000000AB29F2 + 53000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F330000090F4944415478DAED9C096C145518 + C7BFA968AC44289542A1B4D042A1C5460E8582A24584284191A88046220A3186 + 1831603C42D5344649940811638C317805E381351C221E787028163924514B29 + 6DB9447A77B77BCC5EB37EDF9B9DD7ED74969DD919B3E3C42FD9BC79EFEDBECC + 7FBFF9CD9BF77D6F571857327E3300DC0F36B268545A2A08191F5830940DB545 + 519BE0506D4EF69B35DA04042E9A939B9F6E3DDC42A12074BB3A201C0A56E085 + B9D7E470D1CCFE03D32D899B14894030E023E75560D5B4B6818386A65B12B748 + 38083EAF1B24298CDACCFBCDA9DA1870570DC94BB7A69E13120414180657674B + 4B2412596812BAE8E5570C48B7A47871109524088A9E169CE9168239E8A203B2 + 72D2AD284E9AC06E289EEE4ED4165968F2C274AC36DB01A7080C05457075B5FB + F0B652840DCD290E652FE040715E1802A2D787D5227CA5ACCD4E17A5A20D9F4C + C0EBE9FA5F5BA271EC089C2250F4FBF0F1B27D071E2FC2263185616C075C4C1D + 7B4C0905FD3BB092B236BB5D944C19FA2D1810C1EF75ED00137E73AA36DB0227 + 0BCC60CFCEDEEEAE7D28761636850D0E6153E06277CC6080A0DB07296AB3E345 + A9680BF8BDE0F77B52F69B53B5E906EEF16515B0687E397CBABD065E7B674F9F + B66B4AF3A1A478387F3FB59151BF9651BF7ABC44023DEE4EF0FB3C9578BCD6E0 + F7A30BB827573F0AF72DBE1B3EFAA41AD6AD7FA34FDBC46BCAA0B4741C7F3FB5 + 9151BF9651BF7ABC04EA0838888402959082363D17E503774F8579B327C0CEDD + C7E083EA837DDA4AC60C83D1A386F0F7531B19F56B19F5ABC7D354867EF3FBBA + F1D1D99792DFF468BBF18672B8EEDA8970E8F06FB0EFA79A3E6D23F286416E6E + 4FF085DAC8A85FCBA85F3D9ED5DA2C038ECA3D078EE3AB0E2AA68FC357096B3F + 7EF2027BEFF3ABEF64E50BEBB7B1B2644CAE2EE0147377B55384EF399CF55E34 + E2382B80A3F2C73DFBE1FB1FF6C2AC9B6F82991533587B6D6D9DACA96A8DACB1 + 4AFEEE094E7DC0C94691CB483884DA0443DAAC008ECA83471BA0E64813944F2E + 84A99346B3F6C6D3ADECBD8F2D9FCDCAD737ED6665D1C81C5DC029E6F3BAF0A6 + 12F857B425038ECA13F50D507FB2118AC714C1D8E2D1ACBDB945D6366FEE1C56 + EEDCF52D2B870EC9D1059C196DBA811B5794034B174EE72091299035B7BA7AC1 + A305E74F5B9F62E50D0B5EE1E38D1A910DA7CE75405D636B92B3A4E85E045C1D + AD100E8766A2C0E484C61CA707B8AB4BC7C2F287967090C814C8FEBED0DC0B1E + 2D388FD47CCFCAC9E5B3F87885A30AA0E9D419F8A3F6849ED3A4200A45306762 + 45B7363D176561FE20B86BEE240E129902596BBBA7173C5A707EF2E6C3AC5CBC + E26D3E5EDED02CF8ABB90B9ACE76263FC96894020D20A1DFC080DFF4681B3C38 + 1BCAA74CE620912990B9DDDDBDE0D18273D5CA4758B961E35B7CBCEC4159D0D1 + D9056D6D1DFF8A36436BB87890C8B48E09302D98D4C0694199E4545974CFD5D9 + 7A5A92C2B8601592DF5E0DACE1E24122D33A26C0B4605203A705A51EE70545CF + 692C6931AE4B9BDE754E3C48645AC70498164C6AE0B4A04C7AA292442175D426 + 59AE2D1E2432AD63024C0B2635705A505AADCD12E0BEFAF14FA87A623E14E45D + C5DA15A8E2CD3C70721085D205EEAE36370A2DC386B3C9BE0FB3C07D898F1B2F + BE5009230BE4CD010A54F1660570104B1704459F1B4FBB0C5B926A330BDCBE83 + F5B072D92D303C77106B57A08A372B806301224A1E7B5C6EBCA158AA2D1170B5 + 75F530EFB6D9909D2D6B53A08A372B8033AACD107034731158BF1C3EC9EAD3AE + 1D0355AF6E67B358F9C40298866B002548A206C90AE01481B174C1163CA6ED3F + A18B394E2F70347311583F1F902FA2EBA74F85679F7F89CD6233AE9F02D3A74D + E5411235489600278B834888A50BB680BCB5E9A2DAF45E9434731158477F3FC3 + EA93CA0A60E33BDFB1596C42E93098303E9F0749D42059019CE2B760C00F7EAF + 7B0BE8F09B5E6D347311588D4DA759BDA87024ECFC6A379BC5F2470C875123F3 + 7990440D9215C019D566382DB069DD121E8D3C5E7F1E963FB999F7E564F787C9 + 65237A054D12ADE152054E11184B177C83B3DE7C6C0A24729C91B4C087EFBDC9 + A3911410B9FFC115BC6FE890C130059D111F3449B4864B1938591C8443228402 + 226A132EAACD48E87CEDD377F26864C3A91658F3F236DE973D3013C617E7F60A + 9A245AC3A50A9CE237D1EFC597C7526DF72D5AC0A3911770CDFDD1A75B795FFF + 2B32212F6F58AFA049A2355CAAC019D16609706A78F4044DCC00A708D4912E30 + 0D9C1A1E3D411353C0317140C041241CA8C44A426D668153C3A327686206B898 + E3404C1E52370D9C1A1E3D411333C0E9D56618387A745C5F752F3B5E5DF531D4 + FC76262DC0C54E1FD773AD124EE7CFE04CB74ECB714680A347C78D1B5E66C72B + 573D0DFB7FFE353DC0C52C18F0499148E81901044D6D462E4A7A745CB3F27676 + BC76E31770ACF6EFF40017335CF348A15000FD665E1B3D3ADE73D71DECF8B3CF + 77C0D973E7D3039C0E6D29ED34D10AF1C7074DC8285DF0FE9603164629FB1ADB + 97C8D2056DB4709D83F5DD6AC719DD69A215E28F0F9A9051BA60D3BB9B2D8D52 + 6A198B5C06285D1099836AFB6833BA1B432BC41F1F3421A374C1E7BB8E5A1AA5 + EC6B02FD6202BC9E4EDAA8AEE937A3DAB442FCF14113324A17D4FC7AC4D228A5 + 516D290177EB4DF263D7D77BEB781BCD7C590332795D9D5F537FC6501E2E8940 + 962EE8686990A21245358EC5751A06EEF6B972A2F78B5D3DDF13CD7C59037B7E + E6A3CEAFA93F633C0F97D8C87901D1DB80077DB419BD28675C57C8CAFD879A78 + 1BCD7C57F6BF9CD7D5F935F5678CE6E12E6674B3C475784354C36F46B58D2D2E + 62E589FA46DE46335F66668F36757E4DFD19A379B854B4D97A2FA55E937F5D10 + 0057575B3B2A2DC7868658976DF7521A10C76E2821D1DB1EC5FB1AB6706D76DD + 6FA85F1ADF81DF8E72509BE0786D8E004E1698411122FAF16A358A5D8C4D1170 + 0270B2B858BAC0578D15AEEDBF7E51CAD2E490BACFD75D2DE093ABD3B5390638 + 45602C5DB00D012481A2238093D5B1744138286E03F986223AE1A264CA7848BD + 9BFBCDA9DA6CF7170B1628048F8BD205DD1BB0B6CA39C0317134CBD146E7F558 + 596DA7BF2130AD0CA7009C0968A70DF39B53B50976FC1321B3D6EFD2CBB6E3F3 + F3D68C8C4B16E0E2757EBACFC76ABBA4DFA59508DD787098DF62B60C5FB73855 + DB3F17895BDCAA69F7E40000000049454E44AE426082} + ShowHint = True + OnClick = VSTiClick + end + object m_tabSF2: TPNGButton + Left = 27 + Top = 38 + Width = 55 + Height = 22 + Hint = 'SF2'#38899#33394#24211 + Down = True + ParentShowHint = False + PngImg.Data = { + 89504E470D0A1A0A0000000D49484452000000DC000000160806000000AB29F2 + 53000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F33000007944944415478DAED5C6D88155518 + 7E67D5743577B3FCA8240A4B93CD424B10EC434D0D2A3323D694A040A21FFD91 + F247C2623F3282888AFEF74B82A445D2B60FD08528AB1F61696522DA86122AFB + BDF76BEE7CDC99DBFB9E7B67F6747666EE393357EF34F4C07267DEF3CE751ECF + 79E6BCE739B3ABDDBDBCEB6300781E52846AD57D51D3DA0E34E1AB52C8AD8ADC + B48C72CB72BF35879B8682AB2EB8F9B656F3F161DB1614726350B1AD753830BF + 4BF875D5F6399DADA6E4C3751CB04C9D3A6F1D9E26E6D6396F51AB29F9702A16 + E8A53CB86E05B925EFB7AC726382BB69E1E256739ABC214D438215C88D0F0D39 + 8ED39D5074D559B33B5A4D89270755D705CB280EE14CD70DC94457EDB86141AB + 1971D434F6402916C6919BD39D706066965BEA04E711B42D037213A33A3E5696 + 606030E657A54B70E0755E054CA3A4E3E912FC89CD2D4D83D2E3869509948A13 + FF730BFB9E340ACE236894752C2F47FBF0783B868C185F933AC1D5D9B132C5B6 + CA7D78129B5BDA06256386FD669906944BB93E48D06F59E5965AC1D508B6B1DA + B95498388E641FC55045F12B522AB8FA13D3324974C72126B7340E4A8F9B592E + 41B95C8CDD6F59E5A624B8159B1E86EE7D7BA6C47BF7BFC73E83DA1AE550FC74 + FFF14882C5FC3894F5620F1EBFADF8FF232DB84D4F3C06AFBFB96F4AFC9D37F6 + B3CFA0B6463914EFFFEA68C4BF4AA573191CDBEC8118DC6407E51D0FAD860DBB + 5F9A12FFE6C38FD867505BA31C8A5FF8FE443833ECB7B25EC0D2598FD56FB2DC + 962D5D024F3EBE794AFCCBAF8FB1CFA0B64639143F77FEAFABC24D5A70BCD87E + E83D0297CFFE09B72EBF0B1EEC7E9AC54838623B8FF68EB9B065F7CB7E3B81BF + 364A7484FCC428397CFB70D67B4B819F94E078B17D76B017CE9D390BCBBA96C3 + 333BBA598C8423B6F398DBD901AFECD9EDB713F86BA34507CCB9742A3672D394 + B8C90C4A5E6CBF7F710C46062EC2FC3B6F877BB7D4061909476CE73173EE1C58 + BB6BA7DF4EE0AF8D121D412FE5F0A1625E156EBCD84EFC7C0A06878661D1C205 + B0FA81952C46C211DB79CC9A3513366E78C46F27F0D746892E2EB75882F30422 + C6C4F6A8EB0951F9FFBE4B72F71CC88D0D43A562AF4782DFCA769CAAE03C8188 + 31B13DEA7A42547EC06D9289420EE67A3C91E6A62A384F20624C6C8FBA9E1095 + 3FE526AB55321AC0C57E03857E53159C27103126B6475D4F88CA6F06B74482BB + 7EFE3CB863E50A16E367B02001F1B9174E9D66C7D282ABDD2A73F772E3C3175D + B7820B56ED27998E8B2BB8F9F8A45CB97A158BF133589080F8DC53274EB26335 + C1D53ACF328A17F19316E352DCE20AAEFDC64E58D4B594C5F8192C48407CEEE0 + 99F3EC584570EC465D972C75E4E636955B90E0E6CC6E87C58B6F61317E060B12 + 109F7BE9D21576AC22B838DCA405478259BB639B5F061278A184ADEFC43C3197 + CACB1F0F1E86E2C878C37B201385B60BF213237924BA02037F37FAFF90111C09 + 66FB0B3BFD3290C00B256C7D27E689B9545E7E7AE01318114A991072EC816219 + 7A1E6F9B9E4C0DB9C90C4A12CC3D4F6DF2CB40022F94B0F59D9827E65279F947 + 5F3F94C77212D434AC4C2CD08BB93C3E509AC68D0473FFAAFBFC3290C00B256C + 7D27E689B9545EFE72F23728E9E5A67353324DBC598A5FBB11C412515CC3D18C + E6092AAED87882F5ED825E3CA6D77FECA88E93354DBC598A5FBB11C412515CC3 + D18CE6092AB6D826C98163B3ED025A0836E4266B2C78B314BF76238825A2B886 + A319CD13545CB1F1FD6699652897F2BD20D16FB2DCBC598A5FBB11C412515CC3 + D18CE6092AAED8E2708BB52D1024BC466B384252B1F104EBDB054771D6DB8A21 + 332455795B2048788DD67084C4629B240715DB00DB34909B16C94DD53A0F125E + A3351C21A9D826A9D1C3B2843FC5A6730B125EA3351C21A9D854B9B5C4344922 + 369EA0C476C135374D1289CD27072438702A660F9E8472BBD6A64912B14D72C3 + 81D9D852BFE6A64912B1A9706B994BD9D824916288EBB96117A7F3BD38D3BD1B + 90D0129752C624918165EAAEE3D87B35D002B9B5C2A594314964806B1ED7B64D + ECB7F8DC9AED52CA982449B925324D3CD08C357E7930D2A554315564C1DE4B64 + DB0523B470DD8CE7FD424A6CD3C403CD58572E5D8E7429554C151530E7D2A4ED + 020747C5546E714D130F3463158646225D4A1553451E1AFDC604948AE3F4A27A + 60BFC5354D3CD08C95CBE7235D4A1553A559DC62992622C81421F0B6BF582E86 + 5D1B96AF42906D178C0D0DB855F7590CFCCA352A9B2622C81421F0B6BF582E86 + 5D1B96AF02EA3CD3280DE0C1146EAAA68908324508BCED2F968B61D786E5AB80 + 1E96B80E1FA806F49BAA6922824C11026FFB8BE562D8B561F9CDE096EA772965 + 51FBED0213721323A3C8740D0606EA4DA97D9752811C7BA0D84669B40AB00623 + 3EB7B4BE6F284FCD7F037F14E920372DF3DC3221B81AC1367288E897570F21D9 + E730E4401604572357DF2ED00FE189CFEDBF3E286BD46A96BAAE170E690099E7 + 9619C17904EBDB0547508044D0C884E06AECD87641C5328E40ED816264615032 + 66BEA55EF0FB2DABDC52F727169AC0108A39DA2E287C8067AF6647708C1CCD72 + F4A2F3FB78F25A9AFE0C4162663805E04C406FDAB07ECB2A372D8D7F442829A6 + CFB8EE73AC9F0FB7B54DDB868BD7ADADBE9F6663DAF4193D28BA2EC858BFD5B1 + 0B7F366695DB3F1E72A7CD814D1AE10000000049454E44AE426082} + ShowHint = True + OnClick = SF2Click + end + object m_panFont: TPanel + Left = 27 + Top = 79 + Width = 156 + Height = 204 + BevelOuter = bvNone + Caption = 'panFonts' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ShowCaption = False + TabOrder = 0 + end + object m_panProg: TPanel + Left = 201 + Top = 79 + Width = 156 + Height = 204 + BevelOuter = bvNone + Caption = 'panProg' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ShowCaption = False + TabOrder = 1 + end + end +end diff --git a/SwitchProgFormUnit.h b/SwitchProgFormUnit.h new file mode 100644 index 0000000..942527f --- /dev/null +++ b/SwitchProgFormUnit.h @@ -0,0 +1,76 @@ +//--------------------------------------------------------------------------- + +#ifndef SwitchProgFormUnitH +#define SwitchProgFormUnitH +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include +#include "TextButton.h" +#include "SkinScrollBarUnit.h" +#include "ListPanel.h" +#include "PNGButton.hpp" +#include "GeneralDialogPanel.h" +#include +#include "CKBox.h" +//--------------------------------------------------------------------------- +class TSwitchProgForm : public TForm +{ +__published: // IDE-managed Components + TLabel *m_lblSoundFont; + TLabel *m_lblProgram; + TTextButton *m_btnOk; + TTextButton *m_btnCancel; + TGeneralDialogPanel *m_BKGPanel; + TPanel *m_panFont; + TShape *m_ShapeFont; + TShape *m_ShapeProg; + TTextButton *m_btnSet; + TPNGButton *m_tabSF2; + TPNGButton *m_tabVSTi; + TPanel *m_panProg; + + void __fastcall FormCreate(TObject *Sender); + void __fastcall VSTSetClick(TObject *Sender); + void __fastcall VSTiClick(TObject *Sender); + void __fastcall SF2Click(TObject *Sender); + +private: // User declarations + TListPanel *m_lvSoundFont; + TListPanel *m_lvProgram; + + BYTE m_iFontOrig, m_iProgOrig, m_iChnoOrig; + + void __fastcall ProgramDblClick(TObject *Sender); + void __fastcall DoItemClick(TListPanel *Sender, int Index); + void __fastcall InitSoundFontList(); + void __fastcall InitProgramList(); + + void ResetComponents( bool bInit=false ); + void SwitchFontType( bool bVSTi ); + void ShowVSTiPanel( bool bReset ); + +/* MESSAGE void __fastcall WMEraseBkgnd(TWMEraseBkgnd &Message); + MESSAGE void __fastcall WMSize(TMessage &Message); + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(WM_ERASEBKGND, TWMEraseBkgnd, WMEraseBkgnd) + MESSAGE_HANDLER(WM_SIZE, TMessage, WMSize) + END_MESSAGE_MAP(TForm) +*/ +protected: + +public: // User declarations + BYTE m_iFont, m_iProg, m_iChno; + int m_iStartBar, m_lenBar; + bool m_bVSTi; + + __fastcall TSwitchProgForm( TComponent* Owner, BYTE iFont, BYTE iProg, BYTE iChno ); + __fastcall ~TSwitchProgForm(); +}; +//--------------------------------------------------------------------------- +extern PACKAGE TSwitchProgForm *SwitchProgForm; +//--------------------------------------------------------------------------- +#endif diff --git a/SwitchTextureForm.cpp b/SwitchTextureForm.cpp new file mode 100644 index 0000000..865a57d --- /dev/null +++ b/SwitchTextureForm.cpp @@ -0,0 +1,966 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop + +#include "SwitchTextureForm.h" +#include "ListViewText.h" +#include "GlobalUnit.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +//--------------------------------------------------------------------------- +#pragma link "ComboBoxComponent" +#pragma link "PNGButton" +#pragma link "TextButton" +#pragma link "CKBox" +#pragma link "GeneralDialogPanel" +#pragma resource "*.dfm" +TSwitchTextureForm *SwitchPartternForm; +//--------------------------------------------------------------------------- +#define FramColor RGB(123, 123, 123) +#define BkClolor RGB(39, 42, 47) +#define FontClolor TColor(0xBDAA9C) +#define CapClolor RGB(29, 32, 37) + +#define HEIGHT_TYPE 90 +#define HEIGHT_PROG 90 +#define HEIGHT_TITTLE 21 +#define BORDER_LENGTH 1 + +#define TYPE_WIDTH 140 + +#define LSTDEPART 16 + +//gm ɫ +char PROG_TYPE[75] = { +5, 7, // 2 +10, 15, //״ 2 +20, 23, // 2 +25, 27, 28, 30, 31,// 5 +39, //˾ 1 +40, 41, 42, 43, 45, 46, 47,// 7 +51, 54, 55, ///ϳ 3 +56, 57, 58, 59, 60, 63,//ͭ 6 +67, 68, 69, 70, 71,//ɹ 5 +72, 73, 74, 75, 76, 77, 78, 79,//ľ 8 +87, //ϳ 1 +95, //ϳɱ 1 +96, 97, 98, 99, 100, 101, 102, 103, //ϳЧ 8 +104, 105, 106, 107, 108, 109, 110, 111,// 8 +112, 113, 114, 115, 116, 117, 118, 119,// 8 +120, 121, 122, 123, 124, 125, 126, 127 //Ч 8 +}; +//2+2+2+5+1 +7+3+ 6+ 5+ 8+1+1+ 8*4= 43+32 = 75 + +TPngImage *pngType = NULL; +TPngImage *pngCollect = NULL; + +//--------------------------------------------------------------------------- +void LoadImgParttern() +{ + if( !pngType ) pngType = new TPngImage(); + if( !pngCollect ) pngCollect = new TPngImage(); + + pngType->LoadFromResourceName(int(HInstance), L"imgProg"); + pngCollect->LoadFromResourceName(int(HInstance), L"imgCollect"); +} +//--------------------------------------------------------------------------- + +void ReleaseImgParttern() +{ + SAFE_DELETE(pngType); + SAFE_DELETE(pngCollect); +} +//--------------------------------------------------------------------------- + +FONTPRESET* InsGetDrums(int &num, int &index, char iProg=-1) +{ + FONTINFO* pFI = g_lstFonts[g_idFont]; + num = pFI->nDrumCount; + FONTPRESET *pSet = pFI->aDrums; + if( -1!=iProg ) { + for( int i=0; i& vcProg, bool bSameType=false, bool bChan9=false ) +{ + vcProg.clear(); + if( /*!bChan9 &&*/ iProg>=0 ){ + int iStart = iProg, iEnd = iProg; + if( bSameType ){ + if( bChan9 ){ + iStart = 0; + iEnd = 127; + } + else{ + iStart = 0; + for( int index=0; index<75; index++ ) { + if( iProg<=PROG_TYPE[index] ) { + iEnd = PROG_TYPE[index]; + break; + } + else{ + iStart = PROG_TYPE[index]+1; + } + } + } + } + + vcProg.push_back( iStart ); + vcProg.push_back( iEnd ); + } +} +//--------------------------------------------------------------------------- +///////////////////////////////////////////////////////////////////////////// +//--------------------------------------------------------------------------- + +__fastcall TSwitchTextureForm::TSwitchTextureForm(TComponent* Owner, + char iSegType, char iProgOri, + char iFontCur, char iProgCur, + TPROSTYLE *pStyleOri, char chanOri, char segNoOri, + TStageList* lstStages, int iPlayBar ) + : TForm(Owner) +{ + m_bSubProg = iProgCur>=0; + m_bChan9 = chanOri==9; + + m_cSegType = iSegType; + + m_cFontCur = iFontCur; + m_cProgCur = iProgCur; + + m_cProgOri = m_cProgOriBac = iProgOri; + + m_pStyleOri = pStyleOri; + m_cChanOri = chanOri; + m_cSegNoOri = segNoOri; + + m_lstStages = lstStages; + m_iPlayBar = iPlayBar; + + m_InsIndex = m_cProgOriType = -1; + m_bSameType = m_bCollected = false; + + m_cSetFont = m_cSetProg = m_cSetProgOri = m_cSetSegType + = m_cSetSegNo = m_cSetchan = -1; + m_bSetCur = true; + m_pSetStyle = NULL; + + m_btnCol = m_btnSameType = NULL; + m_LstParttern = m_LstProgType = m_LstProg = NULL; + + LoadImgParttern(); + + if( !m_bSubProg ) { + m_BKGPanel->Caption = L"֯"; + m_lbIntro->Caption = L"ѡ֯Ӧ͵Ķ"; + m_ckPlay->Enabled = false; + m_ckReplaceProg->Enabled = false; + m_ckPlay->Font->Color = RGB(93, 93, 93); + m_ckReplaceProg->Font->Color = RGB(93, 93, 93); + m_lbOri->Font->Color = RGB(93, 93, 93); + } + + InitListPanel(); + + m_btnInit->Visible = m_cChanOri>=0; + m_cbDrum->Visible = (iSegType & 0x80) && m_cChanOri<0; + m_lbIntro->Visible = lstStages && lstStages->size()>1;//iSegType==0x03; + + SetTransparent( this ); +} +//--------------------------------------------------------------------------- +__fastcall TSwitchTextureForm::~TSwitchTextureForm() +{ + f_MM_Stop(); + + ReleasePt(); + + SAFE_DELETE(m_LstParttern) + SAFE_DELETE(m_LstProgType) + SAFE_DELETE(m_LstProg) + SAFE_DELETE(m_btnCol) + SAFE_DELETE(m_btnSameType) + + ReleaseImgParttern(); +} +//--------------------------------------------------------------------------- + +void __fastcall TSwitchTextureForm::InitListPanel() +{ + f_MM_Stop(); + + m_cProgOri = m_cProgOriBac; + + if( -1==m_cProgOri ) { + m_cProgOriType = -1; + m_InsIndex = -1; + }else { + if( m_bChan9 ) { + int num, index; + InsGetDrums(num, index, m_cProgOri); + m_cProgOriType = 0; + m_InsIndex = index; + } + else { + m_cProgOriType = m_cProgOri/8; + m_InsIndex = m_cProgOri%8; + } + } + + InitTypePanel(); + InitProgPanel(); + +// m_shapeOri->Left = m_LstProg->Left; +// m_shapeOri->Width = m_LstProg->Width; +// m_shapeOri->Height = 25; +// +// m_shapecheck->Left = m_LstProg->Left; +// m_shapecheck->Width = m_LstProg->Width; +// m_shapecheck->Height = 34; //m_ckPlay->Height + 4; +// +// m_lbOri->Left = m_shapeOri->Left+(m_shapeOri->Width-m_lbOri->Width)/2; +// m_ckPlay->Left = m_shapecheck->Left+(m_shapecheck->Width/2-m_ckPlay->Width)/2; +// m_ckReplaceProg->Left = m_shapecheck->Left+m_shapecheck->Width/2+(m_shapecheck->Width/2-m_ckReplaceProg->Width)/2; +// +// m_shapeOri->Top = m_LstProg->Top+m_LstProg->Height+LSTDEPART; +// m_shapecheck->Top = m_shapeOri->Top+m_shapeOri->Height-1; +// m_lbOri->Top = m_shapeOri->Top+(m_shapeOri->Height-m_lbOri->Height)/2; +// m_ckPlay->Top = m_shapecheck->Top+(m_shapecheck->Height-m_ckPlay->Height)/2; +// m_ckReplaceProg->Top = m_shapecheck->Top+(m_shapecheck->Height-m_ckReplaceProg->Height)/2; + + + InitPtPanel(); + +/* if( !m_bSubProg ) { + m_ckPlay->Enabled = false; + m_ckReplaceProg->Enabled = false; + m_ckPlay->Font->Color = RGB(93, 93, 93); + m_ckReplaceProg->Font->Color = RGB(93, 93, 93); + m_lbOri->Font->Color = RGB(93, 93, 93); + } +*/ +} +//--------------------------------------------------------------------------- +void __fastcall TSwitchTextureForm::DoDrawBKG(TPanelDB *Sender, TCanvas *pCanvas, TRect rtBKG) +{ + pCanvas->Brush->Color = BkClolor; + pCanvas->FillRect(rtBKG); + + if( Sender==(TPanelDB *)m_LstParttern ) { + + int iLeft, iTop, iWidth, iHeight; + + iWidth = rtBKG.Width(); + iHeight = rtBKG.Top+rtBKG.Height(); + iTop = rtBKG.Top; + pCanvas->Pen->Color = FramColor; + + iLeft = LEFT_CAPTION+WIDTH_PROG(Sender->Width)+WIDTH_LINE/2 ; + pCanvas->MoveTo(iLeft, iTop); + pCanvas->LineTo(iLeft, iHeight); + + iLeft = LEFT_STYLE(Sender->Width)+WIDTH_STYLE(Sender->Width)+WIDTH_LINE/2; + pCanvas->MoveTo(iLeft, iTop); + pCanvas->LineTo(iLeft, iHeight); + + iLeft = LEFT_SEG(Sender->Width)+WIDTH_SEG(Sender->Width)+WIDTH_LINE/2; + pCanvas->MoveTo(iLeft, iTop); + pCanvas->LineTo(iLeft, iHeight); + } + + pCanvas->Pen->Color = FramColor; + pCanvas->MoveTo(0, 0); // + pCanvas->LineTo(Sender->Width, 0); + pCanvas->MoveTo(0, Sender->Height-1); // + pCanvas->LineTo(Sender->Width, Sender->Height-1); + pCanvas->MoveTo(0, 0); // + pCanvas->LineTo(0, Sender->Height); + pCanvas->MoveTo(Sender->Width-1, 0); // + pCanvas->LineTo(Sender->Width-1, Sender->Height); +} +//--------------------------------------------------------------------------- +int __fastcall TSwitchTextureForm::DoTitle(TTableView *Sender) +{ + TPanelDB *pTitle = new TPanelDB(Sender); + pTitle->OnDrawBKG = DoDrawTitle; + +// if( Sender==(TPanelDB *)m_LstParttern ) +// pTitle->SetBounds(0, 0, Sender->Width, HEIGHT_TITTLE-1); +// else + pTitle->SetBounds(0, 0, Sender->Width, 1); + + if( Sender==(TTableView *)m_LstParttern ) { + SAFE_DELETE(m_btnCol) + SAFE_DELETE(m_btnSameType) + if(!m_btnCol) { + m_btnCol = new TPanelDB(this); + m_btnCol->Parent = this; + m_btnCol->Width = pngCollect->Width/3; + m_btnCol->Height = pngCollect->Height; + m_btnCol->Left = m_ShapeTexture->Left + m_ShapeTexture->Width - m_btnCol->Width - 14; + m_btnCol->Top = m_ShapeTexture->Top + (m_ShapeTexture->Height - m_btnCol->Height) / 2; + m_btnCol->Color = CapClolor; + m_btnCol->ShowHint = true; + m_btnCol->Hint = L"ʾղصӦ֯"; + m_btnCol->OnPaintBKG = DoDrawBtn; + m_btnCol->BringToFront(); + } + + if(!m_btnSameType) { + m_btnSameType = new TPanelDB(this); + m_btnSameType->Parent = this; + m_btnSameType->Width = pngType->Width/3; + m_btnSameType->Height = pngType->Height; + m_btnSameType->Left = m_btnCol->Left - m_btnCol->Width - 7; + m_btnSameType->Top = m_btnCol->Top; + m_btnSameType->Color = CapClolor; + m_btnSameType->ShowHint = true; + m_btnSameType->Hint = L"ʾ֯"; + m_btnSameType->OnPaintBKG = DoDrawBtn; + m_btnCol->BringToFront(); + } + + m_btnSameType->OnClick = DoPtChanged; + m_btnCol->OnClick = DoPtChanged; + m_btnSameType->Visible = m_cProgOri>=0; + m_btnSameType->Visible = !m_bChan9 && m_cProgOri>=0; + } + + return (int)pTitle; +} +//--------------------------------------------------------------------------- +void __fastcall TSwitchTextureForm::DoDrawTitle(TPanelDB *Sender, TCanvas *pCanvas, TRect rtBKG) +{ + int iLeft, iTop, iWidth, iHeight; + TRect rtTmp; + TSize sizeFont; + String strCaption; + TPanelDB *pBKG = (TPanelDB *)Sender->Parent; +// if( pBKG==m_LstProgType ) strCaption = L""; +// else if( pBKG==m_LstProg ) strCaption = m_bChan9 ? L"" : L""; +// else if( pBKG==m_LstParttern ) strCaption = L"֯"; + + iLeft = rtBKG.Left; + iTop = rtBKG.Top; + iWidth = rtBKG.Width(); + iHeight = rtBKG.Height(); + rtTmp = TRect(iLeft, iTop, iLeft+iWidth, iTop+iHeight);//(pBKG==m_LstParttern ? iHeight/2 : iHeight) ); + + pCanvas->Brush->Color = CapClolor; + pCanvas->FillRect(rtTmp); + +// sizeFont = pCanvas->TextExtent(strCaption); +// iTop = pBKG==m_LstParttern ? (iHeight/2 - sizeFont.Height)/2 +// : (iHeight - sizeFont.Height)/2; +// iLeft = (iWidth-sizeFont.Width)/2; +// pCanvas->Brush->Style = bsClear; +// pCanvas->Font->Color = FontClolor; +// pCanvas->TextOutW(iLeft, iTop, strCaption); + +// if( pBKG==m_LstParttern ) { +// iLeft = rtBKG.Left; +// iTop = iHeight/2; +// iHeight = iHeight/2; +// iWidth = pBKG->Width; +// +// rtTmp = TRect(iLeft, iTop, iLeft+iWidth, iTop+iHeight ); +// +// pCanvas->Brush->Color = BkClolor; +// pCanvas->FillRect(rtTmp); +// +// pCanvas->Brush->Color = FramColor; +// pCanvas->Pen->Color = FramColor; +// pCanvas->FrameRect(rtTmp); +// +// pCanvas->Brush->Style = bsClear; +// pCanvas->Font->Color = FontClolor; +// +//// pCanvas->Font->Size = 8; +// strCaption = L""; +// sizeFont = pCanvas->TextExtent(strCaption); +// iTop = iHeight+(iHeight - sizeFont.Height)/2; +// +// iLeft = LEFT_CAPTION+(WIDTH_PROG(iWidth)-sizeFont.Width)/2+5; +// pCanvas->TextOutW(iLeft, iTop, strCaption); +// +// strCaption = L""; +// iLeft = LEFT_STYLE(iWidth)+(WIDTH_STYLE(iWidth)-sizeFont.Width)/2+5; +// pCanvas->TextOutW(iLeft, iTop, strCaption); +// +// strCaption = L"Ƭ"; +// iLeft = LEFT_SEG(iWidth)+(WIDTH_SEG(iWidth)-sizeFont.Width)/2+5; +// pCanvas->TextOutW(iLeft, iTop, strCaption); +// +// strCaption = L"ղ"; +// iLeft = LEFT_COL(iWidth); +// iLeft = iLeft + (iWidth-iLeft-sizeFont.Width)/2; +// pCanvas->TextOutW(iLeft, iTop, strCaption); +// } + + pCanvas->Brush->Color = FramColor; + pCanvas->Pen->Color = FramColor; + pCanvas->FrameRect(rtBKG); +} +//--------------------------------------------------------------------------- +int __fastcall TSwitchTextureForm::DoBottom(TTableView *Sender) +{ + TPanelDB *pBottom = new TPanelDB(Sender); + pBottom->OnDrawBKG = DoDrawBottom; + + pBottom->SetBounds(0, Sender->Height-1, Sender->Width, 1); + + return (int)pBottom; +} +//--------------------------------------------------------------------------- +void __fastcall TSwitchTextureForm::DoDrawBottom(TPanelDB *Sender, TCanvas *pCanvas, TRect rtBKG) +{ + pCanvas->Brush->Color = FramColor; + pCanvas->FillRect(rtBKG); +} +//--------------------------------------------------------------------------- +void __fastcall TSwitchTextureForm::DoDrawBtn(TPanelDB *Sender, TCanvas *pCanvas, TRect rtBKG) +{ + pCanvas->Brush->Color = CapClolor; + pCanvas->FillRect(rtBKG); + + if( Sender==m_btnCol ) { + + int iWidth = pngCollect->Width/3; + int nTrans = !m_bCollected ? 0: (-2*iWidth); + + pCanvas->Draw(rtBKG.Left+nTrans, rtBKG.Top, pngCollect); + + }else if( Sender==m_btnSameType ) { + + int iWidth = pngType->Width/3; + int nTrans = !m_bSameType? 0: (-2*iWidth); + + pCanvas->Draw(rtBKG.Left+nTrans, rtBKG.Top, pngType); + } +} +//--------------------------------------------------------------------------- +void __fastcall TSwitchTextureForm::InitTypePanel() +{ + if( !m_LstProgType ) { + m_LstProgType = new TListViewText(this); + m_LstProgType->Parent = m_panType;// this; + m_LstProgType->Left = 0; + m_LstProgType->Top = 0; + m_LstProgType->Width = m_panType->Width; + m_LstProgType->Height = m_panType->Height; + m_LstProgType->OnClick= DoProgChanged; + m_LstProgType->OnDrawBKG = DoDrawBKG; + m_LstProgType->OnTitle = DoTitle; + m_LstProgType->OnBottom = DoBottom; + m_LstProgType->Border = 1; + m_LstProgType->SetTextFontSize(g_szFont9); + + m_LstProgType->OnMouseEnter = DoPanelFocus; + } + + m_VCType.clear(); + if( m_bChan9 ) { + m_VCType.push_back("GM"); + } + else { + for(int i=0; i<16; i++) + m_VCType.push_back(GM_GROUP[i]); + } + ((TListViewText *)m_LstProgType)->m_VcText = &m_VCType; + if( -1!=m_cProgOriType ) + m_LstProgType->IndSel = m_cProgOriType; + m_LstProgType->ReloadData(m_LstProgType->IndSel); +} +//--------------------------------------------------------------------------- +void __fastcall TSwitchTextureForm::InitProgPanel() +{ + if( !m_LstProg ) { + m_LstProg = new TListViewText(this); + m_LstProg->Parent = m_panProg;// this; + m_LstProg->Left = 0; + m_LstProg->Top = 0; //m_LstProgType->Top + m_LstProgType->Height + LSTDEPART; + m_LstProg->Height = m_panProg->Height;// HEIGHT_TYPE+HEIGHT_TITTLE; + m_LstProg->Width = m_panProg->Width;// TYPE_WIDTH; + m_LstProg->OnClick= DoProgChanged; + m_LstProg->OnDrawBKG = DoDrawBKG; + m_LstProg->OnTitle = DoTitle; + m_LstProg->OnBottom = DoBottom; + m_LstProg->Border = 1; + m_LstProg->OnMouseEnter = DoPanelFocus; + m_LstProg->SetTextFontSize(g_szFont9); + } + + m_VCProg.clear(); + if( -1!=m_cProgOriType ){ + if( m_bChan9 ) { + int num, index; + FONTPRESET* pSet = InsGetDrums(num, index); + for( int i=0; im_VcText = &m_VCProg; + if( -1!=m_InsIndex ) + m_LstProg->IndSel = m_InsIndex; + m_LstProg->ReloadData(m_LstProg->IndSel); +} +//--------------------------------------------------------------------------- +void __fastcall TSwitchTextureForm::InitPtPanel() +{ + m_VCProgSearch.clear(); + ReleasePt(); + + if( -1!=m_cProgOri ) { + InsSearchType(m_cProgOri, m_VCProgSearch, m_bSameType, m_bChan9); + + InitPtStyle( g_aOriginStyles ); + InitPtStyle( g_aShareStyles ); + InitPtStyle( g_aLocalStyles ); + } + + if( !m_LstParttern ) { + + m_LstParttern = new TListViewPattern(this, m_bChan9, m_lstStages, m_iPlayBar); + m_LstParttern->Parent = m_panTexture;//this; + m_LstParttern->Left = 0;//m_LstProgType->Left+m_LstProgType->Width+20; + m_LstParttern->Top = 0;//m_LstProgType->Top; + m_LstParttern->Height = m_panTexture->Height;// m_shapecheck->Top+m_shapecheck->Height-m_LstProgType->Top; + m_LstParttern->Width = m_panTexture->Width; // m_btnCancel->Left+m_btnCancel->Width-m_LstParttern->Left; + m_LstParttern->Color = BkClolor; + m_LstParttern->OnDrawBKG = DoDrawBKG; + m_LstParttern->OnTitle = DoTitle; + m_LstParttern->OnBottom = DoBottom; + m_LstParttern->Border = 1; + m_LstParttern->SetTextFontSize(g_szFont9); + + m_LstParttern->OnMouseEnter = DoPanelFocus; + ((TListViewPattern*)m_LstParttern)->OnTextureChanged = OnTextureChanged; + } + + int index = -1; + if( m_pStyleOri ){ + for( int i=0; iidLoc==m_pStyleOri->idLoc && pPtInfo->idStyle==m_pStyleOri->idStyle + && ((1<segType) & m_cSegType) + && pPtInfo->segNo==m_cSegNoOri && pPtInfo->prog==m_cProgOriBac ){ + if( m_pStyleOri->idLoc==0 ) { + if( m_pStyleOri->pOrigin->detail.tracks[pPtInfo->segType][m_cSegNoOri][pPtInfo->chNo].no==m_cChanOri ){ + index = i; + break; + } + } + else if( m_pStyleOri->idLoc!=0 && m_pStyleOri->idLoc!=1 ){ + if( m_pStyleOri->pLocal->trkRef[pPtInfo->segType][m_cSegNoOri][pPtInfo->chNo].chan==m_cChanOri ){ + index = i; + break; + } + } + } + } + } + + m_LstParttern->IndSel = index; + ((TListViewPattern *)m_LstParttern)->m_LstParttern = &m_VCPtInfo; + ((TListViewPattern *)m_LstParttern)->m_pPtInfo = NULL; + m_LstParttern->ReloadData(index); + + if( m_btnInit->Visible ) + m_btnInit->Enabled = index>=0; + m_btnTry->Enabled = false; +} +//--------------------------------------------------------------------------- +void __fastcall TSwitchTextureForm::ReleasePt() +{ + for( int i=0; iidLoc==0 ? info->pOrigin->detail.nSegNum[s] + : info->idLoc==1 ? info->pShare->nSegNum[s] + : info->pLocal->nSegNum[s]; + int num = s>4 ); + if( num>0 ) + { + for( int i=0; iidLoc==0 && info->pOrigin->detail.tracks[s][sn][j].no>=0 ) || + ( info->idLoc==1 && info->pShare->trkRef[s][sn][j].idStyle>0 ) || + ( info->idLoc!=0 && info->idLoc!=1 && info->pLocal->trkRef[s][sn][j].idStyle>0 ) ) + { + char chan = info->idLoc==0 ? info->pOrigin->detail.tracks[s][sn][j].no + : info->idLoc==1 ? info->pShare->trkRef[s][sn][j].chan + : info->pLocal->trkRef[s][sn][j].chan; + + if( (m_bChan9 && chan!=9) || (!m_bChan9 && chan==9) ) + continue; + + int state = info->idLoc==0 ? info->pOrigin->state + : info->idLoc==1 ? GetStyleInfo( 0, info->pShare->trkRef[s][sn][j].idStyle )->pOrigin->state + : e_Downloaded; + if( state!=e_Downloaded ) continue; + + char prog = info->idLoc==0 ? info->pOrigin->detail.tracks[s][sn][j].prog + : info->idLoc==1 ? info->pShare->trkRef[s][sn][j].prog + : info->pLocal->trkRef[s][sn][j].prog, + vol = info->idLoc==0 ? info->pOrigin->detail.tracks[s][sn][j].vol + : info->idLoc==1 ? info->pShare->trkRef[s][sn][j].vol + : info->pLocal->trkRef[s][sn][j].vol; + +// if( info->idLoc!=0 && info->idLoc!=1 ) { +// DebugPrint("j=%d, s=%d, sn=%d, chan=%d, prog=%d", j, s, sn, chan, prog); +// } + +// if( info->idLoc==1 ) { +// DebugPrint("j=%d, s=%d, sn=%d, chan=%d, prog=%d", j, s, sn, chan, prog); +// } + + bool bCollected = IsFavorTexture( info->idLoc, info->idStyle, s, sn, chan ); + bool bShow = !m_bCollected || bCollected; + if( !m_VCProgSearch.empty() ){ + if( progm_VCProgSearch[1] ) + bShow= false; + + } + + if( bShow ){ + TTextureInfo* pPtInfo = new TTextureInfo( info->idLoc, info->idStyle, + s, sn, j, prog, vol, bCollected); + + m_VCPtInfo.push_back( pPtInfo ); + } + } + } +// DebugPrint("* * * * * * * * * * * * * * * * * * "); + } + } + } + } +} +//--------------------------------------------------------------------------- +void __fastcall TSwitchTextureForm::DoPtChanged(TObject *Sender) +{ + f_MM_Stop(); + + TPanelDB *pBtnCur = (TPanelDB *)Sender; + if( m_btnCol==pBtnCur ) { + m_bCollected = !m_bCollected; + if( m_bCollected ) m_btnCol->Hint = L"ʾȫӦ֯"; + else m_btnCol->Hint = L"ʾղصӦ֯"; + + } + else if( m_btnSameType==pBtnCur ) { + m_bSameType = !m_bSameType; + if( m_bSameType ) m_btnSameType->Hint = L"ʾͬ֯"; + else m_btnSameType->Hint = L"ʾ֯"; + } + + InitPtPanel(); + + m_btnCol->Refresh(); + m_btnSameType->Refresh(); +} +//--------------------------------------------------------------------------- +void __fastcall TSwitchTextureForm::DoProgChanged(TObject *Sender) +{ + if( m_LstProgType==(TTableView *)Sender ) { + + if( m_cProgOriType == m_LstProgType->IndSel && m_cProgOriType!=-1 ) + return; + + m_cProgOriType = m_LstProgType->IndSel; + + m_LstProg->IndSel = -1; + m_InsIndex = -1; + m_cProgOri = -1; + + InitProgPanel(); + + }else if( m_LstProg==(TTableView *)Sender ) { + + if( m_InsIndex==m_LstProg->IndSel ) return; + + m_InsIndex = m_LstProg->IndSel; + if( -1!=m_cProgOriType ) { + if( m_bChan9 ) { + int num, index; + FONTPRESET* pSet = InsGetDrums(num, index); + m_cProgOri = pSet[m_InsIndex].id; + } + else m_cProgOri = m_cProgOriType*8+m_InsIndex; + } + } + + f_MM_Stop(); + + InitPtPanel(); +} +//--------------------------------------------------------------------------- +void __fastcall TSwitchTextureForm::DoPartternInit(TObject *Sender) +{ + f_MM_Stop(); + InitListPanel(); + + m_cSetFont = m_cSetProg = m_cSetProgOri = m_cSetSegType = m_cSetSegNo = -1; + m_pSetStyle = NULL; + + m_btnTry->Enabled = false; + if( m_btnInit->Visible ) + m_btnInit->Enabled = false; +} +//--------------------------------------------------------------------------- + +void __fastcall TSwitchTextureForm::OnTextureChanged(TObject *Sender) +{ + TTextureInfo *pPtInfo = ((TListViewPattern *)m_LstParttern)->m_pPtInfo; + + if( !pPtInfo ) + return; + +// TINSREF *pInsRef = pPtInfo->insRef; +// TPROSTYLE *pStyle = pPtInfo->styleInfo; + UINT iStyleId, iStyleLoc; + char st = pPtInfo->segType, + sn = pPtInfo->segNo, + tn = pPtInfo->chNo; + + m_cSetSegType = st; + m_cSetSegNo = sn; + m_cSetFont = m_bSetCur ? -1 : m_cFontCur; + m_cSetProg = m_cSetProgOri = pPtInfo->prog; + m_cSetVol = m_cSetVolOri = pPtInfo->vol; + + TPROSTYLE* pStyle = GetStyleInfo( pPtInfo->idLoc, pPtInfo->idStyle ); + + if( pPtInfo->idLoc==0 ){ + m_pSetStyle = pStyle; + m_cSetchan = pStyle->pOrigin->detail.tracks[st][sn][tn].no; + } + else if( pPtInfo->idLoc==1 ){ + TSTYLESHARE* pShare = pStyle->pShare; + TSHARETRACKREF& trkRef = pShare->trkRef[st][sn][tn]; + + m_cSetchan = trkRef.chan; + + int osn = trkRef.segNo; + char chan = trkRef.chan; + m_pSetStyle = GetStyleInfo( 0, trkRef.idStyle ); + if( m_pSetStyle!=pStyle ){ + for( int t=0; t<16; t++ ){ + if( m_pSetStyle->pOrigin->detail.tracks[st][osn][t].no==chan ){ + m_cSetProgOri = m_pSetStyle->pOrigin->detail.tracks[st][osn][t].prog; + m_cSetVolOri = m_pSetStyle->pOrigin->detail.tracks[st][osn][t].vol; + break; + } + } + } + } + else{ + TSTYLELOCAL* pLocal = pStyle->pLocal; + TTRACKREF& trkRef = pLocal->trkRef[st][sn][tn]; + + iStyleLoc = trkRef.idLoc; + iStyleId = trkRef.idStyle; + + m_cSetchan = trkRef.chan; + + int osn = trkRef.segNo; + char chan = trkRef.chan; + m_pSetStyle = GetStyleInfo( iStyleLoc, iStyleId ); + if( m_pSetStyle!=pStyle ){ + for( int t=0; t<16; t++ ){ + if( iStyleLoc==0 ){ + if( m_pSetStyle->pOrigin->detail.tracks[st][osn][t].no==chan ){ + m_cSetProgOri = m_pSetStyle->pOrigin->detail.tracks[st][osn][t].prog; + m_cSetVolOri = m_pSetStyle->pOrigin->detail.tracks[st][osn][t].vol; + break; + } + } + else{ + int nSegNum = pLocal->nSegNum[st]; + int iStart = ( st>4 )); + + bool bFind = false; + for( int i=iStart; !bFind && ipLocal->trkRef[st][i][j].idLoc==iStyleLoc + && m_pSetStyle->pLocal->trkRef[st][i][j].idStyle==iStyleId + && m_pSetStyle->pLocal->trkRef[st][i][j].segNo==osn + && m_pSetStyle->pLocal->trkRef[st][i][j].chan==chan ){ + m_cSetProgOri = m_pSetStyle->pLocal->trkRef[st][i][j].prog; + m_cSetVolOri = m_pSetStyle->pLocal->trkRef[st][i][j].vol; + + bFind = true; + break; + } + else if( m_pSetStyle->pLocal->trkRef[st][i][j].idLoc==0 + && m_pSetStyle->pLocal->trkRef[st][i][j].idStyle==0 ){ + break; + } + } + } + } + } + } + } + + bool bChange = m_pSetStyle!=m_pStyleOri || m_cSetSegNo!=m_cSegNoOri + || m_cSetProg!=m_cProgOri || m_cSetchan!=m_cChanOri; + if( m_btnInit->Visible ) + m_btnInit->Enabled = bChange; + m_btnTry->Enabled = bChange || m_cSetFont!=m_cFontCur; +} +//--------------------------------------------------------------------------- + +void __fastcall TSwitchTextureForm::DoPartternUse(TObject *Sender) +{ + f_MM_Stop(); +} +//--------------------------------------------------------------------------- +void __fastcall TSwitchTextureForm::DoPanelFocus(TObject *Sender) +{ + TPanelDB *pPanel = (TPanelDB *)Sender; + if( pPanel==m_LstParttern ) + m_LstParttern->SetFocus(); + if( pPanel==m_LstProgType ) + m_LstProgType->SetFocus(); + if( pPanel==m_LstProg ) + m_LstProg->SetFocus(); +} +//--------------------------------------------------------------------------- +void __fastcall TSwitchTextureForm::CurProgPlayClick(TObject *Sender) +{ + int iFont = -1, iProg = -1; + if( !m_ckPlay->Checked ){ + iFont = m_cFontCur; + iProg = m_cProgCur; + } + + if( ((TListViewPattern *)m_LstParttern)->m_iFont!=iFont + || ((TListViewPattern *)m_LstParttern)->m_iProg!=iProg ){ + f_MM_Stop(); + + ((TListViewPattern *)m_LstParttern)->m_iFont = iFont; + ((TListViewPattern *)m_LstParttern)->m_iProg = iProg; + } +} +//--------------------------------------------------------------------------- + + +void __fastcall TSwitchTextureForm::ReplaceProgClick(TObject *Sender) +{ + if( m_ckReplaceProg->Checked ) { + m_bSetCur = true; + + if( m_ckPlay->Checked==false ) { + m_ckPlay->Checked = true; + CurProgPlayClick(NULL); + } + } + else { + m_bSetCur = false; + } + + + if( m_pSetStyle ){ + m_cSetFont = m_bSetCur ? -1 : m_cFontCur; + + bool bChange = m_pSetStyle!=m_pStyleOri || m_cSetFont!=m_cFontCur || m_cSetSegNo!=m_cSegNoOri + || m_cSetProg!=m_cProgOri || m_cSetchan!=m_cChanOri; + m_btnTry->Enabled = bChange; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TSwitchTextureForm::DrumClick(TObject *Sender) +{ + f_MM_Stop(); + + m_cChanOri = m_cbDrum->Checked ? 9 : -1; + m_bChan9 = m_cChanOri==9; + ((TListViewPattern *)m_LstParttern)->m_bChan9 = m_bChan9; + + InitListPanel(); + + m_cSetFont = m_cSetProg = m_cSetSegType = m_cSetSegNo = -1; + m_pSetStyle = NULL; + + m_btnTry->Enabled = false; + if( m_btnInit->Visible ) + m_btnInit->Enabled = false; +} +//--------------------------------------------------------------------------- + +void __fastcall TSwitchTextureForm::FormCreate(TObject *Sender) +{ + m_BKGPanel->Font->Size = g_szFont9; + m_btnTry->FontSize = g_szFont9; + m_btnCancel->FontSize = g_szFont9; + m_btnInit->FontSize = g_szFont9; + m_ckPlay->Font->Size = g_szFont9; + m_ckReplaceProg->Font->Size = g_szFont9; + m_cbDrum->Font->Size = g_szFont9; + + Canvas->Font->Size = g_szFont9; +} +//--------------------------------------------------------------------------- + diff --git a/SwitchTextureForm.dfm b/SwitchTextureForm.dfm new file mode 100644 index 0000000..54f95ce --- /dev/null +++ b/SwitchTextureForm.dfm @@ -0,0 +1,368 @@ +object SwitchTextureForm: TSwitchTextureForm + Left = 0 + Top = 0 + BorderStyle = bsNone + Caption = 'SwitchTextureForm' + ClientHeight = 408 + ClientWidth = 494 + Color = 5064257 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + Position = poMainFormCenter + Scaled = False + OnCreate = FormCreate + TextHeight = 14 + object m_BKGPanel: TGeneralDialogPanel + Left = 0 + Top = 0 + Width = 494 + Height = 408 + Align = alClient + BevelOuter = bvSpace + Caption = #20048#22120#32455#20307#26367#25442 + Color = 5064257 + ParentBackground = False + TabOrder = 0 + ExplicitLeft = -8 + ExplicitTop = 24 + object m_btnTry: TTextButton + Left = 351 + Top = 368 + Width = 56 + Height = 25 + ModalResult = mrOk + ParentShowHint = False + ShowHint = True + OnClick = DoPartternUse + Enabled = False + Text = #30830#23450 + end + object m_btnCancel: TTextButton + Left = 416 + Top = 368 + Width = 56 + Height = 25 + ModalResult = mrCancel + ParentShowHint = False + ShowHint = True + Text = #21462#28040 + end + object m_btnInit: TTextButton + Left = 287 + Top = 368 + Width = 56 + Height = 25 + ParentShowHint = False + ShowHint = True + OnClick = DoPartternInit + Enabled = False + Text = #37325#32622 + end + object m_lbIntro: TLabel + Left = 23 + Top = 373 + Width = 180 + Height = 14 + Caption = #25152#36873#32455#20307#20165#21487#26367#25442#30456#24212#31867#22411#30340#27573#33853 + Color = 5066239 + Font.Charset = DEFAULT_CHARSET + Font.Color = 4342527 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentColor = False + ParentFont = False + end + object m_shapeOri: TShape + Left = 20 + Top = 294 + Width = 140 + Height = 25 + Brush.Color = 2433053 + Pen.Color = 8092539 + end + object m_lbOri: TLabel + Left = 20 + Top = 294 + Width = 140 + Height = 25 + Alignment = taCenter + AutoSize = False + Caption = #20351#29992#21407#22987#39118#26684#20048#22120 + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + Layout = tlCenter + end + object m_shapecheck: TShape + Left = 20 + Top = 318 + Width = 140 + Height = 34 + Brush.Color = 3090983 + Pen.Color = 8092539 + end + object m_ShapeProg: TShape + Left = 20 + Top = 167 + Width = 140 + Height = 21 + Brush.Color = 2433053 + Pen.Color = 8092539 + end + object m_ShapeType: TShape + Left = 20 + Top = 40 + Width = 140 + Height = 21 + Brush.Color = 2433053 + Pen.Color = 8092539 + end + object m_lbType: TLabel + Left = 20 + Top = 40 + Width = 140 + Height = 21 + Alignment = taCenter + AutoSize = False + Caption = #31867#21035 + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + Layout = tlCenter + end + object m_lbProg: TLabel + Left = 20 + Top = 167 + Width = 140 + Height = 21 + Alignment = taCenter + AutoSize = False + Caption = #20048#22120 + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + Layout = tlCenter + end + object m_ShapeTexture: TShape + Left = 180 + Top = 40 + Width = 292 + Height = 21 + Brush.Color = 2433053 + Enabled = False + Pen.Color = 8092539 + end + object m_lbTexture: TLabel + Left = 180 + Top = 40 + Width = 292 + Height = 21 + Alignment = taCenter + AutoSize = False + Caption = #32455#20307 + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + Layout = tlCenter + end + object m_ShapeTitle: TShape + Left = 180 + Top = 60 + Width = 292 + Height = 21 + Brush.Color = 2433053 + Enabled = False + Pen.Color = 8092539 + end + object Label1: TLabel + Left = 180 + Top = 60 + Width = 147 + Height = 21 + Alignment = taCenter + AutoSize = False + Caption = #20048#22120#21517 + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + Layout = tlCenter + end + object Label2: TLabel + Left = 331 + Top = 60 + Width = 55 + Height = 21 + Alignment = taCenter + AutoSize = False + Caption = #39118#26684 + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + Layout = tlCenter + end + object Label3: TLabel + Left = 390 + Top = 60 + Width = 43 + Height = 21 + Alignment = taCenter + AutoSize = False + Caption = #29255#27573 + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + Layout = tlCenter + end + object Label4: TLabel + Left = 437 + Top = 60 + Width = 35 + Height = 21 + Alignment = taCenter + AutoSize = False + Caption = #25910#34255 + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + Layout = tlCenter + end + object m_ckPlay: TCKBox + Left = 34 + Top = 325 + Width = 47 + Height = 18 + Caption = #35797#21548 + Ctl3D = False + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentColor = True + ParentCtl3D = False + ParentDoubleBuffered = False + ParentFont = False + TabOrder = 0 + OnClick = CurProgPlayClick + Checked = True + end + object m_ckReplaceProg: TCKBox + Left = 94 + Top = 325 + Width = 49 + Height = 18 + Caption = #26367#25442 + Ctl3D = False + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentColor = True + ParentCtl3D = False + ParentDoubleBuffered = False + ParentFont = False + TabOrder = 1 + OnClick = ReplaceProgClick + Checked = True + end + object m_cbDrum: TCKBox + Left = 284 + Top = 371 + Width = 49 + Height = 18 + Caption = #40723#32452 + Ctl3D = False + UseDockManager = False + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentColor = True + ParentCtl3D = False + ParentDoubleBuffered = False + ParentFont = False + TabOrder = 2 + Visible = False + OnClick = DrumClick + end + object m_panProg: TPanel + Left = 20 + Top = 187 + Width = 140 + Height = 91 + BevelOuter = bvNone + Caption = 'panFonts' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ShowCaption = False + TabOrder = 4 + end + object m_panTexture: TPanel + Left = 180 + Top = 80 + Width = 292 + Height = 272 + BevelOuter = bvNone + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ShowCaption = False + TabOrder = 5 + end + object m_panType: TPanel + Left = 20 + Top = 60 + Width = 140 + Height = 91 + BevelOuter = bvNone + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ShowCaption = False + TabOrder = 3 + end + end +end diff --git a/SwitchTextureForm.h b/SwitchTextureForm.h new file mode 100644 index 0000000..74a2470 --- /dev/null +++ b/SwitchTextureForm.h @@ -0,0 +1,127 @@ +//--------------------------------------------------------------------------- + +#ifndef SwitchTextureFormH +#define SwitchTextureFormH + +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include "ComboBoxComponent.h" +#include "PNGButton.hpp" +#include "TextButton.h" +#include "CKBox.h" +#include +//--------------------------------------------------------------------------- +#include +#include "ListViewPattern.h" +#include "GeneralDialogPanel.h" +class TSwitchTextureForm : public TForm +{ + +__published: // IDE-managed Components + + TGeneralDialogPanel *m_BKGPanel; + TTextButton *m_btnTry; + TTextButton *m_btnCancel; + TTextButton *m_btnInit; + TLabel *m_lbIntro; + TCKBox *m_ckPlay; + TCKBox *m_ckReplaceProg; + TLabel *m_lbOri; + TShape *m_shapeOri; + TShape *m_shapecheck; + TCKBox *m_cbDrum; + TLabel *m_lbProg; + TLabel *m_lbType; + TShape *m_ShapeProg; + TShape *m_ShapeType; + TLabel *m_lbTexture; + TShape *m_ShapeTexture; + TPanel *m_panType; + TPanel *m_panProg; + TPanel *m_panTexture; + TShape *m_ShapeTitle; + TLabel *Label1; + TLabel *Label2; + TLabel *Label3; + TLabel *Label4; + void __fastcall DoPartternInit(TObject *Sender); + void __fastcall DoPartternUse(TObject *Sender); + void __fastcall CurProgPlayClick(TObject *Sender); + void __fastcall ReplaceProgClick(TObject *Sender); + void __fastcall DrumClick(TObject *Sender); + void __fastcall FormCreate(TObject *Sender); + +private: // User declarations + + bool m_bSubProg, m_bChan9, m_bSameType, m_bCollected; + char m_cSegType, m_cFontCur, m_cProgCur, + m_cProgOriBac, m_cProgOri, m_cProgOriType; + + TPROSTYLE *m_pStyleOri; + char m_cChanOri, m_cSegNoOri; + + int m_InsIndex; + + TStageList* m_lstStages; + int m_iPlayBar; + + vector m_VCType, m_VCProg; + vector m_VCProgSearch; + VCPtInfo m_VCPtInfo; + + TPanelDB *m_btnCol, *m_btnSameType; + TListViewBase *m_LstParttern, *m_LstProgType, *m_LstProg; + + void __fastcall DoPanelFocus(TObject *Sender); + void __fastcall DoDrawBKG(TPanelDB *Sender, TCanvas *pCanvas, TRect rtBKG); + int __fastcall DoTitle(TTableView *Sender); + void __fastcall DoDrawBottom(TPanelDB *Sender, TCanvas *pCanvas, TRect rtBKG); + int __fastcall DoBottom(TTableView *Sender); + void __fastcall DoDrawTitle(TPanelDB *Sender, TCanvas *pCanvas, TRect rtBKG); + void __fastcall DoDrawBtn(TPanelDB *Sender, TCanvas *pCanvas, TRect rtBKG); + + void __fastcall InitPtStyle( STYLELIST& lstStyles ); + void __fastcall InitPtIns( TPROSTYLE* info ); + void __fastcall ReleasePt(); + + void __fastcall InitPtPanel(); + void __fastcall InitTypePanel(); + void __fastcall InitProgPanel(); + + void __fastcall DoPtChanged(TObject *Sender); + void __fastcall DoProgChanged(TObject *Sender); + + void __fastcall OnTextureChanged(TObject *Sender); + +public: // User declarations + + bool m_bSetCur; + char m_cSetFont, + m_cSetProg, + m_cSetProgOri, + m_cSetSegType, + m_cSetSegNo, + m_cSetchan, + m_cSetVol, + m_cSetVolOri; + + TPROSTYLE *m_pSetStyle; + + void __fastcall InitListPanel(); + + __fastcall TSwitchTextureForm(TComponent* Owner, + char iSegType, char iProgOri=-1, + char iFontCur=-1, char iProgCur=-1, + TPROSTYLE *pStyleOri=NULL, char chanOri=-1, char segNoOri=-1, + TStageList* lstStages=NULL, int iPlayBar=-1); + __fastcall ~TSwitchTextureForm(); +}; +//--------------------------------------------------------------------------- +extern PACKAGE TSwitchTextureForm *SwitchTextureForm; +//--------------------------------------------------------------------------- +#endif + + diff --git a/TableViewUnit.cpp b/TableViewUnit.cpp new file mode 100644 index 0000000..e0a2a98 --- /dev/null +++ b/TableViewUnit.cpp @@ -0,0 +1,580 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop + +#include "TableViewUnit.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +//--------------------------------------------------------------------------- +#define CelOFF 1 +#define HgtERROR 0 +//--------------------------------------------------------------------------- +__fastcall TTableView::TTableView(TComponent* Owner) : TScrollView(Owner) +{ + OnChangeSBPos = DoChgPos; + OnChangeSize = DoChgSize; + OnHgtTitle = DoHgtTitle; + OnHgtBottom = DoHgtBottom; + + FIndFocus = NOSET; + FIndSel = NOSET; + FCount = 0; + FHgtSmall = NOSET; + m_Title = NULL; + m_Bottom = NULL; + + OnMouseWheel = DoMouseWheel; +} +//--------------------------------------------------------------------------- +__fastcall TTableView::~TTableView() +{ + DoTableInit(); +} +//--------------------------------------------------------------------------- +bool __fastcall TTableView::ReloadData(int iCellIndex, SBS iSBS, int iTopline) +{ + bool bRet = true; + + DoTableInit(); + + if( FOnTitle ) { //set title + + m_Title = (TPanelDB *)FOnTitle(this); + if( m_Title ) m_Title->Parent = this; + } + + if( FOnBottom ) { //set Bottom + + m_Bottom = (TPanelDB *)FOnBottom(this); + if( m_Bottom ) m_Bottom->Parent = this; + } + + if( FOnCellHgt && FOnMDNum && FOnMDCell ) + { + m_DBNum = FOnMDNum(this); //set data num + if( m_DBNum<=0 ) bRet = false; + + if( bRet ) { + + for( int index=0; indexm_VCHGT[i] ) iSmlHgt = m_VCHGT[i]; + } + + int iSmlHgtTmp = iSmlHgt; + if(iSmlHgt>nHeight) + iSmlHgtTmp = iSmlHgt = (iSmlHgt-nHeight)%nHeight; + if( (HgtSmall!=NOSET) && (HgtSmall=nHeight ) { + + iCellShowNum = nHeight/iSmlHgt; + m_PosPage = nHeight/iSmlHgtTmp; + + bSBOK = true; + } + } + } + //get sb info + m_PosTotal = iPosNumTotal; + + //no sb will show + if(iCellShowHgt needs cell + //merge + if(m_UIOff-Offset<0) + { + bMerge = true; + if(m_UIOff!=0){ + iCellChgNum = Offset - m_UIOff; + }else{ + iCellChgNum = Offset; + } + m_IndTop -= iCellChgNum; + m_UIOff = 0; + + //--------------when just show between needs cell + }else{ + + bMerge = false; + iCellChgNum = 0; + m_UIOff -= Offset; + } + } break; + case CELLS_Down: + { + //--------------when just show > needs cell + //merge + if(m_UIOff+Offset>m_UIOffMerge || + m_UIOff==1) + { + bMerge = true; + if(m_UIOff> save the change cells's source index + if(iCelInd> iCellTop + if( m_IndBeg-m_UIOffMerge<=iIndTop+iCelInd && + iIndTop+iCelInd=GetCellBom() ) bVisible = false; + + return bVisible; +} +//--------------------------------------------------------------------------- +int __fastcall TTableView::getContentHeight() +{ + int nHeight = Height; + if( m_Title ) nHeight -= m_Title->Height; + if( m_Bottom ) nHeight -= m_Bottom->Height; + return nHeight; +} +//--------------------------------------------------------------------------- +TStateBtn* __fastcall TTableView::GetCellAds(int iCellIndex) +{ + TStateBtn *rowCellTmp = NULL; + + int index = 0; + BTNLST::iterator lst_FCell; + for( lst_FCell = (m_LstBtn).begin(); + lst_FCell != (m_LstBtn).end(); + lst_FCell++) + { + if(m_IndTop+index == iCellIndex){ + rowCellTmp = *lst_FCell; + break; + } + index++; + } + + return rowCellTmp; +} +//--------------------------------------------------------------------------- +int __fastcall TTableView::GetCellHgt(int iCellIndex) +{ + if( 0<=iCellIndex && iCellIndex<=m_DBNum-1 ) + return m_VCHGT[iCellIndex]; + + return 0; +} +//--------------------------------------------------------------------------- +int __fastcall TTableView::GetCellBeg() +{ + return m_IndBeg; +} +//--------------------------------------------------------------------------- +int __fastcall TTableView::GetCellBom() +{ + int nHeight = m_RtContent.Height(); + + int indBeg = m_IndBeg; + int iCurTop = m_HgtOver; + int index = 0; + for( ; index=nHeight ) break; + } + + return indBeg+index+1; +} +//--------------------------------------------------------------------------- +int __fastcall TTableView::GetCellNum() +{ + return m_DBNum; +} +//--------------------------------------------------------------------------- +void __fastcall TTableView::SetCellInd(int iCellIndex) +{ + if( iCellIndex<0 || iCellIndex>m_DBNum-1) return; + + int iTopLine = 0; + if( iCellIndex!=0 ) iTopLine = m_VCPOS[iCellIndex-1]; + + SetSBPos(SBS_POS, iTopLine); +} +//--------------------------------------------------------------------------- +void __fastcall TTableView::SetSBPos(SBS iSBS, int iTopline) +{ + short ScrollCode = iSBS; + + if(iSBS==SBS_TOP){ + + iTopline = 0; + + }else if(iSBS==SBS_BOTTOM){ + + iTopline = m_PosTotal-m_PosPage; + } + + DoChgPos(this, ScrollCode, iTopline); + SetSB(m_PosTotal, m_PosPage, m_PosBegin); +} +//--------------------------------------------------------------------------- +void __fastcall TTableView::DoChgPos(TObject *Sender, short ScrollCode, int iTopLine) +{ + if( iTopLine<0 ) { + iTopLine = 0; + } + else if(iTopLine>m_PosTotal-m_PosPage ) { + iTopLine = m_PosTotal-m_PosPage; + } + + if( m_bTop && (ScrollCode==SB_LINEUP||ScrollCode==SB_PAGEUP ) ){ + if(FOnMDTop) FOnMDTop(this); + return; + } + else if( m_bBom && (ScrollCode==SB_LINEDOWN||ScrollCode==SB_PAGEDOWN ) ){ + if(FOnMDBottom) FOnMDBottom(this); + return; + } + else if( iTopLine<0 || iTopLine>m_PosTotal ) return; + m_bTop = (0==iTopLine)?true:false; + m_bBom = (m_PosTotal-m_PosPage==iTopLine)?true:false; + + //get CELLS + CELLS eCELLS; + if(abs(m_PosBegin-iTopLine)>=m_PosPage+2) eCELLS = CELLS_Page; + else if(m_PosBeginiTopLine) eCELLS = CELLS_Up; + + //get new m_IndBeg + int iIndChange, iPosCur, iPosPre; + iIndChange = iPosCur = iPosPre = 0; + + int front, end, mid; + front = 0; + end = m_VCPOS.size()-1; + mid = (front+end)/2; + VCINT::iterator vc_FPos = (m_VCPOS).begin(); + iPosCur = *(vc_FPos+mid); + if(mid==0) iPosPre = 0; + else iPosPre = *(vc_FPos+mid-1); + while( front<=end ) { + + if(iPosPre<=iTopLine && iTopLineiTopLine) end = mid; + + mid = (front+end)/2; + iPosCur = *(vc_FPos+mid); + if(mid==0) iPosPre = 0; + else iPosPre = *(vc_FPos+mid-1); + } + + //get new m_IndBeg to it's pre index >> m_HgtOver + int iPosBeginNum = 0; + if( iIndChange != 0 ) iPosBeginNum = *(m_VCPOS.begin()+iIndChange-1); + int iABS = abs(iPosBeginNum-iTopLine); + m_HgtOver = -iABS*m_HgtSmall; + + if( iIndChange!=m_IndBeg ) { //change m_IndBeg + + int indBeginTmp = m_IndBeg; + m_IndBeg = iIndChange; + + DoLstChg( eCELLS, abs(indBeginTmp-iIndChange) ); + + }else { //change m_IndBeg over hegiht + + Paint(); + } + + m_PosBegin = iTopLine; +} +//--------------------------------------------------------------------------- +int __fastcall TTableView::DoHgtTitle(TObject *Sender) +{ + if( m_Title) return m_Title->Height; + return 0; +} +//--------------------------------------------------------------------------- +int __fastcall TTableView::DoHgtBottom(TObject *Sender) +{ + if( m_Bottom) return m_Bottom->Height; + return 0; +} +//--------------------------------------------------------------------------- +void __fastcall TTableView::DoPaintLst(TCanvas *pCanvas) +{ + int iTop, iLeft, iWidth, iHeight; + iTop = m_HgtTop + m_HgtOver + m_RtContent.Top; + iLeft = m_RtContent.Left; + iWidth = m_RtContent.Width(); + + int iIndex = 0; + for(BTNLST::iterator lstBtn=m_LstBtn.begin(); lstBtn!=m_LstBtn.end(); lstBtn++) { + + if(m_IndTop+iIndex>m_VCHGT.size()-1) { break; } + + iHeight = m_VCHGT[m_IndTop+iIndex]; + + (*lstBtn)->SetBounds( iLeft, iTop, iWidth, iHeight ); + (*lstBtn)->Paint(pCanvas); + + iTop += iHeight; + iIndex++; + } +} +//--------------------------------------------------------------------------- diff --git a/TableViewUnit.h b/TableViewUnit.h new file mode 100644 index 0000000..34f28ed --- /dev/null +++ b/TableViewUnit.h @@ -0,0 +1,148 @@ +//--------------------------------------------------------------------------- + +#ifndef TableViewUnitH +#define TableViewUnitH +//--------------------------------------------------------------------------- +#include "ScrollViewUnit.h" +#include "StateBtn.h" + +/* * * * * * * * * * * * * * * * +* * * * * * * * TTableView * * * * * +* * * * * * * * * * * * * * * */ + +#define NOSET -1 + +class TTableView; +typedef int __fastcall(__closure *TNotiTable)(TTableView *Sender); +typedef int __fastcall(__closure *TNotiT2C)(TTableView *Sender, int iCellIndex); +typedef int __fastcall(__closure *TNotiCell)(TStateBtn *Sender); +typedef int __fastcall(__closure *TNotiCellPt)(TStateBtn *Sender, TPoint pt); +typedef int __fastcall(__closure *TNotiC2C)(TStateBtn *Src, TStateBtn *Des, TPoint pt); +typedef int __fastcall(__closure *TNotiIconsNum)(TStateBtn *parent); +typedef int __fastcall(__closure *TNotiIconsBounds)(TStateBtn *sender, TRect &rtBounds); + +typedef vector VCINT; +typedef enum{ + CELLS_Default=0, + CELLS_Up, + CELLS_Down, + CELLS_Page +}CELLS; + +typedef enum{ + SBS_NONE=10, + SBS_POS, + SBS_TOP, + SBS_BOTTOM +}SBS; + +class TUIDelegate; +class TMDDelegate; + +class TTableView: public TScrollView +{ + +private: + + TNotifyEvent FOnChange; + + int FIndSel, FIndFocus, FCount, + FHgtSmall; + + bool m_bTop, m_bBom; + + int m_PosTotal, m_PosPage, m_PosBegin; + + int m_DBNum, m_DBNeed, + m_IndTop, m_IndBeg, + m_UIOff, m_UIOffMerge, + m_HgtSmall, m_HgtTop, m_HgtOver; + + VCINT m_VCHGT, m_VCPOS, m_VCCHG; + + TPanelDB *m_Title; + TPanelDB *m_Bottom; + int __fastcall getContentHeight(); + + bool __fastcall DoTableInit(); + bool __fastcall DoLstInitial(); + void __fastcall DoLstChg(CELLS eCELLS=CELLS_Default, int Offset=0); + void __fastcall DoLstChgPos(CELLS eCELLS=CELLS_Default, int Offset=0); + void __fastcall DoLstChgCel(CELLS eCELLS=CELLS_Default, bool bPaint=true); + void __fastcall DoChgPos(TObject *Sender, short ScrollCode, int iTopLine); + + + int __fastcall DoHgtTitle(TObject *Sender); + int __fastcall DoHgtBottom(TObject *Sender); + +protected: + + bool __fastcall IsCellVisible(int iCellIndex); + + virtual void __fastcall DoChgSize(TObject *Sender, TRect rtPanelDB){} + virtual int __fastcall DoMouseWheel(TObject *Sender){} + virtual void __fastcall DoPaintLst(TCanvas *pCanvas); + +public: + + __fastcall TTableView(TComponent* Owner); + __fastcall ~TTableView(); + + bool __fastcall ReloadData(int iCellIndex=NOSET, SBS iSBS=SBS_NONE, int iTopline=NOSET); + + TStateBtn* __fastcall GetCellAds(int iCellIndex); + int __fastcall GetCellHgt(int index); + int __fastcall GetCellBeg(); + int __fastcall GetCellBom(); + int __fastcall GetCellNum(); + void __fastcall SetCellInd(int iCellIndex); + void __fastcall SetSBPos(SBS iSBS=SBS_TOP, int iTopline=0); + +__published: + + __property int IndFocus = { read =FIndFocus, write=FIndFocus, default=NOSET }; + __property int IndSel = { read =FIndSel, write=FIndSel, default=NOSET }; + __property int HgtSmall = { read =FHgtSmall, write=FHgtSmall, default=NOSET }; + __property int Count = { read =GetCellNum }; + __property TNotifyEvent OnChange = {read=FOnChange, write=FOnChange }; + +private: + + TNotiT2C FOnCellHgt; + TNotiTable FOnTitle; + TNotiTable FOnBottom; + TNotiCellPt FOnClickL; + TNotiCellPt FOnClickLP; + TNotiCellPt FOnClickR; + TNotiCellPt FOnClickRP; + +__published: + + __property TNotiT2C OnCellHgt = { read = FOnCellHgt, write = FOnCellHgt }; + __property TNotiTable OnTitle = { read = FOnTitle, write = FOnTitle }; + __property TNotiTable OnBottom = { read = FOnBottom, write = FOnBottom }; + __property TNotiCellPt OnClickL = { read = FOnClickL, write = FOnClickL }; + __property TNotiCellPt OnClickLP = { read = FOnClickLP, write = FOnClickLP }; + __property TNotiCellPt OnClickR = { read = FOnClickR, write = FOnClickR }; + __property TNotiCellPt OnClickRP = { read = FOnClickRP, write = FOnClickRP }; + +private: + + TNotiT2C FOnMDCell; + TNotiTable FOnMDNum; + TNotiTable FOnMDTop; + TNotiTable FOnMDBottom; + TNotiC2C FOnMDMOV; + +__published: + + __property TNotiT2C OnMDCell = { read = FOnMDCell, write = FOnMDCell }; + __property TNotiTable OnMDNum = { read = FOnMDNum, write = FOnMDNum }; + __property TNotiTable OnMDTop = { read = FOnMDTop, write = FOnMDTop }; + __property TNotiTable OnMDBottom = { read = FOnMDBottom, write = FOnMDBottom }; + __property TNotiC2C OnMDMOV = { read = FOnMDMOV, write = FOnMDMOV }; +}; + +#endif + + diff --git a/TextButton.h b/TextButton.h new file mode 100644 index 0000000..57288e1 --- /dev/null +++ b/TextButton.h @@ -0,0 +1,101 @@ +//--------------------------------------------------------------------------- +#ifndef TextButtonH +#define TextButtonH +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include +#include +//--------------------------------------------------------------------------- +class PACKAGE TTextButton : public TGraphicControl +{ +public: + enum TModalResult{ + mrNone = System::Int8(0x0), + mrOk = System::Int8(0x1), + mrCancel = System::Int8(0x2), + mrAbort = System::Int8(0x3), + mrRetry = System::Int8(0x4), + mrIgnore = System::Int8(0x5), + mrYes = System::Int8(0x6), + mrNo = System::Int8(0x7), + mrClose = System::Int8(0x8), + mrHelp = System::Int8(0x9), + mrTryAgain = System::Int8(0xa), + mrContinue = System::Int8(0xb), + mrAll = System::Int8(0xc), + mrNoToAll = System::Int8(0xd), + mrYesToAll = System::Int8(0xe) + }; +private: + + TNotifyEvent FOnMouseEnter;//on mouse enter notify event + TNotifyEvent FOnMouseLeave;//on mouse leave notify event +// System::Uitypes::TModalResult FModalResult; + TModalResult FModalResult; + + MESSAGE void __fastcall CMMouseEnter(Winapi::Messages::TMessage &Msg); // to know when mouse is entered + MESSAGE void __fastcall CMMouseLeave(Winapi::Messages::TMessage &Msg); // to know when mouse is leaved + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(CM_MOUSEENTER, TMessage, CMMouseEnter) + MESSAGE_HANDLER(CM_MOUSELEAVE, TMessage, CMMouseLeave) + END_MESSAGE_MAP(TGraphicControl) + +protected: + + bool FDown; // value to know if we painting mouse down + int EtatBtn; // 0=Normal 1=Mouse entered 2=Pressed 3=Disabled + int FStateCount; + String FText; + + DYNAMIC void __fastcall MouseDown(System::Uitypes::TMouseButton Button, System::Classes::TShiftState Shift, int X, int Y); + DYNAMIC void __fastcall MouseUp(System::Uitypes::TMouseButton Button, System::Classes::TShiftState Shift, int X, int Y); + virtual void __fastcall SetEnabled(bool Value); + +__published: + + __property Action; + __property Anchors = {default=3}; +// __property System::Uitypes::TModalResult ModalResult = {read=FModalResult, write=FModalResult, default=0}; + __property TModalResult ModalResult = {read=FModalResult, write=FModalResult, default=mrNone}; + __property ParentShowHint = {default=1}; + __property PopupMenu; + __property ShowHint; + __property Visible = {default=1}; + __property OnClick; + __property OnContextPopup; + __property OnMouseDown; + __property OnMouseMove; + __property OnMouseUp; + __property System::Classes::TNotifyEvent OnMouseEnter = {read=FOnMouseEnter, write=FOnMouseEnter}; + __property System::Classes::TNotifyEvent OnMouseLeave = {read=FOnMouseLeave, write=FOnMouseLeave}; + __property bool Down = {read=FDown, write=SetDown, default=False}; + __property Enabled = {default=1}; + __property int ImgStates = {read=FStateCount, write=SetStateCount, default=4}; + __property String Text = {read=FText, write=FText}; + __property int FontSize = {write=SetFontSize, default=8}; + __property System::Uitypes::TFontName FontName = {write=SetFontName}; +private: + + void __fastcall PaintCustomer(void); + void __fastcall PaintCustomerText(void); + +public: + + __fastcall virtual TTextButton(System::Classes::TComponent* AOwner); + __fastcall virtual ~TTextButton(void); + + virtual void __fastcall Paint(void); // override the painting of the component + DYNAMIC void __fastcall Click(void); + + void __fastcall SetStateCount( int count ); + void __fastcall SetDown(bool value); // to know if mouse is down or not + void __fastcall SetFontSize( int value ); + void __fastcall SetFontName(System::Uitypes::TFontName value); + void __fastcall SetTextFont(String name, int size); +}; +//--------------------------------------------------------------------------- +#endif diff --git a/ToolpalPanel.cpp b/ToolpalPanel.cpp new file mode 100644 index 0000000..8f11923 --- /dev/null +++ b/ToolpalPanel.cpp @@ -0,0 +1,373 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop + +#include "GlobalUnit.h" +#include "MessageDef.h" +#include "ToolpalPanel.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) + +extern TImage * w_imgDrag; //϶ͼƬ +extern bool w_bDraging; +extern int w_iDragMode, //϶ģʽ + w_xImgDrag, //͸ͼƬλ + w_yImgDrag, + w_xOldDrag, //͸ͼƬϴλ + w_yOldDrag, + w_xOffDrag, //ͼƬϽ + w_yOffDrag; + +const COLORREF clrBackground = RGB(47, 50, 57), //屳 + clrBackboard = RGB( 29,31,35 ), //߿ + clrHeaderback = RGB( 58, 62, 69 ); // + +TMenuPanel* TToolpalPanel::m_PopMenu = NULL; +__fastcall TToolpalPanel::TToolpalPanel(TComponent* AOwner) + : Vcl::Extctrls::TPanel(AOwner) +{ + Visible = false; + ParentFont = true; + ShowHint = true; + DoubleBuffered = true; + + m_nTitleHeight = 25; + m_iType = 0; + Color = clrBackground; + + m_sbVert = NULL; + m_ApplicationEvents = NULL; +} +//--------------------------------------------------------------------------- + +void __fastcall TToolpalPanel::CreateWnd(void) +{ + Vcl::Extctrls::TPanel::CreateWnd(); + + if( m_ApplicationEvents==NULL ){ + m_ApplicationEvents = new TApplicationEvents(NULL); + m_ApplicationEvents->OnMessage = DoHandleMessage; + } +} +//--------------------------------------------------------------------------- + +__fastcall TToolpalPanel::~TToolpalPanel() +{ + if( m_ApplicationEvents ) + delete m_ApplicationEvents; + + if( m_sbVert ) + delete m_sbVert; + + while( m_lstBtnTools.size()>0 ){ + delete m_lstBtnTools.back(); + m_lstBtnTools.pop_back(); + } +} +//--------------------------------------------------------------------------- +void __fastcall TToolpalPanel::Paint() +{ + if( w_bDraging ){ + //ư͸ͼƬ + TBlendFunction Blend; + Blend.BlendOp = AC_SRC_OVER; + Blend.BlendFlags = 0; + Blend.AlphaFormat = 0; + Blend.SourceConstantAlpha =135; + + TPoint pt(w_xImgDrag, w_yImgDrag); + pt = ScreenToClient( pt ); + + ::AlphaBlend (Canvas->Handle, + pt.X, + pt.Y, + w_imgDrag->Width, + w_imgDrag->Height, + w_imgDrag->Canvas->Handle, + 0, + 0, + w_imgDrag->Width, + w_imgDrag->Height, + Blend + ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TToolpalPanel::WMEraseBkgnd(Winapi::Messages::TWMEraseBkgnd &Message) +{ + TRect rect = GetClientRect(); + + TCanvas* tempCanvas = new TCanvas; + tempCanvas->Handle = Message.DC; + + //߿ + tempCanvas->Brush->Color = clrBackboard; + tempCanvas->FrameRect(rect); + + //Ʊ + tempCanvas->Pen->Color = clrBackboard; + tempCanvas->MoveTo( 1, m_nTitleHeight ); + tempCanvas->LineTo( Width-1, m_nTitleHeight ); + + TRect rtTitle(rect); + rtTitle.Left++; + rtTitle.Right--; + rtTitle.Top++; + rtTitle.Bottom = m_nTitleHeight; + + tempCanvas->Brush->Color = clrHeaderback; + tempCanvas->FillRect(rtTitle); + + tempCanvas->Font->Name = g_strTxtFontName; + tempCanvas->Font->Size = g_szFont9; + tempCanvas->Font->Color = RGB(156, 170, 189); + + TSize size = tempCanvas->TextExtent( m_strTitle ); + int x = 12,//(Width - size.Width) / 2, + y = (25 - size.Height) / 2 + 1; + + tempCanvas->TextOut( x, y, m_strTitle ); + + //Ƶɫ + rect.Top += m_nTitleHeight; + rect.Left++; + rect.Right--; + rect.Bottom--; + tempCanvas->Brush->Color = clrBackground; + tempCanvas->FillRect( rect ); + + delete tempCanvas; + + Message.Result = true; +} +//--------------------------------------------------------------------------- + +void __fastcall TToolpalPanel::WMSize(Winapi::Messages::TWMSize &Message) +{ + DefaultHandler( &Message ); + + LayoutBtns(); +} +//--------------------------------------------------------------------------- + +void __fastcall TToolpalPanel::AddToolBtn( int stateCount, String resName, + TNotifyEvent aClickEvent, String strHint, + int index ) +{ + if( resName.Length()>0 ){ + TPngImage* img = new TPngImage(); + img->LoadFromResourceName( int(HInstance), resName ); + + TPNGButton* pBtn = new TPNGButton(NULL); + pBtn->SetStateCount( stateCount ); + pBtn->SetPngImg( img ); + + delete img; + + pBtn->Parent = this; +// pBtn->Left = Width - pBtn->Width - 4; + pBtn->Top = ( m_nTitleHeight - pBtn->Height ); + pBtn->OnClick = aClickEvent; + pBtn->ShowHint = true; + pBtn->Hint = strHint; + pBtn->OnMouseEnter = BtnToolMouseEnter; + + if( index==-1 ) + m_lstBtnTools.push_back( pBtn ); + else + m_lstBtnTools.insert( m_lstBtnTools.begin()+index, pBtn ); + + LayoutBtns(); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TToolpalPanel::DoHandleMessage(MSG &Msg, bool &Handled) +{ + if( !Visible ) + return; + + + if( Msg.message==WM_MOUSEMOVE && Msg.wParam==0 ){ + TPoint pt( Msg.pt.x, Msg.pt.y ); + pt = ScreenToClient( pt ); + + if( m_sbVert && m_sbVert->Visible && Msg.hwnd!=m_sbVert->Handle ) //Զ + m_sbVert->Visible = false; + + if( pt.x>=0 && pt.x=0 && pt.yCursor = crHSplit; + m_ApplicationEvents->CancelDispatch(); + } + } + else{ + if( Screen->Cursor==crHSplit ) + Screen->Cursor = crDefault; + + if( CanVSplit() && pt.y <= LEFT_BOUND ){ //϶߶ + Screen->Cursor = crVSplit; + m_ApplicationEvents->CancelDispatch(); + } + else if( Screen->Cursor==crVSplit ) + Screen->Cursor = crDefault; + } + + if( m_sbVert && m_sbVert->IsOperable() && pt.x >= m_sbVert->Left + && pt.y >= m_sbVert->Top ){ //Զʾ + m_sbVert->Visible = true; + m_ApplicationEvents->CancelDispatch(); + } + } + else if( Screen->Cursor==crHSplit && g_iToolPanelShow==1 + && ( pt.x<0 || pt.x>=Width ) + || Screen->Cursor==crVSplit && (pt.y<0 || pt.y>=Height)) + Screen->Cursor = crDefault; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TToolpalPanel::WMMouseDown(TWMMouse &Message) +{ + if( ( Message.Keys & MK_LBUTTON ) && ( Screen->Cursor==crVSplit //߶ + || Screen->Cursor==crHSplit )){ // + TPoint pt; + + if( Screen->Cursor==crVSplit ){ + DrawDragImg( DM_ADJUSTHEIGHT ); + pt.x = 1; + pt.y = 0; + } + else{ + DrawDragImg( DM_ADJUSTWIDTH ); + + pt.x = 0; + pt.y = PANEL_TOP - Top; + } + + pt = ClientToScreen( pt ); + + w_xOldDrag = w_xImgDrag = pt.X; + w_yOldDrag = w_yImgDrag = pt.Y; + + w_xOffDrag = Message.XPos - 1; + w_yOffDrag = Message.YPos; + + SetCapture( Handle ); + + Message.Result = 1; + } +} +//--------------------------------------------------------------------------- + +void TToolpalPanel::DrawDragImg( int mode ) +{ + w_imgDrag = new TImage(this); + + if( mode==DM_ADJUSTWIDTH ){ + COLORREF clrPixel[2] = { clWhite, clBlack }; + + w_imgDrag->Width = 4; + w_imgDrag->Height = Application->MainForm->Height - PANEL_TOP - STATE_HEIGHT; + + TRect rcDraw( 0, 0, w_imgDrag->Width, w_imgDrag->Height ); + + for( int i=0; iWidth; i++ ){ + for( int j=0; jHeight; j++ ){ + w_imgDrag->Canvas->Pixels[i][j] = clrPixel[(i+j)%2]; + } + } + } + else if( mode==DM_ADJUSTHEIGHT ){ + COLORREF clrPixel[2] = { clWhite, clBlack }; + + w_imgDrag->Width = Width-2; + w_imgDrag->Height = 4; + + TRect rcDraw( 0, 0, w_imgDrag->Width, w_imgDrag->Height ); + + for( int i=0; iWidth; i++ ){ + for( int j=0; jHeight; j++ ){ + w_imgDrag->Canvas->Pixels[i][j] = clrPixel[(i+j)%2]; + } + } + } + + w_bDraging = true; + w_iDragMode = mode; +} +//--------------------------------------------------------------------------- + +bool TToolpalPanel::ShowDragImg( bool bShow, int iState ) +{ + int w = w_imgDrag->Width, + h = w_imgDrag->Height; + TPoint ptOld( w_xOldDrag, w_yOldDrag ), + ptNew( w_xImgDrag, w_yImgDrag ); + RECT rtInvalid; + + ptOld = ScreenToClient( ptOld ); + ptNew = ScreenToClient( ptNew ); + + if( w_iDragMode==DM_ADJUSTWIDTH ){ + rtInvalid.left = Width; + rtInvalid.right = 0; + rtInvalid.top = 1; + rtInvalid.bottom = Height-1; + + if( ptOld.X>0 && ptOld.X0 && ptOld.X+w0 && ptNew.X0 && ptNew.X+wWidth ) rtInvalid.right = Width; + + if( rtInvalid.right>rtInvalid.left ){ + InvalidateRect( Handle, &rtInvalid, false ); + } + } + + return false; +} +//--------------------------------------------------------------------------- + +void TToolpalPanel::DeleteToolBtn( int index ) +{ + if( indexLeft = r - pBtn->Width; + if( i==0 ) pBtn->Left -= 4; + + r = pBtn->Left; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TToolpalPanel::BtnToolMouseEnter(TObject* Sender) +{ + if( Screen->Cursor!=crDefault ) + Screen->Cursor = crDefault; +} +//--------------------------------------------------------------------------- diff --git a/ToolpalPanel.h b/ToolpalPanel.h new file mode 100644 index 0000000..07c7860 --- /dev/null +++ b/ToolpalPanel.h @@ -0,0 +1,73 @@ +//--------------------------------------------------------------------------- +#ifndef ToolpalPanelH +#define ToolpalPanelH + +#include +using namespace std; + +#include "PNGButton.hpp" +#include "SkinScrollBarUnit.h" +#include "MenuUnit.h" +#include + +#define TPTYPE_STYLE 0 +#define TPTYPE_CHORD 1 +#define TPTYPE_EFFECT 2 +#define LEFT_BOUND 4 +#define RIGHT_BOUND 8 + +//drag mode +#define DM_ADJUSTWIDTH 1 // +#define DM_ADJUSTHEIGHT 2 //߶ +#define DM_ADJUSTSTYLE 3 // +#define DM_ADJUSTSTAGE 4 // +#define DM_ADJUSTAUDIO 5 //Ƶ +#define DM_ADJUSTHEADER 6 //ͷ + +//--------------------------------------------------------------------------- +class TToolpalPanel : public Vcl::Extctrls::TPanel +{ +protected: + TSkinScrollBar *m_sbVert; + TApplicationEvents *m_ApplicationEvents; + static TMenuPanel* m_PopMenu; //˵ + + vector m_lstBtnTools; + String m_strTitle; + int m_nTitleHeight; + + void LayoutBtns(); + void DeleteToolBtn( int index ); + void DrawDragImg( int mode ); + + virtual bool CanVSplit(){ return false; }; + + virtual void __fastcall CreateWnd(); + virtual void __fastcall Paint(void); + void __fastcall BtnToolMouseEnter(TObject* Sender); + virtual void __fastcall DoHandleMessage(MSG &Msg, bool &Handled); //Ϣ + + virtual MESSAGE void __fastcall WMMouseDown(TWMMouse &Message); + virtual MESSAGE void __fastcall WMSize(Winapi::Messages::TWMSize &Message); + MESSAGE void __fastcall WMEraseBkgnd(Winapi::Messages::TWMEraseBkgnd &Message); + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(WM_ERASEBKGND, TWMEraseBkgnd, WMEraseBkgnd) + MESSAGE_HANDLER(WM_LBUTTONDOWN, TWMMouse, WMMouseDown) + MESSAGE_HANDLER(WM_RBUTTONDOWN, TWMMouse, WMMouseDown) + MESSAGE_HANDLER(WM_SIZE, TWMSize, WMSize) + END_MESSAGE_MAP(Vcl::Extctrls::TPanel) +public: + int m_iType; + + __fastcall TToolpalPanel(System::Classes::TComponent* AOwner); + __fastcall ~TToolpalPanel(); + + static void SetPopMenu( TMenuPanel* pMenu ){ m_PopMenu = pMenu; }; + virtual bool ShowDragImg( bool bShow=true, int iState=0 ); + void SetTitle( String str ){ m_strTitle = str; }; + void __fastcall AddToolBtn( int stateCount, String resName, + TNotifyEvent aClickEvent, String strHint, int index=-1 ); +}; + +#endif diff --git a/TrackPanel.cpp b/TrackPanel.cpp new file mode 100644 index 0000000..23e9227 --- /dev/null +++ b/TrackPanel.cpp @@ -0,0 +1,1293 @@ +//--------------------------------------------------------------------------- +#include +#include +#pragma hdrstop + +#include "GlobalUnit.h" +#include "MidiTrack.h" +#include "TrackPanel.h" +#include "AudioFxFormUnit.h" +#include "VSTPluginFormUnit.h" +#include "Undo.h" + +#define LEFT_BOUND 16 +#define ROW_GAP 10 + +static const TColor + CLR_TXT_NOR = RGB( 156, 170, 189 ), + CLR_TXT_HOT = RGB( 201, 214, 229 ), + clrStateBoard = RGB( 29,31,35 ), + clrState[5] = { RGB(186,185,185), RGB(216,215,215), + RGB(248,235,159), RGB(250,244,213), + RGB(100,99,99)}; +//--------------------------------------------------------------------------- +#pragma package(smart_init) + +// TSMButton /////////////////////////////////////////////////////////////// +__fastcall TSMButton::TSMButton(System::Classes::TComponent* AOwner) + : Vcl::Controls::TGraphicControl(AOwner) +{ + FType = 0; + FHover = FDown = false; + + Canvas->Font->Name = "SimHei"; + Canvas->Font->Size = g_szFont9; +} +//--------------------------------------------------------------------------- + +void __fastcall TSMButton::Paint(void) +{ + Canvas->Brush->Style = bsSolid; + + if( !Enabled ) + Canvas->Brush->Color = clrState[4]; + else if( FHover ){ + if( FDown ) + Canvas->Brush->Color = clrState[3]; + else + Canvas->Brush->Color = clrState[1]; + } + else if( FDown ) + Canvas->Brush->Color = clrState[2]; + else + Canvas->Brush->Color = clrState[0]; + + TRect rtSM( 0, 0, Width-1, Height-1 ); + Canvas->FillRect( rtSM ); + Canvas->Brush->Color = clrStateBoard; + Canvas->FrameRect( rtSM ); + + Canvas->Brush->Style = bsClear; + Canvas->TextOut( 5, 3, FType==TRACK_MUTE ? "M" : "S" ); + Canvas->Brush->Style = bsSolid; +} +//--------------------------------------------------------------------------- + +void __fastcall TSMButton::CMMouseEnter(Winapi::Messages::TMessage &Message) +{ + FHover = true; + Repaint(); +} +//--------------------------------------------------------------------------- + +void __fastcall TSMButton::CMMouseLeave(Winapi::Messages::TMessage &Message) +{ + FHover = false; + Repaint(); +} +//--------------------------------------------------------------------------- + +void __fastcall TSMButton::SetDown( bool bDown ) +{ + if( FDown!=bDown ){ + FDown = bDown; + Repaint(); + } +} +//--------------------------------------------------------------------------- + +// TTrackPanel //////////////////////////////////////////////////////////// +__fastcall TTrackPanel::TTrackPanel(TComponent* AOwner) + : TToolpalPanel(AOwner) +{ + m_iType = -1; + m_iTrack = -1; + m_lblName = NULL; + m_iconMidi = m_iconWave = NULL; + m_imgType = NULL; + m_btnMute = m_btnSolo = NULL; + + m_strTitle = ""; +} +//--------------------------------------------------------------------------- + +void __fastcall TTrackPanel::CreateWnd(void) +{ + TToolpalPanel::CreateWnd(); + + int top = m_nTitleHeight + ROW_GAP + 4; + + m_iconMidi = new TBitmap(); + m_iconMidi->LoadFromResourceName(int(HInstance), L"imgMidiIcon"); + m_iconWave = new TBitmap(); + m_iconWave->LoadFromResourceName(int(HInstance), L"imgWaveIcon"); + + m_imgType = new TImage(NULL); + m_imgType->Parent = this; + m_imgType->SetBounds( LEFT_BOUND, top, m_iconMidi->Width, m_iconMidi->Height ); + + m_lblName = new TLabel(NULL); + m_lblName->Parent = this; + m_lblName->AutoSize = false; + m_lblName->EllipsisPosition = epEndEllipsis; + m_lblName->Font->Name = g_strTxtFontName; + m_lblName->Font->Size = g_szFont9; + m_lblName->Font->Color = CLR_TXT_NOR; + m_lblName->Caption = "δѡ"; + m_lblName->SetBounds( LEFT_BOUND + 22, top, Width - 100, 20 ); + + m_btnMute = new TSMButton( NULL ); + m_btnMute->Parent = this; + m_btnMute->Type = TRACK_MUTE; + m_btnMute->SetBounds( Width - 56, top, 17, 17 ); + m_btnMute->OnMouseDown = SMMouseDown; + + m_btnSolo = new TSMButton( NULL ); + m_btnSolo->Parent = this; + m_btnSolo->Type = TRACK_SOLO; + m_btnSolo->SetBounds( Width - 36, top, 17, 17 ); + m_btnSolo->OnMouseDown = SMMouseDown; + + top += m_lblName->Height + ROW_GAP*2; + int lLabel = LEFT_BOUND + 24, + wLabel = 40, + lComp = lLabel + wLabel, + wComp = Width - 64 - lComp; + + for( int i=0; iParent = this; + m_lstCaption[i]->AutoSize = false; + m_lstCaption[i]->Layout = tlBottom; + m_lstCaption[i]->Font->Name = g_strTxtFontName; + m_lstCaption[i]->Font->Size = g_szFont9; + m_lstCaption[i]->Font->Color = CLR_TXT_NOR; + m_lstCaption[i]->SetBounds( lLabel, top, wLabel, 18 ); + + m_lstCaption[i]->Caption = i==0 ? "" : i==1 ? "" : ""; + + m_lstTrack[i] = new TSkinTrackBar(NULL); + m_lstTrack[i]->Parent = this; + m_lstTrack[i]->Tag = i; + m_lstTrack[i]->SetBounds( lComp-2, top, wComp, 18 ); + m_lstTrack[i]->Max = i==0 ? 100 : 100; + m_lstTrack[i]->Min = i==0 ? 0 : -100; + m_lstTrack[i]->PageSize = i==0 ? 10 : 20; + m_lstTrack[i]->Position = i==0 ? 100 : 0; + m_lstTrack[i]->OnChange = TrackBarChange; + + top += 18 + ROW_GAP; + } + + top += ROW_GAP; + + m_lblAudio = new TLabel(NULL); +// m_lblAudio->Visible = false; + m_lblAudio->Parent = this; + m_lblAudio->AutoSize = false; + m_lblAudio->Layout = tlCenter; + m_lblAudio->Font->Name = g_strTxtFontName; + m_lblAudio->Font->Size = g_szFont9; + m_lblAudio->Font->Color = CLR_TXT_NOR; + m_lblAudio->Caption = "Ч"; + m_lblAudio->SetBounds( lLabel, top, wLabel, 20 ); + + for( int i=0; iParent = this; + m_lblMidi[i]->AutoSize = false; + m_lblMidi[i]->Layout = tlCenter; + m_lblMidi[i]->Font->Name = g_strTxtFontName; + m_lblMidi[i]->Font->Size = g_szFont9; + m_lblMidi[i]->Font->Color = CLR_TXT_NOR; + m_lblMidi[i]->Caption = i==1 ? "ͨ" : i==0 ? "Դ" : i==2 ? "" : "֯"; + m_lblMidi[i]->SetBounds( lLabel, top, wLabel, 20 ); + + if( i==1 ){ + m_cbChannel = new TComboBoxComponent(NULL); + m_cbChannel->Parent = this; + m_cbChannel->SetFont(g_strTxtFontName,g_szFont9); + m_cbChannel->ShowItemCount = 16; + m_cbChannel->SetBounds( lComp, top, wComp, 20 ); + + for( int j=0; j<16; j++ ){ + char txt[16]; + sprintf( txt, "ch: %02d", j+1 ); + m_cbChannel->AddItem( txt ); + } + m_cbChannel->OnChange = ComboBoxChange; + } + else{ + int ind = i>1 ? i-1 : 0; + m_btnMidi[ind] = new TCapButton( NULL ); + m_btnMidi[ind]->Parent = this; + m_btnMidi[ind]->SetFont(g_strTxtFontName,g_szFont9); + m_btnMidi[ind]->Tag = i; + m_btnMidi[ind]->SetBounds( lComp, top, wComp, 20 ); + m_btnMidi[ind]->OnClick = CapButtonClick; + + if( ind==2 ) + m_btnMidi[ind]->Caption = "ѡ滻"; + } + + top += 20 + ROW_GAP; + } + + if(!m_pImgDel) { + m_pImgDel = new TPngImage(); + m_pImgDel->LoadFromResourceName(int(HInstance), L"imgDelete"); + } + + if(!m_pImgOff) { + m_pImgOff = new TPngImage(); + m_pImgOff->LoadFromResourceName(int(HInstance), L"imgEffectOff"); + } + + if(!m_pImgOn) { + m_pImgOn = new TPngImage(); + m_pImgOn->LoadFromResourceName(int(HInstance), L"imgEffectOn"); + } + + if(!m_pngAdd) { + m_pngAdd = new TPngImage(); + m_pngAdd->LoadFromResourceName(int(HInstance), L"imgEffectAdd"); + } + + if( !m_pLstView ) { + m_pBtnAdd = new TPNGButton(this); + m_pBtnAdd->Parent = this; + m_pBtnAdd->SetStateCount(4); + m_pBtnAdd->SetPngImg(m_pngAdd); + m_pBtnAdd->OnClick = DoLstAddItem; + m_pBtnAdd->SetBounds(Width - 56, m_lblAudio->Top, + m_pngAdd->Width/3, m_pngAdd->Height); + + m_pLstView = new TListViewMove(this); + m_pLstView->Parent = this; + m_pLstView->Border = 1; + m_pLstView->OnItemDBLClick = DoLstItemDBLClick; + m_pLstView->OnItemRightClick = DoLstItemRightClick; + m_pLstView->OnItemStateChange = DoLstItemStateChange; + m_pLstView->OnItemDelete = DoLstItemDelete; + m_pLstView->OnItemMoveEnd = DoLstItemMovEnd; + m_pLstView->OnMouseEnter = DoLstMouseEnter; + m_pLstView->SetTextFontSize( g_szFont9 ); + int nMaxCount = (Height - m_lblAudio->Top - 40) / CELL_HEIGHT; + + RECTSET( m_pLstView, lComp, m_lblAudio->Top, wComp, CELL_HEIGHT*nMaxCount+12 ) + m_pLstView->AddIcon(m_pImgDel, m_pImgOff, m_pImgOn); + m_pLstView->ReloadData(); + } + + EnableComponets(); +} +//--------------------------------------------------------------------------- + +__fastcall TTrackPanel::~TTrackPanel() +{ + SAFE_DELETE( m_lblName ); + SAFE_DELETE( m_iconMidi ); + SAFE_DELETE( m_iconWave ); + SAFE_DELETE( m_imgType ); + + for( int i=0; iClearAllItems(); + + TBaseTrack* pBase = NULL; + + if( iType==ST_MIDI ){ + TMidiTrack* pMT = g_aMidiTracks[iTrack]; + String strProg = GetProgName( pMT->bank, pMT->chno, pMT->prog ); + + m_lblName->Caption = "MIDI" + strProg; + m_imgType->Picture->Bitmap = m_iconMidi; + m_cbChannel->DefItemIndex = pMT->chno; + + int iFont = pMT->bank==0xFF && !g_bExtFont ? g_idFont: pMT->bank; + String strFont; + if( iFont==0xFF ){ + strFont = "չɫ"; + } + else if( iFont<0x80 ){ + FONTINFO* pFI = g_lstFonts[iFont]; + strFont = pFI->strFontName; + } + else{ + VSTINFO* pFI = g_lstVSTi[iFont-0x80]; + strFont = pFI->strVSTName; + } + + m_btnMidi[0]->Caption = strFont; + m_btnMidi[0]->Invalidate(); + + + m_btnMidi[1]->Caption = strProg; + m_btnMidi[1]->Invalidate(); + + pBase = pMT; + } + else if( iType==ST_AUDIO ){ + TAudioTrack* pAT = g_aAudioTracks[iTrack]; + + m_lblName->Caption = "Ƶ " + IntToStr( iTrack ); + m_imgType->Picture->Bitmap = m_iconWave; + + pBase = pAT; + + if( !pAT->lstFxs.empty() ){ + for( int i=0; ilstFxs.size(); i++ ){ + TAudioFx* pFx = pAT->lstFxs[i]; + char strName[256]; + + if( pFx->iFxiFx==FX_PITCH ? MAX_FX_NUM-1 : pFx->iFx; + strcpy( strName, g_strEffect[no] ); + } + else{ + VSTINFO* pVST = g_lstVSTFx[pFx->iFx - FX_VST]; + + if( pFx->iPreset<0 ){ + char *name = strrchr( pVST->strFileName, '\\' )+1, + *ext = strrchr( pVST->strFileName, '.' ); + + if( ext>name ){ + strncpy( strName, name, ext-name ); + strName[ext-name] = '\0'; + } + else + strcpy(strName, name ); + } + else{ + strcpy( strName, pVST->aPlugins[pFx->iPreset]->name ); + } + } + + m_pLstView->AddItem( strName, !pFx->bBypass, false ); + } + + m_pLstView->ReloadData(); + } + } + else{ + m_imgType->Picture->Bitmap = NULL; + m_lblName->Caption = "δѡ"; + } + + m_btnMute->Down = pBase && pBase->IsMute(); + m_btnSolo->Down = pBase && pBase->IsSolo(); + + if( pBase ){ + for( int i=0; ivolume : ( i==1 ? (int)pBase->pan : (int)pBase->gain); + m_lstTrack[i]->OnChange = NULL; + m_lstTrack[i]->Position = pos; + m_lstTrack[i]->OnChange = TrackBarChange; + } + } + + m_iType = iType; + m_iTrack = iTrack; + + EnableComponets(); +} +//--------------------------------------------------------------------------- + +void TTrackPanel::EnableComponets() +{ + m_btnMute->Enabled = m_iType>=0; + m_btnSolo->Enabled = m_iType>=0; + + m_lstTrack[0]->Enabled = m_iType>=0; + m_lstTrack[1]->Enabled = m_iType==ST_AUDIO; + m_lstTrack[2]->Enabled = m_iType==ST_AUDIO; + + m_lblAudio->Visible = m_iType==ST_AUDIO; + m_pLstView->Visible = m_iType==ST_AUDIO; + m_pBtnAdd->Visible = m_iType==ST_AUDIO; + + for( int i=0; iVisible = m_iType==ST_MIDI; + + if( i==0 ){ + m_cbChannel->Visible = m_iType==ST_MIDI; + } + else{ + m_btnMidi[i-1]->Visible = m_iType==ST_MIDI; + } + } +} +//--------------------------------------------------------------------------- + +void TTrackPanel::OnTrackParamChange( int iParam, int nValue, bool bAddUndo ) +{ + TBaseTrack* pBase = m_iType==ST_AUDIO ? (TBaseTrack*)g_aAudioTracks[m_iTrack] + : (TBaseTrack*)g_aMidiTracks[m_iTrack]; + + if( !IsTrackMute( m_iType, m_iTrack ) ){ + if( m_iType==ST_MIDI ){ + TMidiTrack* pMT = (TMidiTrack*)pBase; + char val = iParam==0 ? nValue : iParam==1 ? ( nValue * 63 / 100 ) + : nValue * 127 / 100; + + f_MM_SetMidiTrackParam( pMT->file, pMT->chno, iParam, val ); + } + else{ + f_MM_SetAudioTrackParam( m_iTrack, iParam, (float)(nValue / 100.0) ); + } + } + + int iUndoType, nOriVal; + if( iParam==0 ){ + if( bAddUndo ){ + iUndoType = UNDO_TRACK_VOL; + nOriVal = pBase->volume; + } + + pBase->volume = nValue; + + if( m_iType==ST_MIDI ){ + int iShowTrack = m_pContentPanel->GetShowTrackId( m_iType, m_iTrack ); + m_pContentPanel->InvalidateShowBars( BAR_TRACK | iShowTrack ); + } + } + else if( iParam==1 ){ + if( bAddUndo ){ + iUndoType = UNDO_TRACK_PAN; + nOriVal = pBase->pan; + } + + pBase->pan = nValue; + } + else{ + if( bAddUndo ){ + iUndoType = UNDO_TRACK_GAIN; + nOriVal = pBase->gain; + } + + pBase->gain = nValue; + } + + if( bAddUndo ){ + int iCode = MAKELONG( m_iType, m_iTrack ); + bool bSetUndo = true; + TUndoLite* pLite = g_Undo.GetLastLite(); + if( pLite && pLite->iType==iUndoType && pLite->iCode==iCode ){ + bSetUndo = false; + + if( (int)(pLite->pBefore)==nValue ) + g_Undo.CancelUndo(); + else + pLite->pAfter = (void*)nValue; + } + + if( bSetUndo ) + g_Undo.AddUndo( iUndoType, iCode, 0, 0, (void*)nOriVal, (void*)nValue ); + } + else{ + m_lstTrack[iParam]->OnChange = NULL; + m_lstTrack[iParam]->Position = nValue; + m_lstTrack[iParam]->OnChange = TrackBarChange; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TTrackPanel::TrackBarChange(TObject *Sender) +{ + TSkinTrackBar* pSTB = (TSkinTrackBar*)Sender; + OnTrackParamChange( pSTB->Tag, pSTB->Position ); +} +//--------------------------------------------------------------------------- + +void __fastcall TTrackPanel::ComboBoxChange(TComboBoxItem *Sender, int Index) +{ + TMidiTrack* pMT = g_aMidiTracks[m_iTrack]; + BYTE chOld = pMT->chno, + chNew = Index, + fiOld = pMT->file, + fiNew = g_Midi.GetValidFile( pMT->bank, chNew ); + + g_Midi.ChangMidiChno( m_iTrack, fiNew, chNew ); + + g_Undo.AddUndo( UNDO_TRACK_CHNO, MAKELONG( ST_MIDI, m_iTrack ), 0, 0, + (void*)MAKELONG( fiOld, chOld ), (void*)MAKELONG( fiNew, chNew ) ); +} +//--------------------------------------------------------------------------- + +void __fastcall TTrackPanel::CapButtonClick(TObject *Sender) +{ + if( Sender==m_btnMidi[0] || Sender==m_btnMidi[1] ) + PostMessage( m_pContentPanel->Handle, UM_MIDISWITCH, 0, 0 ); + else if( Sender==m_btnMidi[2] ) + PostMessage( m_pContentPanel->Handle, UM_MIDISWITCH, 1, 0 ); +} +//--------------------------------------------------------------------------- + +void __fastcall TTrackPanel::SMMouseDown(System::TObject* Sender, System::Uitypes::TMouseButton Button, + System::Classes::TShiftState Shift, int X, int Y) +{ + TSMButton* pSM = (TSMButton*)Sender; + OnTrackStateChanged( pSM->Type ); +} +//--------------------------------------------------------------------------- + +void __fastcall TTrackPanel::WMSize(Winapi::Messages::TWMSize &Message) +{ + TToolpalPanel::WMSize( Message ); + + if( m_lblName ){ + m_lblName->Width = Width - 100; + m_btnMute->Left = Width - 56; + m_btnSolo->Left = Width - 36; + m_pBtnAdd->Left = Width - 56; + + int wComp = Width - 128 - LEFT_BOUND; + + for( int i=0; iWidth = wComp; + + for( int i=0; iWidth = wComp; + else + m_btnMidi[i-1]->Width = wComp; + } + + int nMaxCount = (Height - m_lblAudio->Top - 40) / CELL_HEIGHT; + m_pLstView->SetBounds( m_pLstView->Left, m_pLstView->Top, wComp, CELL_HEIGHT*nMaxCount+12 ); + m_pLstView->ReloadData(m_pLstView->GetCellBeg()); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TTrackPanel::RefreshTrackState( int iState, bool bUnset ) +{ + TBaseTrack* pBaseTrk = m_iType==ST_AUDIO ? (TBaseTrack*)g_aAudioTracks[m_iTrack] + : (TBaseTrack*)g_aMidiTracks[m_iTrack]; + + if( iState==0 ){ + m_lstTrack[0]->OnChange = NULL; + m_lstTrack[0]->Position = pBaseTrk->volume; + m_lstTrack[0]->OnChange = TrackBarChange; + } + else{ + TSMButton *pBtnSet = iState==TRACK_MUTE ? m_btnMute : m_btnSolo; + + pBtnSet->Down = iState==TRACK_MUTE ? pBaseTrk->IsMute() : pBaseTrk->IsSolo(); + + if( bUnset ){ + TSMButton * pBtnOth = iState==TRACK_MUTE ? m_btnSolo : m_btnMute; + pBtnOth->Down = false; + } + } +} +//--------------------------------------------------------------------------- + +void __fastcall TTrackPanel::OnTrackStateChanged( int iState, bool bAddUndo ) +{ + TBaseTrack* pBaseTrk = m_iType==ST_AUDIO ? (TBaseTrack*)g_aAudioTracks[m_iTrack] + : (TBaseTrack*)g_aMidiTracks[m_iTrack]; + int iOriState = pBaseTrk->state & (TRACK_MUTE|TRACK_SOLO); + bool bSet = false, bUnset = false; + + ChangeTrackState( m_iType, m_iTrack, iState, bSet, bUnset ); + RefreshTrackState( iState, bUnset ); + + m_pContentPanel->OnTrackStateChanged( m_iType, m_iTrack, iState, bUnset ); + + if( bAddUndo ){ + int iNewState = pBaseTrk->state & (TRACK_MUTE|TRACK_SOLO), + iCode = MAKELONG( m_iType, m_iTrack ); + bool bSetUndo = true; + TUndoLite* pLite = g_Undo.GetLastLite(); + if( pLite && pLite->iType==UNDO_TRACK_STATE && pLite->iCode==iCode ){ + bSetUndo = false; + + if( (int)(pLite->pBefore)==iNewState ) + g_Undo.CancelUndo(); + else + pLite->pAfter = (void*)iNewState; + } + + if( bSetUndo ) + g_Undo.AddUndo( UNDO_TRACK_STATE, iCode, 0, 0, (void*)iOriState, (void*)iNewState ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TTrackPanel::DoLstMouseEnter(TObject *Sender) +{ + m_pLstView->SetFocus(); +} +//--------------------------------------------------------------------------- + +bool __fastcall TTrackPanel::DoLstItemDBLClick(int index, bool bOn) +{ + DebugPrint("DoLstItemDBLClick index %d bOn %d\n", index, bOn); + + PostMessage( Handle, UM_AUDIOFX, 1, index ); +} +//--------------------------------------------------------------------------- + +bool __fastcall TTrackPanel::DoLstItemRightClick(int index, bool bOn, TPoint pt) +{ + DebugPrint("DoLstItemRightClick index %d bOn %d x %d y %d\n", index, bOn, pt.X, pt.Y); + + m_PopMenu->ClearItems(); + + m_PopMenu->CreateMenu( bOn ? "رЧ" : "Ч", "", DoAudioFxState ); + m_PopMenu->CreateMenu( "Ч", "", DoAudioFxParam ); + m_PopMenu->CreateMenu( "ɾЧ", "", DoAudioFxDelete ); +// m_PopMenu->AddMenuItem( bOn ? "رЧ" : "Ч", "", DoAudioFxState ); +// m_PopMenu->AddMenuItem( "Ч", "", DoAudioFxParam ); +// m_PopMenu->AddMenuItem( "ɾЧ", "", DoAudioFxDelete ); + + pt = m_pLstView->ClientToParent( pt ); + + m_PopMenu->Parent = this; + m_PopMenu->Show( pt.X, pt.Y ); +} +//--------------------------------------------------------------------------- + +bool __fastcall TTrackPanel::DoLstItemStateChange(int index, bool bOn) +{ + DebugPrint("DoLstItemStateChange index %d bOn %d\n", index, bOn); + + OnAudioFxState( index, bOn ); +} +//--------------------------------------------------------------------------- + +bool __fastcall TTrackPanel::DoLstItemDelete(int indSrc, int indDes) +{ + DebugPrint("DoLstItemDelete indSrc %d indDes %d\n", indSrc, indDes); + + if( mrYes==MessageForm->ShowMessage( L"ȷɾЧ", MB_ICONQUESTION|MB_YESNO ) ){ + OnAudioFxDelete( indSrc ); + return true; + } + + return false; +} +//--------------------------------------------------------------------------- +bool __fastcall TTrackPanel::DoLstItemMovEnd(int indSrc, int indDes) +{ + DebugPrint("DoLstItemMovEnd indSrc %d indDes %d\n", indSrc, indDes); + + if( indDes>indSrc ) + indDes--; + + if( indDes==indSrc ) + return false; + + f_MM_AudioMoveFx( m_iTrack, indSrc, indDes ); + + g_Undo.AddUndo( UNDO_FX_MOVE, MAKELONG( m_iType, m_iTrack ), indSrc, indDes, + NULL, NULL ); + + TAudioFxList& lstFx = g_aAudioTracks[m_iTrack]->lstFxs; + TAudioFx* pFx = lstFx[indSrc]; + lstFx.erase( lstFx.begin() + indSrc ); + + if( indDes>=lstFx.size() ) + lstFx.push_back( pFx ); + else + lstFx.insert( lstFx.begin()+indDes, pFx ); + + return true; +} +//--------------------------------------------------------------------------- + +void __fastcall TTrackPanel::DoLstAddItem(TObject *Sender) +{ + m_PopMenu->ClearItems(); + + CMenuItem *pMenuFx = m_PopMenu->CreateMenu( "FxЧ" ), + *pMenuVst = m_PopMenu->CreateMenu( "VSTЧ" ); + pMenuVst->Enabled = !g_lstVSTFx.empty(); + + for( int i=0; iAppendMenu( g_strEffect[i], "", DoAudioAddFx, i ); +// m_PopMenu->AddMenuItem( g_strEffect[i], "", DoAudioAddFx, iMenuFx ); + } + + if( !g_lstVSTFx.empty() ){ + for( int i=0; istrFileName, '\\' )+1, + *ext = strrchr( pVST->strFileName, '.' ); + + if( ext>name ){ + strncpy( fname, name, ext-name ); + fname[ext-name] = '\0'; + } + else + strcpy(fname, name ); + + if( !pVST->aPlugins.empty() ) + strcat( fname, " ..." ); + + pMenuVst->AppendMenu( fname, "", DoAudioAddVst, i ); + //m_PopMenu->AddMenuItem( fname, "", DoAudioAddVst, iMenuVst ); + } + } + + m_PopMenu->Parent = this; + m_PopMenu->Show( m_pBtnAdd->Left, m_pBtnAdd->Top+m_pBtnAdd->Height ); +} +//--------------------------------------------------------------------------- + +void __fastcall TTrackPanel::DoAudioFxState(System::TObject* Sender) +{ + int ind = m_pLstView->IndSel; + TAudioFx* pFx = g_aAudioTracks[m_iTrack]->lstFxs[ind]; + bool bOn = pFx->bBypass; + m_pLstView->SetItemState( ind, bOn ); + + OnAudioFxState( ind, bOn ); +} +//--------------------------------------------------------------------------- + +void __fastcall TTrackPanel::DoAudioFxParam(System::TObject* Sender) +{ + int ind = m_pLstView->IndSel; + + OnAudioFxParam( ind ); +} +//--------------------------------------------------------------------------- + +void __fastcall TTrackPanel::DoAudioFxDelete(System::TObject* Sender) +{ + int ind = m_pLstView->IndSel; + + int mrRet = MessageForm->ShowMessage( L"ȷɾЧ", MB_ICONQUESTION|MB_YESNO ); + + if( mrRet==mrYes ) + OnAudioFxDelete( ind ); +} +//--------------------------------------------------------------------------- + +void __fastcall TTrackPanel::DoAudioAddFx(System::TObject* Sender) +{ + int ind = (int)Sender; + PostMessage( Handle, UM_AUDIOFX, 0, ind ); +} +//--------------------------------------------------------------------------- + +void __fastcall TTrackPanel::DoAudioAddVst(System::TObject* Sender) +{ + int ind = (int)Sender; + PostMessage( Handle, UM_AUDIOFX, 0, FX_VST+ind ); +} +//--------------------------------------------------------------------------- + +void __fastcall TTrackPanel::UMAudioFx(TMessage &msg) +{ + Parent->Perform( UM_STOP, STOP_ALL, 0 ); + + if( msg.WParam==0 ){ + int iFxType = msg.LParam; + OnAddAudioFx( iFxType ); + } + else if( msg.WParam==1 ){ + int ind = msg.LParam; + OnAudioFxParam( ind ); + } +} +//--------------------------------------------------------------------------- + +void TTrackPanel::GetAudioDemoRange( double& dblStart, double& dblEnd ) +{ + TAudioTrack* pAT = g_aAudioTracks[m_iTrack]; + TWaveBarList& list = pAT->lstBars; + int iBarStart = -1, iPointStart = 0, + iBarEnd = -1, iPointEnd = 0; + + //Ҳ + int nBarNum = g_Opus.BarCount(); + for( int i=0; iaVols[j]; + WORD wVol = max( LOWORD(dwValue), HIWORD(dwValue) ); + + if( wVol>0 ){ + iBarStart = i; + iPointStart = j; + + break; + } + } + } + + //Ҳյ + if( iBarStart>=0 ){ + for( int i=nBarNum-1; i>=0 && iBarEnd<0; i-- ){ + for( int j=POINTS_PER_BAR-1; j>=0; j-- ){ + DWORD dwValue = list[i]->aVols[j]; + WORD wVol = max( LOWORD(dwValue), HIWORD(dwValue) ); + + if( wVol>0 ){ + iBarEnd = i; + iPointEnd = j; + + break; + } + } + } + } + + if( iBarStart>=0 ){ + dblStart = iBarStart + (double)iPointStart/POINTS_PER_BAR; + dblEnd = iBarEnd + (double)iPointEnd/POINTS_PER_BAR; + } + else{ + dblStart = 0; + dblEnd = nBarNum; + } +} +//--------------------------------------------------------------------------- + +void TTrackPanel::OnAddAudioFx( int iFxType ) +{ + int iPlugin = -1; + UINT pluginID = 0; + char* strVSTFile = NULL; + + if( iFxType>=FX_VST ){ + VSTINFO* pVST = g_lstVSTFx[iFxType-FX_VST]; + strVSTFile = pVST->strFileName; + + if( !pVST->aPlugins.empty() ){ + TVSTPluginForm* pPlugForm = new TVSTPluginForm( NULL, pVST ); + if( pPlugForm->ShowModal()==mrOk ){ + iPlugin = pPlugForm->m_iSel; + pluginID = pVST->aPlugins[iPlugin]->id; + } + + delete pPlugForm; + + if( iPlugin<0 ) + return; + } + } + + HRESULT hr = f_MM_AudioAddFx( m_iTrack, iFxType, strVSTFile, pluginID, false ); + + if( hr!=S_OK ){ + return; + } + + GenerateCompose(); + + TAudioTrack* pAT = g_aAudioTracks[m_iTrack]; + int ind = pAT->lstFxs.size(); + double dblStart, dblEnd; + + GetAudioDemoRange( dblStart, dblEnd ); + + TAudioFxForm * pForm = new TAudioFxForm(NULL, m_iTrack, dblStart, dblEnd, ind, iFxType, iPlugin ); + + if( pForm->ShowModal()==mrOk ){ + int nParamSize = 0, + iPreset = -1; + void* pParam = NULL; + + if( iFxTypeGetPreset(); + nParamSize = pForm->GetParamCount(); + + if( nParamSize>0 ){ + pParam = new float[nParamSize]; + memcpy( pParam, pForm->GetParams(), sizeof(float)*nParamSize ); + } + } + else{ + iPreset = iPlugin; + + nParamSize = f_MM_AudioGetFxParam( m_iTrack, ind, NULL, 0 ); + if( nParamSize>0 ){ + pParam = new float[nParamSize]; + f_MM_AudioGetFxParam( m_iTrack, ind, pParam, nParamSize ); + } + } + + TAudioFx* pFx = new TAudioFx( iFxType, iPreset, pParam, nParamSize ); + pFx->bBypass = pForm->IsBypass(); + pAT->lstFxs.push_back( pFx ); + + char strName[256]; + + if( pFx->iFxiFx==FX_PITCH ? MAX_FX_NUM-1 : pFx->iFx; + strcpy( strName, g_strEffect[no] ); + } + else{ + VSTINFO* pVST = g_lstVSTFx[pFx->iFx - FX_VST]; + + + if( pFx->iPreset<0 ){ + char *name = strrchr( pVST->strFileName, '\\' )+1, + *ext = strrchr( pVST->strFileName, '.' ); + + if( ext>name ){ + strncpy( strName, name, ext-name ); + strName[ext-name] = '\0'; + } + else + strcpy(strName, name ); + } + else{ + strcpy( strName, pVST->aPlugins[pFx->iPreset]->name ); + } + } + + m_pLstView->AddItem( strName, !pFx->bBypass ); + + TAudioFx* pAfter = new TAudioFx( pFx ); + g_Undo.AddUndo( UNDO_FX_ADD, MAKELONG( m_iType, m_iTrack ), -1, pAT->lstFxs.size()-1, + NULL, (void*)pAfter ); + } + else{ + f_MM_AudioMoveFx( m_iTrack, ind, -1 ); + } + + delete pForm; +} +//--------------------------------------------------------------------------- + +void TTrackPanel::OnAudioFxParam( int ind ) +{ + Parent->Perform( UM_STOP, STOP_ALL, 0 ); + GenerateCompose(); + + TAudioTrack* pAT = g_aAudioTracks[m_iTrack]; + TAudioFx* pFx = pAT->lstFxs[ind]; + int iPlugin = pFx->iFx < FX_VST ? -1 : pFx->iPreset; + double dblStart, dblEnd; + + GetAudioDemoRange( dblStart, dblEnd ); + + TAudioFxForm * pForm = new TAudioFxForm(NULL, m_iTrack, dblStart, dblEnd, ind, pFx->iFx, iPlugin ); + int ret = pForm->ShowModal(); + + int nParamSize = pFx->nParamSize, + iPresetB = 0, + iPresetA = 0, + bBypassB = pFx->bBypass, + bBypassA = pForm->IsBypass(); + float *pParamB = NULL, + *pParamA = nParamSize>0 ? new float[nParamSize] : NULL; + + if( pFx->iFx < FX_VST ){ + iPresetB = pFx->iPreset; + iPresetA = pForm->GetPreset(); + memcpy( pParamA, pForm->GetParams(), sizeof(float)*nParamSize ); + } + else if( nParamSize>0 ){ + f_MM_AudioGetFxParam( m_iTrack, ind, pParamA, nParamSize ); + } + + if( nParamSize>0 ){ + if( memcmp( pParamA, pFx->pParam, sizeof(float)*nParamSize )){ + pParamB = new float[nParamSize]; + + memcpy( pParamB, pFx->pParam, sizeof(float)*nParamSize ); + } + else{ + delete pParamA; + pParamA = NULL; + } + } + + if( pParamA || iPresetB!=iPresetA || bBypassB!=bBypassA ){ + if( ret==mrOk ){ + if( iPresetB!=iPresetA ) + pFx->iPreset = iPresetA; + + if( bBypassB!=bBypassA ){ + pFx->bBypass = bBypassA; + m_pLstView->SetItemState( ind, !bBypassA ); + } + + if( pParamA ) + memcpy( pFx->pParam, pParamA, sizeof(float)*nParamSize ); + + AddAudioFxParamUndo( ind, MAKELONG( iPresetB, bBypassB ), + MAKELONG( iPresetA, bBypassA ), + (void*)pParamB, (void*)pParamA ); + } + else{ + if( pParamB && ( !bBypassB || pFx->iFx>=FX_VST ) ){ + f_MM_AudioSetFxParam( m_iTrack, ind, pParamB, pFx->nParamSize ); + } + + if( bBypassB ){ + f_MM_AudioSetFxParam( m_iTrack, ind, (void*)NULL, 0 ); + } + + delete pParamA; + } + } + + delete pForm; +} +//--------------------------------------------------------------------------- + +void TTrackPanel::OnAudioFxState( int ind, bool bOn ) +{ + TAudioTrack* pAT = g_aAudioTracks[m_iTrack]; + TAudioFx* pFx = pAT->lstFxs[ind]; + int iPreset = pFx->iFx < FX_VST ? pFx->iPreset : 0, + bBypassB = pFx->bBypass, + bBypassA = !bOn; + + pFx->bBypass = bBypassA; + + if( pFx->pParam && !bBypassA ){ + f_MM_AudioSetFxParam( m_iTrack, ind, pFx->pParam, pFx->nParamSize ); + } + + if( bBypassA ){ + f_MM_AudioSetFxParam( m_iTrack, ind, (void*)NULL, 0 ); + } + + AddAudioFxParamUndo( ind, MAKELONG( iPreset, bBypassB ), + MAKELONG( iPreset, bBypassA ), + NULL, NULL ); +} +//--------------------------------------------------------------------------- + +void TTrackPanel::AddAudioFxParamUndo( int ind, DWORD iBegin, DWORD iEnd, + void* pBefore, void* pAfter ) +{ + bool bSetUndo = true; + TUndoLite* pLite = g_Undo.GetLastLite(); + int iCode = MAKELONG( m_iType, m_iTrack ); + if( pLite && pLite->iType==UNDO_FX_PARAM && pLite->iCode==iCode + && pLite->iExt1==ind && !pBefore && !pAfter + && !pLite->pBefore && !pLite->pAfter ){ + WORD iPresetB = LOWORD( iBegin ), + bBypassB = HIWORD( iBegin ), + bBypassA = HIWORD( iEnd ), + iPresetBPrev = LOWORD( pLite->iBegin ), + bBypassBPrev = HIWORD( pLite->iBegin ), + bBypassAPrev = HIWORD( pLite->iEnd ); + + if( iPresetBPrev==iPresetB ){ + bSetUndo = false; + + if( bBypassBPrev==bBypassA ) + g_Undo.CancelUndo(); + else + pLite->iEnd = iEnd; + } + } + + if( bSetUndo ){ + g_Undo.AddUndo( UNDO_FX_PARAM, iCode, iBegin, iEnd, pBefore, pAfter ); + g_Undo.SetUndoExtra( ind, 0, 0, NULL, NULL ); + } +} +//--------------------------------------------------------------------------- + +void TTrackPanel::OnAudioFxDelete( int ind ) +{ + f_MM_AudioMoveFx( m_iTrack, ind, -1 ); + + TAudioFxList& lstFx = g_aAudioTracks[m_iTrack]->lstFxs; + TAudioFx* pBefore = lstFx[ind]; + lstFx.erase( lstFx.begin() + ind ); + + g_Undo.AddUndo( UNDO_FX_DEL, MAKELONG( m_iType, m_iTrack ), ind, -1, + (void*)pBefore, NULL ); +} +//--------------------------------------------------------------------------- + +void TTrackPanel::Undo( bool bUndo ) +{ + TUndoLite* pLite = bUndo ? g_Undo.Undo() : g_Undo.Redo(); + int iUndoType = pLite->iType, + iType = LOWORD( pLite->iCode ), + iTrack = HIWORD( pLite->iCode ); + + if( iType==ST_MIDI && m_pContentPanel->IsVertical() ) + m_pContentPanel->SetScrollMode( false ); + + if( m_iType!=iType || m_iTrack!=iTrack ){ + int iShowTrack = m_pContentPanel->GetShowTrackId( iType, iTrack ) - 1; + m_pContentPanel->SelectTrack( iShowTrack, -1, -1 ); + } + + if( iUndoType==UNDO_TRACK_CHNO ){ + DWORD dwNew = (DWORD)( bUndo ? pLite->pBefore : pLite->pAfter ); + BYTE chNew = HIWORD( dwNew ), + fiNew = LOWORD( dwNew ); + + g_Midi.ChangMidiChno( iTrack, fiNew, chNew ); + + if( m_cbChannel->DefItemIndex!=chNew ){ + m_cbChannel->OnChange = NULL; + m_cbChannel->DefItemIndex = chNew; + m_cbChannel->OnChange = ComboBoxChange; + } + } + else if( iUndoType>=UNDO_TRACK_STATE && iUndoType<=UNDO_TRACK_GAIN ){ + int iNewVal = (int)(bUndo ? pLite->pBefore : pLite->pAfter); + + if( iUndoType==UNDO_TRACK_STATE ){ + int iOriVal = (int)( bUndo ? pLite->pAfter : pLite->pBefore); + OnTrackStateChanged( iNewVal==0 ? iOriVal : iNewVal, false ); + } + else{ + OnTrackParamChange( iUndoType-UNDO_TRACK_VOL, iNewVal, false ); + } + } + else if( iUndoType==UNDO_FX_ADD || iUndoType==UNDO_FX_DEL ){ + TAudioFx* pFx = bUndo ? (TAudioFx*)pLite->pBefore : (TAudioFx*)pLite->pAfter; + int ind = iUndoType==UNDO_FX_DEL ? pLite->iBegin : pLite->iEnd; + + if( pFx ){ + TAudioTrack* pAT = g_aAudioTracks[iTrack]; + UINT pluginID = 0; + char* strVSTFile = NULL; + + if( pFx->iFx>=FX_VST ){ + VSTINFO* pVST = g_lstVSTFx[pFx->iFx-FX_VST]; + strVSTFile = pVST->strFileName; + + if( pFx->iPreset>=0 && pFx->iPreset < pVST->aPlugins.size() ){ + pluginID = pVST->aPlugins[pFx->iPreset]->id; + } + } + + HRESULT hr = f_MM_AudioAddFx( iTrack, pFx->iFx, strVSTFile, pluginID, false ); + if( hr==S_OK ){ + char strName[256]; + + if( pFx->iFxiFx==FX_PITCH ? MAX_FX_NUM-1 : pFx->iFx; + strcpy( strName, g_strEffect[no] ); + } + else{ + VSTINFO* pVST = g_lstVSTFx[pFx->iFx - FX_VST]; + + if( pFx->iPreset<0 ){ + char *name = strrchr( pVST->strFileName, '\\' )+1, + *ext = strrchr( pVST->strFileName, '.' ); + + if( ext>name ){ + strncpy( strName, name, ext-name ); + strName[ext-name] = '\0'; + } + else + strcpy(strName, name ); + } + else{ + strcpy( strName, pVST->aPlugins[pFx->iPreset]->name ); + } + } + + TAudioFx* pNewFx = new TAudioFx( pFx ); + + if( indlstFxs.size() ){ + f_MM_AudioMoveFx( iTrack, pAT->lstFxs.size(), ind ); + + if( ind>=pAT->lstFxs.size() ) + pAT->lstFxs.push_back( pNewFx ); + else + pAT->lstFxs.insert( pAT->lstFxs.begin()+ind, pNewFx ); + + m_pLstView->AddItem( strName, !pFx->bBypass, true, ind ); + } + else{ + pAT->lstFxs.push_back( pNewFx ); + m_pLstView->AddItem( strName, !pFx->bBypass ); + } + + if( !pFx->bBypass || pFx->iFx>=FX_VST ) + f_MM_AudioSetFxParam( iTrack, ind, pFx->pParam, pFx->nParamSize ); + + if( pFx->bBypass ) + f_MM_AudioSetFxParam( iTrack, ind, NULL, 0 ); + } + } + else if( ind>=0 ){ + f_MM_AudioMoveFx( iTrack, ind, -1 ); + + TAudioFxList& lstFx = g_aAudioTracks[iTrack]->lstFxs; + lstFx.erase( lstFx.begin() + ind ); + m_pLstView->DeleteItem( ind ); + } + } + else if( iUndoType==UNDO_FX_MOVE ){ + int indFrom = bUndo ? pLite->iEnd : pLite->iBegin, + indTo = bUndo ? pLite->iBegin : pLite->iEnd; + + f_MM_AudioMoveFx( iTrack, indFrom, indTo ); + m_pLstView->MoveItems( indFrom, indTo ); + + TAudioFxList& lstFx = g_aAudioTracks[iTrack]->lstFxs; + TAudioFx* pFx = lstFx[indFrom]; + lstFx.erase( lstFx.begin() + indFrom ); + if( indTo>=lstFx.size() ) + lstFx.push_back( pFx ); + else + lstFx.insert( lstFx.begin() + indTo, pFx ); + } + else if( iUndoType==UNDO_FX_PARAM ){ + int ind = pLite->iExt1, + iState = bUndo ? pLite->iBegin : pLite->iEnd, + iPreset = LOWORD(iState); + WORD bBypass = HIWORD(iState); + float *pParam = (float*)(bUndo ? pLite->pBefore : pLite->pAfter); + TAudioFx* pFx = g_aAudioTracks[iTrack]->lstFxs[ind]; + + if( pFx->iFx < FX_VST ) + pFx->iPreset = iPreset; + + if( pParam ){ + memcpy( pFx->pParam, pParam, sizeof(float)*pFx->nParamSize ); + } + + if( bBypass!=pFx->bBypass ){ + pFx->bBypass = bBypass; + + if( pFx->iFx>=FX_VST ){ + if( !bBypass && pParam ) + f_MM_AudioSetFxParam( m_iTrack, ind, pParam, pFx->nParamSize ); + + f_MM_AudioSetFxParam( iTrack, ind, (void*)!bBypass, 0 ); + } + else + f_MM_AudioSetFxParam( iTrack, ind, (void*)(bBypass ? NULL : pFx->pParam), 0 ); + + m_pLstView->SetItemState( ind, !bBypass ); + } + else if( !bBypass && pParam ){ + f_MM_AudioSetFxParam( m_iTrack, ind, pParam, pFx->nParamSize ); + } + + m_pLstView->IndSel = ind; + + if( pParam ) + OnAudioFxParam( ind ); + } +} +//--------------------------------------------------------------------------- diff --git a/TrackPanel.h b/TrackPanel.h new file mode 100644 index 0000000..c1819d4 --- /dev/null +++ b/TrackPanel.h @@ -0,0 +1,128 @@ +//--------------------------------------------------------------------------- + +#ifndef TrackPanelH +#define TrackPanelH + +#include "ContentPanelUnit.h" +#include "ToolpalPanel.h" +#include "TextButton.h" +#include "SkinTrackBar.h" +#include "ComboBoxComponent.h" +#include "CapButton.h" +#include "ListViewMove.h" +#include "MessageFormUnit.h" + +//--------------------------------------------------------------------------- +class TSMButton : public Vcl::Controls::TGraphicControl +{ +private: + int FType; + bool FHover, + FDown; + + void __fastcall SetDown( bool bDown ); + +protected: + virtual void __fastcall Paint(void); + + MESSAGE void __fastcall CMMouseEnter(Winapi::Messages::TMessage &Message); + MESSAGE void __fastcall CMMouseLeave(Winapi::Messages::TMessage &Message); + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(CM_MOUSEENTER, TMessage, CMMouseEnter) + MESSAGE_HANDLER(CM_MOUSELEAVE, TMessage, CMMouseLeave) + END_MESSAGE_MAP(Vcl::Controls::TGraphicControl) +public: + __fastcall virtual TSMButton(System::Classes::TComponent* AOwner); + +__published: + __property bool Down = {read=FDown, write=SetDown, default=false}; + __property int Type = {read=FType, write=FType, default=0}; + __property OnMouseDown; +}; + +#define CTRL_VOL 3 +#define CTRL_MIDI 4 + +class TTrackPanel : public TToolpalPanel +{ +private: + int m_iType, m_iTrack; + + TContentPanel* m_pContentPanel; // + + TLabel *m_lblName, + *m_lstCaption[CTRL_VOL], + *m_lblMidi[CTRL_MIDI], + *m_lblAudio; + TSkinTrackBar* m_lstTrack[CTRL_VOL]; + TBitmap *m_iconMidi, + *m_iconWave; + TImage *m_imgType; + TSMButton *m_btnMute, + *m_btnSolo; + TComboBoxComponent *m_cbChannel; + TCapButton* m_btnMidi[CTRL_MIDI-1]; + + void EnableComponets(); + void GetAudioDemoRange( double& dblStart, double& dblEnd ); + void AddAudioFxParamUndo( int ind, DWORD iBegin, DWORD iEnd, void* pBefore, void* pAfter ); + void OnTrackParamChange( int iParam, int nValue, bool bAddUndo=true ); + void OnAddAudioFx( int iFxType ); + void OnAudioFxParam( int ind ); + void OnAudioFxState( int ind, bool bOn ); + void OnAudioFxDelete( int ind ); + + void __fastcall DoAudioAddFx(System::TObject* Sender); + void __fastcall DoAudioAddVst(System::TObject* Sender); + void __fastcall DoAudioFxState(System::TObject* Sender); + void __fastcall DoAudioFxParam(System::TObject* Sender); + void __fastcall DoAudioFxDelete(System::TObject* Sender); + void __fastcall TrackBarChange(TObject *Sender); + void __fastcall ComboBoxChange(TComboBoxItem *Sender, int Index); + void __fastcall CapButtonClick(TObject *Sender); + void __fastcall SMMouseDown(System::TObject* Sender, System::Uitypes::TMouseButton Button, + System::Classes::TShiftState Shift, int X, int Y); + + //add by tj + TPngImage *m_pImgDel; + TPngImage *m_pImgOff; + TPngImage *m_pImgOn; + TListViewMove *m_pLstView; + + bool __fastcall DoLstItemDBLClick(int index, bool bOn); + bool __fastcall DoLstItemRightClick(int index, bool bOn, TPoint pt); + bool __fastcall DoLstItemStateChange(int index, bool bOn); + bool __fastcall DoLstItemDelete(int indSrc, int indDes); + bool __fastcall DoLstItemMovEnd(int indSrc, int indDes); + + void __fastcall DoLstMouseEnter(TObject *Sender); + + TPngImage *m_pngAdd; + TPNGButton *m_pBtnAdd; + void __fastcall DoLstAddItem(TObject *Sender); + +protected: + virtual void __fastcall CreateWnd(); + virtual MESSAGE void __fastcall WMSize(Winapi::Messages::TWMSize &Message); + + MESSAGE void __fastcall UMAudioFx(TMessage &msg); + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(UM_AUDIOFX, TMessage, UMAudioFx) + END_MESSAGE_MAP(TToolpalPanel) +public: + __fastcall virtual TTrackPanel(System::Classes::TComponent* AOwner); + __fastcall ~TTrackPanel(); + + void __fastcall SetContentPanel( TContentPanel* pPanel ){ m_pContentPanel=pPanel; }; + void __fastcall SetSelTrack( int iType, int iTrack ); + void __fastcall OnTrackStateChanged( int iState, bool bAddUndo=true ); + void __fastcall OnAddFx(); + void __fastcall RefreshTrackState( int iState, bool bUnset ); + + void Undo( bool bUndo ); +}; + +//--------------------------------------------------------------------------- + +#endif diff --git a/TransSkinScrollBar.cpp b/TransSkinScrollBar.cpp new file mode 100644 index 0000000..038cbc0 --- /dev/null +++ b/TransSkinScrollBar.cpp @@ -0,0 +1,768 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop + +#include "TransSkinScrollBar.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +//--------------------------------------------------------------------------- +#include "BtnPanelUnit.h" +#include +#include +#include + +#define PERIOD (200) + +#define THUMB_MIN (14) +#define THUMB_LEFT (1) + +#define THUMB_GKG (Height-2*Width) +#define THUMB_BKGLEFT (THUMB_GKG-THUMB_MIN) +#define THUMB_WIDTH (Width-2*THUMB_LEFT) + +#define H_THUMB_GKG (Width-2*Height) +#define H_THUMB_BKGLEFT (H_THUMB_GKG-THUMB_MIN) +#define H_THUMB_HEIGHT (Height-2*THUMB_LEFT) +//--------------------------------------------------------------------------- +// ValidCtrCheck is used to assure that the components created do not have +// any pure virtual functions. +/*/ +static inline void ValidCtrCheck(TTransSkinScollBar *) +{ + new TTransSkinScollBar(NULL); +} +//--------------------------------------------------------------------------- +//__fastcall TTransSkinScollBar::TTransSkinScollBar(TComponent* Owner) +// : TPaintBox(Owner) +//{ +//} +////--------------------------------------------------------------------------- +namespace Transskinscrollbar +{ + void __fastcall PACKAGE Register() + { + TComponentClass classes[1] = {__classid(TTransSkinScollBar)}; + RegisterComponents(L"Samples", classes, 0); + } +} +*///--------------------------------------------------------------------------- +__fastcall TTransSkinScollBar::TTransSkinScollBar(TComponent* Owner) + : Vcl::Extctrls::TPanel(Owner) +{ + ControlStyle >> csOpaque; + DoubleBuffered = true; + + Width = 14; + Height = 80; + + + FVertial = true; + + FSBShow = 0; + FSBTotal = 0; + FSBTop = 0; + + m_BtnBKG = new TBtnPanel(this); + m_BtnBKG->OnPanelDrEvent = BtnPaintBKG; + m_BtnBKG->OnPanelMsEvent = BtnEventBKG; + m_BtnBKG->StateCount = 1; + m_BtnBKG->Transparent = true; + m_BtnBKG->TransparentValue = 150; + + m_BtnThumb = new TBtnPanel(this); + m_BtnThumb->OnPanelDrEvent = BtnPaintThumb; + m_BtnThumb->OnPanelMsEvent = BtnEventThumb; + m_BtnThumb->StateCount = 1; + m_BtnThumb->Transparent = true; + + m_BtnBKG->AddSubPanel(m_BtnThumb); + + m_BtnLINEUp = new TBtnPanel(this); + m_BtnLINEUp->OnPanelDrEvent = BtnPaintLINEUp; + m_BtnLINEUp->OnPanelMsEvent = BtnEventLINEUp; + m_BtnLINEUp->StateEnter = false; + + m_BtnLINEDown = new TBtnPanel(this); + m_BtnLINEDown->OnPanelDrEvent = BtnPaintLINEDown; + m_BtnLINEDown->OnPanelMsEvent = BtnEventLINEDown; + m_BtnLINEDown->StateEnter = false; + + m_bLineUp = true; + m_bPageUp = true; + + m_pTTimerLine = new TTimer(this); + m_pTTimerLine->Interval = PERIOD; + m_pTTimerLine->OnTimer = EventTimerThumb; + m_pTTimerLine->Enabled = false; + + m_pTTimerPage = new TTimer(this); + m_pTTimerPage->Interval = PERIOD; + m_pTTimerPage->OnTimer = EventTimerThumb; + m_pTTimerPage->Enabled = false; + + FThumbWidth = -1; + m_bPices = false; +} +//--------------------------------------------------------------------------- + +__fastcall TTransSkinScollBar::~TTransSkinScollBar(void) +{ + SAFE_DELETE(m_BtnBKG) + SAFE_DELETE(m_BtnThumb) + SAFE_DELETE(m_BtnLINEUp) + SAFE_DELETE(m_BtnLINEDown) + SAFE_DELETE(m_pTTimerLine) + SAFE_DELETE(m_pTTimerPage) +} +//--------------------------------------------------------------------------- +void __fastcall TTransSkinScollBar::SetSBTop(int nTop) +{ + if(nTop<0) + nTop = 0; + else if(nTop>FSBTotal-FSBShow+1) + nTop = nTop>FSBTotal-FSBShow+1; + FSBTop = nTop; + + TWMSize tmp; + WMSize(tmp); +} +//--------------------------------------------------------------------------- +int __fastcall TTransSkinScollBar::CalThumbHeight() +{ + if(FSBTotal==0) return 0; + + int nHeight = 0; + + if( -1==FThumbWidth ) { + + int nPosS = THUMB_BKGLEFT; + int nPosV = FSBTotal-FSBShow+1; + + if( nPosS>=nPosV ) { + + int nLenPiece = nPosS/nPosV; + if( 0!=nPosS%nPosV ) { + nLenPiece += nPosS%nLenPiece; + } + + nHeight = nLenPiece; + + if( THUMB_GKG/nPosV>=nHeight ) { + int nLenPiece = THUMB_GKG/nPosV; + if( 0!=THUMB_GKG%nPosV ) { + nLenPiece += THUMB_GKG%nLenPiece; + } + nHeight = nLenPiece; + m_bPices = true; + } + } + + if( nHeightHeight> + m_BtnBKG->Top+m_BtnBKG->Height ) + { + nTop = m_BtnBKG->Top+m_BtnBKG->Height - CalThumbHeight(); + } + + return nTop; +} +//--------------------------------------------------------------------------- +int __fastcall TTransSkinScollBar::CalThumbWidth() +{ + if(FSBTotal==0) return 0; + + int nWidth = 0; + + if( -1==FThumbWidth ) { + + int nPosS = H_THUMB_BKGLEFT; + int nPosV = FSBTotal-FSBShow+1; + + if( nPosS>=nPosV ) { + + int nLenPiece = nPosS/nPosV; + if( 0!=nPosS%nPosV ) { + nLenPiece += nPosS%nLenPiece; + } + + nWidth = nLenPiece; + + if( H_THUMB_GKG/nPosV>=nWidth ) { + int nLenPiece = H_THUMB_GKG/nPosV; + if( 0!=H_THUMB_GKG%nPosV ) { + nLenPiece += H_THUMB_GKG%nLenPiece; + } + nWidth = nLenPiece; + m_bPices = true; + } + } + if( nWidthWidth> + m_BtnBKG->Left+m_BtnBKG->Width ) + { + nLeft = m_BtnBKG->Left+m_BtnBKG->Width - CalThumbWidth(); + } + + return nLeft; +} +//--------------------------------------------------------------------------- +void __fastcall TTransSkinScollBar::SetVertial(bool bFVertial) +{ + FVertial = bFVertial; + + int WidthTmp = Width; + int HeightTmp = Height; + + if( FVertial ) { + Width = (WidthTmpHeightTmp)?WidthTmp:HeightTmp; + Height = (WidthTmp>HeightTmp)?HeightTmp:WidthTmp; + } +} +//--------------------------------------------------------------------------- +void __fastcall TTransSkinScollBar::CreateWnd(void) +{ + Vcl::Extctrls::TPanel::CreateWnd(); + + SetWindowLong( Parent->Handle, GWL_STYLE, + GetWindowLong(Parent->Handle, GWL_STYLE) & ~WS_CLIPCHILDREN ); + +// SetBkMode( Canvas->Handle, TRANSPARENT); +} +//--------------------------------------------------------------------------- +void __fastcall TTransSkinScollBar::CreateParams(Controls::TCreateParams &Params) +{ + Vcl::Extctrls::TPanel::CreateParams(Params); + + Params.ExStyle |= WS_EX_TRANSPARENT; +} +//--------------------------------------------------------------------------- +void __fastcall TTransSkinScollBar::WMSize(Winapi::Messages::TWMSize &Message) +{ + int WidthTmp = Width; + int HeightTmp = Height; + if( FVertial ) { + Width = (WidthTmpHeightTmp)?WidthTmp:HeightTmp; + Height = (WidthTmp>HeightTmp)?HeightTmp:WidthTmp; + } + + int nLeft, nTop, nWidth, nHeight; + if( FVertial ) { + + m_BtnBKG->Left = 0; + m_BtnBKG->Top = Width; + m_BtnBKG->Width = Width; + m_BtnBKG->Height = Height-2*Width; + + if(FSBTotal<=FSBShow) { + nLeft = 0; + nTop = 0; + nWidth = 0; + nHeight = 0; + }else{ + nLeft = THUMB_LEFT; + nTop = CalThumbTop(); + nWidth = THUMB_WIDTH; + nHeight = CalThumbHeight(); + } + m_BtnThumb->Left = nLeft; + m_BtnThumb->Top = nTop; + m_BtnThumb->Width = nWidth; + m_BtnThumb->Height = nHeight; + + + m_BtnLINEUp->Left = 0; + m_BtnLINEUp->Top = 0; + m_BtnLINEUp->Width = Width; + m_BtnLINEUp->Height = Width; + + m_BtnLINEDown->Left = 0; + m_BtnLINEDown->Top = Height-Width; + m_BtnLINEDown->Width = Width; + m_BtnLINEDown->Height = Width; + + }else{ + + m_BtnBKG->Left = Height; + m_BtnBKG->Top = 0; + m_BtnBKG->Width = Width-2*Height; + m_BtnBKG->Height = Height; + + if(FSBTotal<=FSBShow) { + nLeft = 0; + nTop = 0; + nWidth = 0; + nHeight = 0; + }else{ + nLeft = CalThumbLeft(); + nTop = THUMB_LEFT; + nWidth = CalThumbWidth(); + nHeight = H_THUMB_HEIGHT; + } + m_BtnThumb->Left = nLeft; + m_BtnThumb->Top = nTop; + m_BtnThumb->Width = nWidth; + m_BtnThumb->Height = nHeight; + + + m_BtnLINEUp->Left = 0; + m_BtnLINEUp->Top = 0; + m_BtnLINEUp->Width = Height; + m_BtnLINEUp->Height = Height; + + m_BtnLINEDown->Left = Width-Height; + m_BtnLINEDown->Top = 0; + m_BtnLINEDown->Width = Height; + m_BtnLINEDown->Height = Height; + } +} +//--------------------------------------------------------------------------- +void __fastcall TTransSkinScollBar::WMEraseBkgnd(TWMEraseBkgnd &Message) +{ + Message.Result = true; +} +//--------------------------------------------------------------------------- +void __fastcall TTransSkinScollBar::AddThumbTop(int nAdd, bool bEraseBKG, TTimer *pTTimer) +{ + int nTop = FSBTop; + nTop += nAdd; + + SetThumbTop(nTop, bEraseBKG, pTTimer); +} +//--------------------------------------------------------------------------- +void __fastcall TTransSkinScollBar::SetThumbTop(int nTop, bool bEraseBKG, TTimer *pTTimer) +{ + if( nTop<0 ) { + nTop = 0; + if( pTTimer ) pTTimer->Enabled = false; + } + + if( nTop>=FSBTotal-FSBShow ) + { + nTop = FSBTotal-FSBShow; + + if( pTTimer ) pTTimer->Enabled = false; + } + + FSBTop = nTop; + + if( FVertial ) + m_BtnThumb->Top = CalThumbTop(); + else + m_BtnThumb->Left = CalThumbLeft(); + + if( FChangePos ) + FChangePos(this); + + if( bEraseBKG ) { +// m_BtnThumb->Update(); +// this->Invalidate(); + } +} +//--------------------------------------------------------------------------- +void __fastcall TTransSkinScollBar::EventTimerThumb(System::TObject* Sender) +{ + int nAdd = 0; + + if( Sender==(TObject *)m_pTTimerLine ) { + + if( m_bLineUp ) { + nAdd = -1; + }else { + nAdd = 1; + } + + }else if( Sender==(TObject *)m_pTTimerPage ) { + + TPoint ptCur; + GetCursorPos(&ptCur); + ptCur = this->ScreenToClient(ptCur); + + if( FVertial ) { + + if( m_bPageUp ) { + if( ptCur.Y>=m_BtnThumb->Top ) { + m_pTTimerPage->Enabled = false; + return; + } + nAdd = -FSBShow; + + }else { + if( ptCur.Y<=m_BtnThumb->Top+m_BtnThumb->Height ) { + m_pTTimerPage->Enabled = false; + return; + } + nAdd = FSBShow; + } + + }else { + + if( m_bPageUp ) { + if( ptCur.X>=m_BtnThumb->Left ) { + m_pTTimerPage->Enabled = false; + return; + } + nAdd = -FSBShow; + }else { + if( ptCur.X<=m_BtnThumb->Left+m_BtnThumb->Width ) { + m_pTTimerPage->Enabled = false; + return; + } + nAdd = FSBShow; + } + } + } + + AddThumbTop(nAdd, true, (TTimer *)Sender); +} +//--------------------------------------------------------------------------- +void __fastcall TTransSkinScollBar::BtnEventLINEUp(int MsTmp, int XPos, int YPos) +{ + if( Ms_LDOWN==MsTmp ) { + + m_bLineUp = true; + AddThumbTop(-1, true); + + m_pTTimerLine->Enabled = true; + + }else if( Ms_LUP==MsTmp ) { + + m_pTTimerLine->Enabled = false; + + }else if( Ms_LLDOWN==MsTmp ) { + + m_pTTimerLine->Enabled = false; + AddThumbTop(-1, true); + } +} +//--------------------------------------------------------------------------- +void __fastcall TTransSkinScollBar::BtnEventLINEDown(int MsTmp, int XPos, int YPos) +{ + if( Ms_LDOWN==MsTmp ) { + + m_bLineUp = false; + AddThumbTop(1, true); + + m_pTTimerLine->Enabled = true; + + }else if( Ms_LUP==MsTmp ) { + + m_pTTimerLine->Enabled = false; + + }else if( Ms_LLDOWN==MsTmp ) { + + m_pTTimerLine->Enabled = false; + AddThumbTop(1, true); + } +} +//--------------------------------------------------------------------------- +void __fastcall TTransSkinScollBar::BtnEventBKG(int MsTmp, int XPos, int YPos) +{ + + TPoint pt = TPoint(XPos, YPos); + TRect TRectUp, TRectDn; + + if( Ms_LDOWN==MsTmp || + Ms_LLDOWN==MsTmp ) + { + int nLeft, nTop, nWidth, nHeight; + + if( FVertial ) { + + nLeft = m_BtnBKG->Left; + nTop = m_BtnBKG->Top; + nWidth = m_BtnBKG->Width; + nHeight = m_BtnThumb->Top - m_BtnBKG->Top; + TRectUp = TRect(nLeft, + nTop, + nLeft+nWidth, + nTop+nHeight); + + nTop = m_BtnThumb->Top+m_BtnThumb->Height; + nHeight = m_BtnBKG->Top+m_BtnBKG->Height-nTop; + TRectDn = TRect(nLeft, + nTop, + nLeft+nWidth, + nTop+nHeight); + + }else { + + nLeft = m_BtnBKG->Left; + nTop = m_BtnBKG->Top; + nWidth = m_BtnThumb->Left - m_BtnBKG->Left; + nHeight = m_BtnBKG->Height; + TRectUp = TRect(nLeft, + nTop, + nLeft+nWidth, + nTop+nHeight); + + nLeft = m_BtnThumb->Left+m_BtnThumb->Width; + nWidth = m_BtnBKG->Left+m_BtnBKG->Width-nLeft; + TRectDn = TRect(nLeft, + nTop, + nLeft+nWidth, + nTop+nHeight); + } + } + + if( Ms_LDOWN==MsTmp ) { + + m_pTTimerPage->Enabled = true; + if( PtInRect(TRectUp, pt ) ) { + + m_bPageUp = true; + if( 1==m_BtnBKG->StateCount ) + AddThumbTop(-FSBShow, true); + else + AddThumbTop(-FSBShow); + + }else if( PtInRect(TRectDn, pt) ){ + + m_bPageUp = false; + if( 1==m_BtnBKG->StateCount ) + AddThumbTop(FSBShow, true); + else + AddThumbTop(FSBShow); + } + }else if( Ms_LUP==MsTmp ) { + + m_pTTimerPage->Enabled = false; + + }else if( Ms_LLDOWN==MsTmp ) { + + m_pTTimerPage->Enabled = false; + if( PtInRect(TRectUp, pt ) ) { + + m_bPageUp = true; + AddThumbTop(-FSBShow, true); + }else if( PtInRect(TRectDn, pt) ){ + + m_bPageUp = false; + AddThumbTop(FSBShow, true); + } + } +} +//--------------------------------------------------------------------------- +void __fastcall TTransSkinScollBar::BtnEventThumb(int MsTmp, int XPos, int YPos) +{ + static bool bBKGEnter = false; + + if( Ms_DRAG==MsTmp ) { + + int nCurPos, nAdd; + if( FVertial ) { + + nCurPos = YPos; + nAdd =(FSBTotal-FSBShow+1)*(nCurPos-14)/THUMB_BKGLEFT; + + }else { + + nCurPos = XPos; + nAdd =(FSBTotal-FSBShow+1)*(nCurPos-14)/H_THUMB_BKGLEFT; + } + + if( m_BtnBKG->StateEnter ) { + m_BtnBKG->StateEnter = false; + bBKGEnter = true; + } + SetThumbTop(nAdd, true); + + }else if( Ms_LUP==MsTmp ){ + + if( bBKGEnter ) + m_BtnBKG->StateEnter = true; + } +} +//--------------------------------------------------------------------------- +void __fastcall TTransSkinScollBar::Paint() +{ + SetBkMode( Canvas->Handle, TRANSPARENT); + StyleServices()->DrawParentBackground( Handle, Canvas->Handle, NULL, false); + + HDC ParentDC = GetDC(Handle); + //һʾ豸ݵڴ豸 + HDC BufDC = CreateCompatibleDC(ParentDC); + // һʾ豸ݵλͼ + HBITMAP BufBitmap = CreateCompatibleBitmap(Canvas->Handle, Width, Height); + // 豸λͼ + SelectObject(BufDC, BufBitmap); + // CreateCompatibleBitmapλͼݳʼΪ0RGB(0,0,0)ʾǺɫ + // ҪɫʹΪ͸ + PerformEraseBackground(this, BufDC); + // ʱCanvasͼãDZģֱʹGDIͼ + TCanvas *CanvasDraw = new TCanvas(); + // ڴ豸 + CanvasDraw->Handle = BufDC; + + //-------------------------------------- + SetBkMode( CanvasDraw->Handle, TRANSPARENT); + StyleServices()->DrawParentBackground( + Handle, + CanvasDraw->Handle, + NULL, false); + m_BtnLINEUp->Paint(CanvasDraw); + m_BtnBKG->Paint(CanvasDraw); + m_BtnLINEDown->Paint(CanvasDraw); + + // һԽڴͼݸǹȥΪ˲̣Ա˸ + BitBlt(Canvas->Handle, 0, 0, ClientWidth, ClientHeight, + CanvasDraw->Handle, 0, 0, SRCCOPY); + // ͷԴ + DeleteDC(BufDC); + DeleteObject(BufBitmap); + SAFE_DELETE(CanvasDraw) +} +//--------------------------------------------------------------------------- +void __fastcall TTransSkinScollBar::BtnPaintLINEUp(int BsTmp, TRect TRectTmp, TCanvas *pCanvas) +{ + int nLeft, nTop, nWidth, nHeight; + + if( Bs_NORMAL==BsTmp ) { + + pCanvas->Brush->Color = RGB(156, 156, 156); + pCanvas->FillRect(TRectTmp); + + pCanvas->Brush->Color = RGB(76, 76, 76); + nLeft = TRectTmp.Width()/2/2+1; + nTop = TRectTmp.Height()/2 - 1; + nWidth = TRectTmp.Width()/2; + nHeight = 2; + pCanvas->FillRect(TRect(nLeft, nTop, nLeft+nWidth, nTop+nHeight)); + + }else if( Bs_DOWN==BsTmp ) { + + pCanvas->Brush->Color = RGB(156, 156, 156); + pCanvas->FillRect(TRectTmp); + + pCanvas->Brush->Color = RGB(0, 0, 0); + nLeft = TRectTmp.Width()/2/2+1; + nTop = TRectTmp.Height()/2 - 1; + nWidth = TRectTmp.Width()/2; + nHeight = 2; + pCanvas->FillRect(TRect(nLeft, nTop, nLeft+nWidth, nTop+nHeight)); + } +} +//--------------------------------------------------------------------------- +void __fastcall TTransSkinScollBar::BtnPaintLINEDown(int BsTmp, TRect TRectTmp, TCanvas *pCanvas) +{ + int nLeft, nTop, nWidth, nHeight; + + if( Bs_NORMAL==BsTmp ) { + + pCanvas->Brush->Color = RGB(156, 156, 156); + pCanvas->FillRect(TRectTmp); + + pCanvas->Brush->Color = RGB(76, 76, 76); + nLeft = TRectTmp.Left+TRectTmp.Width()/2/2; + nTop = TRectTmp.Height()/2 - 1; + nWidth = TRectTmp.Width()/2+1; + nHeight = 2; + TRect rtMinus = TRect(nLeft, nTop, nLeft+nWidth, nTop+nHeight); + pCanvas->FillRect( rtMinus ); + + nLeft = TRectTmp.Left+TRectTmp.Width()/2-1; + nTop = TRectTmp.Height()/2/2; + nWidth = 2; + nHeight = TRectTmp.Height()/2+1; + pCanvas->FillRect(TRect(nLeft, nTop, nLeft+nWidth, nTop+nHeight)); + + }else if( Bs_DOWN==BsTmp ) { + + pCanvas->Brush->Color = RGB(156, 156, 156); + pCanvas->FillRect(TRectTmp); + + pCanvas->Brush->Color = RGB(0, 0, 0); + nLeft = TRectTmp.Left+TRectTmp.Width()/2/2; + nTop = TRectTmp.Height()/2 - 1; + nWidth = TRectTmp.Width()/2+1; + nHeight = 2; + TRect rtMinus = TRect(nLeft, nTop, nLeft+nWidth, nTop+nHeight); + pCanvas->FillRect( rtMinus ); + + nLeft = TRectTmp.Left+TRectTmp.Width()/2-1; + nTop = TRectTmp.Height()/2/2; + nWidth = 2; + nHeight = TRectTmp.Height()/2+1; + pCanvas->FillRect(TRect(nLeft, nTop, nLeft+nWidth, nTop+nHeight)); + + } +} +//--------------------------------------------------------------------------- +void __fastcall TTransSkinScollBar::BtnPaintBKG(int BsTmp, TRect TRectTmp, TCanvas *pCanvas) +{ + if( Bs_NORMAL==BsTmp ) { + + pCanvas->Brush->Color = RGB(123, 123, 123); + pCanvas->FillRect(TRectTmp); + + pCanvas->Pen->Color = RGB(233, 233, 233); + pCanvas->Rectangle(TRectTmp); + } +} +//--------------------------------------------------------------------------- +void __fastcall TTransSkinScollBar::BtnPaintThumb(int BsTmp, TRect TRectTmp, TCanvas *pCanvas) +{ + if( Bs_NORMAL==BsTmp ) { + + TPngImage *png = new TPngImage(); + png->LoadFromResourceName(int(HInstance), L"round"); + pCanvas->StretchDraw(TRectTmp, png); + SAFE_DELETE(png) + } +} +//--------------------------------------------------------------------------- + diff --git a/TransSkinScrollBar.h b/TransSkinScrollBar.h new file mode 100644 index 0000000..537549f --- /dev/null +++ b/TransSkinScrollBar.h @@ -0,0 +1,85 @@ +//--------------------------------------------------------------------------- +#ifndef TransSkinScrollBarH +#define TransSkinScrollBarH +class TBtnPanel; +//--------------------------------------------------------------------------- +class PACKAGE TTransSkinScollBar : public Vcl::Extctrls::TPanel +{ + +private: + + System::Classes::TNotifyEvent FChangePos; + + bool FVertial; + void __fastcall SetVertial(bool bFVertial); + + int FSBShow ,FSBTotal, FSBTop; + void __fastcall SetSBTop(int nTop); + + void __fastcall SetTransparent(bool bTrans); + void __fastcall SetTransparentValue(BYTE value); + + void __fastcall BtnPaintThumb(int BsTmp, TRect TRectTmp, TCanvas *pCanvas); + void __fastcall BtnEventThumb(int MsTmp, int XPos, int YPos); + + void __fastcall BtnPaintBKG(int BsTmp, TRect TRectTmp, TCanvas *pCanvas); + void __fastcall BtnEventBKG(int MsTmp, int XPos, int YPos); + + void __fastcall BtnPaintLINEUp(int BsTmp, TRect TRectTmp, TCanvas *pCanvas); + void __fastcall BtnEventLINEUp(int MsTmp, int XPos, int YPos); + + void __fastcall BtnPaintLINEDown(int BsTmp, TRect TRectTmp, TCanvas *pCanvas); + void __fastcall BtnEventLINEDown(int MsTmp, int XPos, int YPos); + + void __fastcall AddThumbTop(int nAdd, bool bEraseBKG=false, TTimer *pTTimer=NULL); + void __fastcall SetThumbTop(int nTop, bool bEraseBKG=false, TTimer *pTTimer=NULL); + + bool m_bLineUp; + bool m_bPageUp; + + TTimer *m_pTTimerLine; + TTimer *m_pTTimerPage; + void __fastcall EventTimerThumb(System::TObject* Sender); + + bool m_bPices; + int FThumbWidth; + +protected: + + TBtnPanel *m_BtnBKG; + TBtnPanel *m_BtnThumb; + TBtnPanel *m_BtnLINEUp; + TBtnPanel *m_BtnLINEDown; + + int __fastcall CalThumbHeight(); + int __fastcall CalThumbTop(); + int __fastcall CalThumbWidth(); + int __fastcall CalThumbLeft(); + + virtual void __fastcall CreateWnd(); + virtual void __fastcall CreateParams(Controls::TCreateParams &Params); + virtual void __fastcall Paint(void); + MESSAGE void __fastcall WMSize(Winapi::Messages::TWMSize &Message); + MESSAGE void __fastcall WMEraseBkgnd(TWMEraseBkgnd &Message); + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(WM_ERASEBKGND, TWMEraseBkgnd, WMEraseBkgnd) + MESSAGE_HANDLER(WM_SIZE, TWMSize, WMSize) + END_MESSAGE_MAP( Vcl::Extctrls::TPanel ) + +public: + + __fastcall virtual TTransSkinScollBar(System::Classes::TComponent* AOwner); + __fastcall virtual ~TTransSkinScollBar(void); + +__published: + + __property bool Vertial = {read=FVertial, write=SetVertial, default=true}; + __property int SBShow = {read=FSBShow, write=FSBShow, default=0 }; + __property int SBTotal = {read=FSBTotal, write=FSBTotal, default=0 }; + __property int SBTop = {read=FSBTop, write=SetSBTop, default=0 }; + __property int ThumbWidth = {read=FThumbWidth, write=FThumbWidth, default=-1}; + __property TNotifyEvent OnChangePos = {read=FChangePos, write=FChangePos}; +}; +//--------------------------------------------------------------------------- +#endif diff --git a/TransparentPanelUnit.cpp b/TransparentPanelUnit.cpp new file mode 100644 index 0000000..cee6afb --- /dev/null +++ b/TransparentPanelUnit.cpp @@ -0,0 +1,34 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop + +#include "TransparentPanelUnit.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) + +__fastcall TransparentPanelUnit::TPanel::TPanel(TComponent* AOwner) + : Vcl::Extctrls::TPanel(AOwner) +{ + ControlStyle >> csOpaque; +} + +void __fastcall TransparentPanelUnit::TPanel::CreateWnd(void) +{ + Vcl::Extctrls::TPanel::CreateWnd(); + + SetWindowLong( Parent->Handle, GWL_STYLE, + GetWindowLong(Parent->Handle, GWL_STYLE) & ~WS_CLIPCHILDREN ); +} + +void __fastcall TransparentPanelUnit::TPanel::CreateParams(Controls::TCreateParams &Params) +{ + Vcl::Extctrls::TPanel::CreateParams(Params); + + Params.ExStyle |= WS_EX_TRANSPARENT; +} + +void __fastcall TransparentPanelUnit::TPanel::Paint() +{ + SetBkMode( Canvas->Handle, TRANSPARENT); + StyleServices()->DrawParentBackground( Handle, Canvas->Handle, NULL, false); +} diff --git a/TransparentPanelUnit.h b/TransparentPanelUnit.h new file mode 100644 index 0000000..8a8899b --- /dev/null +++ b/TransparentPanelUnit.h @@ -0,0 +1,21 @@ +//--------------------------------------------------------------------------- +#ifndef TransparentPanelUnitH +#define TransparentPanelUnitH + +namespace TransparentPanelUnit +{ +//--------------------------------------------------------------------------- +class TPanel : public Extctrls::TPanel +{ +protected: + virtual void __fastcall CreateWnd(); + virtual void __fastcall CreateParams(Controls::TCreateParams &Params); + virtual void __fastcall Paint(void); + +public: + __fastcall virtual TPanel(System::Classes::TComponent* AOwner); +}; + +} +using namespace TransparentPanelUnit; +#endif diff --git a/Undo.cpp b/Undo.cpp new file mode 100644 index 0000000..1a306dc --- /dev/null +++ b/Undo.cpp @@ -0,0 +1,204 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop + +#include "Compose.h" +#include "AudioTrack.h" +#include "MidiTrack.h" +//#include "StyleItem.h" +#include "Undo.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) + +char* g_strUndoType[][16] = { + { "", "Ԥṹ", "ıȫɫ" }, + { "ıȫֵ", "ıСڵ" }, + { "޸ĺ" }, + { "ɾƵ", "Ƶ", "ƶƵ", "ƵƬ", "¼", "ֲЧ" }, + { "С/", "ɾС/", "ƶС/", "ıС/η" }, + { "֯", "ɾ֯", "֯", "֯ɫ" }, + { "滻ȫ", "ڶ", "֯" }, + { "ӹЧ", "ɾЧ", "ıЧ˳", "Ч" }, + { "ı״̬", "ڹ", "ڹ", "ڹ", "ıͨ" }, + { "Ƶ", "ɾƵ", "ɾȫƵ", "ʾƵ", "ʾȫƵ", + "Ƶ", "ȫƵ" }, + { "MIDI", "ɾMIDI", "ɾȫMIDI", "ʾMIDI", "ʾȫMIDI", + "MIDI", "ȫMIDI" } + +}; +TUndo g_Undo; +//--------------------------------------------------------------------------- + +void DeleteList( TAudioTrackList* pList ) +{ + while( !pList->empty() ){ + delete pList->back(); + pList->pop_back(); + } +} + +void DeleteList( TMidiTrackList* pList ) +{ + while( !pList->empty() ){ + delete pList->back(); + pList->pop_back(); + } +} + +void DeleteList( TEffect* pList ) +{ + TEffect * pE = pList; + + while( pE ){ + TEffect *pTemp = pE->pNext; + delete pE; + pE = pTemp; + } +} + +void DeleteList( TOpusStageList* pList ) +{ + while( !pList->empty() ){ + delete pList->back(); + pList->pop_back(); + } +} + +void TUndo::AddUndo( int iType, int iCode, int iBegin, int iEnd, void* pBefore, void* pAfter ) +{ + RemoveLites( m_iPos++ ); + + TUndoLite* pLite = new TUndoLite( iType, iCode, iBegin, iEnd ); + pLite->pBefore = pBefore; + pLite->pAfter = pAfter; + m_lstLites.push_back( pLite ); +} +//--------------------------------------------------------------------------- + +void TUndo::SetUndoExtra( int iExt1, int iExt2, int iExt3, void* pExt1, void* pExt2 ) +{ + TUndoLite* pLite = m_lstLites.back(); + pLite->iExt1 = iExt1; + pLite->iExt2 = iExt2; + pLite->iExt3 = iExt3; + pLite->pExt1 = pExt1; + pLite->pExt2 = pExt2; +} +//--------------------------------------------------------------------------- + +void TUndo::SetUndoCode( int iCode ) +{ + TUndoLite* pLite = m_lstLites.back(); + pLite->iCode = iCode; +} +//--------------------------------------------------------------------------- + +void TUndo::CancelUndo() +{ + RemoveLites( --m_iPos ); +} +//--------------------------------------------------------------------------- + +void TUndo::RemoveLites( int iFrom ) +{ + while( m_lstLites.size()>iFrom ){ + TUndoLite* pLite = m_lstLites.back(); + DelLiteParams( pLite ); + delete pLite; + m_lstLites.pop_back(); + } +} +//--------------------------------------------------------------------------- + +void TUndo::DelLiteParams( TUndoLite* pLite ) +{ + if( pLite->iType==UNDO_KEY_BARS ){ + if( pLite->pBefore ) + delete[] (int*)pLite->pBefore; + } + else if( pLite->iType==UNDO_CHORD ){ + if( pLite->pBefore ) + delete[] (BYTE*)pLite->pBefore; + if( pLite->pAfter ) + delete[] (BYTE*)pLite->pAfter; + } + else if( pLite->iType==UNDO_TRKAUD_DEL || pLite->iType==UNDO_TRKAUD_DELALL ){ + if( pLite->pBefore ) + DeleteList( (TAudioTrackList*)pLite->pBefore ); + } + else if( pLite->iType>=UNDO_TRKAUD_SHOW && pLite->iType<=UNDO_TRKAUD_HIDEALL + || pLite->iType>=UNDO_TRKMID_SHOW && pLite->iType<=UNDO_TRKMID_HIDEALL ){ + if( pLite->pBefore ) + delete (vector*)pLite->pBefore; + } + else if( pLite->iType>=UNDO_AUDIO_ERASE && pLite->iType<=UNDO_AUDIO_FX ){ + if( pLite->iCode>0 ){ + if( pLite->pBefore ) + delete[] (DWORD*)pLite->pBefore; + if( pLite->pAfter ) + delete[] (DWORD*)pLite->pAfter; + if( pLite->pExt1 ) + delete[] (DWORD*)pLite->pExt1; + if( pLite->pExt2 ) + delete[] (DWORD*)pLite->pExt2; + } + else { + if( pLite->pBefore ) + delete (TAudioTrack*)pLite->pBefore; + if( pLite->pAfter ) + delete (TAudioTrack*)pLite->pAfter; + if( pLite->pExt1 ) + DeleteList( (TOpusStageList*)pLite->pExt1 ); + if( pLite->pExt2 ) + DeleteList( (TOpusStageList*)pLite->pExt2 ); + } + } + else if( pLite->iType>=UNDO_BAR_INSERT && pLite->iType<=UNDO_BAR_CHANGE + || pLite->iType==UNDO_OPUS_STYLE + || pLite->iType==UNDO_PRESET + || pLite->iType==UNDO_KEY_MELODY ){ + if( pLite->pBefore ) + DeleteList( (TOpusStageList*)pLite->pBefore ); + if( pLite->pAfter ) + DeleteList( (TOpusStageList*)pLite->pAfter ); + if( pLite->pExt1 ) + DeleteList( (TAudioTrackList*)pLite->pExt1 ); + } + else if( pLite->iType>=UNDO_MIDI_ADD && pLite->iType<=UNDO_MIDI_FONT + || pLite->iType==UNDO_TRKMID_DEL ){ + if( pLite->pBefore ) + delete[] (TTrack*)pLite->pBefore; + if( pLite->pAfter ) + delete (TTrack*)pLite->pAfter; + if( pLite->pExt1 ) + delete (vector*)pLite->pExt1; + if( pLite->pExt2 ) + delete (vector*)pLite->pExt2; + } + else if( pLite->iType==UNDO_TRKMID_DELALL ){ + if( pLite->pBefore ) + DeleteList( (TOpusStageList*)pLite->pBefore ); + if( pLite->pAfter ) + DeleteList( (TOpusStageList*)pLite->pAfter ); + if( pLite->pExt1 ) + DeleteList( (TMidiTrackList*)pLite->pExt1 ); + } + else if( pLite->iType==UNDO_PROG_VOL ){ + if( pLite->pExt1 ) + delete (TTrack*)pLite->pExt1; + } + else if( pLite->iType>=UNDO_FX_ADD && pLite->iType<=UNDO_FX_MOVE ){ + if( pLite->pBefore ) + delete (TAudioFx*)pLite->pBefore; + if( pLite->pAfter ) + delete (TAudioFx*)pLite->pAfter; + } + else if( pLite->iType==UNDO_FX_PARAM ){ + if( pLite->pBefore ) + delete (float*)pLite->pBefore; + if( pLite->pAfter ) + delete (float*)pLite->pAfter; + } +} + + diff --git a/Undo.h b/Undo.h new file mode 100644 index 0000000..86aa878 --- /dev/null +++ b/Undo.h @@ -0,0 +1,130 @@ +//--------------------------------------------------------------------------- + +#ifndef UndoH +#define UndoH +//--------------------------------------------------------------------------- +#define UNDO_VOLUME 0x00 +#define UNDO_PRESET 0x01 +#define UNDO_FONT_SET 0x02 + +#define UNDO_KEY_MELODY 0x10 +#define UNDO_KEY_BARS 0x11 + +#define UNDO_CHORD 0x20 + +#define UNDO_AUDIO_ERASE 0x30 +#define UNDO_AUDIO_COPY 0x31 +#define UNDO_AUDIO_MOVE 0x32 +#define UNDO_AUDIO_LOAD 0x33 +#define UNDO_AUDIO_RECORD 0x34 +#define UNDO_AUDIO_FX 0x35 + +#define UNDO_BAR_INSERT 0x40 +#define UNDO_BAR_DELETE 0x41 +#define UNDO_BAR_MOVE 0x42 +#define UNDO_BAR_CHANGE 0x43 + +#define UNDO_MIDI_ADD 0x50 +#define UNDO_MIDI_DEL 0x51 +#define UNDO_MIDI_SUB 0x52 +#define UNDO_MIDI_FONT 0x53 + +#define UNDO_OPUS_STYLE 0x60 +#define UNDO_STAGE_VOL 0x61 +#define UNDO_PROG_VOL 0x62 + +#define UNDO_FX_ADD 0x70 +#define UNDO_FX_DEL 0x71 +#define UNDO_FX_MOVE 0x72 +#define UNDO_FX_PARAM 0x73 + +#define UNDO_TRACK_STATE 0x80 +#define UNDO_TRACK_VOL 0x81 +#define UNDO_TRACK_PAN 0x82 +#define UNDO_TRACK_GAIN 0x83 +#define UNDO_TRACK_CHNO 0x84 + +#define UNDO_TRKAUD_ADD 0x90 +#define UNDO_TRKAUD_DEL 0x91 +#define UNDO_TRKAUD_DELALL 0x92 +#define UNDO_TRKAUD_SHOW 0x93 +#define UNDO_TRKAUD_SHOWALL 0x94 +#define UNDO_TRKAUD_HIDE 0x95 +#define UNDO_TRKAUD_HIDEALL 0x96 + +#define UNDO_TRKMID_ADD 0xA0 +#define UNDO_TRKMID_DEL 0xA1 +#define UNDO_TRKMID_DELALL 0xA2 +#define UNDO_TRKMID_SHOW 0xA3 +#define UNDO_TRKMID_SHOWALL 0xA4 +#define UNDO_TRKMID_HIDE 0xA5 +#define UNDO_TRKMID_HIDEALL 0xA6 + +#include +using namespace std; + +extern char* g_strUndoType[][16]; + +typedef struct tagUndoLite +{ + int iType; + int iCode; + int iBegin, iEnd; //޸ķΧ + int iExt1, iExt2, iExt3; //θӲ + void *pBefore, //޸ǰ + *pAfter, //޸ĺ + *pExt1, //ָ͸Ӳ1 + *pExt2; //ָ͸Ӳ2 + + tagUndoLite( int iTypeP, int iCodeP, int iBeginP, int iEndP ){ + iType = iTypeP; + iCode = iCodeP; + iBegin = iBeginP; + iEnd = iEndP; + iExt1 = iExt2 = iExt3 = 0; + pBefore = pAfter = pExt1 = pExt2 = NULL; + } +} TUndoLite; + +class TUndo +{ +private: + vector m_lstLites; //б + int m_iPos; //ǰλ + + void RemoveLites( int iFrom ); + void DelLiteParams( TUndoLite* pLite ); + +public: + void AddUndo( int iType, int iCode, int iBegin, int iEnd, void* pBefore, void* pAfter ); + void SetUndoExtra( int iExt1, int iExt2, int iExt3, void* pExt1, void* pExt2 ); + void SetUndoCode( int iCode ); + void CancelUndo(); + + TUndoLite* GetLastLite() { return m_iPos==0 ? NULL : m_lstLites[m_iPos-1]; }; + + int GetUndoType() + { return m_iPos>0 ? m_lstLites[m_iPos-1]->iType : -1; }; + int GetRedoType() + { return m_iPosiType : -1; }; + int GetUndoCode() + { return m_iPos>0 ? m_lstLites[m_iPos-1]->iCode : -1; }; + int GetRedoCode() + { return m_iPosiCode : -1; }; + + TUndoLite* Undo() + { return m_lstLites[--m_iPos]; }; + TUndoLite* Redo() + { return m_lstLites[m_iPos++]; }; + void ClearUndoList() + { RemoveLites( m_iPos = 0 ); }; + + TUndo() + { m_iPos = 0; }; + ~TUndo() + { ClearUndoList(); }; +}; + +extern TUndo g_Undo; + +#endif diff --git a/UpDownUnit.cpp b/UpDownUnit.cpp new file mode 100644 index 0000000..4947e9f --- /dev/null +++ b/UpDownUnit.cpp @@ -0,0 +1,439 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop + +#include "UpDownUnit.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) + + +static const COLORREF + RGB_EXTERNAL_FRAME = RGB(168,180,196), + RGB_INTERNAL_NOR = RGB(168,180,196), //272a2f + RGB_INTERNAL_HIG = RGB(107,112,120), //4a5058 + RGB_INTERNAL_PUSH = RGB(80,84,90), //32363c + RGB_INTERNAL_LINE_NOR = RGB(25,27,30), //191b1e + RGB_INTERNAL_LINE_HIG = RGB(58,63,69), //3a3f45 + RGB_INTERNAL_LINE_PUSH = RGB(38,41,45), //26292d + RGB_INTERNAL_FRAME_NOR = RGB(84,89,95), + RGB_INTERNAL_FRAME_HIG = RGB(68,74,81), + RGB_INTERNAL_FRAME_PUSH = RGB(50,54,60), + RGB_RECT_DISPART_LINE = RGB(157,168,183); + +#define PIXL_EXTERNAL_FRAME 1 +#define PIXL_INTERNAL_FRAME 1 +#define PIXL_INTERNAL2RECT 1 +#define PIXL_INTERNAL_LINE 1 +#define PIXL_INTERL_WIDTH (Width- \ + 4*(PIXL_EXTERNAL_FRAME+PIXL_INTERNAL_FRAME+PIXL_INTERNAL2RECT)+1)/2 + +#define PIXL_INTERL_HEIGHT (Height- \ + 4*(PIXL_EXTERNAL_FRAME+PIXL_INTERNAL_FRAME+PIXL_INTERNAL2RECT)+1)/2 + +__fastcall UpDownUnit::TUpDown::TUpDown(System::Classes::TComponent* AOwner) + :Vcl::Comctrls::TUpDown(AOwner) +{ + if(Width%2) + Width += 1; + + m_pCanvas = new TControlCanvas(); + ((TControlCanvas*)m_pCanvas)->Control = this; + + m_pTimer = new TTimer(this); + m_pTimer->Enabled = false; + m_pTimer->OnTimer = TimerProc; + +} +//--------------------------------------------------------------------------- + +__fastcall UpDownUnit::TUpDown::~TUpDown() +{ + if( m_pTimer ){ + delete m_pTimer; + m_pTimer = NULL; + } + + if( m_pCanvas ){ + delete m_pCanvas; + m_pCanvas = NULL; + } +} +//--------------------------------------------------------------------------- + +void __fastcall UpDownUnit::TUpDown::PaintWindow(HDC DC) +{ + if( !m_pCanvas->Handle ) + m_pCanvas->Handle = DC; + + Draw(STATE_NORMAL, ORIENTATION_ALL); + + TRect rClient = GetClientRect(); + m_pCanvas->Brush->Color = RGB_EXTERNAL_FRAME; + m_pCanvas->Pen->Color = RGB_EXTERNAL_FRAME; + //߿ + m_pCanvas->FrameRect(rClient); + + //мָ + m_pCanvas->Pen->Color = RGB_RECT_DISPART_LINE; + int X,Y; + if(Orientation == udHorizontal) { + X = PIXL_EXTERNAL_FRAME + 2*PIXL_INTERNAL_FRAME+2*PIXL_INTERNAL2RECT+ + PIXL_INTERL_WIDTH; + Y = 0; + m_pCanvas->MoveTo(X,Y); + Y = Height; + m_pCanvas->LineTo(X,Y); + }else { + Y = PIXL_EXTERNAL_FRAME + 2*PIXL_INTERNAL_FRAME+2*PIXL_INTERNAL2RECT+ + PIXL_INTERL_HEIGHT; + X = 0; + m_pCanvas->MoveTo(X,Y); + X = Width; + m_pCanvas->LineTo(X,Y); + } + +} +//--------------------------------------------------------------------------- + + void __fastcall UpDownUnit::TUpDown::WMPaint(Winapi::Messages::TWMPaint &Message) +{ + PaintHandler(Message); +} +//--------------------------------------------------------------------------- +void __fastcall UpDownUnit::TUpDown::WMLButtonDown(TWMMouse &Message) +{ + if( OnClick==NULL ) + return; + + SetCapture(Handle); + m_iDown = true; + + int iOrentation = HitTest(Message.XPos, Message.YPos); + m_iCurOrentation = m_iPreOrentation = iOrentation; + + if(iOrentation == ORIENTATION_LEFT) { + if(Orientation == udHorizontal) + OnClick(this, btPrev ); + else + OnClick(this, btNext ); + }else if(iOrentation == ORIENTATIONRIGHT) { + + if(Orientation == udHorizontal) + OnClick(this, btNext ); + else + OnClick(this, btPrev ); + } + + Draw(STATE_PUSH, iOrentation); + + m_pTimer->Interval = TIME_DELAY; + m_pTimer->Enabled = true; +} +//--------------------------------------------------------------------------- +void __fastcall UpDownUnit::TUpDown::WMLButtonUp(TWMMouse &Message) +{ + ReleaseCapture(); + m_iDown = false; + m_pTimer->Enabled = false; + int iOrentation = HitTest(Message.XPos, Message.YPos); + if(iOrentation != ORIENTATION_NONE) + Draw(STATE_HIGHLIGHT, iOrentation); + else + Draw(STATE_NORMAL, ORIENTATION_ALL); + + m_iCurOrentation = m_iPreOrentation = -1; +} +//--------------------------------------------------------------------------- + +void __fastcall UpDownUnit::TUpDown::WMMouseMove(TWMMouse &Message) +{ + if(!m_iDown) + Draw(STATE_HIGHLIGHT, HitTest(Message.XPos, Message.YPos)); + else + Draw(STATE_PUSH, HitTest(Message.XPos, Message.YPos)); + +} +//--------------------------------------------------------------------------- + +void __fastcall UpDownUnit::TUpDown::CMMouseLeave(TMessage &Message) +{ + if(!m_iDown) { + Draw(STATE_NORMAL, ORIENTATION_ALL); + m_iCurOrentation = m_iPreOrentation = -1; + } +} +//--------------------------------------------------------------------------- + +void __fastcall UpDownUnit::TUpDown::Draw(int iState, int iOrentation) +{ + if(iOrentation == ORIENTATION_NONE) + return; + + TRect rClient = GetClientRect(); + TRect temrClient = rClient; + int X,Y; + + //ǰΪұߣ߻ͨɫ + if( iOrentation==ORIENTATIONRIGHT || iOrentation==ORIENTATION_ALL || + (iOrentation==ORIENTATION_LEFT&&iState!=STATE_NORMAL) ) + { + if(iOrentation==ORIENTATIONRIGHT || iOrentation==ORIENTATION_ALL){ + m_pCanvas->Brush->Color = RGB_INTERNAL_NOR; + m_pCanvas->Pen->Color = RGB_INTERNAL_NOR; + }else if(iState==STATE_HIGHLIGHT){ + m_pCanvas->Brush->Color = RGB_INTERNAL_HIG; + m_pCanvas->Pen->Color = RGB_INTERNAL_HIG; + }else if(iState==STATE_PUSH){ + m_pCanvas->Brush->Color = RGB_INTERNAL_PUSH; + m_pCanvas->Pen->Color = RGB_INTERNAL_PUSH; + } + + if(Orientation == udHorizontal) { + temrClient.Left = PIXL_EXTERNAL_FRAME+PIXL_INTERNAL_FRAME; + temrClient.Top = PIXL_EXTERNAL_FRAME+PIXL_INTERNAL_FRAME; + temrClient.Right = temrClient.Left + 2*PIXL_INTERNAL2RECT + PIXL_INTERL_WIDTH; + temrClient.Bottom = Height - temrClient.Top ; + }else { + temrClient.Left = PIXL_EXTERNAL_FRAME+PIXL_INTERNAL_FRAME; + temrClient.Top = PIXL_EXTERNAL_FRAME+PIXL_INTERNAL_FRAME; + temrClient.Right = Width - temrClient.Left; + temrClient.Bottom = temrClient.Top + 2*PIXL_INTERNAL2RECT + PIXL_INTERL_HEIGHT; + } + + m_pCanvas->Rectangle(temrClient.Left, temrClient.Top, + temrClient.Right,temrClient.Bottom); + + ////////////////////////// + if(iOrentation==ORIENTATIONRIGHT || iOrentation==ORIENTATION_ALL){ + m_pCanvas->Pen->Color = RGB_INTERNAL_LINE_NOR; + }else if(iState==STATE_HIGHLIGHT){ + m_pCanvas->Pen->Color = RGB_INTERNAL_LINE_HIG; + }else if(iState==STATE_PUSH){ + m_pCanvas->Pen->Color = RGB_INTERNAL_LINE_PUSH; + } + + if(Orientation == udHorizontal) { + X = PIXL_EXTERNAL_FRAME+PIXL_INTERNAL_FRAME+PIXL_INTERNAL2RECT; + Y = Height/2-1; + m_pCanvas->Pixels[X][Y] = m_pCanvas->Pen->Color; + + X += 1; + + Y -= 1; + m_pCanvas->MoveTo(X,Y); + Y += 3; + m_pCanvas->LineTo(X,Y); + + X += 1; + + m_pCanvas->MoveTo(X,Y); + Y -= 5; + m_pCanvas->LineTo(X,Y); + }else { +// Y = PIXL_EXTERNAL_FRAME+PIXL_INTERNAL_FRAME+PIXL_INTERNAL2RECT+PIXL_INTERL_HEIGHT; + Y = temrClient.Top + temrClient.Height()/2 - 1; + X = Width/2-1; + m_pCanvas->Pixels[X][Y] = m_pCanvas->Pen->Color; + + Y += 1; + + X -= 1; + m_pCanvas->MoveTo(X,Y); + X += 3; + m_pCanvas->LineTo(X,Y); + + Y += 1; + + m_pCanvas->MoveTo(X,Y); + X -= 5; + m_pCanvas->LineTo(X,Y); + } + + //ڱ߿ + if(iOrentation==ORIENTATIONRIGHT || iOrentation==ORIENTATION_ALL){ + m_pCanvas->Brush->Color = RGB_INTERNAL_FRAME_NOR; + m_pCanvas->Pen->Color = RGB_INTERNAL_FRAME_NOR; + }else if(iState==STATE_HIGHLIGHT){ + m_pCanvas->Brush->Color = RGB_INTERNAL_FRAME_HIG; + m_pCanvas->Pen->Color = RGB_INTERNAL_FRAME_HIG; + }else if(iState==STATE_PUSH){ + m_pCanvas->Brush->Color = RGB_INTERNAL_FRAME_PUSH; + m_pCanvas->Pen->Color = RGB_INTERNAL_FRAME_PUSH; + } + + if(Orientation == udHorizontal) { + rClient.left = PIXL_EXTERNAL_FRAME; + rClient.Top = PIXL_EXTERNAL_FRAME; + rClient.Right = rClient.left + 2*PIXL_INTERNAL_FRAME+2*PIXL_INTERNAL2RECT+ + PIXL_INTERL_WIDTH; + rClient.Bottom -= rClient.Top; + }else { + rClient.left = PIXL_EXTERNAL_FRAME; + rClient.Top = PIXL_EXTERNAL_FRAME; + rClient.Right -= rClient.left; + rClient.Bottom = rClient.Top + 2*PIXL_INTERNAL_FRAME+2*PIXL_INTERNAL2RECT+ + PIXL_INTERL_HEIGHT;; + } + + m_pCanvas->FrameRect(rClient); + + + } + //ǰΪߣұ߻ͨɫ + if( iOrentation==ORIENTATION_LEFT || iOrentation==ORIENTATION_ALL || + (iOrentation==ORIENTATIONRIGHT&&iState!=STATE_NORMAL) ) + { + if(iOrentation==ORIENTATION_LEFT || iOrentation==ORIENTATION_ALL){ + m_pCanvas->Brush->Color = RGB_INTERNAL_NOR; + m_pCanvas->Pen->Color = RGB_INTERNAL_NOR; + }else if(iState==STATE_HIGHLIGHT){ + m_pCanvas->Brush->Color = RGB_INTERNAL_HIG; + m_pCanvas->Pen->Color = RGB_INTERNAL_HIG; + }else if(iState==STATE_PUSH){ + m_pCanvas->Brush->Color = RGB_INTERNAL_PUSH; + m_pCanvas->Pen->Color = RGB_INTERNAL_PUSH; + } + + if(Orientation == udHorizontal) { + temrClient.Left = temrClient.Right+2*PIXL_INTERNAL_FRAME+PIXL_INTERNAL_LINE; + temrClient.Right = Width - (PIXL_EXTERNAL_FRAME+PIXL_INTERNAL_FRAME); + + }else { + temrClient.Top = temrClient.Bottom+2*PIXL_INTERNAL_FRAME+PIXL_INTERNAL_LINE; + temrClient.Bottom = Height - (PIXL_EXTERNAL_FRAME+PIXL_INTERNAL_FRAME); + } + + m_pCanvas->Rectangle(temrClient.Left, temrClient.Top, + temrClient.Right,temrClient.Bottom); + + ////////////////////////////// + if(iOrentation==ORIENTATION_LEFT || iOrentation==ORIENTATION_ALL){ + m_pCanvas->Pen->Color = RGB_INTERNAL_LINE_NOR; + }else if(iState==STATE_HIGHLIGHT){ + m_pCanvas->Pen->Color = RGB_INTERNAL_LINE_HIG; + }else if(iState==STATE_PUSH){ + m_pCanvas->Pen->Color = RGB_INTERNAL_LINE_PUSH; + } + + if(Orientation == udHorizontal) { + X = temrClient.Left+3; + Y = Height/2-1; + m_pCanvas->Pixels[X][Y] = m_pCanvas->Pen->Color; + + X -= 1; + + Y -= 1; + m_pCanvas->MoveTo(X,Y); + Y += 3; + m_pCanvas->LineTo(X,Y); + + X -= 1; + + m_pCanvas->MoveTo(X,Y); + Y -= 5; + m_pCanvas->LineTo(X,Y); + }else { +// Y = temrClient.Top+3; + Y = temrClient.Top + temrClient.Height()/2 + 1; + X = Width/2-1; + m_pCanvas->Pixels[X][Y] = m_pCanvas->Pen->Color; + + Y -= 1; + + X -= 1; + m_pCanvas->MoveTo(X,Y); + X += 3; + m_pCanvas->LineTo(X,Y); + + Y -= 1; + + m_pCanvas->MoveTo(X,Y); + X -= 5; + m_pCanvas->LineTo(X,Y); + } + + //ڱ߿ + if(iOrentation==ORIENTATION_LEFT || iOrentation==ORIENTATION_ALL){ + m_pCanvas->Brush->Color = RGB_INTERNAL_FRAME_NOR; + m_pCanvas->Pen->Color = RGB_INTERNAL_FRAME_NOR; + }else if(iState==STATE_HIGHLIGHT){ + m_pCanvas->Brush->Color = RGB_INTERNAL_FRAME_HIG; + m_pCanvas->Pen->Color = RGB_INTERNAL_FRAME_HIG; + }else if(iState==STATE_PUSH){ + m_pCanvas->Brush->Color = RGB_INTERNAL_FRAME_PUSH; + m_pCanvas->Pen->Color = RGB_INTERNAL_FRAME_PUSH; + } + + if(Orientation == udHorizontal) { + rClient.left = rClient.Right+PIXL_INTERNAL_LINE; + rClient.Right = Width - PIXL_EXTERNAL_FRAME; + }else { + rClient.Top = rClient.Bottom+PIXL_INTERNAL_LINE; + rClient.Bottom = Height - PIXL_EXTERNAL_FRAME; + } + + m_pCanvas->FrameRect(rClient); + + } +} +//--------------------------------------------------------------------------- + +int __fastcall UpDownUnit::TUpDown::HitTest(int x, int y) +{ + if(y<0 || y>Height || x<0 || x>Width) + return ORIENTATION_NONE; + + if(Orientation == udHorizontal) { + + if(x>=0 && x<=Width/2 ) + return ORIENTATION_LEFT; + else if(x>Width/2 && x<=Width) + return ORIENTATIONRIGHT; + }else{ + + if(y>=0 && y<=Height/2 ) + return ORIENTATION_LEFT; + else if(y>Height/2 && y<=Height) + return ORIENTATIONRIGHT; + } + + return ORIENTATION_NONE; +} +//--------------------------------------------------------------------------- +void __fastcall UpDownUnit::TUpDown::TimerProc(TObject* Sender) +{ + if(m_iDown){ + m_pTimer->Interval = TIME_DELAY; + m_pTimer->Enabled = true; + + TPoint pt; + GetCursorPos(&pt); + pt = ScreenToClient(pt); + m_iCurOrentation = HitTest(pt.X, pt.Y); + + if(m_iCurOrentation == m_iPreOrentation) { + + if(m_iCurOrentation == ORIENTATION_LEFT) { + if(Orientation == udHorizontal) + OnClick(this, btPrev ); + else + OnClick(this, btNext ); + }else if(m_iCurOrentation == ORIENTATIONRIGHT) { + + if(Orientation == udHorizontal) + OnClick(this, btNext ); + else + OnClick(this, btPrev ); + } + + Draw(STATE_PUSH, m_iCurOrentation); + } + + }else{ + m_pTimer->Enabled = false; + } +} +//--------------------------------------------------------------------------- + + + diff --git a/UpDownUnit.h b/UpDownUnit.h new file mode 100644 index 0000000..a4fcd0e --- /dev/null +++ b/UpDownUnit.h @@ -0,0 +1,62 @@ +//--------------------------------------------------------------------------- + +#ifndef UpDownUnitH +#define UpDownUnitH +//--------------------------------------------------------------------------- + +#define STATE_NORMAL 0 +#define STATE_HIGHLIGHT 1 +#define STATE_PUSH 2 + +#define ORIENTATION_LEFT 0 +#define ORIENTATIONRIGHT 1 +#define ORIENTATION_NONE 2 +#define ORIENTATION_ALL 3 + +#define SPEED_MIN 50 +#define SPEED_MAX 200 + +#define TIME_DELAY 200 +//--------------------------------------------------------------------------- +namespace UpDownUnit{ + +class TUpDown: public Vcl::Comctrls::TUpDown +{ +private: + MESSAGE void __fastcall WMPaint(Winapi::Messages::TWMPaint &Message); + MESSAGE void __fastcall WMLButtonDown(TWMMouse &Message); + MESSAGE void __fastcall WMLButtonUp(TWMMouse &Message); + MESSAGE void __fastcall WMMouseMove(TWMMouse &Message); + MESSAGE void __fastcall CMMouseLeave(TMessage &Message); + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(WM_PAINT, TWMPaint, WMPaint) + MESSAGE_HANDLER(WM_LBUTTONDOWN, TWMLButtonDown, WMLButtonDown) + MESSAGE_HANDLER(WM_LBUTTONUP, TWMLButtonUp, WMLButtonUp) + MESSAGE_HANDLER(WM_MOUSEMOVE, TWMMouseMove, WMMouseMove) + MESSAGE_HANDLER(CM_MOUSELEAVE, TMessage, CMMouseLeave) + END_MESSAGE_MAP(Vcl::Comctrls::TUpDown) + +protected: + virtual void __fastcall PaintWindow(HDC DC); + +private: + TCanvas *m_pCanvas; + TTimer *m_pTimer; + + bool m_iDown; + int m_iCurOrentation,m_iPreOrentation; + + void __fastcall Draw(int iState, int iOrentation=ORIENTATION_ALL); + int __fastcall HitTest(int x, int y); + void __fastcall TimerProc(TObject* Sender); + +public: + __fastcall virtual TUpDown(System::Classes::TComponent* AOwner); + __fastcall ~TUpDown(); +}; + +} + +using namespace UpDownUnit; +#endif diff --git a/UpdateFormUnit.cpp b/UpdateFormUnit.cpp new file mode 100644 index 0000000..3dc610b --- /dev/null +++ b/UpdateFormUnit.cpp @@ -0,0 +1,402 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop +#include "GlobalUnit.h" +#include "UpdateFormUnit.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma link "PNGButton" +#pragma link "GeneralDialogPanel" +#pragma resource "*.dfm" +TUpdateForm *UpdateForm; + +vector< String > ItemStr; +//--------------------------------------------------------------------------- +__fastcall TUpdateForm::TUpdateForm(TComponent* Owner) + : TForm(Owner) +{ + +} +//--------------------------------------------------------------------------- +void __fastcall TUpdateForm::FormCreate(TObject *Sender) +{ +// Left = Screen->Width / 2 - Width / 2; +// Top = Screen->Height / 2 - Height / 2; +// HRGN hRgn = CreateRoundRectRgn(0, 0, Width + 1, Height + 1, 20, 20); +// SetWindowRgn(Handle, hRgn, TRUE); +// DeleteObject(hRgn); + + //******************************* +// String strTemp = L"TPanelλStandardϣҲdzõһؼTPanelλStandardϣҲdzõһؼTPanelλStandardϣҲdzõһؼTPanelλStandardϣҲdzõһؼ"; +// ItemStr.push_back( strTemp ); +// +// strTemp = L"ûôڳߴ"; +// ItemStr.push_back( strTemp ); + + //***************************** + + m_panBk->Font->Size = g_szFont9; + + ShowMSG(); + + m_plUpdateMsg = new TUpdateContenPanel(this); + m_plUpdateMsg->Parent = this; + m_plUpdateMsg->Top = 105; + m_plUpdateMsg->Left = 11; + m_plUpdateMsg->Width = 400; + m_plUpdateMsg->Height = 280; + + SetTransparent( this ); +} +//--------------------------------------------------------------------------- + +void __fastcall TUpdateForm::WMNCHitTest(TWMNCHitTest &Msg) { + TForm::Dispatch(&Msg); + + if (Msg.Result == HTCLIENT && Msg.XPos > Left + 10 && Msg.XPos < + Left + Width - 20 && Msg.YPos < Top + 24) + Msg.Result = HTCAPTION; +} +//--------------------------------------------------------------------------- + +void TUpdateForm::ShowMSG() +{ + TRect rtDownload; + String strNew; + strNew.sprintf( L"°汾%d.%d.%d.%d", + g_infoSoftwareUpdate.version.majorVersion, + g_infoSoftwareUpdate.version.minorVersion, + g_infoSoftwareUpdate.version.modifyVersion, + g_infoSoftwareUpdate.version.buildVersion ); + + if( g_infoSoftwareUpdate.version.majorVersion==0 ) + strNew += L" ԰"; + else + strNew += L" ʽ"; + + m_lbNewVer->Caption = strNew.c_str(); + + int wMaj, wMin, wMod, wBld; + sscanf( g_strCurrentVersion, "%d.%d.%d.%d", &wMaj, &wMin, &wMod, &wBld ); + string strCurrent = "ǰ汾"; + strCurrent += g_strCurrentVersion; + + if( wMaj==0 ) + strCurrent += " ԰"; + else + strCurrent += " ʽ"; + + m_lbCurrentVer->Caption = strCurrent.c_str(); + + string sDescribe = UTF8ToMBCS( g_infoSoftwareUpdate.strDescribe ); + String strResource = sDescribe.c_str(); + String strTemp; + int ibg = 1; + int i = 1; + for( i = 1; i < strResource.Length(); i++){ + if(strResource[i]=='\n'){ + if(i!=ibg){ + strTemp = strResource.SubString( ibg,i-ibg ); + ItemStr.push_back( strTemp ); + }else{ + strTemp = "\n" ; + ItemStr.push_back( strTemp ); + } + ibg = i; + } + } + + if(i > ibg){ + strTemp = strResource.SubString( ibg,i-ibg ); + ItemStr.push_back( strTemp ); + } + + if( g_bUpdateMandatory ){ + m_lbDownloadMsg->Font->Color = RGB( 207,15,15 );//RGB( 126,177,205 );//clRed; + m_lbDownloadMsg->Caption = "ǰ汾£û޷\n°汾" ; + } + else{ + m_lbDownloadMsg->Font->Color = RGB( 184,189,188 );//RGB( 160,183,183 );//clBlack; + m_lbDownloadMsg->Top += 8; + m_lbDownloadMsg->Caption = "µİ汾ѷ,¡" ; + } +} +//--------------------------------------------------------------------------- + + +void __fastcall TUpdateForm::m_lbDownloadMouseEnter(TObject *Sender) +{ + Screen->Cursor = crHandPoint; + m_lbDownload->Font->Color = RGB( 70,150,236 ); +} +//--------------------------------------------------------------------------- + +void __fastcall TUpdateForm::m_lbDownloadMouseLeave(TObject *Sender) +{ + Screen->Cursor = crDefault; + m_lbDownload->Font->Color = RGB( 67,117,233 ); +} +//--------------------------------------------------------------------------- + +void __fastcall TUpdateForm::m_lbDownloadClick(TObject *Sender) +{ + char strURL[256]; + f_CS_GetWebPageURL( URL_SOFTWARE, strURL ); + strcat( strURL, "?id=3&os=pc" ); + + ShellExecute(Handle,NULL, ((String)strURL).c_str(), NULL,NULL,SW_SHOWNORMAL); + Close(); +} +//--------------------------------------------------------------------------- + +void __fastcall TUpdateForm::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) +{ + switch( Key ){ + case VK_RETURN: + return m_lbDownloadClick(NULL); + break; + + case VK_ESCAPE: + ModalResult = mrCancel; + break; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TUpdateForm::PaintBoxPaint(TObject *Sender) +{ + ((TPaintBox*)Sender)->Canvas->Brush->Color = RGB( 43,47,50 ); //ɫ + ((TPaintBox*)Sender)->Canvas->FrameRect( ((TPaintBox*)Sender)->ClientRect ); +} +//--------------------------------------------------------------------------- + + +#define TOP_BUTTON 10 +#define LEFT_RIGHT 10 +#define STR_H_D 20 //20 +#define STR_H_H 20 +vector< String > LineStr; +//--------------------------------------------------------------------------- +__fastcall TUpdateContenPanel::TUpdateContenPanel( TComponent* Owner ) + : Vcl::Extctrls::TPanel( Owner ) +{ + m_ScrollBar = NULL; + TopLine =0; + ShowLine = 1; +} +//--------------------------------------------------------------------------- + +void __fastcall TUpdateContenPanel::CreateWnd() +{ + Vcl::Extctrls::TPanel::CreateWnd(); + Canvas->Font->Name = g_strTxtFontName; + Canvas->Font->Size = g_szFont9; + + for( int i=0;ItemStr.size()>0 && iTextWidth(ItemStr[i]) >= Width-2*LEFT_RIGHT ){ + int ibg=1; + int j=1; + int Leng = ItemStr[i].Length(); + String strr1 = ""; + + for( j=1;jTextWidth( strr1 ) >= (Width - 2*LEFT_RIGHT)-5 ){ + LineStr.push_back( strr1 ); + OutputDebugString((strr1 + "-111--------------").c_str()); + ibg = j; + } + } + + strr1 = ItemStr[i].SubString( ibg,j-ibg+1 ); + LineStr.push_back( strr1 ); + OutputDebugString((strr1 + "--222-------------").c_str()); + } + else{ + String strr1 = ItemStr[i]; + LineStr.push_back( ItemStr[i] ); + OutputDebugString((ItemStr[i] + "-333--------------").c_str()); + } + } + + ShowLine = (Height - 2*TOP_BUTTON)/STR_H_D; + + if( LineStr.size()>ShowLine ){ + m_ScrollBar = new TSkinScrollBar(this); + m_ScrollBar->m_pWndCtrl = this; + m_ScrollBar->Parent = this; + m_ScrollBar->Left = Width - m_ScrollBar->Width - 1; + m_ScrollBar->Top = 1; + m_ScrollBar->Height = Height-2; + m_ScrollBar->SetRange( 0,LineStr.size()-1 ); + m_ScrollBar->SetPageSize(ShowLine); + m_ScrollBar->SetPosition( TopLine ); + m_ScrollBar->Visible = true; + } +} +//--------------------------------------------------------------------------- + +__fastcall TUpdateContenPanel::~TUpdateContenPanel() +{ + if( m_ScrollBar ){ + delete m_ScrollBar; + m_ScrollBar = NULL; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TUpdateContenPanel::WMEraseBkgnd(TWMEraseBkgnd &Message) +{ + TRect rect = GetClientRect(); + + TCanvas* tempCanvas = new TCanvas; + tempCanvas->Handle = Message.DC; + + tempCanvas->Brush->Color = RGB( 58,63,69 ); //ɫ + tempCanvas->FillRect( rect ); + + tempCanvas->Brush->Color = RGB( 43,47,50 ); //߿ + tempCanvas->FrameRect( rect ); + + delete tempCanvas; + tempCanvas = NULL; +} + +void __fastcall TUpdateContenPanel::WMVScroll(Winapi::Messages::TWMScroll &Message) +{ + int minpos, maxpos, page, curpos; + m_ScrollBar->GetScrollRange(&minpos, &maxpos); + page = m_ScrollBar->GetPageSize(); + // Get the current position of scroll box. + curpos = m_ScrollBar->GetScrollPos(); + + // Determine the new position of scroll box. + switch (Message.ScrollCode) + { + case SB_TOP: // Scroll to far top. + curpos = minpos; + break; + + case SB_BOTTOM: // Scroll to far bottom. + curpos = maxpos-page+1; + break; + + case SB_ENDSCROLL: // End scroll. + break; + + case SB_LINEUP: // Scroll left. + if (curpos > minpos) + curpos--; + break; + + case SB_LINEDOWN: // Scroll right. + if (curpos < maxpos-page+1) + curpos++; + break; + + case SB_PAGEUP: // Scroll one page left. + if (curpos > minpos) + curpos = (minpos > curpos-page) ? minpos : curpos-page; + //max(minpos, curpos-page); + break; + + case SB_PAGEDOWN: // Scroll one page right. + if( curposHandle ){ + m_ScrollBar->SetPosition(curpos); +// Paint(); + } + if( TopLine != curpos ){ + TopLine = curpos; + Invalidate(); + } + + Message.Result = true; +} +//--------------------------------------------------------------------------- + +void __fastcall TUpdateContenPanel::WMMouseWheel(TWMMouseWheel &Message) +{ + if( m_ScrollBar->Visible ){ + UINT nSBCode; + + if( Message.WheelDelta>0 ) nSBCode = SB_LINEUP; + else nSBCode = SB_LINEDOWN; + + Perform( WM_VSCROLL, MAKELONG(nSBCode,0), NULL ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TUpdateContenPanel::Paint(void) +{ + Canvas->Brush->Style = bsClear; + Canvas->Font->Color = RGB( 184,189,188 ); //Contentɫ + int ContentHeight=0; +// int iShowLine = 0; + for( int i=TopLine;LineStr.size()>0 && iTextOutW( LEFT_RIGHT,TOP_BUTTON + ContentHeight, LineStr[i] ); + ContentHeight +=STR_H_H; + //ȡַ + /* + if( Canvas->TextWidth(ItemStr[i]) >= Width-2*LEFT_RIGHT ){ + int ibg=1; + int j=1; + int Leng = ItemStr[i].Length(); + String strr1 = ""; + + for( j=1;jTextWidth( strr1 ) >= (Width - 2*LEFT_RIGHT)-5 ){ + + if( iShowLineTextOutW( LEFT_RIGHT,TOP_BUTTON + ContentHeight, strr1 ); + + ContentHeight +=STR_H_H; + iShowLine++; + ibg = j; + } + } + } + if( iShowLineTextOutW( LEFT_RIGHT,TOP_BUTTON + ContentHeight, strr1 ); + + ContentHeight +=STR_H_D; + iShowLine++; + } + } + else{ + if( iShowLineTextOutW( LEFT_RIGHT,TOP_BUTTON + ContentHeight, ItemStr[i] ); + ContentHeight += STR_H_D; + iShowLine++; + } + } */ + } + +} +//--------------------------------------------------------------------------- + + + diff --git a/UpdateFormUnit.dfm b/UpdateFormUnit.dfm new file mode 100644 index 0000000..a51ca6f --- /dev/null +++ b/UpdateFormUnit.dfm @@ -0,0 +1,132 @@ +object UpdateForm: TUpdateForm + Left = 0 + Top = 0 + ParentCustomHint = False + Anchors = [akLeft, akTop, akRight, akBottom] + BorderIcons = [] + BorderStyle = bsNone + Caption = 'UpdateForm' + ClientHeight = 400 + ClientWidth = 420 + Color = clWindow + Ctl3D = False + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + KeyPreview = True + Position = poMainFormCenter + Scaled = False + OnCreate = FormCreate + OnKeyDown = FormKeyDown + TextHeight = 13 + object m_panBk: TGeneralDialogPanel + Left = 0 + Top = 0 + Width = 420 + Height = 400 + Caption = #29256#26412#26356#26032 + Color = 5064257 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentBackground = False + ParentFont = False + TabOrder = 0 + object PaintBox1: TPaintBox + Left = 10 + Top = 43 + Width = 176 + Height = 51 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + OnPaint = PaintBoxPaint + end + object PaintBox2: TPaintBox + Left = 200 + Top = 43 + Width = 211 + Height = 51 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + OnPaint = PaintBoxPaint + end + object m_lbCurrentVer: TLabel + Left = 21 + Top = 51 + Width = 160 + Height = 13 + AutoSize = False + Caption = 'm_lbCurrentVer' + Font.Charset = DEFAULT_CHARSET + Font.Color = 12434616 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object m_lbDownloadMsg: TLabel + Left = 215 + Top = 48 + Width = 180 + Height = 40 + ParentCustomHint = False + AutoSize = False + Color = clDefault + Font.Charset = DEFAULT_CHARSET + Font.Color = 13480318 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentColor = False + ParentFont = False + ParentShowHint = False + ShowAccelChar = False + ShowHint = False + end + object m_lbNewVer: TLabel + Left = 21 + Top = 72 + Width = 160 + Height = 13 + AutoSize = False + Caption = 'm_lbNewVer' + Font.Charset = DEFAULT_CHARSET + Font.Color = 12434616 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = False + end + object m_lbDownload: TLabel + Left = 347 + Top = 76 + Width = 48 + Height = 14 + Caption = #21069#24448#19979#36733 + Font.Charset = DEFAULT_CHARSET + Font.Color = 15299907 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [fsUnderline] + ParentFont = False + OnClick = m_lbDownloadClick + OnMouseEnter = m_lbDownloadMouseEnter + OnMouseLeave = m_lbDownloadMouseLeave + end + end +end diff --git a/UpdateFormUnit.h b/UpdateFormUnit.h new file mode 100644 index 0000000..027760f --- /dev/null +++ b/UpdateFormUnit.h @@ -0,0 +1,83 @@ +//--------------------------------------------------------------------------- + +#ifndef UpdateFormUnitH +#define UpdateFormUnitH +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include +#include +#include +#include "PNGButton.hpp" +#include +//#include "UpdateListBoxUnit.h" +#include "GeneralDialogPanel.h" +#include "SkinScrollBarUnit.h" +#include +//--------------------------------------------------------------------------- +class TUpdateContenPanel; + +class TUpdateForm : public TForm +{ +__published: // IDE-managed Components + TLabel *m_lbDownloadMsg; + TLabel *m_lbDownload; + TLabel *m_lbCurrentVer; + TLabel *m_lbNewVer; + TPaintBox *PaintBox1; + TPaintBox *PaintBox2; + TGeneralDialogPanel *m_panBk; + void __fastcall FormCreate(TObject *Sender); + void __fastcall m_lbDownloadMouseEnter(TObject *Sender); + void __fastcall m_lbDownloadMouseLeave(TObject *Sender); + void __fastcall m_lbDownloadClick(TObject *Sender); + void __fastcall FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift); + void __fastcall PaintBoxPaint(TObject *Sender); +private: // User declarations + TUpdateContenPanel *m_plUpdateMsg; + + + //Ϣ + void __fastcall WMNCHitTest(TWMNCHitTest &Msg); + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(WM_NCHITTEST, TWMNCHitTest, WMNCHitTest) + END_MESSAGE_MAP(TForm) +public: // User declarations + __fastcall TUpdateForm(TComponent* Owner); + + void ShowMSG(); +}; +//-------------------------------------------------- + +class TUpdateContenPanel : public Vcl::Extctrls::TPanel +{ +private: + int ShowLine; + int TopLine; + + TSkinScrollBar *m_ScrollBar; + + virtual void __fastcall CreateWnd(); + virtual void __fastcall Paint(void); + + MESSAGE void __fastcall WMEraseBkgnd(TWMEraseBkgnd &Message); + MESSAGE void __fastcall WMVScroll(Winapi::Messages::TWMScroll &Message); + MESSAGE void __fastcall WMMouseWheel(TWMMouseWheel &Message); + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(WM_ERASEBKGND, TWMEraseBkgnd, WMEraseBkgnd) + MESSAGE_HANDLER(WM_VSCROLL, TWMVScroll, WMVScroll) + MESSAGE_HANDLER(WM_MOUSEWHEEL, TWMMouseWheel, WMMouseWheel) + END_MESSAGE_MAP( Vcl::Extctrls::TPanel ) + +public: + + __fastcall TUpdateContenPanel( TComponent* Owner ); + __fastcall ~TUpdateContenPanel(); +}; +//--------------------------------------------------------------------------- +extern PACKAGE TUpdateForm *UpdateForm; +//--------------------------------------------------------------------------- +#endif diff --git a/UploadFormUnit.cpp b/UploadFormUnit.cpp new file mode 100644 index 0000000..fc06c09 --- /dev/null +++ b/UploadFormUnit.cpp @@ -0,0 +1,572 @@ +//--------------------------------------------------------------------------- +#include +#include "UploadFormUnit.h" +#pragma hdrstop + +#include "GlobalUnit.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +//#pragma link "PNGButton" +#pragma link "GeneralDialogPanel" +#pragma link "CapButton" +#pragma link "LineEdit" +#pragma link "TextButton" +#pragma link "ComboBoxComponent" +#pragma link "CKBox" +#pragma resource "*.dfm" + +#define MAX_TYPE 4 +#define MAX_STYLE 32 + +TUploadForm *UploadForm; + +#include "ImgCopperFormUnit.h" +#include "Project.h" +//--------------------------------------------------------------------------- + +__fastcall TUploadForm::TUploadForm(TComponent* Owner) + : TForm(Owner) +{ + m_iCheckCount = 0; + m_editCpjPrice->Enabled = false; +} +//--------------------------------------------------------------------------- +__fastcall TUploadForm::~TUploadForm() +{ + StopURLDownload(UrlDown_ImageCover); +} +//--------------------------------------------------------------------------- + +void __fastcall TUploadForm::FormCreate(TObject *Sender) +{ + m_pCBSex->AddItem(L""); + m_pCBSex->AddItem(L"Ů"); + m_pCBSex->AddItem(L""); + m_pCBSex->AddItem(L""); + m_pCBSex->Show(); + + m_editOriginal->Enabled = false; + m_pcbOriAmend->AddItem(L"ԭ"); + m_pcbOriAmend->AddItem(L"ı"); + m_pcbOriAmend->DefItemIndex = 0; + m_pcbOriAmend->Show(); + + Font->Color = RGB(156, 170, 189); + + m_cbTypes[0] = m_checkPop; + m_cbTypes[1] = m_checkFolk; + m_cbTypes[2] = m_checkRock; + m_cbTypes[3] = m_checkDance; + m_cbTypes[4] = m_checkJazz; + m_cbTypes[5] = m_checkBlues; + m_cbTypes[6] = m_checkSamba; + m_cbTypes[7] = m_checkClassic; + m_cbTypes[8] = m_checkWaltz; + m_cbTypes[9] = m_checkIndpent; + m_cbTypes[10] = m_checkCountry; + m_cbTypes[11] = m_checkOthers; + + if( strlen(g_infoSong.strSongName)==0 ) + sprintf( g_infoSong.strSongName, "untitle-%s-%d", + g_strTSName[g_iMelodyTimeSignature], + g_nMelodyTempo ); + m_editSongName->Text = g_infoSong.strSongName; + + if( strlen(g_infoSong.strSinger)==0 ) + strcpy( g_infoSong.strSinger, g_infoUser.strNickName ); + m_editSinger->Text = g_infoSong.strSinger; + + if( strlen(g_infoSong.strArranger)==0 ) + strcpy( g_infoSong.strArranger, g_infoUser.strNickName ); + m_editArranger->Text = g_infoSong.strArranger; + + if( strlen(g_infoSong.strLyricist)==0 ) + strcpy( g_infoSong.strLyricist, g_infoUser.strNickName ); + m_editLyricist->Text = g_infoSong.strLyricist; + + if( strlen(g_infoSong.strComposer)==0 ) + strcpy( g_infoSong.strComposer, g_infoUser.strNickName ); + m_editComposer->Text = g_infoSong.strComposer; + + m_editOriginal->Text = g_infoSong.strOriginal; + m_memoDescription->Text = g_infoSong.strDescription; + m_checkSubmit->Checked = g_infoSong.iSubmit; + + if( g_infoSong.iCreation==3 ){ + m_pcbOriAmend->DefItemIndex = 1; + m_editOriginal->Enabled = true; + } + + m_pCBSex->DefItemIndex = g_infoSong.iSingerType - 1; + + UINT aStyleIDs[MAX_STYLE]; + memset( aStyleIDs, 0, MAX_STYLE*sizeof(UINT) ); + + int count = 0; + for( int i=0; countaTracks.size(); j++ ){ + if( pStage->aTracks[j]->iStyleLoc==0 ){ + int id = pStage->aTracks[j]->iStyleId; + + bool bExist = false; + for( int j=0; j=MAX_STYLE ){ + break; + } + } + } + } + } + + if( memcmp( g_infoSong.aStyleIDs, aStyleIDs, MAX_STYLE*sizeof(UINT) ) ){ + memcpy( g_infoSong.aStyleIDs, aStyleIDs, MAX_STYLE*sizeof(UINT) ); + memset( g_infoSong.iMusicStyle, -1, MAX_TYPE ); + } + + if( g_infoSong.iMusicStyle[0]!=-1 ){ + for( int i=0; iChecked = true; + } + } + } + else{ + for( int i=0; m_iCheckCountpOrigin->detail.type[j]>=0 ){ + char iType = pStyle->pOrigin->detail.type[j]; + char iCB = iType; + if( iType>=MUSIC_TYPE_NUM-1 ){ + iCB = MUSIC_TYPE_NUM-1; + iType = 127; + } + + bool bFound = false; + for( int k=0; kChecked = true; + + if( m_iCheckCount>=MAX_TYPE ){ + break; + } + } + } + } + } + } + + m_editSongName->OnChange = EditNameChange; + m_editOriginal->OnChange = EditNameChange; + m_editSinger->OnChange = EditNameChange; + m_editArranger->OnChange = EditNameChange; + m_editLyricist->OnChange = EditNameChange; + m_editComposer->OnChange = EditNameChange; + + m_btnOk->Enabled = true; + + if( g_infoSong.strLyric ) { + m_memoLyrices->Text = g_infoSong.strLyric; + } + + String strCoverPath = g_strUserPath.c_str(); + strCoverPath += MUSIC_COVER_DIR; + if( g_infoSong.strIconName ) { + strCoverPath = g_infoSong.strIconName; + }else{ + strCoverPath += MUSIC_COVER_FILE; + } + if( SetMusicCover(strCoverPath) ) + m_strMusicCoverPath = strCoverPath; + + if( NULL==g_infoSong.strIconName ) { + + bool bDownloadMusicCover = false; + if( NULL==g_pTThreadMusciCover ) { + + bDownloadMusicCover = true; + + }else if( !g_pTThreadMusciCover->Started || + (g_pTThreadMusciCover->Started && g_pTThreadMusciCover->Finished) ) + { + bDownloadMusicCover = true; + } + + if( bDownloadMusicCover ){ + + SAFE_DELETE(g_pTThreadMusciCover) + g_pTThreadMusciCover = new TThreadMusciCover(true, this); + g_pTThreadMusciCover->Priority = tpIdle; + g_pTThreadMusciCover->Start(); + } + } + + SetTransparent( this ); +} +//--------------------------------------------------------------------------- + + +void __fastcall TUploadForm::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) +{ + switch( Key ){ + case VK_RETURN: //add by tj 2013/12/8 + if( m_btnOk->Enabled && + !m_memoDescription->Focused() && + !m_memoLyrices->Focused() ){ + OkClick( NULL ); + ModalResult = mrOk; + } + break; + + case VK_ESCAPE: + ModalResult = mrCancel; + break; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TUploadForm::OkClick(TObject *Sender) +{ + int nLength = 0; + + AnsiString strName = m_editSongName->Text.Trim(); + strcpy( g_infoSong.strSongName, strName.c_str() ); + + strName = m_editSinger->Text.Trim(); + strcpy( g_infoSong.strSinger, strName.c_str() ); + + strName = m_editOriginal->Text.Trim(); + strcpy( g_infoSong.strOriginal, strName.c_str() ); + + strName = m_editArranger->Text.Trim(); + strcpy( g_infoSong.strArranger, strName.c_str() ); + + strName = m_editLyricist->Text.Trim(); + strcpy( g_infoSong.strLyricist, strName.c_str() ); + + strName = m_editComposer->Text.Trim(); + strcpy( g_infoSong.strComposer, strName.c_str() ); + + strName = m_memoDescription->Text.Trim(); + strcpy( g_infoSong.strDescription, strName.c_str() ); + + g_infoSong.iCreation = m_pcbOriAmend->DefItemIndex?3:1; + g_infoSong.iSingerType = m_pCBSex->DefItemIndex + 1; + g_infoSong.iSubmit = m_checkSubmit->Checked; + + memset( g_infoSong.iMusicStyle, -1, MAX_TYPE ); + int count = 0; + for( int i=0; iChecked ){ + g_infoSong.iMusicStyle[count++] = m_cbTypes[i]->Tag; + } + } + + m_strLyrices = m_memoLyrices->Text; + SAFE_DELETE_ARRAY(g_infoSong.strLyric); + if( m_strLyrices.Length() ) { + nLength = strlen( wstr2str(m_strLyrices.c_str()).c_str() ); + g_infoSong.strLyric = new char[nLength+1]; + strcpy(g_infoSong.strLyric, wstr2str(m_strLyrices.c_str()).c_str()); + g_infoSong.strLyric[nLength] = '\0'; + } + + SAFE_DELETE_ARRAY(g_infoSong.strIconName); + if( m_strCopperPath.Length() || m_strMusicCoverPath.Length() ) { + if( m_strCopperPath.Length() ) { + nLength = strlen( wstr2str(m_strCopperPath.c_str()).c_str() ); + }else if( m_strMusicCoverPath.Length() ) { + nLength = strlen( wstr2str(m_strMusicCoverPath.c_str()).c_str() ); + } + + g_infoSong.strIconName = new char[nLength+1]; + + if( m_strCopperPath.Length() ) { + strcpy(g_infoSong.strIconName, wstr2str(m_strCopperPath.c_str()).c_str()); + }else if( m_strMusicCoverPath.Length() ) { + strcpy(g_infoSong.strIconName, wstr2str(m_strMusicCoverPath.c_str()).c_str()); + } + g_infoSong.strIconName[nLength] = '\0'; + } + + SAFE_DELETE_ARRAY(g_infoSong.strCpjName) + if( m_checkProject->Checked ) { + + String strCPJ = g_strUserPath.c_str(); + strCPJ += L"temp\\"; + + if(!DirectoryExists(strCPJ, false)) + ForceDirectories(strCPJ); + + strCPJ += m_editSongName->Text + L".cpj"; + wstring wStrCpjName = strCPJ.c_str(); + + if( wStrCpjName.size() ) { + nLength = strlen( wstr2str(wStrCpjName).c_str() ); + g_infoSong.strCpjName = new char[nLength+1]; + strcpy(g_infoSong.strCpjName, wstr2str(wStrCpjName).c_str()); + } + + if( m_editCpjPrice->Text.Length()==0 ) { + g_infoSong.cpjPrice = 0; + }else + g_infoSong.cpjPrice = StrToInt((m_editCpjPrice->Text)); + g_infoSong.cpjVersion = g_dwProjectVersion; + }else { + g_infoSong.strCpjName = NULL; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TUploadForm::EditNameChange(TObject *Sender) +{ + TLineEdit* pEdit = ((TLineEdit*)Sender); + + AnsiString strName = pEdit->Text.Trim(); + string strTmp = GBToUTF8(strName.c_str()); + + if( strTmp.length()>pEdit->MaxLength ){ + pEdit->OnChange = NULL; + pEdit->Text = pEdit->Text.SubString( 0, pEdit->Text.Length()-1 ); + pEdit->SelStart = pEdit->Text.Length(); + pEdit->OnChange = EditNameChange; + } + + if( pEdit==m_editSongName ){ + m_btnOk->Enabled = !pEdit->Text.Trim().IsEmpty(); + } +} +//--------------------------------------------------------------------------- + + +void __fastcall TUploadForm::CheckBoxClick(TObject *Sender) +{ + for( int k=0; kTag; + bool bChecked = ((TCKBox*)Sender)->Checked; + + if( bChecked ){ + if( m_iCheckCount==MAX_TYPE ){ + ((TCKBox*)Sender)->Checked = false; + } + else{ + for( int k=0; kChecked = true; + } + } +} +//--------------------------------------------------------------------------- + +void __fastcall TUploadForm::m_pcbOriAmendChange(TComboBoxItem *Sender, int Index) +{ + if( Index==1 ){ + m_editOriginal->Enabled = true; + } + else{ + m_editOriginal->Enabled = false; + m_editOriginal->Text = L""; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TUploadForm::MemoChange(TObject *Sender) +{ + // BKGMemoUnit::TMemo* memo = ((BKGMemoUnit::TMemo*)Sender); + TMemo* memo = (TMemo*)Sender; + + AnsiString strName = memo->Text.Trim(); + string strTmp = GBToUTF8(strName.c_str()); + if( strTmp.length()>memo->MaxLength ){ + memo->OnChange = NULL; + memo->Text = memo->Text.SubString( 0, memo->Text.Length()-1 ); + memo->SelStart = memo->Text.Length(); + memo->OnChange = MemoChange; + } +} +//--------------------------------------------------------------------------- +void __fastcall TUploadForm::m_memoLyricesChange(TObject *Sender) +{ + if( m_memoLyrices->Lines->Count>8 ) { + m_memoLyrices->ScrollBars = ssVertical; + }else{ + m_memoLyrices->ScrollBars = ssNone; + } +} +//--------------------------------------------------------------------------- +void __fastcall TUploadForm::m_ImgCoverClick(TObject *Sender) +{ + TPicture *pPic = new TPicture(); + TPicture *pPicDraw = new TPicture(); + TBitmap *pBmp = new TBitmap(); + pBmp->SetSize(260, 260); + if( m_strCopperPath.Length() ){ + + pPicDraw->LoadFromFile( m_strCopperPath ); + pBmp->Canvas->StretchDraw(TRect(0, 0, 260, 260), pPicDraw->Graphic); + + }else if( m_strMusicCoverPath.Length() ) { + + pPicDraw->LoadFromFile( m_strMusicCoverPath ); + pBmp->Canvas->StretchDraw(TRect(0, 0, 260, 260), pPicDraw->Graphic); + + }else{ + + pBmp->LoadFromResourceName(int(HInstance), L"music_cover_default"); + } + + pPic->Bitmap = pBmp; + SAFE_DELETE(pBmp) + + TImgCopperForm *pTImgCopperForm = new TImgCopperForm(this, TRect(0, 0, 260, 260), pPic); + pTImgCopperForm->Width = 340; + pTImgCopperForm->Height = 420; + + if( mrOk==pTImgCopperForm->ShowModal() ) { + + m_strCopperPath = g_strUserPath.c_str(); + m_strCopperPath += MUSIC_COVER_DIR; + m_strCopperPath += MUSIC_COVER_COPPER; + + CopyFile(pTImgCopperForm->m_strCopperPath.c_str(), + m_strCopperPath.c_str(), false); + + SetMusicCover(m_strCopperPath); + } + + SAFE_DELETE(pTImgCopperForm) + SAFE_DELETE(pPic) + SAFE_DELETE(pPicDraw) +} +//--------------------------------------------------------------------------- + +bool __fastcall TUploadForm::SetMusicCover(String &strCoverPath) +{ + bool bSucess = false; + + if( FileExists( strCoverPath ) ) { + + TMemoryStream *memoryStream = new TMemoryStream(); + memoryStream->Position = 0; + memoryStream->LoadFromFile(strCoverPath); + + if( !GetPicType(strCoverPath, memoryStream, true) ){ + SAFE_DELETE(memoryStream) + }else { + + TPicture *pTPicture = new TPicture(); + try{ + pTPicture->LoadFromFile(strCoverPath); + }catch(Exception &e){ + SAFE_DELETE(pTPicture) + SAFE_DELETE(memoryStream) + } + + if( pTPicture ) { + + m_ImgCover->Picture = pTPicture; + SAFE_DELETE(pTPicture) + bSucess = true; + } + } + + SAFE_DELETE(memoryStream) + } + + return bSucess; +} +//--------------------------------------------------------------------------- +void __fastcall TUploadForm::onUM_MUSICCOVER(TMessage & Msg) +{ + if( !m_strCopperPath.Length() ) { + + String strCoverPath = g_strUserPath.c_str(); + strCoverPath += MUSIC_COVER_DIR; + strCoverPath += MUSIC_COVER_FILE; + if( SetMusicCover(strCoverPath) ) + m_strMusicCoverPath = strCoverPath; + SAFE_DELETE(g_pTThreadMusciCover) + } +} +//--------------------------------------------------------------------------- +void __fastcall TUploadForm::ProjectClick(TObject *Sender) +{ + if( m_checkProject->Checked ) { + m_editCpjPrice->Enabled = true; +// m_editCpjPrice->Color = clWindow; +// m_editCpjPrice->Visible = true; +// m_lbPrice->Visible = true; +// m_lbSpriceDes->Visible = true; + }else { + m_editCpjPrice->Enabled = false; +// m_editCpjPrice->Color = clInactiveCaption; +// m_editCpjPrice->Visible = false; +// m_lbPrice->Visible = false; +// m_lbSpriceDes->Visible = false; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TUploadForm::m_editCpjPriceChange(TObject *Sender) +{ + int nLength = m_editCpjPrice->Text.Length(); + if( nLength==0 ) { + return; + } + + for( int i=1; i<=nLength; i++ ) { + int index = i; + if( !TryStrToInt(m_editCpjPrice->Text, index) ) { + m_editCpjPrice->Text = L"0"; + m_btnOk->Enabled = true; + return; + } + } + + int nPrice = StrToInt((m_editCpjPrice->Text)); + if( nPrice==0 || (nPrice>=100 && nPrice<=9999) ) + m_btnOk->Enabled = true; + else + m_btnOk->Enabled = false; +} +//--------------------------------------------------------------------------- + diff --git a/UploadFormUnit.dfm b/UploadFormUnit.dfm new file mode 100644 index 0000000..254e7aa --- /dev/null +++ b/UploadFormUnit.dfm @@ -0,0 +1,7030 @@ +object UploadForm: TUploadForm + Left = 0 + Top = 0 + ParentCustomHint = False + BorderStyle = bsNone + Caption = 'MessageForm' + ClientHeight = 511 + ClientWidth = 420 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + KeyPreview = True + OldCreateOrder = False + Position = poMainFormCenter + Scaled = False + OnCreate = FormCreate + OnKeyDown = FormKeyDown + PixelsPerInch = 96 + TextHeight = 13 + object m_GPanelBKG: TGeneralDialogPanel + Left = 0 + Top = 0 + Width = 420 + Height = 509 + Caption = #22635#20889#27468#26354#20449#24687 + Color = 5064257 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentBackground = False + ParentFont = False + TabOrder = 0 + object m_lblArranger: TLabel + Left = 30 + Top = 128 + Width = 27 + Height = 13 + Caption = #32534' '#26354 + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentFont = False + ShowAccelChar = False + end + object m_lblComposer: TLabel + Left = 159 + Top = 167 + Width = 27 + Height = 13 + Caption = #20316' '#26354 + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentFont = False + end + object m_lblDescription: TLabel + Left = 30 + Top = 262 + Width = 30 + Height = 26 + ParentCustomHint = False + Caption = #21019' '#20316' '#28789' '#24863 + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentFont = False + ParentShowHint = False + ShowAccelChar = False + ShowHint = False + WordWrap = True + end + object m_lblLyricist: TLabel + Left = 30 + Top = 167 + Width = 27 + Height = 13 + Caption = #20316' '#35789 + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentFont = False + ShowAccelChar = False + end + object m_lblMusicType: TLabel + Left = 30 + Top = 207 + Width = 27 + Height = 13 + Hint = #27468#26354#39118#26684#12290#26368#22810#21487#36873'4'#31181 + ParentCustomHint = False + Caption = #26354' '#39118 + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentFont = False + ParentShowHint = False + ShowAccelChar = False + ShowHint = True + end + object m_lblOriginal: TLabel + Left = 159 + Top = 128 + Width = 27 + Height = 13 + Caption = #21407' '#21809 + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentFont = False + end + object m_lblSex: TLabel + Left = 159 + Top = 91 + Width = 27 + Height = 13 + Caption = #24615' '#21035 + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentFont = False + end + object m_lblSinger: TLabel + Left = 30 + Top = 91 + Width = 27 + Height = 13 + Caption = #28436' '#21809 + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentFont = False + end + object m_lblSongName: TLabel + Left = 30 + Top = 50 + Width = 36 + Height = 13 + Caption = #27468#26354#21517 + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentFont = False + end + object m_btnOk: TTextButton + Left = 275 + Top = 474 + Width = 52 + Height = 27 + ModalResult = mrOk + ParentShowHint = False + ShowHint = True + OnClick = OkClick + Enabled = False + Text = #30830#23450 + end + object m_btnCancel: TTextButton + Left = 340 + Top = 474 + Width = 52 + Height = 27 + ModalResult = mrCancel + ParentShowHint = False + ShowHint = True + Text = #21462#28040 + end + object m_pCBSex: TComboBoxComponent + Left = 203 + Top = 86 + Width = 62 + Height = 23 + ParentShowHint = False + ShowHint = True + ShowItemCount = 5 + Parent = m_GPanelBKG + end + object m_pcbOriAmend: TComboBoxComponent + Left = 327 + Top = 46 + Width = 65 + Height = 23 + ParentShowHint = False + ShowHint = True + OnChange = m_pcbOriAmendChange + ShowItemCount = 5 + Parent = m_GPanelBKG + end + object m_lbLyrices: TLabel + Left = 30 + Top = 320 + Width = 27 + Height = 13 + Caption = #27468' '#35789 + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentFont = False + end + object m_ImgCover: TImage + Left = 292 + Top = 86 + Width = 100 + Height = 100 + Cursor = crHandPoint + Hint = #32534#36753#23553#38754 + ParentShowHint = False + Picture.Data = { + 07544269746D617066180300424D661803000000000036000000280000000401 + 000004010000010018000000000030180300130B0000130B0000000000000000 + 0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFE + FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE + FEFEFFFFFFFFFFFFFEFEFEFEFEFEFDFDFDFDFDFDFDFDFDFDFDFDFEFEFEFEFEFE + FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFEFEFEFEFEFEFDFD + FDFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFDFDFDFDFDFD + FCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFBFBFBFBFBFBFBFBFBFAFA + FAF9F9F9F9F9F9F8F8F8F8F8F8F8F8F8F9F9F9F9F9F9FCFCFCFCFCFCFCFCFCFD + FDFDFDFDFDFDFDFDFDFDFDFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFE + FEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFEFEFEFDFDFDFDFDFDFDFDFDFCFCFCFCFCFCFCFCFC + FBFBFBFBFBFBFAFAFAF9F9F9F8F8F8F8F8F8F6F6F6F6F6F6F6F6F6F6F6F6F5F5 + F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F4F4F4F4F4F4F5F5F5F5F5F5F5 + F5F5F7F7F7F7F7F7F7F7F7F8F8F8F8F8F8F9F9F9F9F9F9F9F9F9FBFBFBFBFBFB + FCFCFCFCFCFCFDFDFDFDFDFDFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFEFEFEFEFEFEFE + FEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDFCFCFCFCFCFCFBFBFBFAFAFAF9F9F9 + F8F8F8F7F7F7F7F7F7F6F6F6F5F5F5F4F4F4F3F3F3F2F2F2F1F1F1F1F1F1EEEE + EEEEEEEEEEEEEEEDEDEDEDEDEDEDEDEDECECECECECECEEEEEEEDEDEDEDEDEDED + EDEDEDEDEDEDEDEDEEEEEEEFEFEFEFEFEFEFEFEFF0F0F0F1F1F1F2F2F2F2F2F2 + F3F3F3F3F3F3F5F5F5F5F5F5F6F6F6F7F7F7F8F8F8F9F9F9FAFAFAFAFAFAFDFD + FDFDFDFDFDFDFDFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFE + FEFEFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFDFDFDFCFCFCFCFCFCFBFBFBFAFAFA + F9F9F9F7F7F7F6F6F6F4F4F4F3F3F3F2F2F2F0F0F0F0F0F0EFEFEFEDEDEDECEC + ECEAEAEAE9E9E9E9E9E9E7E7E7E7E7E7E6E6E6E6E6E6E5E5E5E5E5E5E4E4E4E4 + E4E4E2E2E2E2E2E2E1E1E1E1E1E1E2E2E2E2E2E2E3E3E3E4E4E4E7E7E7E8E8E8 + E9E9E9EAEAEAEBEBEBECECECEDEDEDEEEEEEEFEFEFEFEFEFF1F1F1F2F2F2F4F4 + F4F5F5F5F7F7F7F7F7F7F9F9F9FAFAFAFAFAFAFBFBFBFCFCFCFDFDFDFEFEFEFE + FEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFEFEFEFEFEFEFDFDFDFDFDFDFEFEFEFEFEFEFDFDFDFBFBFBFAFAFAF9F9F9 + F8F8F8F7F7F7F7F7F7F6F6F6F4F4F4F2F2F2F0F0F0EEEEEEEDEDEDECECECE8E8 + E8E8E8E8E6E6E6E4E4E4E3E3E3E1E1E1DFDFDFDFDFDFDEDEDEDDDDDDDDDDDDDC + DCDCDBDBDBDADADADADADAD9D9D9D9D9D9D8D8D8D8D8D8D8D8D8D9D9D9DADADA + DBDBDBDBDBDBDDDDDDDEDEDEDFDFDFE0E0E0E2E2E2E3E3E3E5E5E5E5E5E5E7E7 + E7E8E8E8E9E9E9EBEBEBEEEEEEF0F0F0F1F1F1F2F2F2F3F3F3F4F4F4F5F5F5F6 + F6F6F8F8F8FAFAFAFBFBFBFCFCFCFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFDFDFDFCFCFCFCFCFCFCFCFCFBFBFB + F9F9F9F7F7F7F5F5F5F3F3F3F1F1F1F1F1F1EEEEEEEDEDEDEBEBEBE9E9E9E6E6 + E6E4E4E4E2E2E2E1E1E1DCDCDCDBDBDBD9D9D9D7D7D7D5D5D5D3D3D3D2D2D2D1 + D1D1CFCFCFCFCFCFCECECECDCDCDCCCCCCCBCBCBCBCBCBCACACACBCBCBCBCBCB + CBCBCBCCCCCCCCCCCCCDCDCDCECECECFCFCFCECECECECECED0D0D0D2D2D2D4D4 + D4D5D5D5D7D7D7D7D7D7DBDBDBDCDCDCDEDEDEE0E0E0E3E3E3E5E5E5E7E7E7E8 + E8E8EBEBEBECECECEEEEEEF0F0F0F3F3F3F5F5F5F7F7F7F8F8F8FAFAFAFBFBFB + FBFBFBFCFCFCFDFDFDFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFDFDFDFCFCFC + FCFCFCFBFBFBFAFAFAF8F8F8F7F7F7F4F4F4F1F1F1EFEFEFEDEDEDECECECE5E5 + E5E4E4E4E2E2E2DFDFDFDCDCDCDADADAD8D8D8D6D6D6D1D1D1D0D0D0CECECECC + CCCCCACACAC8C8C8C6C6C6C5C5C5C2C2C2C2C2C2C1C1C1C0C0C0BFBFBFBEBEBE + BEBEBEBDBDBDBBBBBBBBBBBBBBBBBBBBBBBBBCBCBCBDBDBDBEBEBEBFBFBFC1C1 + C1C1C1C1C3C3C3C5C5C5C7C7C7C9C9C9CACACACBCBCBD0D0D0D1D1D1D3D3D3D6 + D6D6D8D8D8DBDBDBDDDDDDDEDEDEE6E6E6E7E7E7E9E9E9ECECECEFEFEFF1F1F1 + F3F3F3F5F5F5F7F7F7F8F8F8F9F9F9FAFAFAFBFBFBFCFCFCFDFDFDFDFDFDFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFDFDFDFDFDFDFEFEFEFFFFFFFEFEFEFDFDFDFDFDFDFDFDFD + FCFCFCFBFBFBF9F9F9F7F7F7F6F6F6F5F5F5F4F4F4F3F3F3F0F0F0EEEEEEECEC + ECE9E9E9E4E4E4E1E1E1E1E1E1DBDBDBD6D6D6D4D4D4D0D0D0CACACAC7C7C7C8 + C8C8C6C6C6C3C3C3BEBEBEBCBCBCBABABAB9B9B9B7B7B7B5B5B5B3B3B3B4B4B4 + AFAFAFACACACB0B0B0ADADADA9A9A9ACACACABABABAAAAAAA9A9A9AAAAAAADAD + ADAFAFAFB0B0B0B0B0B0B2B2B2B2B2B2B1B1B1B2B2B2B5B5B5B8B8B8BCBCBCBF + BFBFBFBFBFC2C2C2C7C7C7CBCBCBCDCDCDCECECED0D0D0D1D1D1D6D6D6D9D9D9 + DEDEDEE1E1E1E4E4E4E7E7E7E9E9E9EBEBEBEFEFEFF0F0F0F2F2F2F5F5F5F9F9 + F9FBFBFBFCFCFCFCFCFCFBFBFBFDFDFDFEFEFEFFFFFFFEFEFEFEFEFEFFFFFFFF + FFFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFEFEFEFCFCFCFBFBFBFBFBFBF9F9F9F7F7F7F4F4F4F2F2F2F1F1F1EAEA + EAE8E8E8E5E5E5E2E2E2DFDFDFDBDBDBD7D7D7D4D4D4CFCFCFCCCCCCCACACAC7 + C7C7C3C3C3BEBEBEBBBBBBBBBBBBB6B6B6B3B3B3AEAEAEABABABAAAAAAA7A7A7 + A3A3A3A0A0A09F9F9F9F9F9F9A9A9A9898989C9C9C9A9A9A9696969898989C9C + 9C9A9A9A9999999999999A9A9A9B9B9B9B9B9B9B9B9BA1A1A1A1A1A1A2A2A2A3 + A3A3A5A5A5A7A7A7AAAAAAADADADAFAFAFB1B1B1B3B3B3B5B5B5B8B8B8BDBDBD + C3C3C3C7C7C7C8C8C8CCCCCCD1D1D1D5D5D5D8D8D8DCDCDCDFDFDFE1E1E1E8E8 + E8E9E9E9ECECECEFEFEFF2F2F2F5F5F5F6F6F6F7F7F7FBFBFBFCFCFCFEFEFEFF + FFFFFEFEFEFEFEFEFFFFFFFFFFFFFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFEFEFE + FEFEFEFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFCFCFCF8F8F8F7F7F7F5F5F5F3F3F3F0F0 + F0EDEDEDEAEAEAE8E8E8E1E1E1DFDFDFDBDBDBD7D7D7D3D3D3CFCFCFCACACAC7 + C7C7C0C0C0BFBFBFBBBBBBB5B5B5AFAFAFABABABA8A8A8A7A7A7A4A4A4A0A0A0 + 9A9A9A9797979797979696969494949191918D8D8D9090908F8F8F8C8C8C8B8B + 8B8989898989898D8D8D87878786868685858586868688888889898989898989 + 89898A8A8A8C8C8C8F8F8F909090919191939393979797999999A0A0A0A2A2A2 + A6A6A6A9A9A9ACACACB0B0B0B5B5B5B8B8B8BBBBBBBEBEBEC3C3C3C9C9C9CDCD + CDD1D1D1D6D6D6D9D9D9E0E0E0E2E2E2E5E5E5E9E9E9EDEDEDF0F0F0F2F2F2F4 + F4F4F7F7F7F9F9F9FBFBFBFCFCFCFCFCFCFCFCFCFDFDFDFFFFFFFEFEFEFEFEFE + FEFEFEFFFFFFFFFFFFFEFEFEFDFDFDFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFEFEFEFCFCFCFCFCFCFCFCFCFBFBFBF9F9F9F7F7F7F4F4 + F4F1F1F1EEEEEEEBEBEBE8E8E8E4E4E4DFDFDFDDDDDDD8D8D8D5D5D5D0D0D0CC + CCCCC7C7C7C2C2C2BDBDBDB9B9B9B4B4B4B1B1B1A9A9A9A1A1A19D9D9D9C9C9C + 9898989595959393938E8E8E8989898585858484848383838181817F7F7F7B7B + 7B7B7B7B79797977777778787878787877777777777778787878787878787878 + 78787979797979797979797979797D7D7D7F7F7F808080818181818181828282 + 8585858888888A8A8A8D8D8D9191919494949898989C9C9CA0A0A0A3A3A3ABAB + ABAFAFAFB5B5B5BABABAC0C0C0C5C5C5CACACACECECED3D3D3D6D6D6DBDBDBE0 + E0E0E4E4E4E8E8E8EBEBEBEEEEEEF0F0F0F2F2F2F5F5F5F7F7F7F8F8F8F9F9F9 + FAFAFAFCFCFCFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFEFEFEFDFDFDFBFBFBFAFAFAF9F9 + F9F7F7F7F4F4F4F1F1F1F0F0F0ECECECE8E8E8E4E4E4E0E0E0DBDBDBD5D5D5D1 + D1D1CACACAC7C7C7C1C1C1BBBBBBB6B6B6B0B0B0ABABABA7A7A7A2A2A29C9C9C + 9595959191919191918F8F8F8888888282827F7F7F7E7E7E7D7D7D7C7C7C7A7A + 7A7777777373737070707474746E6E6E6A6A6A6A6A6A6D6D6D6E6E6E6B6B6B65 + 65656868686969696969696A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6D6D6D6E6E6E + 7070707171717373737575757979797C7C7C7F7F7F8080808383838585858888 + 888D8D8D9393939797979898989C9C9CA1A1A1A7A7A7ADADADB3B3B3B9B9B9BC + BCBCC3C3C3C7C7C7CDCDCDD2D2D2D7D7D7DBDBDBE0E0E0E3E3E3E9E9E9ECECEC + F0F0F0F3F3F3F5F5F5F7F7F7F9F9F9FBFBFBFDFDFDFEFEFEFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFDFDFDFDFDFDFEFE + FEFCFCFCFAFAFAF8F8F8F6F6F6F3F3F3EEEEEEEBEBEBE9E9E9E5E5E5DFDFDFDA + DADAD5D5D5CFCFCFC9C9C9C4C4C4BCBCBCB8B8B8B2B2B2ABABABA5A5A5A0A0A0 + 9B9B9B9797979090908989898585858484848282827B7B7B7373736F6F6F6E6E + 6E6E6E6E6C6C6C6A6A6A6767676565656565656666665E5E5E5F5F5F63636362 + 62625C5C5C5C5C5C6262626464645E5E5E606060616161626262616161616161 + 6262626363636363636363636363636464646666666868686969696969696C6C + 6C7070707474747878787A7A7A7C7C7C7E7E7E8080808888888C8C8C91919196 + 96969C9C9CA2A2A2A8A8A8ACACACB4B4B4BABABAC1C1C1C7C7C7CCCCCCD1D1D1 + D7D7D7DBDBDBE1E1E1E5E5E5E9E9E9EDEDEDF0F0F0F4F4F4F7F7F7FAFAFAFBFB + FBFBFBFBFDFDFDFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFE + FEFDFDFDFCFCFCFCFCFCFAFAFAF8F8F8F6F6F6F3F3F3F0F0F0EBEBEBE6E6E6E2 + E2E2DDDDDDD8D8D8D1D1D1CCCCCCC6C6C6C0C0C0B8B8B8B2B2B2ADADADA8A8A8 + A1A1A19B9B9B9595958F8F8F8A8A8A8787878181817A7A7A7676767676767070 + 706868686868687070706767676363635E5E5E5D5D5D6565657A7A7A959595A8 + A8A8BABABAC4C4C4D4D4D4DBDBDBD9D9D9E0E0E0F2F2F2FDFDFDFCFCFCFBFBFB + F6F6F6EEEEEEE3E3E3DADADAD4D4D4D1D1D1C4C4C4BCBCBCADADAD9C9C9C8A8A + 8A7676766565655A5A5A6161616262626464646565656868686D6D6D73737377 + 77777A7A7A7D7D7D8181818686868B8B8B9191919797979B9B9BA4A4A4AAAAAA + B2B2B2B8B8B8BEBEBEC4C4C4CBCBCBD0D0D0D5D5D5D9D9D9DEDEDEE3E3E3E8E8 + E8ECECECF1F1F1F3F3F3F7F7F7F8F8F8F9F9F9FBFBFBFDFDFDFEFEFEFEFEFEFE + FEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFEFEFEFEFEFEFDFDFDFCFCFCFCFCFCFBFBFBF5F5F5F3F3F3F0F0F0ED + EDEDE9E9E9E4E4E4DEDEDEDADADAD2D2D2CCCCCCC5C5C5BFBFBFB9B9B9B2B2B2 + AAAAAAA4A4A49D9D9D9898989191918A8A8A8484847F7F7F7A7A7A7777777373 + 736C6C6C6A6A6A6A6A6A6464646060606F6F6F848484A3A3A3B9B9B9D7D7D7EF + EFEFFBFBFBFEFEFEFEFEFEFEFEFEFEFEFEFBFBFBFEFEFEFEFEFEF8F8F8F8F8F8 + FDFDFDFBFBFBF7F7F7F9F9F9FAFAFAF9F9F9F7F7F7F5F5F5F5F5F5F5F5F5F5F5 + F5F4F4F4F3F3F3F3F3F3F3F3F3EEEEEEE5E5E5DFDFDFBDBDBDADADAD94949479 + 79796666665F5F5F6161616565656C6C6C6F6F6F7373737777777C7C7C818181 + 8787878B8B8B929292989898A0A0A0A7A7A7ADADADB3B3B3BBBBBBC0C0C0CACA + CACECECED4D4D4DADADADFDFDFE4E4E4E9E9E9ECECECF3F3F3F5F5F5F6F6F6F9 + F9F9FBFBFBFCFCFCFDFDFDFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFBFBFBFCFCFCFDFDFDFDFDFDFBFBFBF8F8F8F6F6F6F4 + F4F4F3F3F3EFEFEFEAEAEAE5E5E5E1E1E1DADADAD2D2D2CDCDCDC3C3C3C0C0C0 + B8B8B8AFAFAFA9A9A9A3A3A39A9A9A9191918D8D8D8585857E7E7E7A7A7A7878 + 787373736D6D6D6969696161616464646C6C6C848484B1B1B1E0E0E0FAFAFAFF + FFFFFFFFFFFFFFFFFEFEFEFEFEFEFEFEFEFEFEFEFDFDFDFDFDFDFCFCFCFCFCFC + FCFCFCFBFBFBFBFBFBFAFAFAFAFAFAFAFAFAF9F9F9F8F8F8F8F8F8F7F7F7F6F6 + F6F5F5F5F5F5F5F4F4F4F3F3F3F3F3F3F2F2F2F1F1F1F0F0F0EFEFEFEEEEEEEE + EEEEEDEDEDEDEDEDEEEEEEEBEBEBDDDDDDBDBDBD959595787878616161636363 + 6666666969696D6D6D7272727878787C7C7C8484848888888F8F8F9595959B9B + 9BA2A2A2ACACACB5B5B5BDBDBDC0C0C0C6C6C6CCCCCCD3D3D3DBDBDBE2E2E2E5 + E5E5EBEBEBEDEDEDF1F1F1F4F4F4F6F6F6F8F8F8FAFAFAFBFBFBFDFDFDFDFDFD + FDFDFDFEFEFEFEFEFEFFFFFFFFFFFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFDFDFDFDFDFDFDFDFDFC + FCFCF9F9F9F6F6F6F3F3F3F1F1F1E8E8E8E4E4E4DEDEDED9D9D9D4D4D4CDCDCD + C4C4C4BEBEBEB8B8B8AFAFAFA7A7A7A3A3A39B9B9B8F8F8F8888888888887F7F + 7F7878787373736F6F6F6666666161616C6C6C7F7F7FB4B4B4D4D4D4F4F4F4FF + FFFFFDFDFDFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFEFEFEFEFEFE + FDFDFDFDFDFDFCFCFCFCFCFCFCFCFCFBFBFBFBFBFBFAFAFAFAFAFAFAFAFAF9F9 + F9F8F8F8F8F8F8F7F7F7F6F6F6F5F5F5F5F5F5F4F4F4F3F3F3F3F3F3F2F2F2F1 + F1F1F0F0F0EFEFEFEEEEEEEEEEEEECECECEAEAEAE9E9E9EAEAEAECECECEDEDED + EBEBEBE8E8E8D4D4D4BABABA9595957474746363636363636A6A6A7070707272 + 727878787E7E7E8282828989899494949C9C9CA0A0A0A7A7A7AEAEAEB9B9B9C4 + C4C4C9C9C9CECECED5D5D5DEDEDEE5E5E5E8E8E8EDEDEDF1F1F1F4F4F4F7F7F7 + F9F9F9FBFBFBFCFCFCFCFCFCFDFDFDFDFDFDFEFEFEFEFEFEFEFEFEFEFEFEFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE + FEFEFCFCFCFBFBFBFAFAFAF8F8F8F5F5F5F0F0F0ECECECE9E9E9E0E0E0DBDBDB + D4D4D4CECECEC7C7C7BFBFBFB6B6B6B0B0B0A3A3A39C9C9C9595958F8F8F8787 + 877D7D7D7575757373736F6F6F6A6A6A606060636363848484BCBCBCEEEEEEFF + FFFFF8F8F8FFFFFFFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FEFEFEFEFEFEFEFEFEFEFEFEFDFDFDFDFDFDFCFCFCFCFCFCFCFCFCFBFBFBFBFB + FBFAFAFAFAFAFAFAFAFAF9F9F9F8F8F8F8F8F8F7F7F7F6F6F6F5F5F5F5F5F5F4 + F4F4F3F3F3F3F3F3F2F2F2F1F1F1F0F0F0EFEFEFEEEEEEEEEEEEEFEFEFEFEFEF + EDEDEDEBEBEBE8E8E8E6E6E6E7E7E7E9E9E9E7E7E7E7E7E7E5E5E5DEDEDEC9C9 + C9A3A3A37676765858586767676969697070707A7A7A7F7F7F8282828A8A8A93 + 93939D9D9DA0A0A0A9A9A9B4B4B4BABABABEBEBEC9C9C9D5D5D5D9D9D9DDDDDD + E3E3E3E9E9E9EEEEEEF2F2F2F6F6F6F9F9F9FAFAFAFBFBFBFCFCFCFDFDFDFEFE + FEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFFFFFFFFFFFFFE + FEFEFEFEFEFEFEFEFDFDFDFDFDFDF8F8F8F7F7F7F4F4F4F1F1F1EDEDEDE8E8E8 + E2E2E2DFDFDFD8D8D8D2D2D2CACACAC2C2C2BBBBBBB1B1B1A8A8A8A1A1A19696 + 969090908686867E7E7E7B7B7B7777776F6F6F676767616161787878ABABABE4 + E4E4FFFFFFFFFFFFFCFCFCFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFAFAFAFFFFFFFFFFFFFEFEFEFEFEFEFEFEFEFEFEFEFDFDFDFDFDFDFCFC + FCFCFCFCFCFCFCFBFBFBFBFBFBFAFAFAFAFAFAFAFAFAF9F9F9F8F8F8F8F8F8F7 + F7F7F6F6F6F5F5F5F5F5F5F4F4F4F3F3F3F3F3F3F2F2F2F1F1F1F0F0F0EFEFEF + EEEEEEEEEEEEECECECEEEEEEEEEEEEEDEDEDE9E9E9E7E7E7E7E7E7E8E8E8E7E7 + E7E5E5E5E4E4E4E5E5E5E5E5E5DEDEDED2D2D2C7C7C78A8A8A7171715F5F5F66 + 66667272727777777C7C7C8484848888888E8E8E979797A2A2A2ABABABB3B3B3 + BBBBBBC0C0C0CCCCCCD1D1D1D9D9D9E0E0E0E5E5E5EAEAEAEFEFEFF3F3F3F7F7 + F7F9F9F9FCFCFCFDFDFDFDFDFDFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFDFDFDFBFBFBFAFAFAF5F5F5F3F3F3 + EFEFEFEBEBEBE7E7E7E1E1E1DADADAD5D5D5CBCBCBC5C5C5BCBCBCB3B3B3AAAA + AAA1A1A19797979090908A8A8A8080807B7B7B7878786767675B5B5B7474749A + 9A9AD7D7D7EFEFEFFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFF9F9F9FAFAFAFFFFFF + FFFFFFFFFFFFFBFBFBF9F9F9FCFCFCFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFEFE + FEFEFEFEFDFDFDFDFDFDFCFCFCFCFCFCFCFCFCFBFBFBFBFBFBFAFAFAFAFAFAFA + FAFAF9F9F9F8F8F8F8F8F8F7F7F7F6F6F6F5F5F5F5F5F5F4F4F4F3F3F3F3F3F3 + F2F2F2F1F1F1F0F0F0EFEFEFEEEEEEEEEEEEECECECEAEAEAE8E8E8E7E7E7E7E7 + E7E6E6E6E4E4E4E3E3E3E0E0E0E1E1E1E2E2E2E4E4E4E4E4E4E3E3E3E1E1E1DF + DFDFE1E1E1D4D4D4AFAFAF8080806666666868686F6F6F6F6F6F7E7E7E868686 + 8F8F8F939393999999A4A4A4ADADADB1B1B1C0C0C0C7C7C7D0D0D0D7D7D7DDDD + DDE2E2E2E9E9E9EEEEEEF2F2F2F5F5F5F9F9F9FCFCFCFCFCFCFDFDFDFEFEFEFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFDFDFDFAFAFA + F8F8F8F6F6F6F3F3F3EFEFEFEAEAEAE5E5E5DFDFDFD8D8D8D0D0D0CACACABEBE + BEB7B7B7AEAEAEA4A4A49C9C9C9292928989898282827676767979796B6B6B5C + 5C5C767676B5B5B5ECECECFFFFFFFFFFFFFBFBFBF8F8F8FDFDFDFEFEFEFAFAFA + FCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFEFEFEFEFEFEFEFEFEFEFEFEFDFDFDFDFDFDFCFCFCFCFCFCFCFCFCFB + FBFBFBFBFBFAFAFAFAFAFAFAFAFAF9F9F9F8F8F8F8F8F8F7F7F7F6F6F6F5F5F5 + F5F5F5F4F4F4F3F3F3F3F3F3F2F2F2F1F1F1F0F0F0EFEFEFEEEEEEEEEEEEEFEF + EFEDEDEDECECECEDEDEDEFEFEFEEEEEEE9E9E9E5E5E5E7E7E7E6E6E6E4E4E4E0 + E0E0DCDCDCDADADADCDCDCDEDEDEDCDCDCD8D8D8DDDDDDDFDFDFBDBDBD878787 + 6767676565656969697373737E7E7E8585858B8B8B969696A1A1A1A8A8A8B3B3 + B3BABABAC4C4C4CDCDCDD3D3D3DADADAE2E2E2E8E8E8EBEBEBEFEFEFF5F5F5F8 + F8F8FAFAFAFBFBFBFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFE + FDFDFDFCFCFCFAFAFAF6F6F6F3F3F3F1F1F1EDEDEDE8E8E8E1E1E1DBDBDBD4D4 + D4CBCBCBC1C1C1B9B9B9AFAFAFA8A8A89F9F9F9595958D8D8D8484847B7B7B74 + 7474696969626262787878B4B4B4EDEDEDFFFFFFFDFDFDF4F4F4F6F6F6FEFEFE + FFFFFFF9F9F9F9F9F9FFFFFFFFFFFFFBFBFBFFFFFFFFFFFFFEFEFEFFFFFFFFFF + FFFFFFFFFEFEFEFDFDFDFFFFFFFFFFFFFEFEFEFEFEFEFEFEFEFEFEFEFDFDFDFD + FDFDFCFCFCFCFCFCFCFCFCFBFBFBFBFBFBFAFAFAFAFAFAFAFAFAF9F9F9F8F8F8 + F8F8F8F7F7F7F6F6F6F5F5F5F5F5F5F4F4F4F3F3F3F3F3F3F2F2F2F1F1F1F0F0 + F0EFEFEFEEEEEEEEEEEEEDEDEDEBEBEBE8E8E8E7E7E7E8E8E8E8E8E8E8E8E8E8 + E8E8E6E6E6E7E7E7E6E6E6E4E4E4E1E1E1E0E0E0E0E0E0E1E1E1DBDBDBE2E2E2 + DDDDDDD4D4D4DADADADFDFDFBFBFBF9393936D6D6D6767676868687474748080 + 808787878E8E8E9696969F9F9FA8A8A8B4B4B4BDBDBDC5C5C5CDCDCDD7D7D7DE + DEDEE3E3E3E8E8E8EFEFEFF3F3F3F5F5F5F7F7F7FAFAFAFDFDFDFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFDFDFDFCFCFCFCFCFCFAFAFAF7F7F7F3F3F3F0F0F0EEEEEEE7E7 + E7E1E1E1D9D9D9D1D1D1C9C9C9BFBFBFB3B3B3ABABAB9F9F9F9999998F8F8F86 + 86867E7E7E7575756C6C6C6666667E7E7EB9B9B9F0F0F0FFFFFFF8F8F8F8F8F8 + FBFBFBFAFAFAFDFDFDFEFEFEFEFEFEFCFCFCFCFCFCFEFEFEFFFFFFFEFEFEFBFB + FBFDFDFDFFFFFFFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFE + FEFEFEFEFEFEFEFEFDFDFDFDFDFDFCFCFCFCFCFCFCFCFCFBFBFBFBFBFBFAFAFA + FAFAFAFAFAFAF9F9F9F8F8F8F8F8F8F7F7F7F6F6F6F5F5F5F5F5F5F4F4F4F3F3 + F3F3F3F3F2F2F2F1F1F1F0F0F0EFEFEFEEEEEEEEEEEEEAEAEAECECECEDEDEDEC + ECECE9E9E9E6E6E6E6E6E6E6E6E6E1E1E1E1E1E1E2E2E2E2E2E2E2E2E2E0E0E0 + DDDDDDDBDBDBDCDCDCDCDCDCDBDBDBD9D9D9D8D8D8D8D8D8D6D6D6D3D3D3BEBE + BE9292926C6C6C6767677070707575757E7E7E8B8B8B8F8F8F999999A5A5A5B0 + B0B0B9B9B9C2C2C2CDCDCDD4D4D4DDDDDDE3E3E3EBEBEBF0F0F0F2F2F2F4F4F4 + F8F8F8FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFDFDFDFCFCFCFBFBFBF8F8F8F4F4 + F4EFEFEFE9E9E9E5E5E5E0E0E0D3D3D3CDCDCDC7C7C7B8B8B8AFAFAFA9A9A99D + 9D9D9191918A8A8A8484847D7D7D6C6C6C626262858585BCBCBCF7F7F7F8F8F8 + F8F8F8F9F9F9FAFAFAFBFBFBFBFBFBFBFBFBFCFCFCFCFCFCFCFCFCFDFDFDFDFD + FDFEFEFEFEFEFEFFFFFFFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFEFEFEFEFEFEFEFEFEFEFEFEFDFDFDFDFDFDFDFDFDFDFDFD + FDFDFDFCFCFCFBFBFBFBFBFBFBFBFBFAFAFAF9F9F9F8F8F8F8F8F8F7F7F7F6F6 + F6F5F5F5F5F5F5F4F4F4F3F3F3F2F2F2F1F1F1F0F0F0EFEFEFEEEEEEEDEDEDED + EDEDECECECEBEBEBEAEAEAE9E9E9E7E7E7E6E6E6E5E5E5E5E5E5E4E4E4E4E4E4 + E3E3E3E1E1E1E0E0E0DFDFDFDEDEDEDDDDDDDBDBDBDBDBDBDADADAD9D9D9D8D8 + D8D7D7D7D6D6D6D6D6D6D0D0D0D9D9D9C8C8C89696966C6C6C6565657373737F + 7F7F8282828989899494949F9F9FA9A9A9B3B3B3BFBFBFC7C7C7CECECED6D6D6 + E0E0E0E7E7E7EBEBEBF0F0F0F6F6F6FBFBFBFBFBFBFBFBFBFCFCFCFDFDFDFEFE + FEFFFFFFFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFFFFFFFFFFFFFEFEFEFDFDFDFBFB + FBF9F9F9F7F7F7F3F3F3EEEEEEE8E8E8E1E1E1DCDCDCCCCCCCCDCDCDC7C7C7B5 + B5B5A8A8A8A6A6A69C9C9C8888888181817D7D7D7373736262626E6E6EB0B0B0 + ECECECF8F8F8F7F7F7F7F7F7F8F8F8F9F9F9FAFAFAFAFAFAFBFBFBFBFBFBFCFC + FCFCFCFCFCFCFCFDFDFDFDFDFDFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFEFEFEFEFEFE + FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFCFCFCFBFBFBFBFBFBFBFBFBFAFAFAF9F9 + F9F8F8F8F8F8F8F7F7F7F6F6F6F5F5F5F5F5F5F4F4F4F3F3F3F2F2F2F1F1F1F0 + F0F0EFEFEFEEEEEEEDEDEDEDEDEDECECECEBEBEBEAEAEAE9E9E9E7E7E7E6E6E6 + E5E5E5E5E5E5E4E4E4E3E3E3E2E2E2E1E1E1E0E0E0DEDEDEDDDDDDDDDDDDDBDB + DBDBDBDBDADADAD9D9D9D8D8D8D7D7D7D6D6D6D5D5D5D8D8D8CFCFCFD0D0D0D3 + D3D3BABABA8B8B8B6C6C6C6868687777778080808C8C8C9595959B9B9BA4A4A4 + B2B2B2BEBEBEC5C5C5CDCDCDD8D8D8E0E0E0E5E5E5EAEAEAF0F0F0F6F6F6F9F9 + F9FAFAFAFBFBFBFCFCFCFDFDFDFEFEFEFEFEFEFDFDFDFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFDFDFDFEFEFEFEFE + FEFEFEFEFCFCFCFBFBFBF8F8F8F6F6F6F1F1F1ECECECE6E6E6DEDEDED6D6D6D0 + D0D0C8C8C8BFBFBFB0B0B0A8A8A8A3A3A39292928484848787877777776C6C6C + 686868969696DDDDDDF6F6F6F0F0F0FAFAFAF7F7F7F7F7F7F8F8F8F8F8F8F9F9 + F9FAFAFAFBFBFBFBFBFBFCFCFCFCFCFCFCFCFCFDFDFDFDFDFDFEFEFEFEFEFEFE + FEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FEFEFEFEFEFEFEFEFEFEFEFEFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFCFCFCFBFB + FBFBFBFBFBFBFBFAFAFAF9F9F9F8F8F8F8F8F8F7F7F7F6F6F6F5F5F5F5F5F5F4 + F4F4F3F3F3F2F2F2F1F1F1F0F0F0EFEFEFEEEEEEEDEDEDEDEDEDEBEBEBEBEBEB + EAEAEAE9E9E9E7E7E7E6E6E6E5E5E5E4E4E4E3E3E3E3E3E3E2E2E2E1E1E1DFDF + DFDEDEDEDDDDDDDDDDDDDBDBDBDADADAD9D9D9D8D8D8D7D7D7D6D6D6D5D5D5D5 + D5D5D1D1D1D6D6D6D4D4D4D2D2D2D7D7D7CFCFCFA6A6A67777776666666F6F6F + 7979798282828D8D8D9A9A9AA3A3A3A7A7A7B8B8B8C0C0C0CBCBCBD4D4D4DBDB + DBE1E1E1E9E9E9EFEFEFF5F5F5F7F7F7F9F9F9FBFBFBFCFCFCFDFDFDFDFDFDFD + FDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFEFEFEFDFDFDFEFEFEFEFEFEFDFDFDFBFBFBF9F9F9F5F5F5F2F2F2ECECECE6 + E6E6DFDFDFD6D6D6CDCDCDC6C6C6BFBFBFADADADA9A9A9A0A0A08B8B8B898989 + 8383836767676868687D7D7DBDBDBDF1F1F1F4F4F4F6F6F6FCFCFCF1F1F1F6F6 + F6F7F7F7F7F7F7F8F8F8F9F9F9F9F9F9FAFAFAFAFAFAFBFBFBFBFBFBFCFCFCFC + FCFCFDFDFDFDFDFDFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFEFEFEFEFEFEFDFDFDFDFDFDFDFD + FDFDFDFDFDFDFDFCFCFCFBFBFBFBFBFBFBFBFBFAFAFAF9F9F9F8F8F8F8F8F8F7 + F7F7F6F6F6F5F5F5F5F5F5F4F4F4F3F3F3F2F2F2F1F1F1F0F0F0EFEFEFEEEEEE + EDEDEDEDEDEDEBEBEBEBEBEBEAEAEAE8E8E8E7E7E7E6E6E6E5E5E5E4E4E4E3E3 + E3E2E2E2E1E1E1E0E0E0DFDFDFDEDEDEDDDDDDDCDCDCDADADADADADAD9D9D9D8 + D8D8D7D7D7D6D6D6D5D5D5D5D5D5CFCFCFD1D1D1CECECECACACACDCDCDD3D3D3 + CECECEC2C2C29595957373736262627373738686868989899191919F9F9FABAB + ABB3B3B3BFBFBFC9C9C9D1D1D1D9D9D9E2E2E2E9E9E9F0F0F0F3F3F3F7F7F7FA + FAFAFBFBFBFCFCFCFDFDFDFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFEFEFEFDFDFDFBFBFBF8F8F8F6 + F6F6F1F1F1ECECECE6E6E6DFDFDFD8D8D8CECECEC3C3C3BBBBBBAAAAAAA5A5A5 + 9797978C8C8C8484847373736C6C6C767676A6A6A6E5E5E5FDFDFDEEEEEEEFEF + EFF0F0F0EEEEEEF7F7F7F6F6F6F6F6F6F7F7F7F7F7F7F8F8F8F9F9F9F9F9F9FA + FAFAFBFBFBFBFBFBFCFCFCFCFCFCFDFDFDFDFDFDFEFEFEFEFEFEFEFEFEFEFEFE + FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFEFE + FEFEFEFEFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFCFCFCFBFBFBFBFBFBFBFBFBFA + FAFAF9F9F9F8F8F8F8F8F8F7F7F7F6F6F6F5F5F5F5F5F5F4F4F4F3F3F3F2F2F2 + F1F1F1F0F0F0EFEFEFEEEEEEEDEDEDEDEDEDEBEBEBEAEAEAE9E9E9E8E8E8E7E7 + E7E5E5E5E4E4E4E4E4E4E2E2E2E2E2E2E1E1E1E0E0E0DEDEDEDDDDDDDCDCDCDC + DCDCD9D9D9D9D9D9D8D8D8D7D7D7D6D6D6D5D5D5D4D4D4D4D4D4D5D5D5CFCFCF + D0D0D0D4D4D4CFCFCFC6C6C6CBCBCBD8D8D8CECECEAEAEAE8686866F6F6F6E6E + 6E7A7A7A8888889191919D9D9DA6A6A6B2B2B2BDBDBDC6C6C6D0D0D0DBDBDBE2 + E2E2E9E9E9EEEEEEF3F3F3F7F7F7FAFAFAFBFBFBFDFDFDFFFFFFFEFEFEFEFEFE + FEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFDFDFDFC + FCFCFBFBFBF8F8F8F4F4F4F1F1F1EBEBEBE5E5E5DDDDDDD5D5D5CDCDCDC2C2C2 + B6B6B6ADADADA1A1A19898988383837B7B7B757575676767868686CECECEF8F8 + F8E7E7E7EEEEEEF8F8F8F2F2F2F6F6F6FCFCFCEEEEEEF5F5F5F5F5F5F6F6F6F7 + F7F7F8F8F8F8F8F8F9F9F9F9F9F9FBFBFBFBFBFBFBFBFBFCFCFCFCFCFCFDFDFD + FDFDFDFDFDFDFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFEFEFEFEFEFEFEFEFEFEFEFEFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFC + FCFCFBFBFBFBFBFBFBFBFBFAFAFAF9F9F9F8F8F8F8F8F8F7F7F7F6F6F6F5F5F5 + F5F5F5F4F4F4F3F3F3F2F2F2F1F1F1F0F0F0EFEFEFEEEEEEEDEDEDEDEDEDEBEB + EBEAEAEAE9E9E9E8E8E8E6E6E6E5E5E5E4E4E4E4E4E4E2E2E2E1E1E1E0E0E0DF + DFDFDEDEDEDDDDDDDCDCDCDBDBDBD9D9D9D9D9D9D8D8D8D7D7D7D6D6D6D5D5D5 + D4D4D4D3D3D3D1D1D1D7D7D7D5D5D5CDCDCDCECECED5D5D5CFCFCFC2C2C2CCCC + CCD0D0D0C2C2C29B9B9B7777776C6C6C7676767F7F7F8E8E8E979797A4A4A4AF + AFAFB9B9B9C4C4C4D0D0D0D8D8D8E0E0E0E6E6E6EDEDEDF3F3F3F6F6F6F8F8F8 + FBFBFBFEFEFEFDFDFDFDFDFDFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFEFEFEFDFDFDFBFBFBFAFAFAF8F8F8F4F4F4EEEEEEEBEBEBE2E2E2DBDBDB + D2D2D2C9C9C9C0C0C0B4B4B4A6A6A69C9C9C9494948383838080807676767070 + 70A1A1A1E0E0E0F3F3F3EAEAEAF3F3F3F2F2F2F2F2F2F6F6F6EFEFEFEDEDEDFD + FDFDF5F5F5F5F5F5F6F6F6F6F6F6F7F7F7F8F8F8F9F9F9F9F9F9FBFBFBFBFBFB + FBFBFBFCFCFCFCFCFCFDFDFDFDFDFDFDFDFDFEFEFEFEFEFEFEFEFEFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFEFEFEFEFEFEFDFDFDFD + FDFDFDFDFDFDFDFDFDFDFDFCFCFCFBFBFBFBFBFBFBFBFBFAFAFAF9F9F9F8F8F8 + F8F8F8F7F7F7F6F6F6F5F5F5F5F5F5F4F4F4F3F3F3F2F2F2F1F1F1F0F0F0EFEF + EFEEEEEEEDEDEDEDEDEDEAEAEAEAEAEAE9E9E9E8E8E8E6E6E6E5E5E5E4E4E4E3 + E3E3E2E2E2E1E1E1E0E0E0DFDFDFDDDDDDDCDCDCDBDBDBDBDBDBD9D9D9D8D8D8 + D7D7D7D6D6D6D5D5D5D4D4D4D3D3D3D3D3D3CFCFCFD2D2D2D1D1D1CECECECDCD + CDCFCFCFCECECECBCBCBC5C5C5C3C3C3CCCCCCCFCFCFAEAEAE7D7D7D6D6D6D7A + 7A7A7E7E7E878787949494A0A0A0ABABABB6B6B6C3C3C3CBCBCBD6D6D6DDDDDD + E6E6E6EDEDEDF1F1F1F4F4F4F8F8F8FBFBFBFCFCFCFDFDFDFDFDFDFEFEFEFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDFBFBFBFAFAFAF8F8F8F5F5F5F0F0F0 + EBEBEBE7E7E7DCDCDCD5D5D5CACACAC0C0C0B6B6B6A9A9A99A9A9A8F8F8F7E7E + 7E8080806A6A6A727272B5B5B5EAEAEAEFEFEFE9E9E9F1F1F1F0F0F0F1F1F1EF + EFEFEDEDEDF3F3F3F5F5F5EFEFEFF5F5F5F5F5F5F5F5F5F6F6F6F7F7F7F8F8F8 + F8F8F8F9F9F9FAFAFAFBFBFBFBFBFBFCFCFCFCFCFCFDFDFDFDFDFDFDFDFDFEFE + FEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFE + FEFEFEFEFEFEFEFEFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFCFCFCFBFBFBFBFBFB + FBFBFBFAFAFAF9F9F9F8F8F8F8F8F8F7F7F7F6F6F6F5F5F5F5F5F5F4F4F4F3F3 + F3F2F2F2F1F1F1F0F0F0EFEFEFEEEEEEEDEDEDEDEDEDEAEAEAEAEAEAE9E9E9E8 + E8E8E6E6E6E5E5E5E4E4E4E3E3E3E1E1E1E1E1E1E0E0E0DFDFDFDDDDDDDCDCDC + DBDBDBDADADAD8D8D8D8D8D8D7D7D7D6D6D6D5D5D5D4D4D4D3D3D3D3D3D3D0D0 + D0D0D0D0CFCFCFCECECECDCDCDCDCDCDCACACAC7C7C7CECECECCCCCCC6C6C6C3 + C3C3C7C7C7BDBDBD9494946767677474747D7D7D898989969696A1A1A1ACACAC + B9B9B9C2C2C2D0D0D0D7D7D7E1E1E1E9E9E9EDEDEDF1F1F1F6F6F6F9F9F9FCFC + FCFCFCFCFDFDFDFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFEFEFEFDFDFDFFFFFFFEFEFEFFFFFFFEFEFEFDFDFDFFFFFFFFFFFFFA + FAFAFFFFFFFEFEFEFEFEFEFFFFFFFFFFFFFDFDFDFCFCFCFFFFFFFEFEFEFCFCFC + F9F9F9F7F7F7F4F4F4EDEDEDE3E3E3DCDCDCD1D1D1CECECEBCBCBCB0B0B0A4A4 + A49C9C9C9191918484847E7E7E6868688A8A8ACFCFCFEDEDEDEAEAEAE9E9E9EE + EEEEEEEEEEEEEEEEEFEFEFF0F0F0F1F1F1F2F2F2F3F3F3F3F3F3F4F4F4F4F4F4 + F5F5F5F6F6F6F7F7F7F8F8F8F9F9F9F9F9F9F9F9F9F9F9F9FAFAFAFBFBFBFBFB + FBFCFCFCFDFDFDFDFDFDFDFDFDFDFDFDFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFEFEFEFDFDFDFDFDFD + FDFDFDFCFCFCFBFBFBFBFBFBFBFBFBFAFAFAF9F9F9F9F9F9F8F8F8F7F7F7F6F6 + F6F5F5F5F4F4F4F4F4F4F2F2F2F1F1F1F0F0F0EFEFEFEEEEEEECECECEBEBEBEB + EBEBE9E9E9E9E9E9E8E8E8E7E7E7E5E5E5E4E4E4E3E3E3E2E2E2E1E1E1E1E1E1 + E0E0E0DEDEDEDDDDDDDCDCDCDBDBDBDADADAD9D9D9D8D8D8D7D7D7D6D6D6D5D5 + D5D3D3D3D2D2D2D2D2D2D0D0D0CFCFCFCFCFCFCECECECDCDCDCCCCCCCBCBCBCA + CACAC7C7C7CBCBCBCBCBCBC6C6C6C6C6C6C6C6C6BBBBBBABABAB6A6A6A747474 + 7C7C7C8383839494949F9F9FA4A4A4B3B3B3C3C3C3CCCCCCD7D7D7DFDFDFE7E7 + E7F0F0F0F5F5F5F5F5F5FBFBFBFBFBFBFBFBFBFCFCFCFDFDFDFEFEFEFEFEFEFE + FEFEFEFEFEFFFFFFFFFFFFFEFEFEFEFEFEFFFFFFFFFFFFFCFCFCFFFFFFFEFEFE + FFFFFFFFFFFFFDFDFDFDFDFDFFFFFFFDFDFDFFFFFFFFFFFFFEFEFEFDFDFDFEFE + FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFFFFFFFF + FFFFFDFDFDFDFDFDFFFFFFFEFEFEFCFCFCFAFAFAF9F9F9FBFBFBFBFBFBF7F7F7 + F6F6F6F6F6F6F0F0F0EEEEEEEBEBEBE8E8E8E5E5E5DDDDDDD4D4D4CDCDCDC2C2 + C2ACACACB2B2B2A0A0A09696968B8B8B7575757070706868689E9E9ED9D9D9EF + EFEFEBEBEBE7E7E7EBEBEBEDEDEDEDEDEDEEEEEEEEEEEEEFEFEFF1F1F1F2F2F2 + F2F2F2F3F3F3F3F3F3F4F4F4F5F5F5F6F6F6F7F7F7F8F8F8F9F9F9F9F9F9F9F9 + F9F9F9F9FAFAFAFAFAFAFBFBFBFCFCFCFDFDFDFDFDFDFDFDFDFDFDFDFEFEFEFE + FEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFE + FEFEFEFEFEFEFDFDFDFDFDFDFDFDFDFCFCFCFBFBFBFBFBFBFBFBFBFAFAFAF9F9 + F9F9F9F9F8F8F8F7F7F7F6F6F6F5F5F5F4F4F4F4F4F4F2F2F2F1F1F1F0F0F0EF + EFEFEEEEEEECECECEBEBEBEBEBEBE9E9E9E9E9E9E8E8E8E7E7E7E5E5E5E4E4E4 + E3E3E3E2E2E2E1E1E1E0E0E0DFDFDFDEDEDEDDDDDDDBDBDBDADADADADADAD8D8 + D8D8D8D8D7D7D7D6D6D6D4D4D4D3D3D3D2D2D2D2D2D2D0D0D0CFCFCFCECECECD + CDCDCCCCCCCBCBCBCACACACACACAC8C8C8C9C9C9C6C6C6C3C3C3C4C4C4C6C6C6 + C2C2C2BABABAB6B6B67171717070707B7B7B7D7D7D919191999999A6A6A6AFAF + AFBABABAC6C6C6CFCFCFD8D8D8E3E3E3E9E9E9EBEBEBF1F1F1F3F3F3F5F5F5F7 + F7F7F8F8F8F8F8F8F9F9F9F9F9F9FAFAFAFCFCFCFCFCFCF9F9F9FBFBFBFFFFFF + FFFFFFFFFFFFFFFFFFFDFDFDFCFCFCFCFCFCF9F9F9FDFDFDFFFFFFFEFEFEFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFDFDFDFDFDFDFEFEFEFDFDFDFDFDFDFEFEFEFFFFFFFF + FFFFFFFFFFFBFBFBFBFBFBFCFCFCF6F6F6F4F4F4F5F5F5F3F3F3F0F0F0EBEBEB + E9E9E9E9E9E9E8E8E8E3E3E3DFDFDFDEDEDEDFDFDFDCDCDCD8D8D8D4D4D4CECE + CEC6C6C6BDBDBDB6B6B6AAAAAAA8A8A88F8F8F8888887E7E7E7070706E6E6E65 + 6565B4B4B4DFDFDFF3F3F3E8E8E8E5E5E5E9E9E9E8E8E8E8E8E8EDEDEDEDEDED + EEEEEEEFEFEFF0F0F0F1F1F1F2F2F2F2F2F2F3F3F3F3F3F3F4F4F4F5F5F5F6F6 + F6F7F7F7F8F8F8F9F9F9F9F9F9F9F9F9F9F9F9FAFAFAFBFBFBFCFCFCFCFCFCFD + FDFDFDFDFDFDFDFDFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFEFEFEFDFDFDFDFDFDFDFDFDFCFCFCFBFB + FBFBFBFBFBFBFBFAFAFAF9F9F9F9F9F9F8F8F8F7F7F7F6F6F6F5F5F5F4F4F4F4 + F4F4F2F2F2F1F1F1F0F0F0EFEFEFEEEEEEECECECEBEBEBEBEBEBE9E9E9E9E9E9 + E8E8E8E6E6E6E5E5E5E4E4E4E3E3E3E2E2E2E0E0E0E0E0E0DFDFDFDEDEDEDCDC + DCDBDBDBDADADADADADAD8D8D8D7D7D7D6D6D6D5D5D5D4D4D4D2D2D2D1D1D1D1 + D1D1CFCFCFCFCFCFCECECECDCDCDCCCCCCCBCBCBCACACAC9C9C9C9C9C9C7C7C7 + C4C4C4C3C3C3C4C4C4C5C5C5C5C5C5C4C4C4C4C4C4BBBBBB7E7E7E6161616C6C + 6C7676768787878686869C9C9CA5A5A5B1B1B1B9B9B9C0C0C0C9C9C9D0D0D0D3 + D3D3D7D7D7DBDBDBDFDFDFE2E2E2E3E3E3E3E3E3E5E5E5E6E6E6E8E8E8EBEBEB + EEEEEEF0F0F0F3F3F3F6F6F6F8F8F8F7F7F7FBFBFBFCFCFCFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFE + FEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFEFEFEFDFDFDFDFDFDFBFBFBF8F8F8F7F7F7F0F0F0E5E5E5E2E2E2 + E2E2E2DDDDDDD7D7D7D1D1D1CDCDCDCECECECFCFCFCCCCCCC9C9C9C9C9C9C2C2 + C2BFBFBFBABABAB4B4B4AEAEAEA5A5A59C9C9C9797979191917B7B7B7A7A7A6C + 6C6C5F5F5F626262646464BFBFBFE8E8E8ECECECE4E4E4E0E0E0EAEAEAECECEC + E8E8E8EDEDEDECECECECECECEDEDEDEEEEEEEFEFEFF0F0F0F1F1F1F1F1F1F3F3 + F3F3F3F3F4F4F4F5F5F5F6F6F6F7F7F7F8F8F8F8F8F8F8F8F8F9F9F9F9F9F9FA + FAFAFBFBFBFCFCFCFCFCFCFCFCFCFDFDFDFDFDFDFEFEFEFEFEFEFEFEFEFEFEFE + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFEFEFEFDFD + FDFDFDFDFDFDFDFCFCFCFBFBFBFBFBFBFBFBFBFAFAFAF9F9F9F9F9F9F8F8F8F7 + F7F7F6F6F6F5F5F5F4F4F4F4F4F4F2F2F2F1F1F1F0F0F0EFEFEFEEEEEEECECEC + EBEBEBEBEBEBE9E9E9E8E8E8E7E7E7E6E6E6E5E5E5E3E3E3E2E2E2E2E2E2E0E0 + E0DFDFDFDEDEDEDDDDDDDCDCDCDBDBDBDADADAD9D9D9D7D7D7D7D7D7D6D6D6D4 + D4D4D3D3D3D2D2D2D1D1D1D0D0D0CECECECECECECDCDCDCCCCCCCBCBCBCACACA + C9C9C9C9C9C9C8C8C8C5C5C5C5C5C5C8C8C8C7C7C7C3C3C3C1C1C1C3C3C3C2C2 + C2BFBFBFC4C4C48484845555556565656767677373737878788181818D8D8D98 + 9898A1A1A1AAAAAAB3B3B3B9B9B9BABABABFBFBFC4C4C4C6C6C6C7C7C7C8C8C8 + CCCCCCCFCFCFCDCDCDCFCFCFD1D1D1D4D4D4D8D8D8DFDFDFE6E6E6E9E9E9ECEC + ECF0F0F0F7F7F7FBFBFBFBFBFBFAFAFAFAFAFAF9F9F9FDFDFDFEFEFEFFFFFFFF + FFFFFFFFFFFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFEFEFEFBFBFBF8F8F8F5F5F5F3F3F3E6E6E6E2E2E2 + DCDCDCD4D4D4CECECECDCDCDC4C4C4B3B3B3B9B9B9B1B1B1AAAAAAA7A7A7A5A5 + A5A2A2A29F9F9F9E9E9E9696969494949090908B8B8B8686867F7F7F79797975 + 75756666665757575D5D5D4E4E4E454545595959C9C9C9E7E7E7E0E0E0E3E3E3 + E5E5E5E7E7E7EAEAEAEAEAEAEAEAEAECECECEBEBEBEBEBEBECECECEDEDEDEEEE + EEEFEFEFF0F0F0F1F1F1F2F2F2F2F2F2F3F3F3F4F4F4F5F5F5F6F6F6F7F7F7F7 + F7F7F8F8F8F8F8F8F9F9F9FAFAFAFBFBFBFBFBFBFCFCFCFCFCFCFDFDFDFDFDFD + FEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFEFEFEFEFEFEFEFEFEFDFDFDFDFDFDFDFDFDFCFCFCFBFBFBFBFBFBFBFBFBFA + FAFAF9F9F9F9F9F9F8F8F8F7F7F7F6F6F6F5F5F5F4F4F4F4F4F4F2F2F2F1F1F1 + F0F0F0EFEFEFEEEEEEECECECEBEBEBEBEBEBE9E9E9E8E8E8E7E7E7E6E6E6E4E4 + E4E3E3E3E2E2E2E2E2E2DFDFDFDFDFDFDEDEDEDDDDDDDBDBDBDADADAD9D9D9D9 + D9D9D6D6D6D6D6D6D5D5D5D4D4D4D2D2D2D1D1D1D0D0D0CFCFCFCDCDCDCDCDCD + CCCCCCCBCBCBCACACAC9C9C9C8C8C8C8C8C8C6C6C6C4C4C4C4C4C4C8C8C8C6C6 + C6C0C0C0BEBEBEC1C1C1B8B8B8C2C2C2BBBBBBC2C2C28F8F8F4949494D4D4D52 + 52525F5F5F6464646D6D6D7676767C7C7C8383838A8A8A909090939393969696 + 9A9A9A9B9B9B9C9C9C9E9E9EA3A3A3A7A7A7ABABABAEAEAEB3B3B3B9B9B9BDBD + BDC2C2C2C8C8C8CCCCCCD9D9D9DCDCDCE1E1E1E9E9E9F2F2F2F8F8F8FCFCFCFE + FEFEFEFEFEFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFCFCFCFAFAFAF7F7F7F3F3F3EDEDED + E5E5E5DFDFDFD0D0D0C9C9C9C0C0C0B4B4B4A9A9A9A1A1A19494948282825E5E + 5E5454544848483E3E3E3535352A2A2A2323232121212424242323232121211F + 1F1F1C1C1C1919191616161414141414141717170C0C0C131313404040CCCCCC + E5E5E5DEDEDEE4E4E4E5E5E5E8E8E8E5E5E5E1E1E1E5E5E5EAEAEAE6E6E6EAEA + EAEBEBEBEBEBEBEDEDEDEEEEEEEFEFEFEFEFEFF0F0F0F1F1F1F2F2F2F3F3F3F4 + F4F4F5F5F5F6F6F6F7F7F7F7F7F7F8F8F8F8F8F8F9F9F9F9F9F9FAFAFAFBFBFB + FCFCFCFCFCFCFDFDFDFDFDFDFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFEFEFEFDFDFDFDFDFDFDFDFDFC + FCFCFBFBFBFBFBFBFBFBFBFAFAFAF9F9F9F9F9F9F8F8F8F7F7F7F6F6F6F5F5F5 + F4F4F4F4F4F4F2F2F2F1F1F1F0F0F0EFEFEFEEEEEEECECECEBEBEBEBEBEBE8E8 + E8E8E8E8E7E7E7E6E6E6E4E4E4E3E3E3E2E2E2E1E1E1DFDFDFDEDEDEDDDDDDDC + DCDCDBDBDBDADADAD9D9D9D8D8D8D6D6D6D5D5D5D4D4D4D3D3D3D1D1D1D0D0D0 + CFCFCFCFCFCFCDCDCDCCCCCCCBCBCBCACACAC9C9C9C8C8C8C7C7C7C7C7C7C6C6 + C6C3C3C3C1C1C1C3C3C3C2C2C2BFBFBFC0C0C0C4C4C4C6C6C6C2C2C2C2C2C2BD + BDBDBDBDBD868686262626080808101010101010131313161616181818181818 + 1B1B1B1E1E1E1F1F1F2020202222222222222323232525252A2A2A2E2E2E3636 + 363D3D3D4D4D4D6262627878788E8E8EA3A3A3B1B1B1AEAEAEBDBDBDCCCCCCD6 + D6D6DEDEDEE4E4E4ECECECF6F6F6FBFBFBFDFDFDFFFFFFFFFFFFFEFEFEFEFEFE + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF9F9F9 + F3F3F3EDEDEDE5E5E5D8D8D8C9C9C9BFBFBFB6B6B6A3A3A38C8C8C6D6D6D4545 + 452626261717171010101717171313131111111212121111110F0F0F0F0F0F11 + 11110F0F0F0E0E0E0E0E0E0D0D0D0B0B0B0A0A0A0A0A0A090909020202131313 + 010101393939D1D1D1E2E2E2E5E5E5DFDFDFE2E2E2E2E2E2E6E6E6E7E7E7E3E3 + E3E4E4E4EAEAEAEAEAEAEAEAEAEAEAEAEBEBEBECECECEDEDEDEEEEEEEFEFEFEF + EFEFF1F1F1F1F1F1F2F2F2F3F3F3F4F4F4F5F5F5F6F6F6F7F7F7F8F8F8F8F8F8 + F8F8F8F9F9F9FAFAFAFBFBFBFBFBFBFCFCFCFDFDFDFDFDFDFEFEFEFEFEFEFEFE + FEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFE + FEFEFDFDFDFDFDFDFDFDFDFCFCFCFBFBFBFBFBFBFBFBFBFAFAFAF9F9F9F9F9F9 + F8F8F8F7F7F7F6F6F6F5F5F5F4F4F4F4F4F4F2F2F2F1F1F1F0F0F0EFEFEFEEEE + EEECECECEBEBEBEBEBEBE8E8E8E8E8E8E7E7E7E5E5E5E4E4E4E3E3E3E2E2E2E1 + E1E1DFDFDFDEDEDEDDDDDDDCDCDCDADADAD9D9D9D8D8D8D8D8D8D5D5D5D4D4D4 + D3D3D3D2D2D2D1D1D1D0D0D0CFCFCFCECECECCCCCCCCCCCCCBCBCBCACACAC9C9 + C9C8C8C8C7C7C7C6C6C6C7C7C7C4C4C4C1C1C1C1C1C1C1C1C1C1C1C1C2C2C2C4 + C4C4BCBCBCBABABAB5B5B5BFBFBFBABABAB6B6B68B8B8B1515150A0A0A070707 + 0707070A0A0A0D0D0D0C0C0C0D0D0D0F0F0F0D0D0D0D0D0D0D0D0D0E0E0E0F0F + 0F1010101313131515151717171313131010101111111414141D1D1D2D2D2D3B + 3B3B7171718787879E9E9EB2B2B2C2C2C2CCCCCCD5D5D5E1E1E1EAEAEAF0F0F0 + F7F7F7FBFBFBFDFDFDFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFF0F0F0EAEAEAE0E0E0D5D5D5C9C9C9B7B7B7A3A3A39494945757 + 5732323218181817171717171715151515151516161615151513131313131315 + 15151414141010101010101212120F0F0F0F0F0F0E0E0E0D0D0D0B0B0B0A0A0A + 0909090909090C0C0C000000454545CDCDCDE5E5E5D5D5D5DEDEDEE4E4E4E4E4 + E4E3E3E3E3E3E3E4E4E4E6E6E6E7E7E7E8E8E8E8E8E8E9E9E9EAEAEAEBEBEBEC + ECECEDEDEDEEEEEEEFEFEFEFEFEFF1F1F1F1F1F1F2F2F2F3F3F3F4F4F4F5F5F5 + F6F6F6F6F6F6F7F7F7F8F8F8F8F8F8F9F9F9FAFAFAFBFBFBFBFBFBFCFCFCFDFD + FDFDFDFDFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFEFEFEFEFEFEFEFEFEFDFDFDFDFDFDFDFDFDFCFCFCFBFBFBFBFBFB + FBFBFBFAFAFAF9F9F9F9F9F9F8F8F8F7F7F7F6F6F6F5F5F5F4F4F4F4F4F4F2F2 + F2F1F1F1F0F0F0EFEFEFEEEEEEECECECEBEBEBEBEBEBE8E8E8E8E8E8E7E7E7E5 + E5E5E4E4E4E3E3E3E2E2E2E1E1E1DEDEDEDEDEDEDDDDDDDCDCDCDADADAD9D9D9 + D8D8D8D7D7D7D5D5D5D4D4D4D3D3D3D2D2D2D0D0D0CFCFCFCECECECECECECCCC + CCCBCBCBCACACAC9C9C9C8C8C8C7C7C7C7C7C7C6C6C6C7C7C7C6C6C6C4C4C4C3 + C3C3C3C3C3C2C2C2C1C1C1BFBFBFC0C0C0BDBDBDBFBFBFBEBEBEBABABAC2C2C2 + BABABA9393931212120C0C0C0909090B0B0B0C0C0C0A0A0A0909090A0A0A0E0E + 0E0E0E0E0E0E0E0F0F0F1010101010101010101010100F0F0F10101014141417 + 17171515151212121313131818180F0F0F1D1D1D3434345A5A5A8A8A8AABABAB + BABABAC2C2C2D7D7D7DFDFDFECECECF5F5F5FAFAFAFCFCFCFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFDFDFDFDFDFDFBFBFBF6F6F6F1F1F1E3E3E3D7D7D7C9C9C9BABABA9F9F + 9F7171713D3D3D1A1A1A1A1A1A1A1A1A19191918181817171717171716161616 + 16161515151414141414141313131212121111111010101010100808080F0F0F + 0E0E0E0707070B0B0B0B0B0B0303030B0B0B0202024C4C4CCECECEEBEBEBD7D7 + D7E3E3E3DDDDDDE1E1E1E4E4E4E4E4E4E4E4E4E5E5E5E6E6E6E6E6E6E7E7E7E7 + E7E7E8E8E8E9E9E9EAEAEAEBEBEBECECECEDEDEDEDEDEDEEEEEEF0F0F0F0F0F0 + F1F1F1F2F2F2F3F3F3F4F4F4F5F5F5F6F6F6F6F6F6F6F6F6F7F7F7F8F8F8F8F8 + F8F9F9F9FAFAFAFAFAFAFCFCFCFDFDFDFDFDFDFDFDFDFEFEFEFEFEFEFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFDFDFD + FDFDFDFDFDFDFCFCFCFBFBFBFBFBFBFBFBFBF8F8F8F8F8F8F7F7F7F6F6F6F6F6 + F6F5F5F5F5F5F5F5F5F5F0F0F0F0F0F0EFEFEFEEEEEEEDEDEDECECECECECECEB + EBEBE5E5E5E5E5E5E4E4E4E3E3E3E2E2E2E1E1E1E1E1E1E0E0E0DCDCDCDBDBDB + DBDBDBDADADAD9D9D9D8D8D8D7D7D7D7D7D7D6D6D6D5D5D5D4D4D4D2D2D2D0D0 + D0CFCFCFCDCDCDCDCDCDCCCCCCCBCBCBCACACAC9C9C9C7C7C7C6C6C6C5C5C5C4 + C4C4C4C4C4C3C3C3C3C3C3C2C2C2C1C1C1C1C1C1C0C0C0C0C0C0BEBEBEBDBDBD + BDBDBDBCBCBCBBBBBBBABABABABABAB9B9B99595951818180101010808080B0B + 0B0606060505051010100B0B0B0C0C0C0D0D0D0E0E0E0F0F0F11111112121212 + 12121111111212121212121313131515151616161616161717171818181B1B1B + 1C1C1C1818181C1C1C3A3A3A7171719F9F9FB2B2B2C4C4C4D6D6D6E1E1E1EBEB + EBF4F4F4F9F9F9FAFAFAFCFCFCFFFFFFFEFEFEFFFFFFFFFFFFFAFAFAFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFBFBFBF9F9F9FCFCFCFCFCFCF2F2F2E3E3E3D9D9D9CCCC + CCB9B9B99797976B6B6B3D3D3D1E1E1E1A1A1A2222221A1A1A1A1A1A19191918 + 1818171717171717161616161616151515141414141414131313121212111111 + 1010101010100E0E0E0C0C0C0F0F0F0C0C0C0B0B0B0C0C0C0B0B0B0808084040 + 40CDCDCDE0E0E0CFCFCFDDDDDDD8D8D8DFDFDFDFDFDFDFDFDFDFDFDFE0E0E0E1 + E1E1E2E2E2E3E3E3E3E3E3E4E4E4E9E9E9E9E9E9EAEAEAEBEBEBECECECEDEDED + EEEEEEEEEEEEEFEFEFF0F0F0F0F0F0F1F1F1F3F3F3F4F4F4F4F4F4F5F5F5F7F7 + F7F8F8F8F8F8F8F9F9F9FAFAFAFBFBFBFBFBFBFBFBFBFDFDFDFDFDFDFDFDFDFE + FEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFEFEFEFEFEFEFEFEFEFDFDFDFCFCFCFCFCFCFCFCFCFBFBFBF7F7 + F7F7F7F7F6F6F6F6F6F6F5F5F5F4F4F4F3F3F3F3F3F3F0F0F0F0F0F0EFEFEFEE + EEEEEDEDEDEBEBEBEBEBEBEAEAEAE7E7E7E7E7E7E6E6E6E5E5E5E4E4E4E3E3E3 + E2E2E2E1E1E1DDDDDDDDDDDDDCDCDCDBDBDBDADADAD8D8D8D8D8D8D7D7D7D5D5 + D5D4D4D4D3D3D3D1D1D1CFCFCFCECECECDCDCDCCCCCCCACACACACACAC9C9C9C7 + C7C7C6C6C6C4C4C4C3C3C3C3C3C3C2C2C2C2C2C2C2C2C2C1C1C1C0C0C0BFBFBF + BFBFBFBEBEBEBDBDBDBDBDBDBCBCBCBBBBBBBBBBBBBABABAB9B9B9B9B9B9BBBB + BB8686860B0B0B0606060C0C0C0C0C0C0404040A0A0A0B0B0B0B0B0B0C0C0C0E + 0E0E0F0F0F101010111111121212111111121212121212131313151515161616 + 1616161717171919191B1B1B1D1D1D1C1C1C1818181919192424243030306868 + 689C9C9CBDBDBDC7C7C7DADADAEBEBEBF0F0F0F7F7F7FFFFFFFFFFFFFEFEFEFE + FEFEFEFEFEFEFEFEFFFFFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFE + FFFFFFFFFFFFFFFFFFFEFEFEFDFDFDFDFDFDFDFDFDFFFFFFFEFEFEF4F4F4EAEA + EAE1E1E1D1D1D1C2C2C2A2A2A27474743F3F3F2222221A1A1A1919191A1A1A1C + 1C1C1A1A1A1A1A1A191919181818171717171717161616161616151515141414 + 1313131212121111111010100F0F0F0F0F0F1515150909090808080606060C0C + 0C000000060606373737C2C2C2DEDEDED9D9D9DEDEDEE1E1E1D8D8D8E1E1E1E0 + E0E0E0E0E0E0E0E0E1E1E1E2E2E2E4E4E4E5E5E5E6E6E6E6E6E6E6E6E6E7E7E7 + E8E8E8E9E9E9EAEAEAEBEBEBEBEBEBECECECEFEFEFEFEFEFF0F0F0F1F1F1F2F2 + F2F3F3F3F4F4F4F4F4F4F8F8F8F8F8F8F8F8F8F9F9F9FAFAFAFBFBFBFBFBFBFC + FCFCFBFBFBFBFBFBFBFBFBFCFCFCFCFCFCFDFDFDFDFDFDFEFEFEFDFDFDFDFDFD + FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFCFCFCFCFCFCFCFCFCFBFBFBFBFB + FBFAFAFAFAFAFAFAFAFAF9F9F9F8F8F8F7F7F7F6F6F6F5F5F5F3F3F3F2F2F2F2 + F2F2F1F1F1F1F1F1F0F0F0EEEEEEEDEDEDEBEBEBEAEAEAEAEAEAE7E7E7E6E6E6 + E5E5E5E3E3E3E2E2E2E0E0E0DFDFDFDFDFDFDFDFDFDEDEDEDDDDDDDBDBDBDADA + DAD8D8D8D7D7D7D7D7D7D5D5D5D4D4D4D3D3D3D2D2D2D0D0D0CFCFCFCDCDCDCD + CDCDCDCDCDCCCCCCCBCBCBCACACAC9C9C9C7C7C7C6C6C6C6C6C6C2C2C2C1C1C1 + C1C1C1C0C0C0BFBFBFBEBEBEBEBEBEBDBDBDBDBDBDBCBCBCBCBCBCBBBBBBBABA + BAB9B9B9B9B9B9B9B9B9B7B7B7B1B1B17E7E7E0B0B0B0404040909090E0E0E0E + 0E0E0B0B0B0B0B0B0C0C0C0D0D0D0F0F0F101010111111111111111111121212 + 1212121313131515151616161616161717171717171515151616161919191C1C + 1C1C1C1C1C1C1C1D1D1D2121213636366F6F6FAAAAAAC1C1C1CBCBCBE0E0E0F4 + F4F4EFEFEFFAFAFAF9F9F9FAFAFAFCFCFCFEFEFEFFFFFFFEFEFEFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFEFEFEFAFA + FAFFFFFFF7F7F7E4E4E4D8D8D8CECECEAEAEAE8989894B4B4B2F2F2F18181818 + 18182121212323231F1F1F1D1D1D1A1A1A1A1A1A191919181818171717171717 + 1616161616161414141414141313131212121111110F0F0F0F0F0F0E0E0E0707 + 070B0B0B090909080808070707101010292929BEBEBEE2E2E2CECECEDEDEDEDA + DADAD8D8D8E1E1E1D6D6D6E0E0E0DDDDDDDEDEDEDFDFDFE0E0E0E2E2E2E3E3E3 + E5E5E5E5E5E5E6E6E6E6E6E6E7E7E7E8E8E8E9E9E9EAEAEAEBEBEBEBEBEBEEEE + EEEFEFEFEFEFEFF0F0F0F1F1F1F3F3F3F3F3F3F4F4F4F6F6F6F6F6F6F7F7F7F8 + F8F8F8F8F8F9F9F9FAFAFAFAFAFAFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFDFDFDFDFDFDFAFAFAF9F9F9F8F8F8F7 + F7F7F5F5F5F4F4F4F3F3F3F2F2F2F2F2F2F1F1F1F0F0F0EEEEEEEDEDEDEBEBEB + EAEAEAE9E9E9E7E7E7E6E6E6E5E5E5E3E3E3E1E1E1E0E0E0DEDEDEDEDEDEDBDB + DBDBDBDBD9D9D9D8D8D8D6D6D6D4D4D4D3D3D3D2D2D2D2D2D2D2D2D2D1D1D1CF + CFCFCECECECDCDCDCCCCCCCBCBCBC7C7C7C7C7C7C6C6C6C5C5C5C3C3C3C2C2C2 + C1C1C1C1C1C1C3C3C3C3C3C3C2C2C2C1C1C1C0C0C0C0C0C0BFBFBFBFBFBFBEBE + BEBDBDBDBDBDBDBCBCBCBBBBBBBABABABABABAB9B9B9B7B7B7B1B1B1BDBDBD6C + 6C6C0808080C0C0C0000000202020A0A0A0B0B0B0C0C0C0D0D0D0E0E0E0F0F0F + 1010101111111111111212121212121313131515151616161616161717171818 + 181818181A1A1A1C1C1C1C1C1C1C1C1C1D1D1D1E1E1E1414141E1E1E24242449 + 49498E8E8EB5B5B5C3C3C3D6D6D6E6E6E6F7F7F7FCFCFCFFFFFFFFFFFFFCFCFC + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFE + FEFEFEFEFEFEFEFEFEFEFAFAFAF0F0F0E1E1E1D5D5D5C5C5C5A1A1A167676736 + 36361E1E1E1B1B1B1E1E1E2323232121211A1A1A1919191E1E1E1A1A1A1A1A1A + 1919191818181717171717171616161616161414141414141313131111111010 + 100F0F0F0E0E0E0D0D0D0909090D0D0D0E0E0E0909090B0B0B141414B0B0B0E0 + E0E0D0D0D0DDDDDDDFDFDFD7D7D7D9D9D9DDDDDDDADADADDDDDDDDDDDDDEDEDE + DFDFDFE0E0E0E2E2E2E3E3E3E4E4E4E5E5E5E6E6E6E7E7E7E8E8E8E9E9E9EAEA + EAEBEBEBECECECECECECECECECECECECEDEDEDEEEEEEEFEFEFF0F0F0F1F1F1F2 + F2F2F5F5F5F5F5F5F6F6F6F6F6F6F7F7F7F8F8F8F9F9F9F9F9F9FAFAFAFBFBFB + FBFBFBFBFBFBFCFCFCFCFCFCFDFDFDFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFCFCFCFCFCFCFCFCFCFBFBFBFBFBFBFAFAFAFAFAFAFA + FAFAF9F9F9F9F9F9F8F8F8F6F6F6F5F5F5F3F3F3F2F2F2F1F1F1F1F1F1F0F0F0 + EFEFEFEDEDEDEBEBEBEAEAEAE8E8E8E8E8E8E7E7E7E6E6E6E5E5E5E3E3E3E1E1 + E1E0E0E0DEDEDEDEDEDEDDDDDDDCDCDCDBDBDBD9D9D9D8D8D8D6D6D6D5D5D5D4 + D4D4D3D3D3D2D2D2D2D2D2D0D0D0CFCFCFCECECECDCDCDCDCDCDC9C9C9C9C9C9 + C8C8C8C7C7C7C6C6C6C5C5C5C5C5C5C4C4C4BFBFBFBFBFBFBFBFBFBEBEBEBDBD + BDBCBCBCBCBCBCBBBBBBB9B9B9B9B9B9B8B8B8B7B7B7B7B7B7B6B6B6B5B5B5B5 + B5B5BBBBBBB4B4B4B2B2B2BBBBBB5959590404040808081212120A0A0A0A0A0A + 0B0B0B0C0C0C0E0E0E0F0F0F1010101010101111111212121212121313131515 + 151616161616161717171313131717171919191A1A1A1919191919191A1A1A1B + 1B1B2828281D1D1D1A1A1A1D1D1D313131686868A5A5A5C1C1C1D6D6D6E7E7E7 + EFEFEFF9F9F9FFFFFFFBFBFBFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFEFEFEFEFEFEFEFEFEFDFDFDFBFBFBF8F8F8F3F3F3E1E1E1D1D1D1BE + BEBE9191915252522626261919192525252020201E1E1E1F1F1F2020201E1E1E + 1B1B1B1B1B1B1A1A1A1A1A1A1919191818181717171717171616161616161414 + 141414141313131111110F0F0F0E0E0E0D0D0D0C0C0C14141407070704040408 + 0808111111A8A8A8D2D2D2D5D5D5D9D9D9D3D3D3D2D2D2DDDDDDDADADAD5D5D5 + DDDDDDDCDCDCDDDDDDDEDEDEDFDFDFE0E0E0E1E1E1E2E2E2E3E3E3E4E4E4E4E4 + E4E5E5E5E6E6E6E7E7E7E8E8E8E9E9E9E9E9E9EAEAEAEDEDEDEDEDEDEEEEEEEF + EFEFF0F0F0F1F1F1F2F2F2F2F2F2F7F7F7F7F7F7F8F8F8F8F8F8F9F9F9FAFAFA + FAFAFAFBFBFBFAFAFAFBFBFBFBFBFBFCFCFCFCFCFCFDFDFDFDFDFDFDFDFDFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDFDFDFDFCFCFCFC + FCFCFBFBFBFBFBFBFAFAFAFAFAFAF9F9F9F9F9F9F8F8F8F7F7F7F5F5F5F4F4F4 + F3F3F3F3F3F3F2F2F2F1F1F1F0F0F0EEEEEEEDEDEDEBEBEBEAEAEAEAEAEAE5E5 + E5E4E4E4E3E3E3E2E2E2E0E0E0DFDFDFDEDEDEDDDDDDDBDBDBDADADAD9D9D9D8 + D8D8D6D6D6D5D5D5D4D4D4D3D3D3D0D0D0CFCFCFCECECECDCDCDCCCCCCCBCBCB + CBCBCBCACACAC6C6C6C6C6C6C5C5C5C5C5C5C4C4C4C3C3C3C2C2C2C2C2C2C1C1 + C1C0C0C0C0C0C0BFBFBFBEBEBEBDBDBDBDBDBDBDBDBDBBBBBBBABABABABABAB9 + B9B9B8B8B8B7B7B7B7B7B7B6B6B6B2B2B2B6B6B6BDBDBDB3B3B3B3B3B34D4D4D + 0C0C0C0404040909090A0A0A0B0B0B0C0C0C0D0D0D0E0E0E0F0F0F1010101111 + 111212121212121313131515151616161616161717171B1B1B1C1C1C1A1A1A18 + 18181919191C1C1C1D1D1D1C1C1C1C1C1C2222221E1E1E1D1D1D1E1E1E1F1F1F + 4D4D4D989898BABABAD1D1D1DDDDDDEBEBEBFAFAFAFCFCFCFEFEFEFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDFEFEFEFEFEFEFBFBFBF3F3F3ED + EDEDDEDEDECFCFCFB0B0B08181814848481F1F1F1919192525251B1B1B1F1F1F + 2020201D1D1D1A1A1A1A1A1A1C1C1C1E1E1E1A1A1A1A1A1A1919191818181717 + 171717171616161616161414141414141212121111110F0F0F0D0D0D0C0C0C0B + 0B0B060606070707151515020202868686D4D4D4D1D1D1D6D6D6D3D3D3D8D8D8 + D9D9D9D1D1D1D7D7D7DCDCDCD7D7D7DEDEDEDCDCDCDCDCDCDDDDDDDEDEDEDFDF + DFE0E0E0E0E0E0E1E1E1E4E4E4E4E4E4E5E5E5E6E6E6E7E7E7E8E8E8E9E9E9EA + EAEAECECECEDEDEDEDEDEDEEEEEEF0F0F0F1F1F1F1F1F1F2F2F2F4F4F4F4F4F4 + F5F5F5F5F5F5F6F6F6F7F7F7F7F7F7F8F8F8FCFCFCFCFCFCFDFDFDFDFDFDFEFE + FEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFEFEFEFEFEFEFEFEFEFDFDFDFCFCFCFCFCFCFCFCFCF6F6F6F6F6F6 + F5F5F5F4F4F4F3F3F3F2F2F2F2F2F2F1F1F1F1F1F1F0F0F0EFEFEFEEEEEEEDED + EDECECECEBEBEBEBEBEBE6E6E6E5E5E5E4E4E4E3E3E3E2E2E2E1E1E1E0E0E0E0 + E0E0D9D9D9D9D9D9D8D8D8D7D7D7D6D6D6D4D4D4D4D4D4D3D3D3D1D1D1D0D0D0 + D0D0D0CFCFCFCECECECDCDCDCCCCCCCCCCCCC5C5C5C5C5C5C4C4C4C4C4C4C3C3 + C3C2C2C2C2C2C2C1C1C1BEBEBEBEBEBEBDBDBDBCBCBCBCBCBCBBBBBBBABABABA + BABABABABAB9B9B9B9B9B9B8B8B8B7B7B7B6B6B6B6B6B6B5B5B5B2B2B2B8B8B8 + B4B4B4AEAEAEB9B9B9B4B4B42E2E2E0A0A0A0909090909090A0A0A0B0B0B0D0D + 0D0E0E0E0F0F0F10101011111112121212121213131315151516161616161617 + 17171212121616161818181919191C1C1C2020202020201D1D1D2222221B1B1B + 1D1D1D222222202020202020282828303030858585B4B4B4D0D0D0E0E0E0F0F0 + F0F8F8F8FCFCFCFBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFDFDFDFE + FEFEFEFEFEF8F8F8EDEDEDE4E4E4CACACAB6B6B67F7F7F3B3B3B191919202020 + 2929292424241F1F1F2222222222221E1E1E1F1F1F2121211F1F1F1919191A1A + 1A1A1A1A19191918181817171717171716161616161614141414141412121211 + 11110F0F0F0D0D0D0C0C0C0B0B0B0E0E0E0707070808083C3C3C3B3B3B313131 + 3838383838383737373737373535353838383737373737373A3A3A3535353838 + 383838383838383939393A3A3A3A3A3A3B3B3B3B3B3B3838383838383939393A + 3A3A3B3B3B3C3C3C3D3D3D3D3D3D3939393939393A3A3A3B3B3B3C3C3C3D3D3D + 3E3E3E3E3E3E3B3B3B3C3C3C3C3C3C3D3D3D3E3E3E3F3F3F3F3F3F4040403D3D + 3D3D3D3D3D3D3D3E3E3E3E3E3E3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F + 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3E3E3E3E3E3E3D3D3D + 3D3D3D3C3C3C4040404040403F3F3F3F3F3F3E3E3E3E3E3E3D3D3D3D3D3D3D3D + 3D3D3D3D3C3C3C3B3B3B3A3A3A3939393939393838383A3A3A3A3A3A39393939 + 39393838383737373636363636363A3A3A393939393939383838373737363636 + 3535353535353636363636363535353434343333333232323232323131313636 + 3636363635353535353534343433333333333333333336363635353535353534 + 34343333333232323232323131313333333232323232323131313030302F2F2F + 2F2F2F2E2E2E3434342B2B2B3030303535353131312929293737371818180808 + 080909090A0A0A0B0B0B0D0D0D0E0E0E0F0F0F0F0F0F11111112121212121213 + 13131515151616161616161717171515151B1B1B1D1D1D1A1A1A171717191919 + 1C1C1C1C1C1C1D1D1D2121211F1F1F2020202424242020201D1D1D2626263232 + 327D7D7DB2B2B2C9C9C9DDDDDDEEEEEEFAFAFAFBFBFBFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFFFFFFFFFFFFFF + FFFFFCFCFCFFFFFFFFFFFFF9F9F9F7F7F7F1F1F1DFDFDFCDCDCDB7B7B76F6F6F + 3535352525252121212121212424242222222121212020202020201F1F1F1E1E + 1E1D1D1D1D1D1D1C1C1C1C1C1C1A1A1A18181817171717171716161614141412 + 12121616161414141111110F0F0F0E0E0E0D0D0D0C0C0C0B0B0B070707101010 + 1E1E1E1717170E0E0E0F0F0F0C0C0C1212120E0E0E0E0E0E0E0E0E0E0E0E0E0E + 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E + 0E0E0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F + 0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F + 0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F + 0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F + 0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F + 0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F + 0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0E0E0E0E0E0E + 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E + 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E + 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E + 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E1010101010100E0E + 0E0E0E0E1616162020200D0D0D0808080606060909090C0C0C0B0B0B0C0C0C0F + 0F0F0E0E0E101010131313141414141414141414151515171717181818191919 + 1A1A1A1B1B1B1A1A1A1A1A1A1C1C1C1D1D1D1E1E1E1E1E1E1F1F1F2020202020 + 202121212222222222222626262A2A2A727272B1B1B1CDCDCDE2E2E2EBEBEBF9 + F9F9FDFDFDFBFBFBFCFCFCFDFDFDFDFDFDFEFEFEFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE + FEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCFFFFFFFCFCFCEFEFEFE6E6E6 + D0D0D0B0B0B06C6C6C3E3E3E2121212121212121212222222424242121212121 + 212020202020201F1F1F1E1E1E1D1D1D1D1D1D1C1C1C1D1D1D1B1B1B19191918 + 18181919191919191818181717171414141313131111111111111010100F0F0F + 0C0C0C0A0A0A0D0D0D1010101919191313130E0E0E1111110E0E0E1111111010 + 1010101010101010101010101010101010101010101010101010101010101010 + 10101010101010101010101010100F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F + 0F0F0F0F0F0F1010101010101010101010101010101010101010101010101010 + 1010101010101010101010101010101010101010101010101010101010101010 + 1010101010101010101010101010101010101010101010101010101010101010 + 1010101010101010101010101010101010101010101010101010101010101010 + 1010101010101010101010101010101010101010101010101010101010101010 + 1010101010101010101010101010101010101010101010101010101010101010 + 1010101010101010101010101010101010101010101010101010101010101010 + 1010101010101010101010101010101010101010101010101010101010101010 + 1010101010101010101010101010101010101010101010101010101010101010 + 1010101010101010101010101010101010101010101010101010101010101010 + 100F0F0F1010101111110E0E0E0B0B0B0F0F0F16161616161612121210101011 + 11111010100E0E0E0E0E0E101010111111131313141414151515141414141414 + 1515151616161414141616161717171818181818181A1A1A1C1C1C1E1E1E1E1E + 1E1E1E1E1F1F1F2020202020202121212222222222222222222A2A2A35353573 + 7373B5B5B5C9C9C9DDDDDDF4F4F4FCFCFCFDFDFDFEFEFEFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFB + FDFDFDF4F4F4E2E2E2D7D7D7B1B1B17575753333332121211E1E1E2626262525 + 252323232323231F1F1F2121212020202020201F1F1F1E1E1E1D1D1D1D1D1D1C + 1C1C1A1A1A1919191818181717171717171515151313131111110F0F0F0E0E0E + 0D0D0D0E0E0E1010101212121212121212121010100F0F0F1111110D0D0D0D0D + 0D1111110E0E0E0E0E0E0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F + 0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0E0E0E0E0E0E + 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0F0F0F0F0F0F0F0F0F0F0F0F0F0F + 0F0F0F0F0F0F0F0F0F0F10101010101010101010101010101010101010101010 + 10100F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0E0E0E0E0E0E + 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E + 0E0E0E0E0E0E0E0E0E0E10101010101010101010101010101010101010101010 + 1010101010101010101010101010101010101010101010101010101010101010 + 1010101010101010101010101010101010100F0F0F0F0F0F0F0F0F0F0F0F0F0F + 0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F + 0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F + 0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F + 0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F1010100E0E0E0B0B0B0B0B0B0D + 0D0D1212121010100F0F0F0F0F0F0D0D0D0A0A0A0909090B0B0B0F0F0F111111 + 1212121212121313131414141616161818181B1B1B1C1C1C1C1C1C1C1C1C1A1A + 1A1A1A1A1C1C1C1D1D1D1E1E1E1E1E1E1F1F1F20202020202021212122222222 + 2222232323232323202020313131767676B6B6B6CECECEE8E8E8F4F4F4F9F9F9 + FEFEFEFFFFFFFFFFFFFFFFFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFBFBFBFEFEFEF7F7F7E4E4E4D3D3D3BCBCBC8080803A3A3A2929 + 292323232727272B2B2B2525252222222121211E1E1E2121212020202020201F + 1F1F1E1E1E1D1D1D1D1D1D1C1C1C1A1A1A1A1A1A1B1B1B1C1C1C1B1B1B181818 + 1515151313131818181515151010100E0E0E0E0E0E0F0F0F1111111111111111 + 110F0F0F0E0E0E0C0C0C0E0E0E1010100E0E0E0E0E0E0F0F0F0F0F0F0F0F0F0F + 0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F + 0F0F0F0F0F0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0F0F + 0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F10101010101010101010 + 10101010101010101010101010100F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F + 0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F + 0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F10101010101010101010 + 1010101010101010101010101010101010101010101010101010101010101010 + 1010101010101010101010101010101010101010101010101010101010100F0F + 0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F + 0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F + 0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F + 0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F11 + 11111111111010100F0F0F0F0F0F0D0D0D0E0E0E0F0F0F0F0F0F0D0D0D0C0C0C + 0C0C0C0E0E0E0E0E0E0F0F0F1010101111111313131515151818181A1A1A1515 + 151717171919191A1A1A1A1A1A1B1B1B1C1C1C1D1D1D1E1E1E1E1E1E1F1F1F20 + 20202020202121212222222222222424241E1E1E2C2C2C1E1E1E353535888888 + BBBBBBD3D3D3E7E7E7F2F2F2FAFAFAFCFCFCFEFEFEFEFEFEFDFDFDFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFDFDFDFAFAFAFAFAFAECECECDBDBDBC2C2 + C28A8A8A47474723232328282825252526262625252521212121212123232321 + 21212121212020202020201F1F1F1E1E1E1D1D1D1D1D1D1C1C1C171717171717 + 1717171616161515151515151515151515150F0F0F0E0E0E0D0D0D0E0E0E0F0F + 0F1111111111111111110E0E0E0F0F0F0F0F0F0F0F0F0F0F0F0D0D0D0E0E0E0E + 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E + 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E + 0E0E0E0E0E0E0E0E0E0E0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F + 0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F + 0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F + 0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F + 0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F + 0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F + 0F0F0F0F0F0F0F0F0F0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E + 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E + 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E + 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E + 0E0E0E0E0E0E0E0E0E0E0E0E0E0E1010101111111111111010100D0D0D0F0F0F + 1010100E0E0E0C0C0C0A0A0A0A0A0A0B0B0B1111111111111010101010101212 + 121313131515151515151616161818181A1A1A1B1B1B1B1B1B1B1B1B1C1C1C1D + 1D1D1E1E1E1E1E1E1F1F1F202020202020212121222222222222212121232323 + 2525252727272020203E3E3E8C8C8CC0C0C0DADADAECECECF8F8F8FBFBFBFEFE + FEFEFEFEFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFDFDFDFCFCFCFBFB + FBEFEFEFDDDDDDCDCDCDA0A0A05151512121212A2A2A27272724242423232323 + 23232222222323232424242323232121212020202020201F1F1F1E1E1E1D1D1D + 1D1D1D1C1C1C1B1B1B1A1A1A1818181515151515151616161A1A1A1D1D1D2828 + 282B2B2B3131313838383E3E3E4040403F3F3F3D3D3D3737373A3A3A3838383C + 3C3C3A3A3A353535383838383838373737373737373737373737373737373737 + 3737373737373737373737373737373737373737373737373737373737373838 + 3838383838383838383838383838383838383838383839393939393939393939 + 3939393939393939393939393939383838383838383838383838383838383838 + 3838383838383939393939393939393939393939393939393939393939393939 + 3939393939393939393939393939393939393939393939393939393939393939 + 3939393939393939393939393939383838383838383838383838383838383838 + 3838383838383838383838383838383838383838383838383838383838383838 + 3838383838383838383838383838383838383838383837373737373737373737 + 3737373737373737373737373737373737373737373737373737373737373737 + 3737373737373737373737373737373737373737373737373737373737373737 + 3737373737373737373737373737373737373737373737373737373737373737 + 3737373737373737373737373737383838393939383838353535363636383838 + 3838383737373636363939393C3C3C3E3E3E4141414646464949494A4A4A3C3C + 3C3838383131312A2A2A2323231C1C1C1717171313131818181919191A1A1A1A + 1A1A1A1A1A1A1A1A1B1B1B1D1D1D1E1E1E1E1E1E1F1F1F202020202020212121 + 2222222222222424242626262121212424242828282020204B4B4BA6A6A6C7C7 + C7E1E1E1F3F3F3F9F9F9FFFFFFFFFFFFFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFEFEFEFCFCFCFBFBFBF5F5F5E2E2E2CECECEA9A9A96666662C2C2C1F1F1F2D + 2D2D292929272727252525252525252525242424222222232323212121202020 + 2020201F1F1F1E1E1E1D1D1D1D1D1D1C1C1C1616161B1B1B2424242D2D2D3737 + 374040404949494F4F4F4747474949494D4D4D5050505252525050504B4B4B48 + 48484D4D4D4D4D4D4949494E4E4E4E4E4E4848484C4C4C4B4B4B4B4B4B4B4B4B + 4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B + 4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B + 4B4B4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C + 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C + 4C4C4C4C4C4C4C4C4C4C4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D + 4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4C4C4C4C4C4C + 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C + 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C + 4C4C4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B + 4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B + 4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B + 4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4D4D4D + 4D4D4D4A4A4A4949494B4B4B4B4B4B4949494B4B4B4C4C4C4B4B4B4848484848 + 484B4B4B4B4B4B4949494F4F4F4D4D4D4A4A4A4848484646464444444040403E + 3E3E2323232121211E1E1E1A1A1A1818181818181C1C1C1E1E1E1E1E1E1E1E1E + 1F1F1F2020202020202121212222222222222828282424242828282020202A2A + 2A2828282828286A6A6AA9A9A9CCCCCCE6E6E6F2F2F2FEFEFEFFFFFFFCFCFCFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDFCFCFCFBFBFBEBEBEBDBDBDBC3C3C383 + 83833434342222222E2E2E232323282828262626252525252525252525212121 + 2020202323232121212020202020201F1F1F1E1E1E1D1D1D1D1D1D1C1C1C3636 + 363D3D3D4646464C4C4C4E4E4E4D4D4D4A4A4A4949494A4A4A49494948484847 + 47474646464444444141413E3E3E4444444242423A3A3A4141414444443E3E3E + 4242423E3E3E4141414141414141414141414141414141414141414141414141 + 4141414141414141414141414141414141414141414140404040404040404040 + 4040404040404040404040404040404040404040404040404040404040404040 + 4040404040404141414141414141414141414141414141414141414141414040 + 4040404040404040404040404040404040404040404041414141414141414141 + 4141414141414141414141414141414141414141414141414141414141414141 + 4141414141414141414141414141414141414141414141414141414141414141 + 4141414141414141414141414141414141414141414141414141414141414141 + 4141414141414141414141414141414141414141414141414141414141414141 + 4141414141414141414141414141414141414141414141414141414141414141 + 4141414141414141414141414141414141414141414141414141414141414141 + 4141414141414141414141414141414141414141414141414141414141414141 + 4141414141413E3E3E4242424444444141414040404343434343434141414343 + 434343434242424040404343434848484A4A4A4747474B4B4B4A4A4A4A4A4A4B + 4B4B4D4D4D4D4D4D4A4A4A4848485050504949493D3D3D2E2E2E2222221B1B1B + 1A1A1A1B1B1B1E1E1E1E1E1E1F1F1F2020202020202121212222222222222525 + 252222222222222727272424242424242B2B2B2A2A2A8E8E8EB7B7B7D8D8D8EB + EBEBFBFBFBFFFFFFFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFEFEFEFFFFFFFDFDFDFFFFFFFFFFFFFCFCFCFAFAFAF2 + F2F2E0E0E0CBCBCB9E9E9E4141412727273030302727272626262C2C2C272727 + 2323232424242424242222222222222323232424242222221D1D1D1A1A1A1E1E + 1E2B2B2B3D3D3D4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A49494948484847474746 + 46464747474B4B4B4C4C4C4545453A3A3A323232303030303030313131313131 + 3131313131313131313131313131313131313030303030303030303030303131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131303030303030303030303030313131313131313131313131 + 3131313131313131313131313131313131313232323232323131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 313131313131313131313030303232323232323030302F2F2F3535354141414A + 4A4A4848484848484848484949494A4A4A4C4C4C4B4B4B4A4A4A4C4C4C4C4C4C + 4C4C4C4C4C4C4747473B3B3B2B2B2B1F1F1F1E1E1E1C1C1C1E1E1E2222222424 + 2422222222222225252525252524242424242426262627272728282827272726 + 2626444444A4A4A4C9C9C9DDDDDDF0F0F0FDFDFDFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDFFFFFFFEFEFEFF + FFFFFFFFFFFCFCFCF8F8F8EDEDEDD1D1D1B2B2B27373732F2F2F292929292929 + 2828282828282727272525252525252727272626262222222121212222221A1A + 1A1C1C1C2323233030303E3E3E4747474A4A4A4949494949494949494A4A4A4A + 4A4A4B4B4B4B4B4B4A4A4A4A4A4A4A4A4A4747474343433D3D3D373737313131 + 3030303131313131313131313131313131313131313131313131313131313030 + 3030303030303031313131313131313131313131313130303030303030303030 + 30303030303030303030302F2F2F3030302F2F2F2F2F2F2E2E2E2E2E2E2F2F2F + 2F2F2F3030302F2F2F3030303030303030303030303030303030303030303232 + 3232323231313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313130303032323232323231 + 31313030303333333A3A3A404040464646464646464646474747484848494949 + 4A4A4A4A4A4A4949494848484747474848484949494848484444444141412828 + 282222221E1E1E1E1E1E2020201F1F1F20202023232324242424242424242425 + 25252727272929292929292A2A2A2D2D2D6C6C6CAEAEAED5D5D5E3E3E3F9F9F9 + FBFBFBFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9F1F1F1DFDFDFC1C1C18D8D8D + 4242422020202D2D2D2424242929292828282525252525252727272828282525 + 252020202020202323232323232D2D2D3C3C3C4747474B4B4B4A4A4A49494948 + 48484444444545454848484848484747474444444040403D3D3D363636303030 + 2E2E2E3131313333333131313131313232323131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 31312F2F2F2F2F2F2F2F2F2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E + 2D2D2D2D2D2D2D2D2D2D2D2D2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E + 2E2F2F2F2F2F2F2F2F2F31313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 31313030303232323232323232323131313030303232323434342929292A2A2A + 2E2E2E3434343A3A3A3F3F3F4444444848484747474646464646464545454646 + 464747474747474747474343433A3A3A2E2E2E2424241E1E1E1C1C1C20202025 + 25252525252525252626262626262626262828282A2A2A2B2B2B252525383838 + 8D8D8DCACACAD7D7D7F5F5F5FCFCFCFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFFFFFFFCFCFCF3F3F3 + E7E7E7CFCFCFB3B3B36464642B2B2B2222222D2D2D2424242A2A2A2727272727 + 272626262727272626262323232020202424242B2B2B3838384141414A4A4A4A + 4A4A4343434040404444444A4A4A4949494747474141413A3A3A3232322A2A2A + 2424242020201E1E1E1D1D1D2323232E2E2E3333333232323131313333333131 + 3131313131313131313131313131313131313131313131313131313131313131 + 31313131313030303030303030302F2F2F2F2F2F2E2E2E2E2E2E2D2D2D2D2D2D + 2D2D2D2D2D2D2D2D2D2D2D2D2C2C2C2C2C2C2C2C2C2C2C2C2D2D2D2D2D2D2D2D + 2D2D2D2D2D2D2D2D2D2D2E2E2E2E2E2E2F2F2F2F2F2F30303030303031313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131323232323232323232323232313131303030 + 2E2E2E2D2D2D1E1E1E1D1D1D1F1F1F2222222525252626262A2A2A2F2F2F3D3D + 3D4141414747474A4A4A4A4A4A4848484545454444444C4C4C49494942424236 + 3636292929202020202020232323262626262626272727272727262626262626 + 2727272828282E2E2E262626676767B2B2B2D0D0D0EAEAEAFAFAFAFEFEFEFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FEFEFEFFFFFFFAFAFAF1F1F1E0E0E0C2C2C29797973C3C3C2A2A2A2B2B2B2929 + 292828282A2A2A2626262828282525252424242323232323232727273030303A + 3A3A4141414141414242424343434545454545454444444343433C3C3C363636 + 2D2D2D2424241E1E1E1C1C1C1D1D1D1F1F1F1B1B1B2020202B2B2B3434343535 + 3531313130303033333331313131313131313131313131313131313131313131 + 31313131313131313131313030303030303030302F2F2F2F2F2F2F2F2F2F2F2F + 2E2E2E2D2D2D2D2D2D2C2C2C2C2C2C2C2C2C2C2C2C2B2B2B2B2B2B2B2B2B2B2B + 2B2B2B2B2B2B2B2C2C2C2C2C2C2C2C2C2C2C2C2D2D2D2D2D2D2E2E2E2F2F2F2F + 2F2F2F2F2F2F2F2F2F2F2F303030303030313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131333333323232 + 3232323131313131313131312F2F2F2E2E2E2626262222221F1F1F1F1F1F1D1D + 1D1B1B1B1C1C1C2020202323232A2A2A3434343C3C3C42424245454548484849 + 49493F3F3F4343434545454343433C3C3C3131312626261E1E1E232323242424 + 2525252626262727272727272727272626262E2E2E2525253F3F3F8B8B8BC6C6 + C6DBDBDBF2F2F2FAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFFFFFFF9F9F9EEEEEED9D9D9B3B3B36A6A + 6A2424242D2D2D2E2E2E2626262A2A2A2A2A2A26262626262623232322222226 + 26262C2C2C3333333D3D3D464646434343414141414141454545464646414141 + 3636362C2C2C2222222121212020202020202020202121212222222323231D1D + 1D2626262F2F2F3232322F2F2F2D2D2D2F2F2F33333331313131313131313131 + 31313131313131313131313131313131313030303030303030302F2F2F2E2E2E + 2E2E2E2E2E2E2E2E2E2D2D2D2D2D2D2C2C2C2B2B2B2B2B2B2A2A2A2A2A2A2929 + 292929292828282828282828282828282929292929292A2A2A2A2A2A2B2B2B2B + 2B2B2C2C2C2D2D2D2D2D2D2E2E2E2D2D2D2E2E2E2E2E2E2F2F2F2F2F2F303030 + 3030303030303131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313333333232323131313131313131313131313131313131312929 + 292121211D1D1D1F1F1F2020201E1E1E2020202424241B1B1B1D1D1D21212125 + 25252C2C2C3434343D3D3D434343434343424242424242434343444444404040 + 3333332727272222222222222222222525252828282A2A2A2929292828282525 + 25292929282828636363B6B6B6D2D2D2EBEBEBF8F8F8FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFFFFFFF4F4 + F4E4E4E4C7C7C79A9A9A3E3E3E2424242D2D2D2929292828282727272A2A2A28 + 28282626262424242626262F2F2F3939393E3E3E424242454545424242444444 + 4444444040403737372C2C2C2424241F1F1F2020202222222424242525252323 + 232020201C1C1C1919191D1D1D2828282F2F2F2E2E2E2C2C2C2F2F2F32323232 + 3232313131313131313131313131313131313131313131313131303030303030 + 2F2F2F2F2F2F2E2E2E2D2D2D2D2D2D2D2D2D2C2C2C2B2B2B2B2B2B2A2A2A2929 + 2928282827272727272726262625252525252524242424242425252525252526 + 26262727272727272828282929292A2A2A2B2B2B2B2B2B2C2C2C2C2C2C2C2C2C + 2D2D2D2D2D2D2E2E2E2F2F2F2F2F2F2F2F2F3131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313030 + 303030303131313232322F2F2F2525251E1E1E2020202121211E1E1E1E1E1E21 + 21212727272525252222222121212222222727272E2E2E323232444444434343 + 4141414040404141414343433E3E3E3838382A2A2A2626262323232424242828 + 282A2A2A2A2A2A2828282525252C2C2C262626424242999999C9C9C9E1E1E1F5 + F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFEFEFEFEFEFEFDFDFDEEEEEED8D8D8B5B5B58383832525253131312B2B2B23 + 23232C2C2C2424242B2B2B2929292828282727272C2C2C383838424242444444 + 4040403D3D3D4040403E3E3E3939392F2F2F2424241F1F1F2121212525252525 + 252323232121211F1F1F1E1E1E1F1F1F2020202121212323232F2F2F35353532 + 3232313131353535353535303030313131313131313131313131313131313131 + 3131313131313030302F2F2F2F2F2F2E2E2E2D2D2D2D2D2D2C2C2C2C2C2C2A2A + 2A29292929292928282827272726262625252524242423232322222222222221 + 2121212121222222222222232323242424252525262626272727282828292929 + 2929292A2A2A2B2B2B2B2B2B2C2C2C2D2D2D2D2D2D2E2E2E2F2F2F2F2F2F3131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313030 + 303131313131313131313030302F2F2F3030303131313333332727271F1F1F21 + 21212323232020201E1E1E2121212222222121212020202020201F1F1F202020 + 2121212121212E2E2E3838384040404040403E3E3E3F3F3F4141414141413434 + 342D2D2D2525252323232626262929292828282626262828282C2C2C2A2A2A2A + 2A2A7B7B7BBDBDBDD4D4D4EEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFBFBFBF5F5F5EAEAEACACACAB1B1B14C + 4C4C2A2A2A292929282828282828292929292929282828262626262626313131 + 3A3A3A3C3C3C3A3A3A3B3B3B3D3D3D3F3F3F3B3B3B3131312626262020202121 + 212424242424242323232020202323232323232020202020202222222020201B + 1B1B313131313131313131313131313131313131313131313131313131323232 + 32323232323232323231313130303030303030312F30312F2F302E2F2F2F2E2D + 2F2C2B2D2B2A2E2B2A2E242A1F252B26232A2D1D242D1B1E261C1C1C231E1528 + 1F111B1C181C1D191D1E1C1B1E1C1A1C1C171C1B161B1A15191A20231A20231A + 1F211B1F201C20211F23232326252729282C2B212E2B232E2D262D2D292E2D2C + 302C2D312D2D332D2D332F2F2F30303030303031313131313131313130303030 + 3030323232323232313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 31313030303232322727271D1D1D202020222222202020232323212121212121 + 2121212121212222222222222222222222221E1E1E2626263131313A3A3A3E3E + 3E3F3F3F3E3E3E3E3E3E3C3C3C3A3A3A3030302323232121212828282B2B2B27 + 27272525252B2B2B2B2B2B2C2C2C4A4A4AB3B3B3CACACAE9E9E9F8F8F8FFFFFF + FFFFFFFEFEFEFFFFFFFFFFFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF5 + F5F5E6E6E6C3C3C39595953939392A2A2A2A2A2A2A2A2A2A2A2A292929282828 + 2828282727272F2F2F3636363C3C3C3E3E3E3E3E3E3E3E3E3C3C3C3939392C2C + 2C2727272121211F1F1F21212123232323232322222221212122222222222220 + 20202020202020202020201F1F1F313131313131313131313131313131313131 + 3131313131313131313131313232323232323232323131313030303030303233 + 313132302F302E2D2D2D2B2B2B2B2A2C29282A2726282E262D2521261B1D1D17 + 1E1B151D1C171A1E1A16211C122218141A18141A15131914111A12111A14131D + 15141E14151F1716201918221C1B24201E242221252221232422222321212727 + 27282927292A28292A28292A28292929282A2B292B2C2F2F2F2F2F2F30303031 + 3131313131313131303030303030313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 31313131313131313131313131313131313131312A2A2A2020201F1F1F202020 + 2121212323232121212121212121212222222222222222222222222222222323 + 232222222424242C2C2C3737373E3E3E3D3D3D3A3A3A3C3C3C3D3D3D3737372C + 2C2C2525252525252727272525252929292C2C2C2929292828283C3C3C989898 + C4C4C4E3E3E3F6F6F6FEFEFEFFFFFFFEFEFEFFFFFFFFFFFFFEFEFEFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFEFEFEFEFEFEEFEFEFDDDDDDB9B9B97171712A2A2A2B2B2B2C2C2C + 2C2C2C2B2B2B2828282727272929292B2B2B3838383A3A3A3C3C3C3D3D3D3E3E + 3E3D3D3D3636362E2E2E2222222020201F1F1F20202022222223232323232322 + 22222222222222222222222121211F1F1F1E1E1E212121262626313131313131 + 3131313131313131313131313131313131313131313131313232323232323131 + 3131313130303030303030312F30312F2E2E2E2A2A2A2929292B2B2B28282823 + 23232A1A2B231A241F1C1E1C201B161C17121414110F15140E1920170E20170E + 1D160D1C140D1A140D1A140F1B1510191510160F1C160F1C17111C19141D1A18 + 1E1C1B1F1D1C1E1E1E1E1C261A1E281C222A20232A23262A25292A262B2C2A2E + 2C2B2D2D2D2E2E2E2F2F2F303030303030303030303030303030313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131323232303030 + 2D2D2D2626261E1E1E1E1E1E2222222121212121212121212121212222222222 + 222222222222222323232626262121211D1D1D2121212D2D2D3636363A3A3A3A + 3A3A3A3A3A3D3D3D3C3C3C3535352C2C2C2626262525252626262929292C2C2C + 2828282727272F2F2F737373BBBBBBD8D8D8F1F1F1FCFCFCFFFFFFFEFEFEFFFF + FFFFFFFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCFAFAFAE7E7E7D2D2D2AFAFAF + 5555552929292B2B2B2C2C2C2C2C2C2A2A2A2727272828282D2D2D3232323939 + 393B3B3B3B3B3B3939393737373333332B2B2B23232322222223232324242424 + 24242424242323232222222222222323232121212121212222221F1F1F1D1D1D + 2323232C2C2C3131313131313131313131313131313131313131313131313131 + 313131313131313131313131313131313030302F2F2F2B2B2B2D2D2D2C2C2C28 + 28282829272A2B292627251F201E2420261D191F1A15171B16131E190A231F03 + 2F2D053D3B0B473B01483C024A3E04493E05483D044238023E34003B31002A23 + 0A241D091D160517130816130E1917161A1B1F1E1E24121F1717211B1E252222 + 27262527272828282C2A292E2D292B2B2B2C2C2C2D2D2D2E2E2E2F2F2F303030 + 3030303030303030303030303030303131313131313131313131313131313030 + 3030303030303030303030303030303030303030303030303030303030303030 + 3030303030303030303030303030313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313333333030303131312B2B2B1F1F1F1D1D1D2222222020202121 + 2122222222222222222222222223232323232323232324242424242422222222 + 22222424242B2B2B3434343B3B3B3737373939393B3B3B3A3A3A3333332C2C2C + 2929292929292626262A2A2A2A2A2A2B2B2B292929535353B0B0B0CDCDCDEAEA + EAF9F9F9FFFFFFFEFEFEFFFFFFFFFFFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFB + F7F7F7E2E2E2CACACAA1A1A14141412B2B2B2B2B2B2B2B2B2A2A2A2828282727 + 272B2B2B3232323838383737373A3A3A3A3A3A3535352E2E2E2929292424241F + 1F1F242424252525252525252525242424232323232323232323232323222222 + 2121212222221F1F1F1E1E1E2626263131313131313131313131313131313131 + 313131313131313131313030303131313131313131313131313030303030302F + 2F2F2B2A2C2D2D2D2C2C2C292A2827282626272321231D1A1C16171B1C161713 + 1D1B09322907483D045C50026D6101796C04856F0986700A86730C86720D8270 + 0B7E6B087A6704756501625705574F024940003732012927051E1C0A1616100F + 1112121817161A1B191B231E1D27211D282321272725252827232929292A2A2A + 2B2B2B2D2D2D2E2E2E2F2F2F2F2F2F2F2F2F2F2F2F3030303030303030303131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313333333030303333332F2F2F2222 + 221E1E1E21212120202022222222222222222222222223232323232323232323 + 23232020202424242727272424242020202222222B2B2B333333373737373737 + 3838383939393737373232322D2D2D2A2A2A2525252A2A2A2A2A2A2D2D2D2828 + 283C3C3CA2A2A2C9C9C9E3E3E3F5F5F5FFFFFFFEFEFEFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFBFBFBF6F6F6E1E1E1C4C4C48D8D8D3232322929292C2C + 2C2A2A2A2828282828282A2A2A3030303636363A3A3A3636363A3A3A39393931 + 3131292929252525232323222222222222222222222222222222222222232323 + 2424242424242222222222222222222020201F1F1F2121212A2A2A3333333131 + 3131313131313131313131313131313131313131313130303030303031313131 + 31313131313030302F2F2F2F2F2F2E2D2F2E2D2F2C2C2C292A282526221F211B + 1B1E15191C131716082C280B4C460B6A62098073058B7A029078008F76008D72 + 008C71008B7000896F00886E00866E00866E00866E008476007F710174670565 + 5A0A544B0C3F390C2C2706201B021A180E1A15121913181B131E1D1623211C25 + 2322242526242626262727272929292A2A2A2C2C2C2D2D2D2E2E2E2E2E2E2F2F + 2F2F2F2F2F2F2F30303030303031313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313232 + 3231313133333331313127272720202020202021212122222222222222222223 + 23232323232323232323232323231F1F1F212121232323232323212121212121 + 2323232626263434343535353636363737373737373535353030302A2A2A2828 + 282B2B2B2929292A2A2A2828282F2F2F8F8F8FC5C5C5DCDCDCF2F2F2FFFFFFFE + FEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFBFBFBF1F1F1DBDBDBBABA + BA7777772B2B2B2B2B2B2C2C2C2929292828282A2A2A2F2F2F34343436363636 + 36363636363737373434342B2B2B242424242424252525252525232323222222 + 2222222222222323232323232424242424242121212323232323231F1F1F1F1F + 1F2525252E2E2E34343431313131313131313131313131313131313131313131 + 31313030303030303131313131313030303030302F2F2F2F2F2F302F332C2B2D + 29292928292722241E1B1E151B1F142024184D3E00655509816E0D8E7A05937B + 00947A009075038D7105897101887000876F00846D00836C00816C00826D0083 + 6E017D67007B66007C66007A660776620D6D5B0E605109584805332D082B2508 + 231A0C1D14111C151A1E1A201F21222225232323232525252626262929292B2B + 2B2C2C2C2D2D2D2D2D2D2E2E2E2E2E2E2F2F2F30303030303031313131313132 + 3232323232323232323232323232323232323232323232323232323232323232 + 3232323232323232323232323232323232323131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 313131313131313131313131313333333333333131312C2C2C2222221E1E1E22 + 2222222222222222222222232323232323232323232323242424222222212121 + 2121212222222323232323232222222121212A2A2A3131313636363636363636 + 363737373434342E2E2E2929292C2C2C2929292828282B2B2B292929777777BA + BABAD7D7D7F0F0F0FFFFFFFEFEFEFFFFFFFFFFFFFFFFFFFEFEFEFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFE + FEFBFBFBEBEBEBD3D3D3B1B1B16868682A2A2A3030302C2C2C2929292828282C + 2C2C3333333737373636363232323535353333332D2D2D252525212121232323 + 2525252424242727272626262424242424242525252525252424242222222020 + 202424242323231E1E1E1F1F1F27272730303033333331313131313131313131 + 3131313131313131313131313131303030303030303030313131303030303030 + 2F2F2F2E2E2E2E2D3128272925252525262420221C1A1D141E2216292D21876F + 00927704997705947000906B008E6E038A6E09816A07806F01806F01806E037D + 6D027C6C02786A007668007566007C6107795E03775C01785E007A61007B6300 + 796100765F00524E0D453F0A332A08231A0C1C15121A1818191B1B181D1B2222 + 222323232525252828282A2A2A2B2B2B2C2C2C2C2C2C2E2E2E2E2E2E2F2F2F2F + 2F2F303030313131313131323232333333333333333333333333333333333333 + 3333333333333333333333333333333333333333333333333333333333333131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313130303034343432323230 + 30302F2F2F2424241D1D1D232323222222222222232323232323232323232323 + 2424242424242424242424242424242424242525252525252525252525251F1F + 1F2C2C2C3636363636363535353838383838383434342727272B2B2B29292929 + 29292F2F2F282828646464AFAFAFD5D5D5EFEFEFFEFEFEFEFEFEFFFFFFFFFFFF + FFFFFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFEFEFEFDFDFDE9E9E9D1D1D1AEAEAE4D4D4D2F2F2F2C + 2C2C2C2C2C2626262B2B2B3434343434343535353838383737373333332B2B2B + 2323232121212323232525252424242121212525252424242424242424242424 + 242323232323232323232121212222222121211F1F1F2424242C2C2C32323232 + 3232313131313131313131313131313131313131313131313131313131313131 + 3131313131313030302F2F2F2E2E2E2D2D2D3429332D2D2D1D2923192527191A + 1E2B200A5C4E027D71008D79098A760686720284700185710285700385700384 + 6F02857100857100837000816F00806D007D6B007A6A00796900766302746001 + 705E016E5C016C5B046A5903665603655502715B036B58015E5000473F00302B + 00201B06191416181225181D20191D1E201E1D26221D2D27222D2A262C2D2B28 + 2C2D2B2B2B2C2C2C2C2C2C2D2D2D2F2F2F313131313131313131343434333333 + 3333333333333434343636363838383939393838383838383939393939393838 + 383636363434343333333737373333332F2F2F2F2F2F31313134343434343433 + 33332F2F2F2F2F2F3030303030303030303030303030302F2F2F313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313132323232 + 3232313131313131313131303030303030303030303030303030323232323232 + 3131313131313131313131313131313131313131313131313131313131313030 + 3030303030303030303031313131313131313131313131313131313131313131 + 31313232323232322F2F2F3131313232322828281F1F1F232323222222222222 + 2323232424242525252525252525252424242424242424242424242424242424 + 2424242424242424242423232323232328282833333339393937373735353535 + 35353434342828282929292828282C2C2C2A2A2A4D4D4DABABABCECECEE8E8E8 + FCFCFCFFFFFFFFFFFFFEFEFEFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFCFCFCE7E7E7CD + CDCDA8A8A84747472D2D2D2C2C2C2B2B2B2828282E2E2E353535353535363636 + 3737373434342D2D2D2828282424242323232525252626262424242222222525 + 2524242424242424242424242424242423232323232322222222222220202020 + 20202525252E2E2E323232313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313030302F2F2F2E2E2E2D2D2D312A + 2D27292A1B2525161E1D1F1D1246380E77630E8A79018E79068B750588720287 + 7101877002877002866F02866F02847000846F00826E00806D007F6B007C6900 + 796801786601756102735F006F5D006D5B006A5902675802655502615301624D + 00614F005E5200574E0549420B36300D241C0F1A10101315151A1A1A211E2023 + 2022242222252322272826282C272A2A2A2B2B2B2C2C2C2D2D2D2F2F2F313131 + 3232323232323131313434343838383B3B3B3C3C3C3C3C3C3B3B3B3B3B3B3D3D + 3D3D3D3D3C3C3C3C3C3C3C3C3C3D3D3D3D3D3D3E3E3E39393939393939393937 + 37373535353333333030302E2E2E303030303030313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131323232323232313131313131313131303030303030303030 + 3030302F2F2F3131313131313131313131313131313131313131313131313131 + 3131313131313131313131313130303030303030303031313131313131313131 + 31313131313131313131313131313131313333333030303030303232322B2B2B + 2222222121212222222222222323232424242525252525252525252424242424 + 242424242424242424242424242424242424242424242323232323232727272F + 2F2F3535353737373636363535353636362C2C2C2B2B2B2828282D2D2D292929 + 464646A7A7A7CCCCCCE7E7E7FAFAFAFFFFFFFFFFFFFEFEFEFDFDFDFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFBFBFBE5E5E5C8C8C8A1A1A13D3D3D2B2B2B2B2B2B2A2A2A2C2C2C + 3232323636363636363838383636362F2F2F2626262525252424242525252626 + 2626262625252523232325252525252524242424242424242424242424242423 + 23232323232121212020202121212828282F2F2F323232303030313131313131 + 3131313131313131313131313131313131313131313131313131313131313030 + 302F2F2F2E2E2E2D2D2D2E2B2722252A1D222B1B1C18332B066A591090771195 + 79038B76038A7502887300887202877101877002866F01856E00846E00836C00 + 816C007F6B007E69007A6601776401766300735F006F5D006D5A006B59006857 + 016555026153015F50015C4A005A4B005A4D005A5003554C094B400C3B300A2F + 240618160B1A171219181A1A19221B1A241E1E242124222628222929292A2A2A + 2C2C2C2E2E2E3030303232323434343535353939393B3B3B3E3E3E3F3F3F3F3F + 3F3F3F3F4242424444444141414242424343434343434343434141413F3F3F3E + 3E3E383838393939393939373737353535333333343434353535323232323232 + 3232323232323232323232323131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131303030303030 + 3030303030303030302F2F2F2F2F2F2F2F2F3131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131303030333333 + 3131312F2F2F3232322F2F2F2626261F1F1F2222222222222323232424242525 + 2525252525252524242424242424242424242424242424242424242424242424 + 24242424242424242525252929292F2F2F363636373737353535373737323232 + 2D2D2D2727272D2D2D2727273C3C3CA3A3A3C9C9C9E4E4E4F9F9F9FEFEFEFFFF + FFFFFFFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF9F9F9E4E4E4C6C6C69D9D9D363636 + 2B2B2B2B2B2B2A2A2A2F2F2F3535353737373737373838383232322A2A2A2323 + 2324242425252525252526262625252525252524242425252525252525252525 + 25252424242424242424242424242424242121212020202323232B2B2B313131 + 3232323030303131313131313131313131313131313131313131313131313131 + 313131313131313131313030302F2F2F2E2E2E2D2D2D292C2322242C21212D28 + 22155344068A730D997B049572008A7601897500897500897401887300877101 + 867000846E00846D00836C00816B017E69007D6602796401756201746001705E + 016E5B006A58006756006654016251005E4F005C4D005E4F07584B0154470053 + 46005348005346025142044C3D052C2706211F0717150D1212181517221B1C26 + 2021252222222626262828282B2B2B2E2E2E3131313434343737373939393939 + 393D3D3D4141414444444545454646464949494B4B4B4C4C4C4B4B4B4A4A4A49 + 49494848484848484949494949494444444343434141413F3F3F3D3D3D3B3B3B + 3A3A3A3A3A3A3434343333333333333232323131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3030303030303030302F2F2F2F2F2F2F2F2F2F2F2F2E2E2E2E2E2E2E2E2E2F2F + 2F2F2F2F2F2F2F30303030303030303030303030303030303030303030303031 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131312F2F2F3333333232322F2F2F3131313333332A2A2A1F1F1F2222 + 2222222223232324242425252525252525252524242424242424242424242424 + 24242424242424242424242424242424242525252424242323232A2A2A343434 + 3838383636363737373636362F2F2F2828282E2E2E2727273434349F9F9FC7C7 + C7E2E2E2F7F7F7FDFDFDFFFFFFFFFFFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF8F8F8 + E4E4E4C6C6C69D9D9D3131312B2B2B2A2A2A2C2C2C3333333636363737373838 + 383636362E2E2E26262624242425252525252525252524242424242425252525 + 2525252525252525252525252525242424242424242424242424242424212121 + 2121212626262D2D2D3232323131313030303131313131313131313131313131 + 313131313131313131313131313131313131313131313030302F2F2F2E2E2E2D + 2D2D292C2323252D221F28342B10715C0A9C7F069777009271008B75008C7600 + 8C76008C75018B74008A7200887000887000856E00846D00816B017F6A017D66 + 02786300746100735F006F5C016D59016956006655006252005F50015A4D0058 + 4B00554804544802534700544700544700544600544500554600433E07363005 + 24210517160C1315161817201D1A231E1B242323232626262B2B2B2F2F2F3232 + 323636363B3B3B3E3E3E4545454646464848484A4A4A4B4B4B4E4E4E52525255 + 55555050505252525353535454545353535050504D4D4D4B4B4B4B4B4B484848 + 4545454444444444444242423D3D3D3838383737373636363434343232323131 + 3130303030303030303031313131313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313030303030302F2F2F2F2F2F2F2F2F2E2E2E2E2E2E2E2E2E2E2E2E2D2D + 2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2E2E2E2E2E2E2E2E2E2F2F2F2F2F2F2F + 2F2F2F2F2F2F2F2F303030303030303030313131313131313131313131313131 + 3131313131313131313131313131313131312F2F2F3232323232322F2F2F3030 + 303434342E2E2E20202022222222222223232324242425252525252525252524 + 2424252525252525252525252525252525252525252525252525242424252525 + 2323232121212626263030303636363636363535353636363131312A2A2A2E2E + 2E2929292F2F2F9E9E9EC4C4C4E0E0E0F6F6F6FDFDFDFFFFFFFFFFFFFEFEFEFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF7F7F7E3E3E3C6C6C69D9D9D2D2D2D2D2D2D2A2A2A3030 + 303535353636363636363737373333332A2A2A25252526262626262625252524 + 2424242424242424252525262626262626252525252525252525252525252525 + 2424242424242323232121212222222929293030303232323131313030303131 + 3131313131313131313131313131313131313131313131313131313131313131 + 31313030302F2F2F2E2E2E2D2D2D292A2624272B201F1B3F330982690BA08100 + 9576009179028C77008D78008E79008E78018C76008B74008A73008A73008771 + 01877002836E01806C017E69007965007562007461006E5C036C590267560065 + 53006251005E4E01594B005749004D4200504501544802534701504400504200 + 5042005143005147074941063B35062A28061D1C081916111A17191B18211F1F + 1F2424242A2A2A3030303434343939394040404444444949494C4C4C50505055 + 55555858585A5A5A5959595858585F5F5F5E5E5E5D5D5D5B5B5B595959585858 + 5757575656565959595454544D4D4D4848484646464444444040403D3D3D3B3B + 3B3A3A3A37373734343432323230303030303030303031313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313030303030303030302F2F2F2F2F2F2E2E2E2E2E2E2D2D2D2D2D + 2D2C2C2C2C2C2C2C2C2C2C2C2C2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2C2C2C2C + 2C2C2D2D2D2D2D2D2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2F2F2F303030303030 + 3030303131313131313131313131313131313131313131313131313131313030 + 3031313133333330303030303034343430303024242422222222222223232324 + 2424252525252525252525242424252525252525252525252525252525252525 + 2525252525252525252525252424242222222424242B2B2B3333333737373434 + 343535353333332D2D2D2D2D2D2A2A2A2D2D2D9C9C9CC4C4C4E0E0E0F6F6F6FD + FDFDFFFFFFFFFFFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5E1E1E1C4C4C49C9C + 9C2A2A2A2F2F2F2A2A2A3434343636363535353535353737372F2F2F25252525 + 2525262626252525252525252525252525262626262626262626262626262626 + 2525252525252525252525252525252424242222222121212424242C2C2C3131 + 3131313131313131313131313131313131313131313131313131313131313131 + 31313131313131313131313131313030302F2F2F2E2E2E2D2D2D29252A262829 + 2223134B3F098A6F0D9F7D019279008B7D058F7800917A00927A029179018F77 + 008E76008E76008F76028A7601897401867202826F00806C017B680076650075 + 63006E5B046C59026756006352016051025C4F01594B005649004F45004F4500 + 4F43014C40004A3D00493C004A3E004C4000513E055040054C4103433A01332E + 012424061C1C101618181D1D1D2222222A2A2A3030303636363C3C3C44444449 + 49495252525151515151514F4F4F4A4A4A3F3F3F3333332A2A2A2E2E2E2B2B2B + 2929292A2A2A3131313E3E3E4C4C4C5555555959595A5A5A5959595656565050 + 504B4B4B4747474646464141413F3F3F3B3B3B37373734343432323231313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3131313131313131313131313131313131312F2F2F2F2F2F2F2F2F2E2E2E2D2D + 2D2D2D2D2C2C2C2C2C2C2B2B2B2B2B2B2B2B2B2A2A2A2A2A2A2A2A2A2A2A2A2A + 2A2A2929292A2A2A2A2A2A2B2B2B2B2B2B2C2C2C2D2D2D2D2D2D2D2D2D2D2D2D + 2D2D2D2E2E2E2F2F2F2F2F2F3030303030303131313131313131313131313131 + 313131313131313131313131313030303232323131312F2F2F33333332323228 + 2828222222222222232323242424252525252525252525242424252525252525 + 2525252525252525252525252525252525252525252525252525252525252424 + 242727272F2F2F3737373535353535353535353131312C2C2C2B2B2B2C2C2C9A + 9A9AC4C4C4E0E0E0F7F7F7FEFEFEFFFFFFFFFFFFFEFEFEFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF4F4F4DEDEDEC1C1C19A9A9A2828283030302A2A2A37373737373733333334 + 34343636362C2C2C232323252525242424242424242424262626272727282828 + 2727272626262626262626262626262525252525252525252525252424242121 + 212121212525252D2D2D31313131313130303032323231313131313131313131 + 31313131313131313131313131313131313131313131313131313030302F2F2F + 2E2E2E2D2D2D29212B272A28282B11544B0C8E710F9E7B03917B00827A019079 + 00927B01937C02927A029078008F77009078019179028B77008B770287740184 + 7201816E007C6A007767007666006E5B046C58036856036453026051025C4E02 + 584B015649005148004E44004C4000483D01473C03473C03443B02443B024A33 + 034D390051400050440045410034340620240B13190E1B1B1B2121212A2A2A31 + 31313737373E3E3E4747474D4D4D4A4A4A3D3D3D2C2C2C1F1F1F1B1B1B1B1B1B + 1D1D1D1D1D1D1C1C1C1C1C1C1C1C1C1B1B1B1B1B1B1A1A1A1919191919192525 + 253636364C4C4C5959595959595353534E4E4E4C4C4C4545454343433E3E3E3A + 3A3A363636343434333333323232313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131312F2F + 2F2F2F2F2E2E2E2D2D2D2D2D2D2C2C2C2B2B2B2B2B2B2A2A2A2A2A2A2A2A2A2A + 2A2A2929292929292929292929292828282929292929292A2A2A2B2B2B2B2B2B + 2C2C2C2C2C2C2C2C2C2C2C2C2D2D2D2D2D2D2E2E2E2F2F2F2F2F2F3030303131 + 313131313131313131313131313131313131313131313232322F2F2F32323232 + 32322F2F2F3131313232322B2B2B222222222222232323242424252525252525 + 2525252424242525252525252525252525252525252525252525252525252525 + 252525252626262727272424242424242C2C2C37373737373734343437373734 + 34342B2B2B2B2B2B2B2B2B989898C4C4C4E0E0E0F7F7F7FEFEFEFFFFFFFFFFFF + FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5E1E1E1C2C2C29A9A9A29292931313130 + 30303636363535353939393838382E2E2E282828272727232323262626262626 + 2626262626262626262626262626262626262626262626262626262626262626 + 262525252424242323232222222323232929293030303333333030302F2F2F32 + 3232313131313131313131313131313131313131313131313131323232323232 + 3232323131313030302F2F2F2D2D2D2D2D2D2B2D2E241F2E2C231A574F028A78 + 009E7E019B7705927704927704947906967C06987D05977C03987C00987C0099 + 7D00977D01957B009078008E77008A7300856E018168027D6402796200745E00 + 6E59006855006150005A4B025748035245015144004D41004A3E00473C00463B + 01443B02413A03403902423900413800423900443B02473E05473E05453C0343 + 3A01241C0F24201525261C282F283439373D3F403D363D362B35191919191919 + 1919191A1A1A1B1B1B1C1C1C1D1D1D1D1D1D1C1C1C1C1C1C1C1C1C1C1C1C1C1C + 1C1C1C1C1C1C1C1C1C1C1E1E1E1A1A1A1C1C1C2A2A2A40404052525258585858 + 58584A4A4A4545454141414141413B3B3B343434333333383838333333323232 + 3131313131313232323232323131313030303131313232323232323232323232 + 3231313130303030303031322E312F2E312C2E30282F2F272E2D262D2B272D29 + 282C3023312D212D2922272822232824232725252724262622271E261C20281E + 222922242A25272B26272A282628282527273225332F25312F272E2E292B2C2A + 2A2C2A2A2A292B2B2A2C2F2F2F30303030303031313131313131313130303030 + 30303232323232323131313131313131313131313131313131312424241F1F1F + 2121212626262525252424242727272525252626262626262626262626262626 + 262626262626262626262626262626262626262525252424242727272B2B2B2F + 2F2F3838383737373535353636363232322D2D2D2A2A2A999999C2C2C2DFDFDF + F6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5E1E1E1C2 + C2C29A9A9A2A2A2A3232323030303636363636363939393737372C2C2C272727 + 2828282525252626262626262626262626262626262626262626262626262626 + 2626262626262626262626262625252524242423232322222224242429292930 + 3030323232303030303030323232313131313131313131313131313131313131 + 3131313131313232323232323232323131313030302F2F2F2E2E2E2D2D2D292B + 2B26222E2D271C544D048877009E7E019A7702957903977D07997F099A81099C + 81089A80049A7E01997D00997E00987F01967D00927B009179008E76008A7202 + 846C028168027B6400766100705C006957006352015E4E02584A025448025144 + 004F41004A3E00473C00463C00433A014238023F380142390042390042390043 + 3A01443B02453C03453C03443B0239330E2E2A0E2726182A2B2929292F1E1E24 + 1815171611121818181818181919191919191A1A1A1B1B1B1C1C1C1D1D1D1C1C + 1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C2020202020201E1E1E1B + 1B1B1E1E1E2B2B2B4141415151515757575353534949494040403D3D3D3D3D3D + 3A3A3A3434343333333232323131313131313131313232323131313030303131 + 313131313232323232323131313030303030302F2F2F302E2E2F2D2D2E2C2C30 + 2B2C2D2B2A2A2B27262A2424282226252125251F22251C23271C23271C21261D + 1F231E1D1F1F23212023212022201F22201F22201F23221E2625212827232624 + 242927262C2B272F2E2A2F2E2A2F2E2A2D2E2C2E2F2D2E2E2E2E2E2E2F2F2F30 + 30303030303030302F2F2F2F2F2F313131313131313131313131313131313131 + 3131313131312525251F1F1F2121212626262424242525252727272525252626 + 2626262626262626262626262626262626262626262626262626262626262625 + 25252525252626262A2A2A2C2C2C3838383737373636363636363333332E2E2E + 2A2A2A9A9A9AC2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFF5F5F5E1E1E1C2C2C29A9A9A2A2A2A333333323232363636373737 + 3939393434342A2A2A2626262828282727272626262626262626262626262626 + 2626262626262626262626262626262627272727272726262625252524242424 + 24242222222525252B2B2B313131323232303030303030323232313131313131 + 3131313131313131313131313131313131313232323232323232323131313030 + 302F2F2F2E2E2E2D2D2D2A2B2729272D2E2A1F4F49088473049D7F0297780096 + 7B029E850D9F860EA0880EA0860A9D84069D82029B80009B81009C82009B8100 + 977F00957F00927C008D7700897101846D007E68007A6400745E006C59006655 + 005F50015A4B025749015144004F42004A3E00473C00453B0044390041380040 + 3600423900423900413800413800413800423900443B02453C03403B00393304 + 2E2910231D181612180E0C120F0F0F1314101717171717171818181919191A1A + 1A1B1B1B1C1C1C1C1C1C1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D + 1D1D1919191C1C1C1E1E1E1B1B1B1818181B1B1B2424242C2C2C4D4D4D565656 + 5555554848484141414242423F3F3F3636363434343333333131313131313131 + 313232323131313030303131313131313131313131313131313030302F2F2F2E + 2E2E312A312F2A2C2B2928282A24252A2121291E1D251A1923171B221B1A2218 + 182216172115172016161D1814191A13181B1E161D20191E221B20231C1F211C + 1E211C1D221E1D231F1E1D271B21291E242C22272C23282A242729232A2A242A + 2A242C2C2C2C2C2C2D2D2D2E2E2E2F2F2F2F2F2F2F2F2F2E2E2E313131313131 + 3131313131313131313131313131313131312727272020202121212626262424 + 2425252527272725252526262626262626262626262626262626262626262626 + 2626262626272727272727262626262626262626282828292929363636363636 + 3737373737373434343030302C2C2C9A9A9AC2C2C2DFDFDFF6F6F6FDFDFDFFFF + FFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5E1E1E1C1C1C19A9A9A2B2B2B + 3434343434343636363838383838383030302828282626262828282929292727 + 2727272727272727272727272727272727272727272727272727272727272727 + 27272626262525252424242424242222222626262D2D2D313131323232303030 + 3030303232323131313131313131313131313131313131313131313131313131 + 313232323232323131313131313030302F2F2F2E2E2E2C2E28292B2C2B2A2045 + 3E0C7D6C0B9C8206977A00957B00A28911A38B11A48C12A58B0FA2890BA18606 + A086049F8503A084019F83009C83009A8300968000937D008E7600897100836C + 007E6800786100705C006A57006251005D4D00584A005445004F42004D3F0049 + 3D00463B004439004037003F35004036004137014137014036003F3500403600 + 423802443A044B3F004A3F0541380D2E270C1812050D0A050F0F0F19181A1515 + 151616161717171919191A1A1A1B1B1B1B1B1B1C1C1C1D1D1D1D1D1D1D1D1D1D + 1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1B1B1B1919191A1A1A1C1C1C1D1D1D + 1C1C1C1A1A1A2B2B2B4040405454545555554B4B4B4242423E3E3E3D3D3D3636 + 3634343432323231313131313132323232323231313131313131313131313130 + 30303030302F2F2F2E2E2E2D2D2D332C312F2A2C2728262025231E25221D2322 + 1B1F20191C2016182215191E14171B12171612171612151914141A15141E1811 + 141B14171E191B201A1F1E1A201C19221D1A231F1C2516201A18221C1C23201E + 23222123232526242B2A262E2E282A2A2A2B2B2B2C2C2C2D2D2D2E2E2E2E2E2E + 2F2F2F2F2F2F3030303030303030303131313131313131313131313131312A2A + 2A22222222222225252524242425252527272725252527272727272727272727 + 2727272727272727272727272727262626272727272727272727272727262626 + 2626262727273333333636363737373838383636363232322D2D2D9A9A9AC2C2 + C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5 + E1E1E1C1C1C19B9B9B2C2C2C3636363636363535353939393636362D2D2D2626 + 262626262828282A2A2A27272727272727272727272727272727272727272727 + 2727272727272727272727272727272727262626252525242424222222282828 + 2F2F2F3232323131313131313131313232323131313131313131313131313131 + 313131313131313131313131313131313232323232323131313030302F2F2F2F + 2F2F32322C292C2A2828223C33127561139D840C997D00967A00A48A14A58C14 + A78E16A98E15A78D11A78B0EA68B0BA68B0BA78807A68805A287019F86009B84 + 00978100937B018F7700887000826B007C6600745F006C5900665500604F005B + 4C005546015344004E41004A3E00473C00443A004237003F36003F3500403600 + 4137014137013F35003F35004036004238024C3B034A3C024C43044A44093633 + 061D1900100C07110C151313131515151616161818181A1A1A1B1B1B1B1B1B1B + 1B1B1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1F1F1F1E1E1E + 1D1D1D1C1C1C1C1C1C1C1C1C1E1E1E1F1F1F1717172525253F3F3F5454545555 + 5548484840404041414139393936363633333332323232323232323232323231 + 31313030303030303030303030302F2F2F2E2E2E2C2C2C2C2C2C302B2A2B2928 + 2426261E23261D20281D1C261F18272014261810171912151B17121D190E1F1A + 0B1F1A0B20190A20180B201C091C1A08181709131109100E0D100F1313121B16 + 151F161B1C171B201A1B251E1D271F1E282322262826252A2A24292929292929 + 2B2B2B2C2C2C2E2E2E2F2F2F2F2F2F2F2F2F2F2F2F3030303030303030303131 + 313131313131313131312D2D2D23232322222225252524242425252527272725 + 2525272727272727272727272727272727272727272727272727272727272727 + 2727272828282828282727272626262525253030303434343838383939393737 + 373434342F2F2F999999C2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF5F5F5E0E0E0C1C1C19B9B9B2D2D2D3737373737373535 + 353A3A3A34343429292926262628282828282829292927272727272727272727 + 2727272727272727272727272727272727272727272727272727272727262626 + 2525252424242222222929293030303232323131313131313232323232323131 + 3131313131313131313131313131313131313131313131313131313132323232 + 323231313131313130303030303034332F292C2A26282934291B675215977F0D + 9A8100987B02A68B19A88D1AAA8F1CAD911BAC9119AD9017AE9216AE9216AF8E + 0FAD8D0CA98B08A58A04A188049C8303977F03947B038E7402887000816A0079 + 6300715D006A5800645300604F00594A025546015242004E40004A3D00463B00 + 4338004136003F34004035014035014035014035013F34004035014035014330 + 05443500493F004D48004B4601393505211A070E060612121213131315151518 + 18181919191A1A1A1A1A1A1A1A1A1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D + 1D1D1D1D1D1D1C1C1C1E1E1E2020202121212020201E1E1E1D1D1D1C1C1C1D1D + 1D1919192424243E3E3E5252525252524848484141413D3D3D3A3A3A36363633 + 33333232323232323232323131313030303030303030302F2F2F2E2E2E2D2D2D + 2B2B2B2A2A2A2A27232526241E2125191D2218181E1B1419221213261110281C + 003124003B3102473D0751460A56490B584B0D5A4B0D484409423F083B370632 + 2E05282506221E061A180618150717140F18141318141A1B14211C18241F1C25 + 201F211E211F2626262727272929292B2B2B2C2C2C2E2E2E2E2E2E2E2E2E2F2F + 2F2F2F2F2F2F2F3030303030303131313131313131312F2F2F25252522222224 + 2424242424252525282828252525272727272727272727272727272727272727 + 2727272727272828282828282727272828282828282828282727272626262C2C + 2C3333333838383939393838383636362F2F2F989898C2C2C2DFDFDFF6F6F6FD + FDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5E0E0E0C1C1C19B9B + 9B2E2E2E3838383939393535353A3A3A32323227272727272729292928282828 + 2828272727272727272727272727272727272727272727272727272727272727 + 2828282828282727272626262525252525252222222A2A2A3232323232323131 + 3131313132323232323231313131313131313131313131313131313131313131 + 3131313131313131323232323232323232313131313131303030343232262B2A + 2A2C343124265841148F770D9D83019E7D08AA8D20AC8F22AF9324B29423B295 + 22B49620B49620B59720B89319B39115AF8F0EAB8C0BA78A09A286099D82099B + 8008927A038F7503866F017E69007562006F5C016857006554005B4C04594904 + 5444014F41004B3F00483D014539004237004237034035013F34003E33003F34 + 00403501403501403501433406483B034B3E004A3D004C43004B4307372F071F + 17001111111212121515151717171919191A1A1A1A1A1A1A1A1A1C1C1C1C1C1C + 1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C2020201E1E1E1C1C1C1C1C1C1E1E + 1E1F1F1F1E1E1E1C1C1C2020201C1C1C1A1A1A2424243C3C3C50505050505045 + 45454040403D3D3D383838353535333333323232313131313131303030303030 + 2F2F2F2F2F2F2D2D2D2C2C2C2A2A2A292929272525202223191C2114171B1819 + 102821083A2C024A35016D5B0872610A7A6A0A82700B857209867006866E0485 + 6C047F6F0B7C6C0B77680C6F610E66590D584D094B4002423700252000201B02 + 1D140A1A12131B141B1C1A201B1F201C211F2323232424242626262828282A2A + 2A2B2B2B2C2C2C2D2D2D2E2E2E2E2E2E2F2F2F30303030303031313131313132 + 3232313131262626222222242424242424252525282828262626272727272727 + 2727272727272727272727272727272727272929292828282727272828282929 + 292A2A2A29292928282829292931313137373739393938383836363630303097 + 9797C2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF5F5F5E0E0E0C1C1C19B9B9B2E2E2E3939393A3A3A3535353A3A3A31313126 + 26262828282B2B2B282828272727272727272727272727272727272727272727 + 2727272727272727272828282828282828282727272626262525252525252222 + 222B2B2B33333332323230303031313132323232323231313131313131313131 + 3131313131313131313131313131313131313131323232323232323232313131 + 313131303030353032262A2B2E2E3A2F212D4D351187700A9F8404A2800EAD8F + 26AF9226B29529B6972AB59728B79726B89926B99A27BE9921BA951BB39115AE + 8E0FA98C0CA5890CA3860D9F830D977D079279058B7303826C027A6502726003 + 6D5B026857015D4E065A4B035546015042004C4000483D00463B004338004439 + 054136023E33003C31003E33004035014136024136024136024639014A3B004E + 3D005343005347074842073B38011010101212121414141717171919191A1A1A + 1A1A1A1919191C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1B1B + 1B1C1C1C1D1D1D1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1818182323231F1F1F15 + 15152424244545455454544C4C4C4242423F3F3F3A3A3A363636333333323232 + 3131313030303030302F2F2F2F2F2F2E2E2E2D2D2D2B2B2B2A2A2A2929292524 + 281F1E27161A1F13181621240B403C07655A0A7E6E0D8974018B770290790091 + 7A009378009477009777009977009074008D7300897000876F00846F027D6A03 + 7262006C5B004F4B10423D0C31290B221A0D191413161517131817131A172121 + 212222222424242626262828282A2A2A2A2A2A2B2B2B2E2E2E2E2E2E2F2F2F2F + 2F2F303030313131313131323232323232272727222222242424232323262626 + 2828282626262727272727272727272727272727272727272727272727272A2A + 2A2828282727272727272929292A2A2A2A2A2A29292928282831313137373738 + 3838383838373737303030979797C2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFF + FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5DFDFDFC2C2C298989835353535353535 + 35353838383838382B2B2B2828282B2B2B272727292929282828282828282828 + 2828282828282828282828282828282828282929292929292929292828282727 + 272626262424242323232323232E2E2E3232323030303131313030302E2E2E32 + 3232313131313131313131313131313131313131313131313131313131313131 + 31313131313131313131313131313131313132312D3230282E2F262C2F2D2B2C + 2352461C97791AB68B00A0891BAE9729B29A30B09632B69635BA9632BF952AC5 + 9926B9982AB89729B59524B19120AC8D1AA88916A58613A3850F9A7F0C967C0A + 8F76088B7008856A087E6308795E07765B05695507665204604E015A49005647 + 005243005040004C3E0044390044390043380042370042370041380041380042 + 3900463901473B01493E024B3E004C4000514400544802574B03322806150B0B + 140D221915201B1712211B141919190F19191818181919191919191A1A1A1A1A + 1A1A1A1A1A1A1A1A1A1A1B1B1B1C1C1C1D1D1D1D1D1D1E1E1E1E1E1E1D1D1D1D + 1D1D1F1F1F1B1B1B1D1D1D1C1C1C191919272727434343545454434343464646 + 3F3F3F363636343434333333303030323232302F312E2F2D2E2E283835302F2F + 2922252324292719221F1326290F161920160C4C3508775C058D7400957C0099 + 7F03887300887202857101857101837001826F00826E01806F01816B02806A04 + 7E68027E68027B68017C68037B69047B69048168027B64006C5B005249003831 + 00231F0319141317101F171A1E191D1E1D1F1F2122202624232C252830252F33 + 25312B2B2B2C2C2C2E2E2E2F2F2F2E2E2E2E2E2E2F2F2F3030303030302D2D2D + 2020202222222828282424242626262727272828282828282828282828282828 + 2828282828282828282828282828282828282828282828282828282828282828 + 28282A2A2A2C2C2C373737363636393939353535353535979797C2C2C2DFDFDF + F6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5DFDFDFC2 + C2C29898983535353535353636363838383838382B2B2B2828282B2B2B282828 + 2929292828282929292929292929292929292929292929292929292929292929 + 292929292929292828282727272626262424242323232424242F2F2F33333331 + 31313131313030302F2F2F323232313131313131313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313430 + 2F36332E30302A2B2D2D2728263F36157E6515AD8913A78B0EB09221B89936B8 + 9B39B49931B89A2BBD992DBE952EB8992CB7992AB59728B29425AE901FA98B1A + A38613A083109B810F987D0E92780C8D740C876E0C83680D7E630C79600A6D59 + 0B6A56086452055E4D045849015445005141004D3F00483B00463B00453A0045 + 3A00443900443900423900433A01463901473B014B3D024B3E004E4000514400 + 544802594B033D35061E150B160F1E17151B19160E1E1A151818180E171A1818 + 181818181919191919191A1A1A1A1A1A1A1A1A1A1A1A1B1B1B1C1C1C1D1D1D1D + 1D1D1E1E1E1E1E1E1D1D1D1D1D1D1D1D1D1D1D1D1E1E1E1E1E1E1A1A1A1D1D1D + 3333334D4D4D4D4D4D4545453F3F3F3B3B3B373737353535333333313131302F + 312F302E2E2E2834332F2F2D2C26252725292A1D222110151E1C1A123F350D6E + 5D0E8A76078F77008D72008E7104897401887300867202857101837001837001 + 826F00826E01816C03806B027F69037D67017A66017A6601786601786502765F + 00776300736302675F05565007403C072C2706201A071611131815171C1B1D1E + 20211F21222323232925242C27242A2A2A2C2C2C2E2E2E2F2F2F2E2E2E2F2F2F + 3030303131313030302D2D2D2121212323232828282525252626262727272828 + 2828282828282828282828282828282828282828282829292929292929292929 + 29292929292929292929292929292A2A2A2C2C2C373737363636393939353535 + 353535979797C2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFF4F4F4DFDFDFC2C2C2989898353535363636363636383838383838 + 2B2B2B2929292B2B2B2828282929292929292929292929292929292929292929 + 2929292929292929292929292929292929292928282827272726262624242424 + 2424262626303030333333313131323232313131303030333333323232323232 + 3232323232323232323232323232323232323232323232323232323232323232 + 32323232323232323232312F2F393534302E2D2A2D32262A2F2B2917594A128F + 7620B5930AB18C18B79433BD9D3CB49D2FB39D26B89B2FBA9337BB9B30B9992E + B8982DB6972AB39427AE9021A68819A082139D82139A7F11947A108F75118A71 + 11866C128267107D640E745E106F5B0D6A56096451085F4D0659490454440151 + 41004C3F014B3E004A3D00473C00473C00453A00463B01463B01473B014A3C02 + 4B3D024C40004E4000514500564800584A024D46072922091612171214151615 + 0B1B17121716180E141916161617171717171718181818181819191919191919 + 19191B1B1B1B1B1B1C1C1C1D1D1D1E1E1E1E1E1E1E1E1E1D1D1D1E1E1E1F1F1F + 1D1D1D1E1E1E1D1D1D1818182222223C3C3C5454544747474141413F3F3F3A3A + 3A36363636363631313132303032312D2D2F292F302E2C2B2F28252E28262C20 + 1F212213173E3111675C0A867B029081008F77008B6E018B6D08897401897401 + 887300857101857101837001826F00826F00816C03806B027E68027A67007864 + 007562007562007461006F5B006D5C006C60006B62006762055D59084E490443 + 3E012819102218111C171818191D181D201C232021271C252B1A2828282A2A2A + 2D2D2D2E2E2E2E2E2E2F2F2F3030303131313030302F2F2F2222222323232929 + 2925252527272728282828282828282828282828282828282828282828282828 + 28282929292929292929292929292929292929292929292929292A2A2A2C2C2C + 3737373636363A3A3A363636353535989898C2C2C2DFDFDFF6F6F6FDFDFDFFFF + FFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F4F4DFDFDFC2C2C2999999363636 + 3636363737373838383838382B2B2B2929292C2C2C2929292A2A2A2929292929 + 2929292929292929292929292929292929292929292929292929292929292929 + 2929272727262626252525242424282828313131343434313131333333323232 + 3131313333333232323232323232323232323232323232323232323232323333 + 33333333333333333333333333333333333333333333322E33363132312C2E2C + 2E362A313A252A283B351860521EB88F14B18918B39029B99C34B69F32B49D2F + B79B36B6973ABA9A36B99A33B79831B69730B5972EB1932AAA8D21A4871B9E81 + 18997E169579149075138B7113866C128067117D630F766012745E106E5A0D68 + 550C63510A5D4D085948055545035142035041024F40014B3E004A3D00483D01 + 473C00473C004A3C024B3D024C3F014E3F004F4200534400564800594C025952 + 03342D0615150F10131114150B1916111615190E121715151515151515151516 + 16161616161717171818181919191A1A1A1B1B1B1C1C1C1D1D1D1D1D1D1E1E1E + 1E1E1E1E1E1E2222221E1E1E1A1A1A1D1D1D1F1F1F1B1B1B1C1C1C2626264E4E + 4E4C4C4C4747474040403A3A3A373737353535323232312F2F32312D2F312B2B + 2D2D28273127232F282128221D1C46280F6953128779088C82008C7A008E7600 + 9075078A70048B74008A7200887300877200847000836F00816E00816E007F6B + 007E69007B6800796500756200746100715F00705E006F5C056A580064550062 + 5600645B00655C02645A036257054A3A10382D0D251E0D171612131819171F1F + 1D251E1F271C2626262828282B2B2B2C2C2C2D2D2D2E2E2E3030303131313030 + 3030303024242424242428282826262628282828282829292929292929292929 + 2929292929292929292929292929292929292929292929292929292929292929 + 2929292929292929292C2C2C3737373636363A3A3A363636363636989898C2C2 + C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F4F4 + DFDFDFC2C2C29999993636363737373838383737373838382B2B2B2929292C2C + 2C2929292B2B2B2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A + 2A2A2A2A2A2A2A2A2929292929292828282626262525252424242A2A2A333333 + 3434343131313333333333333131313333333232323232323232323232323232 + 3232323232323232323233333333333333333333333333333333333333333333 + 33332F2F35342F31342D30302E34293039252E322C2D233A341D926B16A3801E + AD9122B29627B89A35BB9D3EB69D3DB69E3ABB9B3AB89837B69635B59633B697 + 34B49631AF912CAB8D28A286219F821F987D1B92781A8D7319876F17836A147E + 66127A6315766012725B0F6C560E68540D63500C5E4D0A5C4A09564604554503 + 5444025041024E3F004B3E004A3D004A3D004C3E034F3F044F40025042005242 + 005445005849015A4B026158003B330416150B0D130E14170E1716121514180C + 11141313131313131313131313131414141616161717171818181919191A1A1A + 1B1B1B1C1C1C1D1D1D1E1E1E1E1E1E1E1E1E2020201D1D1D1E1E1E1F1F1F1D1D + 1D1E1E1E1F1F1F1A1A1A3B3B3B4F4F4F4D4D4D3D3D3D3A3A3A37373733333334 + 3434322D2F31302C2E332A292E2D28273127202D261E1F2820136B4B02846B09 + 968205927F008B75008E74028E77038874008B74008A73008972008671008570 + 00826E00816D00816D007B6A007B69007A6700776500756200715F00705E016F + 5C016C59086A5805685701655400645300635100635000645002615408514707 + 3A340724220A17180F131718171C1F1A1F222222222525252828282A2A2A2B2B + 2B2D2D2D2F2F2F3030302F2F2F31313125252524242428282826262629292929 + 29292929292929292929292929292929292929292929292929292A2A2A2A2A2A + 2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2929292B2B2B3737373636363A3A + 3A373737373737999999C2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF4F4F4DFDFDFC2C2C29A9A9A3737373838383838383737 + 373838382B2B2B2929292C2C2C2A2A2A2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B + 2B2B2B2B2B2B2B2B2B2B2B2B2B2B2A2A2A2A2A2A2A2A2A292929282828272727 + 2525252424242C2C2C3333333333333131313333333333333131313333333232 + 3232323232323232323232323232323232323232323233333333333333333333 + 33333333333333333333333333332C3239302F33393334323030262B2E262F33 + 292E2D2E2B27553B137F6922A08923AA8E1FB7932FBD9941B99C41B69F3BB99A + 3DB7983BB49538B49637B49637B49735B19432AF9230AA8C2DA5892AA084269A + 7F24957A238E751F88701C846C187E67197A6315755E126F59116B5710675410 + 64510E614F0E5C4B085B4A075947065545035343014F40014E3F004E3F005040 + 05504103514203534301534400564700594A015B4C0366570041340615130B0C + 13101017101514101413150B0F10121212111111111111111111121212141414 + 1616161717171818181919191B1B1B1C1C1C1D1D1D1E1E1E1E1E1E1E1E1E1C1C + 1C1D1D1D2323232121211A1A1A1D1D1D2121211A1A1A2828284B4B4B5050503E + 3E3E3B3B3B383838323232353535342C33302F2B2C342A272E2B252630252127 + 281F15342C0E8B7000907600937B019078018E74028D73018C77008D7B008E76 + 008B74008A7300897200867100857000826E00816D007B6A007B690078680077 + 6500736201715F02705C046E5C03655403675605685708665407614F025E4B00 + 5D4A015E4A035D55005A52005148043D36052923061B170C1514161516201E1E + 1E2121212424242727272929292B2B2B2D2D2D2F2F2F2E2E2E31313126262623 + 23232727272626262929292828282A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A + 2A2A2A2A2A2A2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2929 + 292B2B2B3737373737373B3B3B3737373737379A9A9AC2C2C2DFDFDFF6F6F6FD + FDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F4F4DFDFDFC2C2C29A9A + 9A3737373838383939393737373838382B2B2B2929292D2D2D2A2A2A2C2C2C2B + 2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2A2A2A2A2A2A + 2A2A2A2929292828282727272525252525252C2C2C3333333333333030303333 + 3333333331313132323233333333333333333333333333333333333333333333 + 33333232323232323232323232323232323232323232323232322832392E3031 + 3D363335312C292D282A32312B2E32302C312E261F50451F7E6A1DA1811DB48D + 23B8912FB4953AB49942B79940B6983FB4973CB3963BB2953AB19537B09436B0 + 9436AD9035AA8D32A3882E9E832C99802A937C268F77238A7422846D1F80691B + 796216725C146D59126B561268551265531263500C624F0C5E4D0A5B4A075747 + 055545035443045142035142045243055544055545035646015748005A4B025E + 4E026A560045350A15100D0A0F100F151010110F1212120C0F0D101010101010 + 1010101010101111111313131515151717171818181919191A1A1A1C1C1C1D1D + 1D1E1E1E1E1E1E1E1E1E1B1B1B1E1E1E2121212020201D1D1D1D1D1D1E1E1E1E + 1E1E1C1C1C4040404E4E4E4444443F3F3F3A3A3A333333353535372D392F2D2C + 2B3328242E2824282D2723222C270E45400F9A84009379008D72008E73058E77 + 038D7800907900947C049179029078018D76028C75018A720087720086710085 + 6F007B6D007B6C007A6A00766701746203715E036E5B046C5902655400655300 + 635201614F025D4D015A4C005B4D015C4E02544B00594E005B4E005546014537 + 023128071D1C0E1315151A1A1A1D1D1D2121212424242626262929292B2B2B2D + 2D2D2D2D2D3131312626262323232626262626262929292828282A2A2A2A2A2A + 2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2B2B2B2B2B2B2B2B2B2B2B2B2B2B + 2B2B2B2B2B2B2B2B2B2B2929292B2B2B3737373737373B3B3B3838383838389A + 9A9AC2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF4F4F4DFDFDFC2C2C29A9A9A3838383838383939393737373838382B2B2B29 + 29292D2D2D2A2A2A2C2C2C2C2C2C2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B + 2B2B2B2B2B2B2A2A2A2A2A2A2A2A2A2929292828282727272626262525252D2D + 2D3333333232322F2F2F32323233333331313132323233333333333333333333 + 3333333333333333333333333333323232323232323232323232323232323232 + 32323232323226333B2B2F303B35303A342931352A3037322A2E2F312D33262D + 362C291A5C47139B781EB48C1BAF881BAC8A2DB19247B79942B79942B6983FB4 + 963DB2953AB19439B09338AF9335AD8F36AA8C33A48831A0852E9B822C957D29 + 927A268D77258B7124846D1F7C6519765E16715B146D58146A57146955146754 + 1066530F63500C5E4D0A5B4A0758480657470556460452430555430656450655 + 45025646015849015D4C035F4F036D560048360D15100F090D120D14110D0E0C + 10110F0B0F0A1010100F0F0F0F0F0F0F0F0F1010101212121515151616161818 + 181818181A1A1A1C1C1C1D1D1D1E1E1E1E1E1E1E1E1E1F1F1F1E1E1E1A1A1A1C + 1C1C2323231F1F1F1A1A1A1F1F1F1818183737374B4B4B4949494242423B3B3B + 3636363535353B2E3C2F2D2D293327242E2823282927241F322D0C514D129782 + 009179008E72068F7608937F02948200937B03917408937B04927A039179028E + 77038C75018974018772008772007D6F007D6E007B6B01776802746203705E03 + 6C59026B57026757006554006050005D4F005A4D00584D00544D00534C005246 + 045647005D4A00614C005C4A03483D092C2A0C171A0B1818181B1B1B1F1F1F22 + 22222525252727272A2A2A2C2C2C2C2C2C313131272727222222252525262626 + 2929292828282A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2B2B + 2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2929292B2B2B37373737 + 37373B3B3B3838383838389B9B9BC2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFF + FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFEFEFEF6F6F6E1E1E1C2C2C299999938383839393938 + 38383838383838382B2B2B2A2A2A2D2D2D2A2A2A2C2C2C2B2B2B2B2B2B2B2B2B + 2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2A2A2A2828 + 2827272725252524242432323232323232323232323232323232323232323232 + 3232323232323232323232323232323232323232323232323232323232323232 + 3232323232323232323232323232323232323131313131313131313131313131 + 31313131313131313131302B34312D32333028443D2270602BA18531B78F1FB4 + 8204AA8C3FAF9346B19A4AAF9A49AA9442AA913BB1933CB9973EAD903FAA8D3C + A58A3AA186369F8336997F32947A2D90762A907328896C217F641A785F17765D + 17735C186F5A166D57156A5615634E10624F12645016614D135F4D105C4B0C54 + 44025647025747025748005849005B4B005C4C00604E01615001685600473909 + 140E091114180B0E0C1614130A0A0A080D0B0B0B0B1414140C0C0C0F0F0F1010 + 101111111717171212121616161717171919191B1B1B1C1C1C1D1D1D1E1E1E1E + 1E1E1D1D1D1D1D1D1E1E1E1E1E1E1E1E1E1D1D1D1C1C1C1C1C1C1A1A1A1F1F1F + 4E4E4E45454543434339393937373733333338322D303331272D3426292E2328 + 2929272D3D2A0F8264059A7E08977C04947901947901967B02997E059A80049B + 8105997B00997B00987C00967B02937A029078018D76028C7501897300877000 + 826C007E68007965007460016F5C016B5900675502645200604F005C4D00584B + 00554A005249004E47005245015043004F42004C40004D41004C42024B41014A + 4000221C051E190A1B19181B1D251C1E281D212225281F3031212C2C2C2F2F2F + 2929292323232525252828282828282B2B2B2A2A2A2A2A2A2B2B2B2C2C2C2C2C + 2C2C2C2C2C2C2C2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B + 2B2B2C2C2C2B2B2B393939383838393939363636393939989898C2C2C2DFDFDF + F6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF6F6F6E1E1E1C2 + C2C29999993838383939393838383838383838382C2C2C2A2A2A2D2D2D2A2A2A + 2C2C2C2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B + 2B2B2B2B2B2B2B2A2A2A28282827272725252524242432323232323232323232 + 3232323232323232323232323232323232323232323232323232323232323232 + 3232323232323232323232323232323232323232323232323232323232323232 + 32323232323232323232323232323232323232323232323030302E2E2E2A2933 + 2D204E401C785F1F9F7D23B48D21A9891EA88824A98A2DAC8E3BB09545B29747 + AE9440A9903AA88B3AA78A39A68938A38838A186369A8033947A2D9076298B6E + 2386691E7E6319785F17765D17745D19705B176E58166E5A196B571668541361 + 4F0E5E4C0B60500E60500E5C4C0A5A4A05594904594A025B4A015C4C005F4D00 + 614F02635203726001493B0B130D080F12160A0D0B0907061C1C1C5358569999 + 99B9B9B9A7A7A77A7A7A1F1F1F0E0E0E0D0D0D1A1A1A1616161717171919191B + 1B1B1C1C1C1D1D1D1E1E1E1E1E1E1D1D1D1D1D1D1E1E1E1E1E1E1E1E1E1D1D1D + 1C1C1C1C1C1C1B1B1B1D1D1D4848484646464444443A3A3A3737373434343732 + 2F2F3230292C34282B2F232A272628293C2D0D836806987D04977C03957A0196 + 7C00987E029980029A81039980029D80009C7F00997E00967D00937B00927B01 + 927A02907B028D7500897300856F00806B007D6701766302705E016E5B006955 + 00645200604F005C4D00584B00554A005148004D45005144005043004C40004C + 40004C40004B41014A4000493E00322C0929240B1C1A0F161616181B20202327 + 252924272A212B2B2B2E2E2E2929292222222525252828282828282B2B2B2A2A + 2A2B2B2B2B2B2B2C2C2C2C2C2C2C2C2C2C2C2C2B2B2B2B2B2B2B2B2B2B2B2B2B + 2B2B2B2B2B2B2B2B2B2B2B2B2B2B2D2D2D2B2B2B393939383838393939363636 + 393939999999C2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFEFEFEF6F6F6E1E1E1C2C2C2999999383838393939383838383838383838 + 2C2C2C2A2A2A2D2D2D2A2A2A2C2C2C2B2B2B2C2C2C2C2C2C2C2C2C2C2C2C2C2C + 2C2C2C2C2C2C2C2C2C2C2B2B2B2B2B2B2B2B2B2A2A2A29292927272725252524 + 2424323232323232323232323232323232323232323232323232323232323232 + 3232323232323232323232323232323232323232323232323232323232323232 + 3232323232323232323233333333333333333333333333333333333333333333 + 333331342B30312F2E2D31302B2D342A2048371669551B897026AB8A0FA88510 + A58018A68125A98733AC8F3EA9943FA8953EAC8E3DAB8E3DAA8D3CA88A3BA287 + 379B7F3291772A8C722585681D82651A7C6117785F17775E18755E1A715C186F + 59176D57156F5C196C591566540D63540C64540F62520F5E4E0B5E4E095D4E06 + 5B4C045C4B025D4D01604E01635203645304715F0045370719130E080B0F0C0F + 0D3F3D3C808080AFB4B2CECECEF0F0F0FFFFFFFFFFFFD6D6D653535317171717 + 17171717171818181919191B1B1B1C1C1C1D1D1D1E1E1E1E1E1E1D1D1D1D1D1D + 1E1E1E1E1E1E1E1E1E1D1D1D1C1C1C1C1C1C1C1C1C1B1B1B3E3E3E4747474747 + 473B3B3B3838383636363934332C3130282C312C2E2E252C252629273C300C84 + 6E08977D01977E00977E00987F019A81019A81019981009880009F84009F8300 + 9D84009C82009A8200998000968000967F019179008F76008B7200856F00806A + 007A6601746100715D006956006554006050005C4D00584B005449005047004E + 44005042004D41004B3F004A3E00493F00493E00483F00473E004339093A320A + 27230717150A1617151D20242225292023272A2A2A2D2D2D2828282222222525 + 252828282828282B2B2B2A2A2A2B2B2B2B2B2B2C2C2C2C2C2C2C2C2C2C2C2C2C + 2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2D2D2D2B2B2B + 393939383838393939373737393939999999C2C2C2DFDFDFF6F6F6FDFDFDFFFF + FFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF6F6F6E1E1E1C2C2C2999999383838 + 3939393838383838383939392C2C2C2A2A2A2D2D2D2B2B2B2C2C2C2C2C2C2C2C + 2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2B2B2B2A + 2A2A292929272727262626252525333333333333333333333333333333333333 + 3333333333333333333333333333333333333333333333333333333333333333 + 3333333333333333333333333333333333333333333333333333333333333333 + 333333333333333333333333333332352C2F32302E31363130392F2C2E302920 + 3D331B4B411F92771C9C7D20A48322A5831F9F7C1A9A7A19977D1F9B82269F81 + 2E9E802D9C7F2E997C2B9476278C7121866B1B83671A82651A7F62177B601678 + 5F17775E18755E1A715C186F59176D5814705B176C5B126A5A0E6C5C10685910 + 64540F62520D61520A614F085F4E055D4D015F4D006150016551036754036C5A + 004A3C0C1D17120B0E123336347E7C7BA8A8A8A6ABA9CCCCCCE6E6E6FFFFFFEF + EFEFDFDFDFC1C1C14F4F4F1616161818181919191A1A1A1B1B1B1D1D1D1D1D1D + 1E1E1E1E1E1E1D1D1D1D1D1D1E1E1E1E1E1E1E1E1E1D1D1D1C1C1C1C1C1C1C1C + 1C1919193333334949494848483C3C3C3939393737373934352B302F2A2D3130 + 312D262E23272B263A320D7E6F099A7F009A7F009A7F009B81009C82009D8400 + 9E85019E85019F8500A08600A38901A48A02A189019E85009B8200998000967D + 00947A008F76008B7200856E007F69007A63007560006B59006856006352005C + 4E00584B005548005145004D42004D41014C40004A3E00473C00473C00473D01 + 463C00453B00483D00453B053932072824081A190B1819171C1E2620222D2828 + 282B2B2B2727272222222525252828282828282A2A2A2B2B2B2B2B2B2C2C2C2C + 2C2C2D2D2D2D2D2D2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C + 2C2C2C2C2C2C2D2D2D2C2C2C393939393939393939373737393939999999C2C2 + C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF6F6F6 + E1E1E1C2C2C29999993838383939393838383838383939392C2C2C2A2A2A2E2E + 2E2B2B2B2D2D2D2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C + 2C2C2C2C2C2C2C2C2B2B2B2A2A2A292929272727262626252525333333333333 + 3333333333333333333333333333333333333333333333333333333333333333 + 3333333333333333333333333333333333333333333333333333333333333333 + 33333434343434343434343434343434343434343434343434343235332F3131 + 2C2F332D30352C2F342C2E2F2F2D2D322E2D4B391C614E21806C25977E209E82 + 169C7D109A761297731590721F8F711E8E701D8A6D1C886B1A86681984691984 + 69198164198063187C6117796018775E18745D19705B176F5917735F186F5B14 + 6E5A136F5D167260196E5C1568591168591166540D64530A615007614E03604E + 01634F016653026754036755004B3D0D0B05001D20247B7E7C9F9D9C93939396 + 9B99BEBEBEF0F0F0FAFAFAEAEAEABDBDBDB9B9B99999991D1D1D181818191919 + 1A1A1A1C1C1C1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1E1E1E1E1E1E1E1E + 1E1D1D1D1C1C1C1C1C1C1C1C1C1818182A2A2A4A4A4A4848483D3D3D3A3A3A37 + 37373836362B302F2D2F3034342E292F24262B2A352F1273660A9C81019C8101 + 9B80009B81009C8200A08703A38A06A68D09A48A00A58B01A58B01A58B01A48A + 00A48800A28700A186009E82009A8000947B008F7600897100836C007D67007A + 63006F5D006B59006554006050005B4B005649005145004F42004D40024B3E00 + 473C00463B00453B00453A00423A00413900473C00473C00463C063B34092A26 + 0A1B190F19181A1E1F292525252929292525252121212525252828282828282A + 2A2A2B2B2B2B2B2B2C2C2C2D2D2D2D2D2D2D2D2D2C2C2C2C2C2C2C2C2C2C2C2C + 2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2D2D2D2C2C2C3939393939393939 + 39373737393939999999C2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFEFEFEF6F6F6E1E1E1C2C2C29999993838383939393838383939 + 393939392D2D2D2B2B2B2E2E2E2B2B2B2D2D2D2C2C2C2C2C2C2C2C2C2C2C2C2C + 2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2B2B2B292929282828 + 2626262525253333333333333333333333333333333333333333333333333333 + 3333333333333333333333333333333333333333333333333333333333333333 + 3333333333333333333333333333333333333333333333333333333333333333 + 3333333333333433353234343032322E30302C30312E31352E30382C2D372F28 + 353A322B4E4523695D1D85711C947A1C9B791C9A751B91721D90711C8D6F1C8B + 6D1A876A19866918876A19866B1B8164198063187D62187A6119775E18745D19 + 715C18705A18745F14715B14745E1C796224735E206F5C196D5B1467590D6958 + 0F69560D6653086452056551036551036853026954037361024E4010120C074A + 4D51A6A9A7AEACAB9999999A9F9DB0B0B0E9E9E9EFEFEFC8C8C8B4B4B4979797 + A1A1A16262621919191A1A1A1B1B1B1C1C1C1D1D1D1D1D1D1D1D1D1D1D1D1D1D + 1D1D1D1D1E1E1E1E1E1E1E1E1E1D1D1D1C1C1C1C1C1C1A1A1A1919192323234B + 4B4B4747473E3E3E3B3B3B3636363536342C312F2F313137342F2B2D27282A32 + 312A1965580CA081069F81049E80039E8003A08303A58808AC8F0EB19413AF95 + 0DAD930BAA9008A98D03A88B00A88B00AB8D00AC8E01A58801A285009D800095 + 7B00907600897100826B007F68007261006F5D006957006252005D4D00584901 + 5343004F41004A3F03493E02463B00443900453A00423900413800403700443A + 00433900463B00463C063B330B2A240D1E1B131D1A1C23232328282824242420 + 20202424242727272727272A2A2A2B2B2B2C2C2C2C2C2C2D2D2D2D2D2D2D2D2D + 2D2D2D2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2E2E + 2E2C2C2C3A3A3A3939393A3A3A3737373A3A3A9A9A9AC2C2C2DFDFDFF6F6F6FD + FDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF6F6F6E1E1E1C2C2C29999 + 993838383939393838383939393939392D2D2D2B2B2B2E2E2E2B2B2B2D2D2D2C + 2C2C2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2C2C2C2C2C2C + 2C2C2C2B2B2B2A2A2A2828282626262525253333333333333333333333333333 + 3333333333333333333333333333333333333333333333333333333333333333 + 3333333333333333333333333333333333333333333333333333333333333333 + 3333333333333333333333333333333333333435333435333634343634343432 + 323131312E30302D3231312F3B2E2C322F2B263C35225347236E5C27846D2990 + 762A8D6E198F701B90711C8D6F1C896B18856817836615826514816419816419 + 7E63197A6119785F19755E1A735E1A745E1C746012745E177B60277156236045 + 12644E146F5D1668590A6E5B126D5A116A570C6A56096955076A55046A55046B + 56046E5C004436061D1712777A7EBCBFBDC8C6C5C8C8C8B6BBB99E9E9EF1F1F1 + C2C2C2A2A2A29F9F9FA8A8A8ACACAC7B7B7B1A1A1A1A1A1A1B1B1B1C1C1C1D1D + 1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1E1E1E1E1E1E1E1E1E1D1D1D1C1C1C1C + 1C1C1919191C1C1C1F1F1F4C4C4C4545453E3E3E3C3C3C3535353435312C322D + 3333333833302C2D2B2929392D242156480D9F80079F80079F8007A08106A384 + 09AA8C0FB29417B89A1DB79B18B69A17B59812B2950EB1940AB19207B39206B2 + 9105AB8E03A98C02A487019C8101967B029076008A6F00856C00776401715F00 + 6C5A006655005E4E01594A025444015042004B4004493D03453A004439004239 + 00423900413701403600403700413700433800473C00453A063A310C2B241022 + 1C112222222626262424242020202424242727272727272929292B2B2B2C2C2C + 2C2C2C2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D + 2D2D2D2D2D2D2D2D2D2D2E2E2E2C2C2C3A3A3A3939393A3A3A3838383A3A3A9A + 9A9AC2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFE + FEF6F6F6E1E1E1C2C2C29999993838383939393838383939393939392D2D2D2B + 2B2B2E2E2E2B2B2B2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D + 2D2D2D2D2D2D2D2D2D2C2C2C2C2C2C2B2B2B2A2A2A2828282626262626263333 + 3333333333333333333333333333333333333333333333333333333333333333 + 3333333333333333333333333333333333333333333333333333333333333333 + 3333333333333333333333333333333333333333333333333333333333333438 + 2D32322C342F3038313437323433313031342B333A2D34352C333333322E3A2F + 28372F26293C301E4E44155D53138B6C178F701B9475209476239274218E701F + 896C1B876A198164198164197E63197A6119785F1977601C76611D76601E7B68 + 177A631F785C265C3F13412400553B05725F1B706210705D146F5C116D5A0F6D + 590C6C580A6C57066C57056C570573610246380818120D86898DD3D6D4E0DEDD + EBEBEBECF1EFF0F0F0C1C1C1C5C5C5BEBEBEC1C1C1BFBFBFBFBFBFA7A7A71A1A + 1A1B1B1B1C1C1C1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1E1E1E1E + 1E1E1E1E1E1D1D1D1C1C1C1C1C1C1717171D1D1D1E1E1E4C4C4C4343433F3F3F + 3D3D3D3434343436302D342D3435333A33302E2B2D2B28412A20264C3E0D9E7D + 089F7F08A08009A1810AA5860DAC8D14B5961BBC9D22B79D1BBA9D1CBD9F1CBE + 9F1ABD9D16BA980FB79309B49105B19306AC8F04A78A03A285049A8004937903 + 8D73018A6F007865027362016D5B006756005F50015A4B035545025342034B3F + 05493D03453A004439004239004238024137013D36003A330240370044390045 + 3900453A00423809342C0F27200D212121262626232323202020242424272727 + 2727272929292B2B2B2C2C2C2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D + 2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2E2E2E2D2D2D3A3A3A3A + 3A3A3A3A3A3838383A3A3A9A9A9AC2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFF + FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFEFEFEF5F5F5E0E0E0C1C1C19999993A3A3A3B3B3B3A + 3A3A3939393A3A3A2E2E2E2D2D2D3131312E2E2E2F2F2F2E2E2E2E2E2E2E2E2E + 2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2D2D2D2D2D2D2D2D2D2C2C2C2B2B + 2B29292927272726262635353534343434343433333333333333333333333334 + 3434343434343434343434343434343434343434343434343434343434343434 + 3434343434343434343434343434343434343434343434343434343434343434 + 3434343434343434343434343434343434343434343434343434343434343434 + 34343434343434343333333333333232323131313131313030303E371C483E20 + 564B256757287360277A64227D641C7E64187C5C1B7B5D1C7A5D20785C207259 + 216C57206B56226B5623524F2934331120211114111316100B433A146F621E73 + 5F12715D16725C14705B106F5B0D6F5A086E5B046F5B036E5B00776605413302 + 1F191276797DD8DADADDDBDBE7E6E8D6DBDAB7B7B79F9F9FF9F9F9F7F7F7F1F1 + F1E0E0E0DADADAA8A8A81C1C1C1C1C1C1C1C1C1D1D1D1D1D1D1E1E1E1E1E1E1E + 1E1E1E1E1E1E1E1E1D1D1D1D1D1D1C1C1C1B1B1B1A1A1A1A1A1A1A1A1A151515 + 2323234949494646463E3E3E3838383939393535353333333131313131313232 + 323030302B2B2B2727277B7504987F11AC8309AF8A00A48A08A78D23BC9B34BF + 9923C1A025C09F24C09F24C19F23C19F23C19E1FBC991AB99617B79309B59108 + AF8F08AA8A08A386069C80049479018E7500866F02806A017661006E59006753 + 00604E015B49025746034F44004C4100473D004439004338004036003D34023C + 33014235014134004033004134004437034538044538044336021F1D121F201E + 1D21262120242A241F3029202A2B2720292C2C2C2C2D2D2D2D2D2D2E2E2E2E2E + 2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E + 2E2E3030302D2D2D3939393939393B3B3B3838383A3A3A989898C2C2C2DFDFDF + F6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF5F5F5E0E0E0C1 + C1C19999993A3A3A3B3B3B3A3A3A3939393A3A3A2E2E2E2D2D2D3131312E2E2E + 2F2F2F2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2D2D + 2D2D2D2D2D2D2D2C2C2C2B2B2B29292927272727272734343434343434343433 + 3333333333333333333333343434343434343434343434343434343434343434 + 3434343434343434343434343434343434343434343434343434343434343434 + 3434343434343434343434343434343434343434343434343434343434343434 + 3434343434343434343434343434343434343434333333333333323232323232 + 31313131313135312C37312A3B33263F3622463A1E4E3F1E56451E5A491E5E4B + 1E5C4B205A4A2055461F50421E493F1D473E1D473D1F3C391D1D1E0415170B14 + 101619120F4B401A756421796115705C15725C14705B106F5B0D6F5A086E5B04 + 6F5B036E5B007362014B3D0C19130C55585CC4C6C6CECCCCC0BFC1B9BEBD9F9F + 9F9A9A9ACFCFCFFDFDFDFFFFFFF8F8F8EFEFEF8282821C1C1C1C1C1C1D1D1D1D + 1D1D1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1D1D1D1D1D1D1C1C1C1B1B1B + 1A1A1A1A1A1A1C1C1C1515152626264848484343433D3D3D3838383838383535 + 353333333232323232323232323131312C2C2C282828574D00957F16B28E0CB2 + 8800AF8C0DAE921CB89A29C29D2FC4A22AC4A22AC3A227C5A328C6A428C4A226 + C39F23C09D1EBD9910B8950FB2910CAB8B0AA5870A9F8209987D059379038972 + 04836D037C6600735F006B58016352015D4D01594A025246004E43004A3E0046 + 3B004439004238023F37023D3402423501413400403300413400433602453804 + 45380444370326201322211D1C1F24201F2329221F3028212A2B271F282B2C2C + 2C2D2D2D2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E + 2E2E2E2E2E2E2E2E2E2E2E2E2E2E3030302D2D2D3A3A3A3939393B3B3B393939 + 3A3A3A989898C2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFEFEFEF5F5F5E0E0E0C1C1C19999993A3A3A3B3B3B3A3A3A3A3A3A3B3B3B + 2F2F2F2D2D2D3131312E2E2E2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F + 2F2F2F2F2F2F2F2F2F2F2E2E2E2E2E2E2D2D2D2C2C2C2B2B2B29292928282827 + 2727343434343434343434343434343434343434343434343434343434343434 + 3434343434343434343434343434343434343434343434343434343434343434 + 3434343434343434343434343434343434343434343434343434343434343434 + 3434343434343434343434343434343434343434343434343434343434343434 + 34343433333333333332323232323232323230323A3131373231353331313431 + 2C35342A37352A3A372935311F37332137342536352737372B37382E393C333C + 3E383B3B2D181B0C12151315111C19100D493C166E59157256096F5B14715B13 + 705B106F5B0D705B096F5C056F5B036F5C017261004F4110120C0525282C9799 + 99C9C7C7B0AFB1969B9A9D9D9D9D9D9DC9C9C9DADADAF2F2F2FFFFFFF1F1F133 + 33331D1D1D1D1D1D1D1D1D1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E + 1D1D1D1D1D1D1C1C1C1B1B1B1A1A1A1A1A1A1D1D1D1616162C2C2C4848483F3F + 3F3B3B3B3939393636363636363434343232323232323333333131312E2E2E2A + 2A2A392B0E7F6E17B1940EBC8F08B78A0BB59212BCA024BFA033C4A42DC4A42D + C6A42CC7A52DC8A62BC8A62BC6A429C7A327C1A01BBD9B19B59514AE8E0FA889 + 0EA2850C9D810B9B7F099078088A7305836D047B6603725F046A59036352015E + 4E015749015246004F42004A3E00483D01463B02433903423703433602423501 + 4134004134004336024437034437034437032E271325241A1B1F201C1D212722 + 1F2E2821292A2821282B2C2C2C2D2D2D2E2E2E2E2E2E2F2F2F2F2F2F2E2E2E2E + 2E2E2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F3030302D2D2D + 3A3A3A3A3A3A3B3B3B3939393A3A3A999999C2C2C2DFDFDFF6F6F6FDFDFDFFFF + FFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF5F5F5E0E0E0C1C1C19999993A3A3A + 3B3B3B3A3A3A3A3A3A3B3B3B2F2F2F2E2E2E3131312E2E2E3030302F2F2F2F2F + 2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2E2E2E2E2E2E2D2D2D2C + 2C2C2B2B2B292929282828272727333333343434343434343434353535353535 + 3434343434343434343434343434343434343434343434343434343434343434 + 3434343434343434343434343434343434343434343434343434343434343434 + 3434343434343434343434343434343434343434343434343434343434343434 + 3434343434343535353535353434343434343434343333333333333333332F31 + 313032323035343237353136342F35302D332E2A312C2F31313032322E33322F + 333430353831383B363C41393F44414141171D180E131612101C170E0B4B3C15 + 6F581479590E6E5A13705A12705B106F5B0D715C0A705D06705C046F5C017665 + 044B3D0C19130C0A0D11505252A09E9EAAA9AB979C9B9C9C9CA1A1A1AFAFAFD3 + D3D3F3F3F3ECECEC7676761C1C1C1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E + 1E1E1E1E1E1E1E1E1E1E1E1E1D1D1D1C1C1C1B1B1B1B1B1B1A1A1A1A1A1A1A1A + 1A1616163333334949493E3E3E3B3B3B3A3A3A35353536363634343433333333 + 33333333333232322F2F2F2D2D2D33282A594C149E8412C39B13BB8A06B78D0C + C2A126BBA22EC4A32EC4A32EC4A32EC6A42DC6A42DC7A42CC6A32BC6A32BC6A5 + 26C2A122BA9A1DB29318AD8D16A68812A2840E9D800D957B0990780888720882 + 6B07796506705E05695802635300594C025649005145004E40004B3E00483D01 + 463B02453A01433701433701423600423600423600443802443802453903372F + 122926171B1D1D191C202622212C2823292A2821282B2D2D2D2D2D2D2E2E2E2F + 2F2F2F2F2F2F2F2F2E2E2E2E2E2E2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F + 2F2F2F2F2F2F3030302E2E2E3A3A3A3A3A3A3B3B3B3939393A3A3A999999C2C2 + C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF5F5F5 + E0E0E0C1C1C19999993A3A3A3B3B3B3A3A3A3A3A3A3B3B3B2F2F2F2E2E2E3232 + 322F2F2F3030302F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F + 2F2F2E2E2E2E2E2E2E2E2E2D2D2D2B2B2B2A2A2A282828272727333333333333 + 3434343535353535353535353535353434343434343434343434343434343434 + 3434343434343434343434343434343434343434343434343434343434343434 + 3434343434343434343434343434343434343434343434343434343434343434 + 3434343434343434343434343434343434343535353535353535353535353535 + 3534343434343434343437342F37342F34332F34332F32332F31343231343232 + 353335373834363734363732343532333732353935383C383B3F4040461C2021 + 0C10150F0F1B150E0B493D156F57157C5B126D59126F59116F5A0F705C0E715C + 0A705D06705C04705D02766504463807241E170E1115181A1A4A484875747696 + 9B9A9C9C9C999999BBBBBBC3C3C3C9C9C97575751D1D1D1E1E1E1E1E1E1E1E1E + 1E1E1E1E1E1E1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1C1C1C1B1B1B1B1B + 1B1A1A1A1919191919191616161717173A3A3A4949493F3F3F3C3C3C3A3A3A35 + 3535363636353535343434343434343434333333313131303030352F3A3A2F1B + 736015B4951AC0960EBB8C12BB9622BCA428C2A231C3A431C5A331C5A331C6A3 + 2EC5A22DC6A22CC6A22CC6A72EC2A32ABD9D26B79720B0921CAA8B18A384119F + 7F0E987D0E957A0C8D750B87700A7F69097563066C5C036857005D50025A4C00 + 5548005044004C40004B3E00473C00463A004438024438024337014236004236 + 00433701443802463A0440330D2D28131A1E19191C202422222C2724292A2824 + 292C2D2D2D2E2E2E2E2E2E2F2F2F2F2F2F2F2F2F2F2F2F2E2E2E2F2F2F2F2F2F + 2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F3030302E2E2E3A3A3A3A3A3A3B3B + 3B3939393B3B3B999999C2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFEFEFEF5F5F5E0E0E0C1C1C19999993A3A3A3B3B3B3A3A3A3A3A + 3A3B3B3B2F2F2F2E2E2E3232322F2F2F3030302F2F2F2F2F2F2F2F2F2F2F2F2F + 2F2F2F2F2F2F2F2F2F2F2F2F2F2F2E2E2E2E2E2E2E2E2E2D2D2D2C2C2C2A2A2A + 2828282828283232323333333434343636363636363636363535353535353535 + 3535353535353535353535353535353535353535353535353535353535353535 + 3535353535353535353535353535353535353535353535353535353535353535 + 3535353535353535353535353535353535353535353535353535353535353535 + 353535353535353535353535353535353535353535353C36373C36373B34373A + 33363934363933383A34393B353A3533333634343634333634333735343A3837 + 3F3D3C44403F4440462A2C2C0E111510121A131008423810604E0D6E510C6B57 + 106E58106F5A0F705C0E725D0B715E07715D05705D027463024739081D171013 + 161A1315151917172A292B565B5A7E7E7E8484847C7C7C7474742E2E2E191919 + 1A1A1A1717171E1E1E1D1D1D1D1D1D1D1D1D1D1D1D1C1C1C1C1C1C1C1C1C1C1C + 1C1C1C1C1B1B1B1A1A1A1919191919191818181818181515151D1D1D41414146 + 46464040403C3C3C383838363636363636353535353535343434343434343434 + 3333333333332F30342D26294A3F1F87751ABB9B1EC1941BB58C18BFA327C3A2 + 34C4A335C5A436C7A534C6A433C7A331C7A331C7A331C3A431C1A22FBE9F2CBA + 9B28B59524AE8E1DA98716A583129B7E12997B1292770F8A720E856C0E7B660B + 7361086F5C056455066050035A4C005547005144004C40004A3D00463B00453A + 01453A01443900423700413600423700443900463B02453608302A0D1C1E1818 + 1D202322242A26252B292926292D2D2D2D2E2E2E2F2F2F2F2F2F2F2F2F2F2F2F + 2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F3131 + 312E2E2E3B3B3B3A3A3A3C3C3C3A3A3A3B3B3B999999C2C2C2DFDFDFF6F6F6FD + FDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF5F5F5E0E0E0C1C1C19999 + 993A3A3A3B3B3B3A3A3A3B3B3B3C3C3C3030302E2E2E3232322F2F2F30303030 + 30303030303030303030303030303030303030303030303030302F2F2F2F2F2F + 2E2E2E2D2D2D2C2C2C2A2A2A2929292828283131313333333535353636363737 + 3737373736363635353535353535353535353535353535353535353535353535 + 3535353535353535353535353535353535353535353535353535353535353535 + 3535353535353535353535353535353535353535353535353535353535353535 + 3535353535353535353536363636363636363636363636363636363636363636 + 3636313236343337353438383439383439393338373136373136353737373737 + 3737373738363836353A39353F3C38413E3A433A3D3936320E110F1011151413 + 093D370E5B4F0F6A52106A560F6D570F6F5A0F705C0E725D0B725F08715D0571 + 5E037665044B3D0C130D061215191C1E1E191717100F11161B1A191919222222 + 1A1A1A1919191D1D1D1616162727271D1D1D1D1D1D1D1D1D1D1D1D1C1C1C1C1C + 1C1C1C1C1B1B1B1B1B1B1B1B1B1A1A1A1A1A1A19191918181818181817171717 + 17171818182525254747474242423F3F3F3B3B3B343434383838363636363636 + 3636363535353535353434343535353535352F302E2B2D3532302F554B1C977F + 1BBF9A1ABA9214BE9626C09F32C3A235C5A437C6A537C7A436C6A433C8A333C8 + A333C0A233BEA031BC9E2FBC9B2DB9982AB69325B08D1FAC891BA07F189B7B17 + 9677148F7314886F13806A1279650E74600B6B5A096756076050035A4B025647 + 025143014E3F004A3D00453A01453A0144390042370041360041360044390047 + 3C03493603322B0A1C2015181F222122262826262B2929282B2F2D2D2D2E2E2E + 2F2F2F2F2F2F3030303030302F2F2F2F2F2F3030303030303030303030303030 + 303030303030303030303131312E2E2E3B3B3B3B3B3B3C3C3C3A3A3A3B3B3B9A + 9A9AC2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFE + FEF5F5F5E0E0E0C1C1C19999993A3A3A3B3B3B3A3A3A3B3B3B3C3C3C3030302E + 2E2E3232322F2F2F303030303030303030303030303030303030303030303030 + 3030303030302F2F2F2F2F2F2E2E2E2D2D2D2C2C2C2A2A2A2929292828283131 + 3133333335353536363637373737373736363635353535353535353535353535 + 3535353535353535353535353535353535353535353535353535353535353535 + 3535353535353535353535353535353535353535353535353535353535353535 + 3535353535353535353535353535353535353535353536363636363636363636 + 36363636363737373737373737372D37372D38362F3736323735353836373834 + 3A39353B3A36303538313639323637313536333535363735393A383B3C384C40 + 4046433B12140E0F111113130537360A574E0F6553126A560F6D570F6F5A0F70 + 5C0E725D0B725F08725E06715E037B6A094D3F0E140E0715181C1517171B1919 + 1F1E20151A191B1B1B1919191F1F1F1E1E1E1C1C1C2222221717171E1E1E1D1D + 1D1D1D1D1C1C1C1C1C1C1B1B1B1B1B1B1B1B1B1A1A1A1A1A1A1A1A1A19191918 + 18181818181717171616161616161B1B1B2B2B2B4B4B4B3F3F3F3E3E3E393939 + 3232323939393636363636363636363535353535353535353535353636363435 + 312A33372B313E352F226E5A0CB89B11C7A119B78624BA9A2FBF9E31C3A235C5 + A437C6A335C5A234C7A232C8A333BDA033BC9F32BC9D30BB9C2FBB9A2DBA9729 + B69325B28F21A27F1D9F7C1A9878179374178B7016846C147C671279640F6F5F + 0C6B5A096354055D4F03584A025444014F41004D3E00463B02463B02453A0142 + 3700413600413600443900473C034A3600332A081D2116181F221F2226282626 + 2B29292B2C302E2E2E2E2E2E2F2F2F2F2F2F3030303030302F2F2F2F2F2F3030 + 303030303030303030303030303030303030303030303131312E2E2E3B3B3B3B + 3B3B3C3C3C3A3A3A3B3B3B9A9A9AC2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFF + FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFEFEFEF6F6F6E1E1E1C2C2C29A9A9A3B3B3B3D3D3D3C + 3C3C3B3B3B3C3C3C3030302F2F2F3232322F2F2F313131303030313131313131 + 3131313131313131313131313131313131313030303030302F2F2F2E2E2E2D2D + 2D2B2B2B2A2A2A2929292D2D2D36363638383836363638383837373734343436 + 3636373737373737373737373737373737373737373737373737373737373737 + 3737373737373737373737373737373737373737373737373737373737373737 + 3737373737373737373737373737373737373737373737373737373737373737 + 3737373737373737373737373737373737373737373737373737373737373737 + 3737373737373737373737373737373737373737373737373636363636363636 + 363737373939393A3A3A403E3E3E3F3B222424100D1616100B413914584D1163 + 511263530E65560E6A5A0E6F5B0D715D08725E06745F037761027F6900503F07 + 18110811151A1317181B181A1A17191B1C1A1B1B1B1B1B1B1B1B1B1B1B1B1B1B + 1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1A1A1A1A1A1A1A1A1A1A + 1A1A181818181818191919181818161616151515161616171717191919434343 + 4545453C3C3C3F3F3F3939393636363737373636363636363636363636363636 + 3636363636363636363636313A3032322A352D2C352B3A37285E4F1E98821CC5 + B11EBD9219C39B2BC1A13DBA9E3FB69D3BBEA138C8A333CBA32DC09F38BF9F36 + BD9D34B99B32B79930B4962DB2952CB1942BA58B27A287259B8222937A1E8C71 + 1A856B177F66167D6316776113725E106A570C64520B5E4D0A5648065043054D + 4002493F03463B01443900443900443900443900463A044A3E08493A02322907 + 1C1D131B1E232524282B27262B2928282D2C2F2F2F2F2F2F3030303030303131 + 3131313130303030303031313131313131313131313131313131313131313131 + 31313131313030303C3C3C3A3A3A3B3B3B3B3B3B3C3C3C989898C2C2C2DFDFDF + F6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF6F6F6E1E1E1C2 + C2C29A9A9A3B3B3B3D3D3D3C3C3C3B3B3B3C3C3C3030302F2F2F3232322F2F2F + 3131313030303131313131313131313131313131313131313131313131313030 + 303030302F2F2F2E2E2E2D2D2D2B2B2B2A2A2A2929292C2C2C36363638383836 + 3636383838373737353535363636373737373737373737373737373737373737 + 3737373737373737373737373737373737373737373737373737373737373737 + 3737373737373737373737373737373737373737373737373737373737373737 + 3737373737373737373737373737373737373737373737373737373737373737 + 3737373737373737373737373737373737373737373737373737373737373737 + 373737373636363636363636363737373939393939393D3B3B40413D2B2D2D15 + 121B110B063B330E574C10604E0F63540C65560D6A5A0E6F5C0B715D08745E06 + 765F037761027F6900503F0717100711151A1317181B181A1A17191B1C1A1B1B + 1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1A1A1A1A + 1A1A1A1A1A1A1A1A191919191919181818191919161616151515181818181818 + 1414141111112727274545454444443C3C3C3D3D3D3838383737373737373636 + 3636363636363636363636363636363636363636363636323D3133342D342F2D + 3231362E2E4D3C22745E1C97811BC3991EB9901CB79224BFA033C4A839BFA436 + BE9E3BC39E44C09F38C09F38C09F38BC9D36BA9B34B69730B1942CAF922AA78C + 2AA58A28A086289B8127957A238D731F856C1C8269197963157660126F5A0F66 + 550C60500B5B4B095546085043054B4004473C00453900463A00463901453800 + 473A024B3D08493A023229071C1D131B1E232625292B27262B2928282D2C2F2F + 2F2F2F2F30303031313131313131313130303030303031313131313131313131 + 31313131313131313131313131313131313030303D3D3D3A3A3A3B3B3B3B3B3B + 3C3C3C989898C2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFEFEFEF6F6F6E1E1E1C2C2C29A9A9A3B3B3B3D3D3D3C3C3C3B3B3B3C3C3C + 3030302F2F2F3333333030303131313030303131313131313131313131313131 + 313131313131313131313030303030303030302F2F2F2D2D2D2C2C2C2A2A2A29 + 29292B2B2B353535383838363636383838383838353535373737373737373737 + 3737373737373737373737373737373737373737373737373737373737373737 + 3737373737373737373737373737373737373737373737373737373737373737 + 3737373737373737373737373737373737373737373737373737373737373737 + 3737373737373737373737373737373737373737373737373737373737373737 + 3737373737373737373737373737373737373736363637373737373738383839 + 393939373741423E3537371E1B240F0904362E09554A0E5D4B0C62530B66550C + 6B590C6F5C0B725D08745F047760047761027F6900503F071710071014191216 + 171916181916181A1B191A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A + 1A1A1A1A1A1A1A1A191919191919191919191919181818181818181818191919 + 1414141313131919191717171212121313133939394646464242423C3C3C3A3A + 3A37373738383838383836363636363636363636363636363636363636363636 + 363635343E333536323533343337342A363B2A2D4D3C225E4F1EAF8826BA9527 + C09E22C29F1FC19F27C3A038BF9D44B79647BE9B39BE9B39BD9A38BA9A37B998 + 37B79635B49433B39332A98D2EA78B2CA2872C9E842A9C812B967C288E76248A + 71217D6616796315725E116C591066530F5F4F0D594A0B5647094D4206493E02 + 473C00473B01463A00453800473A024A3D05493A02332A081D1E141C1F242625 + 292C28272B2928292E2D2F2F2F30303030303031313131313131313131313131 + 3131313131313131313131313131313131313131313131313131313131313131 + 3D3D3D3A3A3A3B3B3B3B3B3B3C3C3C989898C2C2C2DFDFDFF6F6F6FDFDFDFFFF + FFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF6F6F6E1E1E1C2C2C29A9A9A3B3B3B + 3D3D3D3C3C3C3C3C3C3D3D3D3131313030303333333030303232323131313232 + 323232323232323232323232323232323232323232323131313131313030302F + 2F2F2E2E2E2C2C2C2B2B2B2A2A2A2A2A2A343434383838373737393939393939 + 3636363737373737373737373737373737373737373737373737373737373737 + 3737373737373737373737373737373737373737373737373737373737373737 + 3737373737373737373737373737373737373737373737373737373737373737 + 3737373737373737373737373737373737373737373737373737373737373737 + 3737373737373737373737373737373737373737373737373737373737373737 + 37373737373737373838383838383836363D3E3A383A3A2A273017110C362E09 + 53480C5B490A63510A65540B6A580B705B0A725E07745F047761027A6202806A + 015140081710070F1318101415181517171416191A1818181818181818181818 + 1818181818181818181818181818181818181818181818181818181818171717 + 1717171717171616161717171313131313131616161111111414142323234545 + 454343433F3F3F3C3C3C38383837373738383838383837373737373737373737 + 373737373737373737373737373734363E343636363733393638382F3C352B37 + 37302D3B3829664B1F907727B49C24BEA019BF981EC59934C79E41BF9D3FC09D + 3BBE9B3ABB9837B79537B59336B49235B39137B49238AB8F31A78A2FA0852B9D + 822B9C812B997F2B937B299078268067177B6416776014715B136C5713645310 + 5E4D0E5B4A0B5045074C4105493E02483D01473B01463A00473A024A3D054A3B + 03332A081D1E141C1F2427262A2C28272C2A29292E2D30303030303031313131 + 3131323232323232313131313131323232323232323232323232323232323232 + 3232323232323131313131313D3D3D3A3A3A3B3B3B3B3B3B3C3C3C999999C2C2 + C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF6F6F6 + E1E1E1C2C2C29A9A9A3B3B3B3D3D3D3C3C3C3D3D3D3D3D3D3232323030303434 + 3431313132323231313132323232323232323232323232323232323232323232 + 32323131313131313131313030302E2E2E2D2D2D2B2B2B2A2A2A292929343434 + 3838383838383A3A3A3A3A3A3737373838383737373737373737373737373737 + 3737373737373737373737373737373737373737373737373737373737373737 + 3737373737373737373737373737373737373737373737373737373737373737 + 3737373737373737373737373737373737373737373737373737373737373737 + 3737373737373737373737373737373737373737373737373737373737373737 + 3737373737373737373737383838373737373737373737373737393737373834 + 35373734313A241E193A320D51460A5B490A6150076653086B5709705B09725E + 07765E047A61037B6303806A01514008160F060E12170F131416131516131517 + 1816171717171717171717171717171717171717171717171717171717171717 + 1717171616161616161616161616161616161313131414141414141515151212 + 120D0D0D1D1D1D3A3A3A4747473E3E3E3B3B3B3A3A3A38383837373737373737 + 373738383838383838383838383838383838383838383838383834373C343735 + 36393039393339363835343830353430392F2F29224B4221796825A58B27BC99 + 24C29722C49728C99C33C19E3CC09D3BBE9B3AB99739B69437B49137B18F36B0 + 8D37AD8F36A98B32A387309F842D9D822C987E2A9078248B73218267167E6515 + 796214755E136E5A1368551262500F5E4C0D55480A5144064D40024D3F044B3D + 02493B014A3C024D3F054A3B03342B091E1F151D202527262A2D29282C2A292A + 2F2E303030313131313131323232323232323232323232323232323232323232 + 3232323232323232323232323232323232323131313131313D3D3D3B3B3B3C3C + 3C3C3C3C3D3D3D999999C2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFEFEFEF6F6F6E1E1E1C2C2C29A9A9A3B3B3B3D3D3D3C3C3C3D3D + 3D3E3E3E32323231313134343431313133333332323233333333333333333333 + 33333333333333333333333333333232323232323131313030302F2F2F2D2D2D + 2C2C2C2B2B2B2828283333333838383838383B3B3B3B3B3B3838383939393838 + 3838383838383838383838383838383838383838383838383838383838383838 + 3838383838383838383838383838383838383838383838383838383838383838 + 3838383838383838383838383838383838383838383838383838383838383838 + 3838383838383838383838383838383838383838383838383838383838383838 + 3838383838383838383838383838373737383838383838383838383838373737 + 3636363636363A383834353130323237343D2F29243F37124F44085B490A624F + 066552076B57096F5A08745E067760047A62027C6301816B02514008160F060D + 11160E1213151214151214161715161616161616161616161616161616161616 + 1616161616161616161616161515151515151515151515151414141414141212 + 121212121515151515151111111616162E2E2E4848484242423A3A3A3A3A3A39 + 3939383838393939363636383838383838383838383838383838383838383838 + 38383838383837383C3738363639303639303637333437353138332F3A322B36 + 332F2E3043362E6B5629987F21B4961FBE9625BF8C2EB7962FB99831BB9836BB + 9A39BB993CB8953BB49239B28F39AD8F38AB8C37A78A35A388329E832D947A26 + 89711D826A168568178166167D6316785F15735D166D5814665211614F10594D + 0D5447095043054F42044D3F044A3C014B3D034E40064B3C04342B091E1F151D + 202528272B2D29282D2B2A2A2F2E313131313131323232333333333333333333 + 3232323232323333333333333333333333333333333333333333333333333232 + 323131313E3E3E3B3B3B3C3C3C3C3C3C3D3D3D999999C2C2C2DFDFDFF6F6F6FD + FDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF6F6F6E1E1E1C2C2C29A9A + 9A3B3B3B3D3D3D3C3C3C3D3D3D3E3E3E32323231313135353532323233333332 + 3232333333333333333333333333333333333333333333333333323232323232 + 3232323131312F2F2F2E2E2E2C2C2C2B2B2B2727273333333838383838383C3C + 3C3B3B3B38383839393938383838383838383838383838383838383838383838 + 3838383838383838383838383838383838383838383838383838383838383838 + 3838383838383838383838383838383838383838383838383838383838383838 + 3838383838383838383838383838383838383838383838383838383838383838 + 3838383838383838383838383838383838383838383838383838373737383838 + 3838383838383838383737373636363535353836363536322E3030333039312B + 264139144D42065B490A614E036452056A5608705B06735D057960047C63037D + 6402816B02514008150E050C10150D1112141113141113151614151515151515 + 1515151515151515151515151515151515151515151515151414141414141414 + 141414141313131313131212121111111515151313131515152A2A2A41414145 + 45453F3F3F3A3A3A3B3B3B3737373838383A3A3A3535353B3B3B383838383838 + 38383838383838383838383838383838383839353A3838383839373538363436 + 36333536343637343636333A33323337322B323C32285C4F23847128A2842BAB + 862AAD8D22AF8F24B2912AB39330B59433B59336B39138B29037A98936A78734 + A284319D812D977B278E7420856D19816915876B178568178165187D63177860 + 18725B176B55136652115E4F10594A0B5546085344065141064D3D024E3E0351 + 40074B3C04342B091F20161E212628272B2E2A292D2B2A2B302F313131323232 + 3232323333333333333333333333333232323333333333333333333333333333 + 333333333333333333333232323232323E3E3E3B3B3B3C3C3C3C3C3C3D3D3D99 + 9999C2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFE + FEF6F6F6E1E1E1C2C2C29A9A9A3B3B3B3D3D3D3C3C3C3E3E3E3F3F3F33333331 + 3131353535323232333333333333333333333333333333333333333333333333 + 3333333333333232323232323232323131313030302E2E2E2C2C2C2C2C2C2727 + 273232323838383939393C3C3C3C3C3C3939393A3A3A38383838383838383838 + 3838383838383838383838383838383838383838383838383838383838383838 + 3838383838383838383838383838383838383838383838383838383838383838 + 3838383838383838383838383838383838383838383838383838383838383838 + 3838383838383838383838383838383838383838383838383838383838383838 + 3838383838383737373838383838383939393838383737373636363535353634 + 343839352E30302E2B342E28234139144D42065B490A614E036652056C570670 + 5B06735D057960047C63037D6402816B02514008150E050B0F140C1011131012 + 1310121516141414141414141414141414141414141414141414141414141414 + 1414141414141414141413131313131313131313131313131312121214141411 + 11111919193B3B3B4D4D4D3C3C3C3D3D3D3C3C3C3D3D3D3636363838383B3B3B + 3434343D3D3D3939393939393939393939393939393939393939393939393A33 + 3A3B373C38393D35383D33353D34333D36323D39343D3D353538382C383D2E3C + 3A39392D333E2B1E624E148B7B17B09223AF9023AC8C21A98A23A88726A98729 + A9872DAA882FA48431A0802D997B289175218D711D886F19866F19866F19896B + 18876A198368187F65197A621A745D196D57156A54135F50115A4B0C56470854 + 45075243054E3E034E3E035141064C3D05352C0A1F20161E212628272B2E2A29 + 2D2B2A2B302F3131313232323333333333333333333333333333333333333333 + 333333333333333333333333333333333333333333333232323232323E3E3E3B + 3B3B3C3C3C3C3C3C3D3D3D999999C2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFF + FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5DFDFDFC1C1C19B9B9B3D3D3D3F3F3F3E + 3E3E3C3C3C3E3E3E343434333333353535323232343434343434343434343434 + 3434343434343434343434343434343434343232323232323232323131313030 + 302F2F2F2D2D2D2C2C2C2C2C2C2B2B2B3737373B3B3B3E3E3E3F3F3F3838383D + 3D3D393939393939393939393939393939393939393939393939393939393939 + 3939393939393939393939393939393939393939393939393939393939393939 + 3939393939393939393939393939393939393939393939393939393939393939 + 3939393939393939393939393939393939393939393939393939393939393939 + 3939393939393939393939393939393939393939393939393939393939393939 + 393838383737373636363534363135302F31312E2A302F281F3F380D5447035C + 4900604C006450026A5503715A04755D037960027D64028066028772054F3F04 + 110B000A0F120B100F1613151613151213111212121313131414141515151515 + 1515151514141413131313131316161615151511111110101014141414141411 + 11111717170E0E0E0F0F0F2323233B3B3B4545454141413B3B3B3A3A3A3A3A3A + 3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3939393939393939393939393939 + 3939393939393939393939393939393939393939393939393939393939393939 + 39393939393939393838383838383737373636363636363535356450197A6220 + 987C25B08E23B8901FB68A19B08118AA7A1A967D1D947A1C92771C90751B8E72 + 1B8C6E1B8B6D1C8B6D1C8F680690710E86721B7665265A4C12665614715A1672 + 53166352135F4D105C4A0F5A470E554308513F025242005546014D3F05322A05 + 1E1F1520232728272B2F2A2B302E2E292D2E3232323232323333333333333434 + 3434343433333333333334343434343434343434343434343434343434343434 + 34343535353333333F3F3F3C3C3C3E3E3E3D3D3D3D3D3D979797C2C2C2DFDFDF + F6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5DFDFDFC1 + C1C19B9B9B3D3D3D3F3F3F3E3E3E3C3C3C3E3E3E343434333333363636323232 + 3434343434343434343434343434343434343434343434343434343434343232 + 323232323232323131313030302F2F2F2E2E2E2D2D2D2B2B2B2B2B2B3636363C + 3C3C3E3E3E3F3F3F3939393D3D3D393939393939393939393939393939393939 + 3939393939393939393939393939393939393939393939393939393939393939 + 3939393939393939393939393939393939393939393939393939393939393939 + 3939393939393939393939393939393939393939393939393939393939393939 + 3939393939393939393939393939393939393939393939393939393939393939 + 393939393939393939393939393838383737373636363534363135302F31312E + 2A302F281F3F380D5548045C4900614D006450026A5503715A04755D03796101 + 7D6402806602836E014E3E03130D020A0F12090E0D110E1013101210110F1212 + 1213131314141414141414141414141413131312121211111114141416161615 + 15151414141313131313131212120D0D0D141414232323353535424242444444 + 4040403C3C3C3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3939 + 3939393939393939393939393939393939393939393939393939393939393939 + 3939393939393939393939393939393939393939393939383838373737373737 + 3636363636363F30274E3E276652237A631F886F19917719987F1F9C8224A07E + 219F7D209D7B1E9B781E98751B947018906C148E69149475268770206E5E1B58 + 4A1A4134065C4D0F725E177A5D1A6555136251125E4C115C4A0F57450A534203 + 5343005748034D3F05322A051E1F1520232728272B302B2C312F2F2A2E2F3232 + 3232323233333334343434343434343433333333333334343434343434343434 + 34343434343434343434343434343535353333333F3F3F3C3C3C3E3E3E3E3E3E + 3D3D3D979797C2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFF5F5F5DFDFDFC1C1C19B9B9B3D3D3D3F3F3F3E3E3E3C3C3C3F3F3F + 3434343333333636363232323434343434343434343434343434343434343434 + 343434343434343434343333333333333333333232323131313030302E2E2E2D + 2D2D2B2B2B2B2B2B3535353C3C3C4040404040403A3A3A3C3C3C393939393939 + 3939393939393939393939393939393939393939393939393939393939393939 + 3939393939393939393939393939393939393939393939393939393939393939 + 3939393939393939393939393939393939393939393939393939393939393939 + 3939393939393939393939393939393939393939393939393939393939393939 + 393939393939393939393939393A3A3A3A3A3A3A3A3A39393938383837373737 + 37373635373135302F31312D292F2F281F3F380D5548045C4900614D00645002 + 6B5604715A04765F037A62027D6501816802826D004F3F04150F040C1114080D + 0C100D0F110E1010110F12121212121213131313131313131312121212121211 + 11111212121010100F0F0F101010121212111111101010101010101010242424 + 3B3B3B4545454444444040403D3D3D3C3C3C3A3A3A3A3A3A3A3A3A3A3A3A3A3A + 3A3A3A3A3A3A3A3A3A3A39393939393939393939393939393939393939393939 + 39393939393939393939393939393939393939393939393939393A3A3A393939 + 39393939393938383838383837373737373733334135333939342B3F381D4941 + 19574E1C675E2570682D876823896A258B6D268C6E278B6E24896C2285681D83 + 661B6E5A2B5F5120473E1838301931260B5549137160177B6016685815645314 + 614F125F4D125A480B554405554601584A024E4006332B061F20162023272928 + 2C302B2C312F2F2B2F3032323233333333333334343434343434343434343434 + 3434343434343434343434343434343434343434343434343434353535333333 + 3F3F3F3D3D3D3E3E3E3E3E3E3D3D3D989898C2C2C2DFDFDFF6F6F6FDFDFDFFFF + FFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5DFDFDFC1C1C19B9B9B3D3D3D + 3F3F3F3E3E3E3D3D3D3F3F3F3535353434343737373333333535353535353535 + 3535353535353535353535353535353535353535353534343434343433333333 + 33333232323030302F2F2F2E2E2E2B2B2B2B2B2B3232323B3B3B414141414141 + 3D3D3D3C3C3C3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A + 3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A + 3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A + 3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A + 3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A + 3A3A3A3A3A3939393838383737373635373135302F31312D292F2E271E3F380D + 5548045D4A01624E006552016B5702725C04765F037A62027E66028168028570 + 03504005140E030B1013090E0D120F1113101211121012121212121212121212 + 12121111111111111111111010101111111010101212121414141111110D0D0D + 0E0E0E1313132727273838384747474646463E3E3E3A3A3A3B3B3B3C3C3C3A3A + 3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A + 3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A + 3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3939393939393939393838383838382E3C + 3B2E3A3A32383733363438353138342F3A342F3C342D44371D463A1E4A3F214D + 42224F46214E451F4D451D4C451A3B332236321F2C2B212C27282E251B564C1D + 7362197A62106A5916675514645213614E115D4B0C5745045747025A4B024F41 + 07342C071F201620232729282C312C2D3230302C303133333333333334343434 + 3434353535353535343434343434353535353535353535353535353535353535 + 3535353535353535353434343F3F3F3D3D3D3F3F3F3E3E3E3D3D3D989898C2C2 + C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5 + DFDFDFC1C1C19B9B9B3D3D3D3F3F3F3E3E3E3D3D3D4040403535353434343737 + 3734343435353535353535353535353535353535353535353535353535353535 + 35353535353434343434343434343333333131313030302F2F2F2C2C2C2C2C2C + 3030303A3A3A4242424141413F3F3F3D3D3D3B3B3B3B3B3B3B3B3B3B3B3B3B3B + 3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B + 3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B + 3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B + 3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B + 3B3B3B3B3B3B3B3B3B3B3B3B3B3B3A3A3A393939383838383838373638323631 + 3032322D292F2E271E3F380D5649055E4B02624E006552016C5803725C047761 + 027B64017E67018269018772054F3F04100A00080D10090E0D14111314111310 + 110F111111111111111111111111111111111111111111111111141414141414 + 1414141212120E0E0E1111112222223333333E3E3E4444444444443E3E3E3939 + 393A3A3A3B3B3B3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A + 3A3A3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B + 3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3A3A3A3A3A3A3A3A3A3A3A3A3A3A + 3A3A3A3A3A3A3A3939392E392F303A34343A39373A3F3938423B34413A303D39 + 2D3934333535353536373537383436383235392E34382C33372B3330322F3230 + 292C312927332A241F52491D7261187C64126959146655126452116250115D4B + 0A5847045748005A4C00514309352D0820211721242829282C312C2D3331312D + 3132333333343434343434353535353535353535353535353535353535353535 + 3535353535353535353535353535353535353535353434344040403D3D3D3F3F + 3F3E3E3E3E3E3E989898C2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF5F5F5DFDFDFC1C1C19B9B9B3D3D3D3F3F3F3E3E3E3E3E + 3E40404036363635353538383834343436363636363636363636363636363636 + 3636363636363636363636363636353535353535353535343434333333323232 + 3131313030302D2D2D2D2D2D2D2D2D3939394242424141414242423E3E3E3B3B + 3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B + 3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B + 3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B + 3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B + 3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3A3A3A + 3939393838383837393236313032322D292F2E271E3F380D5649055F4C036350 + 006654016C5803735E037761027B64017F68028269018570034D3D020F090007 + 0C0F070C0B120F11110E100D0E0C101010101010101010101010101010111111 + 1212121212120E0E0E0A0A0A0A0A0A1010101C1C1C2C2C2C3D3D3D4A4A4A4545 + 454242423E3E3E3A3A3A3B3B3B3D3D3D3C3C3C3939393B3B3B3B3B3B3B3B3B3B + 3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B + 3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B + 3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3D393E39383C35363A35 + 363A3638393C3A3A423D3A473E3A38393D383A3B37393A363838353737343735 + 33363432353336323D3235392C30352829332620194C43176F5C137A5F0F6A58 + 1168551166531064500F604C0B5B48045B4A015D4D0052440A362E0921221821 + 24282A292D322D2E3432322E3233343434343434353535363636363636363636 + 3535353535353636363636363636363636363636363636363636363636363636 + 363434344040403D3D3D3F3F3F3F3F3F3E3E3E989898C2C2C2DFDFDFF6F6F6FD + FDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5DFDFDFC1C1C19B9B + 9B3D3D3D3F3F3F3E3E3E3E3E3E41414136363635353538383834343436363636 + 3636363636363636363636363636363636363636363636363636363636363636 + 3636363535353434343232323131313030302F2F2F2E2E2E2A2A2A3737374141 + 414141414545454040403B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B + 3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B + 3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B + 3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B + 3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3C3C3C + 3C3C3C3C3C3C3B3B3B3A3A3A3939393939393837393337323032322D292F2E27 + 1E3F380D574A065F4C036350006654016D5A03735E037862037C65017F680283 + 6A028570035242071812070E1316090E0D0F0C0E0F0C0E0D0E0C1010100F0F0F + 0F0F0F0F0F0F1010101212121313131414140E0E0E1313131D1D1D2C2C2C3D3D + 3D4646464545454040404141413D3D3D3B3B3B3D3D3D3E3E3E3D3D3D3B3B3B3A + 3A3A3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B + 3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B + 3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3C3C3C3C + 3C3C4337434139433D3C40383D3C373D383A3D343D3D31403C313A3B373A3B37 + 3A3B373B3C3A3B3C3A3A3A3A3A3A3A39383A3730373334322D302E2C2B2D2A25 + 165145156D591277570E6A591068560F665310665310624F0C5D4B045D4D015F + 4F0253450B372F0A2122182124282A292D322D2E3533332F3334343434353535 + 3535353636363636363636363636363535353636363636363636363636363636 + 363636363636363636363636363434344040403E3E3E3F3F3F3F3F3F3E3E3E99 + 9999C2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF5F5F5DFDFDFC1C1C19B9B9B3D3D3D3F3F3F3E3E3E3E3E3E41414137373735 + 3535383838353535363636363636363636363636363636363636363636363636 + 3636363636363636363636363636363535353434343333333131313131313030 + 302E2E2E2929293636364141414141414646464141413C3C3C3C3C3C3C3C3C3C + 3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C + 3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C + 3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C + 3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C + 3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3B3B3B3A3A3A3939393939393837 + 393337323032322D292F2E271E3F380D574A065F4C036350006654016D5A0373 + 5E037862027C65017F6900836B0186710458480D221C11171C1F0D12110F0C0E + 100D0F10110F0F0F0F0F0F0F0F0F0F0F0F0F1010101212121414141515152E2E + 2E3A3A3A4545454747474545454444444242423F3F3F3E3E3E3C3C3C3D3D3D40 + 40403F3F3F3A3A3A3939393C3C3C3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B + 3B3B3B3B3B3B3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C + 3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3B3B3B3B3B3B3B3B3B3B + 3B3B3C3C3C3C3C3C3C3C3C3C3C3C433A3D413C3D3B3E3C353F39343E38363D38 + 3C3C3C413C3D383D34393D373A3E393A3D3B3A3C3D393A3E38383E37363F3E35 + 3839372F2F32292F2F29302B16564B19725B177957116A591068560F67541067 + 541164510D5F4D065F4F0361520353450B372F0A2122182124282A292D332E2F + 3533333034353434343535353636363636363636363636363636363636363636 + 363636363636363636363636363636363636363636363636363535354040403E + 3E3E3F3F3F3F3F3F3E3E3E999999C2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFF + FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6DFDFDFC1C1C19B9B9B3E3E3E41414140 + 40403E3E3E3E3E3E363636363636363636343434383838363636373737373737 + 3737373737373737373737373737373737373636363636363636363636363636 + 363535353434343333332E2E2E3030302B2B2B2F2F2F3E3E3E46464643434342 + 42424141413F3F3F3D3D3D3C3C3C3D3D3D3D3D3D3D3D3D3C3C3C3D3D3D3D3D3D + 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D + 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D + 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D + 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3C3C + 3C3B3B3B3A3A3A3A3A3A3A35363738342D3132292A342B27223C350A5A4C0463 + 4D006553006B5702705C047560047B63037D6501816800856B0186710458480D + 352F24303538363B3A3A37393936383637353131313131313131313434343838 + 383F3F3F4545454949494343434343434242424141413F3F3F3E3E3E3D3D3D3D + 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D + 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D + 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D + 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D + 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3C3C + 3C3B3B3B3A3A3A3A3A3A37363A3337323032322E2A2F2E251B50461763540C72 + 5B0F6754106A571368560F69560D6856096551036350006A58056050003B300A + 231F1E23282B2B2F2A332F2E3732343433353636363636363636363636363636 + 3636363636363636363637373737373737373737373737373737373737373737 + 37373737373636364141413F3F3F4040403F3F3F3E3E3E999999C2C2C2DFDFDF + F6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6DFDFDFC1 + C1C19B9B9B3E3E3E4141414040403E3E3E3E3E3E363636373737363636343434 + 3939393636363737373737373737373737373737373737373737373737373636 + 363636363636363636363636363535353434343333332F2F2F3131312C2C2C2D + 2D2D3C3C3C4646464545454343434242424040403E3E3E3D3D3D3D3D3D3D3D3D + 3D3D3D3C3C3C3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D + 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D + 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D + 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D + 3D3D3D3D3D3D3D3D3D3D3C3C3C3C3C3C3B3B3B3A3A3A3B36373738342D313229 + 2A342B27223D360B5B4D05634D006654016B5702705C047560047B63037D6501 + 816800856B01846F0256460B322C212D3235353A393C393B3E3B3D3D3E3C4444 + 4444444443434343434343434344444445454546464641414141414141414140 + 40403F3F3F3E3E3E3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D + 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D + 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D + 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D + 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D + 3D3D3D3D3D3D3D3D3D3D3C3C3C3C3C3C3B3B3B3A3A3A38373B3337323032322E + 2A2F2F261C50461763540C725B0F6754106A58116A570E69560B6B5709655201 + 6452006D58066050003B300A231F1E23282B2B2F2A332F2E3732343433353636 + 3636363636363636363636363636363636363636363637373737373737373737 + 37373737373737373737373737373838383636364141413F3F3F4040403F3F3F + 3F3F3F999999C2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFF6F6F6DFDFDFC1C1C19B9B9B3E3E3E4141414040403F3F3F3E3E3E + 3737373737373737373535353939393636363737373737373737373737373737 + 3737373737373737373736363637373737373737373736363635353534343434 + 34343030303232322D2D2D2B2B2B383838464646484848454545444444424242 + 3F3F3F3E3E3E3E3E3E3E3E3E3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D + 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D + 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D + 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D + 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3E3E3E3D3D3D3D3D3D3C3C3C3B3B3B3A + 3A3A3B36373839352E3233292A342B27223D360B5B4D05644E006654016B5702 + 705C047560047B63037D6501816800856B0185700356460B312B202B30333338 + 373C393B403D3F40413F4040404141414141414141414141414040403E3E3E3D + 3D3D3F3F3F3F3F3F3F3F3F3E3E3E3E3E3E3E3E3E3D3D3D3D3D3D3D3D3D3D3D3D + 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D + 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D + 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D + 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D + 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3E3E3E3D3D3D3D3D3D3C3C3C3B3B3B3A + 3A3A38373B3438333133332F2B302F261C50461762530B715A0E69550E6C5910 + 6A570C6C580B6C59086954026854006F5B066252003C310B24201F23282B2B2F + 2A34302F37323435343636363636363636363636363636363636363636363636 + 3636373737373737373737373737373737373737373737373737383838363636 + 4242423F3F3F4040404040403F3F3F999999C2C2C2DFDFDFF6F6F6FDFDFDFFFF + FFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6DFDFDFC1C1C19B9B9B3E3E3E + 4141414040403F3F3F3F3F3F3737373838383737373535353A3A3A3737373838 + 3838383838383838383838383838383838383838383837373737373737373737 + 37373737373636363535353434343232323333332E2E2E2A2A2A343434444444 + 4A4A4A4747474747474444444141413F3F3F3E3E3E3F3F3F3E3E3E3D3D3D3E3E + 3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E + 3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E + 3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E + 3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E + 3E3E3D3D3D3C3C3C3C3C3C3B3B3B3B36373839352E32332A2B352C28233D360B + 5B4D05644E006654016B5702705C047560047B63037E6602826901856B018873 + 0658480D322C212A2F323136353936383C393B3C3D3B3B3B3B3C3C3C3E3E3E40 + 40404141414040404040403F3F3F3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3E3E3E + 3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E + 3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E + 3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E + 3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E + 3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E + 3E3E3D3D3D3C3C3C3C3C3C3B3B3B38373B3438333133332F2B302F261C4F4516 + 61520A6F580C6B560B6E590E6D590C6F590B6F5A086B56016B5700725E066353 + 003D320C25212024292C2C302B34302F38333536353737373737373737373737 + 3737373737373737373737373737383838383838383838383838383838383838 + 3838383838383838383737374242423F3F3F4141414040403F3F3F9A9A9AC2C2 + C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6 + DFDFDFC1C1C19B9B9B3E3E3E4141414040404040404040403838383838383838 + 383636363A3A3A37373738383838383838383838383838383838383838383838 + 3838383838383838383838383838373737363636353535353535333333333333 + 2F2F2F2B2B2B3030304040404A4A4A4A4A4A4949494646464242424040403F3F + 3F3F3F3F3F3F3F3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E + 3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E + 3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E + 3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E + 3E3E3E3E3E3E3E3E3F3F3F3E3E3E3E3E3E3D3D3D3C3C3C3B3B3B3C3738393A36 + 2F33342A2B352C28233E370C5C4E06654F016654016B5702705C047661057B63 + 037E6602826901856B0187720558480D312B202A2F3230353437343639363838 + 39373F3F3F3F3F3F4040404040404040404040404040403F3F3F3D3D3D3D3D3D + 3D3D3D3D3D3D3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E + 3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E + 3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E + 3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E + 3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E + 3E3E3E3E3E3E3E3E3F3F3F3E3E3E3E3E3E3D3D3D3C3C3C3B3B3B39383C353934 + 323434302C312F261C4F45166051096E570B6C55096F590B6F5A09705A08725D + 086F59016F5A007762076555023F340E26222124292C2C302B34302F38333536 + 3537383838383838383838383838383838383838383838383838383838383838 + 3838383838383838383838383838383838383838383737374242424040404141 + 414040403F3F3F9A9A9AC2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF6F6F6DFDFDFC1C1C19B9B9B3E3E3E4141414040404040 + 404040403838383939393838383636363B3B3B38383839393939393939393939 + 3939393939393939393939393939383838383838383838383838383838373737 + 3636363535353535353333333131312D2D2D2D2D2D3939394747474C4C4C4C4C + 4C4949494444444141414040404040404040403F3F3F3F3F3F3F3F3F3F3F3F3F + 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F + 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F + 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F + 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3E3E3E3E3E3E + 3D3D3D3C3C3C3D3839393A362F33342B2C362D29243F380D5D4F07654F016755 + 026C5803715D057661057C64047E6602826901866C02846F0255450A302A1F2A + 2F323136353835373A3739393A383C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3D3D3D + 3D3D3D3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3F3F3F3F3F3F3F3F + 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F + 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F + 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F + 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F + 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3E3E3E3E3E3E + 3D3D3D3C3C3C39383C363A35333535312D3230271D4F45165F50086D560A6D56 + 08705909705A08735B07755F07735B01735C007B650667570440350F27232224 + 292C2C302B353130393436373638383838383838383838383838383838383838 + 3838383838383939393939393939393939393939393939393939393939393939 + 393737374242424040404141414040404040409A9A9AC2C2C2DFDFDFF6F6F6FD + FDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6DFDFDFC1C1C19B9B + 9B3E3E3E4141414040404141414040403939393939393939393737373B3B3B38 + 3838393939393939393939393939393939393939393939393939383838393939 + 3939393939393838383737373636363636363636363232323232323030302C2C + 2C3333334444444E4E4E4E4E4E4A4A4A45454542424240404040404040404040 + 40403F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F + 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F + 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F + 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F + 3F3F3F3F3F3F3F3F3F3E3E3E3D3D3D3C3C3C3D38393A3B373034352B2C362D29 + 243F380D5D4F076650026755026C5803715D057661057C64047E660282690186 + 6C02846F0256460B312B202A2F323237363A37393C393B3C3D3B3C3C3C3D3D3D + 3E3E3E3F3F3F4040404141414141414242423F3F3F3F3F3F3F3F3F3F3F3F3F3F + 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F + 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F + 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F + 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F + 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F + 3F3F3F3F3F3F3F3F3F3E3E3E3D3D3D3C3C3C3A393D363A35333535312D323027 + 1D4E44155E4F076B54086D5606725A08725A06745D07786006755E02775E007F + 6707685805413610272322252A2D2C302B353130393436383739383838383838 + 3838383838383838383838383838383838383939393939393939393939393939 + 393939393939393939393939393737374343434040404141414141414040409A + 9A9AC2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF6F6F6DFDFDFC1C1C19B9B9B3E3E3E41414140404041414141414139393939 + 39393939393737373B3B3B383838393939393939393939393939393939393939 + 3939393939393939393939393939393939393838383737373636363636363636 + 363131313333333232322B2B2B2F2F2F4141414F4F4F4F4F4F4B4B4B46464642 + 42424141414141414040404040403F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F + 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F + 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F + 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F + 3F3F3F3F3F3F3F3F3F4040404040404040403F3F3F3E3E3E3D3D3D3D3D3D3D38 + 393A3B373034352B2C362D29243F380D5D4F076650026755026C5803715D0576 + 61057C64047F6703826901866C0288730658480D322C212B30333237363A3739 + 3D3A3C3D3E3C3E3E3E3F3F3F4040404040404040403F3F3F3E3E3E3D3D3D4141 + 414141414040404040404040404040404040403F3F3F3F3F3F3F3F3F3F3F3F3F + 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F + 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F + 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F + 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F + 3F3F3F3F3F3F3F3F3F4040404040404040403F3F3F3E3E3E3D3D3D3D3D3D3A39 + 3D363A35333535312D3230271D4E44155E4F076B54086F5705725A08735B0776 + 5E06786006775E00786000806808695906423711282423252A2D2C302B353130 + 3A35373837393939393939393939393939393939393939393939393939393939 + 3939393939393939393939393939393939393939393939393937373743434340 + 40404141414141414040409A9A9AC2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFF + FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFEFEFEF4F4F4E2E2E2BFBFBF9A9A9A42424241414141 + 41414141413F3F3F3B3B3B3939393939393939393939393939393A3A3A3A3A3A + 3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3939 + 393939393939393939393737373434343131313232323232322C2C2C3535354B + 4B4B4E4E4E4D4D4D4F4F4F4949493F3F3F414141464646414141404040404040 + 4040404040404040404040404040404040404040404040404040404040404040 + 4040404040404040404040404040404040404040404040404040404040404040 + 4040404040404040404040404040404040404040404040404040404040404040 + 4040404040404040404040404040404040404040404141414141414141414040 + 403F3F3F3E3E3E3E3E3E3D3B3A383C363036352E30382E2B233E380B5E4F066C + 53036A55036E5904745E067962067E6503816802856B01896D0189750057440B + 3229262E3038313732393C333E3E3E3B3C403E3E3E3F3F3F4040404040404040 + 4040404040404040404040404040404040404040404040404040404040404040 + 4040404040404040404040404040404040404040404040404040404040404040 + 4040404040404040404040404040404040404040404040404040404040404040 + 4040404040404040404040404040404040404040404040404040404040404040 + 4040404040404040404040404040404040404040404040404040404040404040 + 4040404040404040404040404040404040404040404040404040404040403F3F + 3F3E3E3E3D3D3D3D3D3D403D393A3C363133333230363029204C3F13644E0671 + 53046F5907755D09755E087961077D64067B62007E6400866D07725F04423207 + 2A2320272A2F2D2F2F3634343535353338363A3A3A3A3A3A3A3A3A3A3A3A3A3A + 3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A + 3A3A3A3A3A3B3B3B414141414141444444404040424242999999C2C2C2DFDFDF + F6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF4F4F4E2E2E2BF + BFBF9A9A9A4242424141414141414242423F3F3F3B3B3B3939393939393A3A3A + 3939393939393A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3B3B + 3B3A3A3A3A3A3A3A3A3A3A3A3A39393939393939393938383836363633333333 + 33333232322D2D2D3232324343435252524E4E4E4D4D4D4B4B4B454545424242 + 4242424141414141414141414141414141414141414141414141414141414141 + 4141414141414141414141414141414141414141414141414141414141414141 + 4141414141414141414141414141414141414141414141414141414141414141 + 4141414141414141414141414141414141414141414141414141414141414141 + 414141414141414141414040403F3F3F3F3F3F3E3E3E3D3B3A383C363036352E + 30382E2B233E380B5E4F066C53036A56016E5A03745E067963047E6503816802 + 856B01896D0189750057440B3229262E3038323833393C333E3E3E3B3C403F3F + 3F3F3F3F40404041414141414141414140404040404041414141414141414141 + 4141414141414141414141414141414141414141414141414141414141414141 + 4141414141414141414141414141414141414141414141414141414141414141 + 4141414141414141414141414141414141414141414141414141414141414141 + 4141414141414141414141414141414141414141414141414141414141414141 + 4141414141414141414141414141414141414141414141414141414141414040 + 404040404040404040404040403F3F3F3E3E3E3D3D3D403C3B3A3C3631333332 + 30363029204D4012644E067154036E5904745C08755F077962067D64067C6301 + 7E6500876E08725F044333082A2320282B302D2F2F3735353535353338363A3A + 3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A + 3A3A3A3A3A3A3A3A3A3A3A3A3A3A3B3B3B3B3B3B414141414141444444404040 + 424242999999C2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFEFEFEF4F4F4E2E2E2BFBFBF9A9A9A4242424141414141414242423F3F3F + 3C3C3C3A3A3A3A3A3A3A3A3A3A3A3A3939393A3A3A3A3A3A3A3A3A3A3A3A3A3A + 3A3A3A3A3A3A3A3A3A3A3B3B3B3B3B3B3B3B3B3A3A3A3A3A3A3A3A3A3A3A3A3A + 3A3A3939393939393535353333333232322E2E2E303030383838545454505050 + 4C4C4C4D4D4D4C4C4C4444443F3F3F4141414141414141414141414141414141 + 4141414141414141414141414141414141414141414141414141414141414141 + 4141414141414141414141414141414141414141414141414141414141414141 + 4141414141414141414141414141414141414141414141414141414141414141 + 414141414141414141414141414141414242424141414141414040403F3F3F3F + 3F3F3E3C3B393D373036352E30382E2B233E380B5E4F066C53036A56016E5A03 + 745F047963047E6503826901866C02896D018A760158450C332A272E30383238 + 33393C333F3F3F3C3D413F3F3F40404040404041414141414141414141414141 + 4141414141414141414141414141414141414141414141414141414141414141 + 4141414141414141414141414141414141414141414141414141414141414141 + 4141414141414141414141414141414141414141414141414141414141414141 + 4141414141414141414141414141414141414141414141414141414141414141 + 4141414141414141414141414141414141414141414141414141414141414141 + 414141414141414141414141414141414141414141414040403F3F3F3E3E3E3E + 3E3E403C3B3A3C363133333230363029204D4012644F04715501705903735C06 + 765E047B62047F66047F65018067008A6F077360054333082B2421282B302E30 + 303735353636363439373A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A + 3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3B3B3B3B3B3B + 414141424242444444414141434343999999C2C2C2DFDFDFF6F6F6FDFDFDFFFF + FFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F4F4E2E2E2C0C0C09A9A9A434343 + 4242424242424343434040403C3C3C3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3B3B + 3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B + 3B3B3B3B3B3A3A3A3A3A3A3A3A3A393939393939373737343434323232303030 + 2F2F2F2F2F2F4E4E4E5353535252524F4F4F4F4F4F4747473F3F3F4242424242 + 4242424242424242424242424242424242424242424242424242424242424242 + 4242424242424242424242424242424242424242424242424242424242424242 + 4242424242424242424242424242424242424242424242424242424242424242 + 4242424242424242424242424242424242424242424242424242424242424242 + 42424242424141414040403F3F3F3F3D3C3A3E383137362E30382F2C243E380B + 5E4F066C53036A56016E5A03745F047A64057E6602826901866C00896E008A76 + 0158450C332A272F31393339343A3D343F3F3F3C3D4140404040404041414142 + 4242424242424242424242414141424242424242424242424242424242424242 + 4242424242424242424242424242424242424242424242424242424242424242 + 4242424242424242424242424242424242424242424242424242424242424242 + 4242424242424242424242424242424242424242424242424242424242424242 + 4242424242424242424242424242424242424242424242424242424242424242 + 4242424242424242424242424242424242424242424241414141414142424242 + 42424141414040403F3F3F3F3F3F403B3C3B3C38323434333137312B204E4212 + 6551037358026F5901755D037760047B6303806804806700846A008C72067562 + 0745350A2C2522292C312F31313735353636363439373B3B3B3B3B3B3B3B3B3B + 3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B + 3B3B3B3B3B3B3B3B3B3B3B3B424242424242444444414141434343999999C2C2 + C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5 + E3E3E3C0C0C09A9A9A4343434242424242424343434040403D3D3D3B3B3B3B3B + 3B3B3B3B3B3B3B3A3A3A3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B + 3B3B3C3C3C3C3C3C3C3C3C3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B383838383838 + 3737373535353333333333333131312C2C2C4040405353535959595252524F4F + 4F4A4A4A43434343434343434343434343434343434343434343434343434343 + 4343434343434343434343434343434343434343434343434343434343434343 + 4343434343434343434343434343434343434343434343434343434343434343 + 4343434343434343434343434343434343434343434343434343434343434343 + 43434343434343434343434343434343434242424141414040403F3D3C3A3E38 + 3137362F31392F2C243E380B5D4E056C53036B58016F5B037560047A64047F67 + 03826901866C008A6F018B770259460D342B2830323A3339343A3D344040403D + 3E42414141414141424242434343434343434343424242424242434343434343 + 4343434343434343434343434343434343434343434343434343434343434343 + 4343434343434343434343434343434343434343434343434343434343434343 + 4343434343434343434343434343434343434343434343434343434343434343 + 4343434343434343434343434343434343434343434343434343434343434343 + 4343434343434343434343434343434343434343434343434343434343434343 + 43434242424242424242424242424242424141414040403F3F3F403B3C3B3C38 + 333535343238322C1F4F4410675403745A00725A00765F037A62027E6503846B + 05846A00866C0090750776630846360B2D26232A2D322F313138363637373734 + 39373B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B + 3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B4242424242424444 + 444141414343439A9A9AC2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF5F5F5E3E3E3C0C0C09B9B9B4343434242424242424444 + 444141413D3D3D3B3B3B3B3B3B3C3C3C3B3B3B3B3B3B3C3C3C3C3C3C3C3C3C3C + 3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3B3B3B + 3B3B3B3B3B3B3A3A3A3737373737373737373434343434343333332E2E2E3434 + 344C4C4C5A5A5A5555555050504E4E4E49494944444444444444444444444444 + 4444444444444444444444444444444444444444444444444444444444444444 + 4444444444444444444444444444444444444444444444444444444444444444 + 4444444444444444444444444444444444444444444444444444444444444444 + 4444444444444444444444444444444444444444444444444444434343424242 + 414141414141403E3D3B3F393238372F31392F2C243E380B5D4E056C53036B58 + 016F5B037560047A64047F6802826A00866D008A6F008B770259460D342B2830 + 323A343A353B3E354040403D3E42424242424242434343434343444444444444 + 4343434343434444444444444444444444444444444444444444444444444444 + 4444444444444444444444444444444444444444444444444444444444444444 + 4444444444444444444444444444444444444444444444444444444444444444 + 4444444444444444444444444444444444444444444444444444444444444444 + 4444444444444444444444444444444444444444444444444444444444444444 + 4444444444444444444444444444434343434343434343434343434343424242 + 414141404040413C3E3C3D39343636353438342E21514711695704765D01745E + 007A62027C65027F6802856D03866C00896E0092780677640947370C2E27242B + 2E33303232383636373737353A383C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C + 3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C + 3C3C3C3C4242424242424545454141414343439A9A9AC2C2C2DFDFDFF6F6F6FD + FDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5E3E3E3C0C0C09B9B + 9B4343434242424242424444444141413E3E3E3C3C3C3C3C3C3C3C3C3C3C3C3B + 3B3B3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3D3D3D3D3D3D + 3D3D3D3C3C3C3C3C3C3C3C3C3C3C3C3B3B3B3D3D3D3737373838383939393535 + 353333333434343030302D2D2D4141415555555959595454545252524E4E4E46 + 4646444444444444444444444444444444444444444444444444444444444444 + 4444444444444444444444444444444444444444444444444444444444444444 + 4444444444444444444444444444444444444444444444444444444444444444 + 4444444444444444444444444444444444444444444444444444444444444444 + 454545444444444444434343424242414141413F3E3B3F393238372F31392F2C + 243E380B5D4E056B52026B59006F5C017560047A65027F6802836B01876E008A + 6F008C78035A470E352C2930323A343A353B3E354141413E3F43424242434343 + 4343434444444444444444444444444444444444444444444444444444444444 + 4444444444444444444444444444444444444444444444444444444444444444 + 4444444444444444444444444444444444444444444444444444444444444444 + 4444444444444444444444444444444444444444444444444444444444444444 + 4444444444444444444444444444444444444444444444444444444444444444 + 4444444444444444444444444444444444444444444444444444434343444444 + 444444444444434343424242414141414141423D3F3D3E3C3537373635393530 + 215248126A59037860007660007C65027E6602816B02877003876E008A700092 + 790578650A48380D2F28252C2F34313333393737373737353A383C3C3C3C3C3C + 3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C + 3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C4242424343434545454242424444449A + 9A9AC2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF5F5F5E3E3E3C0C0C09B9B9B4343434343434242424444444141413E3E3E3C + 3C3C3C3C3C3C3C3C3C3C3C3B3B3B3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C + 3C3C3C3C3C3C3D3D3D3D3D3D3D3D3D3D3D3D3C3C3C3C3C3C3C3C3C3C3C3C4040 + 403838383838383A3A3A3535353232323434343232322B2B2B3838384F4F4F5C + 5C5C585858545454505050464646454545454545454545454545454545454545 + 4545454545454545454545454545454545454545454545454545454545454545 + 4545454545454545454545454545454545454545454545454545454545454545 + 4545454545454545454545454545454545454545454545454545454545454545 + 454545454545454545454545454545454545444444434343424242424242413F + 3E3C403A3238372F31392F2C243E380B5D4E056B52026B59006F5C017561027A + 65027F6802836B01876E008A6F008C78035A470E352C2931333B343A353B3E35 + 4141413E3F434242424343434444444444444545454545454444444444444545 + 4545454545454545454545454545454545454545454545454545454545454545 + 4545454545454545454545454545454545454545454545454545454545454545 + 4545454545454545454545454545454545454545454545454545454545454545 + 4545454545454545454545454545454545454545454545454545454545454545 + 4545454545454545454545454545454545454545454545454545454545454545 + 454545454545444444444444444444444444434343434343424242414141433D + 423E3F3D36383937363A363122534A116B5A037961017A62027D660380690384 + 6B03896F03876F008B710094790678650A48380D3029262C2F34313333393737 + 373737353A383C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C + 3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C42424243 + 43434545454242424444449A9A9AC2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFF + FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6E0E0E0C2C2C297979745454541414143 + 43434444444141413E3E3E3C3C3C3C3C3C3D3D3D3D3D3D3C3C3C3D3D3D3D3D3D + 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D + 3D3D3D3D3D3D3D3D3D3D3C3C3C3C3C3C3B3B3B3A3A3A39393937373735353534 + 34343232323232324545455A5A5A5C5C5C5656565252524E4E4E474747474747 + 4646464545454444444343434343434444444646464646464646464646464646 + 4646464646464646464646464646464646464646464646464646464646464646 + 4646464646464646464646464646464646464646464646464646464646464646 + 4646464646464646464646464646464646464646464646464646464646464545 + 45444444434343434343443F403F403C343938323238322D244038096050046C + 54006F5901725D027862037D6603806903846D00886F018971018D7D0057430C + 362B2E303338353B36403F41413F454043414444444444444545454545454646 + 4646464645454545454546464646464646464646464646464646464646464646 + 4646464646464646464646464646464646464646464646464646464646464646 + 4646464646464646464646464646464646464646464646464646464646464646 + 4646464646464646464646464646464646464646464646464646464646464646 + 4646464646464646464646464646464646464646464646464646464646464646 + 4646464646464646464646464646464646464646464545454545454545454747 + 474646464444444141413E3A3F3F403E393B3B3B3A3E3B3423564B116D59017D + 60007C6400806804836A02876D018D72048C71008D7300977B057E6906453A0E + 2B292832302F37342F36373B35383D3D3D373D3D3D3D3D3D3D3D3D3D3D3D3D3D + 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D + 3D3D3E3E3E3F3F3F444444424242454545444444454545989898C2C2C2DFDFDF + F6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6E0E0E0C2 + C2C29797974545454141414343434444444141413E3E3E3C3C3C3C3C3C3D3D3D + 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D + 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3C3C3C3C3C3C3B + 3B3B3939393838383636363535353030302F2F2F3838384F4F4F5F5F5F5C5C5C + 5454545151514A4A4A4949494747474545454545454545454545454545454646 + 4646464646464646464646464646464646464646464646464646464646464646 + 4646464646464646464646464646464646464646464646464646464646464646 + 4646464646464646464646464646464646464646464646464646464646464646 + 46464646464646464646454545454545444444434343443F403F403C353A3933 + 3339322D2441390A6050046C54006F5901745C027862037D6603806A01846D00 + 886F018971018D7D0058440D362B2E303338353B36403F41413F454043414444 + 4444444445454546464646464646464645454545454546464646464646464646 + 4646464646464646464646464646464646464646464646464646464646464646 + 4646464646464646464646464646464646464646464646464646464646464646 + 4646464646464646464646464646464646464646464646464646464646464646 + 4646464646464646464646464646464646464646464646464646464646464646 + 4646464646464646464646464646464646464646464646464646464646464747 + 47464646454545464646464646464646434343414141403C4140413F3B3D3D3D + 3C403C3524564B116E5A027F62007D6501806903846B03886E028D72038C7100 + 8D7300987D057E6906453A0E2B292832302F37342F36373B35383D3D3D373D3D + 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D + 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3E3E3E3F3F3F444444424242454545444444 + 454545989898C2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFF6F6F6E0E0E0C2C2C2979797464646424242444444444444424242 + 3E3E3E3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D + 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D + 3D3D3D3D3D3D3D3D3C3C3C3C3C3C3A3A3A3838383737373636363232322E2E2E + 2D2D2D3F3F3F5B5B5B6262625858585454544F4F4F4B4B4B4747474545454646 + 4647474747474746464646464646464646464646464646464646464646464646 + 4646464646464646464646464646464646464646464646464646464646464646 + 4646464646464646464646464646464646464646464646464646464646464646 + 4646464646464646464646464646464647474746464646464645454544444443 + 43434540413F403C353A39333339332E2541390A6151056D5501725A00755E02 + 7B62047F6604836A02846D008870008A72008E7E0058440D362B2E313439363C + 3741404242404641444244444445454545454546464646464646464646464646 + 4646464646464646464646464646464646464646464646464646464646464646 + 4646464646464646464646464646464646464646464646464646464646464646 + 4646464646464646464646464646464646464646464646464646464646464646 + 4646464646464646464646464646464646464646464646464646464646464646 + 4646464646464646464646464646464646464646464646464646464646464646 + 4646464646464646464647474746464646464646464646464645454544444442 + 42424440454142403E40404342463F3827574C126F5B038164027E6602836A04 + 856C04896F038E73048D7200907400997E067E6906453A0E2B29283331303835 + 3036373B35383D3D3D373D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D + 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3E3E3E3F3F3F + 444444424242454545444444454545989898C2C2C2DFDFDFF6F6F6FDFDFDFFFF + FFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF6F6F6E0E0E0C2C2C2989898464646 + 4242424545454545454242423F3F3F3D3D3D3D3D3D3E3E3E3E3E3E3E3E3E3E3E + 3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E + 3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3D3D3D3D3D3D3C3C3C3B3B3B3A3A3A + 3838383737373636363232322C2C2C3434344E4E4E6060605E5E5E5656565353 + 534E4E4E48484845454546464648484847474746464647474747474747474747 + 4747474747474747474747474747474747474747474747474747474747474747 + 4747474747474747474747474747474747474747474747474747474747474747 + 4747474747474747474747474747474747474747474747474747474747474747 + 474746464645454545454544444445404140413D353A39333339332E2541390A + 6151056D5501725A00755E027B63037F6703836A02876E008B70018C72008E7E + 0058440D372C2F313439363C3741404242404641444245454545454546464646 + 4646474747474747464646464646474747474747474747474747474747474747 + 4747474747474747474747474747474747474747474747474747474747474747 + 4747474747474747474747474747474747474747474747474747474747474747 + 4747474747474747474747474747474747474747474747474747474747474747 + 4747474747474747474747474747474747474747474747474747474747474747 + 4747474747474747474747474747474747474747474747474747474746464646 + 464646464645454544444444444447434843444243454548474B423B2A574C12 + 705C04826503806701846B05876D038C71039074059073009176009C7E077E69 + 06463B0F2C2A2933313038353037383C36393E3E3E383E3E3E3E3E3E3E3E3E3E + 3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E + 3E3E3E3E3E3E3E3E3E404040454545434343464646444444454545989898C2C2 + C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF6F6F6 + E0E0E0C2C2C29898984747474343434545454545454343434040403E3E3E3E3E + 3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E + 3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E + 3E3E3E3D3D3D3C3C3C3B3B3B3A3A3A3939393737373636363131312E2E2E3C3C + 3C5858586464645B5B5B5858585252524B4B4B47474747474748484847474746 + 4646474747474747474747474747474747474747474747474747474747474747 + 4747474747474747474747474747474747474747474747474747474747474747 + 4747474747474747474747474747474747474747474747474747474747474747 + 474747474747474748484847474747474746464645454544444446414240413D + 363B3A34343A342F26423A0B6252066E5602755C00785F037D6404826804846C + 02876E008B71008D74008F7F0059450E382D3032353A373D3842414343414742 + 4543454545464646464646474747474747474747474747474747474747474747 + 4747474747474747474747474747474747474747474747474747474747474747 + 4747474747474747474747474747474747474747474747474747474747474747 + 4747474747474747474747474747474747474747474747474747474747474747 + 4747474747474747474747474747474747474747474747474747474747474747 + 4747474747474747474747474747474747474747474747474747474747474747 + 47474848484848484747474747474646464646464646464747474A464B474846 + 484A4A4C4B4F413A29574C12715D05816402816802876C04886E048C71039176 + 049175009476009C7F067E6906463B0F2C2A2933313038353037383C36393E3E + 3E383E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E + 3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3F3F3F4040404545454343434646 + 46454545464646989898C2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFEFEFEF6F6F6E0E0E0C3C3C39898984747474444444646464646 + 464343434040403E3E3E3E3E3E3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F + 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F + 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3E3E3E3E3E3E3C3C3C3B3B3B3B3B3B3535 + 353636363636362E2E2E3030304A4A4A6262626262625D5D5D5757575050504B + 4B4B494949484848474747464646484848484848484848484848484848484848 + 4848484848484848484848484848484848484848484848484848484848484848 + 4848484848484848484848484848484848484848484848484848484848484848 + 4848484848484848484848484848484848484848484848484848474747474747 + 46464645454546414241423E373C3B35353B342F26433B0C6252066E5602755C + 00785F017D6402826903866C028A6F008C72008E73008F7F005A460F382D3032 + 353A373D38424143434147424543464646464646474747484848484848484848 + 4747474747474848484848484848484848484848484848484848484848484848 + 4848484848484848484848484848484848484848484848484848484848484848 + 4848484848484848484848484848484848484848484848484848484848484848 + 4848484848484848484848484848484848484848484848484848484848484848 + 4848484848484848484848484848484848484848484848484848484848484848 + 4848484848484848484848484848474747484848484848484848474747484848 + 4949494B4B4B4E4A4F4C4D4B4C4E4E4B4A4E3C3524564B11735F078164028368 + 00876C048A6E028E71049375049175009477009C7F067F6A07463B0F2C2A2933 + 313038353037383C36393E3E3E383F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F + 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F + 3F404040454545434343464646454545464646999999C2C2C2DFDFDFF6F6F6FD + FDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF6F6F6E0E0E0C3C3C39999 + 994848484444444747474646464444444040403F3F3F3F3F3F3F3F3F3F3F3F3F + 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F + 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3E3E + 3E3D3D3D3C3C3C3C3C3C3636363737373737373131312E2E2E3B3B3B53535364 + 64646262625E5E5E5757575151514C4C4C4A4A4A494949484848484848484848 + 4848484848484848484848484848484848484848484848484848484848484848 + 4848484848484848484848484848484848484848484848484848484848484848 + 4848484848484848484848484848484848484848484848484848484848484848 + 48484848484848484847474746464645454547424341423E373C3B35353B3530 + 27433B0C6353076F5703765D017A60027E6503836A04876D018A6F008D72008F + 74019080005A460F382D3033363B383E39434244444248434644464646474747 + 4747474848484848484848484848484747474848484848484848484848484848 + 4848484848484848484848484848484848484848484848484848484848484848 + 4848484848484848484848484848484848484848484848484848484848484848 + 4848484848484848484848484848484848484848484848484848484848484848 + 4848484848484848484848484848484848484848484848484848484848484848 + 4848484848484848484848484848484848484848484848484848474747484848 + 4949494949494848484949494C4C4C4E4E4E5450555253514F5151464549352E + 1D53480E756109816402836800876D038A6E028D71029376039375009477009E + 7F047F6A07463B0F2C2A2934323139363137383C36393E3E3E383F3F3F3F3F3F + 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F + 3F3F3F3F3F3F3F3F3F3F3F3F3F40404045454543434346464645454546464699 + 9999C2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFE + FEF5F5F5E0E0E0C3C3C39999994848484444444747474646464444444141413F + 3F3F3F3F3F4040404040403F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F + 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F + 3F4040404040403F3F3F3F3F3F3E3E3E3D3D3D3C3C3C3939393A3A3A36363634 + 34343131313030304343436262626565656262625C5C5C5555554F4F4F4B4B4B + 4A4A4A4949494848484848484848484848484848484848484848484848484848 + 4848484848484848484848484848484848484848484848484848484848484848 + 4848484848484848484848484848484848484848484848484848484848484848 + 4848484848484848484949494949494949494848484747474646464646464742 + 4341423E373C3B35353B353027433B0C6353076F5703775D007A600280650383 + 6A04876D018A6F008D72008F75009080005A460F392E3133363B383E39434244 + 4442484346444646464747474848484848484848484848484848484848484848 + 4848484848484848484848484848484848484848484848484848484848484848 + 4848484848484848484848484848484848484848484848484848484848484848 + 4848484848484848484848484848484848484848484848484848484848484848 + 4848484848484848484848484848484848484848484848484848484848484848 + 4848484848484848484848484848484848484848484848484848484848484848 + 4848484848484747474848484949494949494949494B4B4B4E4E4E5050505854 + 595657555052524241452F281751460C77630B836604836800896C038A6E028D + 71029376039274009677009E7F047F6A07473C102C2A2934323139363137383C + 36393E3F3F393F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F + 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F40404045454544 + 4444464646454545464646999999C2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFF + FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFEFEFEF5F5F5DFDFDFC1C1C198989847474744444447 + 47474747474444444141413F3F3F3F3F3F4040404040403F3F3F404040404040 + 4040404040404040404040404040404040404040404040404040404040404040 + 404040404040404040404141414141414040403F3F3F3F3F3F3E3E3E3D3D3D3D + 3D3D3C3C3C3838383737373737373131312D2D2D3939394A4A4A656565686868 + 6161615858585757575050504848484848484949494949494949494949494949 + 494949494A4A4A4B4B4B49494949494949494949494949494949494949494949 + 4949494949494949494949494949494949494949494949494949494949494949 + 4949494949494949494949494949494949494949494A4A4A4A4A4A4A4A4A4949 + 4948484847474747474744424140443F383B3F36353F342E27443B0965550274 + 5B00785F017B6401806A01856E008971008C72008E74029074059E7F0055470D + 2E2E2E36373B433F3A4641424243474549444848484949494949494A4A4A4A4A + 4A4A4A4A4A4A4A49494949494949494949494949494949494949494949494949 + 4949494949494949494949494949494949494949494949494949494949494949 + 4949494949494949494949494949494949494949494949494949494949494949 + 4949494949494949494949494949494949494949494949494949494949494949 + 49494949494949494949494949494949494949494949494949494B4B4B4B4B4B + 4B4B4B4B4B4B4B4B4B4B4B4B4A4A4A4A4A4A4B4B4B4B4B4B4B4B4B4C4C4C4D4D + 4D5151515656565B5B5B56545A5F645B4B504E2F2B37261D14544A0A78650285 + 6702826901866E04886E028C71029176039175009378009D8007816806483B0F + 2D2B2A30333135373136393D38383E413D383E3E3E3F3F3F4040404040404040 + 4040404040404040404040404040404040404040404040404040404040404040 + 4040404040424242474747454545484848464646464646999999C2C2C2DFDFDF + F6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF5F5F5DFDFDFC1 + C1C19898984747474444444747474747474444444141413F3F3F3F3F3F404040 + 4040404040404040404040404040404040404040404040404040404040404040 + 4040404040404040404040404040404040404040404041414141414140404040 + 40403F3F3F3E3E3E3E3E3E3E3E3E3C3C3C3939393838383939393535352F2F2F + 3232323838385959596767676969695F5F5F5959595757575050504949494B4B + 4B4B4B4B4A4A4A4A4A4A4A4A4A4A4A4A4B4B4B4B4B4B4A4A4A4A4A4A4A4A4A4A + 4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A + 4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A + 4A4A4A4A4A4A4A4A4A4A49494948484848484847474745434240443F393C4036 + 353F342E27453C0A655502755C007960027C6502806A01856E008971008C7200 + 8F74029075039E7F0055470D2F2F2F36373B433F3A4742434243474549444848 + 484949494A4A4A4A4A4A4B4B4B4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A + 4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A + 4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A + 4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A + 4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A + 4A4A4A4A4A4A4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4A4A4A4A4A4A4949 + 494949494A4A4A4C4C4C5050505555555A5A5A5E5E5E605E64545950393E3C2A + 2632281F16544A0A786502856702826901866E04886E028C7102917603917500 + 9378009D8007816806483B0F2D2B2A30333136383236393D39393F413D383E3E + 3E3F3F3F40404040404041414140404040404040404040404040404040404040 + 4040404040404040404040404040404040424242474747454545484848464646 + 464646999999C2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFEFEFEF5F5F5DFDFDFC2C2C2989898474747444444474747474747454545 + 4141414040404040404040404040404040404040404040404040404040404040 + 4040404040404040404040404040404040404040404040404040404040404040 + 40404141414141414141414040404040403F3F3F3F3F3F3E3E3E3D3D3D3C3C3C + 3A3A3A3A3A3A3838383535353030302D2D2D4343435D5D5D7070706969695B5B + 5B5A5A5A5757574C4C4C4C4C4C4C4C4C4C4C4C4B4B4B4B4B4B4B4B4B4B4B4B4B + 4B4B4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A + 4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A + 4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4B4B4B4A4A4A4A4A4A49494948484848 + 4848464443414540393C4036353F352F28453C0A665603765D007960027D6402 + 816B02866F018971008D74008F74029176049E7F0055470D2F2F2F37383C433F + 3A474243424347464A454949494949494A4A4A4B4B4B4B4B4B4B4B4B4B4B4B4A + 4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A + 4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A + 4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A + 4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A + 4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4B4B4B4B4B4B4B4B4B4B4B4B4B4B + 4B4B4B4B4B4B4B4B4B4B4949494A4A4A4C4C4C4F4F4F5555555B5B5B5F5F5F61 + 6161656369444940262B2925212D2A2118544A0A786502856702826901866E04 + 886E028C71029176039175009378009D8007816806483B0F2D2B2A3134323638 + 32373A3E39393F423E393F3F3F3F3F3F40404041414141414141414141414140 + 4040404040404040404040404040404040404040404040404040404040424242 + 474747454545484848464646464646999999C2C2C2DFDFDFF6F6F6FDFDFDFFFF + FFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF6F6F6DFDFDFC2C2C2989898474747 + 4545454848484848484545454242424040404040404141414141414141414141 + 4141414141414141414141414141414141414141414141414141414141414141 + 4141414141414141414141414141424242414141414141414141404040404040 + 4040404040403F3F3F4040403D3D3D3939393939393A3A3A3737373232323030 + 304848486767676F6F6F6161615A5A5A5959595252524E4E4E4C4C4C4B4B4B4B + 4B4B4C4C4C4C4C4C4C4C4C4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B + 4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B + 4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B + 4B4B4B4B4B4A4A4A4949494848484745444246413A3D41373640352F28463D0B + 675704775E007B62027E6602846C028971018C73008F74019075029476059F80 + 0056480E2F2F2F37383C44403B484344434448464A454A4A4A4A4A4A4B4B4B4C + 4C4C4C4C4C4C4C4C4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B + 4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B + 4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B + 4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B + 4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B + 4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4C4C4C4C4C4C4C4C4C4E4E4E4F4F4F53 + 53535A5A5A62626263636361616157555B3439301E232126222E2B2219544A0A + 786502856702826901866E04886E028C71029176039175009378009D80078168 + 06483B0F2D2B2A313432363832373A3E3A3A40433F3A3F3F3F40404041414141 + 4141424242414141414141414141414141414141414141414141414141414141 + 414141414141414141424242484848464646484848474747474747999999C2C2 + C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF6F6F6 + E0E0E0C2C2C29898984848484545454848484848484646464343434141414141 + 4141414141414141414141414141414141414141414141414141414141414141 + 4141414141414141414141414141414141414141414141414141424242424242 + 4242424141414141414141414141414141413E3E3E4141414141413A3A3A3838 + 383A3A3A3A3A3A3636362F2F2F3535354F4F4F6A6A6A6C6C6C6363635D5D5D59 + 59595050504E4E4E4B4B4B4B4B4B4C4C4C4D4D4D4D4D4D4C4C4C4C4C4C4C4C4C + 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C + 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C + 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4B4B4B4A4A4A494949484645434742 + 3A3D41373640352F28463D0B685805785F017C6303816703856D038971018D74 + 008F75009376039477049F800056480E30303038393D44403B48434443444847 + 4B464B4B4B4B4B4B4C4C4C4C4C4C4D4D4D4D4D4D4C4C4C4C4C4C4C4C4C4C4C4C + 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C + 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C + 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C + 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C + 4C4C4C4C4C4C4C4C4C4C4B4B4B4B4B4B4B4B4B4C4C4C4C4C4C4D4D4D4D4D4D4D + 4D4D4E4E4E5151515353535858586161616868686565655E5E5E3E3C422B3027 + 2328262C28342B2219534909786502856702826901866E04886E028C71029176 + 039175009378009D8007816806483B0F2D2B2A313432373933383B3F3B3B4143 + 3F3A404040404040414141424242424242424242424242414141414141414141 + 4141414141414141414141414141414141414141414242424848484646464949 + 49474747474747999999C2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF6F6F6E0E0E0C2C2C29999994848484545454848484949 + 4946464643434341414141414142424242424242424242424242424242424242 + 4242424242424242424242424242424242424242424242424242424242424242 + 4242424242424242424242424242424242424242424242424242424242423B3B + 3B4141414343433E3E3E3939393737373636363434343838382E2E2E38383858 + 58586F6F6F6F6F6F6565655E5E5E5656565252524E4E4E4C4C4C4D4D4D4E4E4E + 4E4E4E4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D + 4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D + 4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4C4C4C4B4B4B + 4A4A4A4A4A4A4947464448433B3E42373640363029473E0C6959067960027F64 + 02816802876D018C72008F7500927600947802977805A0810057490F31313138 + 393D45413C494445444549474B464B4B4B4C4C4C4D4D4D4D4D4D4D4D4D4D4D4D + 4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D + 4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D + 4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D + 4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D + 4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4C4C4C4C4C4C4C4C4C4D + 4D4D4D4D4D4E4E4E4E4E4E4F4F4F4F4F4F5454545959596060606868686B6B6B + 6060605252522C2A302A2F26292E2C2E2A362C231A5349097764018567028269 + 01866E04886E028C71029176039175009378009D8007806705483B0F2D2B2A31 + 3432373933383B3F3B3B4144403B404040414141424242424242434343424242 + 4242424242424242424242424242424242424242424242424242424242424141 + 414343434848484646464949494747474747479A9A9AC2C2C2DFDFDFF6F6F6FD + FDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6E0E0E0C3C3C39999 + 9948484845454548484849494947474743434342424242424242424242424242 + 4242424242424242424242424242424242424242424242424242424242424242 + 4242424242424242424242424242424242424242424242424343434343434343 + 434343434343434343433F3F3F4141414242423F3F3F3C3C3C3A3A3A37373736 + 36363A3A3A3232322F2F2F4141415F5F5F7070706C6C6C6464646060605A5A5A + 5252524E4E4E4E4E4E4E4E4E4E4E4E4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D + 4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D + 4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D + 4E4E4E4D4D4D4D4D4D4C4C4C4B4B4B4A4A4A4A48474549443B3E423837413630 + 29473E0C6A5A077A61037F6402826903886E028D73018F750093780096780298 + 7A04A0810057490F313131393A3E45413C494445444549484C474C4C4C4C4C4C + 4D4D4D4E4E4E4E4E4E4E4E4E4E4E4E4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D + 4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D + 4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D + 4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D + 4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D + 4D4D4D4D4D4D4D4D4D4D4D4E4E4E4F4F4F4F4F4F5050505050505353535A5A5A + 6161616868686D6D6D6767675151513A3A3A2B292F2D3229292E2C2B27332E25 + 1C554B0B766300856702826901866E04886E028C71029176039175009378009D + 8007806705483B0F2D2B2A313432373933383B3F3C3C4245413C414141414141 + 4242424343434343434343434343434242424242424242424242424242424242 + 424242424242424242424141414343434848484646464949494747474747479A + 9A9AC2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF6F6F6E0E0E0C3C3C399999948484845454549494949494947474744444442 + 4242424242434343434343424242424242424242424242424242424242424242 + 4242424242424242424242424242424242424242424242424242424242424343 + 434343434343434343434343434343434444444444444545454242423F3F3F3F + 3F3F3F3F3F3E3E3E3D3D3D3D3D3D3434343939393131313030304B4B4B686868 + 6E6E6E6969696767676060605656565050504F4F4F4F4F4F4E4E4E4D4D4D4E4E + 4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E + 4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E + 4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4D4D4D4C4C4C4B4B4B4B4B4B4B49 + 484549443C3F43383741363029483F0D6A5A077B62047F6402846803886E028D + 7301907600937800977903987A04A0810057490F313131393A3E45413C494445 + 444549484C474C4C4C4D4D4D4D4D4D4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E + 4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E + 4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E + 4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E + 4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E + 4E4E4E4E4E4E4E4E4E4E4E4E4E4E4D4D4D4D4D4D4E4E4E4F4F4F4F4F4F505050 + 5151515151515858586161616969696E6E6E6E6E6E626262424242252525312F + 3530352C252A2827232F2F261D564C0C746100856702826901866E04886E028C + 71029176039175009378009D8007806705483B0F2D2B2A313432373933393C40 + 3C3C4245413C4141414242424242424343434343434343434343434242424242 + 4242424242424242424242424242424242424242424242424243434348484847 + 47474949494747474848489A9A9AC2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFF + FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5DEDEDEC1C1C19999994A4A4A4747474A + 4A4A484848464646444444434343434343434343434343424242434343434343 + 4343434343434343434343434343434343434343434343434343434343434343 + 4343434343434343434343434343434343434343434343434343434343434343 + 43434343434343434343434242424040403F3F3F3D3D3D3D3D3D393939353535 + 3838383232323131314F4F4F6E6E6E7171716A6A6A6767675D5D5D5656565454 + 544D4D4D4B4B4B5252524D4D4D4D4D4D4E4E4E4E4E4E4E4E4E4E4E4E4F4F4F4F + 4F4F4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E + 4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E + 4E4D4D4D4C4C4C4B4B4B4C4A4945454B3E414538393D3A312D453A067565057F + 6304816A00846D008970028E7304917603927802967B03977C03A881005C4A0F + 303331373C3F43433D49474746464C4B4C4A4D4D4D4D4D4D4E4E4E4E4E4E4F4F + 4F4F4F4F4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E + 4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E + 4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E + 4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E + 4E4E4D4D4D4D4D4D4E4E4E4E4E4E4F4F4F4F4F4F4E4E4E4E4E4E4B4B4B4C4C4C + 4E4E4E4E4E4E4E4E4E5050505454545858586666666666666C6C6C7373736464 + 644040402B2B2B3333333333333135302D3132302E342E271854490D76620385 + 6900826A00866F02886F018C71029075039074009176009C7E077C67044B3A0F + 322D2C2F3835343C353D3C40403C4243433D4141414242424343434343434343 + 4343434343434343434343434343434343434343434343434343434343434343 + 43434545454242424949494949494949494949494A4A4A989898C2C2C2DFDFDF + F6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5DEDEDEC1 + C1C19999994A4A4A4747474A4A4A494949464646444444434343434343444444 + 4343434343434444444444444444444444444444444444444444444444444444 + 4444444444444444444444444444444444444444444444444444444444444444 + 44444444444444444444444444444343434343434343434242424141413F3F3F + 3E3E3E3D3D3D3C3C3C3939393838383636363232323A3A3A5555557070707474 + 746B6B6B6565655E5E5E5454545151515151514C4C4C4E4E4E4E4E4E4F4F4F4F + 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E + 4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E + 4E4E4E4E4F4F4F4E4E4E4E4E4E4D4D4D4C4C4C4B4B4B4C4A4945454B3E414538 + 393D3A312D453A067666067F6402816A00846D008A71038F7503917603947802 + 967B03997C03A881005C4A0F303331373C3F44443E49474746464C4C4D4B4D4D + 4D4D4D4D4E4E4E4F4F4F4F4F4F4F4F4F4F4F4F4E4E4E4E4E4E4E4E4E4E4E4E4E + 4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E + 4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E + 4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E + 4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4F4F4F4F4F4F4F4F4F + 4E4E4E4E4E4E5252524F4F4F4E4E4E4E4E4E5151515555555A5A5A5F5F5F6363 + 636C6C6C7777776B6B6B4949493030302E2E2E3333333434343236312D313230 + 2E342E271854490D766203856900826A00866F02886F018C7102907503907400 + 9176009C7E077C67044B3A0F322D2C2F3835343C353D3C40403C4243433D4141 + 4142424243434343434344444443434343434343434344444444444444444444 + 4444444444444444444444444444454545424242494949494949494949494949 + 4A4A4A989898C2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFF5F5F5DEDEDEC1C1C19999994A4A4A4747474A4A4A494949474747 + 4444444343434444444444444444444343434444444444444444444444444444 + 4444444444444444444444444444444444444444444444444444444444444444 + 4444444444444444444444444444444444444444444444444444444444444444 + 4444444343434242424040403F3F3F3E3E3E3C3C3C3D3D3D3939393838383636 + 362C2C2C3A3A3A5D5D5D7878787070706C6C6C6868685C5C5C5454545252524F + 4F4F5050505050505050505050505050504F4F4F4F4F4F4E4E4E4F4F4F4F4F4F + 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F + 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4E4E4E4E4E4E4D4D4D4C + 4C4C4C4A4945464A3E4243393A3E3B322E463C06776706806503826B00876E00 + 8B73038F7503927704957A02987B02997C03A881005C4A0F303331373C3F4444 + 3E49474747474D4C4D4B4D4D4D4E4E4E4F4F4F4F4F4F5050504F4F4F4F4F4F4F + 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F + 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F + 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F + 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F505050505050 + 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F5252524E4E4E4D4D4D5151515757 + 575D5D5D6363636969696D6D6D7474747070705252523232322C2C2C34343435 + 35353535353337322E3233312F352F281954490D766203856900826A00866F02 + 886F018C71029075039074009176009C7E077C67044B3A0F322D2C2F3835343C + 353D3C40403C4243433D42424242424243434344444444444444444444444443 + 4343444444444444444444444444444444444444444444444444454545434343 + 4949494949494949494949494A4A4A989898C2C2C2DFDFDFF6F6F6FDFDFDFFFF + FFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5DEDEDEC1C1C19999994A4A4A + 4747474A4A4A4949494747474545454444444444444545454444444444444444 + 4444444444444444444444444444444444444444444444444444444444444444 + 4444444444444444444444444444444444444444444444444444444444444444 + 4444444444444444444444444444444444444343434242424040404040403B3B + 3B3F3F3F3A3A3A3838383B3B3B3131312F2F2F3F3F3F6262627070707676766F + 6F6F6767675D5D5D5656565757575151515050504F4F4F505050505050505050 + 5050504F4F4F5050505050505050505050505050505050505050505050505050 + 5050505050505050505050505050505050505050505050505050505050505050 + 50504F4F4F4E4E4E4D4D4D4D4D4D4D4C4845464A3F43443A3C3D3C342D473D07 + 786807816604856B00886F018E7304917604927802957A02997C039A7E02A982 + 015D4B10313432383D4045453F4A484847474D4D4E4C4E4E4E4F4F4F4F4F4F50 + 5050505050505050505050505050505050505050505050505050505050505050 + 5050505050505050505050505050505050505050505050505050505050505050 + 5050505050505050505050505050505050505050505050505050505050505050 + 5050505050505050505050505050505050505050505050505050505050505050 + 5050505050505151515151515050505050505050505050505050505050505050 + 504F4F4F5151515757575D5D5D6262626868686E6E6E7B7B7B6F6F6F51515135 + 35353030303737373838383838383636363438333034353230362F281954490D + 766203856900826A00866F02886F018C71029075039074009176009C7E077C67 + 044C3B10332E2D303936343C353E3D41413D4343433D42424243434344444444 + 4444454545444444444444444444444444444444444444444444444444444444 + 4444444444444646464343434A4A4A4949494949494949494A4A4A999999C2C2 + C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5 + DEDEDEC1C1C19999994A4A4A4747474A4A4A4A4A4A4848484545454444444545 + 4545454545454544444445454545454545454545454545454545454545454545 + 4545454545454545454545454545454545454545454545454545454545454545 + 4545454545454545454545454545454545454545454545454545454545454444 + 444343434242424141413D3D3D3E3E3E3B3B3B3A3A3A3B3B3B38383832323231 + 31313C3C3C6161617878787676767070706B6B6B6161615B5B5B535353515151 + 5050504F4F4F5151515252525151515050505050505050505050505050505050 + 5050505050505050505050505050505050505050505050505050505050505050 + 50505050505151515151515151515050504F4F4F4E4E4E4E4E4E4D4C48464849 + 3F44433A3C3D3D352E483F06796A06836905876E008971018F75039277049579 + 03987B029B7C019C7D02A982015D4B10313432383D4045453F4A484848484E4D + 4E4C4F4F4F505050505050515151515151515151515151505050505050505050 + 5050505050505050505050505050505050505050505050505050505050505050 + 5050505050505050505050505050505050505050505050505050505050505050 + 5050505050505050505050505050505050505050505050505050505050505050 + 5050505050505050505050505050505050505252525252525151515050505050 + 505151515252525252525252525454545959595D5D5D62626269696970707074 + 74747171715656563535352C2C2C3737373C3C3C3939393A3A3A383838363A35 + 31353633313730291A554A0E766203856900826A00866F02886F018C71029075 + 039074009176009C7E077D68054C3B10332E2D303936353D363E3D41413D4343 + 433D434343434343444444454545454545454545454545444444454545454545 + 4545454545454545454545454545454545454646464343434A4A4A4949494A4A + 4A4949494B4B4B999999C2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF5F5F5DEDEDEC1C1C19999994A4A4A4747474A4A4A4B4B + 4B48484846464645454545454546464645454545454546464646464646464646 + 4646464646464646464646464646464646464646464646464646464646464646 + 4646464646464646464646464646464646464646464646464646464646464646 + 464646464646464646464545454444444343434343434343433D3D3D3D3D3D3E + 3E3E3939393737373838383737372C2C2C4141416363637979797777776F6F6F + 6969696262625A5A5A5757575353535151515252525353535252525151515151 + 5151515151515151515151515151515151515151515151515151515151515151 + 5151515151515151515151515151515151515151515151515151515151505050 + 4F4F4F4E4E4E4D4D474648494045443B3D3D3E362F4940077A6B07846A068A6F + 018C7102917604937805967B03987B029B7C019C7E01AA83025E4C1132353339 + 3E414646404B494948484E4E4F4D505050505050515151525252525252525252 + 5252525151515151515151515151515151515151515151515151515151515151 + 5151515151515151515151515151515151515151515151515151515151515151 + 5151515151515151515151515151515151515151515151515151515151515151 + 5151515151515151515151515151515151515151515151515151515151515353 + 535252525151515151515151515252525454545555555252525959595E5E5E62 + 62626B6B6B7575757878787676765151513939392F2F2F373737393939363636 + 3838383B3B3B3A3A3A373B36323637343238312A1B554A0E766203856900826A + 00866F02886F018C71029075039074009176009C7E077D68054C3B10332E2D30 + 3936353D363E3D41413D4344443E434343444444454545454545464646454545 + 4545454545454646464646464646464646464646464646464646464646464646 + 464343434A4A4A4A4A4A4A4A4A4A4A4A4B4B4B999999C2C2C2DFDFDFF6F6F6FD + FDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5DEDEDEC1C1C19999 + 994A4A4A4747474A4A4A4B4B4B49494946464645454546464646464646464645 + 4545464646464646464646464646464646464646464646464646464646464646 + 4646464646464646464646464646464646464646464646464646464646464646 + 4646464646464646464646464646464646464646464646464645454544444444 + 44444646464040404040404141413B3B3B3838383A3A3A3C3C3C3434342F2F2F + 4141416161617272727373737070706C6C6C6565655F5F5F5858585454545454 + 5454545453535352525252525252525252525252525252525252525252525252 + 5252525252525252525252525252525252525252525252525252525252525252 + 5252525252525151515050505050504F4F4F4D4D474648494045443B3D3D3E37 + 2E4A41087B6D07856C068B70018D7203927705957903987A039B7C039C7D029F + 7F02AA83025E4C11323533393E414646404B494948484E4E4F4D505050515151 + 5252525252525353535252525252525252525252525252525252525252525252 + 5252525252525252525252525252525252525252525252525252525252525252 + 5252525252525252525252525252525252525252525252525252525252525252 + 5252525252525252525252525252525252525252525252525252525252525252 + 5252525252525252525253535352525251515151515152525254545456565657 + 57575656566060606666666A6A6A7575757C7C7C6F6F6F5A5A5A383838313131 + 3535353D3D3D3A3A3A3737373A3A3A3C3C3C3B3B3B393D38333738343238312A + 1B554A0E766203856900826A00866F02886F018C71029075039074009176009C + 7E077D68054C3B10332E2D303936353D363E3D41413D4344443E444444444444 + 4545454646464646464646464646464545454646464646464646464646464646 + 464646464646464646464646464444444A4A4A4A4A4A4A4A4A4A4A4A4B4B4B99 + 9999C2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF5F5F5DEDEDEC1C1C19999994A4A4A4747474A4A4A4B4B4B49494946464645 + 4545464646464646464646454545464646464646464646464646464646464646 + 4646464646464646464646464646464646464646464646464646464646464646 + 4646464646464646464646464646464646464646464646464646464647474747 + 47474747474646464545454545454545454444444242424141413F3F3F3E3E3E + 3B3B3B3838383C3C3C3434342D2D2D3D3D3D6464647C7C7C7979797070706C6C + 6C6565655C5C5C57575755555555555554545452525252525252525252525252 + 5252525252525252525252525252525252525252525252525252525252525252 + 5252525252525252525252525252525252525252525151515050504F4F4F4E4E + 484749494146443C3E3E3F382F4B43087C6E08856C068B70018E740292770496 + 7A04987A039B7C019E7E019F7F02AA83025F4D12323533393E414646404B4949 + 49494F4E4F4D5151515151515252525353535353535353535252525252525252 + 5252525252525252525252525252525252525252525252525252525252525252 + 5252525252525252525252525252525252525252525252525252525252525252 + 5252525252525252525252525252525252525252525252525252525252525252 + 5252525252525252525252525252525252525252525252525252525251515151 + 51515252525555555757575858586161616B6B6B7171717373737A7A7A787878 + 5757573030303232323838383838383939393F3F3F4040403C3C3C3D3D3D3C3C + 3C393D38343839353339312A1B554A0E766203856900826A00866F02886F018C + 71029075039074009176009C7E077D68054C3B10332E2D303936353D363F3E42 + 423E4444443E4444444545454545454646464646464646464646464545454646 + 464646464646464646464646464646464646464646464646464444444A4A4A4A + 4A4A4A4A4A4A4A4A4B4B4B9A9A9AC2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFF + FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5E0E0E0C3C3C39898984D4D4D4D4D4D4A + 4A4A4B4B4B494949474747464646464646464646464646454545464646464646 + 4646464646464646464646464646464646464646464646464646464646464646 + 4646464646464646464646464646464646464646464646464646464646464646 + 4646464646464646464646464646464646464646464646464646454545444444 + 4444444343434141413F3F3F3E3E3E3D3D3D3737373C3C3C3737373131314040 + 406161617878787C7C7C7373737070706A6A6A61616159595955555554545455 + 5555545454525252515151525252535353535353525252515151535353535353 + 5353535353535353535353535353535353535353535353535353535353535353 + 53525252515151505050524F4A4A494D404548393C413C36314C4107816E058D + 6E018E7200917500947901987B02997C039B7C019C7E019D7F02AA84005F4D10 + 3438333B40414849404D4B4A494A4E4F504E5151515252525252525353535353 + 5353535353535352525253535353535353535353535353535353535353535353 + 5353535353535353535353535353535353535353535353535353535353535353 + 5353535353535353535353535353535353535353535353535353535353535353 + 5353535353535353535353535352525252525252525252525252525252525251 + 51515353535454545555555454545454545757575D5D5D6262626A6A6A6C6C6C + 7878788080807171714F4F4F3636363030303838383A3A3A3C3C3C3E3E3E3F3F + 3F3F3F3F3F3F3F3F3F3F3E3E3E393D3833373836343A322B1C54490D75610286 + 6A00826A00866F02886F018C71029075039074009176009C7E078168064A3D11 + 312F2E3639373B3D373C3F433F3F4548443F4444444545454646464646464646 + 4646464646464646464646464646464646464646464646464646464646464646 + 46464848484545454C4C4C4C4C4C4C4C4C4A4A4A4B4B4B989898C2C2C2DFDFDF + F6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5E0E0E0C3 + C3C39898984D4D4D4D4D4D4A4A4A4C4C4C494949474747464646464646474747 + 4646464646464747474747474747474747474747474747474747474747474747 + 4747474747474747474747474747474747474747474747474747474747474747 + 4747474747474747474747474747474747474747474747474747474747474747 + 4747474747474545454545454444444343434242424040403E3E3E3D3D3D3C3C + 3C3C3C3C3A3A3A3434343131313C3C3C5959597474747B7B7B7A7A7A7474746A + 6A6A6363636060605A5A5A555555555555545454535353545454555555555555 + 5353535252525353535353535353535353535353535353535353535353535353 + 53535353545454535353535353525252515151515151524F4A4A494D40454839 + 3C413C36314C4107816E058E6F028F7300927600957A02997C03997C039C7D02 + 9D7F029E8003AA84005F4D103438333B40414849404D4B4A4A4B4F4F504E5151 + 5152525252525253535353535353535353535353535353535353535353535353 + 5353535353535353535353535353535353535353535353535353535353535353 + 5353535353535353535353535353535353535353535353535353535353535353 + 5353535353535353535353535353535353535353535354545454545454545454 + 54545454545454545454545353535252525151515353535757575B5B5B606060 + 6868687070707272727E7E7E8282826D6D6D4D4D4D3737373535353A3A3A3939 + 393A3A3A3C3C3C3E3E3E4040404040404040403F3F3F3F3F3F393D3833373836 + 343A322B1C54490D756102866A00826A00866F02886F018C7102907503907400 + 9176009C7E078168064A3D11312F2E3639373B3D373C3F433F3F4548443F4444 + 4445454546464646464647474746464646464646464647474747474747474747 + 47474747474747474747474747474848484646464C4C4C4C4C4C4C4C4C4A4A4A + 4B4B4B989898C2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFF5F5F5E0E0E0C3C3C39898984D4D4D4D4D4D4A4A4A4C4C4C4A4A4A + 4747474646464747474747474747474646464747474747474747474747474747 + 4747474747474747474747474747474747474747474747474747474747474747 + 4747474747474747474747474747474747474747474747474747474747474747 + 4747474747474747474747474747474747474646464545454545454444444343 + 434141414040403F3F3F3E3E3E3939393A3A3A3B3B3B3333332D2D2D3B3B3B52 + 52527B7B7B7C7C7C7B7B7B7676766F6F6F6767676060605C5C5C575757565656 + 5555555555555656565656565454545353535454545454545454545454545454 + 5454545454545454545454545454545454545454545453535352525252525251 + 5151524F4A4A494D404548393C413C36314D4208826F068E6F02907400937701 + 967B03997C039A7D049C7D029D7F029E8003AA84005F4D103438333B40414849 + 404D4B4A4A4B4F4F504E52525252525253535353535354545454545453535353 + 5353545454545454545454545454545454545454545454545454545454545454 + 5454545454545454545454545454545454545454545454545454545454545454 + 5454545454545454545454545454545454545454545454545454545454545454 + 5454545454555555555555555555555555555555555555555555565656535353 + 5656565E5E5E6666666B6B6B7171717676768181817F7F7F6C6C6C4C4C4C3333 + 332F2F2F3737373C3C3C3B3B3B3C3C3C3E3E3E40404041414141414141414140 + 40404040403A3E3934383936343A322B1C54490D756102866A00826A00866F02 + 886F018C71029075039074009277009C7E078168064A3D11312F2E3639373C3E + 383C3F433F3F4549454045454545454546464647474747474747474747474746 + 4646474747474747474747474747474747474747474747474747484848464646 + 4D4D4D4C4C4C4C4C4C4B4B4B4B4B4B999999C2C2C2DFDFDFF6F6F6FDFDFDFFFF + FFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5E0E0E0C3C3C39898984D4D4D + 4D4D4D4A4A4A4C4C4C4A4A4A4848484747474747474848484747474747474747 + 4747474747474747474747474747474747474747474747474747474747474747 + 4747474747474747474747474747474747474747474747474747474747474747 + 4747474747474747474747474747474747474747474747474747474747474646 + 464646464646464545454444444343434141414040403D3D3D3B3B3B3B3B3B3E + 3E3E3C3C3C3737373434343535354F4F4F7171718686867C7C7C717171737373 + 6E6E6E5F5F5F5C5C5C5959595656565555555555555555555454545353535454 + 5454545454545454545454545454545454545454545454545454545455555554 + 545454545453535352525251515153504B4B4A4E4146493A3D423D37324D4208 + 826F068F7003917500947802967B039A7D049A7D049D7E039D7F029E8003AA84 + 005F4D103438333B4041494A414E4C4B4B4C5050514F52525253535353535354 + 5454545454545454545454545454545454545454545454545454545454545454 + 5454545454545454545454545454545454545454545454545454545454545454 + 5454545454545454545454545454545454545454545454545454545454545454 + 5454545454545454545454545454545454555555565656555555555555545454 + 5454545555555757575A5A5A5F5F5F6464646B6B6B7373737A7A7A7E7E7E7D7D + 7D6161614343433434343434343737373939393B3B3B3D3D3D3E3E3E40404042 + 42424343434343434242424242424141413B3F3A35393A37353B332C1D54490D + 756102866A00836B01866F028970028C71029075039074009277009D7F088067 + 054A3D11312F2E373A383C3E383D40444040464A464145454546464647474747 + 4747484848474747474747474747474747474747474747474747474747474747 + 4747474747474949494646464D4D4D4C4C4C4C4C4C4B4B4B4B4B4B999999C2C2 + C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5 + E0E0E0C3C3C39898984D4D4D4D4D4D4A4A4A4D4D4D4B4B4B4848484747474848 + 4848484848484847474748484848484848484848484848484848484848484848 + 4848484848484848484848484848484848484848484848484848484848484848 + 4848484848484848484848484848484848484848484848484848484848484848 + 4848484848484848484847474747474747474747474746464644444443434342 + 42424040404242424040403C3C3C393939393939393939373737303030474747 + 6A6A6A8383838585857878787070707171716464646060605A5A5A5656565454 + 5454545454545454545455555555555555555555555555555555555555555555 + 555555555555555555555555555554545454545453535352525253504B4C4B4F + 4146493A3D423D37324E43098370078F7003927600947802977C049B7E059B7E + 059D7E039D7F029E8003AA84005F4D103438333B4041494A414E4C4B4C4D5151 + 5250535353535353545454555555555555555555545454545454555555555555 + 5555555555555555555555555555555555555555555555555555555555555555 + 5555555555555555555555555555555555555555555555555555555555555555 + 5555555555555555555555555555555555555555555555555555545454555555 + 5656565555555454545454545555555757575959596262626969696C6C6C7474 + 747E7E7E8080807A7A7A5959594141413030303333333A3A3A3A3A3A3B3B3B3F + 3F3F4040404141414242424444444444444444444444444343434242423C403B + 35393A37353B332C1D554A0E756102866A00836B01866F028970028D72039176 + 049175009277009D7F088067054A3D11312F2E373A383C3E383D40444141474A + 4641464646464646474747484848484848484848484848474747484848484848 + 4848484848484848484848484848484848484949494646464D4D4D4D4D4D4C4C + 4C4B4B4B4C4C4C999999C2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF5F5F5E0E0E0C3C3C39898984D4D4D4D4D4D4A4A4A4E4E + 4E4B4B4B49494948484848484849494948484848484849494949494949494949 + 4949494949494949494949494949494949494949494949494949494949494949 + 4949494949494949494949494949494949494949494949494949494949494949 + 4949494949494949494949494949494949494949494948484848484848484848 + 48484747474646464545454444444545454343434141413D3D3D3A3A3A393939 + 3939393A3A3A3636362D2D2D3B3B3B6262627F7F7F8181817C7C7C7C7C7C7070 + 706B6B6B6363635D5D5D5A5A5A58585857575756565655555555555555555555 + 5555555555555555555555555555555555555555565656555555555555545454 + 53535352525254514C4C4B4F42474A3B3E433E38334E43098370079071049276 + 00947802977C049B7E059A7D049C7D029D7F029E8003AA84005F4D103438333C + 4142494A414F4D4C4C4D51525351535353545454545454555555555555555555 + 5555555555555555555555555555555555555555555555555555555555555555 + 5555555555555555555555555555555555555555555555555555555555555555 + 5555555555555555555555555555555555555555555555555555555555555555 + 5555555555555454545656565757575656565555555757575C5C5C6060606767 + 676C6C6C7171717A7A7A8686868484846C6C6C51515138383834343434343439 + 39393D3D3D3D3D3D3D3D3D404040424242434343444444464646464646464646 + 4545454545454343433D413C363A3B38363C342D1E554A0E766203866A00836B + 018770038970028D72039176049175009277009D7F088067054A3D11312F2E37 + 3A383D3F393E41454141474B4742464646474747484848484848494949484848 + 4848484848484949494949494949494949494949494949494949494949494949 + 494747474D4D4D4D4D4D4D4D4D4B4B4B4C4C4C999999C2C2C2DFDFDFF6F6F6FD + FDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5E0E0E0C3C3C39898 + 984D4D4D4D4D4D4A4A4A4E4E4E4C4C4C49494948484849494949494949494948 + 4848494949494949494949494949494949494949494949494949494949494949 + 4949494949494949494949494949494949494949494949494949494949494949 + 4949494949494949494949494949494949494949494949494949494949494949 + 4949494949494949494949494949484848474747464646454545454545434343 + 4141414242424141413E3E3E3A3A3A3838383838383C3C3C3434342F2F2F4C4C + 4C7979798686867777777C7C7C7777777070706969696363635F5F5F5B5B5B59 + 5959565656565656565656565656565656565656565656565656565656565656 + 56565656565655555554545453535353535354514C4C4B4F42474A3B3E433E38 + 334F440A847108907104927600947802977C049A7D049A7D049C7D029C7E019D + 7F02A983005E4C0F3438333C41424A4B424F4D4C4D4E52525351545454545454 + 5555555555555656565656565555555555555656565656565656565656565656 + 5656565656565656565656565656565656565656565656565656565656565656 + 5656565656565656565656565656565656565656565656565656565656565656 + 5656565656565656565656565656565656565656565757575959595959595A5A + 5A5F5F5F6767676D6D6D7575757777777C7C7C8181817D7D7D68686849494931 + 31313434343636363A3A3A3D3D3D3F3F3F404040414141414141444444444444 + 4646464747474747474747474646464646464343433E423D373B3C39373D342D + 1E554A0E766203866A00836B018770038970028D72039176049175009378009D + 7F08806705493C10312F2E373A383D3F393E41454242484C4843474747474747 + 4848484949494949494949494949494848484949494949494949494949494949 + 494949494949494949494949494747474E4E4E4D4D4D4D4D4D4C4C4C4C4C4C9A + 9A9AC2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF5F5F5E0E0E0C3C3C39898984D4D4D4D4D4D4A4A4A4E4E4E4C4C4C49494948 + 4848494949494949494949484848494949494949494949494949494949494949 + 4949494949494949494949494949494949494949494949494949494949494949 + 4949494949494949494949494949494949494949494949494949494949494949 + 4949494949494949494949494949494949494949494949494949494949484848 + 4747474646464242424646464747474242424040404040404040403D3D3D3C3C + 3C3C3C3C3939393333333333334444446868688888888383837F7F7F79797972 + 72726B6B6B6565655F5F5F5B5B5B565656565656565656565656565656565656 + 5656565656565656565656565656565656565656565555555454545353535451 + 4C4D4C5042474A3C3F443E38334F440A847108907104927600947802977C049A + 7D049A7D049B7C019C7E019C7E01A983005E4C0F3438333C41424A4B424F4D4C + 4D4E525253515454545454545555555656565656565656565555555555555656 + 5656565656565656565656565656565656565656565656565656565656565656 + 5656565656565656565656565656565656565656565656565656565656565656 + 5656565656565656565656565656565656565656565656565656565656565757 + 575959595B5B5B5C5C5C5F5F5F6666667070707777777878787F7F7F8686867D + 7D7D5C5C5C3A3A3A3232323C3C3C3C3C3C3C3C3C3D3D3D3F3F3F3F3F3F3F3F3F + 4343434848484444444545454747474848484848484848484747474646464444 + 443E423D373B3C39373D342D1E554A0E766203866A00846C028770038970028D + 72039176049175009378009D7F08806705493C10312F2E373A383D3F393E4145 + 4242484C48434747474848484848484949494949494949494949494848484949 + 494949494949494949494949494949494949494949494949494747474E4E4E4D + 4D4D4D4D4D4C4C4C4C4C4C9A9A9AC2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFF + FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5E0E0E0C3C3C39999994E4E4E4F4F4F4D + 4D4D4E4E4E4C4C4C4949494949494949494A4A4A4A4A4A494949494949494949 + 4949494949494949494949494949494949494949494949494949494949494949 + 4949494949494949494949494949494949494949494949494949494949494949 + 4949494949494949494949494949494949494949494949494949494949494949 + 4949494949494949494949494949494949494747474747474747474646464444 + 444343434141414040403D3D3D3B3B3B3737373939393838383333333E3E3E56 + 56568585858484848282827F7F7F7979797373736D6D6D6A6A6A6060605A5A5A + 5656565757575858585656565555555757575757575656565555555656565757 + 57585858585858575757534E4F4C4C4C4249463D3C4641383552460487750295 + 7105947403967802977A01997D019A7E019A7E029A7D049A7C05A081005A4C12 + 3636363F40444E4A455550515051555155505555555555555656565757575757 + 5757575756565656565657575757575757575757575757575757575757575757 + 5757585858585858585858585858585858585858585858585858575757575757 + 5757575757575757575757575656565656565656565858585757575454545555 + 555959595A5A5A5757575959595C5C5C5F5F5F6363636D6D6D7979797F7F7F7F + 7F7F8686868686867272724E4E4E3737373737373A3A3A3636363D3D3D3D3D3D + 3E3E3E4040404242424343434444444545454545454646464747474848484949 + 494848484747474646464141474341393C3B3734353F322C215C4C097C650084 + 6C02856E018A71038C71028E74029278029277009679009E8206816A044B3E10 + 32302F383B393E403A3F424742414A4C47444747474848484949494949494949 + 4949494949494949494949494949494949494949494949494949494949494949 + 49494B4B4B4949494F4F4F4C4C4C4D4D4D4E4E4E4E4E4E989898C2C2C2DFDFDF + F6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5E0E0E0C3 + C3C39999994E4E4E4F4F4F4D4D4D4E4E4E4C4C4C4A4A4A4949494949494A4A4A + 4A4A4A4949494A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A + 4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A + 4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A + 4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4848 + 484848484747474747474545454444444242424242424444444242423E3E3E3E + 3E3E3D3D3D3434343434344040404444446868688686868787877F7F7F7C7C7C + 7777776E6E6E6868686363635F5F5F5F5F5F5E5E5E5A5A5A5757575656565858 + 585757575656565656565757575656565454545252525550514E4E4E434A473F + 3E48413835534705877502957105957504967704987A03997D019A7E019A7E02 + 9A7C05997B059F80005A4C123737373F40444E4A455550515051555155505555 + 5555555556565657575757575757575757575756565657575757575757575757 + 5757575757575757575757575757575757575757575757575757575757575757 + 5757575757575656565656565656565757575757575757575656565656565454 + 545858585A5A5A5959595757575858585959595959595E5E5E69696973737376 + 76767676767B7B7B8282828787877B7B7B5E5E5E3F3F3F3232323535353A3A3A + 3B3B3B3B3B3B3E3E3E3F3F3F4040404141414343434444444545454646464646 + 4647474748484849494949494948484847474747474742424844423A3D3C3834 + 353F322C215C4C097D6600856D03876E008A71038C71028F7402947802927700 + 967900A08106816A044B3E1032302F383B393E403A3F424743424B4C47444747 + 474848484949494949494A4A4A4949494949494949494A4A4A4A4A4A4A4A4A4A + 4A4A4A4A4A4A4A4A4A4A4A4A4A4A4B4B4B4949494F4F4F4D4D4D4D4D4D4E4E4E + 4E4E4E989898C2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFF5F5F5E0E0E0C3C3C39999994E4E4E4F4F4F4D4D4D4E4E4E4C4C4C + 4A4A4A4949494A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A + 4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A + 4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A + 4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A + 4A4A4A4A4A4A4A4A4A4A49494949494949494948484847474746464644444443 + 43434444444242423F3F3F3F3F3F4040403A3A3A3535353636363434343A3A3A + 5252527474748989898989898181817E7E7E7B7B7B7474746A6A6A6363635E5E + 5E5A5A5A5A5A5A5C5C5C59595958585857575757575757575756565654545452 + 52525752534F4F4F444B483F3E48423936534705877502957105957504967704 + 977902997D019A7E029A7E02997B04997B059E7F005A4C123737373F40444E4A + 4555505150515551555055555556565657575757575758585857575757575757 + 5757575757575757575757575757575757575757575757575757575757575757 + 5757575757575757575757575757575757575757575757575757575757575757 + 575757575757575757575C5C5C5B5B5B5B5B5B5B5B5B5B5B5B5D5D5D61616165 + 65657171717171717474747E7E7E8A8A8A8D8D8D828282757575474747383838 + 3131313838383B3B3B3636363636363D3D3D4040404141414242424343434444 + 4446464647474747474747474748484849494949494949494949494948484847 + 474742424844423A3D3C38353640332D225C4C097D6600856D03876E008A7103 + 8D7203907502957903957800967A00A18207816A044B3E10333130383B393E40 + 3A3F424743424B4C47444848484848484949494A4A4A4A4A4A4A4A4A4A4A4A49 + 49494A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4B4B4B494949 + 4F4F4F4D4D4D4D4D4D4F4F4F4E4E4E989898C2C2C2DFDFDFF6F6F6FDFDFDFFFF + FFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5E0E0E0C3C3C39999994E4E4E + 4F4F4F4D4D4D4F4F4F4D4D4D4A4A4A4A4A4A4A4A4A4B4B4B4B4B4B4A4A4A4A4A + 4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A + 4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A + 4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A + 4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A + 4A4A4949494747474646464545454343434242423F3F3F3D3D3D3F3F3F3F3F3F + 3C3C3C3B3B3B3C3C3C3535353131313F3F3F6161618181818C8C8C8787877D7D + 7D7979797575757474747171716B6B6B6262625B5B5B5B5B5B59595958585857 + 57575858585858585757575656565651524E4E4E444B483F3E48413835534705 + 877502957105937506947704957A02967B02977D01977C03967B03967A049D7E + 00594B113737374041454E4A4555505150515552565156565656565657575758 + 5858585858585858585858575757585858585858585858585858585858585858 + 5858585858585757575757575757575757575757575757575757575757575959 + 595959595959595858585858585858585959595959595959595656565757575D + 5D5D6464646B6B6B7171717575757B7B7B7D7D7D828282898989878787737373 + 5252523737373333333333333737373C3C3C3E3E3E3C3C3C3D3D3D4040404343 + 434343434444444545454747474848484949494949494848484949494A4A4A4A + 4A4A4A4A4A49494948484847474742424845433B3D3C38353640332D225D4D0A + 7D6600866E04886F018D72038D7301907502957A02957800997A00A18306826B + 054B3E10333130393C3A3E403A3F424743424B4D48454848484949494A4A4A4A + 4A4A4B4B4B4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A + 4A4A4A4A4A4A4B4B4B4A4A4A5050504D4D4D4E4E4E4F4F4F4E4E4E989898C2C2 + C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5 + E0E0E0C3C3C39999994E4E4E4F4F4F4D4D4D4F4F4F4D4D4D4B4B4B4A4A4A4B4B + 4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B + 4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B + 4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B + 4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B + 4B4B4B4B4B4B4B4B4B4B4B4B4B4B4A4A4A494949484848474747454545454545 + 4545454141413D3D3D3E3E3E3F3F3F3D3D3D3A3A3A3D3D3D3A3A3A3232323535 + 354C4C4C6C6C6C8383838D8D8D8A8A8A8484847F7F7F7A7A7A7474746C6C6C66 + 66666262625F5F5F5B5B5B5858585858585757575757575656565550514D4D4D + 434A473E3D47413835534705867401957105927405937504947802957A01967B + 02967B029579039477049C7D00594B113838384142464E4A4555505150515552 + 5651565656575757585858585858595959585858585858585858595959595959 + 5959595959595959595959595959595959595858585858585858585858585858 + 585858585858585858585959595858585858585757575858585858585959595A + 5A5A5B5B5B5E5E5E6363636A6A6A7070707575757979797B7B7B818181898989 + 8C8C8C7D7D7D5F5F5F4343433535353333333A3A3A3C3C3C3B3B3B3B3B3B3E3E + 3E4343434444444343434545454646464646464747474848484949494A4A4A4A + 4A4A4949494A4A4A4B4B4B4B4B4B4B4B4B4A4A4A48484847474743434945433B + 3E3D39363741342E235E4E0B7E6701866E048A6F008E73048F7402937701987A + 03987900997B00A48407826B054B3E10333130393C3A3F413B40434843424B4D + 48454949494949494A4A4A4B4B4B4B4B4B4B4B4B4B4B4B4A4A4A4B4B4B4B4B4B + 4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4C4C4C4A4A4A5050504D4D4D4E4E + 4E4F4F4F4F4F4F999999C2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF5F5F5E0E0E0C3C3C39999994E4E4E4F4F4F4D4D4D5050 + 504E4E4E4B4B4B4B4B4B4B4B4B4C4C4C4C4C4C4B4B4B4C4C4C4C4C4C4C4C4C4C + 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C + 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C + 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C + 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4B4B4B4C4C4C4C4C4C4C4C4C4B4B4B4A4A4A + 4949494949494444444545454949494848484141414040404141414040403E3E + 3E3A3A3A3D3D3D3F3F3F3636362E2E2E3D3D3D5656567474748383839090908D + 8D8D8181817878787777777979796E6E6E6A6A6A6565656060605C5C5C595959 + 5656565454545651524E4E4E444B483F3E484138355246048674019470048F72 + 05907503917701927901927A009279019177019075029A7B00594B1138383841 + 42464F4B46555051505155535752575757575757585858595959595959595959 + 5959595858585959595959595959595959595959595959595959595959595959 + 5959595959595959595959595959595959595959595958585858585858585858 + 58585A5A5A5C5C5C5F5F5F6060606666666F6F6F7676767979797C7C7C838383 + 8989898D8D8D9090907F7F7F6565654C4C4C3939393232323636363D3D3D3939 + 393D3D3D40404041414140404040404042424245454547474748484848484849 + 49494A4A4A4A4A4A4B4B4B4B4B4B4B4B4B4B4B4B4C4C4C4C4C4C4B4B4B4A4A4A + 49494948484843434946443C3E3D39363741342E235E4E0B7E6701876F058B70 + 018F74028F7401937701987B029879009C7C00A48405826B054C3F1133313039 + 3C3A3F413B40434844434C4D48454949494A4A4A4B4B4B4B4B4B4C4C4C4B4B4B + 4B4B4B4B4B4B4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C + 4C4A4A4A5050504E4E4E4E4E4E4F4F4F4F4F4F999999C2C2C2DFDFDFF6F6F6FD + FDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5E0E0E0C3C3C39999 + 994E4E4E4F4F4F4D4D4D5050504E4E4E4C4C4C4B4B4B4C4C4C4C4C4C4C4C4C4C + 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C + 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C + 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C + 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C + 4C4C4C4C4C4C4C4C4C4B4B4B4A4A4A4949494747474444444848484A4A4A4545 + 454444444646464444443F3F3F4141413E3E3E3939393B3B3B3F3F3F3838382B + 2B2B3333334F4F4F7070708686868C8C8C8A8A8A8585858080807D7D7D7A7A7A + 7474746F6F6F6969696464645E5E5E5B5B5B5B5657535353474E4B41404A4239 + 36534705867401936F038E71048F73049075029178009179009077008F74018F + 7402997A00584A103939394243474F4B46555051515256535752575757585858 + 5959595959595959595959595959595959595959595959595959595959595959 + 595959595959595959595A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A + 5A5A5B5B5B5C5C5C5D5D5D6060606464646868686C6C6C6F6F6F7171717A7A7A + 7F7F7F8181818787878E8E8E8B8B8B8181816060604848483232322E2E2E3737 + 373E3E3E3D3D3D3A3A3A4040403E3E3E3D3D3D3F3F3F43434345454546464647 + 47474848484949494949494A4A4A4A4A4A4B4B4B4C4C4C4C4C4C4B4B4B4C4C4C + 4D4D4D4D4D4D4C4C4C4B4B4B49494948484844444A46443C3F3E3A373842352F + 245E4E0B7F6802876F058C71008F74029275029678019B7C039B7A009C7C00A6 + 8506826B054C3F11343231393C3A3F413B40434844434C4D48454A4A4A4A4A4A + 4B4B4B4C4C4C4C4C4C4C4C4C4C4C4C4B4B4B4C4C4C4C4C4C4C4C4C4C4C4C4C4C + 4C4C4C4C4C4C4C4C4C4C4C4C4C4A4A4A5050504E4E4E4E4E4E5050504F4F4F99 + 9999C2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF5F5F5E0E0E0C3C3C39999994E4E4E4F4F4F4D4D4D5050504E4E4E4C4C4C4B + 4B4B4C4C4C4D4D4D4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C + 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C + 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C + 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C + 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4B4B4B4A4A4A4A4A4A5151 + 514848484747474A4A4A4545454444444646464444444646463F3F3F3D3D3D40 + 40403D3D3D3737373939394040403939393434343636364B4B4B7070708D8D8D + 9292928989898787878484848181817D7D7D7777777171716969696565655F5A + 5B5656564A514E43424C443B38534705857300936F038D70038E72038F740190 + 77009077008F76008E73008E7301997A00584A103939394243474F4B46544F50 + 5152565357525858585858585959595959595A5A5A5A5A5A5959595959595A5A + 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A + 5A5A5A5A5A5A5A5A5A5A5A5A5A5A6060606161616464646868686E6E6E747474 + 7979797D7D7D8383838888888A8A8A8989898C8C8C8484846464644141413333 + 333636363A3A3A3E3E3E3B3B3B3838383C3C3C4343433E3E3E42424244444444 + 44444646464A4A4A4A4A4A4747474949494949494A4A4A4A4A4A4B4B4B4B4B4B + 4C4C4C4C4C4C4C4C4C4C4C4C4D4D4D4D4D4D4C4C4C4B4B4B4949494848484444 + 4A46443C3F3E3A373842352F245F4F0C7F6802876F058C710090750392750296 + 78019B7C039B7B009C7C00A68506836C064C3F11343231393C3A3F413B404348 + 44434C4E49464A4A4A4B4B4B4B4B4B4C4C4C4C4C4C4C4C4C4C4C4C4B4B4B4C4C + 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4B4B4B5050504E + 4E4E4E4E4E5050504F4F4F999999C2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFF + FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5E0E0E0C3C3C39999994F4F4F51515150 + 50505050504F4F4F4E4E4E4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4C4C4C4C4C4C + 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C + 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C + 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C + 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C + 4C4C4C4C4C4C4C4C4C4C4B4B4B4A4A4A4A4A4A49494948484848484847474747 + 47474444444343434242424141413F3F3F3E3E3E3D3D3D3C3C3C3838383B3B3B + 3A3A3A3434343434344848486D6D6D8A8A8A8B8B8B8B8B8B8A8A8A8787878282 + 827D7D7D7878787676766B686363655F565D584A4C54473F3F534A0A8473048F + 6F068E73018E73018F74028E73048E73048A7103897002886F01887404554607 + 423C2F3E4344474C4B5653555551565858585959595656565959595B5B5B5858 + 585A5A5A5D5D5D5A5A5A5A5A5A5B5B5B5C5C5C5C5C5C5A5A5A5A5A5A5B5B5B5C + 5C5C5959595C5C5C5E5E5E6060606161616464646767676B6B6B6A6A6A727272 + 7979797B7B7B7D7D7D8282828787878888888C8C8C8D8D8D8C8C8C7F7F7F6161 + 614141413434343636363939393A3A3A3B3B3B3C3C3C3E3E3E3F3F3F40404041 + 41414545454545454646464747474848484949494A4A4A4A4A4A4C4C4C4C4C4C + 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4B4B + 4B4A4A4A49494949494942464B45463D3F3E3A37384235302161510C836B018C + 73058D7200937603947802987A039C7D049C7C009E7D00A68506836D034C4010 + 3432323A3C3D40413F41434B45454B4F4C444A4A4A4B4B4B4C4C4C4C4C4C4C4C + 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C + 4C4C4C4C4C4E4E4E5050505050505151514E4E4E515151989898C2C2C2DFDFDF + F6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5E0E0E0C3 + C3C39999994F4F4F5151515050505050504F4F4F4E4E4E4E4E4E4D4D4D4D4D4D + 4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D + 4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D + 4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D + 4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D + 4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4B4B4B4B4B4B4B4B4B4A + 4A4A494949494949484848484848464646464646454545434343424242404040 + 3F3F3F3F3F3F3E3E3E3E3E3E3C3C3C3939393636363737373B3B3B3F3F3F6565 + 657676768989899090908B8B8B82828280808081818185827E7476705F66614F + 51594B4343544B0C8372038C6B048C71008D71028D71028D72038C7103897002 + 876D01866C0089750557480A423C2F3C4142424746524F51514D525656565A5A + 5A5858585B5B5B5C5C5C5858585959595A5A5A5656565656565858585A5A5A5B + 5B5B5B5B5B5C5C5C5E5E5E6060606565656565656565656565656767676C6C6C + 7373737979797E7E7E8080808181818282828888888E8E8E8E8E8E8B8B8B8E8E + 8E7373735353533F3F3F3434343131313737373F3F3F3C3C3C3C3C3C3D3D3D3F + 3F3F4040404242424343434343434646464646464747474848484949494A4A4A + 4A4A4A4B4B4B4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C + 4C4C4C4C4C4C4C4C4C4C4B4B4B4B4B4B4A4A4A49494942464B45463D3F3E3A37 + 384235302161510C836B018C73058D7200937603947802987A039D7E039C7C00 + 9E7D00A68506836D034C40103432323A3C3D40413F42444C45454B4F4C444A4A + 4A4B4B4B4C4C4C4C4C4C4D4D4D4C4C4C4C4C4C4C4C4C4D4D4D4D4D4D4D4D4D4D + 4D4D4D4D4D4D4D4D4D4D4D4D4D4D4C4C4C4E4E4E5050505050505151514F4F4F + 515151989898C2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFF5F5F5E0E0E0C3C3C39999994F4F4F515151505050505050505050 + 4F4F4F4E4E4E4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D + 4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D + 4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D + 4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D + 4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D + 4D4D4C4C4C4C4C4C4C4C4C4B4B4B4B4B4B4A4A4A4A4A4A4A4A4A494949484848 + 4747474646464545454444444343434242424141413E3E3E3C3C3C3D3D3D3F3F + 3F3D3D3D3737373232323333333C3C3C4F4F4F6767677E7E7E8B8B8B8D8D8D8B + 8B8B827F7B7778746A716C60626A595151595011817002896801896E008A6F01 + 8A6F01897002886E02856E01836B01826A0084700158480D4B453A484D504D51 + 525C595B5A57595E5E5E5E5E5E5D5D5D60606063636361616162626262626260 + 60606767676666666565656565656666666969696F6F6F727272717171757575 + 7A7A7A7F7F7F8282828383838383838484848888888888888A8A8A9090909595 + 958D8D8D7878786464644141413737373232323636363B3B3B3B3B3B3B3B3B3D + 3D3D3F3F3F404040414141424242444444454545464646464646484848484848 + 4949494949494A4A4A4B4B4B4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C + 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4D4D4D4C4C4C4C4C4C4B4B4B4A4A4A49 + 494942464B45463D403F3B37384236312261510C836B018C73058E7300947704 + 947802987A039D7E039C7C009E7D00A68605836D034D41113432323B3D3E4041 + 3F42444C46464C4F4C444B4B4B4B4B4B4C4C4C4D4D4D4D4D4D4D4D4D4D4D4D4C + 4C4C4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4C4C4C4E4E4E + 5050505151515151514F4F4F515151989898C2C2C2DFDFDFF6F6F6FDFDFDFFFF + FFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5E0E0E0C3C3C39999994F4F4F + 5151515050505050505050504F4F4F4E4E4E4D4D4D4D4D4D4D4D4D4E4E4E4D4D + 4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D + 4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D + 4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D + 4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D + 4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4C4C4C4C4C4C + 4C4C4C4B4B4B4B4B4B4A4A4A4949494848484747474646464545454545454343 + 434141413E3E3E3C3C3C3C3C3C3D3D3D3E3E3E3F3F3F39393937373734343433 + 33333B3B3B4E4E4E6868687A7A7A87848080817D767D7A696A74595151554C0D + 806F018D6C05866C00876D01876D01856D03856D03846B03806A017F69007D67 + 0057460D5049404F5457565A5B6461636360626768666A6A6A6A6A6A6C6C6C6E + 6E6E6E6E6E6F6F6F7070706F6F6F7171717272727474747676767979797B7B7B + 7D7D7D7F7F7F8585858585858484848484848686868989898C8C8C8E8E8E9090 + 909393938E8E8E7A7A7A5C5C5C4545453939393737373535353535353838383C + 3C3C3B3B3B3838383B3B3B404040424242434343444444454545464646474747 + 4848484848484A4A4A4A4A4A4B4B4B4B4B4B4C4C4C4C4C4C4D4D4D4D4D4D4D4D + 4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D + 4D4D4C4C4C4B4B4B4B4B4B4A4A4A43474C45463D403F3B38394336312261510C + 836B018C73058E7300947802957A02997C039D7E039D7D009F7F00A78706836D + 034D41113533333B3D3E41424042444C46464C504D454B4B4B4C4C4C4D4D4D4D + 4D4D4E4E4E4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D + 4D4D4D4D4D4D4D4D4D4E4E4E5151515151515151514F4F4F525252999999C2C2 + C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5 + E0E0E0C3C3C39999994F4F4F5151515050505151515050504F4F4F4E4E4E4E4E + 4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E + 4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E + 4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E + 4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E + 4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E + 4E4E4E4E4E4E4D4D4D4D4D4D4D4D4D4D4D4D4C4C4C4B4B4B4A4A4A4A4A4A4949 + 494848484747474747474444444545454444444242423E3E3E3C3C3C3C3C3C3C + 3C3C3939393C3C3C3F3F3F3D3D3D3838383535353535353737374642414E4F4D + 5A615E61626C5F57585D5317827103886602836B01846C02846B03846B03826B + 05816A047E68027D6602836D04604E195C544D5C60656367687471737573737A + 7B777D7D7D7E7E7E7E7E7E7E7E7E7F7F7F7F7F7F7F7F7F808080838383828282 + 8282828282828484848686868787878888888787878A8A8A8E8E8E9292929292 + 928F8F8F8A8A8A8686866868685454543E3E3E3535353838383D3D3D3D3D3D3A + 3A3A3C3C3C3B3B3B3C3C3C404040434343424242424242434343444444454545 + 4646464646464747474848484949494949494C4C4C4C4C4C4C4C4C4D4D4D4D4D + 4D4D4D4D4E4E4E4E4E4E4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D + 4D4D4D4D4D4D4D4D4E4E4E4D4D4D4D4D4D4C4C4C4B4B4B4A4A4A43474C46473E + 403F3B38394336312262520D846C028C73058F7401957903957A02997C039E80 + 039D7D009F7F00A78705846E044D41113533333B3D3E41424042444C46464C50 + 4D454C4C4C4C4C4C4D4D4D4E4E4E4E4E4E4E4E4E4E4E4E4D4D4D4E4E4E4E4E4E + 4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4D4D4D4F4F4F5151515151515252 + 524F4F4F525252999999C2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF5F5F5E0E0E0C3C3C39999994F4F4F5151515050505151 + 515050504F4F4F4F4F4F4E4E4E4E4E4E4E4E4E4E4E4E4F4F4F4F4F4F4F4F4F4F + 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F + 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F + 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F + 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F + 4F4F4F4F4F4F4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4D4D + 4D4C4C4C4C4C4C4B4B4B4A4A4A49494949494948484846464646464646464647 + 47474747474646464343434040404242423C3C3C3636363636363B3B3B3C3C3C + 38383833333337333230312F29302D292935342C2D4A4004816F048D6B078168 + 028069038069038068047F68047E67047A65027964017860005C49165F565265 + 6870707475827F81817F7F8384808484848686868686868787878B8B8B8B8B8B + 8A8A8A8D8D8D8989898A8A8A8C8C8C8E8E8E9090909191918F8F8F8E8E8E9696 + 969494948E8E8E83838370707057575740404031313139393937373736363636 + 36363636363737373A3A3A3E3E3E4141413E3E3E3E3E3E404040424242434343 + 4343434343434747474747474747474848484949494A4A4A4A4A4A4B4B4B4D4D + 4D4D4D4D4D4D4D4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E + 4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4D4D4D4D4D4D + 4C4C4C4B4B4B43474C46473E403F3B38394336312262520D846C028D74068F75 + 00957903967B039A7E029F81049E7F00A08000A88806846E044D41113533333B + 3D3E41424043454D46464C504D454C4C4C4D4D4D4E4E4E4E4E4E4F4F4F4E4E4E + 4E4E4E4E4E4E4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4D4D + 4D4F4F4F515151515151525252505050525252999999C2C2C2DFDFDFF6F6F6FD + FDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5E0E0E0C3C3C39999 + 994F4F4F5151515050505151515151515050504F4F4F4E4E4E4E4E4E4E4E4E4E + 4E4E4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F + 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F + 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F + 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F + 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4E4E4E4E4E4E4E4E4E4E4E4E4E4E + 4E4F4F4F4F4F4F4F4F4F4E4E4E4E4E4E4E4E4E4D4D4D4C4C4C4C4C4C4B4B4B4B + 4B4B4B4B4B4848484545454444444545454545454444444242423C3C3C424242 + 4747474444443B3B3B3535353535353838383A3536323232262C2B20202C2D24 + 27483D037E6C018562007C64007D65017C65017D66037A650279630377610174 + 61007B62005F4B1B625956686B7373767A8785858684848789838C8C8C919191 + 9191919191919595959393938F8F8F9191919393939393939494949292928B8B + 8B8080807272726969694E4E4E4747473E3E3E37373734343436363638383839 + 39393A3A3A3737373838383F3F3F4444444343433F3F3F3D3D3D3F3F3F404040 + 4040404141414242424444444848484A4A4A4949494949494A4A4A4B4B4B4B4B + 4B4C4C4C4C4C4C4D4D4D4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4F + 4F4F4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E + 4E4E4E4E4E4E4E4E4E4D4D4D4C4C4C4B4B4B43474C46473E41403C3839433732 + 2362520D846C028D7406907600967B03967B029A7E029F82029E7F00A08000A8 + 8904846E044E42123533333C3E3F41424043454D47474D504D454D4D4D4D4D4D + 4E4E4E4F4F4F4F4F4F4F4F4F4F4F4F4E4E4E4F4F4F4F4F4F4F4F4F4F4F4F4F4F + 4F4F4F4F4F4F4F4F4F4F4D4D4D4F4F4F51515152525252525250505052525299 + 9999C2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF5F5F5E0E0E0C3C3C39999994F4F4F5151515050505151515151515050504F + 4F4F4E4E4E4E4E4E4E4E4E4E4E4E4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F + 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F + 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F + 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F + 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4E4E + 4E4E4E4E4E4E4E4E4E4E4E4E4E4F4F4F4F4F4F4F4F4F5050505050504F4F4F4F + 4F4F4E4E4E4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4C4C4C4A4A4A484848474747 + 4848484949494747474343434040403F3F3F4040404141413E3E3E3B3B3B3D38 + 393A3A3A2F35342626322E2528493E04806E038562007A62007962007A63007A + 6300786202766000736000725E00755C00513D0E473E3B41434D494C50605E5E + 6664636B6D676F6F6F7373737171716E6E6E6E6E6E6666665C5C5C5B5B5B5A5A + 5A5353534848483F3F3F3A3A3A37373735353534343438383837373736363638 + 38383A3A3A3B3B3B3B3B3B3A3A3A4040403E3E3E3E3E3E3F3F3F3D3D3D3C3C3C + 3F3F3F4646464242424343434545454848484B4B4B4D4D4D4A4A4A4747474B4B + 4B4B4B4B4C4C4C4C4C4C4D4D4D4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E + 4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E + 4E4E4E4E4E4E4E4E4E4F4F4F4F4F4F4F4F4F4E4E4E4D4D4D4C4C4C4C4C4C4347 + 4C46473E41403C38394337322362520D846C028D7406907600967B03967B029A + 7E029F82029F8000A08000A88904846E044E42123634343C3E3F42434143454D + 47474D504D454D4D4D4E4E4E4E4E4E4F4F4F4F4F4F4F4F4F4F4F4F4E4E4E4F4F + 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4E4E4E4F4F4F51515152 + 5252525252505050525252999999C2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFF + FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFF4F4F4E0E0E0C2C2C299999951515153535353 + 53535252525252525151515050504F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F + 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F + 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F + 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F + 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F + 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F + 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4D4D4D4D4D4D + 4C4C4C4B4B4B4B4B4B4A4A4A4949494949494848484747474545454545454444 + 444343434040403E3E3E403B3D39363F32343530312F2F281F483F066F61017A + 60027A62027A61037A6103786105775F05735D057059036F58026A5706453B0B + 2A291F25292E2C2E2E34352C3634333131373535353636363737373838383838 + 383838383838383838383737373838383838383939393939393A3A3A3A3A3A3A + 3A3A3A3A3A3B3B3B3B3B3B3B3B3B3C3C3C3D3D3D3D3D3D3D3D3D404040404040 + 4141414242424343434444444444444545454747474747474848484949494A4A + 4A4B4B4B4C4C4C4C4C4C4D4D4D4D4D4D4E4E4E4E4E4E4E4E4E4E4E4E4F4F4F4F + 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F + 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F5050505050505050 + 504E4E4E4D4D4D4C4C4C47444D49463E42413D383B43343220615209896E0093 + 7504907700967B02977D019B7F02A08302A08200A28300AA8C058572004E4212 + 3632383C3C4242453C434944464849504B484E4E4E4E4E4E4F4F4F5050505050 + 505050505050504F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F + 4F4F4F4F4F505050515151515151535353515151525252989898C2C2C2DFDFDF + F6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F4F4E0E0E0C2 + C2C29999995151515353535353535252525252525151515050504F4F4F4F4F4F + 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F + 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F + 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F + 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F + 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F + 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F + 4F4F4F4F4F4F4E4E4E4D4D4D4D4D4D4C4C4C4C4C4C4B4B4B4A4A4A4A4A4A4A4A + 4A494949474747474747464646454545434343414141423D3F3B393F34363631 + 3131302920483E086F61017A6002785F01785F01776004765E04735D05715A04 + 6F58026B5601695605453B0B2A291F262A2F2E303035362D3836353333393737 + 373838383939393939393A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3B + 3B3B3B3B3B3C3C3C3C3C3C3C3C3C3D3D3D3E3E3E3E3E3E3F3F3F3F3F3F404040 + 4040404040404242424343434343434444444545454646464747474747474848 + 484848484949494A4A4A4B4B4B4C4C4C4D4D4D4D4D4D4E4E4E4E4E4E4E4E4E4E + 4E4E4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F + 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F + 4F4F4F4F5050505050505050504E4E4E4D4D4D4C4C4C48454E4A473F42413D38 + 3B4335332162530A896E00947605907700967B02977D019B7F02A08302A08200 + A28300AA8B068572004E42123632383C3C4242453C43494447494A504B484E4E + 4E4F4F4F4F4F4F5050505050505050505050504F4F4F4F4F4F4F4F4F4F4F4F4F + 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F505050515151515151535353515151 + 525252989898C2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFF4F4F4E0E0E0C2C2C2999999515151535353535353525252525252 + 5151515050504F4F4F4F4F4F4F4F4F5050505050505050505050505050505050 + 5050505050505050505050505050505050505050505050505050505050505050 + 5050505050505050505050505050505050505050505050505050505050505050 + 5050505050505050505050505050505050505050505050505050505050505050 + 5050505050505050505050505050505050505050505050505050505050505050 + 50505050505050505050505050505050505050505050505050504F4F4F4F4F4F + 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4E4E4E4E4E4E4D4D4D4D4D + 4D4C4C4C4C4C4C4C4C4C4D4D4D4B4B4B4A4A4A4A4A4A49494948484846464644 + 4444443F403D3B41343938343434322B224740096E5F02785F03745D01745D01 + 745C02725C047059036C57026A5500695301675403443A0A2B2A20282C313032 + 323839303B393836363C3A3A3A3B3B3B3C3C3C3D3D3D3D3D3D3D3D3D3D3D3D3D + 3D3D3D3D3D3D3D3D3E3E3E3E3E3E3F3F3F3F3F3F3F3F3F404040424242424242 + 4242424343434343434444444444444545454646464646464747474747474848 + 484949494A4A4A4A4A4A4A4A4A4A4A4A4B4B4B4C4C4C4C4C4C4D4D4D4E4E4E4E + 4E4E4F4F4F4F4F4F4F4F4F4F4F4F505050505050505050505050505050505050 + 5050505050505050505050505050505050505050505050505050505050505050 + 505050505050505050504F4F4F4F4F4F5050505050505050504F4F4F4D4D4D4C + 4C4C49464F4A473F43423E393C4435332162530A896E00947605907700967B03 + 977C039B7F02A083039F8100A18200AA8B068471004E42123632383C3C424245 + 3C43494447494A514C494E4E4E4F4F4F4F4F4F50505050505050505050505050 + 5050505050505050505050505050505050505050505050505050505050505050 + 515151525252535353515151525252989898C2C2C2DFDFDFF6F6F6FDFDFDFFFF + FFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F4F4E0E0E0C2C2C2999999515151 + 5353535353535353535252525151515050505050505050505050505050505050 + 5050505050505050505050505050505050505050505050505050505050505050 + 5050505050505050505050505050505050505050505050505050505050505050 + 5050505050505050505050505050505050505050505050505050505050505050 + 5050505050505050505050505050505050505050505050505050505050505050 + 5050505050505050505050505050505050505050505050505050505050505050 + 5050505050505050505050505050505050505050505050505050505050505050 + 504F4F4F4F4F4F4F4F4F4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4D4D4D4C4C4C4C + 4C4C4C4C4C4A4A4A4848484646464543433E3E44373C3B343636322C2548400B + 6C5F03765B04705B00705B00715B036E5A036D58036A55036853026651006552 + 014339092C2B212A2E333234343A3B323E3C3B3A3A403D3D3D3E3E3E3F3F3F40 + 4040404040404040404040404040414141414141414141424242424242434343 + 4343434444444545454545454646464646464747474747474848484848484848 + 484949494949494A4A4A4A4A4A4B4B4B4B4B4B4C4C4C4C4C4C4C4C4C4D4D4D4D + 4D4D4E4E4E4F4F4F4F4F4F4F4F4F505050505050505050505050515151515151 + 5151515151515050505050505050505050505050505050505050505050505050 + 505050505050505050505050505050505050505050504F4F4F50505050505051 + 51515050504F4F4F4D4D4D4C4C4C49464F4B484043423E3A3D4535332162530A + 896E00947605907600957A02967B029A7E02A083039F8000A18100A98A058471 + 004E42123632383C3C4242453C444A45484A4B524D4A4F4F4F4F4F4F50505050 + 5050515151515151505050505050505050505050505050505050505050505050 + 505050505050505050505050515151525252535353515151535353999999C2C2 + C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F4F4 + E0E0E0C2C2C29999995151515353535353535353535252525151515050505050 + 5050505050505050505050505050505050505050505050505050505050505050 + 5050505050505050505050505050505050505050505050505050505050505050 + 5050505050505050505050505050505050505050505050505050505050505050 + 5050505050505050505050505050505050505050505050505050505050505050 + 5050505050505050505050505050505050505050505050505050505050505050 + 5050505050505050505050505050505050505050505050505050505050505050 + 505050505050505050505050505050505050505050505050504F4F4F4F4F4F4F + 4F4F4F4F4F4E4E4E4D4D4D4C4C4C4D4D4D4C4C4C4A4A4A484848484645414246 + 393F3E373939332D28483E0E6A5C047258046D59026D59026E59046C58036B56 + 04675403655103634F01624F004339092D2C222C30353436363C3D34403E3D3C + 3C42404040414141424242434343434343434343434343434343444444444444 + 4545454545454646464646464747474747474747474747474848484848484949 + 494949494A4A4A4A4A4A4A4A4A4A4A4A4B4B4B4B4B4B4C4C4C4C4C4C4C4C4C4C + 4C4C4E4E4E4E4E4E4E4E4E4F4F4F4F4F4F505050505050505050505050505050 + 5151515151515151515151515252525252525050505050505050505050505050 + 5050505050505050505050505050505050505050505050505050505050505050 + 50504F4F4F5050505151515151515050504F4F4F4E4E4E4D4D4D4A47504C4941 + 44433F3A3D4535332162530A896E009375048F7500957903967B039A7E029F81 + 049F8000A18100A989078471004E42123632383C3C4243463D444A45484A4B52 + 4D4A4F4F4F4F4F4F505050515151515151515151505050505050505050505050 + 5050505050505050505050505050505050505050505050505252525252525353 + 53515151535353999999C2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF4F4F4E0E0E0C2C2C29999995151515353535353535353 + 5353535352525251515150505050505050505050505050505050505050505050 + 5050505050505050505050505050505050505050505050505050505050505050 + 5050505050505050505050505050505050505050505050505050505050505050 + 5050505050505050505050505050505050505050505050505050505050505050 + 5050505050505050505050505050505050505050505050505050505050505050 + 5050505050505050505050505050505050505050505050505050505050505151 + 5151515151515151515151515151515151515151515150505050505050505050 + 50505050505050505050505050504F4F4F4E4E4E4E4E4E4E4E4E4E4E4E4D4D4D + 4B4B4B4A4A4A4849454344483C4241373C3B322E29453D0E675A046F54036B57 + 026B57026B5604685504675305635104614F02604D02614E004238082E2D232D + 31363638383D3E35413F3E3E3E44424242434343434343444444454545454545 + 4545454545454646464747474747474747474848484949494949494949494949 + 494949494A4A4A4A4A4A4B4B4B4B4B4B4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4D + 4D4D4D4D4D4D4D4D4D4D4D4D4D4D4F4F4F4F4F4F505050505050505050505050 + 5151515151515050505050505151515151515151515151515252525252525050 + 5050505050505050505050505050505050505050505050505050505050505050 + 50505050505050505050505050505050505050505151515151515151514F4F4F + 4E4E4E4D4D4D4A47504C494144433F393C44353321615209886D009274038F74 + 01957903967B039A7D049F81049F7F00A18100A989078471004E42123632383D + 3D4343463D454B46494B4C534E4B4F4F4F505050505050515151515151515151 + 5151515050505050505050505050505050505050505050505050505050505050 + 50515151525252525252545454525252535353999999C2C2C2DFDFDFF6F6F6FD + FDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F4F4E0E0E0C2C2C29999 + 9951515153535353535353535353535352525251515150505050505050505051 + 5151515151515151515151515151515151515151515151515151515151515151 + 5151515151515151515151515151515151515151515151515151515151515151 + 5151515151515151515151515151515151515151515151515151515151515151 + 5151515151515151515151515151515151515151515151515151515151515151 + 5151515151515151515151515151515151515151515151515151515151515151 + 5151515151515151515151515151515151515151515151515151515151515151 + 5151505050505050505050515151515151515151515151515151515151505050 + 4F4F4F4F4F4F5050504F4F4F4D4D4D4C4C4C494A464347483D4342383C3D332E + 2B453D0E6557046D5202685301665401675403665204635104614E035D4D015B + 4A01604D004238082E2D232E32373638383E3F3642403F3E3E44434343434343 + 4444444545454646464646464646464646464848484848484848484949494949 + 494A4A4A4A4A4A4A4A4A4B4B4B4B4B4B4C4C4C4C4C4C4D4D4D4D4D4D4E4E4E4E + 4E4E4E4E4E4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F505050505050 + 5050505050505050505151515151515151515050505050505151515151515151 + 5151515151515152525251515151515151515151515151515151515151515151 + 5151515151515151515151515151515151515151515151515151505050505050 + 5151515151515151515050504E4E4E4D4D4D4A47504B484043423E393C443432 + 20615209876C009274038F7401957903967B039A7D049F80059E7E00A08000A9 + 89088471004E42123632383D3D4343463D454B464A4C4D544F4C4F4F4F505050 + 5050505151515151515151515151515151515151515151515151515151515151 + 5151515151515151515151515151515152525253535354545452525253535399 + 9999C2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFF4F4F4E0E0E0C2C2C299999951515153535353535353535353535352525251 + 5151515151505050515151515151515151515151515151515151515151515151 + 5151515151515151515151515151515151515151515151515151515151515151 + 5151515151515151515151515151515151515151515151515151515151515151 + 5151515151515151515151515151515151515151515151515151515151515151 + 5151515151515151515151515151515151515151515151515151515151515151 + 5151515151515151515151515151515151515151515151515151515151515151 + 5151515151515151515151515151505050505050505050515151515151515151 + 5151515151515252525151515151515151515151515151514F4F4F4D4D4D494A + 464347483C4443383C3D332E2B453C106456046A500364520064510065510362 + 5102614F025D4D015B4A015948005F4C004238082F2E242F33383739393E3F36 + 42403F3E3E444343434444444545454646464646464646464646464646464848 + 484848484949494949494A4A4A4A4A4A4B4B4B4B4B4B4D4D4D4D4D4D4D4D4D4E + 4E4E4E4E4E4F4F4F4F4F4F505050505050505050505050505050515151515151 + 5151515151515050505050505050505151515151515151515151515151515050 + 5050505050505051515151515151515151515151515151515151515151515151 + 5151515151515151515151515151515151515151515151515151515151515151 + 5151515151515050505151515151515252525151515050504E4E4E4D4D4D4A47 + 504B484043423E393C44343220605108876C009173028F74019578059579039A + 7D049F80059E7E00A08000A989088471004E42123632383D3D4343463D454B46 + 4A4C4D544F4C4F4F4F5050505151515151515151515151515151515151515151 + 5151515151515151515151515151515151515151515151515151515152525253 + 5353545454525252545454999999C2C2C2DFDFDFF6F6F6FDFDFDFFFFFFFFFFFF + FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFDFDFDF6F6F6DFDFDFC2C2C29D9D9D54545453535354 + 5454545454535353525252525252525252525252525252525252525252525252 + 5252525252525252525252525252525252525252525252525252525252525252 + 5252525252525252525252525252525252525252525252525252525252525252 + 5252525252525252525252525252525252525252525252525252525252525252 + 5252525252525252525252525252525252525252525252525252525252525252 + 5252525252525252525252525252525252525252525252525252525252525252 + 5252525252525252525252525252525252525252525252525252525252525252 + 5252525252525252525252525252525252525252525252525252525252525151 + 515050504F4F4F4F4F4F504C4B494B454247463739413A372F403A0D5F520867 + 52016151056151056150075E4F065C4D05584A025648005546015A3D04453511 + 302F252A303734363E3F393E433C41453E454343434444444646464646464545 + 454545454747474848484949494A4A4A4A4A4A4A4A4A4B4B4B4B4B4B4B4B4B4C + 4C4C4C4C4C4C4C4C4D4D4D4E4E4E4F4F4F505050515151515151525252525252 + 5252525252525252525252525252525252525252525252525252525252525151 + 5151515151515151515152525252525252525252525251515151515151515151 + 5151525252525252525252525252525252525252525252525252525252525252 + 5252525252525252525252525252525252525252525252525151515252525252 + 525151514F4F4F4D4D4D494A4E4B4A4044443E3A3C443631225F500B816B018A + 73068D7301917804927802957A029A7E029A7C009D7D00A68607846D074E4113 + 3735343E413F454741474A4F4A4952534E4B5050505151515151515252525252 + 5252525252525252525252525252525252525252525252525252525252525252 + 52525353535050505656565353535353535454545353539B9B9BC2C2C2E0E0E0 + F8F8F8FFFFFFFFFFFFFEFEFEFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF7F7F7E0E0E0C3 + C3C39E9E9E545454545454555555545454535353535353525252525252525252 + 5252525252525252525252525252525252525252525252525252525252525252 + 5252525252525252525252525252525252525252525252525252525252525252 + 5252525252525252525252525252525252525252525252525252525252525252 + 5252525252525252525252525252525252525252525252525252525252525252 + 5252525252525252525252525252525252525252525252525252525252525252 + 5252525252525252525252525252525252525252525252525252525252525252 + 5252525252525252525252525252525252525252525252525252525252525252 + 525252525252525252525151515151515050504F4F4F504C4B494B4542474637 + 39413A372F403A0D5F5208675201605004605004604F065D4E055B4C04584A02 + 55470054450058420041380C2E31222B323534373C3E3C3C423F3B42403F4040 + 4042424243434344444444444444444446464648484847474747474748484848 + 48484949494949494A4A4A4A4A4A4B4B4B4B4B4B4C4C4C4D4D4D4E4E4E4F4F4F + 4F4F4F5050505050505050505151515151515151515151515151515151515252 + 5252525252525252525252525251515151515151515152525252525252525252 + 5252525252525252525252525252525252525252525252525252525252525252 + 5252525252525252525252525252525252525252525252525252525252525353 + 535252525252525252525252525151514F4F4F4D4D4D494A4E4B4A4044443E3B + 3D453630235F500B806A018972058D7301907604927704957A029A7D049A7C00 + 9B7E00A58506846D074E41133735343E413F454741474A4F4A4952534E4B5050 + 5051515152525252525252525252525252525252525252525252525252525252 + 5252525252525252525252525252525252515151575757545454535353545454 + 5252529B9B9BC2C2C2E0E0E0F8F8F8FFFFFFFFFFFFFFFFFFFEFEFEFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFF7F7F7E1E1E1C4C4C49F9F9F545454545454575757545454535353 + 5353535252525252525252525252525353535353535353535353535353535353 + 5353535353535353535353535353535353535353535353535353535353535353 + 5353535353535353535353535353535353535353535353535353535353535353 + 5353535353535353535353535353535353535353535353535353535353535353 + 5353535353535353535353535353535353535353535353535353535353535353 + 5353535353535353535353535353535353535353535353535353535353535353 + 5353535353535353535353535353535353535353535353535353535353535353 + 535353535353535353535252525252525353535252525252525151515050504F + 4F4F504C4B494B45424746383A423A372F403A0D5E51076651005E4E025E4E02 + 5E4D045B4C035A4B035749015446005344005344003C3706262C1B252C2F2F32 + 37373836383B32363E343C3C3C3E3E3E40404041414142424243434344444446 + 46464444444545454545454646464747474848484848484949494B4B4B4B4B4B + 4B4B4B4C4C4C4C4C4C4D4D4D4E4E4E4E4E4E4F4F4F4F4F4F4F4F4F4F4F4F4F4F + 4F50505050505050505052525252525252525252525252525252525252525252 + 5252535353535353535353535353535353535353535353535353535353535353 + 5353535353535353535353535353535353535353535353535353535353535353 + 535353535353535353535353535252525252525252525353535151514F4F4F4D + 4D4D494A4E4C4B4144433F3B3D453630235F4F0C7F69008871048C7102907604 + 917603927802977C04977B009A7C00A38508836C064E41133735343F42404547 + 41474A4F4A4952544F4C50505051515152525252525253535353535352525252 + 5252535353535353535353535353535353535353535353535353525252515151 + 5757575454545454545353535050509B9B9BC3C3C3E0E0E0F7F7F7FEFEFEFFFF + FFFFFFFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F7F7E2E2E2C6C6C69F9F9F535353 + 5252525656565454545454545353535252525252525252525353535353535353 + 5353535353535353535353535353535353535353535353535353535353535353 + 5353535353535353535353535353535353535353535353535353535353535353 + 5353535353535353535353535353535353535353535353535353535353535353 + 5353535353535353535353535353535353535353535353535353535353535353 + 5353535353535353535353535353535353535353535353535353535353535353 + 5353535353535353535353535353535353535353535353535353535353535353 + 5353535353535353535353535353535353535353535353535353535353535353 + 5353525252515151515151505050504C4B494B45434847383A423A372F3F390C + 5E51076550005D4D015D4D015D4C035A4B02594A025648005446005243005145 + 003A350824261A20222C2A29333330323135302F37303737373939393C3C3C3D + 3D3D3E3E3E3F3F3F414141434343424242424242434343444444454545474747 + 4747474848484949494A4A4A4A4A4A4B4B4B4B4B4B4C4C4C4C4C4C4C4C4C4D4D + 4D4D4D4D4E4E4E4E4E4E4E4E4E4F4F4F4F4F4F4F4F4F51515151515151515151 + 5151515151515151525252525252535353535353535353535353535353535353 + 5353535454545353535353535353535353535353535353535353535353535353 + 5353535353535353535353535353535353535353535353535352525252525253 + 53535353535252524F4F4F4D4D4D49494F4C4A424544403B3C463630235E4E0B + 7E6800876F058970028D75058F7503917603967B03967900997A00A28308826B + 054D4012383635404341464842474A4F4A4952544F4C51515151515152525253 + 5353535353535353525252525252535353535353535353535353535353535353 + 5353535353535252525252525757575454545656565252524F4F4F9D9D9DC6C6 + C6E1E1E1F7F7F7FDFDFDFFFFFFFFFFFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF7F7F7 + E3E3E3C8C8C8A1A1A15252525151515656565454545454545353535353535252 + 5252525253535353535353535353535353535353535353535353535353535353 + 5353535353535353535353535353535353535353535353535353535353535353 + 5353535353535353535353535353535353535353535353535353535353535353 + 5353535353535353535353535353535353535353535353535353535353535353 + 5353535353535353535353535353535353535353535353535353535353535353 + 5353535353535353535353535353535353535353535353535353535353535353 + 5353535353535353535353535353535353535353535353535353535353535353 + 5353535353535353545454535353535353525252515151505050504C4B494B45 + 434847393B433B38303F390C5D5006644F005C4C005C4C005C4B025A4B02594A + 025648005446005344005445063C350E25231B1F1E2829222F2F282F2E2D2F29 + 31313131313333333535353737373838383A3A3A3C3C3C3E3E3E3E3E3E3F3F3F + 4040404141414343434444444545454646464747474747474747474848484949 + 494949494A4A4A4A4A4A4B4B4B4C4C4C4C4C4C4D4D4D4D4D4D4E4E4E4E4E4E4F + 4F4F4F4F4F4F4F4F4F4F4F505050505050505050515151515151525252525252 + 5252525252525353535353535353535353535353535353535353535353535353 + 5353535353535353535353535353535353535353535353535353535353535353 + 53535353535353535252525353535353535252525050504D4D4D49494F4C4A42 + 4543423C3D473630255E4E0C7D6600856D03886E028B72048D72039075039278 + 029277009679009E82068069034D401238363540434146484246494E4A495255 + 504D515151525252525252535353535353535353535353525252535353535353 + 5353535353535353535353535353535353535252525353535656565454545757 + 57525252505050A2A2A2C9C9C9E4E4E4F8F8F8FDFDFDFFFFFFFFFFFFFEFEFEFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFF7F7F7E6E6E6CDCDCDA5A5A55353535151515656565555 + 5554545454545453535353535353535353535353535353535353535353535353 + 5353535353535353535353535353535353535353535353535353535353535353 + 5353535353535353535353535353535353535353535353535353535353535353 + 5353535353535353535353535353535353535353535353535353535353535353 + 5353535353535353535353535353535353535353535353535353535353535353 + 5353535353535353535353535353535353535353535353535353535353535353 + 5353535353535353535353535353535353535353535353535353535353535353 + 5353535353535353535353535353545454545454545454545454535353535353 + 525252515151504C4B494B45434847393B433B38303F390C5D5006644F005C4C + 005C4C005D4C035A4B02594A025749015547005344005342033C330826211221 + 1C1B261E1F2A20202523222025262929292B2B2B2D2D2D2E2E2E2F2F2F313131 + 3333333535353737373838383939393B3B3B3D3D3D3E3E3E4040404141414141 + 414141414242424343434545454646464747474747474848484949494949494A + 4A4A4B4B4B4B4B4B4C4C4C4C4C4C4C4C4C4D4D4D4D4D4D4E4E4E4E4E4E4F4F4F + 4F4F4F4F4F4F5050505050505050505151515252525252525252525353535353 + 5353535353535353535353535353535353535353535353535353535353535353 + 5353535353535353535353535353545454535353535353535353535353525252 + 5050504E4E4E4948514C49444644433C3C483630255D4D0B7C6500836B01846C + 02896F038970028D72039176039074009476009C7F067F68024C3F1139373641 + 444246484246494E4A495255504D515151525252535353535353535353535353 + 5353535353535353535353535353535353535353535353535353535353535353 + 53545454565656535353585858535353515151A7A7A7CECECEE7E7E7F9F9F9FE + FEFEFFFFFFFFFFFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFAFAE9E9E9D2D2D2A9A9 + A956565652525258585855555554545454545453535353535353535353535354 + 5454545454545454545454545454545454545454545454545454545454545454 + 5454545454545454545454545454545454545454545454545454545454545454 + 5454545454545454545454545454545454545454545454545454545454545454 + 5454545454545454545454545454545454545454545454545454545454545454 + 5454545454545454545454545454545454545454545454545454545454545454 + 5454545454545454545454545454545454545454545454545454545454545454 + 5454545454545454545454545454545454545454545454545454545454545454 + 545454545454545454535353525252515151504C4B4A4C464449483A3C443B38 + 303F390C5C4F05634E005D4D015D4D015D4C035B4C035A4B03584A0256480055 + 46015344004037002E2A0729250C2D250E2C230F2222121C2118202020222222 + 2424242525252626262727272A2A2A2B2B2B2E2E2E2E2E2E3030303232323434 + 343636363838383939393A3A3A3B3B3B3C3C3C3E3E3E3F3F3F41414142424243 + 43434444444545454545454646464747474848484949494949494A4A4A4A4A4A + 4B4B4B4B4B4B4C4C4C4D4D4D4D4D4D4E4E4E4E4E4E4E4E4E4F4F4F4F4F4F5050 + 5051515151515152525252525252525252525252525252525252525252525252 + 5252545454545454545454545454545454545454545454545454545454535353 + 5353535353535454545252525050504E4E4E4A49524D4A454644433C3C48362F + 265D4D0B7B6300826901826A00856D03876D018B70018F74028F72009074009A + 7C057E67014C3F1139373641444246484246494E4B4A5356514E515151525252 + 5353535353535454545454545353535353535454545454545454545454545454 + 54545454545454545454545454545454555555535353585858545454535353AD + ADADD2D2D2EAEAEAFBFBFBFEFEFEFFFFFFFFFFFFFEFEFEFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFBFBFBECECECD6D6D6ADADAD58585854545459595955555555555554545453 + 5353535353535353535353545454545454545454545454545454545454545454 + 5454545454545454545454545454545454545454545454545454545454545454 + 5454545454545454545454545454545454545454545454545454545454545454 + 5454545454545454545454545454545454545454545454545454545454545454 + 5454545454545454545454545454545454545454545454545454545454545454 + 5454545454545454545454545454545454545454545454545454545454545454 + 5454545454545454545454545454545454545454545454545454545454545454 + 545454545454545454555555555555555555545454535353525252525252504C + 4B4A4C464449483A3C443B38303F390C5C4F05634E005D4D015D4D015E4D045C + 4D045B4C04584A025749015647025B4D004B45003C3A043737093A3409362F08 + 2B2B0D2228151B1B1B1C1C1C1E1E1E1F1F1F2020202121212323232525252727 + 272828282929292B2B2B2E2E2E30303032323232323235353536363638383839 + 39393C3C3C3D3D3D3F3F3F404040414141424242424242434343444444454545 + 4646464646464949494949494949494A4A4A4B4B4B4C4C4C4C4C4C4C4C4C4D4D + 4D4D4D4D4E4E4E4E4E4E4F4F4F50505050505051515152525252525252525252 + 5252525252525252525252525252545454545454545454545454545454545454 + 5454545454545454545353535353535353535454545353535050504E4E4E4A49 + 524D4A454644443C3C48362F265C4B0C7A6200816800816800846C02866C008A + 6F018E73018C71008F7300977C047D66004C3F1139373642454346484246494E + 4B4A5356514E5252525252525353535353535454545454545353535353535454 + 5454545454545454545454545454545454545454545454545455555555555552 + 5252595959545454555555B0B0B0D4D4D4ECECECFCFCFCFFFFFFFFFFFFFFFFFF + FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFDFDFDFBFBFBF8F8F8D7D7D7B4B4B46D6D6D54545456 + 5656565656565656565656555555555555555555555555555555555555555555 + 5555555555555555555555555555555555555555555555555555555555555555 + 5555555555555555555555555555555555555555555555555555555555555555 + 5555555555555555555555555555555555555555555555555555555555555555 + 5555555555555555555555555555555555555555555555555555555555555555 + 5555555555555555555555555555555555555555555555555555555555555555 + 5555555555555555555555555555555555555555555555555555555555555555 + 5555555555555555555555555555555555555555555555555555555555555454 + 54535353525252525252525050484C474348493B3C463D39343E370C5B4C0465 + 4B005F4A00604B005F4C01604D025E4E025B4C03594A01574A00564603554503 + 5243045142034F42044B4004473C024439004036063E35093C320A382C0A3225 + 0B2F200D2D1D102E1E12221F1A23201C241F2026202526212A28212E28233229 + 23342B2A2C2C2B2D302D2F3530313832333C34343D35354036363A3C3C3C3F3D + 3F403E3F403E403F3B423F3B44413C46433E3A473F3A473F3E49413F49434148 + 434248434147424147424949494A4A4A4A4A4A4B4B4B4C4C4C4C4C4C4D4D4D4D + 4D4D4E4E4E4E4E4E4F4F4F4F4F4F4F4F4F505050505050505050515151515151 + 5151515151515252525252525252525252525353535454545555555555555555 + 55535353525252515151524A55494B45414540424046383324524D086D61007B + 64007C65007F6900826901846C02896F03876E0088700092770872610A4A3E14 + 3B38343D42434448434F4D4C504D4F4D4F505252525353535454545454545555 + 5554545454545454545455555555555555555555555555555555555555555555 + 55555757575555555757575656565050505858586D6D6DB3B3B3DBDBDBF0F0F0 + FDFDFDFDFDFDFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBF3F3F3DC + DCDCC3C3C3878787595959585858565656565656565656565656555555555555 + 5555555555555555555555555555555555555555555555555555555555555555 + 5555555555555555555555555555555555555555555555555555555555555555 + 5555555555555555555555555555555555555555555555555555555555555555 + 5555555555555555555555555555555555555555555555555555555555555555 + 5555555555555555555555555555555555555555555555555555555555555555 + 5555555555555555555555555555555555555555555555555555555555555555 + 5555555555555555555555555555555555555555555555555555555555555555 + 55555555555555555555545454535353525252525252525050484C474348493B + 3C463D39343E370C5B4C04664C00634E03634E03635005645106625206615105 + 5D4D01594B005848035645025444015143014E42024B4002493E02463C00443B + 02423B04423A054036073C33083B2F0B3A300E3C311128270D28260E28251026 + 2412252214232117221F17221E1924262625272725272727292A2B2A2C2D2C2E + 2F2E323130342A2D322F30343233373436373737373A3B393F3D3C41403C3D3E + 423E3F434241434443454845474947474947474B464746464647474748484849 + 49494A4A4A4B4B4B4B4B4B4C4C4C4E4E4E4E4E4E4E4E4E4F4F4F4F4F4F505050 + 5050505050505151515151515252525252525353535353535353535353535252 + 52535353535353545454535353525252515151505050534B56494B4542464142 + 3F48383324524C096C60007A63007A62007D66007E6701826901856D03856B00 + 866D008E75077160094A3E143B38343D42434448434E4C4B504D4F4D4F505353 + 5353535354545454545455555555555554545454545455555555555555555555 + 55555555555555555555555555555555555757575757575A5A5A575757585858 + 858585C1C1C1DFDFDFF2F2F2FEFEFEFEFEFEFFFFFFFFFFFFFEFEFEFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFDFDFDF2F2F2E1E1E1CBCBCB9B9B9B525252525252565656565656 + 5656565656565555555555555555555555555555555555555555555555555555 + 5555555555555555555555555555555555555555555555555555555555555555 + 5555555555555555555555555555555555555555555555555555555555555555 + 5555555555555555555555555555555555555555555555555555555555555555 + 5555555555555555555555555555555555555555555555555555555555555555 + 5555555555555555555555555555555555555555555555555555555555555555 + 5555555555555555555555555555555555555555555555555555555555555555 + 5555555555555555555555555555555555555555555554545454545453535352 + 5252525050494D484348493C3D473D39343E370C5D4E06684E01655005655005 + 635005655306665407655306614F025D4C00604D045C4A035A48015646015444 + 015143014E42024C4000463E00463D00473E00443D00443C00423C01443D0445 + 3E053B38053A3605373505353205312F06302E062C2A072B2906202014201F15 + 1E1F161E201A1E211F20252422272A252A2D2628302A2A302C2C322D2D332E2F + 333031353233373335363B333A3C343B3E373C413A3D433D3E45403F46414047 + 423F4242424242424343434545454646464848484949494A4A4A4A4A4A4A4A4A + 4B4B4B4B4B4B4C4C4C4D4D4D4E4E4E4E4E4E4F4F4F4F4F4F5050505050505151 + 515151515252525252525050505151515252525252525252525151515050504F + 4F4F534B55494C43424640423F48383225514B0A6B5E00796101765F007A6300 + 7C64007E6701836A02806800816A008B71056F5E07493D133B38343E43444448 + 434E4C4B504D4F4E505153535353535354545455555555555555555554545454 + 5454555555555555555555555555555555555555555555555555525252565656 + 5454545858585858585353539B9B9BCACACAE4E4E4F5F5F5FFFFFFFEFEFEFFFF + FFFFFFFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8E9E9E9CECECEA7A7A7 + 5252525353535757575656565656565656565656565555555555555555555555 + 5555555555555555555555555555555555555555555555555555555555555555 + 5555555555555555555555555555555555555555555555555555555555555555 + 5555555555555555555555555555555555555555555555555555555555555555 + 5555555555555555555555555555555555555555555555555555555555555555 + 5555555555555555555555555555555555555555555555555555555555555555 + 5555555555555555555555555555555555555555555555555555555555555555 + 5555555555555555555555555555555555555555555555555555555555555555 + 5555555555545454535353525252525050494D4844494A3D3E483E3A353F380D + 5F50086A50036954096853086955086A56096D590B6E59086C57066954026A56 + 09675306624F045D4C03594A025849015546015246004C40004C40004C40004B + 4000483F00483F004740004841004A4101484201484102473F03443E03433C03 + 413C05413B063B321037300F322C0F2C280F2625112223131F22131D21152020 + 1A20211D23242226262629282A2C2A302C2B342E2D36322D2F332E3035303135 + 33323736323939333A3A343A3B323C3C3C3C3C3C3E3E3E404040424242444444 + 4545454646464444444545454545454747474848484949494A4A4A4A4A4A4A4A + 4A4B4B4B4B4B4B4C4C4C4D4D4D4D4D4D4E4E4E4E4E4E4F4F4F4F4F4F50505051 + 51515151515050504F4F4F4E4E4E524A54494C43424640423F4837312650490A + 695A00775E00735D007761017961017B64017F67037C65007C6600876E066D5C + 05483C123B38343E43444448434E4C4B514E504F515253535354545454545455 + 5555555555555555555555545454555555555555555555555555555555555555 + 555555555555555555565656575757555555565656555555AAAAAACECECEEBEB + EBF9F9F9FFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCFFFFFF + FCFCFCF0F0F0D5D5D5B8B8B86868685C5C5C5757575757575757575656565656 + 5656565656565655555555555555555555555555555555555555555555555555 + 5555555555555555555555555555555555555555555555555555555555555555 + 5555555555555555555555555555555555555555555555555555555555555555 + 5555555555555555555555555555555555555555555555555555555555555555 + 5555555555555555555555555555555555555555555555555555555555555555 + 5555555555555555555555555555555555555555555555555555555555555555 + 5555555555555555555555555555555555555555555555555555555555555555 + 55555555555656565656565656565555555454545353535353535351514B4F4A + 464B4C3E3F493F3B36413A0F61520A6E54076D5A0F6E590E6E5A0D725C0E7560 + 0F7862107A620E79620C745E0C715B096B5605665204614F025D4D015A4A0056 + 47005846075745065544055343015144005043005044004F43004D40004D4000 + 4D3F004C40004C40004A3F014B40044B40045543085241084E3F07483A094137 + 083A3308373009342E0929270927260A27240F26231425231925201D25202224 + 1E23272727282828272929272C2B292E2D2A302F2A32312B3332353535363636 + 3737373939393B3B3B3D3D3D3F3F3F4040404040404040404141414343434444 + 444646464747474848484747474848484848484949494A4A4A4B4B4B4B4B4B4C + 4C4C4D4D4D4E4E4E4F4F4F5050505050504F4F4F4E4E4E4D4D4D504950474B40 + 40443E413E473731264F470B685900755B01705B00765F03765F037862037C64 + 047962007B6300836B076B5A03473B113B38343E43444448434E4C4B514E504F + 5152535353545454555555555555555555555555555555555555555555555555 + 5555555555555555555555555555555555555B5B5B5656565D5D5D5555555757 + 576B6B6BB7B7B7D7D7D7F1F1F1FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFEFEFEFEFEFEFBFBFBF1F1F1DDDDDDC3C3C38484845959595757 + 5757575757575757575756565656565656565656565656565656565656565656 + 5656565656565656565656565656565656565656565656565656565656565656 + 5656565656565656565656565656565656565656565656565656565656565656 + 5656565656565656565656565656565656565656565656565656565656565656 + 5656565656565656565656565656565656565656565656565656565656565656 + 5656565656565656565656565656565656565656565656565656565656565656 + 5656565656565656565656565656565656565656565656565656565656565656 + 5656565656565656565656565656565656565656565656565656555555545454 + 5353535353535452524C504B484D4E40414B403C37423B1064550D72580B6B58 + 0F6F5A0F705C0F745F0E79610F7D640E7F670F82680E7D650D7A620A745D076F + 5A056B5604665302634F015E4D005F49075D47055B4503594603594603574702 + 5646015545005441005441005241005240005141005141004E3F004E3F005540 + 00544100554100554200534301514203514204504207453D084039073B350837 + 3009322A0C2D260D28210D261E0D221F1A21211B20211D1F21211F2226202429 + 20262D21262F2C2C2C2D2D2D2F2F2F3131313333333535353636363737373B3B + 3B3B3B3B3D3D3D3F3F3F41414142424244444444444445454545454546464647 + 47474848484949494A4A4A4A4A4A4A4A4A4B4B4B4C4C4C4D4D4D4D4D4D4D4D4D + 4C4C4C4B4B4B4E484D45493E3F433D403D46352E254E460B6656007459036D59 + 01725C04735E03745F03786105755F00775F007F6707695801463A103B38343E + 43444448434E4C4B514E50505253545454545454555555555555565656565656 + 5555555555555656565656565656565656565656565656565656565656565959 + 595252525B5B5B535353575757898989C3C3C3DFDFDFF5F5F5FCFCFCFEFEFEFF + FFFFFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCFDFDFDF4F4F4E5E5 + E5CBCBCBA2A2A258585857575757575757575757575756565656565656565656 + 5656565656565656565656565656565656565656565656565656565656565656 + 5656565656565656565656565656565656565656565656565656565656565656 + 5656565656565656565656565656565656565656565656565656565656565656 + 5656565656565656565656565656565656565656565656565656565656565656 + 5656565656565656565656565656565656565656565656565656565656565656 + 5656565656565656565656565656565656565656565656565656565656565656 + 5656565656565656565656565656565656565656565656565656565656565656 + 5656565656565555555555555454545353535553534D514C494E4F41424C413D + 38443D1266570F755B0E6C5910725D127861157C65157E661282671084690F86 + 6B10876E12856C1080680E7B650D79620C745F0A6F5B066C5705685204665002 + 624E00614D00604E01604D025E4B005B4A015F4B045C4A035C4A035B49025849 + 0158490156480056480054470054470054450053440053440053440053440053 + 44005644035343014F40014D3F044A3F05483E08443C07403907332D08302B0A + 2D290C2B270F26231424221824211D22201F2424242525252626262828282A2A + 2A2B2B2B2D2D2D2D2D2D3232323232323434343636363838383A3A3A3C3C3C3D + 3D3D3F3F3F404040414141424242434343444444454545454545464646474747 + 4848484949494A4A4A4949494848484848484B454A42463B3D413B3E3A45342D + 244D440B6655007357036B56016E5A036E5A03715B03745F04725B00735D007A + 640568570045390F3B38343F44454448434E4C4B514E50505253545454545454 + 5555555656565656565656565555555555555656565656565656565656565656 + 565656565656565656565656565252525656565353535B5B5BA7A7A7CECECEE5 + E5E5F8F8F8FDFDFDFDFDFDFEFEFEFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFD + FDFBFBFBFFFFFFFCFCFCF0F0F0D5D5D5BFBFBF65656557575757575757575757 + 5757575757565656565656565656565656565656565656565656565656565656 + 5656565656565656565656565656565656565656565656565656565656565656 + 5656565656565656565656565656565656565656565656565656565656565656 + 5656565656565656565656565656565656565656565656565656565656565656 + 5656565656565656565656565656565656565656565656565656565656565656 + 5656565656565656565656565656565656565656565656565656565656565656 + 5656565656565656565656565656565656565656565656565656565656565656 + 5656565656565656565656565656565656565656565555555454545353535553 + 534E524D4A4F5042434D423E39453E13675810765C0F7360177B661B846E2088 + 72208A711B8A70168D70158F73158F75178D73158A7115876F15836D157E6A13 + 7B671077630E756306725F046E5C036D5A036A59036957046754036352016351 + 046351046151046051025D50015C4F005C4F005C4F00544D08534D06524A0452 + 4802544800554901584B01594C026148025F46005A4600584700574A00554B00 + 524A004E48004D47004B4300443F023E3705373106332C0B2F280D2D27101E1E + 1E1F1F1F2020202222222424242525252626262727272929292A2A2A2B2B2B2D + 2D2D3030303232323333333434343939393A3A3A3A3A3A3C3C3C3D3D3D3E3E3E + 3F3F3F4040404343434444444545454646464747474747474646464545454943 + 484145393B3F393D3944342C254C430A6554007256026853016C57026C58016D + 5902725C046E590070590078610567560044380E3B38343F44454448434E4C4B + 514E505153545454545454545555555656565656565656565656565555555656 + 565656565656565656565656565656565656565656565A5A5A5B5B5B5858585A + 5A5A636363BDBDBDD9D9D9ECECECF9F9F9FDFDFDFDFDFDFDFDFDFFFFFFFFFFFF + FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFEFEFEFFFFFFFFFFFFFCFCFCF1F1F1E2E2E2C2C2C29D + 9D9D4F4F4F5D5D5D5656565656565B5B5B585858585858575757575757575757 + 5757575757575757575757575757575757575757575757575757575757575757 + 5757575757575757575757575757575757575757575757575757575757575757 + 5757575757575757575757575757575757575757575757575757575757575757 + 5757575757575757575757575757575757575757575757575757575757575757 + 5757575757575757575757575757575757575757575757575757575757575757 + 5757575757575757575757575757575757575757575757575757575757575757 + 5757575757575757575757575757575757575858585757575757575757575757 + 57565656565656565656585354504D5649495B49495946413E453915745E177E + 63087D5E1F8B6D2C9E813CAA8F45AC9343AA923EAA943CAA953AAD8D41AB8C3D + A78938A386319D8228957B1D8D7414876E0C876E0C846B097F67077C63077961 + 07765F09715C076F5A056960006B5F016A5E006B5C006959006A58006A560069 + 55006C5205695204685103685004675004664F04624D025F4A005B4C04584A02 + 5446005344005145005346025146025146025445005546015347015548045348 + 045146024E4200494000463A044237053832052F2C062527091E240B17220E16 + 211125232325222425242824242A24252F252732242735252837292E2D2D2F2F + 2F31313535353937373D38393F393A3F393A3C3F363D3F39403F3B42403F4540 + 42474045484047483F49413D493F3F45373A3F37363F30302445461456540660 + 59046551036551036653026957046958026857006959006D5D045B4D05423717 + 3D38393F4344494B4553504C504F514E53545555555555555656565757575757 + 5757575756565656565657575757575757575757575758585858585858585858 + 5858595959575757585858555555939393C9C9C9DEDEDEF6F6F6FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFFFFFFFFFFFFFD + FDFDF5F5F5E9E9E9CCCCCCAAAAAA6464645151515757575959595555555A5A5A + 5757575656565757575757575757575757575757575757575757575757575757 + 5757575757575757575757575757575757575757575757575757575757575757 + 5757575757575757575757575757575757575757575757575757575757575757 + 5757575757575757575757575757575757575757575757575757575757575757 + 5757575757575757575757575757575757575757575757575757575757575757 + 5757575757575757575757575757575757575757575757575757575757575757 + 5757575757575757575757575757575757575757575757575757575757575858 + 585757575757575757575757575757575656565656565757514F51514B4E564B + 4E524B483A4E41157A6416846A067F6A0E836E138B751D957D2B9D8638A58C42 + AA904AAD9350B59B47B39945AF9842AF9842B09A42AE9B40AE9B40AC993EA48C + 34A0882E998127927B1F8B7418856F107F690A7B650579650678640576620377 + 61027761027A61037A6103796002725D02715C016F5A006C58006C58006A5700 + 6956006754006554056151045F4F025E4E015C4E025C4E025A4D03594C025A4B + 02574A005547005446005347015448025248025146025645065243054C400646 + 3B074038093A360D36350F35331025240825240A24230E23231124241823241B + 24231F222321252A28252A29262B2A272B2C282B2F2C2C322D2D332E2D363137 + 32323735363937383B393B3C3A3B3C3A3D3B3A3C3A3A413C3E3F3E3A36373539 + 3435332C1D49400E594D00635100645002645002655201685603685701665500 + 6857006C5C035B4D054237173D3839404445494B4553504C504F514E53545555 + 5555555556565657575757575757575756565656565657575757575757575758 + 5858585858585858585858585858565656585858535353686868ABABABD0D0D0 + E8E8E8F7F7F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFEFEFEFFFFFFFFFFFFFFFFFFF9F9F9F1F1F1DBDBDBBEBEBE8888884F4F4F + 5757575C5C5C5252525C5C5C5656565656565757575757575757575757575757 + 5757575757575757575757575757575757575757575757575757575757575757 + 5757575757575757575757575757575757575757575757575757575757575757 + 5757575757575757575757575757575757575757575757575757575757575757 + 5757575757575757575757575757575757575757575757575757575757575757 + 5757575757575757575757575757575757575757575757575757575757575757 + 5757575757575757575757575757575757575757575757575757575757575757 + 5757575757575757575758585858585857575757575757575757575757575756 + 5656565A4F50544E4E535250524C534F375749187E6918886D0B8D6F168D6F16 + 8E7116917517987D1BA38623AB8F2AB0952DB4993EB69B40B99F45BBA34BBDA4 + 4EB9A14DB39E49AF9947B5984DB3974AB19646AF9541AD953DAA9337A99032A7 + 8F2F9E8126987C1E9074168A6E0F876A088467058164017F6200776400756200 + 735F00705E00715F006F5F006F5F006F5F006C58006B57006956006956006756 + 006655006253006050006151045F4F025C4C00584A00584A00584B01584B0158 + 4B015F49015E48005C4801594603564403554306524207524207454205433F04 + 3E3B04393505332F062D29062A24072622062121152021171F221920241F2126 + 2524292C262C33282D36292F2E2B31302D33322F363330373431373231373230 + 36313B38343B3A3036342C393131382C1A50420E634F026E5100634F01624E00 + 6451006653026654016452006554006958025A4C044237173D3839404445494B + 4553504C504F514F545555555555555556565657575757575757575757575756 + 5656575757575757575757585858585858585858585858595959575757575757 + 555555858585C4C4C4D9D9D9F3F3F3FAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCF8F8F8 + E7E7E7D0D0D0ACACAC6464645353535959595757575C5C5C5656565656565757 + 5757575757575757575757575757575757575757575757575757575757575757 + 5757575757575757575757575757575757575757575757575757575757575757 + 5757575757575757575757575757575757575757575757575757575757575757 + 5757575757575757575757575757575757575757575757575757575757575757 + 5757575757575757575757575757575757575757575757575757575757575757 + 5757575757575757575757575757575757575757575757575757575757575757 + 5757575757575757575757575757575757575757575758585858585858585858 + 585857575757575757575757575754585351535351565554534F5953405C4E24 + 7A64238267179679109F8216A9891EB18D21B28B1FB1881BB48718B68819B28B + 1FB48D23B9922ABD9633C29C3CC6A244C9A44AC8A44CC29E50C29E50BF9E4EBD + 9F4EBB9E4DBA9E4AB69C48B59B47BA9B46B99A45B79942B5973EB29638A99030 + A188289B82208E78128B750F87710B846D097F6B067D68057865027663007A63 + 00796101755F00755F00735F00725E00705B006C5A0069540266540164520063 + 5000615000604F005B4C00594A005C4A005C4A005E4A005E49005E49005E4900 + 5D48005F48005B4E025A4D03564A045246044E43054B40064A3E08473C08372E + 0C362D0C312B0E2C281029251324221720211820201A20252321262422272524 + 2928252B2A272C2D282D2E282D2E2B2C302B2F2A272A28302B2D3227194D3F0E + 614C016A4F00604F005F4E00615001635203625100604F00615000645302584A + 024136163E393A4145464A4C4653504C504F514F545555555556565657575757 + 5757575757575757575757575757575757585858585858585858585858595959 + 595959595959595959535353656565A2A2A2D1D1D1E2E2E2F7F7F7FEFEFEFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFDFDFDFBFBFBF0F0F0DEDEDEC1C1C18585855353535353535D5D + 5D59595957575758585858585858585858585858585858585858585858585858 + 5858585858585858585858585858585858585858585858585858585858585858 + 5858585858585858585858585858585858585858585858585858585858585858 + 5858585858585858585858585858585858585858585858585858585858585858 + 5858585858585858585858585858585858585858585858585858585858585858 + 5858585858585858585858585858585858585858585858585858585858585858 + 5858585858585858585858585858585858585858585858585858585858585858 + 585858585858585858585858585857575757575757575757575756545A52515A + 55545D5652575C544D5B4D376F593571592B7562197D681D8A7121977922A07E + 20AC841EB78B20BE9122C49619C5971AC4981DC69920C79923C99A26CA9B28CB + 9C29CBA43ACAA63BC7A63FC6A643C3A546BFA449BBA34BBBA24CBC9E4DBB9D4A + B99D49B99E48B79E48B39D45AF9A3FAD983DB89C3DB4983AAC9234A48A2C9C83 + 27937A1E8C7218876D13856C06816A047F68027E66027C65017B640178630077 + 6200745F04735D05725C046F5B036F5B046D5A036B57026955005E51035E5103 + 605003605003614F02624E00614D00614D005F48006048005F49015E4B025D4B + 045C4D055C4D085D4E095B490A59460954430A4C3E0A47380A3E320A372E0935 + 2B0922200E202010212012211F1723201C24222224232726242A24263124292C + 20252826252E282419433E0D564B01624F00604F005F4E00604F006251026150 + 015E4C005F4D006250035749014136163E393A4145464A4C4653504C504F5150 + 5556565656565656575757575757585858585858575757575757585858585858 + 585858585858595959595959595959595959555555525252858585BEBEBED9D9 + D9EEEEEEF8F8F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFEFEFEFFFFFFFFFFFFFDFDFDFDFDFDF6F6F6E8E8E8CDCD + CDA6A6A66666665454545C5C5C57575758585859595958585858585858585858 + 5858585858585858585858585858585858585858585858585858585858585858 + 5858585858585858585858585858585858585858585858585858585858585858 + 5858585858585858585858585858585858585858585858585858585858585858 + 5858585858585858585858585858585858585858585858585858585858585858 + 5858585858585858585858585858585858585858585858585858585858585858 + 5858585858585858585858585858585858585858585858585858585858585858 + 5858585858585858585858585858595959585858585858585858585858585858 + 57575757575759535E55515C59556054515A5A5557574E4A62534A615141514A + 4151483A54492E5C50286B5C247D6B248B7625907C24B29221B79524BD9927C2 + 9C26C59D26C89E23CA9E21CC9E21BB9818BC9B1CC0A023C3A42BC5A633C7A93A + C9AC3FCBAF43CAA94CC8A94CC7A84DC4A74CBFA54BBCA44ABBA34BB9A34BBE9E + 45BD9D44BC9C43B99B44B99B44B59942B1943FAF923DAB922CA68D279E842094 + 7C188D7412856E0B7F68057B63038068087D65057A6103766001765F03745F03 + 745F03745F04685A07675906665805665603655403645302635201635201694E + 04684D03664E02644D01614D005E4D005B4D005B4D00644E00654E00654F0164 + 4F04614D065E4B085B490A5948094A3F13463D123F3610382E1031270F2B210F + 261D10251B1123212120221C1B1F1A232121252213413E0B564E015E52005F50 + 015E4F005E4F006050035E4E025B4B005C4B025F4E055648004035153F3A3B42 + 46474A4C4653504C504F51505556565656565656575757585858585858585858 + 5757575757575858585858585858585959595959595959595959595959595252 + 52666666A8A8A8D5D5D5E4E4E4FAFAFAF9F9F9FFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFEFE + FEFFFFFFFBFBFBF0F0F0DDDDDDC2C2C291919162626255555559595957575759 + 5959585858585858585858585858585858585858585858585858585858585858 + 5858585858585858585858585858585858585858585858585858585858585858 + 5858585858585858585858585858585858585858585858585858585858585858 + 5858585858585858585858585858585858585858585858585858585858585858 + 5858585858585858585858585858585858585858585858585858585858585858 + 5858585858585858585858585858585858585858585858585858585858585858 + 5858585858585858585858585858585858585858585858585858595959595959 + 5858585858585858585858585858585757575D585958555759585A5153545658 + 5953525455545654515352595250584E51544B55544A575348595046554C3F53 + 473B5C511D62541F6C5D1F7865218971259B802AAD8E33B79738CBA83ACDA838 + CDA836CCA531CBA32CCAA127CBA126CEA225C9A22ECFA736D5AF3FD9B347D4B1 + 49CEAC48C9A847C6A645CAAA4BC9A84BC7A649C4A548C3A449BFA247BD9F46BB + 9D44BCA13FBA9F3DB59C3CB29939AF9737AC9335A88F31A38D2E947A16917713 + 8A720E866D0B836A088068087D65057B6303796401786300746100725E006E5C + 006E5B006D5B026D5B026E57016C58016B57006A570067560064560062560062 + 55005F5100605200605200625100614F00614E00614E00604C005E4B005C4B02 + 5A4A055848065244094F410C4C3F0B493E0C352A0C3229072822052A23102D22 + 06463E03584D006351006051025E4F005F4F026050035E4E025B4A015C4A035F + 4D065547004035153F3A3B4246474A4C4653504C504F51515657565656565656 + 5757575858585858585858585858585757575858585858585858585959595959 + 595959595959595A5A5A5D5D5D929292C5C5C5E2E2E2EDEDEDFFFFFFFCFCFCFE + FEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFDFDFDFFFFFFFFFFFFFEFEFEFFFFFFFEFEFEF5F5F5EDEDEDD4D4D4B7B7B773 + 73734F4F4F5C5C5C575757575757585858585858585858585858585858585858 + 5858585858585858585858585858585858585858585858585858585858585858 + 5858585858585858585858585858585858585858585858585858585858585858 + 5858585858585858585858585858585858585858585858585858585858585858 + 5858585858585858585858585858585858585858585858585858585858585858 + 5858585858585858585858585858585858585858585858585858585858585858 + 5858585858585858585858585858585858585858585858585858585858585858 + 585858585858595959595959595959585858585858585858585858575757605E + 545A5850595C534D544D545B584F56594F575E4E555E52515A53525B56545A54 + 5258514F55504E54514F555352564B4F5A4E50585351505852455F5439655530 + 6E592C725D2A8F691B966E1CA1761FAF7F1FBE8A1FCB9520DA9F24E1A628DBAC + 25DDAD29DCAD2DD6AA2FD3A732D2A738D6AC41D9B147CEAE4ACCAC48C9AB46C8 + A946C6A946C7AA48C6A947C4A947BFA547BEA446BEA446BCA347BCA347B79F45 + B39B41AF973DBA9E39B79B36B29933AD932FA48C289C8420947B198D76138A6E + 00896C00866A008166007C65007B64017963037A64057263007162007061006D + 60006A5E00675C00665B01645A02635C05625B04625902615700625500645500 + 6455006655006E55006D57006D58006B59006857006154005C5100594E005F4B + 1258480D4A3C0B4838144232085848066654016D55016052005F50015F4F0261 + 51055F4E055B49025C49055F4C085446004035153F3A3B4347484A4C4653504C + 504F515156575656565757575757575858585858585858585858585757575858 + 585858585959595959595959595959595A5A5A5A5A5A6D6D6DBABABAD4D4D4E6 + E6E6F2F2F2FEFEFEFFFFFFFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFF2F2F2DFDFDFCFCFCFA2A2A26161615050505D5D5D5555555D5D5D5D5D5D + 5C5C5C5A5A5A5858585858585959595B5B5B5959595959595959595959595959 + 5959595959595959595959595959595959595959595959595959595959595959 + 5959595959595959595959595959595959595959595959595959595959595959 + 5959595959595959595959595959595959595959595959595959595959595959 + 5959595959595959595959595959595959595959595959595959595959595959 + 5959595959595959595959595959595959595959595959595959595959595959 + 5959595959595959595959595959595959595959595959595959595959595959 + 5959595959595959595959595959595959595959595959595959595959595959 + 5959575757575757575757575757575757575757575757575757555555555555 + 555555545454545454545454545454535353514E49504E44554E3D5A52356559 + 317263327F6C338572359E8828A38B27AE9027BB9624C99C23D6A122DEA61FE4 + A820D0A722D2AB27D4AE30D5B33BD2B443D0B448CBB24CC8B04CC2AA50C1A94F + C1AA4EBFA84CBDA748BDA446BBA343BAA242B6A14CB69E4AB59C46B79B44B89A + 41BB993FB9963CB99438B0943DA98D36A0852A977E1E9078148A740B846E0481 + 6C00826F00806C007E6A007C67007C66007B64007A6300796200786105775F05 + 715E036E5C03695B03645A02625B04625B046A59026A59026958016857006857 + 006958016A59026A59026D5B026D5B026D5B026C59026C59026A560169550069 + 55006554056453046351046050045E4E025D4C035C4A03594A024E3F073F3614 + 3D3E344144494A494D5551505452515257565757575757575858585959595959 + 595959595959595858585858585A5A5A58585859595958585854545458585859 + 5959A9A9A9C7C7C7E2E2E2F0F0F0FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEDEDEDDDDDDDC4C4C48F8F8F5D5D5D + 5252525C5C5C5757575858585858585858585858585A5A5A5959595858585959 + 5959595959595959595959595959595959595959595959595959595959595959 + 5959595959595959595959595959595959595959595959595959595959595959 + 5959595959595959595959595959595959595959595959595959595959595959 + 5959595959595959595959595959595959595959595959595959595959595959 + 5959595959595959595959595959595959595959595959595959595959595959 + 5959595959595959595959595959595959595959595959595959595959595959 + 5959595959595959595959595959595959595959595959595959595959595959 + 5959595959595959595959595959585858585858585858585858585858585858 + 5858585858585656565656565656565555555555555555555555555555555656 + 5C55565A5856555B554E5D55485F554362553F62543D5C4837624E356E59337E + 672F8F772B9F8527AA9024B09522D2A536D1A435D1A431D0A52ED2A62BD5A829 + D8A929D9AB28DEAE3EDCAE3FDAAF42D7B044D2AF47CEAE4ACAAD4AC8AD4BCBAD + 44C9AA43C6A843C4A745C2A648BFA44ABCA14ABA9F49B99B44B89A43B79940B5 + 9A40B4993EB09739AC9335A8903097801D937C198D761288710D856E0A826B07 + 816A067F69037D62007E63017D64027C64047963037663027362017160006F5D + 006F5D006E5C006E5C006D5B006D5B006D5B006C5A006E5B006D5A006C58006B + 57006B57006A56006A56006A56006B58076A56086655066452056050045E4D04 + 5D4B045A4B034E3F073F36143D3E344144494A494D5551505452515156555757 + 575858585858585959595959595959595959595858585B5B5B5656565F5F5F56 + 56565C5C5C595959595959979797C0C0C0DADADAEFEFEFF8F8F8FFFFFFFFFFFF + FFFFFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCF3F3F3 + E4E4E4DADADABEBEBE8181815858585D5D5D5858585A5A5A5959595858585959 + 595B5B5B5A5A5A57575759595959595959595959595959595959595959595959 + 5959595959595959595959595959595959595959595959595959595959595959 + 5959595959595959595959595959595959595959595959595959595959595959 + 5959595959595959595959595959595959595959595959595959595959595959 + 5959595959595959595959595959595959595959595959595959595959595959 + 5959595959595959595959595959595959595959595959595959595959595959 + 5959595959595959595959595959595959595959595959595959595959595959 + 5959595959595959595959595959595959595959595959595959595959595959 + 5959595959595959595959595959595959595858585858585858585757575757 + 575757575757575757574D535A50535B52565B54575C56565C56545A56525755 + 51564F584B51584B515647535345545142564F40584E3D594C3C795B247C5F22 + 886821987420AE8423C29526D2A32ADBAB2DDBB41CDCB420DBB325DBB22DDAB0 + 35DAAE3BDAAC40D8AB42DDAC4AD9AA48D3A946CDA846C8A845C2A844BDA642BA + A641C4AA46BFA743BBA240B79F3FB39D3EB19C40AE9B40AD9A3FB59A43B3993F + AF963AAB9234A48C2C9B8420917B158A740E8F700D8C6E09896B068669018568 + 00856800866A00876B007C65017C65017C65017B64007A630079620078610077 + 6000725D01725D01725D01735E03745F04755F0777610978620A725D0B715C0B + 6D590B6A5609655207604F065E4C055B4B064E3F073F36143E3F354144494A49 + 4D55515054525151565557575758585858585859595959595959595959595959 + 59595959595C5C5C5656565555555B5B5B5D5D5D7E7E7EBFBFBFD8D8D8ECECEC + FAFAFAFEFEFEFFFFFFFFFFFFFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFBFBFBFEFEFEF1F1F1E2E2E2D4D4D4ADADAD7575755353535C5C + 5C5D5D5D5D5D5D5A5A5A5A5A5A5C5C5C5C5C5C5959595A5A5A5A5A5A5A5A5A5A + 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A + 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A + 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A + 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A + 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A + 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A + 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A + 5A5A5A5A5A5A5959595959595959595959595959595959595959595959595A5A + 5A5A5A5A595959595959595959595959585858585858575A58575A5854595753 + 585753575853565A53585B53585B4C575B4C575B4D565A4C55584D54574C5356 + 4B52554D525553515155524D5954455E573C655B336D5F2B736124746320886F + 259075259A7F25AA8A26BB9725CBA424D6AC23DDB122D8B329D7B22CD7B232D7 + B13BD7B043D8AF4CD7AE51D6AF53C6AC40C7AD43C6AD45C7AD49C4AB4BC2A94B + BDA54BBBA349BEA349BDA248BBA045B99F41B99F41B79E3EB59C3AB39A38AA91 + 2FA68D2BA08622997D1894770F9072098D70048E6E03876F05876F05856D0384 + 6C02826A008169008169008169007B63037B63037C64047D64067F660880670B + 81680C81680C7B630F79610D745D0D705A0C6A550A6251085F4C085C4C074F40 + 084037153E3F3542454A4A494D55515054525151565558585858585859595959 + 59595A5A5A5A5A5A5959595959595959595E5E5E595959565656585858767676 + AEAEAECDCDCDE5E5E5F4F4F4FCFCFCFDFDFDFFFFFFFFFFFFFEFEFEFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFFFFFFFDFDFDEEEEEEE1E1 + E1D2D2D2A6A6A66D6D6D5858585959595959595A5A5A5A5A5A5B5B5B5B5B5B5B + 5B5B5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A + 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A + 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A + 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A + 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A + 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A + 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A + 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A + 5A5A5A5A5A5A5A5A5A5A5B5B5B5B5B5B5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A59 + 5959625E59615D585E5B565C5955595854585955595A56575B56595366595364 + 59556157575D57595A555B56555D53555D5249525C4B525B4C545B4E55584F55 + 544F54524D544D4E524C534648594B45625241705D3A7E68348B712E93782798 + 7C25A9901CAC911EB3951FBC9924C39D27CBA12AD2A52CD4A72ED2AD3BD4AF3D + D6B040D8B144D8B145D8B046D7AF45D6AD46C7AB46C5A944C3A643C2A543C3A6 + 44C3A546C3A447C2A346B5A044B5A044B6A041B59C3EB09737AB902EA48927A2 + 8522977A1196791093760D90730A8F72098E71088E71088E71088C720E8C720E + 8D730F8D72108C710F8B6F108A6E0F896D0E8368118267117A620E745D0D6C57 + 0C66520B614E0A5D4C0951420A4138163F403643464B4B4A4E56525154525151 + 56555858585858585959595A5A5A5A5A5A5A5A5A5959595959595E5E5E545454 + 6262625959596B6B6BA6A6A6C8C8C8E3E3E3EFEFEFF9F9F9FCFCFCFCFCFCFFFF + FFFFFFFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFD + FDF7F7F7FEFEFEFCFCFCEBEBEBE2E2E2CBCBCBA3A3A36464645A5A5A54545457 + 57575B5B5B5A5A5A5959595A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A + 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A + 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A + 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A + 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A + 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A + 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A + 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A + 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5B5B5B5B5B5B5B5B5B5B + 5B5B5A5A5A5A5A5A5A5A5A5A5A5A5E55585F56595E575A605A5B615B5C615B5C + 615D5C615D5C625A5362595560585860575A5D555C5D535F5D52625C52635E5C + 525D5B535C59545A585756585954575C55575F5557615D5B535C5A525A575259 + 555056514E534E4B504B484E49466648376D4F367B5C35896B309A7B2CAB8B28 + B79726C09E26C6A429C8A329CAA428CCA324CFA524D5A823DAAB24DEAE27D0B0 + 3FD0AF41D1B043D3B146D4B149D2AE4ACFAA48CDA846BBA545BDA747BEA848C1 + A84AC0A749BEA549BCA347BAA145BEA03BBA9C37B39530AB8D28A2841F9B7D18 + 967813937510987B13987B13987A159779149778159576139475129474138B6D + 14876B148368127A6111725B0F69550E63500D5F4D0C52430B433A1841423844 + 474C4C4B4F5652515553525257565858585959595959595A5A5A5A5A5A5A5A5A + 5A5A5A5959595D5D5D5353535454546969699E9E9EC9C9C9D9D9D9F2F2F2F8F8 + F8FEFEFEFFFFFFFEFEFEFFFFFFFFFFFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFAFAFAFFFFFFFFFFFFF4F4F4E7E7E7DADADAC7 + C7C79797977676765B5B5B5757575C5C5C5A5A5A5757575959595A5A5A5A5A5A + 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A + 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A + 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A + 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A + 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A + 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A + 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A + 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A + 5A5A5B5B5B5B5B5B5A5A5A5A5A5A5A5A5A5A5A5A595959595959585A5B585A5B + 5B5A5C5C5B5D5E5B5D5D595E5E585D5D575C5B59595B59595B59595D585A5E59 + 5B5E585D5E585D5E585D615F545F5F535D5C525B58535A575359545559545659 + 5456565559565557555758565858555A58555A58545B56545B565E53565E5355 + 6054506051485E4E3D5D4D365F4C31614D2E7262157E6B1A8C78219E8527B194 + 2CBF9E30CCA733D3AE36D1AC38CFAA36CEA937CEA937D0AB39D1AC3AD2AD3BD2 + AC3CD2B143CFB043CCAC41C8A942C3A643C1A546C1A449BFA449C3A546C3A546 + C1A344BFA142BC9E3FB89A3BB59738B39536A5871EA3851CA082199C7D169A7B + 14987814987814987814947316907017886B16806514765F136D591267541163 + 511054450D443B1942433945484D4D4C50575352565453535857585858595959 + 5959595A5A5A5A5A5A5A5A5A5A5A5A5A5A5A585858606060676767989898CBCB + CBDCDCDCEBEBEBF5F5F5FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFFFFFFFFFFFFFF + FFFFFEFEFEF8F8F8EAEAEADFDFDFCECECE9999996767675A5A5A5D5D5D5A5A5A + 5858585A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A + 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A + 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A + 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A + 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A + 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A + 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A + 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A + 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A595959 + 5959595959595060554F5E56515D57525C56545A59585A5A595B5C5C5B5F525D + 5A545D5A545D5A565D5A555C57565C57565C57555B564C59614E5A60505A6155 + 5B60575A5E585A5B5A57595957574F596051596052585D57575D5A565B5E545A + 6052566152564F56515057525158554E56554B55554A53564954584A545B5451 + 5357524F5C544761553D69563370592B7A5F277F6326A77B0AAC800DB58A15C1 + 9720CBA228D2A92ED5AD2FD5AD2FD6AC31D7AE34D6AE38D4AE3ED2AE43CEAC48 + CBAA49CAAA4BC3A64BC4A74CC6A94EC7AA4FC5A84DC2A54ABFA247BC9F44C8A8 + 3DC3A338BA9A31B19128A98821A5841DA3821BA2811A9876199573198D6F1883 + 68177A6216705C156A571466541354450D453C1A43443A46494E4E4D51585453 + 5755545358575858585959595A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5858 + 58686868A7A7A7CCCCCCDADADAEDEDEDF3F3F3FDFDFDFCFCFCFFFFFFFEFEFEFE + FEFEFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFDFDFDFEFEFEFEFEFEFBFBFBF5F5F5F0F0F0D8D8D8CFCFCF + A9A9A97272725555555959595D5D5D5757575D5D5D5E5E5E5C5C5C5B5B5B6060 + 605555555D5D5D5858585B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5C5C5C5C5C5C5C + 5C5C5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5A5A5A5A5A5A + 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5858585858585858585858585858 + 5858585858585858585857575756565656565655555554545454545453535353 + 5353594C3C5F523C69593C7361387E6834886F2F90772D987C2FA88628AF8C2A + BA962BC59F29CCA324D3A71ED9AA19DBAC15D5A62CD2A72ED4A835D1AA3DCEAB + 44CBAA49C9AA4FC7A950CAA84FC6A74CC3A449C3A449BEA244B69A3CA78E2E9C + 8323A47B1F9F771E95731A896C177E66147460126D5D10695B0F534515433D20 + 3A3B37474650554D576154566359595B55565B5B5B5A5A5A5757575A5A5A5C5C + 5C5757575656565E5E5E777777A4A4A4C6C6C6D8D8D8EDEDEDF8F8F8FAFAFAFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDFEFEFEFFFFFFFEFEFE + F9F9F9F5F5F5EDEDEDDDDDDDC9C9C9AEAEAE8585855E5E5E5252525959595B5B + 5B5656565757575858586060605858585D5D5D5B5B5B5C5C5C5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5C5C5C5C5C5C5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5959 + 5959595959595959595959595959595959595959595959595959595958585857 + 575757575756565656565655555555545D57565A5A55565B554E5D5548605541 + 62543D64563A715D23796427866E2C957B2FA28431AF8D33B99635BE9A36C99F + 28CBA029CBA029CDA027CE9F25CE9E21CE9B1FCC991DC09E22C39E24C59F29C9 + A131CC9F36C79934BD8D2EB58428A5821BA2801C9C7C1D92771D876F1B7C6519 + 715E156959145A4A1548412045463D505056564F565850515B56555856565D5D + 5D5B5B5B5C5C5C6161615E5E5E5555555F5F5F797979A9A9A9CBCBCBE3E3E3ED + EDEDF9F9F9FDFDFDFBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FDFDFDFEFEFEFFFFFFFFFFFFFEFEFEFBFBFBFAFAFAEEEEEEE3E3E3D6D6D6B7B7 + B78A8A8A6666665757575A5A5A5A5A5A6363635A5A5A5B5B5B5858585D5D5D5E + 5E5E5D5D5D5C5C5C5B5B5B5A5A5A5A5A5A5B5B5B5B5B5B5C5C5C5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5C5C5C5C5C5C5C5C5C5C5C5C5C5C + 5C5C5C5C5C5C5C5C5C5C5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5A5A5A5959595959595959595858584D585C4E575B + 4F56594E56565055565156555255535354525A54475D56475D564360543C6052 + 3663523166532E66532D8972249179279F842AB1912EC19B2FCEA32ED6A82BDB + AA2ACDA822CDA721CDA320CDA020CF9C20CD981FCC921BC88E17AC8B16A78716 + 9E81159578168B6F188267177B6218785F19624F124D421C4A483D5254555652 + 575C57585D5D5D555A5B5757575A5A5A5B5B5B5B5B5B5757575F5F5F8B8B8BC1 + C1C1D0D0D0E5E5E5F2F2F2F7F7F7FFFFFFFEFEFEFCFCFCFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFDFDFDFEFEFEFFFFFFFFFFFFFFFFFFFEFEFEF9F9 + F9F9F9F9EFEFEFE1E1E1D8D8D8C7C7C79E9E9E7575755D5D5D5555555E5E5E57 + 57575D5D5D5F5F5F5B5B5B5454545D5D5D5C5C5C5B5B5B5A5A5A5A5A5A5A5A5A + 5B5B5B5C5C5C5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5C5C + 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5C5C5C5C5C5C5C5C5C5B5B5B5B5B5B5B5B5B + 5A5A5A5A5A5A5C5D595A5B57595A565A5B57595D585A5D5B595C5A575A585258 + 5F54575F54575C5455595653555752535953545C545450534350513D54513558 + 532C6158266D5F247867247E6C259F7F26A68528B08E2ABB982AC49F27C9A221 + C9A31BCAA318B99720B3911FAB8A1CA180199775178D6D148767148564146551 + 1053471D5151415254544E4D4F565454565B5A4D57575A5A5A5F5F5F55555551 + 5151727272A4A4A4C6C6C6D2D2D2E2E2E2EDEDEDF3F3F3F9F9F9FFFFFFFEFEFE + FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFDFDFDFEFE + FEFEFEFEFEFEFEFEFEFEFCFCFCFDFDFDF9F9F9F1F1F1EDEDEDE5E5E5CDCDCDB2 + B2B29898986161615151515555556262625959595959596363635C5C5C5C5C5C + 5B5B5B5A5A5A5A5A5A5B5B5B5B5B5B5C5C5C5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B64596162575F5F575E5E565D5E58 + 5D5C585D5A565B59555A53575C54585D54585D54575B53565A54555954555955 + 565A52576653566451565F51565950555350544E4F554A515549604F35645233 + 69572E7160287969248573208C7B1E91811DA5801EA58221A78423A78325A280 + 239D7A2096741B9270176F5A1D53492153524456585955565A5B5C5A5459574B + 57575B5B5B535353636363949494BEBEBECACACAD5D5D5EBEBEBF5F5F5F9F9F9 + FBFBFBFEFEFEFFFFFFFEFEFEFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFEFEFEFEFEFEFEFEFEFDFDFDFDFDFDFDFDFDFFFFFFFEFEFEFCFCFCFB + FBFBF7F7F7EEEEEEE1E1E1D8D8D8C3C3C3A9A9A98E8E8E626262525252555555 + 6060605959595A5A5A5A5A5A5B5B5B5B5B5B5C5C5C5C5C5C5C5C5C5C5C5C5C5C + 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C + 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C + 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C + 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C + 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C + 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C + 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C + 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C + 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C + 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B57 + 625A57605A57605A585E5B5A5E595B5C595B5B585A5A5E5D595D5E5A5E5F5B5D + 5E5A5A5B57565A55565A55565A5562585E5F585D5C565B585459565559545559 + 53565A54575B56545A57565A5B56575A55525B544B585043554D3C554B397A5D + 247D6125806427836828856A27856C24836A20826A1E6A572451472950504A55 + 575F56565C58565550544F58615E585858838383ACACACC3C3C3D5D5D5E4E4E4 + F0F0F0FAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDFEFEFEFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFCFCFCFBFBFBFAFAFAF7F7F7EFEFEFE7E7E7E4E4E4C8C8C8 + BDBDBDACACAC8A8A8A5E5E5E5B5B5B5C5C5C5858585959595B5B5B5C5C5C5D5D + 5D5D5D5D5D5D5D5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C + 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C + 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C + 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C + 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C + 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C + 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C + 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C + 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C + 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C + 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5C5C5C5C5C5C5C5C5C5A615E5A615E5B605E5A605B5A5E59595D585B5D575B + 5D575E5859605B5A605C5B5D5C585A5B57575B55565D56565D565D58555E5956 + 605B58625D5A625D5C605B5A5E59585C575657596156586055545D54535D5352 + 5C55515D55515D55515D5E56495D54465C52405952395951345A512F5C532D5C + 542C604F28554E3A57595A4D4F5A504D565E5A5967676180847EA4A4A4BDBDBD + D0D0D0DBDBDBE9E9E9F4F4F4F7F7F7F8F8F8FDFDFDFEFEFEFFFFFFFEFEFEFEFE + FEFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FEFEFEFAFAFAF3F3F3E8E8E8DCDCDCCBCBCBC0C0C0ADADAD9999996767675656 + 565858585A5A5A5D5D5D5E5E5E5E5E5E5D5D5D5C5C5C5C5C5C5C5C5C5C5C5C5C + 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C + 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C + 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C + 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C + 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C + 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C + 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C + 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C + 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C + 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D + 5D5D5D5D5D5D5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C + 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5D5D5D5D5D5D555A58565B595A5C5C5C + 5C5C5F5A5C60595C645A60665C62615960625A61615B605C5B5D595B5B575C5A + 575E5956605A525F61525E60525C5C54595A555A595A5B595D5C58615E5A5D58 + 595C58575A58575B59585B5C585B5C585A5C56585A544D55664E55644F556050 + 565B51565751575252574E54584D6659395F594C55575F474A596965709D9897 + AFACA4C0C1B8CDCDCDDADADAE6E6E6F0F0F0F9F9F9FAFAFAFAFAFAFEFEFEFEFE + FEFFFFFFFFFFFFFDFDFDFCFCFCFFFFFFFFFFFFFEFEFEFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9F4F4F4EEEEEEE7E7E7DEDE + DED1D1D1C2C2C2B8B8B8AAAAAA8D8D8D6868685353535353535A5A5A5C5C5C5B + 5B5B5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5C5C5C5C5C5C5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B + 5B5B5B5B5B5B5B5B5B5B5B5B5B5A5A5A5A5A5A5A5A5A59595959595959595958 + 58585959595B5B5B5C5C5C5A5A5A565656545454555555575757505050676767 + 878787A2A2A2B4B4B4C3C3C3D1D1D1DBDBDBE9E9E9EEEEEEF5F5F5FAFAFAFCFC + FCFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFDFDFDFAFAFAF7F7F7F2F2F2E9E9E9DFDFDFD7D7D7CBCBCBC1C1C1B5B5B5AB + ABABA0A0A08A8A8A6C6C6C5656564F4F4F505050525252545454565656595959 + 5B5B5B5C5C5C5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D + 5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D + 5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D + 5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D + 5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D + 5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D + 5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D + 5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D + 5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D + 5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D + 5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D + 5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D + 5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D + 5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5E5E5E5E5E5E5E5E5E5E + 5E5E5D5D5D5D5D5D5D5D5D5D5D5D5151514F4F4F4D4D4D5050505A5A5A6F6F6F + 888888989898A4A4A4B1B1B1C2C2C2CFCFCFD7D7D7DEDEDEE8E8E8F0F0F0F5F5 + F5F8F8F8FCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFDFDFDF9F9F9F4F4F4EF + EFEFE5E5E5DEDEDED6D6D6D1D1D1CCCCCCC3C3C3B7B7B7ADADADA8A8A8A7A7A7 + A4A4A4A1A1A19F9F9F9D9D9D9D9D9D9C9C9C9898989898989898989898989898 + 9898989898989898989898989898989898989898989898989898989898989898 + 9898989898989898989898989898989898989898989898989898989898989898 + 9898989898989898989898989898989898989898989898989898989898989898 + 9898989898989898989898989898989898989898989898989898989898989898 + 9898989898989898989898989898989898989898989898989898989898989898 + 9898989898989898989898989898989898989898989898989898989898989898 + 9898989898989898989898989898989898989898989898989898989898989898 + 9898989898989898989898989898989898989898989898989898989898989898 + 9898989898989898989898989898989898989898989898989898989898989898 + 9898989898989898989898989898989898989898989898989898989898989898 + 9898989898989898989898989898989898989898989898989898989898989898 + 9898989898989898989898989898989898989898989898989898989898989898 + 9898989898989898989898989898989898989898989898989898989898989898 + 98989999999999999999999999999999999999999A9A9A9A9A9AA0A0A0A2A2A2 + A5A5A5A9A9A9ADADADB4B4B4BDBDBDC3C3C3D2D2D2D9D9D9E1E1E1E8E8E8ECEC + ECF1F1F1F9F9F9FFFFFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFDFDFDFD + FDFDFDFDFDFCFCFCF9F9F9F6F6F6FCFCFCF6F6F6EFEFEFE8E8E8E2E2E2DEDEDE + D9D9D9D7D7D7CFCFCFCCCCCCC9C9C9C5C5C5C2C2C2C0C0C0BFBFBFBFBFBFC1C1 + C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 + C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 + C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 + C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 + C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 + C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 + C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 + C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 + C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 + C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 + C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 + C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 + C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 + C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C2C2C2C2C2C2C2C2C2C3C3C3C3C3C3 + C3C3C3C4C4C4C3C3C3C8C8C8CECECED4D4D4D8D8D8DBDBDBDEDEDEE0E0E0E9E9 + E9EDEDEDF2F2F2F6F6F6F8F8F8FAFAFAFCFCFCFDFDFDFEFEFEFEFEFEFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFDFDFDFCFCFCFDFDFD + FDFDFDFBFBFBF7F7F7F3F3F3EFEFEFEDEDEDE9E9E9E8E8E8E6E6E6E4E4E4E3E3 + E3E4E4E4E4E4E4E5E5E5E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1 + E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1 + E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1 + E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1 + E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1 + E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1 + E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1 + E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1 + E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1 + E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1 + E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1 + E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1 + E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1 + E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E0E0E0E0E0E0 + E0E0E0E1E1E1E1E1E1E1E1E1E2E2E2E2E2E2E4E4E4E4E4E4E4E4E4E5E5E5E8E8 + E8EEEEEEF5F5F5F9F9F9FAFAFAFCFCFCFEFEFEFFFFFFFFFFFFFFFFFFFEFEFEFD + FDFDFEFEFEFEFEFEFDFDFDFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFCFCFCFBFBFBFCFCFCFEFEFEFFFFFFFAFA + FAF9F9F9F8F8F8F6F6F6F6F6F6F5F5F5F6F6F6F6F6F6F5F5F5F5F5F5F5F5F5F5 + F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5 + F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5 + F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5 + F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5 + F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5 + F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5 + F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5 + F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5 + F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5 + F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5 + F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5 + F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5 + F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5 + F5F5F5F5F5F5F4F4F4F4F4F4F4F4F4F4F4F4F5F5F5F5F5F5F5F5F5F5F5F5F7F7 + F7F8F8F8FAFAFAFCFCFCFCFCFCFDFDFDFDFDFDFDFDFDFEFEFEFDFDFDFDFDFDFE + FEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDFEFEFE + FEFEFEFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFDFDFDFEFEFEFFFFFFFFFFFFFFFF + FFFFFFFFFDFDFDFAFAFAFCFCFCFCFCFCFDFDFDFDFDFDFEFEFEFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFD + FDFDFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDFDFDFDFDFDFDFFFF + FFFFFFFFFDFDFDFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFE + FEFEFEFEFEFFFFFFFFFFFFFFFFFFFBFBFBFDFDFDFFFFFFFFFFFFFFFFFFFFFFFF + FEFEFEFEFEFEFEFEFEFDFDFDFCFCFCFDFDFDFFFFFFFFFFFFFFFFFFFDFDFDFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF} + ShowHint = True + Stretch = True + OnClick = m_ImgCoverClick + end + object m_lbSpriceDes: TLabel + Left = 309 + Top = 442 + Width = 83 + Height = 13 + Caption = '* 100~9999'#38899#31526 + end + object m_lbPrice: TLabel + Left = 207 + Top = 442 + Width = 36 + Height = 13 + Caption = #23450#20215#65306 + end + object m_memoDescription: TMemo + Left = 74 + Top = 262 + Width = 318 + Height = 43 + Hint = #35831#36755#20837#27468#26354#30340#21019#20316#24605#36335#21644#24863#24819 + BorderStyle = bsNone + Color = 15591652 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + MaxLength = 638 + ParentFont = False + ParentShowHint = False + ShowHint = True + TabOrder = 6 + OnChange = MemoChange + end + object m_editSongName: TLineEdit + Left = 74 + Top = 46 + Width = 215 + Height = 23 + MaxLength = 60 + NumberMax = -1 + NumberMin = -1 + Color = 15591652 + TabOrder = 0 + end + object m_editSinger: TLineEdit + Left = 74 + Top = 86 + Width = 62 + Height = 23 + MaxLength = 30 + NumberMax = -1 + NumberMin = -1 + Color = 15591652 + TabOrder = 1 + end + object m_editArranger: TLineEdit + Left = 74 + Top = 124 + Width = 62 + Height = 23 + MaxLength = 30 + NumberMax = -1 + NumberMin = -1 + Color = 15591652 + TabOrder = 2 + end + object m_editOriginal: TLineEdit + Left = 203 + Top = 124 + Width = 62 + Height = 23 + MaxLength = 30 + NumberMax = -1 + NumberMin = -1 + Color = 15591652 + TabOrder = 3 + end + object m_editLyricist: TLineEdit + Left = 74 + Top = 163 + Width = 62 + Height = 23 + MaxLength = 30 + NumberMax = -1 + NumberMin = -1 + Color = 15591652 + TabOrder = 4 + end + object m_editComposer: TLineEdit + Left = 203 + Top = 163 + Width = 62 + Height = 23 + MaxLength = 30 + NumberMax = -1 + NumberMin = -1 + Color = 15591652 + TabOrder = 5 + end + object m_checkBlues: TCKBox + Tag = 5 + Left = 175 + Top = 227 + Width = 48 + Height = 18 + Caption = #34013#35843 + Ctl3D = False + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentColor = True + ParentCtl3D = False + ParentDoubleBuffered = False + ParentFont = False + TabOrder = 8 + BoxColor = 3157548 + OnChange = CheckBoxClick + end + object m_checkPop: TCKBox + Left = 69 + Top = 203 + Width = 48 + Height = 18 + Caption = #27969#34892 + Ctl3D = False + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentColor = True + ParentCtl3D = False + ParentDoubleBuffered = False + ParentFont = False + TabOrder = 9 + BoxColor = 3157548 + OnChange = CheckBoxClick + end + object m_checkClassic: TCKBox + Tag = 7 + Left = 120 + Top = 227 + Width = 48 + Height = 18 + Caption = #21476#20856 + Ctl3D = False + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentColor = True + ParentCtl3D = False + ParentDoubleBuffered = False + ParentFont = False + TabOrder = 10 + BoxColor = 3157548 + OnChange = CheckBoxClick + end + object m_checkCountry: TCKBox + Tag = 10 + Left = 282 + Top = 227 + Width = 48 + Height = 18 + Caption = #20065#26449 + Ctl3D = False + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentColor = True + ParentCtl3D = False + ParentDoubleBuffered = False + ParentFont = False + TabOrder = 11 + BoxColor = 3157548 + OnChange = CheckBoxClick + end + object m_checkDance: TCKBox + Tag = 3 + Left = 228 + Top = 203 + Width = 48 + Height = 18 + Caption = #33310#26354 + Ctl3D = False + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentColor = True + ParentCtl3D = False + ParentDoubleBuffered = False + ParentFont = False + TabOrder = 12 + BoxColor = 3157548 + OnChange = CheckBoxClick + end + object m_checkFolk: TCKBox + Tag = 1 + Left = 120 + Top = 203 + Width = 48 + Height = 18 + Caption = #27665#35875 + Ctl3D = False + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentColor = True + ParentCtl3D = False + ParentDoubleBuffered = False + ParentFont = False + TabOrder = 13 + BoxColor = 3157548 + OnChange = CheckBoxClick + end + object m_checkIndpent: TCKBox + Tag = 9 + Left = 228 + Top = 228 + Width = 48 + Height = 18 + Caption = #29420#31435 + Ctl3D = False + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentColor = True + ParentCtl3D = False + ParentDoubleBuffered = False + ParentFont = False + TabOrder = 14 + BoxColor = 3157548 + OnChange = CheckBoxClick + end + object m_checkJazz: TCKBox + Tag = 4 + Left = 282 + Top = 203 + Width = 48 + Height = 18 + Caption = #29237#22763 + Ctl3D = False + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentColor = True + ParentCtl3D = False + ParentDoubleBuffered = False + ParentFont = False + TabOrder = 15 + BoxColor = 3157548 + OnChange = CheckBoxClick + end + object m_checkOthers: TCKBox + Tag = 127 + Left = 336 + Top = 227 + Width = 48 + Height = 18 + Caption = #20854#23427 + Ctl3D = False + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentColor = True + ParentCtl3D = False + ParentDoubleBuffered = False + ParentFont = False + TabOrder = 16 + BoxColor = 3157548 + OnChange = CheckBoxClick + end + object m_checkRock: TCKBox + Tag = 2 + Left = 175 + Top = 203 + Width = 48 + Height = 18 + Caption = #25671#28378 + Ctl3D = False + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentColor = True + ParentCtl3D = False + ParentDoubleBuffered = False + ParentFont = False + TabOrder = 17 + BoxColor = 3157548 + OnChange = CheckBoxClick + end + object m_checkSamba: TCKBox + Tag = 6 + Left = 69 + Top = 228 + Width = 48 + Height = 18 + Caption = #26705#24052 + Ctl3D = False + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentColor = True + ParentCtl3D = False + ParentDoubleBuffered = False + ParentFont = False + TabOrder = 18 + BoxColor = 3157548 + OnChange = CheckBoxClick + end + object m_checkWaltz: TCKBox + Tag = 8 + Left = 336 + Top = 202 + Width = 60 + Height = 18 + Caption = #22278#33310#26354 + Ctl3D = False + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentColor = True + ParentCtl3D = False + ParentDoubleBuffered = False + ParentFont = False + TabOrder = 19 + BoxColor = 3157548 + OnChange = CheckBoxClick + end + object m_checkSubmit: TCKBox + Left = 27 + Top = 474 + Width = 103 + Height = 18 + Caption = ' '#21457#24067#21040#21809#20316#32593 + Ctl3D = False + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentColor = True + ParentCtl3D = False + ParentDoubleBuffered = False + ParentFont = False + TabOrder = 20 + Checked = True + BoxColor = 3157548 + end + object m_memoLyrices: TMemo + Left = 74 + Top = 320 + Width = 318 + Height = 105 + BorderStyle = bsNone + Color = 15591652 + TabOrder = 7 + OnChange = m_memoLyricesChange + end + object m_checkProject: TCKBox + Left = 27 + Top = 440 + Width = 103 + Height = 18 + Caption = #19978#20256#20276#22863#24037#31243 + Ctl3D = False + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentColor = True + ParentCtl3D = False + ParentDoubleBuffered = False + ParentFont = False + TabOrder = 21 + OnClick = ProjectClick + BoxColor = 3157548 + end + object m_editCpjPrice: TLineEdit + Left = 246 + Top = 437 + Width = 56 + Height = 24 + OnChange = m_editCpjPriceChange + NumberMax = -1 + NumberMin = -1 + Text = '0' + TabOrder = 22 + end + end +end diff --git a/UploadFormUnit.h b/UploadFormUnit.h new file mode 100644 index 0000000..9cfb9bb --- /dev/null +++ b/UploadFormUnit.h @@ -0,0 +1,115 @@ +//--------------------------------------------------------------------------- +//note +//ѭĴüģöֵ +//--------------------------------------------------------------------------- +#ifndef UploadFormUnitH +#define UploadFormUnitH +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include +#include +#include +#include +//#include "PNGButton.hpp" +#include "GlobalUnit.h" +#include "GeneralDialogPanel.h" +#include "CapButton.h" +#include "LineEdit.h" +#include "TextButton.h" +#include "ComboBoxComponent.h" +#include "CKBox.h" + +#define MUSIC_TYPE_NUM 12 + +//#include "BKGMemoUnit.h" +//#include "ComboBoxComponent.h" + +//--------------------------------------------------------------------------- +class TUploadForm : public TForm +{ +__published: // IDE-managed Components + TLabel *m_lblSongName; + TLabel *m_lblSinger; + TLabel *m_lblSex; + TLabel *m_lblArranger; + TLabel *m_lblOriginal; + TLabel *m_lblLyricist; + TLabel *m_lblComposer; + TLabel *m_lblMusicType; + TLabel *m_lblDescription; + +// BKGMemoUnit::TMemo *m_memoDescription; + TMemo *m_memoDescription; + TGeneralDialogPanel *m_GPanelBKG; + + TLineEdit *m_editSongName; + TLineEdit *m_editSinger; + TLineEdit *m_editArranger; + TLineEdit *m_editOriginal; + TLineEdit *m_editLyricist; + TLineEdit *m_editComposer; + + TTextButton *m_btnOk; + TTextButton *m_btnCancel; + TComboBoxComponent *m_pCBSex; + TCKBox *m_checkBlues; + TCKBox *m_checkPop; + TCKBox *m_checkClassic; + TCKBox *m_checkCountry; + TCKBox *m_checkDance; + TCKBox *m_checkFolk; + TCKBox *m_checkIndpent; + TCKBox *m_checkJazz; + TCKBox *m_checkOthers; + TCKBox *m_checkRock; + TCKBox *m_checkSamba; + TCKBox *m_checkWaltz; + TCKBox *m_checkSubmit; + TComboBoxComponent *m_pcbOriAmend; + TLabel *m_lbLyrices; + TMemo *m_memoLyrices; + TImage *m_ImgCover; + TCKBox *m_checkProject; + TLineEdit *m_editCpjPrice; + TLabel *m_lbSpriceDes; + TLabel *m_lbPrice; + + void __fastcall FormCreate(TObject *Sender); + void __fastcall FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift); + void __fastcall OkClick(TObject *Sender); + void __fastcall CheckBoxClick(TObject *Sender); + void __fastcall EditNameChange(TObject *Sender); + void __fastcall m_pcbOriAmendChange(TComboBoxItem *Sender, int Index); + void __fastcall MemoChange(TObject *Sender); + void __fastcall m_ImgCoverClick(TObject *Sender); + void __fastcall m_memoLyricesChange(TObject *Sender); + void __fastcall ProjectClick(TObject *Sender); + void __fastcall m_editCpjPriceChange(TObject *Sender); + +private: // User declarations + int m_iCheckCount; + TCKBox* m_cbTypes[MUSIC_TYPE_NUM]; + + String m_strLyrices; + String m_strCopperPath; + String m_strMusicCoverPath; + bool __fastcall SetMusicCover(String &strCoverPath); + + MESSAGE void __fastcall onUM_MUSICCOVER(TMessage & Msg); + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(UM_MUSICCOVER,TMessage,onUM_MUSICCOVER) + END_MESSAGE_MAP(TForm) +public: // User declarations + + __fastcall TUploadForm(TComponent* Owner); + __fastcall ~TUploadForm(); + +}; +//--------------------------------------------------------------------------- +extern PACKAGE TUploadForm *UploadForm; +//--------------------------------------------------------------------------- +#endif diff --git a/UseStylePanel.cpp b/UseStylePanel.cpp new file mode 100644 index 0000000..3b55dcf --- /dev/null +++ b/UseStylePanel.cpp @@ -0,0 +1,3553 @@ +//--------------------------------------------------------------------------- +#include +#include +#pragma hdrstop + +#include "GlobalUnit.h" +#include "UseStylePanel.h" +#include "MidiTrack.h" +#include "Undo.h" +#include "SwitchProgFormUnit.h" +#include "SwitchTextureForm.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) + +extern int w_xOffDrag, //ͼƬϽ + w_yOffDrag; + +__fastcall TUseStylePanel::TUseStylePanel(TComponent* AOwner) + : TStylePanel(AOwner) +{ + m_pContentPanel = NULL; + m_pPlayTimer = NULL; + m_bAddWeakupBar = true; + + m_strTitle = "ʹ÷"; +} +//--------------------------------------------------------------------------- + +void TUseStylePanel::ClearAllItems() +{ + TStylePanel::ClearAllItems(); +} +//--------------------------------------------------------------------------- + +void TUseStylePanel::CountTotalLine() +{ + m_nTotalLine = 0; + + if( m_pTopItem ){ + // + TCommonItem* pItem = m_pTopItem; + while( pItem ){ //ʾ + m_nTotalLine++; + pItem = GetNextItem( pItem ); + } + } +} +//--------------------------------------------------------------------------- + +bool __fastcall TUseStylePanel::Charge4Fonts() +{ + for( int i=g_aMidiTracks.size()-1; i>=0; i-- ){ + if( g_aMidiTracks[i]->bank!=0xFF ){ + return true; + } + } + + return false; +} +//--------------------------------------------------------------------------- + +void __fastcall TUseStylePanel::DoChangeFontProg(TObject* Sender) +{ + Stop( STOP_ALL ); + + if( Sender ) + SetSelect( m_pFocItem, m_iFocLine ); + + TTrackItem *pItem = (TTrackItem *)m_pSelItem ; + TTrack* pTrack = pItem->pTrack; + + TSwitchProgForm *sPf = new TSwitchProgForm( NULL, pTrack->iBank, pTrack->iProg, pTrack->iChanNo ); + + BYTE data[100000]; + int len = 100000; + GetDemoData( pItem, len, data, sPf->m_iStartBar, sPf->m_lenBar ); + f_MM_LoadDemo( data, len ); + + if( sPf->ShowModal() == mrOk ){ + bool bChanged = false; + + int iStage = FindItemStage( pItem ); + BYTE iBank = pTrack->iBank, + iBankSet = sPf->m_iFont==g_idFont ? 0xFF : sPf->m_iFont; + char iProg = sPf->m_iProg, + iChno = sPf->m_iChno; + + if( iBank!=iBankSet || iProg!=pTrack->iProg || iChno!=pTrack->iChanNo ){ + int range = g_Opus.StageRange(iStage), + iMT = g_Midi.GetMidiTrackIndex( pTrack->iFile, pTrack->iChanSpec ); + + ChangeFont( LOWORD(range), HIWORD(range), iMT, iBankSet, iProg, iChno, pItem->iType ); + } + } + + delete sPf; + f_MM_LoadDemo( NULL, 0 ); +} +//--------------------------------------------------------------------------- + +TTrackItem* TUseStylePanel::FindTrackItem( int iStage, TTrack* pTrk ) +{ + TStyleItem* pStyleItem = (TStyleItem*)m_aItems->First(); + TSegmentItem* pSeg = (TSegmentItem*)pStyleItem->aItems->Items[iStage]; + + for( int i=0; iaItems->Count; i++ ){ + TTrackItem* pTrkItem = (TTrackItem*)pSeg->aItems->Items[i]; + + if( pTrkItem->pTrack==pTrk ) + return pTrkItem; + } + + return NULL; +} +//--------------------------------------------------------------------------- + +void __fastcall TUseStylePanel::ChangeFont( int iSBar, int iEBar, int iMT, int iBank, int iProg, int iChno, int op ) +{ + int iBStage = iSBar<0 ? 0 : GetInsertStage( iSBar ), + iEStage = iEBar<0 ? g_Opus.StageCount() : GetInsertStage( iEBar+1 ); + + int iDelMT = iMT, iAddMT = -1; + TMidiTrack *pDelMT = g_aMidiTracks[iMT], *pAddMT = NULL; + vector* aStagesBefore = new vector, + * aStagesAfter = new vector; + vector aTracksBefore, aTracksAfter; + + bool bInit = false; + vector aAddStages; + TStyleItem* pStyleItem = (TStyleItem*)m_aItems->First(); + vector::iterator itDelStage = pDelMT->aStages.begin(); + while( itDelStage!=pDelMT->aStages.end() ){ + int iStage = *itDelStage;//pDelMT->aStages[i]; + + if( iStage=iEStage ) + break; + else{ + TOpusStage* pStage = g_lstOpusStages[iStage]; + TSegmentItem* pSeg = (TSegmentItem*)pStyleItem->aItems->Items[iStage]; + + for( int j=0; jaTracks.size(); j++ ){ + TTrack* pTrack = pStage->aTracks[j]; + if( pTrack->iFile==pDelMT->file && pTrack->iChanSpec==pDelMT->chno ){ + int iFBar = g_Opus.StageFirstBar(iStage), + iLBar = g_Opus.StageLastBar(iStage); + + aTracksBefore.push_back( new TTrack(pTrack) ); + // aStagesBefore->push_back( MAKELONG(iStage, j) ); + DWORD dwFLT = iFBar + (iLBar<<12) + (j<<24); + aStagesBefore->push_back( dwFLT ); + + pTrack->iBank = iBank; + pTrack->iProg = iProg; + pTrack->iChanSpec = iChno; + + aTracksAfter.push_back( pTrack ); +// aStagesAfter->push_back( MAKELONG(iStage, j) ); + aStagesAfter->push_back( dwFLT ); + aAddStages.push_back( iStage ); + + break; + } + } + + itDelStage = pDelMT->aStages.erase( itDelStage ); + } + } + + TTrack *pBefore = NULL, *pAfter = NULL; + int count = aAddStages.size(); + + if( count==0 ){ + delete aStagesBefore; + delete aStagesAfter; + + return; + } + + int stateDel = pDelMT->state, + volumeDel = pDelMT->volume, + panDel = pDelMT->pan, + iErase = g_Midi.ClearEmptyTrack(); + + int nMTOri = g_aMidiTracks.size(); + pAddMT = g_Midi.GetValidMidiTrack( aAddStages, 0xFF, iChno, iBank, iProg ); + if( nMTOri=0 ){ + pAddMT->state = stateDel; + pAddMT->volume = volumeDel; + pAddMT->pan = panDel; + } + } + + if( iErase>=0 ){ + if( bInit && iErase==iMT ){ + g_aMidiTracks.pop_back(); + g_aMidiTracks.insert( g_aMidiTracks.begin()+iMT, pAddMT ); + + iAddMT = iMT; + bInit = false; + } + else + bInit = true; + } + + pBefore = new TTrack[count]; + pAfter = new TTrack[count]; + + for( int i=0; iiFile = pAddMT->file; + aTracksAfter[i]->iChanSpec = pAddMT->chno; + memcpy( &pAfter[i], aTracksAfter[i], sizeof(TTrack) ); + } + + if( iAddMT<0 ) + iAddMT = g_Midi.GetMidiTrackIndex( pAddMT->file, pAddMT->chno ); + + int iCode = op, + iExt1 = iDelMT>=0 ? iDelMT + (stateDel<<8) + (volumeDel<<16) + (panDel<<24) : -1, + iExt2 = iAddMT>=0 ? iAddMT + (pAddMT->state<<8) + (pAddMT->volume<<16) + (pAddMT->pan<<24) : -1; + + g_Undo.AddUndo( UNDO_MIDI_FONT, op, iSBar, iEBar, (void*)pBefore, (void*)pAfter ); + g_Undo.SetUndoExtra( iExt1, iExt2, -1, aStagesBefore, aStagesAfter ); + + int iShowTrack = -1; + if( !m_pContentPanel->IsVertical() ){ + if( bInit ){ + m_pContentPanel->InitialVars(); + } + else{ + if( iDelMT>=0 ){ + int iST = m_pContentPanel->GetShowTrackId( ST_MIDI, iDelMT ); + if( iST>0 ) + m_pContentPanel->InvalidateBars( iSBar, iEBar, BAR_TRACK | iST ); + } + } + } + + IntegrateStages( iBStage ); + Paint(); + + if( !m_pContentPanel->IsVertical() ){ + if( iAddMT>=0 ){ + if( iAddMT==iDelMT ) + m_pContentPanel->SelectTrack( -1, -1, -1, false ); + + if( iShowTrack<0 ) + iShowTrack = m_pContentPanel->GetShowTrackId( ST_MIDI, iAddMT ) - 1; + + if( iShowTrack>=0 ){ + m_pContentPanel->SelectTrack( iShowTrack, -1, -1, false ); + m_pContentPanel->SetSelectRange( iSBar, 0, iEBar, POINTS_PER_BAR-1 ); + } + } + + GenerateCompose(); + } + + if( g_iPreStage==0 ){ + g_Theme.Set( g_pUseStyle->pStyle->idLoc, g_pUseStyle->pStyle->idStyle, + g_lstOpusStages ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TUseStylePanel::ChangeTexture( int iSBar, int iEBar, char sType, + int iMT, TTrack* pSubTrack, int op ) +{ + int iBStage = iSBar<0 ? 0 : GetInsertStage( iSBar ), + iEStage = iEBar<0 ? g_Opus.StageCount() : GetInsertStage( iEBar+1 ); + + vector* aStagesBefore = new vector, + * aStagesAfter = new vector; + vector aTracksBefore, aTracksAfter; + int iUndoType = iMT<0 ? UNDO_MIDI_ADD : ( pSubTrack ? UNDO_MIDI_SUB : UNDO_MIDI_DEL ); + if( iSBar<0 && iEBar<0 ) { + if( iMT<0 ) + iUndoType = UNDO_TRKMID_ADD; + else if( !pSubTrack ) + iUndoType = UNDO_TRKMID_DEL; + } + + int iDelMT = iMT, + iAddMT = -1; + + if( pSubTrack && pSubTrack->iFile!=0xFF ) + iAddMT = g_Midi.GetMidiTrackIndex( pSubTrack->iFile, pSubTrack->iChanSpec ); + + TMidiTrack* pDelMT = iDelMT<0 ? NULL : g_aMidiTracks[iDelMT], + * pAddMT = iAddMT<0 ? NULL : g_aMidiTracks[iAddMT]; + BYTE iDelFile = pDelMT ? pDelMT->file : 0xFF, + iDelChan = pDelMT ? pDelMT->chno : 0xFF, + iAddFile = pAddMT ? pAddMT->file : 0xFF, + iAddChan = pAddMT ? pAddMT->chno : 0xFF; + bool bDrum = false; + + if( pSubTrack ){ + if( pSubTrack->iChanNo==9 ) + bDrum = true; + } + + vector aAddStages; + TStyleItem* pStyleItem = (TStyleItem*)m_aItems->First(); + for( int i=iBStage; iaItems->Items[i]; + int iFBar = g_Opus.StageFirstBar(i), + iLBar = g_Opus.StageLastBar(i); + + TTrack *pDelTrack = NULL, + *pAddTrack = NULL; + int iDelTrack = -1, + iAddTrack = -1; + + if( iDelChan!=0xFF && ( sType<0 || pStage->iSegType==sType ) ){ + for( int j=0; jaTracks.size(); j++ ){ + TTrack* pTmpTrack = pStage->aTracks[j]; + if( iDelFile!=0xFF && pTmpTrack->iFile==iDelFile && pTmpTrack->iChanSpec==iDelChan ){ + pDelTrack = pTmpTrack; + iDelTrack = j; + break; + } + } + } + + if( pDelTrack ){ + if( !pDelMT || pDelMT->file!=pDelTrack->iFile ) + pDelMT = g_Midi.FindMidiTrack( pDelTrack->iFile, pDelTrack->iChanSpec ); + + pDelMT->DelStage( i ); + +// aStagesBefore->push_back( MAKELONG( i, iDelTrack ) ); + DWORD dwFLT = iFBar + (iLBar<<12) + (iDelTrack<<24); + aStagesBefore->push_back( dwFLT ); + + if( pSubTrack ){ + aTracksBefore.push_back( new TTrack(pDelTrack) ); + + if( pDelTrack->iStyleLoc!=pSubTrack->iStyleLoc + || pDelTrack->iStyleId!=pSubTrack->iStyleId ){ + TTrackItem* pTrkItem = (TTrackItem*)pSeg->aItems->Items[iDelTrack]; + pTrkItem->pStyle = GetStyleInfo( pSubTrack->iStyleLoc, pSubTrack->iStyleId ); + } + + memcpy( pDelTrack, pSubTrack, sizeof(TTrack) ); + aTracksAfter.push_back( pDelTrack ); +// aStagesAfter->push_back( MAKELONG(i, iDelTrack) ); + aStagesAfter->push_back( dwFLT ); + + if( pAddMT ) + pAddMT->AddStage( i ); + else + aAddStages.push_back( i ); + + if( iUndoType!=UNDO_MIDI_SUB ) + iUndoType==UNDO_MIDI_SUB; + } + else{ + TTrackItem* pDelItem = (TTrackItem*)pSeg->aItems->Items[iDelTrack];//FindTrackItem( i, pDelTrack ); + TStylePanel::DeleteItem( pDelItem, -1 ); + + aTracksBefore.push_back( pDelTrack ); + pStage->aTracks.erase( pStage->aTracks.begin()+iDelTrack ); + } + } + else if( pSubTrack && pStage->iSegType==sType && ( !bDrum || iMT<0 || iDelChan==9 ) ){ + TTrack* pTrk = new TTrack( pSubTrack ); + + if( pAddMT ) + pAddMT->AddStage( i ); + else + aAddStages.push_back( i ); + + int iTrk = 0; + if( bDrum ){ + pStage->aTracks.insert( pStage->aTracks.begin(), pTrk ); + } + else{ + iTrk = pStage->aTracks.size(); + pStage->aTracks.push_back( pTrk ); + } + + AddTrack( pSeg, pTrk ); + + aTracksAfter.push_back( pTrk ); +// aStagesAfter->push_back( MAKELONG(i, iTrk) ); + DWORD dwFLT = iFBar + (iLBar<<12) + (iTrk<<24); + aStagesAfter->push_back( dwFLT ); + } + } + + TTrack *pBefore = NULL, *pAfter = NULL; + + int iExt1 = iDelMT>=0 ? iDelMT + (pDelMT->state<<8) + (pDelMT->volume<<16) + (pDelMT->pan<<24) : -1, + iErase = g_Midi.ClearEmptyTrack(); + + if( !aStagesBefore->empty() ){ + int count = aStagesBefore->size(); + pBefore = new TTrack[count]; + + for( int i=0; iempty() ){ + if( !pAddMT && !aAddStages.empty() ){ + int nMTOri = g_aMidiTracks.size(); + pAddMT = g_Midi.GetValidMidiTrack( aAddStages, pSubTrack->iFile, pSubTrack->iChanNo, + pSubTrack->iBank, pSubTrack->iProg ); + + if( nMTOrisize(); + pAfter = new TTrack[count]; + + for( int i=0; iiFile = pAddMT->file; + aTracksAfter[i]->iChanSpec = pAddMT->chno; + } + memcpy( &pAfter[i], aTracksAfter[i], sizeof(TTrack) ); + } + } + + if( iErase>=0 ){ + if( bInit && iErase==iMT && pAddMT ){ + g_aMidiTracks.pop_back(); + g_aMidiTracks.insert( g_aMidiTracks.begin()+iMT, pAddMT ); + + iAddMT = iMT; + bInit = false; + } + else + bInit = true; + } + + if( pAddMT && iAddMT<0 ) + iAddMT = g_Midi.GetMidiTrackIndex( pAddMT->file, pAddMT->chno ); + + int iCode = op, + iExt2 = iAddMT>=0 ? iAddMT + (pAddMT->state<<8) + (pAddMT->volume<<16) + (pAddMT->pan<<24) : -1; + + g_Undo.AddUndo( iUndoType, iCode, iSBar, iEBar, (void*)pBefore, (void*)pAfter ); + g_Undo.SetUndoExtra( iExt1, iExt2, -1, aStagesBefore, aStagesAfter ); + + int iShowTrack = -1; + if( !m_pContentPanel->IsVertical() ){ + if( bInit ){ + m_pContentPanel->InitialVars(); + } + else{ + if( iDelMT>=0 ){ + int iST = m_pContentPanel->GetShowTrackId( ST_MIDI, iDelMT ); + if( iST>0 ) + m_pContentPanel->InvalidateBars( iSBar, iEBar, BAR_TRACK | iST ); + } + } + } + + IntegrateStages( iBStage ); + Paint(); + + if( g_iSegColorMode==1 ) + m_pContentPanel->InvalidateBars( iSBar, iEBar, BAR_DATA ); + + if( !m_pContentPanel->IsVertical() ){ + if( iAddMT>=0 ){ + if( VIEW_TRACK!=g_iViewMode ){ + Application->MainForm->Perform( UM_SETVIEWMODE, VIEW_TRACK, 0 ); + } + else if( iAddMT==iDelMT ) + m_pContentPanel->SelectTrack( -1, -1, -1, false ); + + if( iShowTrack<0 ) + iShowTrack = m_pContentPanel->GetShowTrackId( ST_MIDI, iAddMT ) - 1; + + if( iShowTrack>=0 ){ + m_pContentPanel->SelectTrack( iShowTrack, -1, -1, false ); + m_pContentPanel->SetSelectRange( iSBar, 0, iEBar, POINTS_PER_BAR-1 ); + } + } + + GenerateCompose(); + } + + if( g_iPreStage==0 ){ + g_Theme.Set( g_pUseStyle->pStyle->idLoc, g_pUseStyle->pStyle->idStyle, + g_lstOpusStages ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TUseStylePanel::DoChangeTexture(TObject* Sender) +{ + Stop( STOP_ALL ); + + if( Sender ) + SetSelect( m_pFocItem, m_iFocLine ); + + TTrackItem *pItem = (TTrackItem *)m_pSelItem ; + TTrack* pTrack = pItem->pTrack; + int stype = pItem->GetSegType(); + char progOri = pTrack->iProgOrig; + + int iStage = FindItemStage( pItem ); + TOpusStage* pStage = g_lstOpusStages[iStage]; + int iSBar = g_Opus.StageFirstBar( iStage ), + lenBar = pStage->aBars.size(); + TStageList m_lstStage; + TStage *stage = new TStage; + + TStageList lstStages; + stage->iSegType = stype; + stage->iSegKey = pStage->iSegKey; + stage->nBarNum = lenBar; + stage->nTrkNum = 0; + lstStages.push_back( stage ); + + if( stype<=SEGTYPE_FILL ){ + stage->aChords = new TBarChords[lenBar]; + for( int j=0; jaChords[j], + &pStage->aBars[j]->aChords, + sizeof(TBarChords) ); + } + } + + TSwitchTextureForm *pProgPar = new TSwitchTextureForm(NULL, (1<iBank, pTrack->iProg, pItem->pStyle, + pTrack->iChanNo, pTrack->iSegNo, &lstStages, 0); + + if(pProgPar->ShowModal() == mrOk){ + TTrack subTrk; + subTrk.iStyleLoc = pProgPar->m_pSetStyle->idLoc; + subTrk.iStyleId = pProgPar->m_pSetStyle->idStyle; + subTrk.iSegNo = pProgPar->m_cSetSegNo; + subTrk.iChanNo = pProgPar->m_cSetchan; + subTrk.iProgOrig = pProgPar->m_cSetProgOri; + subTrk.nVol = pProgPar->m_cSetVol; + subTrk.nVolOrig = pProgPar->m_cSetVolOri; + + if( pProgPar->m_bSetCur ){ + subTrk.iProg = pProgPar->m_cSetProg; + subTrk.iChanSpec = subTrk.iChanNo; + subTrk.iBank = 0xFF; + subTrk.iFile = 0xFF; + } + else{ + subTrk.iProg = pTrack->iProg; + subTrk.iChanSpec = pTrack->iChanSpec; + subTrk.iBank = pTrack->iBank; + subTrk.iFile = pTrack->iFile; + } + + int iMT = g_Midi.GetMidiTrackIndex( pTrack->iFile, pTrack->iChanSpec ); + ChangeTexture( iSBar, iSBar+lenBar-1, stype, iMT, &subTrk, SEGTYPE_TRACK ); + } + + delete pProgPar; + delete stage; +} +//--------------------------------------------------------------------------- + +void __fastcall TUseStylePanel::DeleteAllTexture( bool bAddUndo ) +{ + if( g_Midi.IsEmpty() || g_Opus.BarCount()==0 ) + return; + + TStyleItem* pStyleItem = (TStyleItem*)m_aItems->First(); + TOpusStageList *lstStageBefore = NULL, + *lstStageAfter = NULL; + UINT idLocBefore(-1), idStyleBefore(-1), + idLocAfter(-1), idStyleAfter(-1); + int nTrks = g_aMidiTracks.size(); + TMidiTrackList *lstTracksBefore = NULL; + + if( bAddUndo ){ + lstStageBefore = new TOpusStageList; + g_Opus.CopyStages( 0, g_Opus.BarCount()-1, lstStageBefore ); + + if( pStyleItem->pStyle ){ + idLocBefore = pStyleItem->pStyle->idLoc; + idStyleBefore = pStyleItem->pStyle->idStyle; + } + + lstTracksBefore = new TMidiTrackList; + for( int i=0; ipush_back( new TMidiTrack(g_aMidiTracks[i]) ); + } + + for( int i=0; iaItems->Items[i]; + + while( !pStage->aTracks.empty() ){ + TTrackItem* pDelItem = (TTrackItem*)pSeg->aItems->Last(); + TStylePanel::DeleteItem( pDelItem, -1 ); + + TTrack* pTrack = pStage->aTracks.back(); + pStage->aTracks.pop_back(); + } + } + + g_Midi.ClearMidiTracks(); + + IntegrateStages( 0 ); + Paint(); + + if( bAddUndo ){ + lstStageAfter = new TOpusStageList; + g_Opus.CopyStages( 0, g_Opus.BarCount()-1, lstStageAfter ); + + if( pStyleItem->pStyle ){ + idLocAfter = pStyleItem->pStyle->idLoc; + idStyleAfter = pStyleItem->pStyle->idStyle; + } + + g_Undo.AddUndo( UNDO_TRKMID_DELALL, ST_MIDI, idStyleBefore, idStyleAfter, + (void*)lstStageBefore, (void*)lstStageAfter ); + g_Undo.SetUndoExtra( idLocBefore, idLocAfter, 0, (void*)lstTracksBefore, NULL ); + } + + if( !m_pContentPanel->IsVertical() ){ + m_pContentPanel->InitialVars(); + GenerateCompose(); + } + else if( g_iSegColorMode==1 ){ + m_pContentPanel->InvalidateBars( 0, g_Opus.BarCount()-1, BAR_DATA ); + } + + if( g_iPreStage==0 ){ + g_Theme.Set( g_pUseStyle->pStyle->idLoc, g_pUseStyle->pStyle->idStyle, + g_lstOpusStages ); + } +} +//--------------------------------------------------------------------------- + +TSegmentItem* TUseStylePanel::AddStage( TOpusStage* pStage ) +{ + TStyleItem* pStyItem = (TStyleItem*)m_aItems->First(); + + int ind = 0; + DWORD opts = OPT_DEL|OPT_VOL; + if( pStage->iSegType<=SEGTYPE_FILL ){ + ind = pStyItem->nSegNum[0] + pStyItem->nSegNum[1]; + opts |= OPT_BRUSH; + } + else + ind = pStyItem->nSegNum[pStage->iSegType]; + + TSegmentItem* pSegItem = pStyItem->AddSegment( pStage->iSegType, + pStage->iSegNo, + opts, + pStage->aBars.size(), + ind, + pStage->nVol, + false ); + opts = OPT_DEL|OPT_FONTPROG|OPT_VOL; + if( pStage->iSegTypeaTracks.size(); j++ ){ + TTrack* pTrack = pStage->aTracks[j]; + pSegItem->AddTrack( NULL, pTrack, opts, false ); + } + + return pSegItem; +} +//--------------------------------------------------------------------------- + +int TUseStylePanel::GetDemoData( TCommonItem* pItem, int &nLen, BYTE* pData, int& iStartBar, int& lenBar ) +{ + int ret = 0; + + if( pItem->iType==SEGTYPE_TRACK ){ //ŵһ{ + int iStage = FindItemStage( pItem ); + TOpusStage* pStage = g_lstOpusStages[iStage]; + TSegmentItem* pSeg = (TSegmentItem*)pItem->up; + + int stype = pItem->GetSegType(); + TTrack* pTrk = ((TTrackItem*)pItem)->pTrack; + TStage stage; + stage.aTracks = new TComposeTrack[1]; + int nStageNum = 1; + + stage.iSegType = stype; + stage.iSegKey = pStage->iSegKey; + stage.nBarNum = lenBar; + stage.nTrkNum = 1; + + stage.aTracks->iStyleId = pTrk->iStyleId;// >pStyle->idStyle; + stage.aTracks->iStyleLoc = pTrk->iStyleLoc;// >pStyle->idLoc; + + if( stype>=SEGTYPE_INTRO ){ + char cType = (pTrk->iSegNo / 4 + 1) << 4; + char sno = pTrk->iSegNo % 4; + stage.aTracks->iSegNo = sno + cType; + } + else + stage.aTracks->iSegNo = pTrk->iSegNo; + + stage.aTracks->iChanNo = pTrk->iChanNo; + stage.aTracks->iChanSpec = pTrk->iChanSpec; + stage.aTracks->iProg = pTrk->iProg; + stage.aTracks->nVol = pTrk->nVol<0 ? 0 : pTrk->nVol * pSeg->volume / 100.0; + + if( stype<=SEGTYPE_FILL ){ + stage.aChords = new TBarChords[lenBar]; + for( int j=0; jaBars[j]->aChords, + sizeof(TBarChords) ); + } + } + + ret = f_CM_Compose( &nLen, pData, g_iMelodyTimeSignature, g_nMelodyTempo, + nStageNum, &stage, false, NULL, NULL ); + } + + return ret; +} +//--------------------------------------------------------------------------- + +void TUseStylePanel::PlayDemo( TCommonItem *pItem, int tempo ) +{ + if( !pItem || g_lstOpusStages.size()==0 ) + return; + + Stop( STOP_ALL ); + + if( pItem->iType!=SEGTYPE_TRACK ){ + GenerateCompose(); + SetTrackParams( false ); + } + + int iStartBar(0), lenBar(0); + if( pItem->iType==SEGTYPE_STYLE ){ //ȫ + f_MM_Play( Handle, 0, TYPE_COMPOSE ); //ű + m_bPlaying = true; + } + else{ + int iStage = FindItemStage( pItem ); + TOpusStage* pStage = g_lstOpusStages[iStage]; + + for( int i=0; iaBars.size(); + } + + lenBar = pStage->aBars.size(); + + if( pItem->iType==SEGTYPE_TRACK ){ //ŵһ + BYTE data[100000]; + int len = 100000; + int ret = GetDemoData( pItem, len, data, iStartBar, lenBar ); + + if( ret==0 ){ + BYTE iBank = ((TTrackItem*)pItem)->pTrack->iBank; + char* strFile = iBank==0xFF ? NULL : iBank<0x80 ? g_lstFonts[iBank]->strFileName + : g_lstVSTi[iBank-0x80]->strFileName; + + f_MM_LoadDemo( data, len ); + f_MM_PlayDemo( Handle, 0, -1, -1, iBank, strFile ); + + m_bPlaying = true; + } + else{ + DebugPrint( "Compose error: %d", ret ); + } + } + else{ + f_MM_Play( Handle, iStartBar, TYPE_COMPOSE ); //ű + m_bPlaying = true; + } + + if( m_bPlaying ){ + if( !m_pPlayTimer ){ + m_pPlayTimer = new TTimer(this); + } + m_pPlayTimer->Interval = lenBar * g_dblTimePerBar - 100; + m_pPlayTimer->OnTimer = PlayEndProc; + m_pPlayTimer->Enabled = true; + } + } + + if( m_bPlaying ) + m_pPlayItem = pItem; +} +//--------------------------------------------------------------------------- + +void __fastcall TUseStylePanel::PlayEndProc(TObject* Sender) +{ + Stop(STOP_SELF); +} +//--------------------------------------------------------------------------- + +void __fastcall TUseStylePanel::OnPlayEnd(TMessage &msg) +{ + Stop(STOP_SELF); +} +//--------------------------------------------------------------------------- + +void TUseStylePanel::SetSelect( TCommonItem *pItem, int iLine ) +{ + TCommonItem * pOldSeg = NULL; + + if( m_pSelItem && m_pSelItem->iType>=SEGTYPE_VAR + && m_pSelItem->iType<=SEGTYPE_ENDING ){ + pOldSeg = m_pSelItem; + } + + if( !pItem || pItem->iType==SEGTYPE_STYLE ){ + m_pContentPanel->SelectStage( -1 ); + } + + TStylePanel::SetSelect( pItem, iLine ); + + if( pOldSeg!=m_pSelItem && m_pSelItem && m_pSelItem->iType>=SEGTYPE_VAR + && m_pSelItem->iType<=SEGTYPE_ENDING ){ + TStyleItem* pStyle = (TStyleItem*)m_aItems->Items[0]; + + for( int i=0; iaItems->Count; i++ ){ + if( m_pSelItem==pStyle->aItems->Items[i] ){ + m_pContentPanel->SelectStage( i ); + break; + } + } + } +} +//--------------------------------------------------------------------------- +void TUseStylePanel::Stop( DWORD dwSpec ) +{ + if( m_pPlayTimer ){ + delete m_pPlayTimer; + m_pPlayTimer = NULL; + } + + if( m_bPlaying ){ + dwSpec = STOP_SELF; + + if( m_pPlayItem && m_pPlayItem->iType!=SEGTYPE_TRACK ) + SetTrackParams(); + } + + TStylePanel::Stop( dwSpec ); +} +//--------------------------------------------------------------------------- + +bool TUseStylePanel::HandleHoverEvent(TPoint ptMouse) +{ + int X = ptMouse.X, + Y = ptMouse.Y; + + TCommonItem* pHoverItem = NULL; + int iHoverLine = -1; + + TCommonItem* pItem = HitTest( X, Y-m_nTitleHeight, NULL ); + if( pItem && m_pDropItem ){ + if( m_pDropItem->iType==SEGTYPE_TRACK ){ + iHoverLine = (Y - m_nTitleHeight)/m_nItemHeight; + + pHoverItem = GetTrackHoverItem( pItem, iHoverLine ); + } + else if( m_pDropItem->iType==SEGTYPE_STYLE ){ + //鿴ǷȱƬ + if( ((TStyleItem*)m_pDropItem)->nSegNum[0]>0 ){ + pHoverItem = (TCommonItem*)m_aItems->Items[0]; + iHoverLine = -m_iTopLine; + } + } + else{ + int iDropType = m_pDropItem->GetSegType(), + iHoverType = pItem->GetSegType(); + + if( iDropType==iHoverType //ͬ滻 + || ( iHoverType==SEGTYPE_FILL + || iHoverType==SEGTYPE_VAR) + && (iDropType==SEGTYPE_FILL + || iDropType==SEGTYPE_VAR )){ //ӻ滻 + iHoverLine = (Y - m_nTitleHeight)/m_nItemHeight; + pHoverItem = pItem; + } + } + } + + SetUnfoldTimer( pItem, pHoverItem ); + SetHover( pHoverItem, iHoverLine ); + + return pHoverItem!=NULL; +} +//--------------------------------------------------------------------------- + +void TUseStylePanel::HandleDropEvent( int iState ) +{ + if( m_pDropItem && m_pHoverItem ){ + Stop(); + + if( m_pDropItem->iType==SEGTYPE_STYLE ){ //Ӧ÷ + PostMessage( Parent->Handle, UM_APPLYSTYLE, 1, LPARAM(m_pDropItem) ); + } + else{ //ӦƬ + int iStage = FindItemStage( m_pHoverItem ); + + if( m_pDropItem->iType==SEGTYPE_TRACK ){ //track + TSegmentItem* pSeg = (TSegmentItem*)m_pHoverItem; + if( m_pHoverItem->iType==SEGTYPE_TRACK ) + pSeg = (TSegmentItem*)m_pHoverItem->up; + + TTrack *pSrcTrack = new TTrack( ((TTrackItem*)m_pDropItem)->pTrack ), + *pDstTrack = NULL; + + if( pSrcTrack->iChanNo==9 ){ + for( int i=0; iaItems->Count; i++ ){ + TTrackItem* pTmpItem = (TTrackItem*)pSeg->aItems->Items[i]; + if( pTmpItem->pTrack->iChanNo==9 ){ + pDstTrack = pTmpItem->pTrack; + break; + } + } + } + + int iMT = -1; + if( pDstTrack ){ + iMT = g_Midi.GetMidiTrackIndex( pDstTrack->iFile, pDstTrack->iChanSpec ); + } + else{ + pSrcTrack->iFile = 0xFF; + pSrcTrack->iChanSpec = pSrcTrack->iChanNo; + } + + TOpusStage* pStage = g_lstOpusStages[iStage]; + int iSBar = FirstBar( iStage ), + iEBar = iSBar + pStage->aBars.size() - 1; + + ChangeTexture( iSBar, iEBar, pStage->iSegType, iMT, pSrcTrack, SEGTYPE_TRACK ); + } + else{ + ReformStage( iStage, (TSegmentItem*)m_pDropItem ); + } + } + } +} +//--------------------------------------------------------------------------- + +String TUseStylePanel::ChargeTip( TStyleItem* pItem ) +{ + String strTip = " ֧Ԥ\n\n \n"; + strTip += "------------------------\n"; + + char buf[512]; + int nFee = 0; + for( int i=0; iidLoc==0 && m_aStyles[i]->pOrigin->cost>0 ){ + TPROSTYLE* pStyle = m_aStyles[i]; + + sprintf( buf, "[%4d] %d\n", pStyle->idStyle, pStyle->pOrigin->cost ); + strTip += buf; + + nFee += pStyle->pOrigin->cost; + } + } + + strTip += "------------------------\n"; + strTip += " ϼ " + IntToStr( nFee ); + + return strTip; +} +//--------------------------------------------------------------------------- + +void TUseStylePanel::ApplyStyle( TStyleItem* pSrcStyle ) +{ + g_Midi.ClearMidiTracks(); + + TStyleItem* pDestStyle = (TStyleItem*)m_aItems->Items[0]; + + //Set Undo + bool bMMUndo = false; + int nBars = pDestStyle->nBars, + idLoc = (pDestStyle && pDestStyle->pStyle) ? pDestStyle->pStyle->idLoc : 0, + idStyle = (pDestStyle && pDestStyle->pStyle) ? pDestStyle->pStyle->idStyle : 0; + + TAudioTrackList* lstAudio = NULL; + TOpusStageList* lstStageBefore = new TOpusStageList; + g_Opus.CopyStages( 0, nBars-1, lstStageBefore ); + + //滻 + pDestStyle->pStyle = pSrcStyle->pStyle; + + int nSegNum[4]; + vector aSegments[4]; + memset( nSegNum, 0, sizeof(int)*4 ); + + for( int i=0; iaItems->Count; i++ ){ + TSegmentItem* pSegment = (TSegmentItem*)pSrcStyle->aItems->Items[i]; + int stype = pSegment->GetSegType(); + aSegments[stype].push_back( pSegment ); + nSegNum[stype]++; + } + + m_pFocItem = NULL; + m_iFocLine = -1; + m_pSelItem = NULL; + m_iSelLine = -1; + + for( int i=pDestStyle->aItems->Count-1; i>=0; i-- ){ + TSegmentItem* pDestSeg = (TSegmentItem*)pDestStyle->aItems->Items[i]; + TSegmentItem* pSrcSeg = NULL; + int stype = pDestSeg->iSegType; + int sno = pDestSeg->iSegNo; + + if( stype>=SEGTYPE_INTRO ){ + if( nSegNum[stype]>0 ){ + TSegmentItem* pBackup = NULL; + int t = sno / 2, + c = sno % 2; + + for( int j=0; jiSegNo % 2 == c ){ + if( aSegments[stype][j]->iSegNo / 2 == t ){ + pSrcSeg = aSegments[stype][j]; + break; + } + else{ + pBackup = aSegments[stype][j]; + } + } + } + + if( !pSrcSeg ){ + if( pBackup ) + pSrcSeg = pBackup; + else + pSrcSeg = aSegments[stype][0]; //С + } + } + + if( !bMMUndo && ( !pSrcSeg || pSrcSeg->nBars!=pDestSeg->nBars ) ){ + f_MM_AddUndoBefore( -1, NULL ); + + lstAudio = new TAudioTrackList; + g_Audio.CopyTrackList( 0, nBars, lstAudio ); + + bMMUndo = true; + } + } + else{ + if( stype==SEGTYPE_FILL && nSegNum[SEGTYPE_FILL]==0 ){ + stype = SEGTYPE_VAR; + } + else if( stype==SEGTYPE_VAR && nSegNum[SEGTYPE_VAR]==0 ){ + stype = SEGTYPE_FILL; + } + + sno = min( sno, nSegNum[stype]-1 ); + pSrcSeg = aSegments[stype][sno]; + } + + if( pSrcSeg ){ + ReplaceSegment( pDestSeg, pSrcSeg ); + } + else{ //ɾ + RemoveSegment( pDestSeg ); + } + } + + IntegrateStages( 0 ); + + if( bMMUndo ){ + f_MM_AddUndoAfter( -1, NULL ); + } + + TOpusStageList* lstStageAfter = new TOpusStageList; + g_Opus.CopyStages( 0, pDestStyle->nBars-1, lstStageAfter ); + + g_Undo.AddUndo( UNDO_OPUS_STYLE, 0, idLoc, idStyle, (void*)lstStageBefore, + (void*)lstStageAfter ); + + if( bMMUndo ) + g_Undo.SetUndoExtra( 0, 0, 0, (void*)lstAudio, NULL ); + + if( !pDestStyle->IsUnfold() ) + SetFold( pDestStyle, 0 ); + else if( m_pTopItem!=pDestStyle ) + ScrollView( 0, true ); + else + InvalidateRgn( Handle, NULL, false ); + + m_pContentPanel->OnStageChanged( 0, MODE_INIT ); +} +//--------------------------------------------------------------------------- + +void TUseStylePanel::ReplaceSegment( TSegmentItem* pDestSeg, TSegmentItem* pSrcSeg ) +{ + int iStage = FindItemStage( pDestSeg ); + TOpusStage* pStage = g_lstOpusStages[iStage]; + TStyleItem *pStyItem = (TStyleItem*)m_aItems->Items[0]; + + int nBar = pStage->aBars.size(); + if( pSrcSeg->iSegType>=SEGTYPE_INTRO ) + nBar = pSrcSeg->nBars; + + bool bPreChange = g_iPreStage==0; + if( pStage->aBars.size()!=nBar ){ //䳤ȵ + int offset = nBar - pStage->aBars.size(); + int iOrigEnd = FirstBar(iStage) + pStage->aBars.size(); + + if( bPreChange ){ + DuplicateRawBars(); + SendMessage( Parent->Handle, UM_STAGECHANGED, 3, 0 ); + } + + if( offset!=0 && pStage->iSegType==SEGTYPE_INTRO ){ + if( g_Theme.IsWeadup() && !memcmp( g_aAudioTracks[1]->lstBars[iOrigEnd-1]->aVols, + g_aAudioTracks[0]->lstBars[0]->aVols, + POINTS_PER_BAR * sizeof(DWORD) )){ + iOrigEnd--; + } + } + + if( offset>0 ){ //С + for( int i=0; iaBars.push_back(pBar); + + for( int j=1; jlstBars.insert( g_aAudioTracks[j]->lstBars.begin() + iOrigEnd, pWvBar ); + } + } + + for( int j=1; joffset; i-- ){ + delete pStage->aBars.back(); + pStage->aBars.pop_back(); + + for( int j=1; jlstBars[iOrigEnd+i]; + g_aAudioTracks[j]->lstBars.erase( g_aAudioTracks[j]->lstBars.begin() + iOrigEnd+i ); + } + } + + for( int j=1; jnBars += offset; + pStyItem->nBars += offset; + + g_Opus.CountBars(); + } + + if( pDestSeg->iType != pSrcSeg->iType ){ + pStyItem->nSegNum[pDestSeg->iType]--; + pStyItem->nSegNum[pSrcSeg->iType]++; + } + + pDestSeg->iType = pSrcSeg->iType; + pStage->nVol = pDestSeg->volume = pSrcSeg->volume; + pStage->iSegType = pDestSeg->iSegType = pSrcSeg->iSegType; + pStage->iSegNo = pDestSeg->iSegNo = pSrcSeg->iSegNo; + + g_Midi.RemoveStage( iStage, false ); + //tracks + while( pStage->aTracks.size()>0 ){ + delete pStage->aTracks.back(); + pStage->aTracks.pop_back(); + } + + int iSegLine = 0, nTrkBefore = 0, nTrkAfter = 0; + + if( pStyItem->IsUnfold() ){ + TCommonItem *pItem = pStyItem; + while( pItem && pItem!=pDestSeg ){ + iSegLine++; + pItem = GetNextItem( pItem ); + } + + if( pDestSeg->IsUnfold() ){ + if( m_pSelItem && m_pSelItem->up==pDestSeg ){ + m_pSelItem = NULL; + m_iSelLine = -1; + } + + nTrkBefore = pDestSeg->aItems->Count; + nTrkAfter = pSrcSeg->aItems->Count; + + if( m_pTopItem && m_pTopItem->up==pDestSeg ){ + TCommonItem * pItem = m_pTopItem; + int iTopLine = m_iTopLine; + while( pItem!=pDestSeg ){ + iTopLine--; + pItem = GetPrevItem( pItem ); + } + + ScrollView( iTopLine, true ); + } + } + } + + pDestSeg->ClearSubItems(); + DWORD opts = OPT_DEL|OPT_VOL; + if( pDestSeg->iSegTypeaItems->Count; i++ ){ + TTrackItem* pTrkItem = (TTrackItem*)pSrcSeg->aItems->Items[i]; + TTrack * pTrack = new TTrack( pTrkItem->pTrack ); + + pDestSeg->AddTrack( pTrkItem->pStyle, pTrack, opts, false ); + pStage->aTracks.push_back( pTrack ); + + TMidiTrack* pMT = g_Midi.GetValidMidiTrack( iStage, pTrack->iFile, pTrack->iChanNo, + pTrack->iBank, pTrack->iProg ); + pTrack->iFile = pMT->file; + pTrack->iChanSpec = pMT->chno; + } + + bool bDeletedMT = g_Midi.ClearEmptyTrack()>=0; + if( bPreChange || !m_pContentPanel->IsVertical() && ( bDeletedMT + || nMTCount!=g_aMidiTracks.size() )) + m_pContentPanel->InitialVars(); + + m_nTotalLine += nTrkAfter - nTrkBefore; + + if( m_iTopLine>iSegLine ){ + m_iTopLine += nTrkAfter - nTrkBefore; + } + + ResetScrollBar(); + Paint(); +} +//--------------------------------------------------------------------------- + +void TUseStylePanel::DeleteItem( TCommonItem *pItem, int iLine ) +{ + Stop(); + TStyleItem *pStyItem = (TStyleItem*)m_aItems->Items[0]; + + int iStage = FindItemStage( pItem ); + + if( pItem->iType==SEGTYPE_TRACK ){ + DeleteTrack( iStage, (TTrackItem*)pItem, iLine ); + } + else{ + RemoveStage( iStage ); + + if( pStyItem->aItems->Count==0 ){ +// g_Midi.ClearMidiTracks(); + ClearAllItems(); + + g_pUseStyle = NULL; + Paint(); + } + } +} +//--------------------------------------------------------------------------- + +void TUseStylePanel::DeleteTrack( int iStage, TTrackItem* pTrkItem, int iLine ) +{ + TOpusStage* pStage = g_lstOpusStages[iStage]; + for( int i=0; iaTracks.size(); i++ ){ + TTrack* pTrack = pStage->aTracks[i]; + if( pTrkItem->pTrack==pTrack ){ + int iFirstBar = FirstBar( iStage ), + iEndBar = iFirstBar + pStage->aBars.size() - 1; + int iMT= g_Midi.GetMidiTrackIndex( pTrack->iFile, pTrack->iChanSpec ); + + ChangeTexture( iFirstBar, iEndBar, pStage->iSegType, iMT, NULL, SEGTYPE_TRACK ); + + break; + } + } +} +//--------------------------------------------------------------------------- + +TSegmentItem* TUseStylePanel::InsertSegment( int iStage, TSegmentItem* pSrcSeg, int nBars ) +{ + if( m_aItems->Count==0 ){ + g_pUseStyle = AddStyle( ((TTrackItem*)pSrcSeg->aItems->Items[0])->pStyle ); + } + + TStyleItem* pStyleItem = (TStyleItem*)m_aItems->First(); + + int ind = 0; + DWORD opts = OPT_DEL|OPT_VOL; + int stype = pSrcSeg->iSegType; + if( pSrcSeg->iSegType<=SEGTYPE_FILL ){ + stype = SEGTYPE_VAR; + opts |= OPT_BRUSH; + } + + if( iStage<0 || iStage>=pStyleItem->aItems->Count ){ + iStage = pStyleItem->aItems->Count; + + if( pSrcSeg->iSegType<=SEGTYPE_FILL ){ + ind = pStyleItem->nSegNum[SEGTYPE_VAR] + + pStyleItem->nSegNum[SEGTYPE_FILL]; + } + else + ind = pStyleItem->nSegNum[pSrcSeg->iSegType]; + } + else{ + for( int i=0; iaItems->Count; i++ ){ + TSegmentItem* pTmpSeg = (TSegmentItem*)pStyleItem->aItems->Items[i]; + + if( pTmpSeg->iSegType<=SEGTYPE_FILL && stype==SEGTYPE_VAR ){ + if( iiInd++; + } + else if( pTmpSeg->iSegType==stype ){ + if( iiInd++; + } + } + } + + TSegmentItem* pDestSeg = new TSegmentItem( pStyleItem, pSrcSeg->iSegType, pSrcSeg->iSegNo, + opts, nBars, ind, pSrcSeg->volume, false ); + opts = OPT_DEL|OPT_VOL; + if( pSrcSeg->iSegTypeaTracks.size(); i++ ){ + TTrack* pTrack = pStage->aTracks[i]; + pDestSeg->AddTrack( NULL, pTrack, opts, false ); + } + + if( pStyleItem->IsUnfold() ){ + m_nTotalLine++; + + int iTopStage = FindItemStage( m_pTopItem ); + + if( iTopStage>=iStage ){ + m_iTopLine++; + } + } + + pStyleItem->InsertSegment( iStage, pDestSeg, nBars ); + + return pDestSeg; +} +//--------------------------------------------------------------------------- + +void TUseStylePanel::RemoveSegment( TSegmentItem* pItem, bool bSetMM ) +{ + int iStage = FindItemStage( pItem ); + TOpusStage* pStage = g_lstOpusStages[iStage]; + + int iFirstBar = FirstBar(iStage); + int iEndBar = iFirstBar + pStage->aBars.size(); + + if( bSetMM && iEndBar>iFirstBar ){ + if( g_iPreStage==0 ) + DuplicateRawBars(); + + for( int i=1; iFirst(); + + if( m_pTopItem ){ + int iTopStage = FindItemStage( m_pTopItem ); + + if( pStyItem->IsUnfold() ){ + if( iTopStage>iStage ){ + m_iTopLine--; + + if( pItem->IsUnfold() ){ + m_iTopLine -= pItem->aItems->Count; + } + } + else if( iTopStage==iStage && m_pTopItem!=pItem ){ //չTopItemTrack + TCommonItem* pTmpItem = m_pTopItem; + m_pTopItem = GetPrevItem( pItem ); + + while( pTmpItem!=m_pTopItem ){ + m_iTopLine--; + pTmpItem = GetPrevItem( pTmpItem ); + } + } + } + } + + TStylePanel::DeleteItem( pItem, -1 ); + + pStyItem->nBars -= iEndBar - iFirstBar; +} +//--------------------------------------------------------------------------- + +int TUseStylePanel::FindItemStage( TCommonItem* pItem ) +{ + int iStage = -1; + TStyleItem* pStyle = (TStyleItem*)m_aItems->First(); + TSegmentItem* pSeg = NULL; + + if( pItem->iType!=SEGTYPE_STYLE ){ + if( pItem->iType==SEGTYPE_TRACK ) + pSeg = (TSegmentItem*)pItem->up; + else + pSeg = (TSegmentItem*)pItem; + + for( int i=0; iaItems->Count; i++ ){ + if( pSeg==pStyle->aItems->Items[i] ){ + iStage = i; + break; + } + } + } + + return iStage; +} +// --------------------------------------------------------------------------- +/* +TCommonItem* TUseStylePanel::DrawDragStageItem( int iStage ) +{ + TStyleItem* pStyle= (TStyleItem*)m_aItems->First(); + TSegmentItem* pSeg = (TSegmentItem*)pStyle->aItems->Items[iStage]; + + DrawDragImg( pSeg ); + + return pSeg; +} +// --------------------------------------------------------------------------- +*/ +void TUseStylePanel::SetSelectStage( int iStage ) +{ + if( m_aItems->Count==0 ) + return; + + TStyleItem* pStyle = (TStyleItem*)m_aItems->Items[0]; + if( iStage>=0 && iStageaItems->Count ){ + TSegmentItem* pSeg = (TSegmentItem*)pStyle->aItems->Items[iStage]; + + if( !pStyle->IsUnfold() ){ + SetFold( pStyle, 0 ); + } + + TCommonItem* pItem = GetNextItem( pStyle ); + int iLine = 1; + while( pItem!=pSeg ){ + pItem = GetNextItem( pItem ); + iLine++; + } + + SetSelect( pSeg, iLine - m_iTopLine ); + + ShowSelItem(); + } + else{ + SetSelect( NULL, -1 ); + } +} +// --------------------------------------------------------------------------- + +void TUseStylePanel::VolumeChanged( TCommonItem *pItem, char volNew ) +{ + char volOld = pItem->iType==SEGTYPE_TRACK ? ((TTrackItem*)pItem)->pTrack->nVol + : ((TSegmentItem*)pItem)->volume; + + if( volNew==(char)0x80 ){ + if( pItem->IsMute() ) + volNew = volOld & ~0x80; + else + volNew = volOld | 0x80; + } + else if( volOld<0 ){ + volNew |= 0x80; + } + + int iStage = FindItemStage( pItem ); + + if( iStage<0 ) + return; + + ChangeVolume( iStage, pItem, volNew ); +} +// --------------------------------------------------------------------------- + +void TUseStylePanel::ChangeVolume( int iStage, TCommonItem* pItem, char newVol, bool bAddUndo ) +{ + bool bSetUndo = false; + int volBefore, volAfter = newVol, + iUndoType = -1, + iUndoCode = -1; + TTrack* pUndoExt = NULL; + + int iStartBar = FirstBar( iStage ), + iEndBar = iStartBar + g_lstOpusStages[iStage]->aBars.size(); + + TOpusStage* pStage = g_lstOpusStages[iStage]; + TSegmentItem* pSeg = NULL; + TTrackItem* pTrkItem = NULL; + + if( pItem->iType==SEGTYPE_TRACK ){ + pSeg = (TSegmentItem*)pItem->up; + pTrkItem = (TTrackItem*)pItem; + } + else{ + pSeg = (TSegmentItem*)pItem; + + if( bAddUndo ){ + bSetUndo = true; + iUndoType = UNDO_STAGE_VOL; + iUndoCode = MAKELONG( iStage, -1 ); + volBefore = pStage->nVol; + } + + pStage->nVol = pSeg->volume = newVol; + } + + float fSegVol = pSeg->volume / 100.0; + + for( int i=0; iaTracks.size(); i++ ){ + TTrack* pTrk = pStage->aTracks[i]; + + if( pTrkItem ){ + if( pTrk==pTrkItem->pTrack ){ + if( bAddUndo ){ + bSetUndo = true; + iUndoType = UNDO_PROG_VOL; + iUndoCode = MAKELONG( iStage, (pTrk->iFile<<8) + pTrk->iChanSpec ); + volBefore = (char)pTrk->nVol; + pUndoExt = new TTrack( pTrk ); + } + + pTrk->nVol = newVol; + + int vol = pTrk->nVol<0 ? 0 : pTrk->nVol * fSegVol; + f_MM_SetTrackEvent( MIDI_EVENT_VOLUME, iStartBar, iEndBar, + pTrk->iChanSpec, vol, pTrk->iFile ); + + if( m_bPlaying && ( pTrkItem==m_pSelItem )){ + f_MM_SetTrackEvent( MIDI_EVENT_VOLUME, 0, iEndBar-iStartBar, + pTrk->iChanSpec, vol, -1 ); + } + + int iMT = g_Midi.GetMidiTrackIndex( pTrk->iFile, pTrk->iChanSpec ); + g_Midi.ChangeNotesVolume( iMT, iStartBar, iEndBar, vol ); + + if( !m_pContentPanel->IsVertical() ){ + int iShowTrack = m_pContentPanel->GetShowTrackId( ST_MIDI, iMT ); + m_pContentPanel->InvalidateBars( iStartBar, iEndBar-1, BAR_TRACK | iShowTrack ); + } + + break; + } + } + else if( pTrk->nVol>0 ){ + int vol = pTrk->nVol * fSegVol; + + f_MM_SetTrackEvent( MIDI_EVENT_VOLUME, iStartBar, iEndBar, + pTrk->iChanSpec, vol, pTrk->iFile ); + + if( m_bPlaying && pSeg==m_pSelItem->up ){ + f_MM_SetTrackEvent( MIDI_EVENT_VOLUME, 0, iEndBar-iStartBar, + pTrk->iChanSpec, vol, -1 ); + } + + int iMT = g_Midi.GetMidiTrackIndex( pTrk->iFile, pTrk->iChanSpec ); + g_Midi.ChangeNotesVolume( iMT, iStartBar, iEndBar, vol ); + + if( !m_pContentPanel->IsVertical() ){ + int iShowTrack = m_pContentPanel->GetShowTrackId( ST_MIDI, iMT ); + m_pContentPanel->InvalidateBars( iStartBar, iEndBar-1, BAR_TRACK | iShowTrack ); + } + } + } + + if( bSetUndo ){ + TUndoLite* pLite = g_Undo.GetLastLite(); + if( pLite && pLite->iType==iUndoType && pLite->iCode==iUndoCode ){ + bool bMuteCurr = volBefore>=0 && volAfter<0 || volBefore<0 && volAfter>=0, + bMuteLast = ( (int)pLite->pBefore >= 0 && (int)pLite->pAfter < 0 + || (int)pLite->pBefore < 0 && (int)pLite->pAfter >= 0 ); + + if( bMuteCurr==bMuteLast ){ + bSetUndo = false; + + if( (char)pLite->pBefore==volAfter ) + g_Undo.CancelUndo(); + else + pLite->pAfter = (void*)volAfter; + + if( pUndoExt ) + delete pUndoExt; + } + } + + if( bSetUndo ){ + g_Undo.AddUndo( iUndoType, iUndoCode, iStartBar, iEndBar, + (void*)volBefore, (void*)volAfter ); + + if( pUndoExt ) + g_Undo.SetUndoExtra( 0, 0, 0, pUndoExt, NULL ); + } + } + + if( g_iPreStage==0 ){ + g_Theme.Set( g_pUseStyle->pStyle->idLoc, g_pUseStyle->pStyle->idStyle, + g_lstOpusStages ); + } +} +// --------------------------------------------------------------------------- + +bool TUseStylePanel::IntegrateStages( int iStageBegin, bool bSetMM ) +{ + iStageBegin--; + + if( iStageBegin<0 ) + iStageBegin = 0; + + if( g_lstOpusStages.size()==0 ){ + ClearAllItems(); + g_pUseStyle = NULL; + } + + if( g_lstOpusStages.size()<=iStageBegin ){ + return false; + } + + bool bIntegrated = false; + TStyleItem* pStyleItem = (TStyleItem*)m_aItems->First(); + TSegmentItem* pSegItem1 = (TSegmentItem*)pStyleItem->aItems->Items[iStageBegin]; + + TOpusStageList::iterator iterFirst, iterSecond; + iterFirst = iterSecond = g_lstOpusStages.begin() + iStageBegin; + + while( (++iterSecond)!=g_lstOpusStages.end() ){ + TOpusStage *pStage1 = *iterFirst, + *pStage2 = *iterSecond; + TSegmentItem* pSegItem2 = (TSegmentItem*)pSegItem1->next; + + if( pStage1->iSegType<=SEGTYPE_FILL && pStage2->iSegType==pStage1->iSegType + && !DiffStages( pStage1, pStage2 ) ){ + if( !pStage1->aTracks.empty() ){ + int num = pStage1->aTracks.size(); + bool* aMatch = new bool[num]; + memset( aMatch, false, sizeof(bool)*num ); + + for( int i=0; iaTracks[i]; + + for( int j=0; jaTracks[j]; + if( !aMatch[j] && pTrk1->iStyleId==pTrk2->iStyleId + && pTrk1->iStyleLoc==pTrk2->iStyleLoc + && pTrk1->iSegNo==pTrk2->iSegNo + && pTrk1->iChanNo==pTrk2->iChanNo + && pTrk1->iBank==pTrk2->iBank + && pTrk1->iProg==pTrk2->iProg + && pTrk1->nVol==pTrk2->nVol ){ + if( pTrk1->iFile==0xFF && pTrk2->iFile!=0xFF ){ + pTrk1->iFile = pTrk2->iFile; + pTrk1->iChanSpec = pTrk2->iChanSpec; + } + + aMatch[j] = true; + + break; + } + } + } + + delete[] aMatch; + } + + pSegItem1->nBars += pSegItem2->nBars; + for( int i=0; iaBars.size(); i++ ){ + pStage1->aBars.push_back( pStage2->aBars[i] ); + } + pStage2->aBars.clear(); + + g_Opus.ChangeStageBar( iterFirst - g_lstOpusStages.begin(), pSegItem2->nBars, false ); + + RemoveSegment( pSegItem2, bSetMM ); + + bIntegrated = true; + iterSecond = iterFirst; + } + else{ + iterFirst++; + pSegItem1 = (TSegmentItem*)pSegItem1->next; + } + } + + CountStyles(); + + HandleWeakup( iStageBegin, bSetMM ); + + return bIntegrated; +} +//--------------------------------------------------------------------------- + +void TUseStylePanel::HandleWeakup( int iStageBegin, bool bSetMM ) +{ + if( !g_Theme.IsWeadup() || g_aAudioTracks.size()<2 + || g_aAudioTracks[0]->lstBars.empty() + || g_aAudioTracks[1]->lstBars.empty() ) + return; + + TStyleItem* pStyleItem = (TStyleItem*)m_aItems->First(); + TSegmentItem* pSegItem1 = (TSegmentItem*)pStyleItem->aItems->Items[iStageBegin]; + + TOpusStageList::iterator iterFirst, iterSecond; + iterFirst = iterSecond = g_lstOpusStages.begin() + iStageBegin; + + int iFirstBar = FirstBar( iStageBegin ); + + if( iFirstBar==0 ){ + if( pSegItem1->iSegType<=SEGTYPE_FILL ){ + if( m_bAddWeakupBar ){ + TOpusStage *pStage0 = *iterFirst; + if( !memcmp( g_aAudioTracks[1]->lstBars[0]->aVols, + g_aAudioTracks[0]->lstBars[1]->aVols, + POINTS_PER_BAR * sizeof(DWORD) )){ + TBar * pBar0 = new TBar( g_Theme.GetFirstBar() ); + pStage0->aBars.insert( pStage0->aBars.begin(), pBar0 ); + pSegItem1->nBars++; + pStyleItem->nBars++; + + for( int i=1; ilstBars[0] ); + if( bSetMM ) + f_MM_AudioMove( 1, 0, 0, 0, 1, MODE_INSERT ); + } + else{//ӿհС + pWvBar = new TWaveBar; + if( bSetMM ) + f_MM_AudioMove( i, 0, -1, 0, 1, MODE_INSERT ); + } + + g_aAudioTracks[i]->lstBars.insert( g_aAudioTracks[i]->lstBars.begin(), pWvBar ); + } + } + + iFirstBar += pSegItem1->nBars; + iterFirst++; + iterSecond++; + } + } + else{ + m_bAddWeakupBar = true; + } + } + + while( pSegItem1->next && (++iterSecond)!=g_lstOpusStages.end() ){ + TOpusStage *pStage1 = *iterFirst, + *pStage2 = *iterSecond; + TSegmentItem* pSegItem2 = (TSegmentItem*)pSegItem1->next; + + if( pStage1->iSegType==SEGTYPE_INTRO ){ + int iFirstBar2 = iFirstBar + pSegItem2->nBars; + if( pStage2->iSegType<=SEGTYPE_FILL + && !memcmp( g_aAudioTracks[1]->lstBars[iFirstBar2]->aVols, + g_aAudioTracks[0]->lstBars[1]->aVols, + POINTS_PER_BAR * sizeof(DWORD) )){ + bool bCopy = true; + for( int i=0; ilstBars[iFirstBar2-1]->aVols[i]!=0 ){ + bCopy = false; + break; + } + } + + if( bCopy ){ + memcpy( g_aAudioTracks[1]->lstBars[iFirstBar2-1]->aVols, + g_aAudioTracks[0]->lstBars[0]->aVols, + POINTS_PER_BAR * sizeof(DWORD) ); + if( bSetMM ) + f_MM_AudioMove( 1, iFirstBar2-1, 0, 0, 1, MODE_COPY ); + } + } + else{ + if( !memcmp( g_aAudioTracks[1]->lstBars[iFirstBar2-1]->aVols, + g_aAudioTracks[0]->lstBars[0]->aVols, + POINTS_PER_BAR * sizeof(DWORD) )){ + memset( g_aAudioTracks[1]->lstBars[iFirstBar2-1]->aVols, 0, + POINTS_PER_BAR * sizeof(DWORD) ); + + if( bSetMM ) + f_MM_AudioMove( -1, 0, 1, iFirstBar2-1, iFirstBar2, MODE_ERASE ); + } + } + } + + iFirstBar += pSegItem1->nBars; + iterFirst++; + pSegItem1 = (TSegmentItem*)pSegItem1->next; + } +} + +int TUseStylePanel::GetInsertStage( int iInsertBar ) +{ + int iFirstBar, + iDestStage = FindStage( iInsertBar, &iFirstBar ); + + if( iDestStage>=0 ){ + TStyleItem* pStyleItem = (TStyleItem*)m_aItems->First(); + TSegmentItem* pSrcSeg = (TSegmentItem*)pStyleItem->aItems->Items[iDestStage]; + + if( iInsertBar!=iFirstBar ){//ֶβ + int nBarNum = pSrcSeg->nBars - ( iInsertBar - iFirstBar ); + + g_Opus.CutStage( iDestStage, iInsertBar ); + g_Midi.CutStage( iDestStage ); + + InsertSegment( iDestStage+1, pSrcSeg, nBarNum ); + pSrcSeg->nBars -= nBarNum; + pStyleItem->nBars -= nBarNum; + + iDestStage++; + } + } + else if( iInsertBar>0 ){ + iDestStage = g_lstOpusStages.size(); + } + + return iDestStage; +} +//----------------------------------------------------------------------------- + +TTrackItem* TUseStylePanel::AddTrack( TSegmentItem* pSeg, TTrack* pSrcTrk, int iInd ) +{ + TTrackItem* pDestTrk = NULL; + + if( pSeg && pSrcTrk ){ + int nTrksBefore = pSeg->aItems->Count; + TPROSTYLE* info = GetStyleInfo( pSrcTrk->iStyleLoc, pSrcTrk->iStyleId ); + + if( info ){ + DWORD opts = OPT_DEL|OPT_VOL; + if( pSeg->iSegTypeAddTrack( info, pSrcTrk, opts, false, iInd ); + + int nTrksAfter = pSeg->aItems->Count; + if( pSeg->IsUnfold() && nTrksAfter!=nTrksBefore ){ + m_nTotalLine += nTrksAfter-nTrksBefore; + } + } + } + + return pDestTrk; +} + +void __fastcall TUseStylePanel::InsertStage( int iInsertBar, TSegmentItem* pSrcSeg ) +{ + Stop(); + + int iDestStage = GetInsertStage( iInsertBar ); + + TOpusStage* pNewStage = new TOpusStage; + pNewStage->iSegKey = g_iMelodyKey; + pNewStage->iSegNo = pSrcSeg->iSegNo; + pNewStage->iSegType = pSrcSeg->iSegType; + pNewStage->nVol = pSrcSeg->volume; + + int nBarNum = 0; + if( pSrcSeg->iSegType>=SEGTYPE_INTRO ) + nBarNum = pSrcSeg->nBars; + + bool bPreChange = g_iPreStage==0; + if( bPreChange ){ + DuplicateRawBars(); + } + + for( int j=0; jaBars.push_back(pBar); + } + + bool bCountDown = false; + for( int i=1; iaTracks.size(); i++ ){ + TTrack* pTrack = pNewStage->aTracks[i]; + + TMidiTrack* pMT = g_Midi.GetValidMidiTrack( iDestStage, pTrack->iFile, pTrack->iChanNo, + pTrack->iBank, pTrack->iProg ); + pTrack->iFile = pMT->file; + pTrack->iChanSpec = pMT->chno; + } + + if( bPreChange || nMTCountOld!=g_aMidiTracks.size() ) + m_pContentPanel->InitialVars(); + + InsertSegment( iDestStage, pSrcSeg, nBarNum ); + + IntegrateStages( iDestStage ); + + ResetScrollBar(); + Paint(); + + m_pContentPanel->OnStageChanged( iDestStage, MODE_INSERT ); +} +//----------------------------------------------------------------------------- + +void __fastcall TUseStylePanel::RemoveStage( int iStage ) +{ + TStyleItem* pStyle = (TStyleItem*)m_aItems->First(); + TSegmentItem* pSegItem = (TSegmentItem*)pStyle->aItems->Items[iStage]; + + bool bPreChange = g_iPreStage==0; + if( bPreChange ) + DuplicateRawBars(); + + f_MM_AddUndoBefore( -1, NULL ); + + SetBarsUndo( UNDO_BAR_DELETE, FirstBar(iStage), pSegItem->nBars ); + + RemoveSegment( pSegItem ); + + f_MM_AddUndoAfter( -1, NULL ); + + IntegrateStages( iStage ); + + ResetScrollBar(); + Paint(); +// InvalidateRgn( Handle, NULL, false ); + + if( bPreChange ) + m_pContentPanel->InitialVars(); + + m_pContentPanel->OnStageChanged( iStage, MODE_DELETE ); +} +//----------------------------------------------------------------------------- + +void __fastcall TUseStylePanel::MoveBars( int iStartBar, int iEndBar, int iInsertBar, int iMode ) +{ + if( iMode==MODE_MOVE && ( iInsertBar>=iStartBar && iInsertBar<=iEndBar+1 ) )//ƶ + return; + + Stop(); + + bool bPreChange = g_iPreStage==0; + if( bPreChange ) + DuplicateRawBars(); + + int nBars = iEndBar - iStartBar + 1, + nOrigBars = g_Opus.BarCount(); + + if( iMode==MODE_DELETE ){ + SetBarsUndo( UNDO_BAR_DELETE, iStartBar, nBars ); + } + else if( iMode==MODE_MOVE ){ + SetBarsUndo( UNDO_BAR_MOVE, iStartBar, nBars, iInsertBar ); + } + + f_MM_AddUndoBefore( -1, NULL ); + + int iDestStage = GetInsertStage( iInsertBar ), + iSrcStage = FindStage( iStartBar, NULL ), + iFirstChangeStage = (iMode==MODE_MOVE) ? min(iSrcStage, iDestStage) : + (iMode==MODE_DELETE) ? iSrcStage : iDestStage; + + TStyleItem* pStyleItem = (TStyleItem*)m_aItems->First(); + + if( g_Theme.IsWeadup() && iStartBar==0 && iEndBar==0 + && ( iMode==MODE_MOVE || iMode==MODE_DELETE )){ + TOpusStage* pFirstStage = g_lstOpusStages[iSrcStage]; + if( pFirstStage->iSegType<=SEGTYPE_FILL ){ + if( !memcmp( g_aAudioTracks[1]->lstBars[0]->aVols, + g_aAudioTracks[0]->lstBars[0]->aVols, + POINTS_PER_BAR * sizeof(DWORD) )){ + m_bAddWeakupBar = false; + } + } + } + + // Ƶ + bool bCountDown = false; + for( int i=1; iaItems->Items[iSrcStage]; + + TOpusStage* pOriStage = g_lstOpusStages[iSrcStage]; + TOpusStage* pNewStage = (iMode==MODE_DELETE) ? NULL : new TOpusStage; + int nCopyBar = pOriStage->aBars.size() - nOffsetBar; + if( nCopyBar>iEndBar-iBar+1 ) + nCopyBar = iEndBar-iBar+1; + + if( pNewStage ){ + pNewStage->iSegKey = pOriStage->iSegKey; + pNewStage->iSegNo = pOriStage->iSegNo; + pNewStage->iSegType = pOriStage->iSegType; + pNewStage->nVol = pOriStage->nVol; + + for( int i=0; iaTracks.size(); i++ ){ + TTrack * pTrack = new TTrack( pOriStage->aTracks[i] ); + + pNewStage->aTracks.push_back( pTrack ); + } + } + + int iCopyBar = nOffsetBar; + for( int i=0; iaBars[iCopyBar] ); + else + pBar = pOriStage->aBars[iCopyBar]; + + pNewStage->aBars.push_back( pBar ); + } + + if( iMode==MODE_MOVE || iMode==MODE_DELETE ) + pOriStage->aBars.erase( pOriStage->aBars.begin() + iCopyBar ); + else + iCopyBar++; + } + + if( iMode!=MODE_DELETE ){ + g_lstOpusStages.insert( g_lstOpusStages.begin()+iDestStage, pNewStage ); + g_Midi.CutStage( iDestStage ); + InsertSegment( iDestStage, pSrcSeg, nCopyBar ); + } + + if( iMode==MODE_MOVE || iMode==MODE_DELETE ){ + if( iMode==MODE_MOVE && iDestStage<=iSrcStage ) + iSrcStage++; + else{ + iBar -= nCopyBar; + iEndBar -= nCopyBar; + } + + if( pOriStage->aBars.size()==0 ){ //ɾԭ + RemoveSegment( pSrcSeg ); + + if( iMode!=MODE_DELETE && iDestStage>=iSrcStage ) + iDestStage--; + } + else{ + pSrcSeg->nBars -= nCopyBar; + } + + pStyleItem->nBars -= nCopyBar; + } + else if( iDestStage<=iSrcStage ){ + iBar += nCopyBar; + iEndBar += nCopyBar; + } + + g_Opus.CountBars(); + + iBar += nCopyBar; + + if( iMode!=MODE_DELETE ){ + nBarCount += nCopyBar; + iDestStage++; + } + } + + if( iMode!=MODE_MOVE ) + g_Opus.CountBars(); + + IntegrateStages( iFirstChangeStage ); + + f_MM_AddUndoAfter( -1, NULL ); + + if( iMode==MODE_COPY ){ + SetBarsUndo( UNDO_BAR_INSERT, iInsertBar, nBars ); + } + else{ + //ǷAddWeakupBar + bool bAddWeakupBar = false; + int nCurrBars = g_Opus.BarCount(); + + if( iMode==MODE_MOVE && nCurrBars>nOrigBars + || iMode==MODE_DELETE && nCurrBars>nOrigBars-nBars ) + bAddWeakupBar = true; + + if( bAddWeakupBar ) + g_Undo.SetUndoCode( bAddWeakupBar ); + } + + if( iMode==MODE_DELETE ){ + m_pContentPanel->SelectBars( -1, - 1 ); + +/* if( pStyleItem->aItems->Count==0 ){ +// g_Midi.ClearMidiTracks(); + ClearAllItems(); + g_pUseStyle = NULL; + } +*/ + } + else if( iMode==MODE_COPY || iInsertBarSelectBars( iInsertBar, iInsertBar + nBars - 1 ); + } + else if( iInsertBar>iEndBar ){ + m_pContentPanel->SelectBars( iInsertBar - nBars, iInsertBar - 1 ); + } + + ResetScrollBar(); + Paint(); + + bool bDeletedMT = g_Midi.ClearEmptyTrack()>=0; + if( bPreChange || (bDeletedMT || nMTCount!=g_aMidiTracks.size() ) + && !m_pContentPanel->IsVertical() ) + m_pContentPanel->InitialVars(); + + m_pContentPanel->OnStageChanged( bCountDown ? 0 : iFirstChangeStage, iMode ); +} +//----------------------------------------------------------------------------- + +void __fastcall TUseStylePanel::ReformBars( int iStartBarP, int iEndBarP, + TSegmentItem* pSrcSeg, bool bAddUndo ) +{ + Stop(); + + int iStartBar = iStartBarP; + int iChangeStage = -1; + + TOpusStageList* lstStageBefore = NULL; + if( bAddUndo ){ + lstStageBefore = new TOpusStageList; + g_Opus.CopyStages( iStartBarP, iEndBarP, lstStageBefore ); + } + + while( iStartBar<=iEndBarP ){ + int iFirstBar, + iStage = FindStage( iStartBar, &iFirstBar ); + TOpusStage* pOriStage = g_lstOpusStages[iStage]; + + if( pOriStage->iSegType>=SEGTYPE_INTRO ){ + iStartBar = iFirstBar + pOriStage->aBars.size(); + } + else{ + bool bChange = false; + TStyleItem* pStyleItem = (TStyleItem*)m_aItems->First(); + TSegmentItem* pOriSegItem = (TSegmentItem*)pStyleItem->aItems->Items[iStage]; + TSegmentItem* pDestSegItem = NULL; + + if( pOriStage->iSegType==pSrcSeg->iSegType + && pOriStage->iSegNo==pSrcSeg->iSegNo + && pOriStage->nVol==pSrcSeg->volume + && pOriStage->aTracks.size()==pSrcSeg->aItems->Count ){ + if( pOriStage->aTracks.size()>0 ){ + int num = pOriStage->aTracks.size(); + bool* aMatch = new bool[num]; + memset( aMatch, false, sizeof(bool)*num ); + + for( int i=0; iaTracks[i]; + + bool bFound = false; + for( int j=0; jaItems->Items[j])->pTrack; + if( !aMatch[j] && pTrk1->iStyleId==pTrk2->iStyleId + && pTrk1->iStyleLoc==pTrk2->iStyleLoc + && pTrk1->iSegNo==pTrk2->iSegNo + && pTrk1->iChanNo==pTrk2->iChanNo + && pTrk1->iBank==pTrk2->iBank + && pTrk1->iProg==pTrk2->iProg + && pTrk1->nVol==pTrk2->nVol ){ + bFound = true; + aMatch[j] = true; + + break; + } + } + + if( !bFound ){ + bChange = true; + break; + } + } + + delete[] aMatch; + } + } + else + bChange = true; + + if( !bChange ) + iStartBar = iFirstBar + pOriStage->aBars.size(); + else{ + TOpusStage* pBrushStage = NULL; + int iEndBar = iFirstBar + pOriStage->aBars.size()-1; + if( iEndBar>iEndBarP ){ + g_Opus.CutStage( iStage, iEndBarP+1 ); + g_Midi.CutStage( iStage ); + + InsertSegment( iStage+1, pOriSegItem, iEndBar - iEndBarP ); + pOriSegItem->nBars -= iEndBar - iEndBarP; + pStyleItem->nBars -= iEndBar - iEndBarP; + + iEndBar = iEndBarP; + } + + if( iStartBar>iFirstBar ){ + g_Opus.CutStage( iStage, iStartBar ); + g_Midi.CutStage( iStage ); + + pDestSegItem = InsertSegment( iStage+1, pOriSegItem, iEndBar-iStartBar+1 ); + pOriSegItem->nBars -= iEndBar-iStartBar+1; + pStyleItem->nBars -= iEndBar-iStartBar+1; + + iStage++; + } + else{ + pBrushStage = pOriStage; + pDestSegItem = pOriSegItem; + } + + ReplaceSegment( pDestSegItem, pSrcSeg ); + + //g_Opus.CountBars(); + + iStartBar = iEndBar + 1; + + if( iChangeStage<0 ) + iChangeStage = iStage; + } + } + } + + if( iChangeStage>=0 ){ + IntegrateStages( iChangeStage ); + + if( bAddUndo ){ + TOpusStageList* lstStageAfter = new TOpusStageList; + g_Opus.CopyStages( iStartBarP, iEndBarP, lstStageAfter ); + + g_Undo.AddUndo( UNDO_BAR_CHANGE, 0, iStartBarP, iEndBarP, + (void*)lstStageBefore, (void*)lstStageAfter ); + } + + ResetScrollBar(); + Paint(); + + m_pContentPanel->OnStageChanged( iChangeStage, MODE_CHANGE ); + } + else if( lstStageBefore ){ + for( int i=0; isize(); i++ ){ + delete (*lstStageBefore)[i]; + } + + delete lstStageBefore; + } +} + +void __fastcall TUseStylePanel::ReformStage( int iDestStage, TSegmentItem* pSrcSeg ) +{ + Stop(); + + TStyleItem* pStyleItem = (TStyleItem*)m_aItems->First(); + TSegmentItem* pDestSeg = (TSegmentItem*)pStyleItem->aItems->Items[iDestStage]; + + int iStartBar = FirstBar( iDestStage ), + iEndBar = iStartBar + pDestSeg->nBars -1, + nOffset = 0; + bool bMMUndo = false; + + TAudioTrackList* lstAudio = NULL; + TOpusStageList* lstStageBefore = new TOpusStageList; + g_Opus.CopyStages( iStartBar, iEndBar, lstStageBefore ); + + if( pSrcSeg->iSegType>=SEGTYPE_INTRO && pSrcSeg->nBars!=pDestSeg->nBars ){ + nOffset = pSrcSeg->nBars - pDestSeg->nBars; + + if( nOffset<0 ){ //Сڼ٣ƽɾֲ + int nWaveBars = -nOffset; + lstAudio = new TAudioTrackList; + + g_Audio.CopyTrackList( iEndBar+nOffset+1, nWaveBars, lstAudio ); + } + + bMMUndo = true; + } + + if( bMMUndo ){ + f_MM_AddUndoBefore( -1, NULL ); + } + + ReplaceSegment( pDestSeg, pSrcSeg ); + + IntegrateStages( iDestStage ); + +// if( bMMUndo ){ +// f_MM_AddUndoAfter( -1, NULL ); +// } + + TOpusStageList* lstStageAfter = new TOpusStageList; + g_Opus.CopyStages( iStartBar, iEndBar+nOffset, lstStageAfter ); + + g_Undo.AddUndo( UNDO_BAR_CHANGE, 0, iStartBar, iEndBar, + (void*)lstStageBefore, (void*)lstStageAfter ); + + if( bMMUndo ){ + f_MM_AddUndoAfter( -1, NULL ); + g_Undo.SetUndoExtra( nOffset, 0, 0, (void*)lstAudio, NULL ); + } + + ResetScrollBar(); + Paint(); + + m_pContentPanel->OnStageChanged( iDestStage, MODE_CHANGE ); +} +//----------------------------------------------------------------------------- + +void __fastcall TUseStylePanel::InitOpus( TStyleItem* pPreStyle, int iMode ) +{ + // + ClearGlobalVars( LIST_OPUSSTAGES | LIST_OPUSAUDIOS ); + ClearAllItems(); + + g_pUseStyle = NULL; + m_bAddWeakupBar = true; + + if( iMode<0 || !pPreStyle ){ + ClearGlobalVars( LIST_RAWAUDIO ); + m_pContentPanel->InitialVars(); + Paint(); + + return; + } + + if( iMode==0 ){ + UINT idLoc, idStyle; + g_Theme.Get( idLoc, idStyle, g_lstOpusStages ); + + g_pUseStyle = AddStyle( GetStyleInfo( idLoc, idStyle ) ); + + for( int i=0; iHide(false); + + ((TStyleItem*)m_aItems->First())->SetCharge( g_pUseStyle->pStyle->idLoc==0 + && g_pUseStyle->pStyle->pOrigin->cost>0 ); + } + else{ + g_pUseStyle = AddStyle( pPreStyle->pStyle ); + + int iFirstStage = g_Theme.IsWeadup() ? 1 : 0; + int nRepeat = iMode>=2 ? 2 : 1; + + int nSegNum[4]; + vector aSegments[4]; + memset( nSegNum, 0, sizeof(int)*4 ); + + for( int i=0; iaItems->Count; i++ ){ + TSegmentItem* pSegment = (TSegmentItem*)pPreStyle->aItems->Items[i]; + int stype = pSegment->GetSegType(); + aSegments[stype].push_back( pSegment ); + nSegNum[stype]++; + } + + if( g_aAudioTracks[0]->lstBars.size()>0 ){ + DuplicateRawBars(); + + if( iMode==2 ) + MoveAudio( 1, 0, g_aAudioTracks[0]->lstBars.size(), 1, 0, MODE_COPY | OPT_BARS ); + } + + int iSegNo; + int nBarCount = 0; + int nThemeStages = g_Theme.StageCount(); + + while( nRepeat>0 ){ + if( iMode>0 && iMode<=3 && nSegNum[SEGTYPE_INTRO]>0 ){ //ǰ + int iM = iMode>=2 ? 2 : 1; + iSegNo = (iM - nRepeat) % nSegNum[SEGTYPE_INTRO]; + int iChord = g_Theme.GetFirstChord(); + int ctype = LOWORD( iChord ), + key = HIWORD( iChord ); + + if( ctype==3 ) ctype = 1; + else if( ctype>1 ) ctype = 0; + + if( ctype==1 ) + key = ( key + 3 ) % 12; + + TSegmentItem *pSegment = NULL; + TSegmentItem* pBackup = NULL; + + for( int j=0; jiSegNo / 4 == ctype ){ + if( aSegments[SEGTYPE_INTRO][j]->iSegNo % 4 == iSegNo ){ + pSegment = aSegments[SEGTYPE_INTRO][j]; + break; + } + else{ + pBackup = aSegments[SEGTYPE_INTRO][j]; + } + } + } + + if( !pSegment ){ + if( pBackup ) + pSegment = pBackup; + else + pSegment = aSegments[SEGTYPE_INTRO][0]; //С + } + + TOpusStage* pNewStage = new TOpusStage; + pNewStage->iSegNo = pSegment->iSegNo; + pNewStage->iSegType = SEGTYPE_INTRO; + pNewStage->iSegKey = key; + pNewStage->nVol = pSegment->volume; + + int nBarNum = pSegment->nBars; + for( int i=0; iaBars.push_back(pBar); + } + + ProduceTracks( pNewStage, pSegment ); + + g_lstOpusStages.push_back( pNewStage ); + + int nWaveBars = nBarNum; + if( iFirstStage>0 ) + nWaveBars--; + + if( g_aAudioTracks.size()>1 ) + MoveAudio( -1, 0, nWaveBars, 1, nBarCount, MODE_INSERT | OPT_BARS ); + + InsertSegment( -1, pSegment, nBarNum ); + + nBarCount += nBarNum; + } + + //ɲ + iSegNo = 0; + int iStartStage = iFirstStage; + + if( iMode>2 && nRepeat==1 && nThemeStages>iFirstStage + 2 ){ + iStartStage++; + if( nSegNum[SEGTYPE_VAR]>1 ) + iSegNo = 1; + } + + for( int i=iStartStage; iaBars.size(); + + if( i==nThemeStages-1 && nSegNum[SEGTYPE_FILL]>0 && pStage->aBars.size()>1 + && iMode>0 && iMode<=3 && ( nRepeat>0 && nSegNum[SEGTYPE_INTRO]>0 + || nRepeat==0 && nSegNum[SEGTYPE_ENDING]>0 )){ + int iFill = 1 % nSegNum[SEGTYPE_FILL]; + TSegmentItem *pSegFill = aSegments[SEGTYPE_FILL][iFill]; + TOpusStage * pFillStage = new TOpusStage; + + pFillStage->iSegType = SEGTYPE_FILL; + pFillStage->iSegNo = pSegFill->iSegNo; + pFillStage->iSegKey = pStage->iSegKey; + pFillStage->nVol = pStage->nVol; + pFillStage->aBars.push_back( pStage->aBars.back() ); + + pStage->aBars.pop_back(); + pSegItem->nBars--; + g_pUseStyle->nBars--; + + ProduceTracks( pFillStage, pSegFill ); + + g_lstOpusStages.push_back( pFillStage ); + + AddStage( pFillStage ); + } + } + + nRepeat--; + } + + if( iMode<=3 && nSegNum[SEGTYPE_ENDING]>0 ){ //β + int iChord = g_Theme.GetLastChord(); + int ctype = LOWORD( iChord ), + key = HIWORD( iChord ); + + if( ctype==3 ) ctype = 1; + else if( ctype>1 ) ctype = 0; + + if( ctype==1 ) + key = ( key + 3 ) % 12; + + TSegmentItem *pSegment = NULL; + + for( int j=0; jiSegNo / 4 == ctype ){ + pSegment = aSegments[SEGTYPE_ENDING][j]; + break; + } + } + + if( !pSegment ){ + pSegment = aSegments[SEGTYPE_ENDING][0]; //С + } + + TOpusStage* pNewStage = new TOpusStage; + pNewStage->iSegType = SEGTYPE_ENDING; + pNewStage->iSegNo = pSegment->iSegNo; + pNewStage->iSegKey = key; + pNewStage->nVol = pSegment->volume; + + int nBarNum = pSegment->nBars; + for( int i=0; iaBars.push_back(pBar); + } + + ProduceTracks( pNewStage, pSegment ); + + g_lstOpusStages.push_back( pNewStage ); + + if( g_aAudioTracks.size()>1 ) + MoveAudio( -1, 0, nBarNum, 1, nBarCount, MODE_INSERT | OPT_BARS ); + + InsertSegment( -1, pSegment, nBarNum ); + + nBarCount += nBarNum; + } + } + + g_Opus.CountBars(); + IntegrateStages( 0 ); + g_Midi.SortMidiTracks(); + + SetFold( (TCommonItem*)m_aItems->First(), 0 ); + + ResetScrollBar(); + Paint(); +// InvalidateRgn( Handle, NULL, false ); + + m_pContentPanel->OnStageChanged( 0, MODE_INIT ); +} +// --------------------------------------------------------------------------- + +void __fastcall TUseStylePanel::SetStyleItem( TStyleItem* pStyItem ) +{ + TStylePanel::SetStyleItem( pStyItem ); + + if( pStyItem ){ + IntegrateStages( 0, false ); + if( g_Midi.IsEmpty() ) + g_Midi.SortMidiTracks(); + } +} +// --------------------------------------------------------------------------- + +void TUseStylePanel::RestoreItems() +{ + for( int i=0; iaBars.push_back( pNewBar ); //һС + + int iBarT1 = iInsertBar; + // + if( g_bWeakup ){ + if( iInsertBar>0 ){ + int iFirstBar, + iLastStage = FindStage( iInsertBar-1, &iFirstBar ); + TOpusStage *pLastStage = g_lstOpusStages[iLastStage]; + if( pLastStage->iSegType>SEGTYPE_FILL + && !memcmp( g_aAudioTracks[1]->lstBars[iInsertBar-1]->aVols, + g_aAudioTracks[0]->lstBars[0]->aVols, + POINTS_PER_BAR * sizeof(DWORD) )){ + iBarT1--; + } + } + } + + bool bCountDown = false; + for( int i=1; iFirst(); + + //ǰСλȷ + TSegmentItem *pSrcSeg = NULL; + int iFirstBar1, iFirstBar2, + iLastStage = FindStage( iInsertBar-1, &iFirstBar1 ), + iNextStage = FindStage( iInsertBar, &iFirstBar2 ); + TOpusStage *pLastStage = iLastStage>=0 ? g_lstOpusStages[iLastStage] : NULL, + *pNextStage = g_lstOpusStages[iNextStage]; + + //ǷǰһСڿ + if( pLastStage && pLastStage->iSegType<=SEGTYPE_FILL ){ + pNewStage->iSegKey = pLastStage->iSegKey; + + TBar *pLastBar = pLastStage->aBars[iInsertBar-iFirstBar1-1]; + pNewBar->iBarKey = pLastBar->iBarKey; + + for( int i=0; iaChords.iKey[i] = pLastBar->aChords.iKey[g_nChordNumPerBar-1]; + pNewBar->aChords.iType[i] = pLastBar->aChords.iType[g_nChordNumPerBar-1]; + } + pSrcSeg = (TSegmentItem*)pStyleItem->aItems->Items[iLastStage]; + } + else if( pNextStage->iSegType<=SEGTYPE_FILL ){ //ǷһСڿ + pNewStage->iSegKey = pNextStage->iSegKey; + + TBar *pNextBar = pNextStage->aBars[iInsertBar-iFirstBar2]; + pNewBar->iBarKey = pNextBar->iBarKey; + + for( int i=0; iaChords.iKey[i] = pNextBar->aChords.iKey[0]; + pNewBar->aChords.iType[i] = pNextBar->aChords.iType[0]; + } + pSrcSeg = (TSegmentItem*)pStyleItem->aItems->Items[iNextStage]; + } + else{ //ǰСڽԲ + int iSegKey, + iKey, + iType = 0; + + if( pLastStage ){ + iKey = pNewBar->iBarKey = pNewStage->iSegKey = pLastStage->iSegKey; + + if( pLastStage->iSegNo % 2 > 0 ){ + iKey = ( iKey + 9 ) % 12; + iType = 1; + } + } + else{ + iKey = pNewBar->iBarKey = pNewStage->iSegKey = pNextStage->iSegKey; + + if( pNextStage->iSegNo % 2 > 0 ){ //С + iKey = ( iKey + 9 ) % 12; + iType = 1; + } + } + + for( int i=0; iaChords.iKey[i] = iKey; + pNewBar->aChords.iType[i] = iType; + } + + for( int i=0; iaItems->Count; i++ ){ + TSegmentItem* pSegment = (TSegmentItem*)g_pPreStyle->aItems->Items[i]; + int stype = pSegment->GetSegType(); + if( stype==SEGTYPE_VAR || stype==SEGTYPE_FILL ){ + pSrcSeg = pSegment; + break; + } + } + } + + pNewStage->iSegType = pSrcSeg->iSegType; + pNewStage->iSegNo = pSrcSeg->iSegNo; + +// ProduceTracks( pNewStage, pSrcSeg ); + + g_Opus.InsertStage( iDestStage, pNewStage ); + g_Midi.InsertStage( iDestStage ); + + InsertSegment( iDestStage, pSrcSeg, 1 ); + + IntegrateStages( iDestStage ); + + ResetScrollBar(); + Paint(); + + m_pContentPanel->OnStageChanged( iDestStage, MODE_INSERT ); +} +// --------------------------------------------------------------------------- + +void TUseStylePanel::CountStyles() +{ + m_aStyles.clear(); + if( m_aItems->Count==0 ) + return; + + TStyleItem* pStyItem = (TStyleItem*)m_aItems->First(); + TPROSTYLE* pStyle = pStyItem->pStyle, + *pMainStyle = NULL; + + vector lstCount; + for( int i=0; iaItems->Count; i++ ){ + TSegmentItem* pSeg = (TSegmentItem*)pStyItem->aItems->Items[i]; + for( int j=0; jaItems->Count; j++ ){ + TTrackItem* pTrk = (TTrackItem*)pSeg->aItems->Items[j]; + + bool bMatch = false; + for( int k=0; kpStyle->idLoc==m_aStyles[k]->idLoc +// && pTrk->pStyle->idStyle==m_aStyles[k]->idStyle ){ + if( pTrk->pStyle==m_aStyles[k] ){ + bMatch = true; + lstCount[k]++; + break; + } + } + + if( !bMatch ){ + m_aStyles.push_back( pTrk->pStyle ); + lstCount.push_back( 1 ); + } + } + } + + bool bKeep = false; + bool bCharge = false; + int maxCount = 0; + for( int i=0; imaxCount ){ + maxCount = lstCount[i]; + pMainStyle = m_aStyles[i]; + } + + if( pStyle && pStyle->idLoc==m_aStyles[i]->idLoc + && pStyle->idStyle==m_aStyles[i]->idStyle ){ + bKeep = true; + } + + if( !bCharge && m_aStyles[i]->idLoc==0 + && m_aStyles[i]->pOrigin->cost>0 ){ + bCharge = true; + } + } + + if( !pStyle || !bKeep ){ + pStyItem->pStyle = pMainStyle; + + if( m_pTopItem==pStyItem ) + DrawItem( pStyItem, 0, -1 ); + } + + pStyItem->SetCharge( bCharge ); +} +// --------------------------------------------------------------------------- + +void TUseStylePanel::CopyUndoBars( int iStartBar, int iEndBar, TOpusStageList* lstStages, + TAudioTrackList* lstAudio, bool bFx ) +{ + if( lstStages ) + g_Opus.CopyStages( iStartBar, iEndBar, lstStages ); + + if( lstAudio ) + g_Audio.CopyTrackList( iStartBar, iEndBar-iStartBar+1, lstAudio, bFx ); +} + +void TUseStylePanel::CopyBars( int iStartBar, int iEndBar, TOpusStageList* lstStages, + TSegmentList* lstSegments, TAudioTrackList* lstAudio ) +{ + int iBar = iStartBar; + + while( iBar<=iEndBar ){ + int iFirstBar, iSrcStage = FindStage( iBar, &iFirstBar ), + nOffsetBar = iBar-iFirstBar; + TOpusStage* pOriStage = g_lstOpusStages[iSrcStage]; + int nCopyBar = pOriStage->aBars.size() - nOffsetBar; + + if( nCopyBar>iEndBar-iBar+1 ) + nCopyBar = iEndBar-iBar+1; + + if( lstStages ){ + TOpusStage* pNewStage = new TOpusStage( pOriStage ); + + for( int i=nOffsetBar; iaBars.push_back( new TBar( pOriStage->aBars[i] ) ); + } + + for( int j=0; jaTracks.size(); j++ ){ + pNewStage->aTracks.push_back( new TTrack( pOriStage->aTracks[j] )); + } + + lstStages->push_back( pNewStage ); + } + + iBar += nCopyBar; + } + + if( lstAudio ){ + for( int i=1; ipush_back( pAudio ); + } + } +} +// --------------------------------------------------------------------------- +/* +void TUseStylePanel::InsertStages( int iInsertBar, TOpusStageList lstStages ) +{ + int iDestStage = GetInsertStage( iInsertBar ); + + for( int i=lstStages.size()-1; i>=0; i-- ){ + TOpusStage* pStage = lstStages[i]; + g_lstOpusStages.insert( g_lstOpusStages.begin()+iDestStage, pStage ); + } +} +// --------------------------------------------------------------------------- +*/ +void TUseStylePanel::DeleteBars( int iStartBarP, int iEndBarP, bool bDelWave ) +{ + TStyleItem* pStyItem = (TStyleItem*)m_aItems->First(); + int iBar = iStartBarP, + iEndBar = iEndBarP; + + while( iBar<=iEndBar ){ + int iFirstBar, iSrcStage = FindStage( iBar, &iFirstBar ), + nOffsetBar = iBar-iFirstBar; + + TSegmentItem* pSrcSeg = (TSegmentItem*)pStyItem->aItems->Items[iSrcStage]; + TOpusStage* pOriStage = g_lstOpusStages[iSrcStage]; + + int nDelBar = pOriStage->aBars.size() - nOffsetBar; + if( nDelBar>iEndBar-iBar+1 ) + nDelBar = iEndBar-iBar+1; + + pOriStage->aBars.erase( pOriStage->aBars.begin() + nOffsetBar, + pOriStage->aBars.begin() + nOffsetBar + nDelBar ); + iEndBar -= nDelBar; + + g_Opus.ChangeStageBar( iSrcStage, -nDelBar, true ); + + if( pOriStage->aBars.empty() ){ //ɾԭ + RemoveSegment( pSrcSeg, false ); + } + else{ + pSrcSeg->nBars -= nDelBar; + } + + pStyItem->nBars -= nDelBar; + } + +// g_Opus.CountBars(); + + if( bDelWave ){ + for( int i=1; ilstEffects, iStartBarP, iEndBarP+1 ); + } + } + + m_pContentPanel->SelectBars( -1, -1 ); +} +// --------------------------------------------------------------------------- + +void TUseStylePanel::Undo( bool bUndo ) +{ + if( m_VolTrackBar ){ + delete m_VolTrackBar; + m_VolTrackBar = NULL; + } + + int iMode=-1, iChangeStage = 0; + TUndoLite* pLite = bUndo ? g_Undo.Undo() : g_Undo.Redo(); + int iType = pLite->iType; + + if( ( iTypeUNDO_MIDI_FONT ) + && ( iTypeUNDO_TRKMID_DELALL ) + && VIEW_STYLE!=g_iViewMode ) + Application->MainForm->Perform( UM_SETVIEWMODE, VIEW_STYLE, 0 ); + + if( iType!=UNDO_STAGE_VOL ) + Stop(); + + if( iType>=UNDO_BAR_INSERT && iType<=UNDO_BAR_CHANGE ){ + if( bUndo && pLite->iCode>0 ){ //AddWeakupBar + m_bAddWeakupBar = true; + + //ɾһС + for( int i=1; ilstBars[0]; + pAT->lstBars.erase( pAT->lstBars.begin() ); + } + + TOpusStage* pStage = g_lstOpusStages[0]; + delete pStage->aBars[0]; + pStage->aBars.erase( pStage->aBars.begin() ); + g_Opus.CountBars(); + + TStyleItem* pStyItem = (TStyleItem*)m_aItems->First(); + TSegmentItem* pSegment = (TSegmentItem*)pStyItem->aItems->Items[0]; + pSegment->nBars--; + pStyItem->nBars--; + } + + int iDelStart = pLite->iBegin, + iDelEnd = pLite->iEnd, + iInsStart = pLite->iBegin, + iInsEnd = pLite->iEnd, + nBars = pLite->iEnd - pLite->iBegin + 1; + + TOpusStageList* lstStages = ( iType>=UNDO_BAR_CHANGE && !bUndo || iType==UNDO_BAR_INSERT ) + ? (TOpusStageList*)pLite->pAfter + : (TOpusStageList*)pLite->pBefore; + + if( iTypeiExt1 ) + f_MM_Undo( bUndo ); + + if( iType==UNDO_BAR_INSERT && bUndo + || iType==UNDO_BAR_DELETE && !bUndo ){ + iMode = MODE_DELETE; + } + else if( iType==UNDO_BAR_INSERT && !bUndo + || iType==UNDO_BAR_DELETE && bUndo ){ + iMode = MODE_INSERT; + } + else if( iType==UNDO_BAR_MOVE ){ + iMode = MODE_MOVE; + + if( bUndo ){ + iDelStart = pLite->iExt1; + iDelEnd = iDelStart + nBars - 1; + } + else{ + iInsStart = pLite->iExt1; + iInsEnd = iInsStart + nBars - 1; + } + } + else{ + iMode = MODE_CHANGE; + + if( bUndo ) + iDelEnd += pLite->iExt1; + else + iInsEnd += pLite->iExt1; + } + + iChangeStage = FindStage( min( iDelStart, iInsStart ), NULL ); + + int nMTCount = g_aMidiTracks.size(); + if( iMode==MODE_DELETE || iMode==MODE_MOVE || iMode==MODE_CHANGE ){ + DeleteBars( iDelStart, iDelEnd, iMode==MODE_CHANGE ? false : true ); + } + + if( iMode==MODE_INSERT || iMode==MODE_MOVE || iMode==MODE_CHANGE ){ + //ԭ + if( iMode==MODE_INSERT || iMode==MODE_MOVE ){ + TAudioTrackList* lstAudio = (TAudioTrackList*)pLite->pExt1; + + for( int i=1; i iDelEnd ){ + TAudioTrackList* lstAudio = (TAudioTrackList*)pLite->pExt1; + for( int i=1; iiSegType = pStage->iSegType; + pSegment->iSegNo = pStage->iSegNo; + pSegment->volume = pStage->nVol; + pSegment->nBars = pStage->aBars.size(); + + DWORD opts = OPT_DEL|OPT_VOL; + if( pStage->iSegTypeaTracks.size(); i++ ){ + TTrack* pTrack = pStage->aTracks[i]; + + TPROSTYLE* pStyle = GetStyleInfo( pTrack->iStyleLoc, pTrack->iStyleId ); + if( pStyle ){ + pSegment->AddTrack( pStyle, pTrack, opts, false ); + + TMidiTrack* pMT = g_Midi.GetValidMidiTrack( iStage, pTrack->iFile, pTrack->iChanSpec, + pTrack->iBank, pTrack->iProg ); + pTrack->iFile = pMT->file; + pTrack->iChanSpec = pMT->chno; + } + else{ + DebugPrint( "ļʧЧ\n" ); + + delete pTrack; + pStage->aTracks.erase( pStage->aTracks.begin() + i ); + i--; + } + } + + InsertSegment( iStage, pSegment, pStage->aBars.size() ); + delete pSegment; + + iStage++; + } + + m_pContentPanel->SelectBars( iInsStart, iInsEnd ); + } + + IntegrateStages( iChangeStage, false ); + + ResetScrollBar(); + Paint(); + + bool bDeletedMT = g_Midi.ClearEmptyTrack()>=0; + if( m_pContentPanel->IsVertical() && nBars==g_Opus.BarCount() || + !m_pContentPanel->IsVertical() && ( bDeletedMT || nMTCount!=g_aMidiTracks.size()) ){ + m_pContentPanel->InitialVars(); + } + +// if( !m_pContentPanel->IsVertical() ) +// GenerateCompose(); + } + else if( iType==UNDO_TRKMID_DELALL ){ + if( m_pContentPanel->IsVertical() ){ + if( pLite->iCode==ST_MIDI ) + m_pContentPanel->SetScrollMode( false ); + } + TOpusStageList* lstStages = bUndo ? (TOpusStageList*)pLite->pBefore + : (TOpusStageList*)pLite->pAfter; + TMidiTrackList *lstTracks = bUndo ? (TMidiTrackList*)pLite->pExt1 : NULL; + UINT idLoc = bUndo ? pLite->iExt1 : pLite->iExt2, + idStyle = bUndo ? pLite->iBegin : pLite->iEnd; + + ClearAllItems(); + g_Midi.ClearMidiTracks(); + + if( lstTracks ){ + for( int i=0; isize(); i++ ){ + TMidiTrack* pMT = new TMidiTrack((*lstTracks)[i]); + g_Midi.AddMidiTrack( pMT ); + } + } + + g_Opus.Set( idLoc, idStyle, *lstStages ); + g_Midi.SortMidiTracks(); + g_Opus.BuildStyleItem(); + TStylePanel::SetStyleItem( g_pUseStyle ); + + ResetScrollBar(); + Paint(); + + if( !m_pContentPanel->IsVertical() ){ + m_pContentPanel->InitialVars(); + GenerateCompose(); + } + else if( g_iSegColorMode==1 ){ + m_pContentPanel->InvalidateBars( 0, g_Opus.BarCount()-1, BAR_DATA ); + } + + if( g_iPreStage==0 ){ + g_Theme.Set( g_pUseStyle->pStyle->idLoc, g_pUseStyle->pStyle->idStyle, + g_lstOpusStages ); + } + } + else if( iType>=UNDO_MIDI_ADD && iType<=UNDO_MIDI_FONT || iType==UNDO_TRKMID_ADD || iType==UNDO_TRKMID_DEL ){ + if( m_pContentPanel->IsVertical() ){ + if( pLite->iCode==ST_MIDI ) + m_pContentPanel->SetScrollMode( false ); + else if( VIEW_STYLE!=g_iViewMode ) + Application->MainForm->Perform( UM_SETVIEWMODE, VIEW_STYLE, 0 ); + } + + vector *aAddStage = (vector*)( bUndo ? pLite->pExt1 : pLite->pExt2 ), + *aDelStage = (vector*)( bUndo ? pLite->pExt2 : pLite->pExt1 ); + TTrack *aAddTrks = bUndo ? (TTrack*)pLite->pBefore : (TTrack*)pLite->pAfter; + + int iSBar = pLite->iBegin, + iEBar = pLite->iEnd, + iBStage = iSBar<0 ? 0 : GetInsertStage( iSBar ), + infoAdd = bUndo ? pLite->iExt1 : pLite->iExt2, + infoDel = bUndo ? pLite->iExt2 : pLite->iExt1, + iAddMT = infoAdd==-1 ? -1 : (infoAdd & 0xFF), + iDelMT = infoDel==-1 ? -1 : (infoDel & 0xFF); + BYTE iAddMTState = infoAdd==-1 ? 0 : (infoAdd & 0xFF00)>>8, + iAddMTVol = infoAdd==-1 ? 0 : (infoAdd & 0xFF0000)>>16; + char iAddMTPan = infoAdd==-1 ? 0 : (infoAdd & 0xFF000000)>>24; + + if( iEBar>=0 ) + GetInsertStage( iEBar+1 ); + + TMidiTrack *pDelMT = NULL, *pAddMT = NULL; + if( iDelMT>=0 && iDelMT=0 && iAddMT::iterator itAdd = aAddStage->begin(), + itDel = aDelStage->begin(); + int iAddStage(-1), iAddTrack(-1), + iDelStage(-1), iDelTrack(-1); + + if( itAdd!=aAddStage->end() ){ + int iFBar = (*itAdd) & 0xFFF, + iLBar = ((*itAdd) & 0xFFF000)>>12; + + iAddTrack = ((*itAdd) & 0xFF000000)>>24; + iAddStage = GetInsertStage( iFBar ); + GetInsertStage( iLBar+1 ); + } + + if( itDel!=aDelStage->end() ){ + int iFBar = (*itDel) & 0xFFF, + iLBar = ((*itDel) & 0xFFF000)>>12; + + iDelTrack = ((*itDel) & 0xFF000000)>>24; + iDelStage = GetInsertStage( iFBar ); + GetInsertStage( iLBar+1 ); + } + + bool bAddedMT = false; + TStyleItem* pStyItem = (TStyleItem*)m_aItems->First(); + while( itAdd!=aAddStage->end() || itDel!=aDelStage->end() ){ + if( iDelStage>=0 && (iAddStage<0 || iDelStageaTracks[iDelTrack]; + + if( !pDelMT || pDelMT->file!=pTrack->iFile || pDelMT->chno!=pTrack->iChanSpec ){ + pDelMT = g_Midi.FindMidiTrack( pTrack->iFile, pTrack->iChanSpec ); + } + + delete pTrack; + pStage->aTracks.erase( pStage->aTracks.begin()+iDelTrack ); + + TSegmentItem* pSegment = (TSegmentItem*)pStyItem->aItems->Items[iDelStage]; + TTrackItem* pTrkItem = (TTrackItem*)pSegment->aItems->Items[iDelTrack]; + TStylePanel::DeleteItem( pTrkItem, -1 ); + + pDelMT->DelStage( iDelStage ); + + if( ++itDel!=aDelStage->end() ){ + int iFBar = (*itDel) & 0xFFF, + iLBar = ((*itDel) & 0xFFF000)>>12; + + iDelTrack = ((*itDel) & 0xFF000000)>>24; + iDelStage = GetInsertStage( iFBar ); + GetInsertStage( iLBar+1 ); + } + else{ + iDelStage = -1; + iDelTrack = -1; + } + } + else if( iDelStage>=0 && iDelStage==iAddStage ){ + TOpusStage* pStage = g_lstOpusStages[iDelStage]; + TTrack *pTrack = pStage->aTracks[iDelTrack], + *pSubTrack = &aAddTrks[itAdd - aAddStage->begin()]; + + if( !pDelMT || pDelMT->file!=pTrack->iFile || pDelMT->chno!=pTrack->iChanSpec ){ + pDelMT = g_Midi.FindMidiTrack( pTrack->iFile, pTrack->iChanSpec ); + } + + if( pSubTrack->iFile!=pDelMT->file || pSubTrack->iChanSpec!=pDelMT->chno ){ + if( !pAddMT || pAddMT->file!=pSubTrack->iFile || pAddMT->chno!=pSubTrack->iChanSpec + || pAddMT->prog!=pSubTrack->iProg + || !( pAddMT=g_Midi.FindMidiTrack( pSubTrack->iFile, pSubTrack->iChanSpec )) ){ + pAddMT = new TMidiTrack( pSubTrack->iBank, pSubTrack->iChanSpec, pSubTrack->iProg, pSubTrack->iFile ); + pAddMT->state = iAddMTState; + pAddMT->volume = iAddMTVol; + pAddMT->pan = iAddMTPan; + g_Midi.AddMidiTrack( pAddMT, iAddMT ); + + bAddedMT = true; + } + + pDelMT->DelStage( iDelStage ); + pAddMT->AddStage( iAddStage ); + } + else if( pAddMT==pDelMT && pSubTrack->iProg!=pAddMT->prog ){ + pAddMT->prog = pSubTrack->iProg; + } + + if( pTrack->iStyleLoc!=pSubTrack->iStyleLoc + || pTrack->iStyleId!=pSubTrack->iStyleId ){ + TSegmentItem* pSeg = (TSegmentItem*)pStyItem->aItems->Items[iDelStage]; + TTrackItem* pTrkItem = (TTrackItem*)pSeg->aItems->Items[iDelTrack]; + pTrkItem->pStyle = GetStyleInfo( pSubTrack->iStyleLoc, pSubTrack->iStyleId ); + } + + memcpy( pTrack, pSubTrack, sizeof(TTrack) ); + + if( ++itAdd!=aAddStage->end() ){ + int iFBar = (*itAdd) & 0xFFF, + iLBar = ((*itAdd) & 0xFFF000)>>12; + + iAddTrack = ((*itAdd) & 0xFF000000)>>24; + iAddStage = GetInsertStage( iFBar ); + GetInsertStage( iLBar+1 ); + } + else{ + iAddStage = -1, + iAddTrack = -1; + } + + if( ++itDel!=aDelStage->end() ){ + int iFBar = (*itDel) & 0xFFF, + iLBar = ((*itDel) & 0xFFF000)>>12; + + iDelTrack = ((*itDel) & 0xFF000000)>>24; + iDelStage = GetInsertStage( iFBar ); + GetInsertStage( iLBar+1 ); + } + else{ + iDelStage = -1; + iDelTrack = -1; + } + } + else if( iAddStage>=0 && ( iDelStage<0 || iDelStage>iAddStage ) ){ + TTrack* pTrack = new TTrack( &aAddTrks[itAdd - aAddStage->begin()] ); + + if( !pAddMT || pAddMT->file!=pTrack->iFile || pAddMT->chno!=pTrack->iChanSpec + || !( pAddMT=g_Midi.FindMidiTrack( pTrack->iFile, pTrack->iChanSpec )) ){ + pAddMT = new TMidiTrack( pTrack->iBank, pTrack->iChanSpec, pTrack->iProg, pTrack->iFile ); + pAddMT->state = iAddMTState; + pAddMT->volume = iAddMTVol; + pAddMT->pan = iAddMTPan; + g_Midi.AddMidiTrack( pAddMT, iAddMT ); + + bAddedMT = true; + } + + TOpusStage* pStage = g_lstOpusStages[iAddStage]; + TSegmentItem* pSeg = (TSegmentItem*)pStyItem->aItems->Items[iAddStage]; + + pStage->aTracks.insert( pStage->aTracks.begin()+iAddTrack, pTrack ); + AddTrack( pSeg, pTrack, iAddTrack ); + pAddMT->AddStage( iAddStage ); + + if( ++itAdd!=aAddStage->end() ){ + int iFBar = (*itAdd) & 0xFFF, + iLBar = ((*itAdd) & 0xFFF000)>>12; + + iAddTrack = ((*itAdd) & 0xFF000000)>>24; + iAddStage = GetInsertStage( iFBar ); + GetInsertStage( iLBar+1 ); + } + else{ + iAddStage = -1, + iAddTrack = -1; + } + } + } + + IntegrateStages( iBStage, false ); + + ResetScrollBar(); + Paint(); + + bool bDeletedMT = g_Midi.ClearEmptyTrack()>=0; + if( !m_pContentPanel->IsVertical() ){ + if( bDeletedMT || bAddedMT ){ + m_pContentPanel->InitialVars(); + } + else{ + if( iDelMT>=0 ){ + int iST = m_pContentPanel->GetShowTrackId( ST_MIDI, iDelMT ); + if( iST>0 ) + m_pContentPanel->InvalidateBars( iSBar, iEBar, BAR_TRACK | iST ); + } + } + + if( iAddMT>=0 && !aAddStage->empty() || iDelMT>=0 && !bDeletedMT ){ + if( VIEW_TRACK!=g_iViewMode ) + Application->MainForm->Perform( UM_SETVIEWMODE, VIEW_TRACK, 0 ); + + if( iAddMT==iDelMT ) + m_pContentPanel->SelectTrack( -1, -1, -1, false ); + + int iMT = iAddMT>=0 && !aAddStage->empty() ? iAddMT : iDelMT, + iST = m_pContentPanel->GetShowTrackId( ST_MIDI, iMT ); + + if( iST>0 ){ + m_pContentPanel->SelectTrack( iST-1, -1, -1, false ); + m_pContentPanel->SetSelectRange( iSBar, 0, iEBar, POINTS_PER_BAR-1, true ); + } + } + + GenerateCompose(); + } + + if( g_iSegColorMode==1 && iType!=UNDO_MIDI_FONT ) + m_pContentPanel->InvalidateBars( iSBar, iEBar, BAR_DATA ); + + } + else if( iType==UNDO_OPUS_STYLE ){ //ȫ滻 + iMode = MODE_INIT; + + TAudioTrackList* lstAudio = (TAudioTrackList*)pLite->pExt1; + TOpusStageList* lstStages = (TOpusStageList*)( bUndo ? pLite->pBefore + : pLite->pAfter ); + if( lstAudio ){ + f_MM_Undo( bUndo ); + } + + g_Audio.RestoreAudio( lstStages, lstAudio, bUndo ); + + g_Opus.Set( pLite->iBegin, pLite->iEnd, *lstStages ); + g_Opus.BuildStyleItem(); + g_Midi.ClearMidiTracks(); + + SetStyleItem( g_pUseStyle ); + + if( g_iPreStage==0 ){ + g_Theme.Set( g_pUseStyle->pStyle->idLoc, g_pUseStyle->pStyle->idStyle, + g_lstOpusStages ); + } + } + else if( iType==UNDO_STAGE_VOL || iType==UNDO_PROG_VOL ){ + int iStage = GetInsertStage( pLite->iBegin ), + nStageLen = pLite->iEnd - pLite->iBegin; + + TStyleItem* pStyItem = (TStyleItem*)m_aItems->First(); + TSegmentItem* pTempSeg = (TSegmentItem*)pStyItem->aItems->Items[iStage]; + + if( pTempSeg->iSegTypenBars>nStageLen ) + GetInsertStage( pLite->iEnd ); + + TSegmentItem* pSegItem = (TSegmentItem*)pStyItem->aItems->Items[iStage]; + + int iSet = (int)(bUndo ? pLite->pBefore : pLite->pAfter ), + iOther = (int)(!bUndo ? pLite->pBefore : pLite->pAfter ); + + TCommonItem* pSetItem = NULL; + + if( iType==UNDO_STAGE_VOL ){ + SetSelectStage( iStage ); + pSetItem = pSegItem; + } + else{ + TTrack* pExt = (TTrack*)pLite->pExt1; + + for( int i=0; iaItems->Count; i++ ){ + TTrackItem* pTrkItem = (TTrackItem*)pSegItem->aItems->Items[i]; + TTrack* pTrack = pTrkItem->pTrack; + + if( pTrack->iStyleLoc==pExt->iStyleLoc && pTrack->iStyleId==pExt->iStyleId + && pTrack->iSegNo==pExt->iSegNo && pTrack->iBank==pExt->iBank + && pTrack->iProg==pExt->iProg && pTrack->nVol==iOther ){ + pSetItem = pTrkItem; + SetSelectTrack( pTrkItem ); + break; + } + } + } + + ChangeVolume( iStage, pSetItem, iSet, false ); + + if( iSet>=0 && iOther<0 || iSet<0 && iOther>=0 ){ // + DrawItem( m_pSelItem, m_iSelLine, COL_FOLD ); + } + else{ + DrawItem( m_pSelItem, m_iSelLine, COL_TEXT ); + DoAdjustVolume( NULL ); + } + } + + if( iMode>=0 ) + m_pContentPanel->OnStageChanged( iChangeStage, iMode ); +} +// --------------------------------------------------------------------------- + +void TUseStylePanel::SetSelectTrack( TTrackItem* pTrack ) +{ + TStyleItem* pStyle = (TStyleItem*)m_aItems->Items[0]; + TSegmentItem* pSeg = (TSegmentItem*)pTrack->up; + + if( !pStyle->IsUnfold() ){ + SetFold( pStyle, 0 ); + } + + TCommonItem* pItem = GetNextItem( pStyle ); + int iLine = 1; + while( pItem!=pSeg ){ + pItem = GetNextItem( pItem ); + iLine++; + } + + if( !pSeg->IsUnfold() ){ + SetFold( pSeg, iLine ); + } + + while( pItem!=pTrack ){ + pItem = GetNextItem( pItem ); + iLine++; + } + + SetSelect( pTrack, iLine - m_iTopLine ); + + ShowSelItem(); +} +// --------------------------------------------------------------------------- + +bool __fastcall TUseStylePanel::GetPrebeat( BYTE* pData, int& nSize ) +{ + if( m_aItems->Count==0 ) + return false; + + TStyleItem* pStyItem = (TStyleItem*)m_aItems->Items[0]; + TTrack* pDrumTrk = NULL; + + for( int i=pStyItem->aItems->Count-1; !pDrumTrk && i>=0; i-- ){ + TSegmentItem* pSeg = (TSegmentItem*)pStyItem->aItems->Items[i]; + int stype = pSeg->GetSegType(); + + if( stype!=SEGTYPE_ENDING ){ + for( int j=0; jaItems->Count; j++ ){ + TTrack* pTrk = ((TTrackItem*)pSeg->aItems->Items[j])->pTrack; + + if( pTrk->iChanNo==9 ){ + pDrumTrk = pTrk; + break; + } + } + } + } + + if( pDrumTrk ){ + int nStageNum = 1; + TStage* aStages = new TStage[nStageNum]; + aStages[0].iSegType = SEGTYPE_VAR; + aStages[0].iSegKey = 0; + aStages[0].nBarNum = 4; + aStages[0].aChords = new TBarChords[aStages[0].nBarNum]; + for( int j=0; j<4; j++ ){ + aStages[0].aChords[j].iKey[0] + = aStages[0].aChords[j].iKey[1] + = aStages[0].aChords[j].iKey[2] + = aStages[0].aChords[j].iKey[3] = 0; + aStages[0].aChords[j].iType[0] + = aStages[0].aChords[j].iType[1] + = aStages[0].aChords[j].iType[2] + = aStages[0].aChords[j].iType[3] = 0; + } + + //tracks + aStages[0].nTrkNum = 1; + aStages[0].aTracks = new TComposeTrack[aStages[0].nTrkNum]; + aStages[0].aTracks[0].iStyleLoc = pDrumTrk->iStyleLoc; + aStages[0].aTracks[0].iStyleId = pDrumTrk->iStyleId; + aStages[0].aTracks[0].iSegNo = pDrumTrk->iSegNo; + aStages[0].aTracks[0].iChanNo = pDrumTrk->iChanNo; + aStages[0].aTracks[0].iChanSpec = pDrumTrk->iChanSpec; + aStages[0].aTracks[0].iProg = pDrumTrk->iProg; + aStages[0].aTracks[0].nVol = 110; + + int ret = f_CM_Compose( &nSize, pData, g_iMelodyTimeSignature, g_nMelodyTempo, + nStageNum, aStages, false, NULL, NULL ); + + if( ret==0 ){ + return true; + } + } + + return false; +} +// --------------------------------------------------------------------------- + + void TUseStylePanel::SetBarsUndo( int iMode, int iStartBar, int nBars, int iMoveTo ) +{ + int iEndBar = iStartBar + nBars - 1; + + TOpusStageList* lstStages = new TOpusStageList; + TAudioTrackList* lstAudio = new TAudioTrackList; + + CopyUndoBars( iStartBar, iEndBar, lstStages, lstAudio ); + + void *pBefore = iMode==UNDO_BAR_INSERT ? NULL : (void*)lstStages, + *pAfter = iMode==UNDO_BAR_INSERT ? (void*)lstStages : NULL; + + g_Undo.AddUndo( iMode, 0, iStartBar, iEndBar, pBefore, pAfter ); + + if( iMode==UNDO_BAR_MOVE && iMoveTo > iStartBar ) + iMoveTo -= nBars; + + g_Undo.SetUndoExtra( iMoveTo, 0, 0, (void*)lstAudio, NULL ); +} +//--------------------------------------------------------------------------- + + diff --git a/UseStylePanel.h b/UseStylePanel.h new file mode 100644 index 0000000..66e8dfc --- /dev/null +++ b/UseStylePanel.h @@ -0,0 +1,96 @@ +//--------------------------------------------------------------------------- + +#ifndef UseStylePanelH +#define UseStylePanelH + +#include "ContentPanelUnit.h" +#include "StylePanel.h" + +//--------------------------------------------------------------------------- +class TUseStylePanel : public TStylePanel +{ +private: + TContentPanel* m_pContentPanel; // + TTimer *m_pPlayTimer; + + bool m_bAddWeakupBar; + STYLELIST m_aStyles; + + void __fastcall PlayEndProc(TObject* Sender); + + int FindItemStage( TCommonItem* pItem ); + TSegmentItem* AddStage( TOpusStage* pStage ); + TTrackItem* AddTrack( TSegmentItem* pSeg, TTrack* pSrcTrk, int iInd=-1 ); + TTrackItem* FindTrackItem( int iStage, TTrack* pTrk ); + bool IntegrateStages( int iStageBegin, bool bSetMM=true ); + int GetInsertStage( int iCutBar ); + void HandleWeakup( int iStageBegin, bool bSetMM=true ); + void CountStyles(); + void DeleteBars( int iStartBar, int iEndBar, bool bDelWave ); + void DeleteTrack( int iStage, TTrackItem* pTrkItem, int iLine ); + void SetSelectTrack( TTrackItem* pTrack ); + void ChangeVolume( int iStage, TCommonItem* pItem, char newVol, bool bAddUndo=true ); + int GetDemoData( TCommonItem* pItem, int &nLen, BYTE* pData, int& iStartBar, int& lenBar ); + void CountTotalLine(); + +protected: + void ReplaceSegment( TSegmentItem* pDestSeg, + TSegmentItem* pSrcSeg); + void RemoveSegment( TSegmentItem* pItem, bool bSetMM=true ); + TSegmentItem* InsertSegment( int iStage, TSegmentItem* pSrcSeg, int nBars ); + + virtual void ClearAllItems(); + virtual void Init(){}; + virtual void PlayDemo( TCommonItem *pItem, int tempo ); + virtual bool StartDrag(){ return false; }; + virtual void HandleDropEvent( int iState=0 ); + virtual bool HandleHoverEvent(TPoint ptMouse); + virtual void VolumeChanged( TCommonItem *pItem, char volNew ); + virtual void RestoreItems(); + virtual void SetSelect( TCommonItem *pItem, int iLine ); + virtual void DeleteItem( TCommonItem *pItem, int iLine ); + virtual String ChargeTip( TStyleItem* pItem ); + + virtual void __fastcall DoChangeFontProg(TObject* Sender); + virtual void __fastcall DoChangeTexture(TObject* Sender); + + MESSAGE void __fastcall OnPlayEnd(TMessage &msg); + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(MSG_PLAY_END, TMessage, OnPlayEnd ) + END_MESSAGE_MAP(TStylePanel) + +public: + __fastcall TUseStylePanel(System::Classes::TComponent* AOwner); + + virtual void Stop( DWORD dwSpec=STOP_CONTENT|STOP_USESTYLE ); + virtual void __fastcall SetStyleItem( TStyleItem* pStyItem ); + virtual bool __fastcall GetPrebeat( BYTE* pData, int& nSize ); + + void __fastcall InitOpus( TStyleItem* pPreStyle, int iMode ); + //iMode: 0=ʼ 1=IME 2=IMIME 3=Predefine + void __fastcall InsertStage( int iInsertBar, TSegmentItem* pSrcSeg ); + void __fastcall MoveBars( int iStartBar, int iEndBar, int iInsertBar, int iMode ); + void __fastcall ReformStage( int iDestStage, TSegmentItem* pSrcSeg ); + void __fastcall RemoveStage( int iDestStage ); + void __fastcall ReformBars( int iStartBar, int iEndBar, TSegmentItem* pScrSeg, bool bAddUndo=true ); + void __fastcall InsertBlankBar( int iInsertBar ); + bool __fastcall Charge4Fonts(); + void __fastcall ChangeTexture( int iSBar, int iEBar, char sType, int iMT, TTrack* pSubTrack, int op ); + void __fastcall ChangeFont( int iSBar, int iEBar, int iMT, int iBank, int iProg, int iChno, int op ); + void __fastcall DeleteAllTexture( bool bAddUndo=true ); + + void SetContentPanel( TContentPanel* pPanel ){ m_pContentPanel=pPanel; }; + void SetSelectStage( int iStage ); + void ApplyStyle( TStyleItem* pSrcStyle ); + void CopyBars( int iStartBar, int iEndBar, TOpusStageList* lstStages, + TSegmentList* lstSegments, TAudioTrackList* lstAudio ); + void CopyUndoBars( int iStartBar, int iEndBar, TOpusStageList* lstStages, + TAudioTrackList* lstAudio, bool bFx=false ); + void SetBarsUndo( int iMode, int iStartBar, int nBars, int iMoveTo=-1 ); + void Undo( bool bUndo ); +}; + +#endif + + diff --git a/VSTPathFormUnit.cpp b/VSTPathFormUnit.cpp new file mode 100644 index 0000000..4d1ddfb --- /dev/null +++ b/VSTPathFormUnit.cpp @@ -0,0 +1,128 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop + +#include "VSTPathFormUnit.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma link "GeneralDialogPanel" +#pragma link "LineEdit" +#pragma link "TextButton" +#pragma link "CKBox" +#pragma resource "*.dfm" +TVSTPathForm *VSTPathForm; + +#include +#include +#include "GlobalUnit.h" +TCHAR u_lpSelectDir[MAX_PATH]; //ǰʼĿ¼· +//--------------------------------------------------------------------------- + +int CALLBACK BrowserCallbackProc(HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData) +{ + switch( uMsg ) + { + case BFFM_INITIALIZED: + ::SendMessage(hWnd, BFFM_SETSELECTION, 1, (long)(u_lpSelectDir) ); + break; + default: + break; + } + return 0; +} +//--------------------------------------------------------------------------- + +__fastcall TVSTPathForm::TVSTPathForm(TComponent* Owner, bool bShowCheck) + : TForm(Owner) +{ + m_ckHide->Visible = bShowCheck; + m_lblMessage->Visible = !bShowCheck; +} +//--------------------------------------------------------------------------- + +void __fastcall TVSTPathForm::FormCreate(TObject *Sender) +{ + m_BKGPanel->Font->Size = g_szFont9; + m_BtnCancel->FontSize = g_szFont9; + m_BtnSure->FontSize = g_szFont9; + m_btnVSTPath->FontSize = g_szFont9; + m_btnVSTiPath->FontSize = g_szFont9; + m_editVST->SetTextFont(g_strTxtFontName, g_szFont9); + m_editVSTi->SetTextFont(g_strTxtFontName, g_szFont9); + m_ckHide->Font->Name = g_strTxtFontName; + m_ckHide->Font->Size = g_szFont9; + + String strVSTPath, strVSTiPath; + + if( g_strVSTPath.empty() ){ + strVSTPath = g_strExecutePath.c_str(); + strVSTPath += VST_DIRNAME; + } + else + strVSTPath = g_strVSTPath.c_str(); + + if( g_strVSTiPath.empty() ){ + strVSTiPath = g_strExecutePath.c_str(); + strVSTiPath += VST_DIRNAME; + } + else + strVSTiPath = g_strVSTiPath.c_str(); + + m_editVST->Text = strVSTPath; + m_editVSTi->Text = strVSTiPath; + + SetTransparent( this ); +} +//--------------------------------------------------------------------------- + +void __fastcall TVSTPathForm::VSTPathClick(TObject *Sender) +{ + TTextButton* pBtn = (TTextButton*)Sender; + TLineEdit* pEdit = pBtn==m_btnVSTPath ? m_editVST : m_editVSTi; + + wcscpy( u_lpSelectDir, (LPTSTR)(pBtn->Text.c_str()) ); + if( CrnBrowseDir(Handle, (LPTSTR)( str2wstr("ѡļ·").c_str() ), u_lpSelectDir ) ) { + pEdit->Text = wstr2str(u_lpSelectDir).c_str(); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TVSTPathForm::SureClick(TObject *Sender) +{ + wcscpy( m_lpSelectVSTDir, (LPTSTR)(m_editVST->Text.c_str()) ); + wcscpy( m_lpSelectVSTiDir, (LPTSTR)(m_editVSTi->Text.c_str()) ); +} +//--------------------------------------------------------------------------- + +bool TVSTPathForm::CrnBrowseDir(HWND hOwner, LPTSTR lpTitle, LPTSTR lpSelectDir) +{ + bool bReslut = false; + LPMALLOC pShellMalloc; + if (SHGetMalloc(&pShellMalloc) == NO_ERROR){ + + BROWSEINFO bi; + WCHAR wszDisplayName[MAX_PATH]; + memset(&bi, 0x00, sizeof(bi)); + bi.hwndOwner = hOwner; + bi.pidlRoot = 0; + bi.pszDisplayName = wszDisplayName; + bi.lpszTitle = lpTitle; + bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE; + bi.lpfn = BrowserCallbackProc; + bi.lParam=LPARAM(lpSelectDir); + + LPITEMIDLIST pidl = SHBrowseForFolder(&bi); + if (pidl){ + bReslut= SHGetPathFromIDList(pidl, lpSelectDir); + pShellMalloc->Free(pidl); + } + + pShellMalloc->Release(); + } + + return bReslut; +} +//--------------------------------------------------------------------------- + + diff --git a/VSTPathFormUnit.dfm b/VSTPathFormUnit.dfm new file mode 100644 index 0000000..acf5237 --- /dev/null +++ b/VSTPathFormUnit.dfm @@ -0,0 +1,164 @@ +object VSTPathForm: TVSTPathForm + Left = 0 + Top = 0 + BorderStyle = bsNone + Caption = 'VSTPathForm' + ClientHeight = 230 + ClientWidth = 410 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Position = poMainFormCenter + Scaled = False + OnCreate = FormCreate + TextHeight = 13 + object m_BKGPanel: TGeneralDialogPanel + Left = 0 + Top = 0 + Width = 410 + Height = 230 + Align = alClient + Caption = 'VST '#36335#24452#35774#32622 + Color = 5064257 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentBackground = False + ParentFont = False + TabOrder = 0 + object m_BtnCancel: TTextButton + Left = 324 + Top = 185 + Width = 65 + Height = 25 + ModalResult = mrNo + ParentShowHint = False + ShowHint = True + Text = #21462#28040 + end + object m_BtnSure: TTextButton + Left = 248 + Top = 185 + Width = 65 + Height = 25 + ModalResult = mrOk + ParentShowHint = False + ShowHint = True + OnClick = SureClick + Text = #30830#23450 + end + object m_lbVST: TLabel + Left = 144 + Top = 44 + Width = 120 + Height = 14 + Caption = 'VST'#38899#39057#25928#26524#22120' (VST)' + Font.Charset = DEFAULT_CHARSET + Font.Color = 14339007 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object m_lbVSTi: TLabel + Left = 162 + Top = 112 + Width = 86 + Height = 14 + Caption = 'VST'#20048#22120' (VSTi)' + Font.Charset = DEFAULT_CHARSET + Font.Color = 14339007 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object m_btnVSTPath: TTextButton + Left = 345 + Top = 67 + Width = 49 + Height = 24 + ParentShowHint = False + ShowHint = True + OnClick = VSTPathClick + Text = #27983#35272 + end + object m_btnVSTiPath: TTextButton + Left = 345 + Top = 133 + Width = 49 + Height = 24 + ParentShowHint = False + ShowHint = True + OnClick = VSTPathClick + Text = #27983#35272 + end + object m_lblMessage: TLabel + Left = 20 + Top = 189 + Width = 207 + Height = 14 + AutoSize = False + Caption = #25552#31034#65306#26032#36335#24452#23558#22312#19979#27425#21551#21160#26102#29983#25928 + Font.Charset = DEFAULT_CHARSET + Font.Color = 12429980 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowAccelChar = False + ShowHint = False + Layout = tlCenter + WordWrap = True + end + object m_editVST: TLineEdit + Left = 16 + Top = 67 + Width = 323 + Height = 24 + HintText = #35831#36873#25321'VST'#25991#20214#36335#24452 + NumberMax = -1 + NumberMin = -1 + Color = 15591652 + TabOrder = 0 + end + object m_editVSTi: TLineEdit + Left = 16 + Top = 133 + Width = 323 + Height = 24 + HintText = #35831#36873#25321'VSTi'#25991#20214#36335#24452 + NumberMax = -1 + NumberMin = -1 + Color = 15591652 + TabOrder = 1 + end + object m_ckHide: TCKBox + Left = 15 + Top = 188 + Width = 90 + Height = 18 + Caption = #19981#20877#26174#31034 + Ctl3D = False + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = 13613739 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + Font.Quality = fqClearTypeNatural + ParentColor = True + ParentCtl3D = False + ParentDoubleBuffered = False + ParentFont = False + TabOrder = 2 + BoxColor = 3157548 + end + end +end diff --git a/VSTPathFormUnit.h b/VSTPathFormUnit.h new file mode 100644 index 0000000..7dbba65 --- /dev/null +++ b/VSTPathFormUnit.h @@ -0,0 +1,48 @@ +//--------------------------------------------------------------------------- + +#ifndef VSTPathFormUnitH +#define VSTPathFormUnitH +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include "GeneralDialogPanel.h" +#include +#include "LineEdit.h" +#include "TextButton.h" +#include "CKBox.h" +//--------------------------------------------------------------------------- +class TVSTPathForm : public TForm +{ +__published: // IDE-managed Components + TGeneralDialogPanel *m_BKGPanel; + TTextButton *m_BtnCancel; + TTextButton *m_BtnSure; + TTextButton *m_btnVSTPath; + TTextButton *m_btnVSTiPath; + TLineEdit *m_editVST; + TLineEdit *m_editVSTi; + TLabel *m_lbVST; + TLabel *m_lbVSTi; + TLabel *m_lblMessage; + TCKBox *m_ckHide; + + void __fastcall FormCreate(TObject *Sender); + void __fastcall VSTPathClick(TObject *Sender); + void __fastcall SureClick(TObject *Sender); + +private: // User declarations + bool CrnBrowseDir(HWND hOwner, LPTSTR lpTitle, LPTSTR lpSelectDir);//ļ·ѡ + +public: // User declarations + TCHAR m_lpSelectVSTDir[MAX_PATH]; + TCHAR m_lpSelectVSTiDir[MAX_PATH]; + + bool IsChecked() { return m_ckHide->Checked; }; + __fastcall TVSTPathForm(TComponent* Owner, bool bShowCheck); +}; +//--------------------------------------------------------------------------- +extern PACKAGE TVSTPathForm *VSTPathForm; +//--------------------------------------------------------------------------- +#endif diff --git a/VSTPluginFormUnit.cpp b/VSTPluginFormUnit.cpp new file mode 100644 index 0000000..6b6b3ba --- /dev/null +++ b/VSTPluginFormUnit.cpp @@ -0,0 +1,50 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop + +#include "VSTPluginFormUnit.h" +#include "GlobalUnit.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma link "GeneralDialogPanel" +#pragma link "TextButton" +#pragma resource "*.dfm" +TVSTPluginForm *VSTPluginForm; +//--------------------------------------------------------------------------- +__fastcall TVSTPluginForm::TVSTPluginForm(TComponent* Owner, VSTINFO* pVST) + : TForm(Owner) +{ + m_pVST = pVST; + m_iSel = -1; + m_lvPlugins = NULL; +} +//--------------------------------------------------------------------------- + +void __fastcall TVSTPluginForm::FormCreate(TObject *Sender) +{ + m_BKGPanel->Font->Size = g_szFont9; + m_btnCancel->FontSize = g_szFont9; + m_btnOk->FontSize = g_szFont9; + + m_lvPlugins = new TListPanel(this); + m_lvPlugins->Parent = m_panFont;// m_BKGPanel; + m_lvPlugins->Align = alClient; + m_lvPlugins->SetTextFont(g_strTxtFontName, g_szFont9); +// m_lvPlugins->SetBounds( 27, 63, 246, 250 ); + + for( int i=0; iaPlugins.size(); i++ ){ + VSTPLUGIN* pPlugin = m_pVST->aPlugins[i]; + TListPanelItem* pItem = new TListPanelItem( pPlugin->name, OnItemClick ); + pItem->Tag = pPlugin->id; + m_lvPlugins->AddItem( pItem ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TVSTPluginForm::OnItemClick(TListPanel *Sender, int Index) +{ + m_iSel = Index; + m_btnOk->Enabled = m_iSel>=0; +} +//--------------------------------------------------------------------------- diff --git a/VSTPluginFormUnit.dfm b/VSTPluginFormUnit.dfm new file mode 100644 index 0000000..1952ae2 --- /dev/null +++ b/VSTPluginFormUnit.dfm @@ -0,0 +1,81 @@ +object VSTPluginForm: TVSTPluginForm + Left = 0 + Top = 0 + BorderIcons = [] + BorderStyle = bsNone + Caption = 'VSTPluginForm' + ClientHeight = 338 + ClientWidth = 372 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Position = poMainFormCenter + Scaled = False + OnCreate = FormCreate + TextHeight = 13 + object m_BKGPanel: TGeneralDialogPanel + Left = 0 + Top = 0 + Width = 372 + Height = 338 + Align = alClient + Caption = #36873#25321#25554#20214 + Color = 5064257 + ParentBackground = False + TabOrder = 0 + object m_btnCancel: TTextButton + Left = 292 + Top = 87 + Width = 56 + Height = 25 + ModalResult = mrCancel + ParentShowHint = False + ShowHint = True + Text = #21462#28040 + end + object m_btnOk: TTextButton + Left = 292 + Top = 47 + Width = 56 + Height = 25 + ModalResult = mrOk + ParentShowHint = False + ShowHint = True + Enabled = False + Text = #30830#23450 + end + object m_ShapeList: TShape + Left = 27 + Top = 46 + Width = 246 + Height = 19 + Brush.Color = 2433053 + Pen.Color = 8092539 + end + object m_lblPlugins: TLabel + Left = 127 + Top = 48 + Width = 48 + Height = 14 + Caption = #25554#20214#21015#34920 + Font.Charset = DEFAULT_CHARSET + Font.Color = 12429980 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object m_panFont: TPanel + Left = 27 + Top = 65 + Width = 246 + Height = 250 + BevelOuter = bvNone + Caption = 'm_panList' + TabOrder = 0 + end + end +end diff --git a/VSTPluginFormUnit.h b/VSTPluginFormUnit.h new file mode 100644 index 0000000..81f3dba --- /dev/null +++ b/VSTPluginFormUnit.h @@ -0,0 +1,40 @@ +//--------------------------------------------------------------------------- + +#ifndef VSTPluginFormUnitH +#define VSTPluginFormUnitH +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include "GeneralDialogPanel.h" +#include "TextButton.h" +#include +#include "Instruments.h" +#include "ListPanel.h" +//--------------------------------------------------------------------------- +class TVSTPluginForm : public TForm +{ +__published: // IDE-managed Components + TGeneralDialogPanel *m_BKGPanel; + TTextButton *m_btnCancel; + TTextButton *m_btnOk; + TShape *m_ShapeList; + TLabel *m_lblPlugins; + TPanel *m_panFont; + void __fastcall FormCreate(TObject *Sender); +private: // User declarations + TListPanel *m_lvPlugins; + VSTINFO* m_pVST; + + void __fastcall OnItemClick(TListPanel *Sender, int Index); + +public: // User declarations + int m_iSel; + + __fastcall TVSTPluginForm(TComponent* Owner, VSTINFO* pVST); +}; +//--------------------------------------------------------------------------- +extern PACKAGE TVSTPluginForm *VSTPluginForm; +//--------------------------------------------------------------------------- +#endif diff --git a/VSTiFormUnit.cpp b/VSTiFormUnit.cpp new file mode 100644 index 0000000..d5666b4 --- /dev/null +++ b/VSTiFormUnit.cpp @@ -0,0 +1,215 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop + +#include "GlobalUnit.h" +#include "VSTiFormUnit.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma link "GeneralDialogPanel" +#pragma link "TextButton" +#pragma link "ComboBoxComponent" +#pragma link "PNGButton" +#pragma link "SkinTrackBar" +#pragma resource "*.dfm" + +#define TIMER_INTERVAL 50 + +TVSTiForm *VSTiForm; +//--------------------------------------------------------------------------- +__fastcall TVSTiForm::TVSTiForm( TComponent* Owner, BYTE iVSTi, BYTE iChno, int iStart, int len ) + : TForm(Owner) +{ + m_iVSTi = iVSTi; + m_iChno = iChno; + m_iStartBar = iStart; + m_lenBar = len; + + String strCaption = m_BKGPanel->Caption + L" - "; + strCaption += g_lstVSTi[iVSTi-0x80]->strVSTName; + m_BKGPanel->Caption = strCaption; + + m_dblStart = iStart; + m_dblEnd = iStart + len; + + int nBeatsPerMeasure; + switch (g_iMelodyTimeSignature) { + case 0: + nBeatsPerMeasure = 4; + break; + case 1: + nBeatsPerMeasure = 3; + break; + case 2: + nBeatsPerMeasure = 2; + break; + case 3: + nBeatsPerMeasure = 3; + break; + } + + m_iCurrPos = 0; + m_dblPos = 0; + m_dblStep = TIMER_INTERVAL * (double)g_nMelodyTempo / nBeatsPerMeasure / 60.0 / len; +} +//--------------------------------------------------------------------------- + +void __fastcall TVSTiForm::FormCreate(TObject *Sender) +{ + Screen->Cursor = crHourGlass; + + m_BKGPanel->Font->Size = g_szFont9; + m_btnCancel->FontSize = g_szFont9; + m_btnOk->FontSize = g_szFont9; + m_cbChannel->SetFont(g_strTxtFontName, g_szFont9); + + int nWidth(0), nHeight(0); + if( f_MM_ShowVSTEditor( Handle, m_panShow->Handle, &nWidth, &nHeight, -1, m_iVSTi, + g_lstVSTi[m_iVSTi-0x80]->strFileName )==S_OK ){ + if( nWidth<0 && nHeight<0 ){ + m_lblNoEditor->Visible = true; + } + else{ + if( nWidth==0 || nHeight==0 ) + BorderStyle = bsSizeable; + + if( nWidth==0 ) + nWidth = 300; + if( nHeight==0 ) + nHeight = 150; + + SetBounds( Left, Top, nWidth + 50, nHeight + 134 ); + } + } + else{ + m_lblNoEditor->Visible = true; + } + + for( int i=0; i<16; i++ ){ + m_cbChannel->AddItem( IntToStr(i+1) ); + } + m_cbChannel->DefItemIndex = m_iChno; + + Screen->Cursor = crDefault; + + SetTransparent( this ); +} +//--------------------------------------------------------------------------- + +void __fastcall TVSTiForm::FormClose(TObject *Sender, TCloseAction &Action) +{ + if( m_btnStop->Visible ){ + StopClick( NULL ); + } + + if( !m_lblNoEditor->Visible ){ + f_MM_ShowVSTEditor( NULL, NULL, NULL, NULL, -1, m_iVSTi, NULL ); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TVSTiForm::FormResize(TObject *Sender) +{ + m_panShow->SetBounds( m_panShow->Left, m_panShow->Top, + ClientWidth - 50, ClientHeight - 134 ); + + m_tbPosition->Width = m_panShow->Width; + m_tbPosition->Top = ClientHeight - 69; + + m_btnPlay->Top = ClientHeight - 43; + m_btnStop->Top = m_btnPlay->Top; + m_btnOk->Top = m_btnPlay->Top + 1; + m_btnCancel->Top = m_btnOk->Top; + m_cbChannel->Top = m_btnPlay->Top + 3; + m_lblChannel->Top = m_btnPlay->Top + 6; + + m_btnOk->Left = ClientWidth - 148; + m_btnCancel->Left = ClientWidth - 83; +} +//--------------------------------------------------------------------------- + +void __fastcall TVSTiForm::PlayClick(TObject *Sender) +{ + double dblPos = ( (double)m_tbPosition->Position / m_tbPosition->Max ) * ( m_dblEnd - m_dblStart ) + m_dblStart; + + m_btnPlay->Visible = false; + m_btnStop->Visible = true; + + f_MM_PlayDemo( Handle, dblPos, m_iChno, -1, m_iVSTi, g_lstVSTi[m_iVSTi-0x80]->strFileName ); + + SetPlayTimer( true, m_tTimer, m_tAccuracy, Handle, TIMER_INTERVAL ); +} +//--------------------------------------------------------------------------- + +void __fastcall TVSTiForm::StopClick(TObject *Sender) +{ + m_btnStop->Visible = false; + m_btnPlay->Visible = true; + + f_MM_Stop(); + SetPlayTimer(false, m_tTimer, m_tAccuracy); +} +//--------------------------------------------------------------------------- + +void __fastcall TVSTiForm::UMMediaTime(TMessage &Message) +{ + m_dblPos += m_dblStep; + m_iCurrPos = (DWORD)( m_dblPos + 0.5 ); + + if( m_iCurrPos==m_tbPosition->Position ) + return; + + if( m_iCurrPos >= m_tbPosition->Max ){ + m_dblPos = 0; + m_iCurrPos = 0; + + StopClick( NULL ); + } + + m_tbPosition->Position = m_iCurrPos; +} +//--------------------------------------------------------------------------- + +void __fastcall TVSTiForm::UMEditorResize(TMessage &Message) +{ + int nWidth = Message.WParam, + nHeight = Message.LParam; + + if( nWidth==0 ) + nWidth = 300; + if( nHeight==0 ) + nHeight = 150; + + SetBounds( Left, Top, nWidth + 50, nHeight + 134 ); +} +//--------------------------------------------------------------------------- + +void __fastcall TVSTiForm::PositionChange(TObject *Sender) +{ + if( m_iCurrPos!=m_tbPosition->Position ){ + m_iCurrPos = m_tbPosition->Position; + m_dblPos = m_iCurrPos; + + if( m_btnStop->Visible ){ + SetPlayTimer(false, m_tTimer, m_tAccuracy); + + double dblPos = ( (double)m_tbPosition->Position / m_tbPosition->Max ) * ( m_dblEnd - m_dblStart ) + m_dblStart; + f_MM_PlayDemo( Handle, dblPos, m_iChno, -1, m_iVSTi, g_lstVSTi[m_iVSTi-0x80]->strFileName ); + + SetPlayTimer( true, m_tTimer, m_tAccuracy, Handle, TIMER_INTERVAL ); + } + } +} +//--------------------------------------------------------------------------- + +void __fastcall TVSTiForm::ChannelChange(TComboBoxItem *Sender, int Index) +{ + m_iChno = Index; + + if( m_btnStop->Visible ){ + f_MM_ChangeDemoParam( m_iChno, -1 ); + } +} +//--------------------------------------------------------------------------- + diff --git a/VSTiFormUnit.dfm b/VSTiFormUnit.dfm new file mode 100644 index 0000000..e3585ab --- /dev/null +++ b/VSTiFormUnit.dfm @@ -0,0 +1,417 @@ +object VSTiForm: TVSTiForm + Left = 0 + Top = 0 + BorderIcons = [] + BorderStyle = bsNone + ClientHeight = 238 + ClientWidth = 406 + Color = clBtnFace + DoubleBuffered = True + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Position = poMainFormCenter + Scaled = False + OnClose = FormClose + OnCreate = FormCreate + OnResize = FormResize + TextHeight = 13 + object m_BKGPanel: TGeneralDialogPanel + Left = 0 + Top = 0 + Width = 406 + Height = 238 + Align = alClient + Caption = 'VSTi'#35774#32622 + Color = 5064257 + ParentBackground = False + TabOrder = 0 + object m_btnCancel: TTextButton + Left = 323 + Top = 196 + Width = 56 + Height = 25 + ModalResult = mrCancel + ParentShowHint = False + ShowHint = True + Text = #21462#28040 + end + object m_btnStop: TPNGButton + Left = 23 + Top = 194 + Width = 39 + Height = 26 + Hint = #20572#27490 + ParentCustomHint = False + ParentShowHint = False + PngImg.Data = { + 89504E470D0A1A0A0000000D494844520000009C0000001A0806000000425135 + 88000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F33000004C64944415478DAED9B7D6893471C + C72FC9F3A45D4C8DD1698B4263EBCB3A5DDD6C1D28DABD20B88DD6971237CAFA + C7A6C806F32F19634C6463228E21E25F1514D9F48F8EB22DA8D3B229145FAA28 + D85659F7D26DAE35424B5B37B3D898B5C99374DF4B2F9BCEDAE4FA3C777984E7 + 073FEE9EE71EC827779FDC13B83BDBE8E828297F7A29C9555CEB689BA8D98E54 + 904E643E2B15765F5624911A32861C66A5C6DA4CC9F64CC5B2A44486FB62A2F1 + 74381CC446854B24122AAE5D480F2BD51CB0C69151649895F49A0EA217391B59 + 8A9C852C90CC4739869083C86E641F32C4DADCC8E9C822C6E966CCB2820A1661 + 3CFDC8DBF41AC2C530F02AE3A15C5324F7D9BD7D7797F145205C3C2D9CE7E557 + AA0FF60F0CBC9603A8FBA2A8B0F0CBEFBE6D7E8B8C89473B6CC1865AFFC91BC1 + E0EC5CB3CDF5F9FA8E1D0DD4A0FA5B1AB7D6FFEABE9E9E9E9A5CB39594949C3C + 1AF86A1BAAFD102E02E1BC18D32318D3B5B966C3989EC098BE01E14269E18A01 + 192C2E2DCB351BB9D9DD45A7651FAD221F473E0FB6AF4DC4B611D573EC5619D8 + 5A9DF96EA228CAD82BC36E27369B4D380B1DB7D164928E1DD1348DC4862394AD + 0A4D5D60FA03F55294BF2F5FF562AEBB8D5CBE7086B2CD43FF74A785A31DF7B3 + 8906F549DA7164EC55BA1E6CFB4DC4F60EAAC7D9AD4AB07DE3724F238AAA423A + 95D8250A9784709A16275A3C4EA291BF28DB3A34B583A90FF57294DF9B48B825 + 10AE332D5C0ACE4483BA04D54E6431B20E6C9F9A88ED7D549BD8AD9560FBA2C0 + 3383A8CEBCD42C67A7B39C2CE1D8EC168F8D90A1F09F94ED75345D04D34DD42B + 50B69B48B84A08D73129E112F8922323C3A95F5736417FF97979F9C4A128199F + FD9F707391F560DB6522B61DA836B25BF4757F78AA77267152E130CB391C90EE + 21C2FDC7A665FCAC3136E5A16CC9D4B869A9D92D06E1EE846E51B637D1740E4C + 3778854BD2D7722C46B44496FDE650F19D9DC49E45BFE9162E7A3742AADE6EC8 + EAD974B41ED84A5C53DC199FD32B9C04B60784F34C9FF5AF700A84A3FFE344B3 + D1FF6FDA3DC2856F0FEA126E381A25CBEA3EE4626B6BDA49F25DAE8CCFE916EE + 4E38449EE3ECB8F3E8B8A91E6FC6E7F40A27816DD2C219C966B47091A13079B6 + EE232EB62B4D1F13778127E3738608B762F33E2EB84B9F6D93269C60365DC219 + C52642B8A5FEED5C6C5703BBE5095759FF09175C7BE307D28413CCA64B38A3D8 + 4408F7D4DA77B9D87E38B1579E70E57EBEF77D6760A734E104B3E912CE283611 + C23DB1662B17DB2FA71BE409B7B0FA3D2EB85F9BF748134E309B2EE18C621321 + 5CC90B5BB8D87ACE1E92279C6F35DFAF21D8D2204D38C16CBA84338A4D847073 + 56D473B1F55E6A94275CD1CA4D5C70FD173F97269C60365DC219C52642B89915 + 7E2EB65B1D0179C2792BEAB8E0421D4DD28413CCA64B38A3D84408E75954CDC5 + 16FEA9599E70AEC5EBB9E0A23F1E97269C60365DC219C52642B8C7E6AFE662FB + FB7A8B3CE1D4F92F71C1C5AF9F92269C60365DC219C5264238D557C5C7166C95 + 231C5DA2D1E6ACE282537A2F485BDA12CCA66B69CB2836114B5B5A61251FDB40 + BB9CA52D6BF1DE5ABC97BA782F32ACED49D9C5A3BE3DC9DA80993D9BB5019333 + C6DB80696D31CF9ECDDA62CE19E36D31B70ED16411D6219AC9C5788768AC6382 + 137359C70427DF770F1E13B40E424F18D641688EC87410FA1FF0936827C0A298 + CF0000000049454E44AE426082} + ShowHint = True + Visible = False + OnClick = StopClick + end + object m_btnPlay: TPNGButton + Left = 24 + Top = 195 + Width = 39 + Height = 26 + Hint = #25773#25918 + ParentCustomHint = False + ParentShowHint = False + PngImg.Data = { + 89504E470D0A1A0A0000000D494844520000009C0000001A0806000000425135 + 88000000097048597300000B1300000B1301009A9C1800000A4D694343505068 + 6F746F73686F70204943432070726F66696C65000078DA9D53775893F7163EDF + F7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A + 561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B5 + 7D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD8 + 1F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC + 01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200 + C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E05 + 00D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C2 + 00A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422C + CC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD97 + 4BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B2313 + 48E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F + 223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA + 560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED + 2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383 + FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158A + F15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC86 + 4FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B910010673432 + 79F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0 + 812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C + 0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70 + 170660189EC218BC86090441C8081361213A8811628ED822CE0817998E042261 + 48349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA + 90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F + 5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD961 + 5C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF082402 + 8B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2 + 272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F93 + 48240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB90 + 6DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452 + A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA07650 + 2F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD83 + 1E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7 + 192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA1295 + 3A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A9 + 09D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB28685 + 46A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9 + EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C + 4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16ED + EBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB + 79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C31 + 3863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE87 + 67E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD94 + 6B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85 + A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D6 + 5CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29 + D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B + 743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A6 + 4B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCAD + D96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7 + C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E + 3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3B + FACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A5 + 0735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD1 + 15CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0 + 476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67 + BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845 + F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DC + A2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A7 + 6E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA + 68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C + 949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423 + F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433 + DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317 + 772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2 + A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17 + 955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4 + EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58E + CDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED9 + 26DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD + 8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBF + B2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C + 7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BD + EFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293 + E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB7 + 5FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6F + EB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6 + EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07 + FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247 + CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73 + ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBC + CE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04F + F73EE77CFEFC2FF784F3FB25D29F33000006DB4944415478DAED9B5B6C145518 + C7FF33B3B33BBB5DD8DEA08514684B34F000229840A284105E105120808A2682 + D110F4498C898A3E9878892646DF34F1816022C4A080968A260A4DA3D2126805 + 6AA55269BB157ABFEF76BBF7F53BB3B3A49576BBBB7366B60FFB255FE6ECCCB6 + FBDB737E73CE999D33422C16C3AA071E44B6E26AE3956487454A0BA59552D1B6 + 166DBF5911A50C530629FDDA36AC1D9B936C6BD63E143591614A246B4F499220 + 30E12291884CAF1D942E6D2B67813544E9A31CD5B6EC356BC402CAC59495940B + 29E799CCC7383C947D946D945D94C3DA3127652165A9C6E9D498CD0A269857E3 + E9A11C62AF49B82035BCACF130AE3C93EB6C72DD8D6B7C5E122E9410CEB5F5D1 + C7BEE8E9ED7D320B5053A2B4A4E4E44F3FFE701071F15885DDB773D7EEEA0EB7 + 7B71B6D9CA972DEBFAEECCA9ED546C4DE0EEDABDF7D3F6F6F6EDD966ABA8A8A8 + 3E73EA9BC354EC21E1BC245C01B5E997D4A68F679B8DDAF42CB5E97E126E3821 + DC5282742FAD5C916D3674B6B5B06E79192B5216536E22B66FE710DB1E2AD66A + BB5610DBAF56C5098BC5121F324411822018CEC2DA2D168DB2B643381C46D0EF + 656C1BE9500B310D50B992B6B7363CB239DBD586FADF6A18DB72AA9FB68470AC + E26ECCA1465DC92A0EF1A17407B17D3687D85EA6E2F7DAAE75C456E570E6C322 + CB249D0CD144E1A2245C381C42381482CF3BC2D89EA0430DC4D445E555B4BD3E + 87845B4DC235258453E1526DD4283BAB2261AA5C297E5673AC60AD515753B189 + 7229E5D3C4F6D11C627B9D8A5F6BBB1E26B613F35C4590AD36B59713937C6634 + 1A41241C517B41BD6CAA705AEF160A06E0191D646CCFD0A1DF89A993CA6B69DB + 90AA7031F6BF884F14E26CE0586F9A70EBE8FF3666249C7FC287C2375E40DFB1 + D390BA8760B52971480EF13FE1CA299F25B6F7E610DBDB543CAEED62C3FDB1F9 + 050B6065C2512F274924DD0C8DE59F9840D19117D177F414C49E21F56F32658B + AAED16567BB720093736DCCFD80ED0A15A62EA4857B8A07F02AE837B3078FA67 + 48FD23EA092472AA37DDC2793D63283BFE2124A7030355E7E1397E0EB6884090 + 567548D1137A853381ED1EE15C850BEF0A6721E184193E87271B9BBF85270937 + 3AD4A74B38DFB817A51FBF06C9A160F8421DBC55B5B046898DBE93A0B3DE740B + E7191B41C9D177D58A6311F1FA3078A21AE10B97A1508FC2E632990E177A8533 + 812D63E178B2F1166EDC3B86E20F5E81E850D4D7519F1F23D53508D735C1A64D + 17321D66B908E7FAFC08A43CC794FD0177173C5F9D85A5B50B8A6287C420336B + 545DC219CCA64B385E6C460837EF9D436A0F37398277FA305E5503A9A30F361B + 0DB319D41B17E1EC9F1C8698679FF6F84443338227CFC33E1E54E750E90C173C + 8433984D9770BCD88C104E79F30044BB32ED717F732B42E7EAA04C84D4F95D3A + C32C17E184F70F51F76B9FF13D31BA1A0BFC520FF1FC1538249B3A4F4965B8E0 + 219CC16CBA84E3C5668470C2E17D1015DBCC6C91288217AF42ACFB138A6455E7 + 77A90CB35C840BBCF51C048732EB7BA3A35EC4CE5D84F3C66D2876C7AC3D0A0F + E10C66D3251C2F3623840B1EDA09C16E9BF5BD318F0FB1DA46386EF5C2A628B3 + F6765C841B7D756F4A7089B0D4FF85A2BA9BF1C96792E0219CC16CBA84E3C566 + 8470DEE7B782AE105267BB760BF97FB4CF3AE7E4225CEF4BDB0025858A1B1885 + BDE62A0A7A3CEA84D88C1ECE60365DC2F1623342B8C17D9B52136ED803DBA51B + 70F58FD38584493D9C7B3F7D1125095C3004FBA51614FFDD03BB4C7311D9BC39 + 9CC16CBA84E3C56684705DBBD683BEC8CC6FA2CF52AEB5A1A07D0036E2922D26 + CEE15A9FDA80D80C6783ADE55F94347660BE688DFF626DF255AAC16CBA84E3C5 + 668470EE6D6B10B34EBF8AC9DAD68DE2E63BC813E5F84960F6556AD30E82B34D + 8593FB46B0E8723B8AFC5479ECF7A40C6E8DF010CE60365DC2F1623342B89B5B + 56927053E76396410F1636DD467E80A4B36576BB8B8B700D5B57DE3D1B245F00 + 0BAE776249BF9FE61B0E751299CD3B0D06B3E9128E179B11C2356F5C8E981C17 + 4EF20751D0D28D45C3019AD629F10B836CDD6960F704EB37572066115148738D + 8A4E0F9C567BCABF67A5D0A8BAEEA51ACC96F1CD7BC67669CB728DAD1BE5EEB1 + 385B8A73C8C9C1FBE63DBB977A6D7D19629208577B3FCABAC7E19095947F6B4B + 16FA578BF82770BDD289B27F06512858D3FEC53E59E85D9E64025BC6CB93027E + 3F9AEF7761F1CD7EE4435625CD948DF7F2A460C08F96250E94BA47902FC869DF + 4D4816D30997D602CCA8BAD234AC56163BA37986DE059826B065BC0093B13149 + 12EBE1F404EF059889D5C3A228D049C3B7DEA65B80995B629E3A5B6E89799A31 + DD12F3DC43342944EE219ACC62BA8768728F0926E7CA3D269879DDDDFB9860EE + 41E8A4917B103A8D98ED41E8FF0013A48036FFAB77F70000000049454E44AE42 + 6082} + ShowHint = True + OnClick = PlayClick + end + object m_lblChannel: TLabel + Left = 78 + Top = 200 + Width = 60 + Height = 14 + Caption = #24403#21069#36890#36947#65306 + Font.Charset = DEFAULT_CHARSET + Font.Color = 12429980 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object m_cbChannel: TComboBoxComponent + Left = 136 + Top = 198 + Width = 48 + Height = 20 + ParentShowHint = False + ShowHint = True + OnChange = ChannelChange + ShowItemCount = 5 + Parent = m_BKGPanel + end + object m_btnOk: TTextButton + Left = 258 + Top = 196 + Width = 56 + Height = 25 + ModalResult = mrOk + ParentShowHint = False + ShowHint = True + Text = #30830#23450 + end + object m_panShow: TPanel + Left = 24 + Top = 47 + Width = 356 + Height = 104 + ParentCustomHint = False + BevelEdges = [] + BevelOuter = bvNone + Ctl3D = False + ParentCtl3D = False + ParentShowHint = False + ShowCaption = False + ShowHint = False + TabOrder = 0 + object m_lblNoEditor: TLabel + Left = 39 + Top = 37 + Width = 84 + Height = 14 + Caption = #27809#26377#21487#35843#33410#21442#25968 + Font.Charset = DEFAULT_CHARSET + Font.Color = 12429980 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + Visible = False + end + end + object m_tbPosition: TSkinTrackBar + Tag = 1 + Left = 24 + Top = 169 + Width = 356 + Height = 19 + Hint = '0' + Caption = 'm_tbPosition' + FullRepaint = False + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentColor = True + ParentFont = False + ParentShowHint = False + ShowHint = False + TabOrder = 1 + OnChange = PositionChange + Max = 1000 + end + end +end diff --git a/VSTiFormUnit.h b/VSTiFormUnit.h new file mode 100644 index 0000000..490789c --- /dev/null +++ b/VSTiFormUnit.h @@ -0,0 +1,61 @@ +//--------------------------------------------------------------------------- + +#ifndef VSTiFormUnitH +#define VSTiFormUnitH +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include "GeneralDialogPanel.h" +#include "TextButton.h" +#include +#include "ComboBoxComponent.h" +#include "PNGButton.hpp" +#include "SkinTrackBar.h" +//--------------------------------------------------------------------------- +class TVSTiForm : public TForm +{ +__published: // IDE-managed Components + TGeneralDialogPanel *m_BKGPanel; + TTextButton *m_btnCancel; + TTextButton *m_btnOk; + TComboBoxComponent *m_cbChannel; + TPNGButton *m_btnPlay; + TPNGButton *m_btnStop; + TSkinTrackBar *m_tbPosition; + TPanel *m_panShow; + TLabel *m_lblNoEditor; + TLabel *m_lblChannel; + void __fastcall PlayClick(TObject *Sender); + void __fastcall StopClick(TObject *Sender); + void __fastcall PositionChange(TObject *Sender); + void __fastcall FormClose(TObject *Sender, TCloseAction &Action); + void __fastcall FormResize(TObject *Sender); + void __fastcall ChannelChange(TComboBoxItem *Sender, int Index); + void __fastcall FormCreate(TObject *Sender); +private: // User declarations + BYTE m_iVSTi; + int m_iStartBar, m_lenBar; + double m_dblStart, m_dblEnd, m_dblStep, m_dblPos; + int m_iCurrPos; + UINT m_tTimer, m_tAccuracy; + + MESSAGE void __fastcall UMMediaTime(TMessage &Message); + MESSAGE void __fastcall UMEditorResize(TMessage &Message); + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(MSG_MEDIATIME, TMessage, UMMediaTime) + MESSAGE_HANDLER(MSG_VSTEDITORRESIZE, TMessage, UMEditorResize) + END_MESSAGE_MAP(TForm) + +public: // User declarations + BYTE m_iChno; + __fastcall TVSTiForm( TComponent* Owner, BYTE iVSTi, BYTE iChno, int iStart, int len ); + + bool IsEditable(){ return !m_lblNoEditor->Visible; }; +}; +//--------------------------------------------------------------------------- +extern PACKAGE TVSTiForm *VSTiForm; +//--------------------------------------------------------------------------- +#endif diff --git a/VerifyCodeFormUnit.cpp b/VerifyCodeFormUnit.cpp new file mode 100644 index 0000000..37a4709 --- /dev/null +++ b/VerifyCodeFormUnit.cpp @@ -0,0 +1,131 @@ +//--------------------------------------------------------------------------- + +#include +#include +#include +#include "GlobalUnit.h" +#pragma hdrstop + +#include "VerifyCodeFormUnit.h" +#include "MessageFormUnit.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma link "GeneralDialogPanel" +#pragma link "LineEdit" +#pragma link "TextButton" +#pragma resource "*.dfm" +TVerifyCodeForm *VerifyCodeForm; +//--------------------------------------------------------------------------- +__fastcall TVerifyCodeForm::TVerifyCodeForm(TComponent* Owner, String baseUrl) + : TForm(Owner) +{ + for( int i=0; iClassNameIs( TLabel::ClassName() ) ) + ((TLabel*)Components[i])->ControlStyle>>csOpaque; + } + + RESTClient->BaseURL = String(baseUrl); +} +//--------------------------------------------------------------------------- +void __fastcall TVerifyCodeForm::FormCreate(TObject *Sender) +{ + m_editCode->SetTextFont(g_strTxtFontName, g_szFont9); + m_btnOk->FontSize = g_szFont9; + + RefreshCode(); +} +//--------------------------------------------------------------------------- + +void __fastcall TVerifyCodeForm::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) +{ + switch( Key ){ + case VK_RETURN: + OkClick(NULL); + break; + + case VK_ESCAPE: + ModalResult = mrCancel; + break; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TVerifyCodeForm::RefreshCode() +{ + this->Enabled = false; + Screen->Cursor = crHourGlass; + + RESTRequest->Resource = "captcha"; + RESTRequest->Params->Clear(); + + try{ + RESTRequest->Execute(); + } + catch (Exception &exception){ + DebugPrint("exception: %s", exception.Message ); + } + + Screen->Cursor = crDefault; + this->Enabled = true; + + if(RESTResponse->StatusCode==200){ + TJSONValue *jValue = RESTResponse->JSONValue; + if(jValue==NULL) + return; + + TJSONValue *jCode = jValue->FindValue("code"); + if( jCode==NULL ) + return; + + String code = ((TJSONString*)jCode)->Value(); + if(code=="00000"){ + TJSONValue *jData = jValue->FindValue("data"); + + TJSONValue *jKey = jData->FindValue("captchaKey"); + m_sKey = ((TJSONString*)jKey)->Value(); + + TJSONValue *jBase64 = jData->FindValue("captchaBase64"); + String sBase64 = ((TJSONString*)jBase64)->Value(); + sBase64 = sBase64.SubString(23,sBase64.Length()-22); + Sysutils::TBytes bytes = TNetEncoding::Base64String->DecodeStringToBytes(sBase64); + + TPngImage * png = new TPngImage(); + png->LoadFromStream(new TBytesStream(bytes)); + m_imgCode->Picture->Assign(png); + + delete png; + } + else{ + MessageForm->ShowMessage( "获取验证码图片失败,请稍后重试", MB_ICONERROR | MB_OK ); + + return; + } + } + else{ + MessageForm->ShowMessage( "访问服务器异常,请稍后重试", MB_ICONERROR | MB_OK ); + + return; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TVerifyCodeForm::CodeImgClick(TObject *Sender) +{ + RefreshCode(); +} +//--------------------------------------------------------------------------- + +void __fastcall TVerifyCodeForm::OkClick(TObject *Sender) +{ + m_editCode->Text = m_editCode->Text.Trim(); + if(m_editCode->Text.IsEmpty()){ + m_editCode->SetFocus(); + return; + } + + m_sCode = m_editCode->Text; + + ModalResult = mrOk; +} +//--------------------------------------------------------------------------- + diff --git a/VerifyCodeFormUnit.dfm b/VerifyCodeFormUnit.dfm new file mode 100644 index 0000000..2e399c5 --- /dev/null +++ b/VerifyCodeFormUnit.dfm @@ -0,0 +1,93 @@ +object VerifyCodeForm: TVerifyCodeForm + Left = 0 + Top = 0 + BorderIcons = [] + BorderStyle = bsNone + Caption = 'VerifyCode' + ClientHeight = 156 + ClientWidth = 284 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Segoe UI' + Font.Style = [] + KeyPreview = True + Position = poMainFormCenter + Scaled = False + OnCreate = FormCreate + OnKeyDown = FormKeyDown + TextHeight = 15 + object GeneralDialogPanel1: TGeneralDialogPanel + Left = 0 + Top = 0 + Width = 284 + Height = 156 + Align = alClient + Caption = #20154#26426#39564#35777 + Color = 5064257 + ParentBackground = False + TabOrder = 0 + object m_imgCode: TImage + Left = 140 + Top = 52 + Width = 120 + Height = 36 + Hint = #28857#20987#21047#26032 + Center = True + ParentShowHint = False + ShowHint = True + OnClick = CodeImgClick + end + object m_btnOk: TTextButton + Left = 99 + Top = 110 + Width = 85 + Height = 30 + ParentShowHint = False + ShowHint = True + OnClick = OkClick + Text = #30830#23450 + end + object m_editCode: TLineEdit + Left = 20 + Top = 50 + Width = 120 + Height = 40 + ParentCustomHint = False + Alignment = taCenter + HintText = #20154#26426#39564#35777#30721 + NumberMax = -1 + NumberMin = -1 + Color = 15591652 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -19 + Font.Name = 'Tahoma' + Font.Style = [] + TabOrder = 0 + end + end + object RESTClient: TRESTClient + Accept = 'application/json, text/plain; q=0.9, text/html;q=0.8,' + AcceptCharset = 'utf-8, *;q=0.8' + Params = <> + SynchronizedEvents = False + Left = 192 + Top = 131 + end + object RESTRequest: TRESTRequest + Client = RESTClient + Params = <> + Response = RESTResponse + SynchronizedEvents = False + Left = 232 + Top = 131 + end + object RESTResponse: TRESTResponse + ContentType = 'application/json' + ContentEncoding = 'UTF-8' + Left = 200 + Top = 131 + end +end diff --git a/VerifyCodeFormUnit.h b/VerifyCodeFormUnit.h new file mode 100644 index 0000000..17823aa --- /dev/null +++ b/VerifyCodeFormUnit.h @@ -0,0 +1,48 @@ +//--------------------------------------------------------------------------- + +#ifndef VerifyCodeFormUnitH +#define VerifyCodeFormUnitH +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include "GeneralDialogPanel.h" +#include +#include "LineEdit.h" +#include "TextButton.h" +#include +#include +#include +#include +//--------------------------------------------------------------------------- +class TVerifyCodeForm : public TForm +{ +__published: // IDE-managed Components + TGeneralDialogPanel *GeneralDialogPanel1; + TImage *m_imgCode; + TLineEdit *m_editCode; + TTextButton *m_btnOk; + TRESTClient *RESTClient; + TRESTRequest *RESTRequest; + TRESTResponse *RESTResponse; + void __fastcall FormCreate(TObject *Sender); + void __fastcall CodeImgClick(TObject *Sender); + void __fastcall OkClick(TObject *Sender); + void __fastcall FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift); +private: // User declarations + String m_sKey; + String m_sCode; + + void __fastcall RefreshCode(); + +public: // User declarations + String __fastcall GetCode(){return m_sCode;}; + String __fastcall GetKey(){return m_sKey;}; + + __fastcall TVerifyCodeForm(TComponent* Owner, String baseUrl); +}; +//--------------------------------------------------------------------------- +extern PACKAGE TVerifyCodeForm *VerifyCodeForm; +//--------------------------------------------------------------------------- +#endif diff --git a/VolumeFormUnit.cpp b/VolumeFormUnit.cpp new file mode 100644 index 0000000..3493c1a --- /dev/null +++ b/VolumeFormUnit.cpp @@ -0,0 +1,613 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop + +#include "VolumeFormUnit.h" +#include "GlobalUnit.h" +#include "Undo.h" + +//--------------------------------------------------------------------------- +#pragma package(smart_init) +//#pragma link "GeneralDialogPanel" +#pragma link "SkinTrackBar" +#pragma link "LineEdit" + +#pragma resource "*.dfm" +TVolumeForm *VolumeForm; + +#define PLAY_TYPE 0x00 +#define INPUT_TYPE 0x01 +#define COMPOSE_TYPE 0x04 +#define VOICE_TYPE 0x10 + +#define FramColor TColor(0xAA9C91) +#define BkColor TColor(0x453F3A) +#define GroupFrame TColor(0x322F2B) +//--------------------------------------------------------------------------- + +__fastcall TVolumeForm::TVolumeForm(TComponent* Owner) + : TForm(Owner) +{ + m_pTimer = NULL; + m_bRecording = false; +} +//--------------------------------------------------------------------------- + +void __fastcall TVolumeForm::DoFormMouseDown(TObject *Sender, TMouseButton Button, + TShiftState Shift, int X, int Y) +{ + if(X <= 0 || Y <= 0 || X >= Width || Y >= Height) + { + ModalResult = mrCancel; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TVolumeForm::DoFormShow(TObject *Sender) +{ + TPoint clientPos = ScreenToClient(Mouse->CursorPos); + + if(clientPos.X > 0 && clientPos.Y > 0 && + clientPos.X < Width && clientPos.Y < Height) + { + m_IsMouseOver = true; + MouseCapture = false; + } + else + { + m_IsMouseOver = false; + MouseCapture = true; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TVolumeForm::CMMouseEnter(TMessage &Message) +{ + TPoint clientPos = ScreenToClient(Mouse->CursorPos); + + if(clientPos.X >= 0 && clientPos.Y >= 0 && + clientPos.X <= Width && clientPos.Y <= Height && !m_IsMouseOver) + { + m_IsMouseOver = true; + + if(MouseCapture) + MouseCapture = false; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TVolumeForm::CMMouseLeave(TMessage &Message) +{ + TPoint clientPos = ScreenToClient(Mouse->CursorPos); + + if(clientPos.X <= 0 || clientPos.Y <= 0 || + clientPos.X >= Width || clientPos.Y >= Height) + { + m_IsMouseOver = false; + + if(!MouseCapture) + MouseCapture = true; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TVolumeForm::WMKillFocus(TWMKillFocus &Message) +{ + if(!m_IsMouseOver) + ModalResult = mrCancel; +} +//--------------------------------------------------------------------------- + +void __fastcall TVolumeForm::OnMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, + int X, int Y) +{ + if(X < 0 || Y < 0 || X > Width || Y > Height) + { + ModalResult = mrCancel; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TVolumeForm::MouseMove(TShiftState Shift, int X, int Y) +{ + if(MouseCapture && X > 0 && X < Width && Y > 0 && Y < Height) + { + m_IsMouseOver = true; + if(MouseCapture) + MouseCapture = false; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TVolumeForm::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) +{ + switch( Key ){ + case VK_RETURN: + ModalResult = mrOk; + break; + + case VK_ESCAPE: + ModalResult = mrCancel; + break; + + case 'Z': + if( !m_bRecording && Shift.Contains( ssCtrl ) && !m_pTimer ){ + int iType = -1; + if( Shift.Contains( ssShift ) ){ + iType = g_Undo.GetRedoType(); + + if( iType==UNDO_VOLUME ) + Undo( false ); + } + else{ + iType = g_Undo.GetUndoType(); + + if( iType==UNDO_VOLUME ) + Undo( true ); + } + + if( iType>UNDO_VOLUME ) + ModalResult = mrCancel; + } + + break; + } +} +//--------------------------------------------------------------------------- + +void __fastcall TVolumeForm::WMEraseBkgnd(Winapi::Messages::TWMEraseBkgnd &Message) +{ + TRect rect = GetClientRect(); + TRect rectFill = rect; + + TCanvas* tempCanvas = new TCanvas; + tempCanvas->Handle = Message.DC; + + //Ƶɫ + tempCanvas->Brush->Color = TColor(0x004D4641); + tempCanvas->FillRect( rectFill ); + + tempCanvas->Brush->Color = FramColor; + tempCanvas->FrameRect( rect ); + + tempCanvas->Pen->Color = GroupFrame; + tempCanvas->Brush->Color = BkColor; + tempCanvas->RoundRect(10, 10, 110, Height - 10, 5, 5); + + tempCanvas->MoveTo(60, 15); + tempCanvas->LineTo(60, Height - 15); + + int nTB = m_aTracks.size(); + if( nTB>0 ){ + int w = 14*2 + nTB * 20 + (nTB-1)* 32; + tempCanvas->RoundRect(115, 10, w+115, Height - 10, 5, 5); + + int l = 115 + 14 + 20 + 16; + for( int i=1; iMoveTo(l, 15); + tempCanvas->LineTo(l, Height - 15); + l += 20 + 32; + } + } + + delete tempCanvas; + + Message.Result = true; +} +//--------------------------------------------------------------------------- + +void __fastcall TVolumeForm::FormCreate(TObject *Sender) +{ + m_InputTrackBar->Position = (int)( (double)g_fRecordVolume * 100 + 0.5 ); + m_InputTrackBar->OnChange = DoVolumeChanged; + m_ShowInput->Caption = IntToStr( m_InputTrackBar->Position ); + + m_PlayTrackBar->Position = (int)( (double)g_fSpeakerVolume * 100 + 0.5 ); + m_PlayTrackBar->OnChange = DoVolumeChanged; + m_ShowPlay->Caption = IntToStr( m_PlayTrackBar->Position ); + + int lPos = 129; + if( g_lstOpusStages.size()>0 ){ + TSkinTrackBar* pTB = new TSkinTrackBar( this ); + pTB->Orientation = false; + pTB->Parent = this; + pTB->Tag = COMPOSE_TYPE; + pTB->SetBounds( lPos, 34, 20, 150 ); + pTB->Position = (int)( (double)g_fMusicVolume * 100 + 0.5 ); + pTB->Enabled = !g_bComposeMute; + pTB->OnChange = DoVolumeChanged; + m_aTracks.push_back( pTB ); + + TCKBox* pCB = new TCKBox(this); + pCB->Parent = this; + pCB->Caption = ""; + pCB->SetBounds( lPos-2, 184, 24, 16 ); + pCB->Checked = !g_bComposeMute; +// pCB->Hint = "/"; +// pCB->ShowHint = true; + pCB->OnChange = DoTrackMute; + m_aChecks.push_back( pCB ); + + TLabel* pLB = new TLabel(this); + pLB->Parent = this; + pLB->AutoSize = false; + pLB->Caption = IntToStr( pTB->Position ); + pLB->Alignment = taCenter; + pLB->SetBounds( lPos-6, 15, 30, 13 ); + m_aLabels.push_back( pLB ); + + pLB = new TLabel(this); + pLB->Parent = this; + pLB->AutoSize = false; + pLB->Caption = ""; + pLB->Alignment = taCenter; + pLB->SetBounds( lPos-1, 209, 24, 14 ); + m_aLabels.push_back( pLB ); + + lPos += 20 + 32; + } + + if( g_aAudioTracks.size()>1 ){ + for( int i=1; iOrientation = false; + pTB->Parent = this; + pTB->Tag = VOICE_TYPE + i; + pTB->SetBounds( lPos, 34, 20, 150 ); + pTB->Position = (int)( g_aAudioTracks[i]->volume ); + pTB->Enabled = !g_aAudioTracks[i]->IsMute(); + pTB->OnChange = DoVolumeChanged; + m_aTracks.push_back( pTB ); + + TCKBox* pCB = new TCKBox(this); + pCB->Parent = this; + pCB->Caption = ""; + pCB->SetBounds( lPos-2, 184, 24, 16 ); + pCB->Checked = !g_aAudioTracks[i]->IsMute(); + pCB->OnChange = DoTrackMute; + m_aChecks.push_back( pCB ); + + TLabel* pLB = new TLabel(this); + pLB->Parent = this; + pLB->AutoSize = false; + pLB->Caption = IntToStr( pTB->Position ); + pLB->Alignment = taCenter; + pLB->SetBounds( lPos-6, 15, 30, 13 ); + m_aLabels.push_back( pLB ); + + pLB = new TLabel(this); + pLB->Parent = this; + pLB->AutoSize = false; + pLB->Caption = "" + IntToStr( i ); + pLB->Alignment = taCenter; + pLB->SetBounds( lPos-6, 209, 32, 14 ); + m_aLabels.push_back( pLB ); + + lPos += 20 + 32; + } + } + else if( g_aAudioTracks[0]->lstBars.size()>0 ){ + TSkinTrackBar* pTB = new TSkinTrackBar( this ); + pTB->Orientation = false; + pTB->Parent = this; + pTB->Tag = VOICE_TYPE; + pTB->SetBounds( lPos, 34, 20, 150 ); + pTB->Position = (int)( g_aAudioTracks[0]->volume ); + pTB->Enabled = !g_aAudioTracks[0]->IsMute(); + pTB->OnChange = DoVolumeChanged; + m_aTracks.push_back( pTB ); + + TCKBox* pCB = new TCKBox(this); + pCB->Parent = this; + pCB->Caption = ""; + pCB->SetBounds( lPos-2, 184, 24, 16 ); + pCB->Checked = !g_aAudioTracks[0]->IsMute(); + pCB->OnChange = DoTrackMute; + m_aChecks.push_back( pCB ); + + TLabel* pLB = new TLabel(this); + pLB->Parent = this; + pLB->AutoSize = false; + pLB->Caption = IntToStr( pTB->Position ); + pLB->Alignment = taCenter; + pLB->SetBounds( lPos-6, 15, 30, 13 ); + m_aLabels.push_back( pLB ); + + pLB = new TLabel(this); + pLB->Parent = this; + pLB->AutoSize = false; + pLB->Caption = "" + IntToStr( 1 ); + pLB->Alignment = taCenter; + pLB->SetBounds( lPos-6, 209, 32, 14 ); + m_aLabels.push_back( pLB ); + } + + int nTB = m_aTracks.size(); + if( nTB>0 ){ + Width += 5 + 14*2 + nTB * 20 + (nTB-1)* 32; + } + + SetTransparent( this ); +} +//--------------------------------------------------------------------------- + +void __fastcall TVolumeForm::FormDestroy(TObject *Sender) +{ + for( int i=0; iEnabled ){ + TimerProc( m_pTimer ); + } + else{ + delete m_pTimer; + m_pTimer = NULL; + } + } +} +//--------------------------------------------------------------------------- + +void __fastcall TVolumeForm::DoVolumeChanged(TObject *Sender) +{ + TSkinTrackBar* pTB = (TSkinTrackBar*)Sender; + TLabel* pVLB = NULL; + + float fVol = pTB->Position / 100.0; + + if( pTB->TagTag, fVol ); + + if( pTB->Tag==PLAY_TYPE ){ + g_fSpeakerVolume = fVol; + pVLB = m_ShowPlay; + } + else if( pTB->Tag==INPUT_TYPE ){ + g_fRecordVolume = fVol; + pVLB = m_ShowInput; + } + else{ + int iUndoCode = pTB->Tag; + int volBefore = 0, volAfter = pTB->Position; + + if( pTB->Tag==COMPOSE_TYPE ){ + + volBefore = (int)( (double)g_fMusicVolume * 100 + 0.5 ); + g_fMusicVolume = fVol; + + pVLB = m_aLabels[0]; + } + else{ + int iTrack = pTB->Tag & 0x0F; + + if( !IsTrackMute( ST_AUDIO, iTrack ) ) + f_MM_SetAudioTrackParam( iTrack, 0, fVol ); + + volBefore = g_aAudioTracks[iTrack]->volume; + g_aAudioTracks[iTrack]->volume = pTB->Position; + + for( int i=0; iMainFormHandle, UM_AUDIOVOLCHANGED, iTrack, 0 ); + } + + bool bAddUndo = true; + + TUndoLite* pLite = g_Undo.GetLastLite(); + if( pLite && pLite->iType==UNDO_VOLUME && pLite->iCode==iUndoCode + && (int)pLite->pBefore>=0 && (int)pLite->pAfter>=0 ){ + bAddUndo = false; + if( (int)pLite->pBefore==volAfter ){ + g_Undo.CancelUndo(); + } + else{ + pLite->pAfter = (void*)volAfter; + } + } + + if( bAddUndo ){ + g_Undo.AddUndo( UNDO_VOLUME, iUndoCode, 0, 0, + (void*)volBefore, (void*)volAfter ); + } + } + + if( pVLB ) + pVLB->Caption = String((int)(pTB->Position)); +} +//--------------------------------------------------------------------------- + +void __fastcall TVolumeForm::DoTrackMute(TObject *Sender) +{ + for( int i=0; iChecked; + float fVol = bNoMute ? m_aTracks[i]->Position / 100.0 : 0; + int volBefore, volAfter; + + m_aTracks[i]->Enabled = bNoMute; + + if( m_aTracks[i]->Tag==COMPOSE_TYPE ){ + g_bComposeMute = !bNoMute; + f_MM_SetStreamVolume( m_aTracks[i]->Tag, fVol ); + + volBefore = bNoMute ? -1 : m_aTracks[i]->Position, + volAfter = bNoMute ? m_aTracks[i]->Position : -1; + } + else{ + int iTrack = m_aTracks[i]->Tag & 0x0F; + bool bSet = false, bUnset = false; + + ChangeTrackState( ST_AUDIO, iTrack, TRACK_MUTE, bSet, bUnset ); + PostMessage( Application->MainFormHandle, UM_AUDIOVOLCHANGED, iTrack, + MAKELONG( TRACK_MUTE, bUnset ) ); + + volBefore = bNoMute ? -1 : bUnset, + volAfter = bNoMute ? bUnset : -1; + } + + bool bAddUndo = true; + TUndoLite* pLite = g_Undo.GetLastLite(); + + if( pLite && pLite->iType==UNDO_VOLUME && pLite->iCode==m_aTracks[i]->Tag + && (int)pLite->pBefore==volAfter + && (int)pLite->pAfter==volBefore ){ + g_Undo.CancelUndo(); + bAddUndo = false; + } + + if( bAddUndo ){ + g_Undo.AddUndo( UNDO_VOLUME, m_aTracks[i]->Tag, 0, 0, + (void*)volBefore, (void*)volAfter ); + } + + break; + } + } +} +//--------------------------------------------------------------------------- + +void __fastcall TVolumeForm::TimerProc(TObject* Sender) +{ + if( m_pTimer ){ + m_pTimer->Enabled = false; + + Undo( m_pTimer->Tag ); + + delete m_pTimer; + m_pTimer = NULL; + } +} +//--------------------------------------------------------------------------- + +int __fastcall TVolumeForm::ShowUndo( bool bUndo ) +{ + if( !m_pTimer ){ + m_pTimer = new TTimer(this); + m_pTimer->OnTimer = TimerProc; + m_pTimer->Interval = 100; + m_pTimer->Tag = bUndo ? 1 : 0; + m_pTimer->Enabled = true; + } + + return ShowModal(); +} +//--------------------------------------------------------------------------- + +void __fastcall TVolumeForm::OnRecord( bool bRecord ) +{ + m_bRecording = bRecord; + + int nTB = m_aTracks.size(); + if( nTB>0 ){ + for( int i=0; iEnabled = !bRecord && m_aChecks[i]->Checked; + m_aChecks[i]->Enabled = !bRecord; + } + } +} +//--------------------------------------------------------------------------- + +void TVolumeForm::Undo( bool bUndo ) +{ + TUndoLite* pLite = bUndo ? g_Undo.Undo() : g_Undo.Redo(); + int volSet = (int)( bUndo ? pLite->pBefore : pLite->pAfter ); + bool bMuted = (int)pLite->pBefore < 0 || (int)pLite->pAfter < 0; + + TSkinTrackBar* pTB = NULL; + TLabel* pVLB = NULL; + TCKBox* pCB = NULL; + + if( pLite->iCode==COMPOSE_TYPE ){ + pTB = m_aTracks[0]; + pVLB = m_aLabels[0]; + pCB = m_aChecks[0]; + } + else{ + for( int i=0; iTag==pLite->iCode ){ + pTB = m_aTracks[i]; + pVLB = m_aLabels[i*2]; + pCB = m_aChecks[i]; + break; + } + } + } + + pTB->Enabled = volSet>=0; + pCB->OnChange = NULL; + pCB->Checked = volSet>=0; + pCB->OnChange = DoTrackMute; + + if( bMuted ){ + if( pLite->iCode==COMPOSE_TYPE ){ + g_bComposeMute = volSet<0; + f_MM_SetStreamVolume( pLite->iCode, volSet<0 ? 0 : volSet / 100.0 ); + } + else{ + int iTrack = pLite->iCode & 0x0F; + bool bSolo = volSet>0; + int iState = bSolo ? TRACK_SOLO : TRACK_MUTE; + bool bSet = false, bUnset = false; + + ChangeTrackState( ST_AUDIO, iTrack, iState, bSet, bUnset ); + PostMessage( Application->MainFormHandle, UM_AUDIOVOLCHANGED, iTrack, + MAKELONG( iState, bUnset ) ); + } + } + else if( volSet>=0 ){ + float fVol = volSet / 100.0; + + if( pLite->iCode==COMPOSE_TYPE ){ + g_fMusicVolume = fVol; + f_MM_SetStreamVolume( pLite->iCode, fVol ); + } + else{ + int iTrack = pTB->Tag & 0x0F; + bool bStateChange = g_aAudioTracks[iTrack]->IsMute(); + + if( bStateChange ){ + g_aAudioTracks[iTrack]->Mute(false); + } + else{ + if( !IsTrackMute( ST_AUDIO, iTrack ) ) + f_MM_SetAudioTrackParam( iTrack, 0, fVol ); + + g_aAudioTracks[iTrack]->volume = volSet; + PostMessage( Application->MainFormHandle, UM_AUDIOVOLCHANGED, iTrack, 0 ); + } + } + + pTB->OnChange = NULL; + pTB->Position = volSet; + pTB->OnChange = DoVolumeChanged; + + pVLB->Caption = String(IntToStr(volSet)); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TVolumeForm::FormClose(TObject *Sender, TCloseAction &Action) +{ + PostMessage( Application->MainForm->Handle, UM_SHOW_VOLSET, 0, 0 ); +} +//--------------------------------------------------------------------------- + +void __fastcall TVolumeForm::ChangeRecordVol() +{ + m_InputTrackBar->OnChange = NULL; + m_InputTrackBar->Position = (int)( (double)g_fRecordVolume * 100 + 0.5 ); + m_InputTrackBar->OnChange = DoVolumeChanged; + m_ShowInput->Caption = IntToStr( m_InputTrackBar->Position ); +} +//--------------------------------------------------------------------------- + diff --git a/VolumeFormUnit.dfm b/VolumeFormUnit.dfm new file mode 100644 index 0000000..c4bccdc --- /dev/null +++ b/VolumeFormUnit.dfm @@ -0,0 +1,120 @@ +object VolumeForm: TVolumeForm + Left = 0 + Top = 0 + BorderStyle = bsNone + Caption = 'VolumeForm' + ClientHeight = 240 + ClientWidth = 120 + Color = 4538170 + Font.Charset = DEFAULT_CHARSET + Font.Color = 14339007 + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + KeyPreview = True + Scaled = False + OnClose = FormClose + OnCreate = FormCreate + OnDestroy = FormDestroy + OnKeyDown = FormKeyDown + OnMouseDown = OnMouseDown + OnShow = DoFormShow + TextHeight = 13 + object m_InputLabel: TLabel + Left = 75 + Top = 209 + Width = 24 + Height = 14 + Caption = #24405#38899 + Font.Charset = DEFAULT_CHARSET + Font.Color = 14339007 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object m_PlayLabel: TLabel + Left = 23 + Top = 209 + Width = 24 + Height = 14 + Caption = #25773#25918 + Font.Charset = DEFAULT_CHARSET + Font.Color = 14339007 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object m_ShowInput: TLabel + Left = 70 + Top = 15 + Width = 30 + Height = 13 + Alignment = taCenter + AutoSize = False + Caption = '100' + Font.Charset = DEFAULT_CHARSET + Font.Color = 14339007 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object m_ShowPlay: TLabel + Left = 18 + Top = 15 + Width = 30 + Height = 13 + Alignment = taCenter + AutoSize = False + Caption = '100' + Font.Charset = DEFAULT_CHARSET + Font.Color = 14339007 + Font.Height = -12 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + end + object m_InputTrackBar: TSkinTrackBar + Tag = 1 + Left = 76 + Top = 34 + Width = 20 + Height = 170 + Hint = '100' + Caption = 'm_InputTrackBar' + UseDockManager = False + FullRepaint = False + Font.Charset = DEFAULT_CHARSET + Font.Color = 14339007 + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentColor = True + ParentFont = False + TabOrder = 0 + Orientation = False + Position = 100 + end + object m_PlayTrackBar: TSkinTrackBar + Left = 24 + Top = 34 + Width = 20 + Height = 170 + Hint = '100' + Caption = 'm_PlayTrackBar' + UseDockManager = False + FullRepaint = False + Font.Charset = DEFAULT_CHARSET + Font.Color = 14339007 + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentColor = True + ParentFont = False + TabOrder = 1 + Orientation = False + Position = 100 + end +end diff --git a/VolumeFormUnit.h b/VolumeFormUnit.h new file mode 100644 index 0000000..aa0fb01 --- /dev/null +++ b/VolumeFormUnit.h @@ -0,0 +1,82 @@ +//--------------------------------------------------------------------------- + +#ifndef VolumeFormUnitH +#define VolumeFormUnitH +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include +#include +#include "SkinTrackBar.h" +//#include "LineEdit.h" +#include "CKBox.h" +#include "MessageDef.h" + +#include +using namespace std; + +//--------------------------------------------------------------------------- +class TVolumeForm : public TForm +{ +__published: // IDE-managed Components + TSkinTrackBar *m_InputTrackBar; + TSkinTrackBar *m_PlayTrackBar; + TLabel *m_InputLabel; + TLabel *m_PlayLabel; + TLabel *m_ShowInput; + TLabel *m_ShowPlay; + + void __fastcall DoFormMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, + int X, int Y); + void __fastcall DoFormShow(TObject *Sender); + void __fastcall OnMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y); + void __fastcall FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift); + void __fastcall FormCreate(TObject *Sender); + void __fastcall FormDestroy(TObject *Sender); + void __fastcall FormClose(TObject *Sender, TCloseAction &Action); +private: // User declarations + bool m_IsMouseOver; + bool m_bRecording; +// int m_volBefore; + + TTimer *m_pTimer; //ȷundoʱ + + vector m_aLabels; + vector m_aChecks; + vector m_aTracks; + + void Undo( bool bUndo ); + + void __fastcall DoVolumeChanged(TObject *Sender); + void __fastcall DoTrackMute(TObject *Sender); + void __fastcall TimerProc(TObject* Sender); + + MESSAGE void __fastcall WMEraseBkgnd(Winapi::Messages::TWMEraseBkgnd &Message); + MESSAGE void __fastcall CMMouseEnter(TMessage &Message); + MESSAGE void __fastcall CMMouseLeave(TMessage &Message); + MESSAGE void __fastcall WMKillFocus(TWMKillFocus &Message); + + BEGIN_MESSAGE_MAP + MESSAGE_HANDLER(WM_ERASEBKGND, TWMEraseBkgnd, WMEraseBkgnd) + MESSAGE_HANDLER(CM_MOUSEENTER, TMessage, CMMouseEnter) + MESSAGE_HANDLER(CM_MOUSELEAVE, TMessage, CMMouseLeave) + MESSAGE_HANDLER(WM_KILLFOCUS, TWMKillFocus, WMKillFocus) + + END_MESSAGE_MAP(TForm) + +protected: + DYNAMIC void __fastcall MouseMove(TShiftState Shift, int X, int Y); + +public: // User declarations + __fastcall TVolumeForm(TComponent* Owner); + + int __fastcall ShowUndo( bool bUndo ); + void __fastcall OnRecord( bool bRecord ); + void __fastcall ChangeRecordVol(); +}; +//--------------------------------------------------------------------------- +extern PACKAGE TVolumeForm *VolumeForm; +//--------------------------------------------------------------------------- +#endif diff --git a/commonstruct.h b/commonstruct.h new file mode 100644 index 0000000..df27dd1 --- /dev/null +++ b/commonstruct.h @@ -0,0 +1,467 @@ +#ifndef _COMMONSTRUCT_H_ +#define _COMMONSTRUCT_H_ + +#pragma once +#define MAX_STYLE_NUM 64 + +enum EClientType{ + e_Ac_Windows, + e_CZ_Android, + e_CZ_iOS, + e_Ac_Android, + e_Ac_iOS, + e_Web, + e_Pro_Windows, + e_SM_Checker, + e_Pro_Lite +}; + +enum EStyleState{ + e_OffLine = -2, // + e_CheckFail, //δͨ + e_Checking, // + e_Distribute, // + e_UnDownload, //δ + e_Downloading, // + e_Downloaded // +}; + +enum EPaymentOperation{ + e_PO_Pay4Basic = 0x01, //ܷ + e_PO_Pay4Compose = 0x02, // + e_PO_Pay4Midi = 0x04, //MIDI + e_PO_Pay4Audios = 0x08, // + e_PO_Pay4Fonts = 0x10, //ɫ + e_PO_End +}; + +enum EStyleType{ + e_ST_BEGIN, + e_ST_Origin, + e_ST_Temp, + e_ST_Share, + e_ST_END +}; + +enum EMessageType{ + e_InvalidMessage, + + e_versionRequest = 0x01, + e_versionResponse, + + e_connectRequest = 0x11, + e_connectResponse, + + e_loginRequest = 0x21, + e_loginResponse, + e_verifyRequest, + e_verifyResponse, + e_purchaseRequest, + e_purchaseResponse, + e_registerRequest, + e_registerResponse, + e_checkPaymentRequest, + e_checkPaymentResponse, + e_payRequest, + e_payResponse, + e_iconRequest, + e_iconResponse, + e_logoffRequest, + e_logoffResponse, + + e_dataSendRequest = 0x41, + e_dataSendResponse, + e_dataReceiveRequest, + e_dataReceiveResponse, + + e_styleUpdateRequest = 0x61, + e_styleUpdateResponse, + e_styleInfoRequest, + e_styleInfoResponse, + e_styleDataRequest, + e_styleDataResponse, + e_styleCheckRequest, + e_styleCheckResponse, + e_styleRecomRequest, + e_styleRecomResponse, + + e_uploadStyleRequest = 0x81, + e_uploadStyleResponse, + e_uploadSongRequest, + e_uploadSongResponse, + + e_qnaUpdateRequest = 0x91, + e_qnaUpdateResponse, + e_qnaSubmitRequest, + e_qnaSubmitResponse, + e_noticeUpdateRequest, + e_noticeUpdateResponse, + + e_MessgeTypeEnd +}; + +enum EExtraInfo{ + e_RequestSuccess, + + e_UpdateNoNeed, //°汾 + e_UpdateOptional, //汾ѡ + e_UpdateMandatory, //汾ǿƸ + + e_VerifyInsufficient, + + e_ShareStyle = 0x100, //Ϣ + e_CheckStyle = 0x101, //˷Ϣ + + e_RequestFailed = 0x8000, + e_SocketError, + e_WaitTimeout, + e_DatabaseError, + e_ParamError, + e_LoginPasswordError, + e_LoginUserNotExist, + e_InvalidUserID, + e_InvalidStyleID, + + e_UserCanceled, + e_NoService, + e_ServiceBusy, + + e_InvalidDataID, + e_InvalidPackID, + e_OutOfBound, + e_InvalidData, + e_InvalidAuthority, //޲Ȩ + e_CheckedAlready, //ѱ + + e_UsernameExist, + e_OpenFileFailed, + + e_NeedRepeat, //طϢ + + e_VipExceeded, //VIPû豸 + + e_UserLocked, //˻ + e_UserDeleted, //˻ɾ + + e_FormatErr = 0x81000000, //ʽ + e_TrkNumErr, //ƥ + e_TrkToMuch, // + e_MemErr, //ڴ + e_Unsupport, //ֵ֧ĸʽ + e_InvalidParam, //Ч + e_FileNotExist, //ָļ + e_NoTrack, //Ч + e_Unknown, //δ֪ + + e_ExtraEnd +}; + +#pragma pack (2) + +// ͨϢ +typedef struct tagChan{ + char no; //ͨ + char prog; // + char vol; // + + tagChan(){ + no = prog = vol = -1; + } +}TCHAN, *PTCHAN; + +//ϸϢṹ +typedef struct tagStyleDetail{ + int size; + int idAuthor; //ID + + short iTempo; //ԭ + short iTimesignature; // ( 0=4/4, 1=3/4, 2=2/4, 3=6/8 ) + char type[4]; // + char nSegNum[4]; ///ӻ/ǰ/β + + //²ֿɱ䳤ȴʹ洢 + char strAuthor[40]; // UTF8 + char strStyleName[40]; // UTF8 + char strDescription[120]; // UTF8 + + char aIntroBars[8]; //ǰС (0/2/4/6 1/3/5/7С) + char aEndingBars[8]; //βС (0/2/4/6 1/3/5/7С) + char chordRecom[8]; //Ƽ + + TCHAN tracks[4][8][16]; ///ӻ/ǰ/βϢ (ǰ/β0/2/4/6 1/3/5/7С) + + tagStyleDetail(){ + size = sizeof(tagStyleDetail); + idAuthor = iTempo = iTimesignature = 0; + memset( type, -1, sizeof(type) ); + memset( nSegNum, 0, sizeof(nSegNum) ); + + memset( strAuthor, 0, sizeof(strAuthor) ); + memset( strStyleName, 0, sizeof(strStyleName) ); + memset( strDescription, 0, sizeof(strDescription) ); + + memset( aIntroBars, 0, sizeof(aIntroBars) ); + memset( aEndingBars, 0, sizeof(aEndingBars) ); + memset( chordRecom, -1, sizeof(chordRecom) ); + } +}TSTYLEDETAIL, *PTSTYLEDETAIL; + +typedef struct tagTrackOld +{ + int iStyleId; //0 = ԭļ룿 + BYTE iStyleLoc; //λ 0=ٷ1=أ2=ʱ + BYTE iSegNo; //Ƭκ VAR:0-3, FILL:0-1, INTRO/ENDING: 0-3 [+(1...2 * 16)ָС] + BYTE iChanNo; //ͨ 0-15 9Ϊֹ + BYTE iChanSpec; //ָͨţϷʱֹchanͻ + BYTE iProg; // 0-127 + BYTE nVol; // 0-127 + + tagTrackOld(){ + memset( this, 0, sizeof(tagTrackOld) ); + }; +}TTrackOld; + +typedef struct tagTrackOldProj +{ + UINT iStyleLoc; //λID + UINT iStyleId; //0 = ԭļ + BYTE iSegNo; //Ƭκ VAR:0-7, FILL:0-7, INTRO/ENDING: 0-3 [+(1...2 * 16)ָС] + BYTE iChanNo; //ͨ 0-15 9Ϊֹ + BYTE iChanSpec; //ָͨţϷʱֹchanͻ + BYTE iProg; // 0-127 + BYTE nVol; // 0-127 + BYTE rsvd; +}TTrackOldProj; + +typedef struct tagComposeTrack +{ + UINT iStyleLoc; //λID + UINT iStyleId; //0 = ԭļ + BYTE iSegNo; //Ƭκ VAR:0-7, FILL:0-7, INTRO/ENDING: 0-3 [+(1...2 * 16)ָС] + BYTE iChanNo; //ͨ 0-15 9Ϊֹ + BYTE iChanSpec; //ָͨţϷʱֹchanͻ + BYTE iProg; // 0-127 + BYTE nVol; // 0-127 + BYTE iFile; //ļţֹchanͻ + char iPan; // -63=left, 0=middle, 63=right + char nGain; // -127<0<+127 + + tagComposeTrack(){ + memset( this, 0, sizeof(tagComposeTrack) ); + }; + + tagComposeTrack( tagComposeTrack* src ){ + memcpy( this, src, sizeof(tagComposeTrack) ); + }; +}TComposeTrack; + +typedef struct tagTrack +{ + UINT iStyleLoc; //λid 0=ٷ 1= -1=ʱ = + UINT iStyleId; //0 = ԭļ룿 + BYTE iSegNo; //Ƭκ VAR:0-3, FILL:0-1, INTRO/ENDING: 0-3 [+(1...2 * 16)ָС] + BYTE iChanNo; //ͨ 0-15 9Ϊֹ + BYTE iChanSpec; //ָͨţϷʱֹchanͻ + BYTE iProg; // 0-127 + BYTE iProgOrig; //ԭʼ + char nVol; // 0-127 nVol>=0x80 + char nVolOrig; //ԭʼ + BYTE iBank; //Դ -1=ȫSF2, otherΪָԴ + BYTE iFile; //ļ chanͻ + char rsvd; //ֽ + + tagTrack(){ + memset( this, 0, sizeof(tagTrack) ); + iFile = iBank = 0xFF; + }; + + tagTrack( tagTrack* src ){ + memcpy( this, src, sizeof(tagTrack) ); + }; +}TTrack; + +typedef struct tagBarChords +{ + //ÿС4 + BYTE iKey[4]; //ҵ + BYTE iType[4]; // + + tagBarChords(){ + memset( this, -1, sizeof(tagBarChords) ); + }; + + tagBarChords( tagBarChords* src ){ + memcpy( this, src, sizeof(tagBarChords) ); + }; +} TBarChords; //СڣǰβΣ + +typedef struct tagStage +{ + char iSegType; //Ƭ 0=VAR, 1=FILL, 2=INTRO, 3=ENDING + char iSegKey; //Ƭε + WORD reserved; //ֶΣֽ + + int nBarNum; //䳤 + TBarChords* aChords; //Сں + + int nTrkNum; // + TComposeTrack* aTracks; // + + tagStage(){ + memset( this, 0, sizeof(tagStage) ); + }; + + tagStage( tagStage* src ){ + memcpy( this, src, sizeof(tagStage) ); + if( src->aTracks ){ + aTracks = new TComposeTrack[nTrkNum]; + memcpy( aTracks, src->aTracks, sizeof(TComposeTrack)*nTrkNum ); + } + + if( src->aChords ){ + aChords = new TBarChords[nBarNum]; + memcpy( aChords, src->aChords, sizeof(TBarChords)*nBarNum ); + } + }; + + ~tagStage(){ + if( aTracks ) + delete[] aTracks; + if( aChords ) + delete[] aChords; + } +} TStage; //ʱõĽṹ + + +//汾ṹ +typedef struct +{ + WORD majorVersion; //汾 + WORD minorVersion; //ΰ汾ţͻ0=Windows, 1=Android, 2=iOS, 3=ϳ, 4= ) + WORD modifyVersion; //޸İ汾 + WORD buildVersion; //汾 +}TVERSION, *PTVERSION; + +#define MAX_DESCRIB_LENGTH 1024 + +//Ϣṹ +typedef struct tSoftwareInfo{ + int size; + TVERSION version; + UINT nFileSize; + UINT tIssueDate; + char strDescribe[MAX_DESCRIB_LENGTH]; + + tSoftwareInfo(){ + memset( this, 0, sizeof(tSoftwareInfo) ); + size = sizeof(tSoftwareInfo); + }; +} TSOFTWAREINFO, *PTSOFTWAREINFO; + +#pragma pack (4) + +//˻Ϣṹ +typedef struct tAccountInfo{ + int ID; //ûID + UINT authority; //ûȨ + int balance; //ʻ() + int pops; //ֵ + int fans; //˿ + int songs; // + int vipPeriod; //VIPʱ-1= 0=VIP =vipʣ + + tAccountInfo(){ + memset( this, 0, sizeof(tAccountInfo) ); + }; +}TACCOUNTINFO, *PTACCOUNTINFO; + +//ûϢṹ +typedef struct tUserInfo{ + char strUserName[32]; + char strPassword[80]; + char strNickName[32]; //ûdz + char strIconFile[32]; //ûͷ + TACCOUNTINFO accountInfo; //˻Ϣ + int ownStyleNum; //ѹ + int arrStyleId[16]; //ѹID + + tUserInfo(){ + memset( strUserName, 0, 32 ); + memset( strPassword, 0, 80 ); + memset( strNickName, 0, 32 ); + memset( strIconFile, 0, 32 ); + memset( arrStyleId, 0, 16 ); + ownStyleNum = 0; + }; +}TUSERINFO,*PTUSERINFO; + +//ַԽṹ +typedef struct tStringPair{ + char str1[320]; + char str2[640]; + + tStringPair(){ + memset( str1, 0, 320 ); + memset( str2, 0, 640 ); + } +} TSTRINGPAIR, *PTSTRINGPAIR; + +//ϴϢṹ +typedef struct tSongInfo{ + int size; //ṹС + char strSongName[64]; // + int iTempo; //ٶ + char iTS; // + char iCreation; // (1:ԭ 3:ı) + char iSubmit; //ύ״̬(0:ύ1:Զύ) + char iSingerType; //ݳ (1У2Ů3ϣ40δ֪) + char strSinger[32]; //ݳ + char strOriginal[32]; //ԭ + char strLyricist[32]; // + char strComposer[32]; // + char strArranger[32]; // + char iMusicStyle[4]; // + UINT aStyleIDs[32]; //ʹõķID + char strDescription[640];// + char* strLyric; // + char* strMp3Name; //mp3ʱļ + char* strIconName; //ʱļ + + //ϴļ + UINT cpjVersion; //̰汾 + int cpjPrice; //շ + char* strCpjName; //ļ + + + tSongInfo(){ + memset( this, 0, sizeof(tSongInfo) ); + memset( iMusicStyle, -1, 4 ); + size = sizeof(tSongInfo); + }; + + ~tSongInfo(){ + if( strLyric ) + delete[] strLyric; + if( strMp3Name ) + delete[] strMp3Name; + if( strIconName ) + delete[] strIconName; + if( strCpjName ) + delete[] strCpjName; + }; +} TSONGINFO, *PTSONGINFO; + +//ϴطϢṹ +typedef struct tShareInfo{ + UINT idSong; //ID + char strSongURL[256]; //ļURL + char strCoverURL[256]; //URL + + tShareInfo(){ + memset( this, 0, sizeof(tShareInfo) ); + }; +} TSHAREINFO, *PTSHAREINFO; + +#pragma pack() + +#endif //_COMMONSTRUCT_H_ \ No newline at end of file diff --git a/structures.h b/structures.h new file mode 100644 index 0000000..0164612 --- /dev/null +++ b/structures.h @@ -0,0 +1,96 @@ +#ifndef _STRUCTURES_H_ +#define _STRUCTURES_H_ + +#define MAX_DESCRIB_LENGTH 1024 +#define MAX_STYLE_NUM 80 + +#pragma once +enum EMessageType{ + e_InvalidMessage, + + e_versionRequest, + e_versionResponse, + e_softwareUpdateRequest, + e_softwareUpdateResponse, + e_styleUpdateRequest, + e_styleUpdateResponse, + + e_loginRequest, + e_loginResponse, + e_verifyRequest, + e_verifyResponse, + e_purchaseRequest, + e_purchaseResponse, + + e_uploadStyleRequest, + e_uploadStyleResponse, + e_dataSendInd, + e_dataReceivedInd, + + e_udpConnectRequest, + e_udpConnectResponse, + + e_MessgeTypeEnd +}; + +enum EExtraInfo{ + e_RequestSuccess, + + e_UpdateNoNeed, + e_UpdateOptional, + e_UpdateMandatory, + + e_VerifyInsufficient, + + e_RequestFailed = 0x8000, + e_SocketError, + e_WaitTimeout, + e_DatabaseError, + e_ParamError, + e_LoginPasswordError, + e_LoginUserNotExist, + e_InvalidUserID, + e_InvalidStyleID, + + e_UserCanceled, + e_NoService, + e_ServiceBusy, + + e_InvalidFileID, + e_InvalidPackID, + e_OutOfBound, + + e_ExtraEnd +}; + +#pragma pack (4) + +//ûϢṹ壨ͻ˲ࣩ +typedef struct tUserInfo{ + char strUserName[80]; + char strPassword[80]; + int ID; //ûID + int integral;// + int grade; //ȼ + int vipFlag; //VIP־ + double balance; //ʻ + int ownStyleNum; //ѹ + int arrStyleId[1000]; //ѹID + + tUserInfo(){ memset( this, 0, sizeof(tUserInfo) ); }; +}TUSERINFO,*PTUSERINFO; + +typedef struct tSoftwareInfo{ + WORD majorVersion; + WORD minorVersion; + WORD modifyVersion; + WORD buildVersion; + UINT nFileSize; + UINT tIssueDate; + char strDescribe[MAX_DESCRIB_LENGTH]; + UINT nAvaliableStyleNum; + tSoftwareInfo(){ memset( this, 0, sizeof(tSoftwareInfo) ); }; +} TSOFTWAREINFO, *PTSOFTWAREINFO; + + +#endif \ No newline at end of file