看了一段时间的 C++/WinRT,显然不是美女。。。

C++/CX 还凑合,顺道弄了个最少代码的 UWP Hello World。

#include <SDKDDKVer.h>
#include <windows.h>
#include <collection.h>

using namespace Windows;
using namespace Windows::ApplicationModel::Core;
using namespace Windows::UI;
using namespace Windows::UI::Core;

ref class MyFrameworkView : IFrameworkView
{
public:
	virtual void Initialize(CoreApplicationView ^applicationView)
	{
		// 初始化,通常 Xaml 调用自动生成的 InitializeComponent()
	}

	virtual void Load(Platform::String ^entryPoint)
	{
	}

	virtual void SetWindow(CoreWindow ^window)
	{
		m_window = window;

		// UWP 应用窗口激活,否则将抛出异常
		m_window->Activate();
	}

	virtual void Run()
	{
		// 事件循环
		while(true)
		{
			m_window->Dispatcher->ProcessEvents(CoreProcessEventsOption::ProcessAllIfPresent);

			// 此处可加入终止循环判别,亦可处理 D2D、D3D 等等

			// 若不添加代码,应用被关闭时的几种可能性如下,按常理而言,其中第一种可能性最大
			//	1. ProcessEvents() 收到相应事件后调用 Uninitialize() => ExitThread(),线程正常退出;
			//	2. ProcessEvents() 处理异常被抛出,线程中止;
			//	3. CoreApplication 对其线程直接用 TerminateThread() 干掉。
		}
	}

	virtual void Uninitialize()
	{
	}

private:
	Platform::Agile<CoreWindow> m_window;
};


ref class MyFrameworkViewSource : IFrameworkViewSource
{
public:
	virtual IFrameworkView^ CreateView()
	{
		// 返回对象将用于创建 CoreWindow 并调用其 Initialize() => Load() => Run() => Uninitialize() 序列
		// 每 CoreWindow 将对应创建相应线程
		return ref new MyFrameworkView();
	}
};


int __cdecl main(Platform::Array<Platform::String^>^ args)
{
	// 主线程运行 Application 事件循环
	CoreApplication::Run(ref new MyFrameworkViewSource());
	return 0;
}