更详细的关于Form++产品的技术细节,请查看下面的列表:
在Form++中,命令就是能够对组件进行各种动态操作的动作,命令是构成Form++中画布的Undo\Redo架构的核心组成部分。在Form++中您可以定义任意多的命令,例如:CFOAddAction、CFORemoveAction、CFOMoveCompAction等就是命令的一些范例。
CFOAction是Form++中所有命令的基类,任何其他的命令都是从此类继承下来的。每个命令都有一个唯一的ID,这个ID是Form++的Data
Model在管理命令的时候需要的唯一标识。
在CFOAction中我们提供了三个虚函数,
Execute(..)、GetUndoAction(..)、
GetRedoAction(..),您在创建新的命令的时候,都必须覆盖着三个虚函数来重新定义新的操作。
CFOActionMacro是Form++提供的宏命令操作类,宏命令就是一组类的简称。如果您需要将一组命令同时执行,并且只需要一步UNDO/Redo就可以恢复的话,您就可以考虑执行一个宏命令。当命令执行的时候,它所包含的所有命令同时执行,并且只需要一步undo就可以恢复。
每一个命令都有一个不同的类型ID。当你有一个指向普通CFOAction对象的指针时,类型ID能够用来区分不同类型的命令。每个类都有一个默认的ID。例如:移动命令有一个叫ACTION_MOVESHAPE的ID。如果你想在同一个类中区分不同的命令时,你可以改变这个ID。
如果您需要定义属于您自己的命令,您需要定义属于您自己的ID值,Form++流程图组件库保留了一部分ID值供自己使用。具体您可以参考在fodefine.h定义。自定义ID需要大于:FO_ACTION_CUSTOM
(E-Form++专业版本界面)
(E-Form++可视化图形组件库企业版本界面)
现在的Form++
支持以下的命令。每个命令都支持undo和redo。你可以用Form++类向导生成自己的命令。
1 CFOAction
CFOAction是命令类的核心基类, 该类同CFODataModel和CFOPCanvasCore这两个基类紧密结合在一起,
并密切工作, 如果您决定在您的应用程序中使用CFODataModel和CFOPCanvasCore, 您就必须同时使用这些CFOAction类的派生类.
如果您希望节省内存, 则可以根据应用程序的需要调用SetUndoActionMaxCount以及SetRedoActionMaxCount设置为0来取消.
2 命令和类结构层次图
一个命令实际上就是任何文档状态发生变化的抽象反映,
他必须同时能够记录改变前的状态和改变后的新的状态, 当下一次再执行的时候, 则当前新的状态又变为老的状态.
同时必须构建好完整的Undo/Redo的逻辑关系, 所有命令类的基类是CFOAction,
下面几个纯虚函数在您构建新的命令类的时候必须得到覆盖:
// Get ID
virtual unsigned int GetID() const = 0;
// Return the inverse action of this one
virtual CFOBaseAction* GetUndoAction() const = 0;
// Return a copy of this action
virtual CFOBaseAction* GetRedoAction() const = 0;
// Get the name of the action
virtual void Sprint(CString& strLabel) const = 0;
// Executes the
action.
virtual BOOL Execute();
E-Form++可视化图形源码组件库文件本身提供了大量的命令处理实例用来处理画布上的任何图形的几何属性变化或者基本属性数据变化.
3 Undo管理器和命令管理器
Data model的核心处理类CFODataModelBase是专门设计用来创建和管理当前画布的所有undo/redo命令的,
当一个应用程序运行后, 所有的命令活动都为其所管理, 当应用程序关闭的时候,此类会自动决定如何从内存中清空那些命令. 对多文档应用程序,
为了能够在每个文档中都支持独立的Undo/Redo功能, 当每个文档打开的时候, 必须注册其自己的独立的Undo/Redo处理数据空间.
一般情况下是在函数 (CMyDocument::OnNewDocument()或者函数
CMyDocument::OnOpenDocument())中得到初始化. 当文档关闭的时候, 需要在析构函数或者DeleteContext中清空内存.
定义在类CFODataModelBase的如下函数专门用来处理命令类:
// Get count of undo
actions.
int GetUndoActionCount() const;
// Set max depth of undo actions.
virtual void SetMaxUndoActionCount(int nHistorySize);
// Get max depth of undo actions,if the undo stack is empty,it will
return 0.
int GetMaxUndoActionCount() const;
// Get count of actions on redo stack,if the redo stack is empty,it
will return 0.
int GetRedoActionCount() const;
// Set max depth of redo actions.
// nHistorySize -- size of the max redo stack.
virtual void SetMaxRedoActionCount(int nHistorySize);
// Obtain all the
descriptions of the actions on the undo stack,all the descriptions
will be stored within array.
void GetUndoActionText(
// Undo string list.
CStringArray *array
);
// Obtain all the descriptions of the actions on the redo stack,all
the descriptions will be stored within array.
void GetRedoActionText(
// Redo string list.
CStringArray *array
);
// Is a action available to be undone,if the undo stack be empty,it
will return FALSE.
virtual BOOL CanUndo();
// Is a action available to be redone,if the redo stack be empty,it
will return FALSE.
virtual BOOL CanRedo();
// Do action,execute
action and log the action.
virtual BOOL Do(
// Specify pointer of action.
CFOBaseAction* pAction,
// Log or not.
BOOL bLog = TRUE
);
4 创建一个新的命令类
创建一个新的以CFOAction为基类的命令类CMyAction需要如下几步操作, 首先您要找出在文档中所有被影响的数据,
并在类CMyAction中增加相应的函数或者变量, 一般情况下您需要同时增加能够备份老数据的相应变量.
函数Execute()以及GetUndoAction和GetRedoAction必须得到覆盖,
在Execute中您需要决定如何备份老的数据并将新的数据得到改变, 而在GetUndoAction中,
您需要得到此命令的逆反命令的创建. 而GetRedoAction则需要对当前的命令进行适当的备份. 当一个命令得到执行后,
其命令将自动进入相关的堆栈中得到管理.
下面是Form++命令类的继承关系图:
命令列表:
命令类名称
|
描 述
|
CFOBaseAction |
这个类是Form++ 命令类的基类,它监视在模板中执行的命令。它也监视一
系列的CFODrawComponent类。
每个命令对象有一个与之相联系的ID,这样在
没有用户运行时类型信息的情况下,代码就可以区分出不同的命令。 |
CFOAddCompAction |
这是从CFOAction派生的类,它表示添加一个组件。当你执行这个命令时,就可以向模板添加一个组件。
当你撤消该动作时,就会建立一个 CFORemoveCompAction类,并且执行它。
|
CFOAddCompsAction |
这是从CFOAction派生的类,它表示添加多个组件。当你执行这个命令时,
就可以向模板添加多个组件。当你撤消该动作时,就会建立一个CFORemoveCompsAction类,并且执行它。 |
CFOAlignAction |
这是从CFOActionMarco派生的类。它表示对齐组件。在模板中对齐组件的时候将会被调用。有六种对齐方式:
顶端、中间、底部、左、中、右。对齐命令包含很多其他命令。每个组件都有移动命令,以便把组件 放置在合适的位置。
当命令撤消时,将使用相反的命令。 |
CFOColorChangeAction |
改变被选中的组件的背景色和文本色。 |
CFOFormColorChangeAction |
改变当前表格的背景色和文本色。 |
CFOFormSizeAndNameAction |
改变当前表格的名称和大小。 |
CFOFormSizeAction |
改变表格大小。 |
CFOMoveCompAction |
移动一个组件。此类在移动一个组件、改变一个组件的位置时调用。撤消操作用CFOMoveCompAction
。 |
CFOMoveCompsAction |
这是从CFOAction派生的类,它表示移动多个组件。此类在移动多组件、改变它们的位置时调用。 撤消操作
用CFOMoveCompsAction
。 |
CFOOrderAction |
是从CFOActionMarco派生的类。它表示对多个组件进行叠放。当选择了多个组件并且要对它们进行层次叠放的时候将会被调用。
此命令改变多个组件的 z-顺序。你可以将组件后移一个、前移一个、移到最后、移到最前。原来组件的顺序被保存下来存放到堆栈中。
当你撤消动作时,原来的顺序从堆栈中取出按原有顺序排列组件。 |
CFOOrderSingleAction |
移动担单个组件的顺序。 |
CFORemoveCompAction |
删除单个组件。此类在只有删除单个组件时被调用。当撤消操作时,CFOAddCompAction
被调用。 |
CFORemoveCompsAction |
删除多个组件。此类在选择了多个组件、并将它们删除时被调用。撤消操作时,CFOAddComps被调用。 |
CFOScaleAction |
对模板进行比例缩放。 |
CFOSizeAction |
表示改变多个组件的大小。当选择了多个组件并且要改变它们的大小时将会被调用。可以选择改变高、宽或者高和宽。 |
CFOSpacingAction |
改变多个组件之间的间距。当选择了多个组件并且要改变它们之间的间距的时候将会被调用。 |
|