介绍第一个Winui C++程序

上节课,我们完成了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

  1. App.xaml XAML 全局资源字典:全局样式、控件模板、颜色、字体、主题资源,整个项目所有页面共享。
  2. App.xaml.h C++/WinRT 自动生成的头文件,定义 App 类声明,包含 OnLaunched、OnActivated 等生命周期函数。
  3. 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 整套(主窗口)

程序默认主窗口,桌面应用的根可视化窗口,最上,最顶的窗口。

  1. MainWindow.xaml 窗口界面布局:按钮、文本框、导航控件、页面承载 Frame 都写在这里;
  2. MainWindow.idl IDL 接口定义文件(C++/WinRT 核心) 定义窗口暴露的属性、方法、事件,用于 XAML 绑定、跨组件调用、生成类型元数据;修改后会自动生成 .h/.cpp 胶水代码。
  3. MainWindow.xaml.h 由 IDL + XAML 自动生成的类头文件,存放控件成员、构造函数、事件处理函数声明。
  4. 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

  1. pch.h:全局公共头统一引入(winrt/Windows.、Microsoft.UI.Xaml.、标准库),所有 cpp 文件第一句 #include "pch.h"
  2. pch.cpp:预编译头编译源文件; 作用:大幅减少编译时间,不用每个文件重复导入大量系统头。

就是把一些引用,统一写道这个文件里面,然后其他文件引用include这个文件,就可以减少代码量,加速编译了。

10. readme.txt

VS 模板自带说明文档,记录 WinUI 3 C++ 项目基础编译、打包、调试说明。

容易混淆的两个 manifest

  1. app.manifest → 传统 Win32 进程清单(窗口、系统兼容、权限)
  2. Package.appxmanifest → MSIX 应用包清单(商店、安装、系统功能声明)

项目整体运行流程

  1. 程序启动 → 进入 App::OnLaunched(App.xaml.cpp)
  2. 创建 MainWindow 实例并激活显示 window = make(); window.Activate();
  3. MainWindow.xaml 渲染界面,cpp 处理交互
  4. 打包发布时读取 Package.appxmanifest 生成安装包,Assets 里图标嵌入安装包

以上就是,我们整个最简单一个空白程序的执行目录结构和执行过程。下一节课,我们来在窗体里面增加一个按钮,然后点击按钮,让按钮上面的数字递增,从而了解winui c++框架的执行机制。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注