C++/WinUI 3 技术笔记:(二)框架代码分析

前一节创建了一个 C++/WinUI 3 应用,接着分析默认生成的框架代码。框架代码中使用了大量 C++ 模板技术和新语言特性,发挥了 C++ 语言零开销抽象的优势,很值得学习。 App 应用入口 重新回到应用入口类 App。 struct App : AppT<App> { App(); void OnLaunched(Microsoft::UI::Xaml::LaunchActivatedEventArgs const&); private: winrt::Microsoft::UI::Xaml::Window window{ nullptr }; }; 应用的入口 App 类继承于一个代码生成的模板 AppT,这里用到的 C++ 奇异模板递归(CRTP)技术和 ATL 一脉相承。 template <typename D, typename ... Interfaces> struct AppT: public ::winrt::Microsoft::UI::Xaml::ApplicationT<D, ::winrt::Microsoft::UI::Xaml::Markup::IXamlMetadataProvider, Interfaces...> { using IXamlType = ::winrt::Microsoft::UI::Xaml::Markup::IXamlType; void InitializeComponent() { if (_contentLoaded) return; _contentLoaded = true; ::winrt::Windows::Foundation::Uri resourceLocator{ L"ms-appx:///App.xaml" }; ::winrt::Microsoft::UI::Xaml::Application::LoadComponent(*this, resourceLocator); } IXamlType GetXamlType(::winrt::Windows::UI::Xaml::Interop::TypeName const& type) { return AppProvider()->GetXamlType(type); } IXamlType GetXamlType(::winrt::hstring const& fullName) { return AppProvider()->GetXamlType(fullName); } ::winrt::com_array<::winrt::Microsoft::UI::Xaml::Markup::XmlnsDefinition> GetXmlnsDefinitions() { return AppProvider()->GetXmlnsDefinitions(); } private: bool _contentLoaded{false}; winrt::com_ptr<XamlMetaDataProvider> _appProvider; winrt::com_ptr<XamlMetaDataProvider> AppProvider() { if (!...

September 2, 2022 · 3 min · lyincc

C++/WinUI 3 技术笔记:(一)创建第一个 WinUI 3 项目

微软在 Windows 10 Version 1809 上正式发布了新的 UI 框架,命名为 WinUI 3。 这已经是微软发布的第不知道多少个 UI 框架了,但是微软宣称它将支持原生 C++ 和 Win32 应用。这引起了我的注意,因为微软已经很久没有为 Win32 提供新的技术了。 WinUI 3 与 Win32、UWP 按微软的说法,WinUI 3 是同时为 Win32 和 UWP 程序提供支持的,也就是说它应该允许独立运行在 Win32 框架上,不受 UWP 的权限管理限制。 对于 C++ 开发者,WinUI 3 借助 C++/WinRT 有完全的原生 C++ 支持,而不需要 C++/CX 或 C++/CLI 这样剑走偏锋的设计。这无疑对 GCC 或 Clang 上编译 WinUI 3 留下了可能。作为开发者,着实不希望微软带领技术走向分裂。 对于 UI 设计,WinUI 3 继承了 UWP 程序的 XAML 技术,为用户提供了 Fluent 风格的控件和交互体验。也就是说在核心的 UI 开发方式上,还是和 UWP 保持一致的,只是控件风格有所改变。但是 WinUI 3 不受 UWP 复杂的权限约束限制,可以说对 Win32 开发者十分友好了。...

February 3, 2022 · 3 min · lyincc