diff --git a/Tutorial/GacUI_Controls/Dialogs/Dialogs.vcxproj b/Tutorial/GacUI_Controls/Dialogs/Dialogs.vcxproj
index 67f0198b..a28f5586 100644
--- a/Tutorial/GacUI_Controls/Dialogs/Dialogs.vcxproj
+++ b/Tutorial/GacUI_Controls/Dialogs/Dialogs.vcxproj
@@ -104,7 +104,7 @@
true
true
true
- WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)
+ WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);VCZH_DEBUG_NO_REFLECTION
true
stdcpp20
diff --git a/Tutorial/GacUI_Controls/GacUI_Controls.sln b/Tutorial/GacUI_Controls/GacUI_Controls.sln
index 9d6eb09b..8a034cc2 100644
--- a/Tutorial/GacUI_Controls/GacUI_Controls.sln
+++ b/Tutorial/GacUI_Controls/GacUI_Controls.sln
@@ -45,6 +45,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ColorPicker2", "ColorPicker
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Dialogs", "Dialogs\Dialogs.vcxproj", "{5D6CC27A-A227-4A12-B56E-827E671F1445}"
EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GlobalHotKey", "GlobalHotKey\GlobalHotKey.vcxproj", "{817507B6-7715-4C02-8DEA-28F55F8E6C03}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
@@ -203,6 +205,14 @@ Global
{5D6CC27A-A227-4A12-B56E-827E671F1445}.Release|Win32.Build.0 = Release|Win32
{5D6CC27A-A227-4A12-B56E-827E671F1445}.Release|x64.ActiveCfg = Release|x64
{5D6CC27A-A227-4A12-B56E-827E671F1445}.Release|x64.Build.0 = Release|x64
+ {817507B6-7715-4C02-8DEA-28F55F8E6C03}.Debug|Win32.ActiveCfg = Debug|Win32
+ {817507B6-7715-4C02-8DEA-28F55F8E6C03}.Debug|Win32.Build.0 = Debug|Win32
+ {817507B6-7715-4C02-8DEA-28F55F8E6C03}.Debug|x64.ActiveCfg = Debug|x64
+ {817507B6-7715-4C02-8DEA-28F55F8E6C03}.Debug|x64.Build.0 = Debug|x64
+ {817507B6-7715-4C02-8DEA-28F55F8E6C03}.Release|Win32.ActiveCfg = Release|Win32
+ {817507B6-7715-4C02-8DEA-28F55F8E6C03}.Release|Win32.Build.0 = Release|Win32
+ {817507B6-7715-4C02-8DEA-28F55F8E6C03}.Release|x64.ActiveCfg = Release|x64
+ {817507B6-7715-4C02-8DEA-28F55F8E6C03}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/Tutorial/GacUI_Controls/GlobalHotKey/GlobalHotKey.vcxproj b/Tutorial/GacUI_Controls/GlobalHotKey/GlobalHotKey.vcxproj
new file mode 100644
index 00000000..322bc5bf
--- /dev/null
+++ b/Tutorial/GacUI_Controls/GlobalHotKey/GlobalHotKey.vcxproj
@@ -0,0 +1,161 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Release
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ x64
+
+
+
+ 16.0
+ Win32Proj
+ {817507b6-7715-4c02-8dea-28f55f8e6c03}
+ GlobalHotKey
+ 10.0
+
+
+
+ Application
+ true
+ v143
+ Unicode
+
+
+ Application
+ false
+ v143
+ true
+ Unicode
+
+
+ Application
+ true
+ v143
+ Unicode
+
+
+ Application
+ false
+ v143
+ true
+ Unicode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ $(ProjectDir)..\..\..\Import;$(IncludePath)
+
+
+ $(ProjectDir)..\..\..\Import;$(IncludePath)
+
+
+ $(ProjectDir)..\..\..\Import;$(IncludePath)
+
+
+ $(ProjectDir)..\..\..\Import;$(IncludePath)
+
+
+
+ Level3
+ true
+ VCZH_DEBUG_NO_REFLECTION;WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)
+ true
+ stdcpp20
+
+
+ Windows
+ true
+
+
+
+
+ Level3
+ true
+ true
+ true
+ VCZH_DEBUG_NO_REFLECTION;WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)
+ true
+ stdcpp20
+
+
+ Windows
+ true
+ true
+ true
+
+
+
+
+ Level3
+ true
+ VCZH_DEBUG_NO_REFLECTION;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)
+ true
+ stdcpp20
+
+
+ Windows
+ true
+
+
+
+
+ Level3
+ true
+ true
+ true
+ VCZH_DEBUG_NO_REFLECTION;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)
+ true
+ stdcpp20
+
+
+ Windows
+ true
+ true
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+ {96c559ca-9718-4bec-a053-28a0ab6a8ca2}
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Tutorial/GacUI_Controls/GlobalHotKey/GlobalHotKey.vcxproj.filters b/Tutorial/GacUI_Controls/GlobalHotKey/GlobalHotKey.vcxproj.filters
new file mode 100644
index 00000000..b9a457b8
--- /dev/null
+++ b/Tutorial/GacUI_Controls/GlobalHotKey/GlobalHotKey.vcxproj.filters
@@ -0,0 +1,36 @@
+
+
+
+
+ {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
+
+
+ {77c64e27-8843-4ab3-a9ce-4f93def40045}
+
+
+
+
+ Source Files
+
+
+ UI
+
+
+
+
+ UI
+
+
+ UI
+
+
+
\ No newline at end of file
diff --git a/Tutorial/GacUI_Controls/GlobalHotKey/Main.cpp b/Tutorial/GacUI_Controls/GlobalHotKey/Main.cpp
new file mode 100644
index 00000000..da53205b
--- /dev/null
+++ b/Tutorial/GacUI_Controls/GlobalHotKey/Main.cpp
@@ -0,0 +1,16 @@
+#define GAC_HEADER_USE_NAMESPACE
+#include "UI/Source/Demo.h"
+
+using namespace vl::collections;
+using namespace vl::stream;
+
+void GuiMain()
+{
+ {
+ FileStream fileStream(L"../UIRes/GlobalHotkey.bin", FileStream::ReadOnly);
+ GetResourceManager()->LoadResourceOrPending(fileStream);
+ }
+ demo::MainWindow window;
+ window.MoveToScreenCenter();
+ GetApplication()->Run(&window);
+}
\ No newline at end of file
diff --git a/Tutorial/GacUI_Controls/GlobalHotKey/UI/Resource.xml b/Tutorial/GacUI_Controls/GlobalHotKey/UI/Resource.xml
new file mode 100644
index 00000000..b0be3860
--- /dev/null
+++ b/Tutorial/GacUI_Controls/GlobalHotKey/UI/Resource.xml
@@ -0,0 +1,78 @@
+
+
+
+ Source
+ ..\..\UIRes\GlobalHotkey.bin
+ GacUI.h
+ Demo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <_>composeType:MinSize
+ <_>composeType:Percentage percentage:1.0
+
+
+ <_>composeType:Percentage percentage:1.0
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+ |
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Tutorial/GacUI_Controls/GlobalHotKey/UI/Source/Demo.h b/Tutorial/GacUI_Controls/GlobalHotKey/UI/Source/Demo.h
new file mode 100644
index 00000000..7566a5bb
--- /dev/null
+++ b/Tutorial/GacUI_Controls/GlobalHotKey/UI/Source/Demo.h
@@ -0,0 +1,15 @@
+/***********************************************************************
+!!!!!! DO NOT MODIFY !!!!!!
+
+GacGen.exe Resource.xml
+
+This file is generated by Workflow compiler
+https://github.com/vczh-libraries
+***********************************************************************/
+
+#ifndef VCZH_WORKFLOW_COMPILER_GENERATED_DEMO
+#define VCZH_WORKFLOW_COMPILER_GENERATED_DEMO
+
+#include "DemoPartialClasses.h"
+
+#endif
diff --git a/Tutorial/GacUI_Controls/GlobalHotKey/UI/Source/DemoPartialClasses.cpp b/Tutorial/GacUI_Controls/GlobalHotKey/UI/Source/DemoPartialClasses.cpp
new file mode 100644
index 00000000..92ec48a9
--- /dev/null
+++ b/Tutorial/GacUI_Controls/GlobalHotKey/UI/Source/DemoPartialClasses.cpp
@@ -0,0 +1,314 @@
+/***********************************************************************
+!!!!!! DO NOT MODIFY !!!!!!
+
+GacGen.exe Resource.xml
+
+This file is generated by Workflow compiler
+https://github.com/vczh-libraries
+***********************************************************************/
+
+#include "Demo.h"
+/* CodePack:BeginIgnore() */
+#ifndef VCZH_DEBUG_NO_REFLECTION
+/* CodePack:ConditionOff(VCZH_DEBUG_NO_REFLECTION, DemoReflection.h) */
+#include "DemoReflection.h"
+#endif
+/* CodePack:EndIgnore() */
+
+#if defined( _MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#elif defined(__clang__)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wparentheses-equality"
+#elif defined(__GNUC__)
+#pragma GCC diagnostic push
+#endif
+
+#define GLOBAL_SYMBOL ::vl_workflow_global::Demo::
+#define GLOBAL_NAME ::vl_workflow_global::Demo::Instance().
+#define GLOBAL_OBJ &::vl_workflow_global::Demo::Instance()
+
+/***********************************************************************
+Global Variables
+***********************************************************************/
+
+BEGIN_GLOBAL_STORAGE_CLASS(vl_workflow_global_Demo)
+ vl_workflow_global::Demo instance;
+ INITIALIZE_GLOBAL_STORAGE_CLASS
+ FINALIZE_GLOBAL_STORAGE_CLASS
+END_GLOBAL_STORAGE_CLASS(vl_workflow_global_Demo)
+
+namespace vl_workflow_global
+{
+/***********************************************************************
+Global Functions
+***********************************************************************/
+
+ Demo& Demo::Instance()
+ {
+ return Getvl_workflow_global_Demo().instance;
+ }
+
+/***********************************************************************
+Closures
+***********************************************************************/
+
+ //-------------------------------------------------------------------
+
+ __vwsnf1_Demo_demo_MainWindowConstructor___vwsn_demo_MainWindow_Initialize_::__vwsnf1_Demo_demo_MainWindowConstructor___vwsn_demo_MainWindow_Initialize_(::demo::MainWindowConstructor* __vwsnctorthis_0)
+ :__vwsnthis_0(::vl::__vwsn::This(__vwsnctorthis_0))
+ {
+ }
+
+ void __vwsnf1_Demo_demo_MainWindowConstructor___vwsn_demo_MainWindow_Initialize_::operator()(::vl::presentation::compositions::GuiGraphicsComposition* sender, ::vl::presentation::compositions::GuiEventArgs* arguments) const
+ {
+ ::vl::__vwsn::This(::vl::presentation::controls::GetApplication())->InvokeInMainThread(static_cast<::vl::presentation::controls::GuiControlHost*>(__vwsnthis_0->self), vl::Func(::vl_workflow_global::__vwsnf2_Demo_demo_MainWindowConstructor___vwsn_demo_MainWindow_Initialize__(__vwsnthis_0)));
+ }
+
+ //-------------------------------------------------------------------
+
+ __vwsnf2_Demo_demo_MainWindowConstructor___vwsn_demo_MainWindow_Initialize__::__vwsnf2_Demo_demo_MainWindowConstructor___vwsn_demo_MainWindow_Initialize__(::demo::MainWindowConstructor* __vwsnctorthis_0)
+ :__vwsnthis_0(::vl::__vwsn::This(__vwsnctorthis_0))
+ {
+ }
+
+ void __vwsnf2_Demo_demo_MainWindowConstructor___vwsn_demo_MainWindow_Initialize__::operator()() const
+ {
+ ::vl::__vwsn::This(__vwsnthis_0->dialog)->ShowDialog();
+ }
+
+ //-------------------------------------------------------------------
+
+ __vwsnf3_Demo_demo_MainWindowConstructor___vwsn_demo_MainWindow_Initialize_::__vwsnf3_Demo_demo_MainWindowConstructor___vwsn_demo_MainWindow_Initialize_(::demo::MainWindowConstructor* __vwsnctorthis_0)
+ :__vwsnthis_0(::vl::__vwsn::This(__vwsnctorthis_0))
+ {
+ }
+
+ void __vwsnf3_Demo_demo_MainWindowConstructor___vwsn_demo_MainWindow_Initialize_::operator()(::vl::presentation::compositions::GuiGraphicsComposition* sender, ::vl::presentation::compositions::GuiMouseEventArgs* arguments) const
+ {
+ auto b = ::vl::__vwsn::This(::vl::__vwsn::This(__vwsnthis_0->self)->GetContainerComposition())->GetGlobalBounds();
+ auto p = [&](){ ::vl::presentation::Point __vwsn_temp__; __vwsn_temp__.x = (::vl::__vwsn::This(arguments)->x + b.x1); __vwsn_temp__.y = (::vl::__vwsn::This(arguments)->y + b.y1); return __vwsn_temp__; }();
+ ::vl::__vwsn::This(__vwsnthis_0->menuRightClick)->ShowPopup(static_cast<::vl::presentation::controls::GuiControl*>(__vwsnthis_0->self), p);
+ }
+}
+
+/***********************************************************************
+Class (::demo::MainWindowConstructor)
+***********************************************************************/
+
+namespace demo
+{
+ void MainWindowConstructor::__vwsn_demo_MainWindow_Initialize(::demo::MainWindow* __vwsn_this_)
+ {
+ (this->self = __vwsn_this_);
+ (this->__vwsn_precompile_14 = ::vl::__vwsn::This(this->self)->GetContainerComposition());
+ {
+ ::vl::__vwsn::This(this->__vwsn_precompile_14)->SetPreferredMinSize([&](){ ::vl::presentation::Size __vwsn_temp__; __vwsn_temp__.x = static_cast<::vl::vint>(320); __vwsn_temp__.y = static_cast<::vl::vint>(240); return __vwsn_temp__; }());
+ }
+ {
+ ::vl::__vwsn::This(this->self)->SetClientSize([&](){ ::vl::presentation::Size __vwsn_temp__; __vwsn_temp__.x = static_cast<::vl::vint>(640); __vwsn_temp__.y = static_cast<::vl::vint>(480); return __vwsn_temp__; }());
+ }
+ {
+ ::vl::__vwsn::This(this->self)->SetText(::vl::WString::Unmanaged(L"GlobalHotkey"));
+ }
+ (this->dialog = new ::vl::presentation::controls::GuiMessageDialog());
+ {
+ ::vl::__vwsn::This(this->dialog)->SetTitle(::vl::WString::Unmanaged(L"Global Hotkey"));
+ }
+ {
+ ::vl::__vwsn::This(this->dialog)->SetText(::vl::WString::Unmanaged(L"The global hotkey is activated!"));
+ }
+ {
+ ::vl::__vwsn::This(this->self)->AddComponent(static_cast<::vl::presentation::controls::GuiComponent*>(this->dialog));
+ }
+ (this->commandGlobal = new ::vl::presentation::controls::GuiToolstripCommand());
+ {
+ ::vl::__vwsn::This(this->commandGlobal)->SetShortcutBuilder(::vl::WString::Unmanaged(L"global:Ctrl+Shift+Alt+D"));
+ }
+ {
+ ::vl::__vwsn::This(this->commandGlobal)->SetText(::vl::WString::Unmanaged(L"Show Message Dialog"));
+ }
+ {
+ ::vl::__vwsn::This(this->self)->AddComponent(static_cast<::vl::presentation::controls::GuiComponent*>(this->commandGlobal));
+ }
+ {
+ (this->menuRightClick = new ::vl::presentation::controls::GuiToolstripMenu(::vl::presentation::theme::ThemeName::Menu, static_cast<::vl::presentation::controls::GuiControl*>(nullptr)));
+ }
+ {
+ (this->__vwsn_precompile_0 = new ::vl::presentation::controls::GuiToolstripGroupContainer(::vl::presentation::theme::ThemeName::CustomControl));
+ }
+ {
+ (this->__vwsn_precompile_1 = new ::vl::presentation::controls::GuiToolstripGroup(::vl::presentation::theme::ThemeName::CustomControl));
+ }
+ {
+ (this->__vwsn_precompile_2 = new ::vl::presentation::controls::GuiToolstripButton(::vl::presentation::theme::ThemeName::MenuItemButton));
+ }
+ {
+ ::vl::__vwsn::This(::vl::__vwsn::UnboxCollection<::vl::reflection::description::IValueList>(::vl::__vwsn::This(this->__vwsn_precompile_1)->GetToolstripItems()).Obj())->Add(::vl::__vwsn::Box(this->__vwsn_precompile_2));
+ }
+ {
+ ::vl::__vwsn::This(::vl::__vwsn::UnboxCollection<::vl::reflection::description::IValueList>(::vl::__vwsn::This(this->__vwsn_precompile_0)->GetToolstripItems()).Obj())->Add(::vl::__vwsn::Box(this->__vwsn_precompile_1));
+ }
+ {
+ ::vl::__vwsn::This(::vl::__vwsn::UnboxCollection<::vl::reflection::description::IValueList>(::vl::__vwsn::This(this->menuRightClick)->GetToolstripItems()).Obj())->Add(::vl::__vwsn::Box(this->__vwsn_precompile_0));
+ }
+ {
+ ::vl::__vwsn::This(this->self)->AddControlHostComponent(static_cast<::vl::presentation::controls::GuiControlHost*>(this->menuRightClick));
+ }
+ (this->__vwsn_precompile_3 = new ::vl::presentation::compositions::GuiTableComposition());
+ {
+ ::vl::__vwsn::This(this->__vwsn_precompile_3)->SetMinSizeLimitation(::vl::presentation::compositions::GuiGraphicsComposition::MinSizeLimitation::LimitToElementAndChildren);
+ }
+ {
+ ::vl::__vwsn::This(this->__vwsn_precompile_3)->SetAlignmentToParent([&](){ ::vl::presentation::Margin __vwsn_temp__; __vwsn_temp__.left = static_cast<::vl::vint>(0); __vwsn_temp__.top = static_cast<::vl::vint>(0); __vwsn_temp__.right = static_cast<::vl::vint>(0); __vwsn_temp__.bottom = static_cast<::vl::vint>(0); return __vwsn_temp__; }());
+ }
+ {
+ ::vl::__vwsn::This(this->__vwsn_precompile_3)->SetBorderVisible(true);
+ }
+ {
+ ::vl::__vwsn::This(this->__vwsn_precompile_3)->SetCellPadding(static_cast<::vl::vint>(5));
+ }
+ {
+ ::vl::__vwsn::This(this->__vwsn_precompile_3)->SetRowsAndColumns(static_cast<::vl::vint>(2), static_cast<::vl::vint>(1));
+ ::vl::__vwsn::This(this->__vwsn_precompile_3)->SetRowOption(static_cast<::vl::vint>(0), [&](){ ::vl::presentation::compositions::GuiCellOption __vwsn_temp__; __vwsn_temp__.composeType = ::vl::presentation::compositions::GuiCellOption::ComposeType::MinSize; return __vwsn_temp__; }());
+ ::vl::__vwsn::This(this->__vwsn_precompile_3)->SetRowOption(static_cast<::vl::vint>(1), [&](){ ::vl::presentation::compositions::GuiCellOption __vwsn_temp__; __vwsn_temp__.composeType = ::vl::presentation::compositions::GuiCellOption::ComposeType::Percentage; __vwsn_temp__.percentage = static_cast(1.0); return __vwsn_temp__; }());
+ ::vl::__vwsn::This(this->__vwsn_precompile_3)->SetColumnOption(static_cast<::vl::vint>(0), [&](){ ::vl::presentation::compositions::GuiCellOption __vwsn_temp__; __vwsn_temp__.composeType = ::vl::presentation::compositions::GuiCellOption::ComposeType::Percentage; __vwsn_temp__.percentage = static_cast(1.0); return __vwsn_temp__; }());
+ }
+ (this->__vwsn_precompile_4 = new ::vl::presentation::compositions::GuiCellComposition());
+ {
+ ::vl::__vwsn::This(this->__vwsn_precompile_4)->SetSite(static_cast<::vl::vint>(0), static_cast<::vl::vint>(0), static_cast<::vl::vint>(1), static_cast<::vl::vint>(1));
+ }
+ {
+ (this->__vwsn_precompile_5 = new ::vl::presentation::controls::GuiToolstripMenuBar(::vl::presentation::theme::ThemeName::MenuBar));
+ }
+ (this->__vwsn_precompile_10 = ::vl::__vwsn::This(this->__vwsn_precompile_5)->GetBoundsComposition());
+ {
+ ::vl::__vwsn::This(this->__vwsn_precompile_10)->SetAlignmentToParent([&](){ ::vl::presentation::Margin __vwsn_temp__; __vwsn_temp__.left = static_cast<::vl::vint>(0); __vwsn_temp__.top = static_cast<::vl::vint>(0); __vwsn_temp__.right = static_cast<::vl::vint>(0); __vwsn_temp__.bottom = static_cast<::vl::vint>(0); return __vwsn_temp__; }());
+ }
+ {
+ (this->__vwsn_precompile_6 = new ::vl::presentation::controls::GuiToolstripButton(::vl::presentation::theme::ThemeName::MenuBarButton));
+ }
+ {
+ ::vl::__vwsn::This(this->__vwsn_precompile_6)->SetAlt(::vl::WString::Unmanaged(L"A"));
+ }
+ {
+ ::vl::__vwsn::This(this->__vwsn_precompile_6)->SetText(::vl::WString::Unmanaged(L"A Menu"));
+ }
+ (this->__vwsn_precompile_7 = ::vl::__vwsn::This(this->__vwsn_precompile_6)->EnsureToolstripSubMenu());
+ {
+ (this->__vwsn_precompile_8 = new ::vl::presentation::controls::GuiToolstripGroup(::vl::presentation::theme::ThemeName::CustomControl));
+ }
+ {
+ (this->__vwsn_precompile_9 = new ::vl::presentation::controls::GuiToolstripButton(::vl::presentation::theme::ThemeName::MenuItemButton));
+ }
+ {
+ ::vl::__vwsn::This(::vl::__vwsn::UnboxCollection<::vl::reflection::description::IValueList>(::vl::__vwsn::This(this->__vwsn_precompile_8)->GetToolstripItems()).Obj())->Add(::vl::__vwsn::Box(this->__vwsn_precompile_9));
+ }
+ {
+ ::vl::__vwsn::This(::vl::__vwsn::UnboxCollection<::vl::reflection::description::IValueList>(::vl::__vwsn::This(this->__vwsn_precompile_7)->GetToolstripItems()).Obj())->Add(::vl::__vwsn::Box(this->__vwsn_precompile_8));
+ }
+ {
+ ::vl::__vwsn::This(::vl::__vwsn::UnboxCollection<::vl::reflection::description::IValueList>(::vl::__vwsn::This(this->__vwsn_precompile_5)->GetToolstripItems()).Obj())->Add(::vl::__vwsn::Box(this->__vwsn_precompile_6));
+ }
+ {
+ ::vl::__vwsn::This(this->__vwsn_precompile_4)->AddChild(static_cast<::vl::presentation::compositions::GuiGraphicsComposition*>(::vl::__vwsn::This(this->__vwsn_precompile_5)->GetBoundsComposition()));
+ }
+ {
+ ::vl::__vwsn::This(this->__vwsn_precompile_3)->AddChild(static_cast<::vl::presentation::compositions::GuiGraphicsComposition*>(this->__vwsn_precompile_4));
+ }
+ (this->__vwsn_precompile_11 = new ::vl::presentation::compositions::GuiCellComposition());
+ {
+ ::vl::__vwsn::This(this->__vwsn_precompile_11)->SetSite(static_cast<::vl::vint>(1), static_cast<::vl::vint>(1), static_cast<::vl::vint>(1), static_cast<::vl::vint>(1));
+ }
+ {
+ (this->__vwsn_precompile_12 = new ::vl::presentation::controls::GuiLabel(::vl::presentation::theme::ThemeName::Label));
+ }
+ {
+ ::vl::__vwsn::This(this->__vwsn_precompile_12)->SetFont(::vl::Nullable<::vl::presentation::FontProperties>([&](){ ::vl::presentation::FontProperties __vwsn_temp__; __vwsn_temp__.fontFamily = ::vl::WString::Unmanaged(L"Segoe UI"); __vwsn_temp__.size = static_cast<::vl::vint>(24); return __vwsn_temp__; }()));
+ }
+ (this->__vwsn_precompile_13 = ::vl::__vwsn::This(this->__vwsn_precompile_12)->GetBoundsComposition());
+ {
+ ::vl::__vwsn::This(this->__vwsn_precompile_13)->SetAlignmentToParent([&](){ ::vl::presentation::Margin __vwsn_temp__; __vwsn_temp__.left = static_cast<::vl::vint>(0); __vwsn_temp__.top = static_cast<::vl::vint>(0); __vwsn_temp__.right = static_cast<::vl::vint>(0); __vwsn_temp__.bottom = static_cast<::vl::vint>(0); return __vwsn_temp__; }());
+ }
+ {
+ ::vl::__vwsn::This(this->__vwsn_precompile_12)->SetText(::vl::WString::Unmanaged(L"Right click to show the menu"));
+ }
+ {
+ ::vl::__vwsn::This(this->__vwsn_precompile_11)->AddChild(static_cast<::vl::presentation::compositions::GuiGraphicsComposition*>(::vl::__vwsn::This(this->__vwsn_precompile_12)->GetBoundsComposition()));
+ }
+ {
+ ::vl::__vwsn::This(this->__vwsn_precompile_3)->AddChild(static_cast<::vl::presentation::compositions::GuiGraphicsComposition*>(this->__vwsn_precompile_11));
+ }
+ {
+ ::vl::__vwsn::This(::vl::__vwsn::This(this->self)->GetContainerComposition())->AddChild(static_cast<::vl::presentation::compositions::GuiGraphicsComposition*>(this->__vwsn_precompile_3));
+ }
+ {
+ auto __vwsn_event_handler_ = vl::Func(::vl_workflow_global::__vwsnf1_Demo_demo_MainWindowConstructor___vwsn_demo_MainWindow_Initialize_(this));
+ ::vl::__vwsn::EventAttach(::vl::__vwsn::This(this->commandGlobal)->Executed, __vwsn_event_handler_);
+ }
+ {
+ ::vl::__vwsn::This(this->__vwsn_precompile_2)->SetCommand(this->commandGlobal);
+ }
+ {
+ ::vl::__vwsn::This(this->__vwsn_precompile_9)->SetCommand(this->commandGlobal);
+ }
+ {
+ auto __vwsn_event_handler_ = vl::Func(::vl_workflow_global::__vwsnf3_Demo_demo_MainWindowConstructor___vwsn_demo_MainWindow_Initialize_(this));
+ ::vl::__vwsn::EventAttach(::vl::__vwsn::This(this->__vwsn_precompile_14)->GetEventReceiver()->rightButtonDown, __vwsn_event_handler_);
+ }
+ }
+
+ MainWindowConstructor::MainWindowConstructor()
+ : self(static_cast<::demo::MainWindow*>(nullptr))
+ , dialog(static_cast<::vl::presentation::controls::GuiMessageDialog*>(nullptr))
+ , commandGlobal(static_cast<::vl::presentation::controls::GuiToolstripCommand*>(nullptr))
+ , menuRightClick(static_cast<::vl::presentation::controls::GuiToolstripMenu*>(nullptr))
+ , __vwsn_precompile_0(static_cast<::vl::presentation::controls::GuiToolstripGroupContainer*>(nullptr))
+ , __vwsn_precompile_1(static_cast<::vl::presentation::controls::GuiToolstripGroup*>(nullptr))
+ , __vwsn_precompile_2(static_cast<::vl::presentation::controls::GuiToolstripButton*>(nullptr))
+ , __vwsn_precompile_3(static_cast<::vl::presentation::compositions::GuiTableComposition*>(nullptr))
+ , __vwsn_precompile_4(static_cast<::vl::presentation::compositions::GuiCellComposition*>(nullptr))
+ , __vwsn_precompile_5(static_cast<::vl::presentation::controls::GuiToolstripMenuBar*>(nullptr))
+ , __vwsn_precompile_6(static_cast<::vl::presentation::controls::GuiToolstripButton*>(nullptr))
+ , __vwsn_precompile_7(static_cast<::vl::presentation::controls::GuiToolstripMenu*>(nullptr))
+ , __vwsn_precompile_8(static_cast<::vl::presentation::controls::GuiToolstripGroup*>(nullptr))
+ , __vwsn_precompile_9(static_cast<::vl::presentation::controls::GuiToolstripButton*>(nullptr))
+ , __vwsn_precompile_10(static_cast<::vl::presentation::compositions::GuiBoundsComposition*>(nullptr))
+ , __vwsn_precompile_11(static_cast<::vl::presentation::compositions::GuiCellComposition*>(nullptr))
+ , __vwsn_precompile_12(static_cast<::vl::presentation::controls::GuiLabel*>(nullptr))
+ , __vwsn_precompile_13(static_cast<::vl::presentation::compositions::GuiBoundsComposition*>(nullptr))
+ , __vwsn_precompile_14(static_cast<::vl::presentation::compositions::GuiGraphicsComposition*>(nullptr))
+ {
+ }
+
+/***********************************************************************
+Class (::demo::MainWindow)
+***********************************************************************/
+
+ MainWindow::MainWindow()
+ : ::vl::presentation::controls::GuiWindow(::vl::presentation::theme::ThemeName::Window)
+ {
+ auto __vwsn_resource_ = ::vl::__vwsn::This(::vl::presentation::GetResourceManager())->GetResourceFromClassName(::vl::WString::Unmanaged(L"demo::MainWindow"));
+ auto __vwsn_resolver_ = ::vl::Ptr<::vl::presentation::GuiResourcePathResolver>(new ::vl::presentation::GuiResourcePathResolver(__vwsn_resource_, ::vl::__vwsn::This(__vwsn_resource_.Obj())->GetWorkingDirectory()));
+ ::vl::__vwsn::This(this)->SetResourceResolver(__vwsn_resolver_);
+ ::vl::__vwsn::This(this)->__vwsn_demo_MainWindow_Initialize(this);
+ }
+
+ MainWindow::~MainWindow()
+ {
+ this->FinalizeInstanceRecursively(static_cast<::vl::presentation::controls::GuiControlHost*>(this));
+ }
+
+}
+#undef GLOBAL_SYMBOL
+#undef GLOBAL_NAME
+#undef GLOBAL_OBJ
+
+#if defined( _MSC_VER)
+#pragma warning(pop)
+#elif defined(__clang__)
+#pragma clang diagnostic pop
+#elif defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
diff --git a/Tutorial/GacUI_Controls/GlobalHotKey/UI/Source/DemoPartialClasses.h b/Tutorial/GacUI_Controls/GlobalHotKey/UI/Source/DemoPartialClasses.h
new file mode 100644
index 00000000..fa851c40
--- /dev/null
+++ b/Tutorial/GacUI_Controls/GlobalHotKey/UI/Source/DemoPartialClasses.h
@@ -0,0 +1,138 @@
+/***********************************************************************
+!!!!!! DO NOT MODIFY !!!!!!
+
+GacGen.exe Resource.xml
+
+This file is generated by Workflow compiler
+https://github.com/vczh-libraries
+***********************************************************************/
+
+#ifndef VCZH_WORKFLOW_COMPILER_GENERATED_DEMOPARTIALCLASSES
+#define VCZH_WORKFLOW_COMPILER_GENERATED_DEMOPARTIALCLASSES
+
+#include "GacUI.h"
+
+#if defined( _MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#elif defined(__clang__)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wparentheses-equality"
+#elif defined(__GNUC__)
+#pragma GCC diagnostic push
+#endif
+
+namespace vl_workflow_global
+{
+ struct __vwsnf1_Demo_demo_MainWindowConstructor___vwsn_demo_MainWindow_Initialize_;
+ struct __vwsnf2_Demo_demo_MainWindowConstructor___vwsn_demo_MainWindow_Initialize__;
+ struct __vwsnf3_Demo_demo_MainWindowConstructor___vwsn_demo_MainWindow_Initialize_;
+}
+
+namespace demo
+{
+ class MainWindowConstructor;
+ class MainWindow;
+
+ class MainWindowConstructor : public ::vl::Object, public ::vl::reflection::Description
+ {
+ friend struct ::vl_workflow_global::__vwsnf1_Demo_demo_MainWindowConstructor___vwsn_demo_MainWindow_Initialize_;
+ friend struct ::vl_workflow_global::__vwsnf2_Demo_demo_MainWindowConstructor___vwsn_demo_MainWindow_Initialize__;
+ friend struct ::vl_workflow_global::__vwsnf3_Demo_demo_MainWindowConstructor___vwsn_demo_MainWindow_Initialize_;
+#ifdef VCZH_DESCRIPTABLEOBJECT_WITH_METADATA
+ friend struct ::vl::reflection::description::CustomTypeDescriptorSelector;
+#endif
+ protected:
+ ::demo::MainWindow* self;
+ ::vl::presentation::controls::GuiMessageDialog* dialog;
+ ::vl::presentation::controls::GuiToolstripCommand* commandGlobal;
+ ::vl::presentation::controls::GuiToolstripMenu* menuRightClick;
+ ::vl::presentation::controls::GuiToolstripGroupContainer* __vwsn_precompile_0;
+ ::vl::presentation::controls::GuiToolstripGroup* __vwsn_precompile_1;
+ ::vl::presentation::controls::GuiToolstripButton* __vwsn_precompile_2;
+ ::vl::presentation::compositions::GuiTableComposition* __vwsn_precompile_3;
+ ::vl::presentation::compositions::GuiCellComposition* __vwsn_precompile_4;
+ ::vl::presentation::controls::GuiToolstripMenuBar* __vwsn_precompile_5;
+ ::vl::presentation::controls::GuiToolstripButton* __vwsn_precompile_6;
+ ::vl::presentation::controls::GuiToolstripMenu* __vwsn_precompile_7;
+ ::vl::presentation::controls::GuiToolstripGroup* __vwsn_precompile_8;
+ ::vl::presentation::controls::GuiToolstripButton* __vwsn_precompile_9;
+ ::vl::presentation::compositions::GuiBoundsComposition* __vwsn_precompile_10;
+ ::vl::presentation::compositions::GuiCellComposition* __vwsn_precompile_11;
+ ::vl::presentation::controls::GuiLabel* __vwsn_precompile_12;
+ ::vl::presentation::compositions::GuiBoundsComposition* __vwsn_precompile_13;
+ ::vl::presentation::compositions::GuiGraphicsComposition* __vwsn_precompile_14;
+ void __vwsn_demo_MainWindow_Initialize(::demo::MainWindow* __vwsn_this_);
+ public:
+ MainWindowConstructor();
+ };
+
+ class MainWindow : public ::vl::presentation::controls::GuiWindow, public ::demo::MainWindowConstructor, public ::vl::reflection::Description
+ {
+ friend class ::demo::MainWindowConstructor;
+ friend struct ::vl_workflow_global::__vwsnf1_Demo_demo_MainWindowConstructor___vwsn_demo_MainWindow_Initialize_;
+ friend struct ::vl_workflow_global::__vwsnf2_Demo_demo_MainWindowConstructor___vwsn_demo_MainWindow_Initialize__;
+ friend struct ::vl_workflow_global::__vwsnf3_Demo_demo_MainWindowConstructor___vwsn_demo_MainWindow_Initialize_;
+#ifdef VCZH_DESCRIPTABLEOBJECT_WITH_METADATA
+ friend struct ::vl::reflection::description::CustomTypeDescriptorSelector;
+#endif
+ public:
+ MainWindow();
+ ~MainWindow();
+ };
+
+}
+/***********************************************************************
+Global Variables and Functions
+***********************************************************************/
+
+namespace vl_workflow_global
+{
+ class Demo
+ {
+ public:
+
+ static Demo& Instance();
+ };
+
+/***********************************************************************
+Closures
+***********************************************************************/
+
+ struct __vwsnf1_Demo_demo_MainWindowConstructor___vwsn_demo_MainWindow_Initialize_
+ {
+ ::demo::MainWindowConstructor* __vwsnthis_0;
+
+ __vwsnf1_Demo_demo_MainWindowConstructor___vwsn_demo_MainWindow_Initialize_(::demo::MainWindowConstructor* __vwsnctorthis_0);
+
+ void operator()(::vl::presentation::compositions::GuiGraphicsComposition* sender, ::vl::presentation::compositions::GuiEventArgs* arguments) const;
+ };
+
+ struct __vwsnf2_Demo_demo_MainWindowConstructor___vwsn_demo_MainWindow_Initialize__
+ {
+ ::demo::MainWindowConstructor* __vwsnthis_0;
+
+ __vwsnf2_Demo_demo_MainWindowConstructor___vwsn_demo_MainWindow_Initialize__(::demo::MainWindowConstructor* __vwsnctorthis_0);
+
+ void operator()() const;
+ };
+
+ struct __vwsnf3_Demo_demo_MainWindowConstructor___vwsn_demo_MainWindow_Initialize_
+ {
+ ::demo::MainWindowConstructor* __vwsnthis_0;
+
+ __vwsnf3_Demo_demo_MainWindowConstructor___vwsn_demo_MainWindow_Initialize_(::demo::MainWindowConstructor* __vwsnctorthis_0);
+
+ void operator()(::vl::presentation::compositions::GuiGraphicsComposition* sender, ::vl::presentation::compositions::GuiMouseEventArgs* arguments) const;
+ };
+}
+
+#if defined( _MSC_VER)
+#pragma warning(pop)
+#elif defined(__clang__)
+#pragma clang diagnostic pop
+#elif defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+
+#endif
diff --git a/Tutorial/GacUI_Controls/GlobalHotKey/UI/Source/DemoReflection.cpp b/Tutorial/GacUI_Controls/GlobalHotKey/UI/Source/DemoReflection.cpp
new file mode 100644
index 00000000..3556ea2a
--- /dev/null
+++ b/Tutorial/GacUI_Controls/GlobalHotKey/UI/Source/DemoReflection.cpp
@@ -0,0 +1,106 @@
+/***********************************************************************
+!!!!!! DO NOT MODIFY !!!!!!
+
+GacGen.exe Resource.xml
+
+This file is generated by Workflow compiler
+https://github.com/vczh-libraries
+***********************************************************************/
+
+#include "DemoReflection.h"
+
+#if defined( _MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#elif defined(__clang__)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wparentheses-equality"
+#elif defined(__GNUC__)
+#pragma GCC diagnostic push
+#endif
+
+/***********************************************************************
+Reflection
+***********************************************************************/
+
+namespace vl
+{
+ namespace reflection
+ {
+ namespace description
+ {
+#ifndef VCZH_DEBUG_NO_REFLECTION
+ IMPL_CPP_TYPE_INFO(demo::MainWindow)
+ IMPL_CPP_TYPE_INFO(demo::MainWindowConstructor)
+
+#ifdef VCZH_DESCRIPTABLEOBJECT_WITH_METADATA
+#define _ ,
+ BEGIN_CLASS_MEMBER(::demo::MainWindow)
+ CLASS_MEMBER_BASE(::vl::presentation::controls::GuiWindow)
+ CLASS_MEMBER_BASE(::demo::MainWindowConstructor)
+ CLASS_MEMBER_CONSTRUCTOR(::demo::MainWindow*(), NO_PARAMETER)
+ END_CLASS_MEMBER(::demo::MainWindow)
+
+ BEGIN_CLASS_MEMBER(::demo::MainWindowConstructor)
+ CLASS_MEMBER_BASE(::vl::reflection::DescriptableObject)
+ CLASS_MEMBER_CONSTRUCTOR(::vl::Ptr<::demo::MainWindowConstructor>(), NO_PARAMETER)
+ CLASS_MEMBER_METHOD(__vwsn_demo_MainWindow_Initialize, { L"__vwsn_this_" })
+ CLASS_MEMBER_FIELD(__vwsn_precompile_0)
+ CLASS_MEMBER_FIELD(__vwsn_precompile_1)
+ CLASS_MEMBER_FIELD(__vwsn_precompile_10)
+ CLASS_MEMBER_FIELD(__vwsn_precompile_11)
+ CLASS_MEMBER_FIELD(__vwsn_precompile_12)
+ CLASS_MEMBER_FIELD(__vwsn_precompile_13)
+ CLASS_MEMBER_FIELD(__vwsn_precompile_14)
+ CLASS_MEMBER_FIELD(__vwsn_precompile_2)
+ CLASS_MEMBER_FIELD(__vwsn_precompile_3)
+ CLASS_MEMBER_FIELD(__vwsn_precompile_4)
+ CLASS_MEMBER_FIELD(__vwsn_precompile_5)
+ CLASS_MEMBER_FIELD(__vwsn_precompile_6)
+ CLASS_MEMBER_FIELD(__vwsn_precompile_7)
+ CLASS_MEMBER_FIELD(__vwsn_precompile_8)
+ CLASS_MEMBER_FIELD(__vwsn_precompile_9)
+ CLASS_MEMBER_FIELD(commandGlobal)
+ CLASS_MEMBER_FIELD(dialog)
+ CLASS_MEMBER_FIELD(menuRightClick)
+ CLASS_MEMBER_FIELD(self)
+ END_CLASS_MEMBER(::demo::MainWindowConstructor)
+
+#undef _
+ class DemoTypeLoader : public Object, public ITypeLoader
+ {
+ public:
+ void Load(ITypeManager* manager)
+ {
+ ADD_TYPE_INFO(::demo::MainWindow)
+ ADD_TYPE_INFO(::demo::MainWindowConstructor)
+ }
+
+ void Unload(ITypeManager* manager)
+ {
+ }
+ };
+#endif
+#endif
+
+ bool LoadDemoTypes()
+ {
+#ifdef VCZH_DESCRIPTABLEOBJECT_WITH_METADATA
+ if (auto manager = GetGlobalTypeManager())
+ {
+ return manager->AddTypeLoader(Ptr(new DemoTypeLoader));
+ }
+#endif
+ return false;
+ }
+ }
+ }
+}
+
+#if defined( _MSC_VER)
+#pragma warning(pop)
+#elif defined(__clang__)
+#pragma clang diagnostic pop
+#elif defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
diff --git a/Tutorial/GacUI_Controls/GlobalHotKey/UI/Source/DemoReflection.h b/Tutorial/GacUI_Controls/GlobalHotKey/UI/Source/DemoReflection.h
new file mode 100644
index 00000000..8c1e0b5d
--- /dev/null
+++ b/Tutorial/GacUI_Controls/GlobalHotKey/UI/Source/DemoReflection.h
@@ -0,0 +1,53 @@
+/***********************************************************************
+!!!!!! DO NOT MODIFY !!!!!!
+
+GacGen.exe Resource.xml
+
+This file is generated by Workflow compiler
+https://github.com/vczh-libraries
+***********************************************************************/
+
+#ifndef VCZH_WORKFLOW_COMPILER_GENERATED_DEMOREFLECTION
+#define VCZH_WORKFLOW_COMPILER_GENERATED_DEMOREFLECTION
+
+#include "Demo.h"
+
+#if defined( _MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#elif defined(__clang__)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wparentheses-equality"
+#elif defined(__GNUC__)
+#pragma GCC diagnostic push
+#endif
+
+/***********************************************************************
+Reflection
+***********************************************************************/
+
+namespace vl
+{
+ namespace reflection
+ {
+ namespace description
+ {
+#ifndef VCZH_DEBUG_NO_REFLECTION
+ DECL_TYPE_INFO(::demo::MainWindow)
+ DECL_TYPE_INFO(::demo::MainWindowConstructor)
+#endif
+
+ extern bool LoadDemoTypes();
+ }
+ }
+}
+
+#if defined( _MSC_VER)
+#pragma warning(pop)
+#elif defined(__clang__)
+#pragma clang diagnostic pop
+#elif defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+
+#endif
diff --git a/Tutorial/GacUI_Controls/UIRes/GlobalHotkey.bin b/Tutorial/GacUI_Controls/UIRes/GlobalHotkey.bin
new file mode 100644
index 00000000..5d06abc7
Binary files /dev/null and b/Tutorial/GacUI_Controls/UIRes/GlobalHotkey.bin differ