zoukankan      html  css  js  c++  java
  • 在WPF中自定义你的绘制(三)

                                                 在WPF中自定义你的绘制(三)
                                                                      周银辉

    图形合并
    有时候我们需要将多个图形合并成一个然后进行绘制,比如将一个圆形与一个矩形进行合并等. 在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(5050), 5020);
                RectangleGeometry rect 
    = new RectangleGeometry(new Rect(50505020), 55);

                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);
            }
    效果图如下:
    customPaint_GeometryGroup1.png
    我们只是简单地将两个图形以相加的方式合并在了一起,注意到合并后的图形中间部分出现一个镂空的无色区域,是由合并后的图形的FillRull决定的,如果我们把group.FillRule = FillRule.EvenOdd;更改为 group.FillRule = FillRule.Nonzero;则填充效果将是如下这样:
    customPaint_GeometryGroup2.png


    2, 使用CombinedGeometry对象进行图形合并
    参考以下代码,我们合并了一个椭圆与一个矩形:
     protected override void OnRender(DrawingContext dc)
            
    {
                
    base.OnRender(dc);

                
    //public sealed class CombinedGeometry : Geometry
                EllipseGeometry ellipse = new EllipseGeometry(new Point(5050), 5020);
                RectangleGeometry rect 
    = new RectangleGeometry(new Rect(50505020), 55);

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

                dc.DrawGeometry(Brushes.LightBlue, 
    new Pen(Brushes.Green, 2), combin);
            }
    注意到GeometryCombineMode枚举,它有四个枚举值,如果我们有A,B分别表示两个图形的话,那么:
    GeometryCombineMode.Exclude:  合并结果为A-BcustomPaint_CombinedGeometry_Exclude.png

    GeometryCombineMode.Intersect:  合并结果为A与B的相交部分customPaint_CombinedGeometry_Intersect.png

    GeometryCombineMode.Union:  合并结果为A+BcustomPaint_CombinedGeometry_Union.png

    GeometryCombineMode.Xor:  合并结果为(A-B)+(B-A)customPaint_CombinedGeometry_Xor.png

    3, 使用Geometry.Combin()静态方法进行图形合并
    Geometry.Combin()静态方法与使用CombinedGeometry对象进行图形合并差不多
     protected override void OnRender(DrawingContext dc)
            
    {
                
    base.OnRender(dc);


                
    //Geometry.Combin()
                EllipseGeometry ellipse = new EllipseGeometry(new Point(5050), 5020);
                RectangleGeometry rect 
    = new RectangleGeometry(new Rect(50505020), 55);

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

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

            }
    其中Geometry.Combin()静态方法中有用于图形变换的参数(旋转,缩放等),如果不需要变换则填写null





  • 相关阅读:
    Maven安装与配置
    win10更新后程序路径盘符变成*星号解决方法
    谈谈 CSS 关键字 initial、inherit 和 unset
    用 async/await 来处理异步
    Vuex
    HTML5新特性之文件和二进制数据的操作 Blob对象
    vue中class和内联style绑定
    Petya and Staircases CF212div.2B
    CF#212 Two Semiknights Meet
    HDU1423最长上升公共子序列
  • 原文地址:https://www.cnblogs.com/zhouyinhui/p/822855.html
Copyright © 2011-2022 走看看