为UserControl

时间:2017-07-29 17:04:56

标签: c# winforms region

我希望我的UserControl自动更新其Region属性。我希望它是儿童控件区域合并在一起的组合。

这是我到目前为止所做的:

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不包含有关控件左移和上移的信息。

我该怎么办?

1 个答案:

答案 0 :(得分:1)

您可以选择 选择实际构成Rectangles的{​​{1}}。您可以通过Region获取它们。您可以在this post中看到它们。

使用GetRegionScans您的子控件“GraphicsPaths来自...

在这两种方法中,您可以按控件的位置移动控件的区域数据:通过偏移每个矩形或翻译整个图形路径。

此处是第一种方法的代码示例:

Regions

问题在于,{{1>}形状的'垂直'尺寸复杂性会越来越慢......

其他方式是跟踪子控件的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); }

假设一个具有控制属性的类Region

GraphicsPaths

您可以将循环更改为:

PathControl