在 C++ Win32 项目中使用 WinUI3 窗口
背景
在已有的 Windows 图形界面程序中,引入现代的 WinUI3 窗口,相比把所有代码迁移到 WinUI3 项目中,是一个成本较低的改进体验方案。
代码的组织和编写方式,可以参考已有的文章:https://www.codeproject.com/articles/WinUI3-in-Existing-Win32-Applications。
然而,上面外国人写的这篇文章里,很多需要作的工作并没有提到,有以下几点:
- 怎么在 Win32 项目中引入 WinUI3 依赖项;添加了依赖项,才能让 C++ 编译器和链接器正确找到 WinUI3 头文件和库文件;
- 怎么让 NuGet 管理引入的依赖项;让 NuGet 管理依赖项后,方便使用 NuGet 升级依赖项。
如果是用 VC++ 创建的 WinUI3 项目,上面两个工作会自动在创建项目时完成,不需手工做。然而在 Win32 项目中,需手工做。
操作步骤
在 C++ Win32 项目中引入 WinUI3 依赖项
- 创建一个 C++ 的'空白应用,已打包(桌面版中的 WinUI3)'项目,如下图所示,假设其名字是 project_winui3;
- 接下来,再创建一个 C++ Windows 桌面程序,假设其名字是 project_win32。
上面两步,应该比较容易,不是重点。
project_winui3.vcxproj 里有完整的 WinUI3 依赖配置,现在要做的是,根据 project_winui3.vcxproj,修改 project_win32.vcxproj。.vcxproj 是 VC++ 的项目文件,现在需要手工修改。
用你熟悉的编辑器,分别打开 project_winui3.vcxproj 和 project_win32.vcxproj。
接下来要做的是:
- 把 project_winui3.vcxproj 文件中开头的以
<Import Project开头的行,复制到 project_win32.vcxproj 文件的<ProjectDefaultTargets="Build"xmlns="http://schemas.microsoft.com/developer/msbuild/2003">这一行下面。复制完成后的样子是这样的(注意:只是示意,依赖项版本可能会不一致):
<?xml version="1.0" encoding="utf-8"?><ProjectDefaultTargets="Build"xmlns="http://schemas.microsoft.com/developer/msbuild/2003"><Import Project="..\packages\Microsoft.Windows.SDK.BuildTools.10.0.26100.7463\build\Microsoft.Windows.SDK.BuildTools.props" Condition="Exists('..\packages\Microsoft.Windows.SDK.BuildTools.10.0.26100.7463\build\Microsoft.Windows.SDK.BuildTools.props')"/><Import Project="..\packages\Microsoft.Windows.CppWinRT.2.0.250303.1\build\native\Microsoft.Windows.CppWinRT.props" Condition="Exists('..\packages\Microsoft.Windows.CppWinRT.2.0.250303.1\build\native\Microsoft.Windows.CppWinRT.props')"/>

