UCanCode Software

 

产品与方案▼  免费下载  价格与购买▼  技术支持  客户列表  操作视频▼

 

UCanCode.com一起释放Visual C++的巨大能量!
 


028-85354645

VX++跨平台工业C++源码库
100%C++, QT, JAVA源码
 产品特点 
  跨平台工控组态源码
  嵌入式Linux组态源码
  跨平台建模仿真源码
E-Form++可视化图形源码库企业版本
100%C++, VB, C#源码
 产品特点 
  HMI &SCADA源码
 PLC组态编程源码
 CAD设计控件源码
 HMI 报表源码
GIS制图源码
电力系统源码
条码账单源码
工作流程源码
煤炭行业源码
仪器仪表源码
报表打印源码
图形建模源码
电子表单源码
Visio制图源码
工业控制源码
BPM业务流程源码
工业监控源码
流程图控制流源码
组织关系图源码
图形编辑器源码
 Win CE组态源码
UML编辑器源码
地图演示源码
建筑平面制图源码
 关于UCanCode
  组件要素

[下一页]


更详细的关于Form++产品的技术细节,请查看下面的列表:

  在Form++中,组件就是具有特定大小和形状的并且能够在画布上完成自己绘制的所有对象,例如Form++提供的直线、曲线、椭圆、矩形、文本等都是组件的一些范例。在Form++中组件又被切分成数据和显示两个部分,我们将所有的数据操作都放置在组件的属性中,而将其他的如显示、旋转、移动等操作函数放置在组件本身。这样,您可以在任何时候独立的为组件定义新的数据(属性)或者为组件定义新的操作。

描述

E-Form++可视化图形源码组件库图形定义了最基本的图形对象: 一个二维的矩形区域中放置的几何形状(调用GetBoundRect可以获取刷新的区域) 以及一些常用的属性: Visible, Printable, Selectable, Movable, Copyable, Resizable, Reshapable, Deletable, Editable, Shadowed等等.

最简单的思考E-Form++可视化图形源码组件库图形的方法就是一个知道如何在画布中绘制自己的矩形区域, E-Form++图形提供了一个虚函数 virtual OnDraw (OnDraw3d 或者 OnDrawFlat)来专门处理图形的外观的绘制

E-Form++可视化图形源码组件库图形能够相应视图提供的事件, 并支持在收到Undo/Redo消息后作出相应的处理

E-Form++可视化图形源码组件库图形包含如下三个方面的细节:

· 几何图形, 例如: ectangles, ellipses, diamonds, strokes 每个E-Form++可视化图形源码组件库图形均定义了专门用于其绘制的画笔和画刷. 这些画笔和画刷资源得到统一的管理和分配.

· 文本,  E-Form++图形基本都支持文本的所见即所得的编辑, 并支持文本的自动换行功能, 专门定义并统一管理的自体用来完成文本的绘制.

· 图像, E-Form++图形支持 bitmaps, JPEGs GIFs等大量的图像文件显示, 并支持GIF89a的直接播放

CFODrawShape是图形的核心基类, 90%以上的函数集中在此类中.

位置

每个CFODrawShape对象都有大小和位置, 并且能够根据画布的圆点位置得到自动的计算, 下面是位置的获取函数:

// Get center point.
CPoint GetCenterPoint() const;

// Get the origin of this shape
CPoint GetTopLeft() const;

// Get the upper,right point of the shape
CPoint GetTopRight() const;

// Get the lower,left point of the shape
CPoint GetBottomLeft() const;

// Get the lower, right point of the shape
CPoint GetBottomRight() const;

// Get the width of the shape.
int GetWidth() const { return abs(m_rectPosition.right - m_rectPosition.left); }

// Get the height of the shape.
int GetHeight() const { return abs(m_rectPosition.bottom - m_rectPosition.top); }

关键点:

1 CFODrawShape

CFODrawShapeE-Form++所有图形类的基类,定义了Form++对图形的操作和属性管理等方面的绝大多数函数, 例如: 几何变化\属性更改\数据的保存和处理\图形GDI设备的管理和处理等等, 每一个Form++图形都有一个唯一的名称. 而每一类型的Form++图形有一个唯一的图形类型值ID值.

CFODrawShape 是从类 FOIUnknown派生的

2 图形名称

每个图形都有一个唯一的名称用以区别画布中的其他图形, 大多数情况下, 您可以通过GetObjectName() SetObjectName(..)来获取或者改变图形的名称, 当然唯一的名称的计算是需要额外的计算机开销的, 您可以通过调用下面的函数来打开或者关闭这个功能(此函数定义在CFODataModel):

// Show with unique name and caption.
void EnableUniqueName(const BOOL &bUniqueName);

3 类型

图形类型用来为一标示图形的类别. 此类型用来标示主要的图形.例如, 按钮图形的ID值是FO_COMP_BUTTON, 您可以通过调用GetType()或者SetType()函数来获取或者设定新的图形类型, 在类型值FO_COMP_CUSTOM之前的值是UCanCode Software保留给系统本身使用的, 您创建的新的自定义图形的ID值必须比这个值大一些, 例如:
#define       MY_SHAPE_ID                 FO_COMP_CUSTOM + 101

4 标题

每个图形均有一个标题文本. 缺省情况下, 标题同名称是一样的, 您可以通过调用GetObjectCaption()SetObjectCaption()来设定或者修改图形的标题

5 名称

Every Shape has a specify name. By default,  the name is only define for its own and different with other Shapes. You can set the name through the Shape's SetObjectName() method.Call the datamodel's GetUniqueName() to get the unique name.

6 图形属性

每个组件可以没有或有多个属性与之相联系。借助属性可以设定组件的外观和组件的行为。用指向对象属性值的指针构成的链表来存储属性值,属性类是从CFOBaseProperties类派生的。下面一系列函数专门定义为属性值的处理:

开发人员可以根据需要为图形类增加自定义属性.

下面的定义在文件FODrawShape.h的代码显示了如何控制图形的属性:

public:

//Clear All Properties
virtual void ClearAllProp();

// Get the list of all properties.
CFOBasePropertiesList *GetPropList();

// Add a new property
virtual BOOL AddNewProperty(CFOBaseProperties& prop);

// Add a new property
virtual BOOL AddNewPropertyPtr(CFOBaseProperties* pProp);

// Get total property.
virtual int GetPropCount();

// Remove a property with a specify id.
// nId -- the property id value.
virtual BOOL RemoveProperty(const int nId);

// Find a property with a specify id.
// nId -- the property id value.
virtual CFOBaseProperties* FindProperty(int nId) const;

// Return the default property.
CFOCompProperties *GetDefaultProperty() const;

// Put value.
virtual BOOL PutPropValue(const int &nPropId,const FO_VALUE &Value);

// Get value.
virtual BOOL GetPropValue(FO_VALUE &Value,const int &nPropId);
 

7 控制点

缺省情况下,每个Form++图形有9个控制点,这9个控制点环绕在图形的四周:在四个顶角分别一个,另外四个分别位于每边的中心位置,最后一个位于图形的中心。对于多变形图形, 在每个几何顶点分别有一个控制点, 以便用来调整图形的几何图形.

创建和设定图形顶点和控制点(定义在文件FODrawShape.h):

// Get the spots count.
int GetSpotCount() const;

// Get the spots pointer.
virtual LPPOINT GetPoints() const;

// Get the spots.
virtual void GetPoints(CArray<CPoint,CPoint>& arPoint) const;

// Set spots.
virtual void SetPoints(LPPOINT lpPoints, const int nCount);

// Set spots.
virtual void SetPoints(const CArray<CPoint,CPoint>& arPoint);

// Get spot at a specify position.
virtual CPoint GetPointAt(int nIndex) const;

// Set spot at a specify position.
virtual void SetPointAt(int nIndex, CPoint& point);


/////////////////////////////////////////////////
// Add a new spot at the end.
virtual BOOL AddPoint(CPoint& point);

// Add multi points.
virtual BOOL AddPoints(LPPOINT lpInsertPoints, const int nInsertCount);

// Add multi points.
virtual BOOL AddPoints(const CArray<CPoint,CPoint>& arPoint);


//////////////////////////////////////////////////
// Insert a new spot.
virtual BOOL InsertPoint(int nIndex, CPoint& point);

// Insert multi points.
virtual BOOL InsertPoints(int nIndex,LPPOINT lpInsertPoints, const int nInsertCount);

// Insert multi points.
virtual BOOL InsertPoints(int nIndex,const CArray<CPoint,CPoint>& arPoint);

// Delete a specify spot.
virtual BOOL DeletePoint(int nIndex);
 

8 拖拉手柄

每个拖拉手柄在最终用户选中一个图形的时候出现, 这些手柄允许最终用户在缩放或者移动图形边界或者图形的顶点. 手柄的形状以及数目可以根据用户的需要覆盖相应的虚函数来增加或者删除.

在多数情况下, 每个图形的包围矩形的四周有8个拖拉手柄.如下图:

9 用户数据

每个图形均有一个CObject的指针用来设定关联数据, 这个关联数据可以是任何DWORD指针或者对象. 缺省情况下, 这个指针是NULL, 设计此指针的目的是允许开发人员来将任何其他数据同图形进行关联. 注意: 此关联数据的指针必须是一个从CObject派生的指针, 并且支持MFC序列化.

设置或者获取设置的数据, 可以直接调用GetItemData() 或者SetItemData(..).

10 区域

每个组件都可以根据需要定义了一定的逻辑填充空间,我们将此空间叫做区域。组件的区域和子区域是紧密联系的。区域是用来判断单击组件和屏幕刷新的。组件的绑定矩形是根据这个区域对象计算出来的。

// Generate Shape Area
virtual void GeometryUpdated(CFOArea* pArea);
 

11 刷新图形

下面的函数被用来刷新图形:

// Invalidates the whole parent wnd's client area.
virtual void Invalidate(BOOL bRedraw = FALSE);

// Update the given rectangle.
virtual void InvalRect(CRect rcPos);

// Update the whole control.
virtual void UpdateControl();

12 图形的矩形区域

通过调用函数CRect GetBoundRect(), 您可以获取一个图形的包围矩形, 此方法获取的区域较大, 主要用来刷新, 不可以用来按此区域进行图形绘制. 方法CRect GetSnapRect()用来获取包围图形所在的几何区域的最精确的区域大小. 通常GetBoundRect获得的矩形大小要大于GetSnapRect获得的矩形大小. 函数 CRect GetDrawRect()返回绘制的图形实际包围矩形大小,可用于绘制.

13 图形的文本对齐格式

下面的函数用于设定文本的对齐格式:

// Define for text.
// Get Text Horizon Alignment
// The alignment of text is one of the following value:
// enum TextHorzAlign 
//{
// TextLeft=0, // Left
// TextMiddle, // Center
// TextRight // Right
//};
UINT GetTextHorzAlignment() const;

// Set Text Horizon Alignment.
// nT -- It must be one of the following value:
// enum TextHorzAlign 
//{
// TextLeft=0, // Left
// TextMiddle, // Center
// TextRight // Right
//};
void SetTextHorzAlignment(const UINT &nT);

// Get Text Vertical Alignment
// The text vert alignment returns one of the following value:
// enum TextVertAlign 
//{
// TextTop = 0, // Top 
// TextCenter, // Center
// TextBottom // Bottom
//}; 
UINT GetTextVertAlignment() const;

// Set Text Vertical Alignment,for how to change text vert alignment,please see Text Properties Dialog.
// nT -- It must be one of the following value:
// enum TextVertAlign 
//{
// TextTop = 0, // Top 
// TextCenter, // Center
// TextBottom // Bottom
//}; 
void SetTextVertAlignment(const UINT &nT);

14 改变文本为多行输入和绘制

下面的函数用于设定文本是否多行显示:

// Is It MultiLine,if the text is multiple lines,return TRUE,else returns FALSE.
BOOL IsMultiLine() const;

// Set MultiLine,you can call this method to change the text of CFOTextShape's label to multiple lines.
void SetMultiLine(const BOOL &bMulti);
 

15 显示或者隐藏图形

下面的函数用于显示或者隐藏图形:

// Is It Visible
BOOL IsVisible() const;

// Set Visible,change the visible of the shape.
void SetVisible(const BOOL &bV);
 

16 获取图形的图层ID

下面的方法用于获取图形的图层ID:

// Obtain the layer ID of the shape.
virtual FOPLayerID GetLayer() const;

// Change the layer ID of the shape.
virtual void SetLayer(FOPLayerID nLayer);
 

17 直线的画笔

通过下面的函数可以获取或者设定图形的画笔宽度、画笔颜色、以及画笔的风格:

// Get Line Width.
int GetLineWidth() const;

// Change the line with.
void SetLineWidth(const int &nWidth);

// Get Line Color
COLORREF GetLineColor() const;

// Change the Line Color
void SetLineColor(const COLORREF &crColor);

// Is It Null Pen
BOOL IsNullPen() const;

// Set Null Pen,with null pen,the pen width is 0.
void SetNullPen(const BOOL &bNull);

// Get Pen Style,return with PS_SOLID,PS_DOT...etc.
int GetPenStyle() const;

// Change the Pen Style.
// nPenStyle -- must be the PS_SOLID,PT_DOT...etc.
void SetPenStyle(const int &nPenStyle);
 

18 图形的字体

通过下面的方法可以获取或者改变图形的字体名称、字体大小以及其他图形的字体信息:

// Get font Face Name
CString GetFaceName() const;

// Change the font Face Name,
// lpszFaceName -- standard font face name.
void SetFaceName(LPCTSTR lpszFaceName);

// Get Point Size of the font.
int GetPointSize() const;

// Change font Point Size
void SetPointSize(const int &nPointSize, CDC* pDC = NULL);

// Get Height of the font.
int GetHeight() const;

// Change the font Height.
void SetHeight(const int &nHeight, CDC* pDC = NULL);

// Get Font Color
COLORREF GetFontColor() const;

// Change the Font Color
void SetFontColor(const COLORREF &crColor);

// Get Weight
int GetWeight() const;

// Change the font Weight,
// nWeight -- 700 is Bold,500 is Normal and must be nWeight >= 0 && nWeight <= 1000
void SetWeight(const int &nWeight);

// Is It Italic
BOOL GetItalic() const;

// Change the font italic property.
void SetItalic(const BOOL &bItalic);

// Is It Underline
BOOL GetUnderline() const;

// Change the font underline property.
void SetUnderline(const BOOL &bUnderline);

// Is It Strikeout
BOOL GetStrikeout() const;

// Change the font strikeout property.
void SetStrikeout(const BOOL &bStrikeout);
 

19 图形的填充颜色和填充模式

下面方法可以用来获取或者改变图形的填充颜色\是否透明\画刷的类型等等:

// Define for brush.
// Get Background Color
COLORREF GetBkColor() const;

// Change the back color,this is used by fill brush,the brush type must be 1,
// if the brush type is within 3 - 41,it is used for fill hatch back color.
void SetBkColor(const COLORREF &crBkColor);

// Is It Transparent
BOOL GetTransparent() const;

// Change to transparent fill mode.
void SetTransparent(const BOOL &bTransparent);

// Get BrushStyle
// 0 -- Null brush.
// 1 -- fill with back color.
// 2 -- fill with pattern color.
// 3-41 -- fill with hatch pattern.
// 42 - 61 Fill with gradient mode.
// 62- 91 Fill with pattern bitmap.
int GetBrushType() const;

// Change fill brush type.
// 0 -- Null brush.
// 1 -- fill with back color.
// 2 -- fill with pattern color.
// 3-41 -- fill with hatch pattern.
// 42 - 61 Fill with gradient mode.
// 62- 91 Fill with pattern bitmap.
void SetBrushType(const int &nType);

// Get Brush Hatch
int GetBrushHatch() const;

// Change Brush Hatch type,must be HS_
void SetBrushHatch(const int &nHatch);

// get brush pattern Color.
COLORREF GetPatternColor() const;

// Change the brush pattern Color,if the brush type is 2,shape use this color to fill.
// If it is 3 - 41,this is the hatch pattern color.
void SetPatternColor(const COLORREF &cr);
 

20 图形的倒影的填充颜色\填充画笔类型等

通过下面的函数可以用来获取或者修改图形的倒影的填充颜色\填充画刷的类型\倒影的大小等等:

// Define for shadow.
// Get shadow color
COLORREF GetShadowColor() const;

// Change the shadow color,this is used by shadow brush,the shadow brush type must be 1.
void SetShadowColor(const COLORREF &crColor);

// Get shadow pattern color.
COLORREF GetShadowPatternColor() const;

// Set shadow pattern color,change the shadow pattern color,this is used by shdow pattern color,the shadow brush type
// must be 2.
void SetShadowPatternColor(const COLORREF &crColor);

// Get shadow offset x.
int GetShadowOffsetX() const;

// Change Shadow offset x,
// offset -- The offset value of x,it can > 0 or < 0.
void SetShadowOffsetX(const int &offset);

// Get shadow offset y.
int GetShadowOffsetY() const;

// Change Shadow offset y,
// offset -- The offset value of y,it can > 0 or < 0.
void SetShadowOffsetY(const int &offset);

// Get shadow brush type,it is a value from 0 - 91,
// 0 -- Null brush.
// 1 -- fill with shadow color.
// 2 -- fill with shadow pattern color.
// 3-41 -- fill with hatch pattern.
// 42 - 61 Fill with gradient mode.
// 62- 91 Fill with pattern bitmap.
UINT GetShadowBrushType() const;

// Change shadow brush type,
// 0 -- Null brush.
// 1 -- fill with shadow color.
// 2 -- fill with shadow pattern color.
// 3-41 -- fill with hatch pattern.
// 42 - 61 Fill with gradient mode.
// 62- 91 Fill with pattern bitmap.
void SetShadowBrushType(const UINT &nType);

// Get shadow brush hatch.
int GetShadowBrushHatch() const;

// Change the shadow brush hatch.
void SetShadowBrushHatch(const int &nHatch);

// If shadow is visible,return true,else return false.
BOOL GetShadow() const;

// Change the shadow visible property,true for showing,false for hide
void SetShadow(const BOOL &bHas);
 

21 图形的项目符号

通过下面的函数可以改变或者获取图形的项目符号:

// Get bulleted color.
COLORREF GetBulletedColor() const;

// Change the bulleted color.
void SetBulletedColor(const COLORREF &crColor);

// Get bulleted type,it will return one of the following value:
// enum FO_BULLETS_TYPE
// {
// FO_BULLET_NULL = 0,
// FO_BULLET_MAX_ELLIPSE,
// FO_BULLET_FILL_RECTANGLE,
// FO_BULLET_RHOMBUS,
// FO_BULLET_EMPTY_RECTANGLE,
// FO_BULLET_ARROW,
// FO_BULLET_MIN_CIRCLE,
// FO_BULLET_PLUM 
// };
int GetBulletedType() const;

// Change bulleted type,
// nType -- It must be one of the following value:
// enum FO_BULLETS_TYPE
// {
// FO_BULLET_NULL = 0,
// FO_BULLET_MAX_ELLIPSE,
// FO_BULLET_FILL_RECTANGLE,
// FO_BULLET_RHOMBUS,
// FO_BULLET_EMPTY_RECTANGLE,
// FO_BULLET_ARROW,
// FO_BULLET_MIN_CIRCLE,
// FO_BULLET_PLUM 
// };
void SetBulletedType(const int &nType);

22 停靠点

下面的函数定义在类CFODrawPortsShape, 用于获取或者修改图形的停靠点属性:

// Get port width,default is 8
int GetPortWidth() const; 

// Get port height,default is 8
int GetPortHeight() const;

// Change port width,it must be > 0 value.
void SetPortWidth(const int& nWidth);

// Change the port height,it must be > 0 value.
void SetPortHeight(const int& nHeight);

// Port shape type,returns one of the following value:
// enum FO_PORT_TYPE
// {
// FO_PORT_RECT = 0,
// FO_PORT_ELLIPSE,
// FO_PORT_DIAMOND
// };
int GetPortType() const;

// Change Port shape type,
// nType -- it must be one of the following value:
// enum FO_PORT_TYPE
// {
// FO_PORT_RECT = 0,
// FO_PORT_ELLIPSE,
// FO_PORT_DIAMOND
// };
void SetPortType(const int& nType);

// Show port.
void ShowPort(const BOOL &bShow) { m_bShowPorts = bShow; }

// Is show port.
BOOL IsPortShow() const { return m_bShowPorts; }
 

23 保护属性函数

下面的函数用于设定图形的保护属性:

// Is It Lock,when the shape is locked,you can not moving,sizing,rotating and mirror.
BOOL IsLock() const;

// Lock Componet,change the lock mode of the shape.when it is lock mode,you can not moving,sizing and rotating.
void LockComp(const BOOL &bL);


///////////////////////////////////////
// Lock width and height,if it is true,you cann't resize it on the canvas.
void SetResizeProtect(const BOOL &bLock);

// Is width and height locked.
BOOL IsResizeProtect() const;


////////////////////////////////////////
// Is select protect,if it is true,you cann't select it on the canvas.
BOOL IsSelectProtect() const;

// Set select protect.
void SetSelectProtect(const BOOL &bAllow);


///////////////////////////////////////
// Is moving protect,if it is true,you cann't moving it.
BOOL IsMoveProtect() const;

// Set moving protect,if it is true,you cann't moving it.
void SetMoveProtect(const BOOL &bProt);


//////////////////////////////////////
// Is rotating protect,if it is true,you cann't rotating it.
BOOL IsRotateProtect() const;

// Set rotating protect,if it is true,you cann't rotating it.
void SetRotateProtect(const BOOL &bProt);


//////////////////////////////////////
// Is printing protect,if it is true,you cann't printing it.
BOOL IsPrintProtect() const;

// Set printing protect,if it is true,you cann't printing it.
void SetPrintProtect(const BOOL &bProt);


//////////////////////////////////////
// Is copying protect,if it is true,you can not copying it.
BOOL IsCopyProtect() const;

// Set copying protect,if it is true,you can not copying it.
void SetCopyProtect(const BOOL &bProt);


//////////////////////////////////////
// Is deleting protect,if it is true,you can not deleting the shape.
BOOL IsDeleteProtect() const;

// Set deleting protect,if it is true,you can not deleting the shape.
void SetDeleteProtect(const BOOL &bProt);


//////////////////////////////////////
// Is aspect ratio,if it is true,the shape will be resize with aspect ratio mode.
BOOL IsAspectRatio() const;

// Set aspect ratio,if it is true,the shape will be resize with aspect ratio mode.
void SetAspectRatio(const BOOL &bProt);


24 事件处理

下面的函数用于设定或者获取图形的事件处理属性:

// Event type.
// Get event type,it returns a value from 0 - 5,
// 0 -- None event.
// 1 -- Send email event.
// 2 -- Open URL
// 3 -- Execute a file.
// 4 -- Execute an application.
int GetEventType() const;

// Chagne the event type,
// nEvent -- it must be one of the value from 0 - 5
// 0 -- None event.
// 1 -- Send email event.
// 2 -- Open URL
// 3 -- Execute a file.
// 4 -- Execute an application.
void SetEventType(const int &nEvent);

// Get cursor type.
int GetCursorType() const;

// Change the cursor type,
// nType -- the Resource ID of the cursor.
void SetCursorType(const int &nType);

// Get event string.
// It returns one of the following string:
// Evnet type 0 -- Null string
// Evnet type 1 -- email address,like: mailto:support@ucancode.net.
// Evnet type 2 -- URL address,like:http://www.ucancode.net
// Evnet type 3 -- File name,like:c:\\1.txt.
// Evnet type 4 -- Application name,like: c:\\visioapp.exe.
CString GetEventString() const;

// Set event string.
// str -- It must be one of the following string:
// Evnet type 0 -- Null string
// Evnet type 1 -- email address,like: mailto:support@ucancode.net.
// Evnet type 2 -- URL address,like:http://www.ucancode.net
// Evnet type 3 -- File name,like:c:\\1.txt.
// Evnet type 4 -- Application name,like: c:\\visioapp.exe.
void SetEventString(const CString &str);
 

25 箭头属性

箭头出现在直线或者曲线的端点, 下面的函数用于设定箭头的类型和箭头宽度长度等:

// Arrow type
// Get start arrow type,if it returns 0,this is none arrow.
// else it maybe 1 - 39 value.See line property dialog for how arrow looks like.
int GetStartArrowType() const;

// Change the start Arrow type,
// nType -- if none arrow,it is 0,else it maybe 1 - 39 value.See line property dialog for how arrow looks like.
void SetStartArrowType(const int &nType);

// Get End arrow type,if it returns 0,this is none arrow.
// else it maybe 1 - 39 value.See line property dialog for how arrow looks like.
int GetEndArrowType() const;

// Change end Arrow type,
// nType -- if none arrow,it is 0,else it maybe 1 - 39 value.See line property dialog for how arrow looks like.
void SetEndArrowType(const int &nType);

// Get start arrow Width.
int GetStartArrowWidth() const;

// Change start Arrow width,it must be > 0
void SetStartArrowWidth(const int &nWidth);

// Get End arrow Width.
int GetEndArrowWidth() const;

// Change end Arrow Width,it must be > 0
void SetEndArrowWidth(const int &nWidth);


// Get start arrow Length.
int GetStartArrowLength() const;

// Change start Arrow length,it must be > 0
void SetStartArrowLength(const int &nLength);

// Get End arrow Length.
int GetEndArrowLength() const;

// Change End Arrow Length,it must be > 0
void SetEndArrowLength(const int &nLength);
 

26创建自定义箭头类型

覆盖下面的两个函数,您可以创建新的自定义箭头类型:

// Build current line end object.
virtual void BuildLineEndObject(int &nType) { nType; }

// Build current line start object.
virtual void BuildLineStartObject(int &nType) { nType; }
 

27 缩放图形

通过下面的函数, 可以用来缩放图形(横纵比):

// Scale shape.
// fX -- x scale of shape.
// fY -- y scale of shape.
// fOX -- x orgin of shape.
// fOY -- y orgin of shape.
virtual void ScaleShape(double dX, double dY, double dOX, double dOY);

// Scales the shape about its center to the size specified. 
// szSize -- new size of shape.
// nControl -- control handle of shape.
virtual void ScaleShape(CSize& szSize, FO_CONTROL_HANDLE nControl);
 

28 旋转图形

通过下面的函数可以用来旋转图形:

// Rotate shape.
// nAngle -- rotate angle(0-360).
// fOX -- x orgin of shape.
// fOY -- y orgin of shape.
virtual void RotateShape(int nAngle, double dOX, double dOY);
 

29 移动图形

通过下面的函数可以移动图形:

// Offset all points.
// ptOffset -- offset value.
virtual void OffsetAllPoints(CPoint ptOffset);
 

30 将图形定位到固定的区域

通过下面的函数可以将图形缩放并移动到固定的区域中:

// Position shape.
// rcNewPos -- new position of shape.
virtual void PositionShape(const CRect &rcNewPos);
 

31 通过两点构成的中间线镜像图形

通过下面的函数可以将图形按照两点构成的中间线来进行镜像处理:

// Mirror with point ref1 and ref2.
virtual void Mirror(const CPoint& rRef1, const CPoint& rRef2);
 

32 创建自定义属性

下面的函数用来处理图形的属性, Form++图形中, 每个图形均有一个属性列表:

//Clear All Properties
virtual void ClearAllProp();

// Get the list of all properties.
CFOBasePropertiesList *GetPropList();

// Add a new property
virtual BOOL AddNewProperty(CFOBaseProperties& prop);

// Add a new property,do not call delete for pProp,it delete by itself.
virtual BOOL AddNewPropertyPtr(CFOBaseProperties* pProp);

// Get total property.
virtual int GetPropCount();

// Remove a property with a specify id.
// nId -- the property id value.
virtual BOOL RemoveProperty(const int nId);

// Remove a property with a specify pointer.
// pProp -- the property to remove.
virtual BOOL RemoveProperty(CFOBaseProperties* pProp);

// Find a property with a specify id.
// nId -- the property id value.
virtual CFOBaseProperties* FindProperty(int nId) const;
 

33 绘制

下面的虚函数, 用于绘制图形, 一般情况下, 如果您的图形在平面和3d模式下面效果一直, 则只需将OnDrawFlatOnDraw3d代码设置为一致即可:

// Draws tracker state.
virtual void OnDrawTrackCustom(CDC *pDC);

// Draws shadow of shape.
virtual void OnDrawShadow(CDC *pDC);

// Draws the flat status of the shape.
virtual void OnDrawFlat(CDC *pDC);

// Draws the 3d status of the shape.
virtual void OnDraw3d(CDC *pDC);
 

34 控制点

下面的函数用于设定图形的拖拉控制点:

// Get the sport point of control by drag handle,calc the normal 8 control handles.
// mpSpot -- result control handle list
virtual void GetNormalSpotLocation(CFOPHandleList& lstHandle);

// Get the plus spots of the control handles,override this method to calc the new position of the handle.
// mpSpot -- result of the spot.
virtual void GetPlusSpotLocation(CFOPHandleList& lstHandle);

// Get the sport point of control by edit point,override this method to calc your own new control handle.
// mpSpot -- control handles list.
virtual void GetPointSpotLocation(CFOPHandleList& lstHandle);

// Get rotate handle location,override this method to calc the new rotating control handle.
// ptHandle -- result rotating control handle.
virtual BOOL GetRotateSpotLocation(CPoint &ptHandle);
 

如果你希望改变图形的控制点的数目, 可以根据需要来覆盖上面的一些函数, 例如, 您只需要显示两个控制点, 可调用如下代码来实现:



// Get default move handle position.
void CMyCorsssLineShape::GetNormalSpotLocation(CFOPHandleList& lstHandle)
{
   FOPRect rR = GetSnapRect();
   lstHandle.AddHandle(new CFOPHandle(rR.RightCenter(), SPOT_RIGHT ));
   lstHandle.AddHandle(new CFOPHandle(rR.LeftCenter(), SPOT_LEFT ));

}

Also see sample CustomMSample
 

35 性能提示

   当您需要将数百个乃至上千个图形同时放入画布时候, 性能是一个大问题, 然而, 当面对这样的问题的时候, 开发人员必须对性能问题采取最高的重视.当您需要将一个复杂的组合图形增加到画布的时候, 要注意一定要尽可能的保持此组合图形的简单性, 不要将不用的繁杂的东西放进去. 在图形还没有构造完毕前, 直接放进去会对性能有损害. 在放任何图形到画布的时候, 将图形在画布中需要刷新的区域始终保持最小, 不要对不需要刷新的区域进行无谓的重新绘制i. 如果您的图形添加到画布中不需要支持Undo/Redo, 就不要调用支持Undo/Redo的函数, 例如:InsertShape (定义在CFODataModel), 而只需要调用GetShapes()->AddTail就够了.如果您需要修改图形的同一几何内容, 

例如移动图形, 最好是一次性完成,而不要将能够一次性完成的内容,分成几次来做。 

例如您需要将图形移动5050位置, 下面的调用方式就不好:DoMoveAction(20,20);
DoMoveAction(30,30);


虽然这也可以让您得到正确的结果, 但这需要两次对画布进行刷新, 刷新次数越少越好.在我们使用复合图形的时候, 如果我们并不需要使用自图形本身提供的停靠点, 最好的方式就是我们直接删除掉, 而不是将其隐藏掉(注意: Form++中每个停靠点将占用同任何单个图形一样的内存开销)

提高效率的另外一个方面就是尽可能的皮棉无谓的调用Invalidate函数来简单的处理任何刷新, 最好的方法是: 任何时候都调用InvalidateRect来刷新, 并给一个最小的刷新区域.

支持Undo/Redo将显著的减慢图形的编辑能力, 因为undo manager必须时刻监听Data Model事件并购造编辑处理事务.?
这些Undo编辑操作会占用很多内存, 具体多少, 完全根据您的应用程序设计来决定

所以, 加入您希望移动一个图形而不需要支持Undo/Redo操作, 直接调用OffsetAllPoints来进行, 不要简单调用DoMoveAction了事.如果您希望减少Undo/Redo的内存的使用量, 可以通过调用E-Form++Undo Manager中的事务处理函数来进行: SetMaxUndoActionCount 或者 SetMaxRedoActionCount.?
 

E-Form++ 使用了一种类似于SkinGDI架构, 通过这种架构, 可以轻松定制Form++画布上所有基本图形的绘制外观, 例如通过覆盖CFOPVisualProxy类中的相应虚函数, 可以将所有GDI绘制的东西转换为GDI+绘制 :FOInit(RUNTIME_CLASS(CFOPGDIPlusProxy));

36. 什么是连接线图形?

连接线是直线或者曲线, 能够在两个或者多个图形之间创建连接关系. CFOLinkShape是从类CFODrawShape派生的. 当被连接的图形的位置或者几何形状发生改变的时候, 连接线会自动地发生变化. 如下图:

Fig 1. 

 

 

 

Fig 2.  

Fig 3. 

Fig.4. 

 

连接线的两端必须连接到停靠点上.

修改连接线的末端箭头

调用如下函数来修改或者设定连接线的末端箭头:

// Change the start Arrow type,
// nType -- if none arrow,it is 0,else it maybe 1 - 39 value.See line property dialog for how arrow looks like.
void SetStartArrowType(const int &nType);

// Change end Arrow type,
// nType -- if none arrow,it is 0,else it maybe 1 - 39 value.See line property dialog for how arrow looks like.
void SetEndArrowType(const int &nType);

If you want to add other customize arrow, please override the following virtual methods:

// Build current line end object.
virtual void BuildLineEndObject(int &nType) { nType; }

// Build current line start object.
virtual void BuildLineStartObject(int &nType) { nType; }

排布连接线:

如果希望自定义连接线的排布方式, 覆盖如下两个虚函数即可:

// Relayout points.
virtual BOOL RelayoutPoints();

// Relayout track state points
virtual BOOL RelayoutTrackPoints(const int &nIndexMoved = -1);
 

当前版本的Form++提供了以下组件,所有这些组件均只是Form++组件的一些范例,你可以用Form++ Library add-in创建自己的组件。


(Form++专业版本界面)

(E-Form++企业版本界面)

增加了近50个定制组件,如下所示:


(Form++专业版本界面)


(E-Form++企业版本界面)

下面是一部分组件类列表:

类名称

说明

CFOButtonShape

Button Shape.

CFOLineShape

Line Shape

CFOLinkShape

Link Shape

CFOBezierLineShape

Bezier Line Shape

                  

CFOCloseBezierShape Close Bezier Shape

CFORectShape

Rect Shape

CFOEllipseShape

Ellipse Shape

CFOGroupShape

Group Shape

CFOCalendarShape

Calendar Shape.

CFOCheckShape

CheckBox Shape.

CFOComboBoxShape

ComboBox Shape.

CFOEditBoxShape

EditBox Shape.

CFOEditWithButtonShape

EditBox with a select button Shape.

CFOFrameShape

Frame Window Shape.

CFOHorzScrollBarShape

Horizontal ScrollBar Shape.

CFOImageShape

Image Shape.

CFOListBoxShape

ListBox Shape.

CFOListCtrlShape

ListCtrl Shape.

CFOMarqueeShape

Marquee Shape.

CFOProgressCtrlShape

ProgressCtrl Shape.

CFORadioShape

RadioBox componnet.

CFORoundButtonShape

RoundButton Shape.

CFOSeparatorShape

Separator Shape.

CFOSliderShape

Slider componnet.

CFOSpinEditShape

EditBox with spinctrl Shape.

CFOStaticShape

Static Text Shape.

CFOStaticRectShape

Static rectangle Shape.

CFOTabShape

Tab Shape.

CFOVertScrollBarShape

Vertical scrollbar Shape.

 

[下一页]

[ 主页 | 产品 | 新闻 | 下载 | 购买 | 技术支持 | 与我们联系 ]



地址:中国.成都高新区永丰路24号附1号 (邮编:610041)电话: +86-28-85354645 
Copyright 1998-2023 UCanCode Software, ? 版权所有。
其他的产品和公司名称或注册的商标属于其各公司版权所有。

任何问题或者建议请与我们联系:webmaster@ucancode.com