Undo(撤销)与Redo(重做)详解

UndoableAction可撤销的操作和UndoManager撤销管理器这两个类协同配合可实现程序中的撤销与重做功能。

UndoableAction是抽象基类,使用时需派生该类的子类,每个子类代表程序所执行的相同逻辑、相同数据类型、相同功能的单次操作(这一点非常关键)。可以这么理解:每个UndoableAction派生类的对象就是一次需要撤销和重做的操作。通常,该类的构造参数为内容组件类的指针和需要完成本次操作所需的具体数据。利用内容组件类的指针调用其功能性函数执行具体的操作,而本次操作所需的数据又可以作为撤销时的恢复数据。也就是说,要实现撤销与重做功能,关键有二:

继续阅读Undo(撤销)与Redo(重做)详解

JUCE类库ValueTree类详解

先了解一下Identifier类。该类的对象代表一个字符串标识符(属性名称),用于按名称访问属性值。ValueTree使用本类对象作为属性值所对应的属性名称。相比数据类型标识符(比如int、double等),Identifier更加清晰直观,便于使用(一是不用写字符串的””引号,二是该属性是什么一目了然)。而相比于XML中节点的属性名称,其执行效率更高:XML的一切处理都是基于文本字符串的,而Identifier则相当于一个全新的“类型”。

继续阅读JUCE类库ValueTree类详解

JUCE类库var类和Value类详解

JUCE类库的var不仅是数据容器,更是一个功能强大的“万用型”数据类型,既可以保存一个具体类型的数值,又可以保存该类型的一整个数组。通过其构造函数的多个重载版本即可获知,var可代表的数据类型有:int, int64, bool, double, const char*, const wchar_t*, String, ReferenceCountedObject引用计数类的指针 ,DynamicObject键值对数组,甚至可以是某个函数(实质为函数指针)!

继续阅读JUCE类库var类和Value类详解

JUCE类库的“安全”指针

 ScopedPointer 作用域指针,类模板

作用域指针ScopedPointer用来替代传统的指针,非常实用。当该指针离开声明它的作用域范围,或者指向一个新的堆对象,或者被显式赋值为nullptr时,它所指向的堆对象将自动被销毁并释放内存。永远无需也不要delete本类的对象。

继续阅读JUCE类库的“安全”指针

JUCE类库数据容器4-1

JUCE类库中,数据容器的地位与重要性相当于C++中的STL。用该类库编程,甚至完全可以不用C++的标准库。JUCE相当一批数据容器为线程安全的类模板。其中,第一个模板参数为容器要保存的数据类型,第二个模板参数为CriticalSection临界区(互斥)类型,该模板参数有默认值(一个虚假的临界区对象)。如需确保线程安全,将其替换并显式设置为临界区对象即可。

JUCE的数据容器类相当多,本节只列出若干重要且常用的。

继续阅读JUCE类库数据容器4-1

JUCE-GUI-鼠标事件的拦截与转发

鼠标(含智能移动设备的触控)事件的拦截与转发针对的是某个组件及其子组件。所有组件类对象、子组件和控件均可设置对鼠标点击事件的响应,具体的响应可分为两种类型,拦截(自行判断并处理)或转发(本身不处理,传递给子组件或其他组件)。

默认情况下,JUCE内部已经将鼠标点击事件处理的很合理了,即组件和控件天生具有拦截并产生消息的能力。但是,某些时候,比如使用了容器组件时,为防止处于父级地位的容器组件拦截鼠标点击事件,而其容纳的子组件或控件接收不到鼠标事件,或者需要在容器组件中对所有鼠标事件和快捷键事件做统一调度,遇到这些情况,必须做显式设置。

继续阅读JUCE-GUI-鼠标事件的拦截与转发