C# GDI画图,自动识别画板空白区域并返回坐标
在工具箱双击画图工具,自动识别画板的空白区域返回坐标,流程引擎自动在空白区域画出图像。
C# 代码
C# 全选
/// <summary>
/// 获取流程设计器空白区域的x,y坐标
/// 源码来源:CSFramework.Workflow工作流引擎
/// </summary>
/// <param name="width">要绘制的图元宽度</param>
/// <param name="height">要绘制的图元高度</param>
/// <returns></returns>
public Point GetEmptyRegion(int width, int height)
{
const int FrameMargin = 50;
const int MarginLeft = 200;
const int MarginTop = 100;
const int offset = 3;//偏移量
Point point = new Point(MarginLeft, MarginTop);//默认返回的坐标位置
List<IDrawElement> elements = this.AllElements; //获取设计器所有图元
if (elements.Count == 0) return point;
RectangleF[] rect1Scans, rect2Scans;
Region region1, region2;
bool isIntersect = false;//表示是否相交
//通过两层循环设计器的宽度和高度,每次偏移3个像素生成检测区域。
for (int x = MarginLeft; x <= _BitmapBackground.Width - FrameMargin; x += offset)
{
for (int y = MarginTop; y <= _BitmapBackground.Height - FrameMargin; y += offset)
{
region1 = new Region(new Rectangle(x, y, width, height));
rect1Scans = region1.GetRegionScans(new Matrix());
isIntersect = false;
//循环现有节点
foreach (var obj in elements)
{
region2 = obj.Region;
rect2Scans = region2.GetRegionScans(new Matrix());
using (Region rgnIntersect = region1.Clone())
{
rgnIntersect.Intersect(region2);//求交集
//获取交集的切片
RectangleF[] rectIntersect = rgnIntersect.GetRegionScans(new Matrix());
//>0:表示区域有交集
if (rectIntersect.Length > 0)
{
isIntersect = true;
break;
}
}
}
//没有交集,返回坐标
if (isIntersect == false)
{
return new Point(x, y);
}
}
}
return point;
}
效果展示
红圈位置是流程设计器的空白区域。
自动获取空白区域并绘制图像。
源码来源
源码来源:CSFramework.Workflow工作流引擎
版权声明:本文为开发框架文库发布内容,转载请附上原文出处连接
csframework.workflow C/S框架网