ccdui.h 并没有实现一套新的UI渲染器和布局器,只是对Apple的SwiftUI框架中的部分常用内容使用C(AutoTree语法)进行封装,可以实现在Mac、iPad的窗口中运行、在编辑器的Tab中运行或者在桌面小组件中运行。如果您了解SwiftUI框架,那使用ccdui将非常容易上手。
本文不探讨具体组件的使用和布局方法,如果您想了解这些内容,欢迎访问 ccduicomp.h的介绍文章
注意:本文用到了AutoTree构造语法,这不是标准C的语法,而是为了更简单的实现特定功能创造的语法。
ccdui将所有可以放置组件的容器归类为UIContainer,您可以将它理解为窗口。您可以使用ccd_ui_create
来创建窗口,在窗口中使用ccd_ui_attach
来将组件树附加到窗口上以显示内容,然后使用ccd_ui_show
来显示窗口。特别的,当您的代码结束时窗口会消失,您需要使用ccd_ui_start来延迟程序结束并进入窗口消息循环以便接收事件,这是本文探究的重点。
ccd_ui_start函数的实现是一个while(1)循环,在循环中计算当前显示的窗口数量,如果数量为0则跳出循环(程序结束)。同时,它也会维护一个消息队列并接收来自UI线程的消息,例如按钮点击等消息,然后调用对应的您定义的事件处理程序action来将程序控制权暂时交给您处理。基于此特点,您不应该在action处理程序中使用同步将ccd_ui_start中的循环暂停过久,这将导致UI消息陷入阻塞状态,其他的消息无法及时分发给对应的action函数,可以说它是一个事件分发器。
您应该在程序末尾调用ccd_ui_start,因为它在窗口没有全部关闭之前不会返回值,同时在窗口全部关闭后应用程序也应该结束,所以建议在main函数的结尾调用。
内存限制:C Code Develop限制运行的程序内存最大为64MB(不包括图片及AutoTree内存),其中包括8MB栈内存以及少于1MB的其它支持内存。但是在小组件模式下,程序限制为16MB(不包括图片及AutoTree内存),也就是说您最多只能用malloc函数申请7MB内存。小组件模式中,您还可以使用不超过4MB的图片资源。(建议使用不多于2张1000x1000分辨率以内的图像素材)
功能限制:正常模式下不受限制,在小组件模式下您的应用程序会在ccd_ui_attach
函数交给C Code Develop处理并不再返回值,所以请将全部与计算组件树相关的代码放置于调用ccd_ui_attach
之前。小组件会每间隔一段时间重新运行您的代码的main函数并重新绘制,这个时间间隔无法确定也无法设置(可能取决于系统的电源设置)。同时,小组件模式下所有的可交互组件都会失效,如您无法点击按钮,滚动区域也将无法滚动而停留在初始状态等。
autotree.h 定义了组件树的存储方式,并增加了快速构造语法
ccduicomp.h 定义了如何构造组件树,及组件树的格式