#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