GDI Вложенные графические объекты

#c# #graphics #gdi

#c# #графика #gdi

Вопрос:

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

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

введите описание изображения здесь

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

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

Зеленая область — еще одна, обрезанная

Внутри графических объектов может быть что угодно, НЕ только 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 НЕ является вариантом.

Комментарии:

1. Разве использование mainG.SetClip(boundsOfRedArea) не сработало бы для вас? Затем вы можете рисовать mainG , как если бы это был отдельный redG графический объект.

2. тогда как обрезать зеленую область?

3. После того, как вы закончите рисовать красным, вы просто SetClip переходите к зеленой области.

4. Вопрос общий. Это может быть более двух областей, и внутри областей могут быть области

5. кроме того, у вас не может быть более одного клипа

Ответ №1:

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

 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

        }  
    } 

}
  

Ответ №2:

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

Комментарии:

1. Точно! этот вопрос пришел мне в голову после изучения этого формата, и мне было интересно, как это возможно воспроизвести вырезки, которые доступны там в GDI 🙂

2. Ну, я думаю, теперь вы знаете ответ 🙂

3. К сожалению, я не могу найти эквиваленты GDI