本文中介绍的 GacUI 源代码来自于 https://github.com/vczh-libraries/GacUI。
在 GacUI 中,`WinMain` 开始后,第一个执行的函数为 `SetupWindowsDirect2DRenderer` :
int SetupWindowsDirect2DRenderer()
{
CoInitializeEx(NULL, COINIT_MULTITHREADED);
HINSTANCE hInstance=(HINSTANCE)GetModuleHandle(NULL);
WinDirect2DApplicationDirect2DObjectProvider objectProvider;
SetWindowsDirect2DObjectProvider(&objectProvider);
return WinMainDirect2D(hInstance, &RendererMainDirect2D);
}
可以通过 `WinDirect2DApplicationDirect2DObjectProvider` 获取到许多 factory(如 D2D1Factory,DWriteFactory etc.)但是注意的是,这些资源并不存储在 `WinDirect2DApplicationDirect2DObjectProvider` 中。接着将目光转到 `WinMainDirect2D`:
int WinMainDirect2D(HINSTANCE hInstance, void(*RendererMain)())
{
EnableCrossKernelCrashing();
// create controller
INativeController* controller=CreateWindowsNativeController(hInstance);
SetCurrentController(controller);
{
// install listener
Direct2DWindowsNativeControllerListener listener;
controller->CallbackService()->InstallListener(&listener);
direct2DListener=&listener;
// main
RendererMain();
// uninstall listener
direct2DListener=0;
controller->CallbackService()->UninstallListener(&listener);
}
// destroy controller
DestroyWindowsNativeController(controller);
return 0;
}
可以注意到,首先它调用了`CreateWindowsNativeController` 得到了一个 Controller,这个 Controller 真可谓是 GacUI 的核心!但是先不急,我们先来看看 `SetCurrentController` 干了什么:
INativeController* currentController=0;
INativeController* GetCurrentController()
{
return currentController;
}
void SetCurrentController(INativeController* controller)
{
currentController=controller;
}
</