2017-07-29 11 views
2

自分のUserControlでRegionプロパティを自動的に更新します。私はそれが一緒にマージされた子コントロールの領域の組み合わせであることを望みます。ここで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);を変更する必要があります。

どうすればよいですか?

+0

はどのようにコントロールの領域を作成するのですか? GraphicsPathによって? 1つでか、または次第に? – TaW

+0

@Taw - はい、GraphicsPathを一度に使用します。それは問題ですか? – walruz

+0

これらのGraphicsPathをタグに格納して、連合に使用することができます。マトリックスでそれらを移動することができます。 – TaW

答えて

1

のいずれかが実際にRegionを構成します。あなたはGetRegionScansでそれらを得ることができます。 this postにそれらを見ることができます。

または使用のGraphicsPathsあなたの子コントロールのRegionsから発信..あなたがコントロールに移動することができます両方の方法で

は、その位置によって領域データを:いずれかの各矩形をオフセットすることによってか、全体graphicspathを翻訳することによって、 。ここ

は、第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を追跡することです。

あなたはこれに多分ループを変更することができます

public GraphicsPath path { get; set; } 

コントロールプロパティを持つクラスPathControlと仮定すると:

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); 
    } 
} 
関連する問題