上节课,我们完成了Winui C++的安装和创建第一个程序,并且程序可以正常运行。那么本节课,我们来分析一下第一个Winui C++程序。

下面解析一下各个文件和目录的作用
解析项目目录
解决方案名
最上面的:Solution ‘App3’ 是解决方案名称,名字叫App3,你创建项目的时候,可以指定解决方案名,默认就是你项目名

上图中,第一个输入框就是项目的名称,最后一个就是解决方案的名称,默认是同的,你可以指定不一样。
解决方案中可包含多个项目,这里只有 1 个桌面打包项目 App3 (Desktop)。
1. References(引用)
存放项目依赖的 SDK、Windows App SDK、WinRT 运行时、NuGet 安装的组件引用:
- Windows SDK、WinUI 3 控件库、C++/WinRT 头文件库、Microsoft.UI.Xaml 等依赖都在这里管理;
- 无需手动修改,VS 管理 NuGet 包时自动更新。

2. External Dependencies(外部依赖)
这个文件夹会自动扫描的系统头文件、SDK 头、第三方库头文件:
- Windows.h、winrt/ 系列头、Microsoft.UI.Xaml 底层头;
- 只读,用来查看外部引入的代码,不能手动编辑。通常是安装vs中带有的一些库。

我们随便双击打开一个文件,可以看到它的位置是在vs的安装目录下面,鼠标帮到顶部的文件名的位置,可以显示文件的位置

3. Assets 资源文件夹(应用图标 / 启动图)
全部是微软商店、系统弹窗、开机闪屏、锁屏使用的图像资源,用于打包上架 Microsoft Store:
为什么会有这些东西?这是因为我们创建项目的时候,会看到这是一个用来打包的程序,所谓打包,就是说以后你会编译成msix或者微软应用商店的文件。那打包和非打包有什么区别?不打包就是你可以之间绿色运行,我们以前开发的很多项目,编译出exe,双击exe就可以运行,而打包,就是把所有的exe dll等等资源文件 放到一个包里面。然后别人双击这个文件,就可以安装了。这就是打包。不过由于我们开发好后,需要发布到微软商店。所以就选了这个packaged的

上面就是我们创建项目的时候,选择的模板了,从里面的描述我们可以看到,这是一个用来发布到微软商店,编译出msix文件的项目。而微软商店发布,需要很多图标,图片之类的,所以我们的项目就包含了这些东西了。是否可以不打包?可以的,我们可以编译出exe文件来直接运行。后面我们会讲到。
各个图片的作用
| 文件 | 作用 |
|---|---|
| LockScreenLogo.scale-200.png | 锁屏界面应用图标(200% 高 DPI 缩放) |
| SplashScreen.scale-200.png | 程序启动闪屏画面 |
| Square44x44Logo…多张图片 | 开始菜单小图标、任务栏图标、Alt+Tab 窗口缩略图 |
| Square150x150Logo.scale-200.png | 开始菜单中等磁贴图标 |
| StoreLogo.png | 微软商店展示的应用大图 |
| Wide310x150Logo.scale-200.png | 开始菜单宽版磁贴 |
app.manifest
传统 Windows 应用程序清单(兼容 Win32):
- 设置应用权限、兼容 Windows 版本、DPI 感知、管理员权限、窗口缩放行为;
- 区分于 UWP 的
Package.appxmanifest,桌面打包项目双清单共存。
4. App.xaml / App.xaml.h / App.xaml.cpp
应用程序全局入口根类(对应 winrt::App3::App)
App.xamlXAML 全局资源字典:全局样式、控件模板、颜色、字体、主题资源,整个项目所有页面共享。App.xaml.hC++/WinRT 自动生成的头文件,定义App类声明,包含 OnLaunched、OnActivated 等生命周期函数。App.xaml.cpp应用生命周期逻辑实现:OnLaunched:程序启动时执行,创建并显示MainWindow;- 处理窗口激活、挂起、主题切换、异常捕获;
- 全局初始化逻辑(字体、数据库、单例服务)写在这里。
打开cpp文件,我们可以看到如下
void App::OnLaunched([[maybe_unused]] LaunchActivatedEventArgs const& e)
{
window = make<MainWindow>();
window.Activate();
}Code language: C++ (cpp)

从这里开始 程序就进入到MainWindow了,APP是入口,不是创建窗口,MainWindow才是真正创建我们看到的窗口,控件对话框的地方。
5. MainWindow.xaml 整套(主窗口)
程序默认主窗口,桌面应用的根可视化窗口,最上,最顶的窗口。
MainWindow.xaml窗口界面布局:按钮、文本框、导航控件、页面承载 Frame 都写在这里;MainWindow.idlIDL 接口定义文件(C++/WinRT 核心) 定义窗口暴露的属性、方法、事件,用于 XAML 绑定、跨组件调用、生成类型元数据;修改后会自动生成.h/.cpp胶水代码。MainWindow.xaml.h由 IDL + XAML 自动生成的类头文件,存放控件成员、构造函数、事件处理函数声明。MainWindow.xaml.cpp窗口业务逻辑:按钮点击事件、数据绑定、页面跳转、控件交互代码。
如下是MainWindow.xaml 是呈现控件和布局的地方
<?xml version="1.0" encoding="utf-8"?>
<Window
x:Class="App3.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App3"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Title="App3">
<Grid>
</Grid>
</Window>
Code language: HTML, XML (xml)
6. module.g.cpp
C++/WinRT 全局模块生成文件(自动生成,禁止手动修改)
- 根据所有
.idl文件生成 WinRT 类型注册代码; - 提供
winrt::App3::implementation命名空间入口,让系统识别自定义 XAML 控件、窗口类; - 增删 IDL 文件后 VS 自动重新生成。
7. Package.appxmanifest(MSIX 打包清单,重中之重)
桌面应用打包成 MSIX/MSIX 安装包的配置文件,双击用可视化编辑器打开:
- 应用名称、版本、发布者、图标、启动入口;
- 声明系统权限(文件访问、摄像头、网络、后台任务);
- 关联文件打开协议、URL 协议、扩展;
- 配置商店上架信息、桌面快捷方式、文件关联; 区分
app.manifest:这个是应用商店 / MSIX 包清单,UWP / 打包桌面专用。

例如这里配置和微软商店有关的一些东西,例如 版本 打包名 发布者 等等 这些东西需要你到微软应用商店哪里获取
8. packages.config
NuGet 包配置文件:记录项目安装的所有 NuGet 包版本,如:
- Microsoft.Windows.SDK.NET、Windows App SDK、C++/WinRT、WinUI 3 库;
- 团队协作 / 换电脑时 VS 依据此文件自动还原依赖包。
9. pch.h/pch.cpp(预编译头,C++ 编译加速)
pch = Precompiled Header
pch.h:全局公共头统一引入(winrt/Windows.、Microsoft.UI.Xaml.、标准库),所有 cpp 文件第一句#include "pch.h";pch.cpp:预编译头编译源文件; 作用:大幅减少编译时间,不用每个文件重复导入大量系统头。
就是把一些引用,统一写道这个文件里面,然后其他文件引用include这个文件,就可以减少代码量,加速编译了。
10. readme.txt
VS 模板自带说明文档,记录 WinUI 3 C++ 项目基础编译、打包、调试说明。
容易混淆的两个 manifest
app.manifest→ 传统 Win32 进程清单(窗口、系统兼容、权限)Package.appxmanifest→ MSIX 应用包清单(商店、安装、系统功能声明)
项目整体运行流程
- 程序启动 → 进入
App::OnLaunched(App.xaml.cpp) - 创建
MainWindow实例并激活显示 window = make(); window.Activate(); MainWindow.xaml渲染界面,cpp 处理交互- 打包发布时读取
Package.appxmanifest生成安装包,Assets 里图标嵌入安装包
以上就是,我们整个最简单一个空白程序的执行目录结构和执行过程。下一节课,我们来在窗体里面增加一个按钮,然后点击按钮,让按钮上面的数字递增,从而了解winui c++框架的执行机制。