程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 在WPF中自定義你的繪制(三)

在WPF中自定義你的繪制(三)

編輯:關於.NET

圖形合並

有時候我們需要將多個圖形合並成一個然後進行繪制,比如將一個圓形與一個矩形進行合並等. 在WPF的自定義繪制中,有三種方法可以做到,分別是(1)利用GeometryGroup對象;(2)利用CombinedGeometry對象;(3)使用Geometry.Combin()靜態方法。其中第一種方式是利用集合並可以向集合中添加任意多個元素,而後面兩種方式只能兩兩合並,但後面兩者的合並方式更靈活,可以是兩圖形的“交集”“並集”“差集”以及“異或”。

1 ,使用GeometryGroup對象進行圖形合並

參考以下代碼,我們合並了一個橢圓與一個矩形:

protected override void OnRender(DrawingContext dc)
    {
      base.OnRender(dc);

      //public sealed class GeometryGroup : Geometry
      EllipseGeometry ellipse = new EllipseGeometry(new Point(50, 50), 50, 20);
      RectangleGeometry rect = new RectangleGeometry(new Rect(50, 50, 50, 20), 5, 5);

      GeometryGroup group = new GeometryGroup();
      group.FillRule = FillRule.EvenOdd;
      group.Children.Add(ellipse);
      group.Children.Add(rect);

      dc.DrawGeometry(Brushes.LightBlue, new Pen(Brushes.Green, 2), group);
    }

效果圖如下:

我們只是簡單地將兩個圖形以相加的方式合並在了一起,注意到合並後的圖形中間部分出現一個镂空的無色區域,是由合並後的圖形的FillRull決定的,如果我們把group.FillRule = FillRule.EvenOdd;更改為 group.FillRule = FillRule.Nonzero;則填充效果將是如下這樣:

2, 使用CombinedGeometry對象進行圖形合並

參考以下代碼,我們合並了一個橢圓與一個矩形:

protected override void OnRender(DrawingContext dc)
    {
      base.OnRender(dc);

      //public sealed class CombinedGeometry : Geometry
      EllipseGeometry ellipse = new EllipseGeometry(new Point(50, 50), 50, 20);
      RectangleGeometry rect = new RectangleGeometry(new Rect(50, 50, 50, 20), 5, 5);

      CombinedGeometry combin = new CombinedGeometry(GeometryCombineMode.Xor, ellipse, rect);

      dc.DrawGeometry(Brushes.LightBlue, new Pen(Brushes.Green, 2), combin);
    }
注意到GeometryCombineMode枚舉,它有四個枚舉值,如果我們有A,B分別表示兩個圖形的話,那麼:

GeometryCombineMode.Exclude: 合並結果為A-B

GeometryCombineMode.Intersect: 合並結果為A與B的相交部分

GeometryCombineMode.Union: 合並結果為A+B

GeometryCombineMode.Xor: 合並結果為(A-B)+(B-A)

3, 使用Geometry.Combin()靜態方法進行圖形合並

Geometry.Combin()靜態方法與使用CombinedGeometry對象進行圖形合並差不多

protected override void OnRender(DrawingContext dc)
    {
      base.OnRender(dc);

      //Geometry.Combin()
      EllipseGeometry ellipse = new EllipseGeometry(new Point(50, 50), 50, 20);
      RectangleGeometry rect = new RectangleGeometry(new Rect(50, 50, 50, 20), 5, 5);

      PathGeometry combin = Geometry.Combine(ellipse, rect, GeometryCombineMode.Xor, null);

      dc.DrawGeometry(Brushes.LightBlue, new Pen(Brushes.Green, 2), combin);

    }

其中Geometry.Combin()靜態方法中有用於圖形變換的參數(旋轉,縮放等),如果不需要變換則填寫null

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved