AWTK 开发 UI 简单入门—XML 篇
一,前序
在上一篇文章中( AWTK 开发 UI 简单入门 C 语言篇)让大家明白 AWTK 的 UI 入门了,但是如果纯用 C 语言写 UI 会出现比较多的问题,其中比较严重的是无法把 UI 设计和程序逻辑分开,现在主流的 GUI 类库都是采用了 XML 的前端设计加上主流语言的后端逻辑的思路,例如 WPF 和 android,同时 AWTK 也支持 XML 的前端设计加上 C 语言的后端逻辑的思路,下面我们就来演示一下如何使用 XML 来做 UI 设计和 C 语言逻辑绑定吧。
备注:本文中采用的例子为 ZLG 提供的 HelloWorld.Xml-Demo 项目为原型,而文本只是把项目改为使用 vs 的项目,而不是原项目采用的 scons 而已,下面附上对应项目的 github 地址:
- ZLG 提供 HelloWorld.Xml-Demo 项目的 github 地址:https://github.com/zlgopen/awtk-examples
- 修改后的 HelloWorld.Xml-Demo 项目的 github 地址:https://github.com/WNsACE/优快云_AWTK_DEMO
二,构建项目
由于上一篇文章中已经详细描述了如何使用 vs 来构造一个 AWTK 的项目,所以这里就不逐一描述了。(如果大家不清楚的话,建议看回上一篇文章)
- 构建一个名为 HelloWorld.Xml-Demo 的 vs 项目
- 把项目中设置为 x64
- 把 ZLG 提供 HelloWorld.Xml-Demo 项目中的 src 文件夹和 res 文件夹拷贝到新的 HelloWorld.Xml-Demo 的 vs 项目目录下,并且把 src 文件夹下的 SConscript 文件删除(其实不删除也可以,只是本人的强逼症 0.0),如图:
- 然后把 src 文件中的 app_main.c 和 window_main.c 文件加入到 vs 项目中。
- 设置窗口的子系统类型,如下图:(因为窗口类型会调用 WinMain 函数作为函数入口,控制台类型会调用 main 函数作为函数入口)
备注:如果不设置这里有可能会先链接不到对应的函数入口。
- 设置项目头文件路径和宏。
备注:宏设置的时候,需要把 WITH_FS_RES 宏设置到项目中,下面会讲述这个 WITH_FS_RES 宏的作用。
- 设置项目类库路径和对应的类库。
备注:加入类库中,需要把 extwidgets.lib 类库加入到项目中,因为代码中调用到 tk_ext_widgets_init 函数,所以需要加入 extwidgets.lib 类库,但是该项目中没有用到该类库中的控件,所以也可以删除 tk_ext_widgets_init 函数,而不是加入 extwidgets.lib 类库。
- 修改项目的输出目录为 $(ProjectDir)bin\ ,如下图:
备注:
- 这里设置 vs 项目中的输出目录是为了配合原来 ZLG 的 demo 代码(因为完全没有修改 ZLG 的代码)。
- 这里一定需要注意的是 AWTK 和 ZLG 的 demo 代码一定要最新的,要不然会出现各种奇怪的问题,甚至崩毁的问题。(这个原因主要是因为 AWTK 在 1 月头的时候更新了资源相关的代码,导致旧的资源不能被新的 AWTK 使用导致的。)
把项目配置完后,直接运行就可以看到效果了,接下来会一步一步来解析上面的配置原理和代码中的逻辑,让大家可以更好的理解。
三,解释配置原理
上面的所有配置都是为了配置原来 ZLG 提供的 demo 代码,所以接下来我们一起来理解一下吧。
1. 为什么需要加入 WITH_FS_RES 宏到项目中
WITH_FS_RES 宏在 AWTK 中是用于启用文件系统的,让程序可以通过文件系统加载到文件。同时我们打开 res/assets.inc 文件,该文件用来加载需要的文件,本文暂时不解释该文件中的各种头文件的意义,我们这里是解释 assets.inc 文件中的 assets_init 函数(assets_init 函数在 app_main.c 文件中的 main 函数中有被调用)中的,通过 WITH_FS_RES 宏来调用预加载函数(assets_manager_preload 函数)来把 default 风格资源和 default 字体资源加载到程序中,然后通过 tk_init_assets 函数来把对应的资源挂载到对应的资源管理器中,如下图:
备注:如果程序系统中支持文件系统的话,请加入 WITH_FS_RES 宏,如果不加入 WITH_FS_RES 宏的话,资源会变成全局静态数组添加到 AWTK 的资源管理器中,这里不展开来讲述,留在下一章节讲资源的时候再展开来讲。
2. 为什么输出目录为 $(ProjectDir)bin\
有人会问,明明在 main 函数中设置的是程序运行的目录下的 res 目录作为