870920 Menu

JUCE GUI程序的启动与退出

启动顺序与执行流程为:

启动宏—>程序主体类—>窗口框架类—>基础组件类—>内容组件类(包含子组件、控件、其他界面元素等,可层层包含)

注:“程序主体类”可称为“主程序类”。“窗口框架类”亦可称为“主窗口类”或“带标题栏的桌面窗口”。这些JUCE专有“术语”,仅为了说明方便,由笔者(Running)自行命名与约定,不是太严谨。诸位不必深究。这一点,在今后的发文中,不再另行注明。如有疑问,请移步此处交流研讨。

实际上,从启动宏开始,程序依次构造当前类所组合的类的对象,最末端的类构造完毕后,依次完成上层类的构造(即C++面向对象的内部运作机制)。程序运行中,需要哪个对象,代码就创建哪个对象,又是一通内存分配与对象的构造。

启动宏封装了各个操作系统下的main()函数。该宏需要一个参数,即程序主体类。该类继承自JUCEApplication抽象基类。本类的对象无需显式实例化,类名直接传给启动宏,由JUCE所封装的操作系统底层接口来处理,从而启动程序。绝大多数情况下,做应用级软件的程序员无需关心这些内部的底层运作。

窗口框架类继承自DocumentWindow类,由程序主体类的初始化方法来创建和管理。

基础组件类继承自Component类。该类的对象由窗口框架类创建和管理。基础组件类通常不直接添加各类控件和终端子组件,而是作为主界面容器,菜单栏和命令目标(此时需继承MenuBarModel类, ApplicationCommandTarget类)。

内容组件类通常需继承自Component类及其它所需的其他功能类(多重继承)。该类的对象由基础组件创建和管理,内容组件类可直接添加并管理更多的子组件、控件和程序界面可视化元素。实际编程中,优雅和整洁的处理思路通常采取子组件逐级嵌套,或子组件并列嵌入上级组件中等方式来规划和管理程序的GUI部分。这类小技巧同样没什么技术含量,完全是GUI方面的经验和体力活而已。不赘。

程序退出时,各对象从下往上依次析构,最后再依次回到窗口框架类和主程序类。退出程序可分两种情况:一是直接点击窗口框架标题栏中的关闭按钮;二是通过程序命令退出。此时,主程序类中两个与退出有关的函数的执行流程是(极端重要,务必理清、牢记):

先执行systemRequestedQuit(),后执行shutdown()。如果通过点击标题栏关闭按钮来退出,则先执行窗口框架类的closeButtonPressed(),可在此函数中调用systemRequestedQuit()。

注意:不能在shutdown()函数中调用systemRequestedQuit()函数,这样会造成死循环。

通过程序命令退出时(比如快捷键Ctrl+Q),直接执行主程序类的systemRequestedQuit(),而后再执行主程序类的shutdown ()函数,此时不再执行窗口框架类的任何函数。