ApplicationProperties详解 2-2

使用ApplicationProperties读写程序属性设置的代码示例:

 保存和加载音频设置

// 设置音频设备并保存设置
void MainHostWindow::showAudioSettings() 
{
    /* 定义设备选择器组件。deviceManager为AudioDeviceManager对象,构造函数中已初始化 */
    AudioDeviceSelectorComponent  audioSetComp (deviceManager, 
                         0, 256, 0, 256, true, true, true, false);

    // 设置设备选择器组件的大小
    audioSettingsComp.setSize (500, 450);

    // 弹出模态对话框,该对话框的内容组件为设备选择器组件(模态对话框的语法不建议再这样写)
    DialogWindow::showModalDialog (L"音频设置", &audioSetComp, 
                                   this, Colours::azure, true);

    /* 用户在模态对话框中设置音频设备。关闭该对话框后,继续执行下面的代码. 将当前设置保存到程序属性对象中。先定义一个XML节点对象,初始化赋值,而后保存该节点的信息*/
    ScopedPointer audioState (deviceManager.createStateXml());
    appProperties->getUserSettings()->setValue ("deviceState", audioState);
    appProperties->getUserSettings()->saveIfNeeded();
}

该类的构造函数中,读取已保存的音频设置:

 
// 定义一个XML节点类作用域指针对象,初始化为已保存的音频设备的设置信息
ScopedPointer savedAudioState (appProperties->
                       getUserSettings()->getXmlValue ("audioDeviceState"));

// 用XML节点中的数据初始化音频设备
deviceManager.initialise (256, 256, savedAudioState, true);

 存取插件信息(包括插件列表、当前排序和插件操作窗口的状态),步骤有7:
1、窗口框架类继承自可变捕获器类。

class MainHostWindow : public DocumentWindow, public ChangeListener ...

2、窗口框架类中声明对象。

// 当前所有可用的插件列表类栈对象,本程序的核心数据成员
KnownPluginList knownPluginList;

// 插件列表::排序方法 枚举型对象
KnownPluginList::SortMethod  pluginSortMethod;

3、窗口框架类的构造函数中初始化插件列表对象。

// 定义一个XML节点对象,初始化,获取已保存的插件列表
ScopedPointer savedPluginList (appProperties->
                       getUserSettings()->getXmlValue ("pluginList"));  

// 如果该对象有效,则插件列表对象从XML节点中创建插件列表信息
if (savedPluginList != nullptr)
    knownPluginList.recreateFromXml (*savedPluginList);

/* 本类枚举型对象插件排序对象赋值。本语句将属性文件对象的调用结果强转为枚举类型。getIntValue()的第二个参数为:如果1参属性值没找到,则返回该参数的值 */
pluginSortMethod = (KnownPluginList::SortMethod) 
	      appProperties->getUserSettings()->getIntValue 
              ("pluginSortMethod", KnownPluginList::sortByManufacturer);

/* 插件列表对象绑定可变捕获器,本类已继承可变捕获器类,因此该对象产生的任何可变消息可由本类捕获处理 */
knownPluginList.addChangeListener (this);

4、窗口框架类的析构函数中,销毁插件列表窗的静态指针(该对象见第七步),而后已知插件列表对象移除已绑定的捕获器。

delete PluginListWindow::currentPluginListWindow;
knownPluginList.removeChangeListener (this);

5、窗口框架类由于继承了可变捕获器类,需实现其纯虚函数changeListenerCallback (),即捕获可变消息后的判断处理。在该函数中添加:

// 定义一个XML节点对象保存插件列表的信息。即每次扫描或插件运行崩溃时,均自动保存插件信息
ScopedPointer savedPluginList (knownPluginList.createXml());

// 如果插件列表有效,则程序属性对象保存有关信息
if (savedPluginList != 0)
{
    appProperties->getUserSettings()->setValue (
                         "pluginList", savedPluginList);
    appProperties->saveIfNeeded();
}

6、窗口框架类打开插件列表窗的代码为:

// 打开插件列表窗。如果未显示,则实例化一个,如果已显示,将其转到前端
if (PluginListWindow::currentPluginListWindow == 0)
    PluginListWindow::currentPluginListWindow = 
                           new PluginListWindow (knownPluginList);

PluginListWindow::currentPluginListWindow->toFront (true);

7、定义插件列表窗类。插件的管理、路径位置、扫描、排序等等功能,全部囊括。

// 插件列表窗,类定义和类实现,继承自文档窗口类
class PluginListWindow : public DocumentWindow 
{
public:
    /* 本类需一个引用型的构造参数,实例化插件列表组件的时候会用到。插件列表组件对象也是本窗口自包含的可视化组件。该参数由实例化本类的类负责传入。即前面几步的已知插件列表对象knownPluginList。构造函数的功能:将自身赋值给本类的静态对象,定义记录损坏插件信息的文件对象,创建并设置自包含插件列表组件,设置本窗口的位置和调整大小方面的属性,从全局程序属性对象所保存的信息中恢复本窗口的状态,设置本窗口可视  */
PluginListWindow (KnownPluginList& knownPluginList) : 
                  DocumentWindow (L"当前可用的插件列表", 
                  Colours::white,
                  DocumentWindow::minimiseButton | 
                  DocumentWindow::closeButton)
{
    /* currentPluginListWindow是本类中声明的静态public指针,该指针对象的类型即本类 */
    currentPluginListWindow = this; 

    /* 定义一个const文件对象,用来记录损坏插件的有关信息。文件名为:全局程序属性对象调用的一系列函数的返回值。appProperties->getUserSettings() 返回属性文件类的指针,接着getfile()返回该对象的文件类栈对象,接着用getSiblingFile()返回此文件所位于的同一个目录下的另一个文件或目录,名称为RecentlyCrashedPluginsList  */
    const File deadMansPedalFile (appProperties->getUserSettings()->
                       getFile().getSiblingFile ("RecentlyCrashedPluginsList"));

    /* 设置本类的自包含对象,第一个参数为:new一个插件列表组件类对象,该类由JUCE类库提供,包含了插件管理、路径位置、扫描、排序等一整套现成的功能。1参为构造函数的参数,2参为刚刚定义的文件,即用来记录扫描时遇到的损坏的插件的有关信息,3参为当前所使用的程序属性设置。本函数的第二个参数为:当1参对象改变大小后,本类是否自动调整大小以匹配之。*/
    setContentOwned (new PluginListComponent (knownPluginList, 
               deadMansPedalFile, appProperties->getUserSettings()), true);

    // 本类可调整大小,不使用右下角的调整器
    setResizable (true, false);

    // 限制可调整的极限大小
    setResizeLimits (300, 400, 800, 1500);

    // 设置本组件的左上原点
    setTopLeftPosition (60, 60);

    /* 从字符串信息中恢复本窗口的状态。可恢复窗口的大小、位置、是否全屏等信息。本例的字符串信息由程序属性对象提供。本类析构时首先将窗口状态信息写入程序属性对象中 */
    restoreWindowStateFromString (appProperties-
                  >getUserSettings()->getValue ("listWindowPos"));

    // 设置可视
    setVisible (true);
}  
// ===============构造函数结束=================  
// 析构函数。保存本窗口的状态信息,清除自包含组件,断言,本类的static数据成员置零
~PluginListWindow() 
{
    // 将本窗口的大小和位置等信息保存到程序属性对象中。构造函数中,有读取并恢复的语句
    appProperties->getUserSettings()->setValue ("listWindowPos", 
                     getWindowStateAsString());

    // 清除自包含组件
    clearContentComponent();

    // 断言,当前插件列表窗正是正在析构的对象
    jassert (currentPluginListWindow == this);

    // 当前插件列表窗对象置零。该对象是本类中声明的静态对象
    currentPluginListWindow = 0;
}

// 点击关闭按钮后,销毁自身
void closeButtonPressed() { delete this; }    

// public静态数据成员,本类的指针 
static PluginListWindow* currentPluginListWindow;
};

// 类外初始化静态数据成员
PluginListWindow* PluginListWindow::currentPluginListWindow = nullptr;