GDI + вложенные графические объекты - PullRequest
0 голосов
/ 13 октября 2011

С System.Drawing.Graphics, как я могу иметь "вложенные графические объекты".Основная цель состоит в том, чтобы иметь несколько обрезанных областей.

Это то, что я хочу сделать:

enter image description here

Весь экран является графическим объектом

Красная область - это другая Графика внутри нее и обрезана

Зеленая область - это еще одна Графика, обрезанная

Внутри графических объектов может быть что угодно НЕ только DrawString

код должен выглядеть следующим образом:

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
}

ПРИМЕЧАНИЕ: результат должен идти в метафайл и быть векторной графикой, поэтому создание растровых изображений и размещение их вокруг mainG НЕ вариант.

Ответы [ 2 ]

0 голосов
/ 01 августа 2014

Предполагая, что два векторных контекста могут быть разделены во время их прорисовки, вы можете использовать System.Drawing.Imaging.Metafile, чтобы перехватить векторные операции и затем объединить их в более широкий контекст. Что-то вроде этого:

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

        }  
    } 

}
0 голосов
/ 15 октября 2011

Альтернативным подходом будет изучение формата расширенного метафайла (http://msdn.microsoft.com/en-us/library/cc230724.aspx) и попытка воспроизвести обтравочные маски вручную.

...