C# GDI+嵌套图形对象

C# GDI+嵌套图形对象,c#,graphics,gdi+,C#,Graphics,Gdi+,使用System.Drawing.Graphics,如何拥有嵌套图形对象。 主要目的是有几个裁剪区域 这就是我想做的事情: 整个屏幕是一个图形对象 红色区域是其中的另一个图形,并经过剪裁 绿色区域是另一个,修剪 内部图形对象可以是任何对象,而不仅仅是抽绳 代码应该如下所示: using (var bmp = new System.Drawing.Bitmap(200, 200)) using (var mainG = System.Drawing.Graphics.FromImage(bmp))

使用System.Drawing.Graphics,如何拥有嵌套图形对象。 主要目的是有几个裁剪区域

这就是我想做的事情:

整个屏幕是一个图形对象

红色区域是其中的另一个图形,并经过剪裁

绿色区域是另一个,修剪

内部图形对象可以是任何对象,而不仅仅是抽绳

代码应该如下所示:

using (var bmp = new System.Drawing.Bitmap(200, 200))
using (var mainG = System.Drawing.Graphics.FromImage(bmp))
using (var redG = ???)
using (var greenG = ???)
{
    redG.SetClip(new RectangleF(...));
    greenG.SetClip(new RectangleF(...));

    // fill redG and greenG
}
using (Graphics gRef = this.CreateGraphics())  
{  
    IntPtr hdc = gRef.GetHdc();  
    using (System.Drawing.Imaging.Metafile mf = 
           new System.Drawing.Imaging.Metafile(hdc, 
                System.Drawing.Imaging.EmfType.EmfPlusDual))  
        {  
          gRef.ReleaseHdc();  

          using (Graphics redG = Graphics.FromImage(mf))  
          {  
            redG.SetClip(new RectangleF(...));

            // .. draw on redG 
          }  
          // repeat for greenG

          // .. save and or combine as desired

        }  
    } 

}

注意:结果应该放在一个元文件中,并且是矢量图形,因此,创建位图并将其放置在mainG周围不是一种选择。

另一种方法是研究增强的图元文件格式,并尝试手动复制剪切遮罩。

假设两个矢量上下文在被绘制时可以分开,可以使用System.Drawing.Imaging.Metafile捕获向量操作,然后将它们组合到更大的上下文中。。大概是这样的:

using (var bmp = new System.Drawing.Bitmap(200, 200))
using (var mainG = System.Drawing.Graphics.FromImage(bmp))
using (var redG = ???)
using (var greenG = ???)
{
    redG.SetClip(new RectangleF(...));
    greenG.SetClip(new RectangleF(...));

    // fill redG and greenG
}
using (Graphics gRef = this.CreateGraphics())  
{  
    IntPtr hdc = gRef.GetHdc();  
    using (System.Drawing.Imaging.Metafile mf = 
           new System.Drawing.Imaging.Metafile(hdc, 
                System.Drawing.Imaging.EmfType.EmfPlusDual))  
        {  
          gRef.ReleaseHdc();  

          using (Graphics redG = Graphics.FromImage(mf))  
          {  
            redG.SetClip(new RectangleF(...));

            // .. draw on redG 
          }  
          // repeat for greenG

          // .. save and or combine as desired

        }  
    } 

}

使用mainG.SetClipboundsOfRedArea对您不起作用吗?然后,您可以在mainG上绘制,就像它是一个单独的redG图形对象一样。然后如何剪裁绿色区域?绘制完红色后,只需将clip设置为绿色区域。问题是一般性的。它可能有两个以上的区域,区域内也可能有区域。除此之外,您不能有多个剪辑!在研究了这种格式后,我想到了这个问题,我想知道如何复制GDI+中可用的剪辑:我想现在你知道答案了:不幸的是,我找不到GDI+等价物