Day 6:JUCE 框架基本架构

本文介绍 Projucer 建立的 GUI Application 框架基本架构。框架(Framework)可以想像成「骨干」,Projucer 搭了视窗应用程序的骨干,再由开发者视需求加上必要的表皮以及逻辑。

回顾上次建立的 GUI App,不改动任何程序码,直接编译执行的样子:

底下简述构成上述视窗的程序码。

首先,Projucer 会产生 Main.cpp,内含自 GUI Application 的主要类别(JUCEApplication)。其中,我们的程序主类别名为 SamGUIApplicationApplication,其名称由建立专案时,於 Projucer 输入的 Projec Name 组合而成,该类别继承自 juce::JUCEApplication。这个设计是 JUCE GUI Application 的核心架构,程序要能顺利运作,背後涉及许多模组合作。要说明其中关系需要不少篇幅,以後再说...

底下截录 SamGUIApplicationApplication 程序码片段,为了版面,稍做调整。拿掉自动产生的注解,看起来更加朴实无华:

class SamGUIApplicationApplication  : public juce::JUCEApplication
{
public:
  SamGUIApplicationApplication() {}

  const juce::String getApplicationName() override
  {
    return ProjectInfo::projectName;
  }
  
  const juce::String getApplicationVersion() override
  {
    return ProjectInfo::versionString;
  }
  
  bool moreThanOneInstanceAllowed() override { return true; }

  void initialise (const juce::String& commandLine) override
  {
      mainWindow.reset (new MainWindow (getApplicationName()));
  }

  void shutdown() override
  {
      mainWindow = nullptr; // (deletes our window)
  }
};

START_JUCE_APPLICATION (SamGUIApplicationApplication)

要理解应用程序框架,必须理解其生命周期——开始执行的进入点,结束时如何离开。JUCE GUI Application 执行时,会先建立 juce::JUCEApplication,所以会先建立 SamGUIApplicationApplication 物件,执行 Constructor。

接着呼叫 initialise 函数,其中 commandLine 字串代表执行时的输入参数;结束时,shutdown 会被呼叫。

透过上述规则,发者可於 initialise 函数内放入初始化的程序码或确保相依模组已经就续。

同样地,JUCE 程序完全关闭前,会呼叫 shutdown 函数,此时可做清理、释放记忆体、储存未存的档案等...。这两个函数皆可被继承,但我通常不这麽做。

接着看两个重要函数:

void systemRequestedQuit() override
{
    quit();
}

void anotherInstanceStarted (const juce::String& commandLine) override
{
}

systemRequestedQuit 为一 Callback 函数,被呼叫时,表示程序即将结束。预设呼叫 quit(),其内部触发相关事件後,程序中止。quit() 内部实作如下:

void JUCEApplicationBase::quit()
{
    MessageManager::getInstance()->stopDispatchLoop();
}

接下来我将一一拆解 JUCE GUI Application 的主要元素...


<<:  建立 Line Bot(2)

>>:  【Day 4】输出之後,BERT转换的Embedding怎麽用?

Day 06: 测试驱动开发 (Test Driven Development)

「然而,没有测试套件,他们就丧失确保『程序修改後是否仍能照预期般工作』的能力,他们没办法保证『对系...

Day26 - 铁人付外挂测试验收(二) - 导入单元测试

先来回顾一下目前铁人付外挂的资料夹结构: iron-pay ├── composer.json ├─...

JS 10 - 原型继承

大家好! 今天只会简单介绍原型的继承关系,当我们介绍完原型链後,就会详细说明继承的方法。 我们出发吧...

Javascript档案中使用Django template 变数

在template中我们可以定义javascript变数为djagno变数,如下: <scri...

Day 28: Behavioral patterns - Visitor

目的 当一群相似结构的物件们,在执行相同方法时却有着不同实作内容,那可以将方法封装成独立物件。当需要...