为 UserControl 创建组合区域
Create combined Region for UserControl
我希望我的 UserControl 自动更新其区域 属性。我希望它是合并在一起的子控件区域的组合。
这是我目前的情况:
protected override void OnSizeChanged(EventArgs e)
{
base.OnSizeChanged(e);
Region region = new Region(new Rectangle(Point.Empty, Size.Empty));
foreach (Control control in Controls)
{
if (control.Region != null)
region.Union(control.Region);
else
region.Union(control.Bounds);
}
Region = region;
Invalidate();
}
问题是它不起作用:必须更改第 region.Union(control.Region);
行,因为区域不包含有关控件的左偏移和上偏移的信息。
我能做什么?
您可以选择 或 来选择实际上构成 Region
的 Rectangles
。您可以通过 GetRegionScans
获取它们。您可以在 .
中看到它们
或 使用 GraphicsPaths
您的 child 控件的 Regions
来自..
在这两种方法中,您都可以按位置移动控件的区域数据:通过偏移每个矩形或通过平移整个图形路径。
这里是第一种方法的代码示例:
if (control.Region != null)
{
Matrix matrix = new Matrix(); // default, unscaled screen-resolution matrix
var rex = control.Region.GetRegionScans(matrix); // get rectangles
foreach (var r in rex) // use each of them
{
r.Offset(control.Location); // move by the location offsets
region.Union(r);
}
else
{
region.Union(control.Bounds);
}
问题是随着'vertical'大小和复杂性的Region
形状..
其他方法是跟踪child控件的GraphicsPaths
。
假设 class PathControl
带有控件 属性
public GraphicsPath path { get; set; }
您可以将循环更改为:
foreach (Control control in Controls)
{
if (control is PathControl)
{
// use a clone, so the original path won't be changed!
GraphicsPath gp = (GraphicsPath)(control as PathControl).path.Clone();
Matrix matrix = new Matrix();
matrix.Translate(control.Left, control.Top);
gp.Transform(matrix); // here we move by the location offsets
region.Union(gp);
else
{
region.Union(control.Bounds);
}
}
我希望我的 UserControl 自动更新其区域 属性。我希望它是合并在一起的子控件区域的组合。
这是我目前的情况:
protected override void OnSizeChanged(EventArgs e)
{
base.OnSizeChanged(e);
Region region = new Region(new Rectangle(Point.Empty, Size.Empty));
foreach (Control control in Controls)
{
if (control.Region != null)
region.Union(control.Region);
else
region.Union(control.Bounds);
}
Region = region;
Invalidate();
}
问题是它不起作用:必须更改第 region.Union(control.Region);
行,因为区域不包含有关控件的左偏移和上偏移的信息。
我能做什么?
您可以选择 或 来选择实际上构成 Region
的 Rectangles
。您可以通过 GetRegionScans
获取它们。您可以在
或 使用 GraphicsPaths
您的 child 控件的 Regions
来自..
在这两种方法中,您都可以按位置移动控件的区域数据:通过偏移每个矩形或通过平移整个图形路径。
这里是第一种方法的代码示例:
if (control.Region != null)
{
Matrix matrix = new Matrix(); // default, unscaled screen-resolution matrix
var rex = control.Region.GetRegionScans(matrix); // get rectangles
foreach (var r in rex) // use each of them
{
r.Offset(control.Location); // move by the location offsets
region.Union(r);
}
else
{
region.Union(control.Bounds);
}
问题是随着'vertical'大小和复杂性的Region
形状..
其他方法是跟踪child控件的GraphicsPaths
。
假设 class PathControl
带有控件 属性
public GraphicsPath path { get; set; }
您可以将循环更改为:
foreach (Control control in Controls)
{
if (control is PathControl)
{
// use a clone, so the original path won't be changed!
GraphicsPath gp = (GraphicsPath)(control as PathControl).path.Clone();
Matrix matrix = new Matrix();
matrix.Translate(control.Left, control.Top);
gp.Transform(matrix); // here we move by the location offsets
region.Union(gp);
else
{
region.Union(control.Bounds);
}
}