2015-03-10 1 views
4

Следующий код рисует крест:GraphicsPath и DrawPath - Удаление Пересекающиеся линии

using (SolidBrush brush = new SolidBrush(Color.FromArgb(192, 99, 104, 113))) 
{ 
    using(GraphicsPath path = new GraphicsPath()) 
    { 
     path.AddRectangle(new Rectangle(e.ClipRectangle.X + (e.ClipRectangle.Width - 40)/2, e.ClipRectangle.Y, 40, e.ClipRectangle.Height)); 
     path.AddRectangle(new Rectangle(e.ClipRectangle.X, e.ClipRectangle.Y + (e.ClipRectangle.Height - 40)/2, e.ClipRectangle.Width, 40)); 
     path.FillMode = FillMode.Winding; 
     e.Graphics.DrawPath(Pens.DimGray, path); 
    } 
} 

enter image description here

Я хотел бы сделать это так:

enter image description here

Я пробовал использовать Flatten(); и CloseAllFigures();, но они не работают.

Я ищу эффект, как Союз:

enter image description here

Возможно ли это с GraphicsPath?

ответ

1

можно использовать Regions.But вы должны использовать API FrameRgn в GDI, чтобы нарисовать рамку области, если нет никаких других решений.

 Graphics g = e.Graphics; 
     using (SolidBrush brush = new SolidBrush(Color.FromArgb(192, 99, 104, 113))) 
     { 
      using (GraphicsPath path = new GraphicsPath()) 
      { 
       path.AddRectangle(new Rectangle(e.ClipRectangle.X + (e.ClipRectangle.Width - 40)/2, e.ClipRectangle.Y, 40, e.ClipRectangle.Height)); 
       path.AddRectangle(new Rectangle(e.ClipRectangle.X, e.ClipRectangle.Y + (e.ClipRectangle.Height - 40)/2, e.ClipRectangle.Width, 40)); 
       path.FillMode = FillMode.Winding; 
       using (Region region = new Region(path)) 
       { 
        IntPtr reg = region.GetHrgn(g); 
        IntPtr hdc = g.GetHdc(); 
        IntPtr brushPtr = Win32.GetStockObject(Win32.WHITE_BRUSH); 
        IntPtr oldbrushPtr = Win32.SelectObject(hdc, brushPtr); 
        Win32.FrameRgn(hdc, reg, brushPtr, 1, 1); 
        Win32.DeleteObject(brushPtr); 
        Win32.SelectObject(hdc, oldbrushPtr); 
        region.ReleaseHrgn(reg); 
        g.ReleaseHdc(); 
       } 
      } 
     } 
0

Возможно, а что вам нужно регионы. Посмотрите на:

Regions in GDI+

Я предполагаю, что ваш следующий шаг будет очертить область. Это сложная часть, потому что для этого нет API. Самый простой подход заключается в следующем:

  • Нарисуйте все, как вы сделали в первый рис с толще пера.
  • Создайте регионы из путей и объединённых результирующих областей.
  • Заполните или удалите полученную область объединения (для этого есть API).

Это создаст вторую прилагаемую фотографию. Операции в регионах требуют немного творчества из-за отсутствия границ, контуров или API-интерфейсов от региона к пути, чтобы помочь вам извлечь результат.

1

Я знаю, что это не идеальное решение, но взять его в качестве одного из вариантов:

 using (SolidBrush brush = new SolidBrush(Color.FromArgb(192, 99, 104, 113))) 
     { 
      using (GraphicsPath path = new GraphicsPath()) 
      { 
       var rect1 = new Rectangle(e.ClipRectangle.X + (e.ClipRectangle.Width - 40)/2, e.ClipRectangle.Y, 40, e.ClipRectangle.Height - 1); 
       var rect2 = new Rectangle(e.ClipRectangle.X, e.ClipRectangle.Y + (e.ClipRectangle.Height - 40)/2, e.ClipRectangle.Width - 1, 40); 
       path.AddRectangle(rect1); 
       path.AddRectangle(rect2); 
       e.Graphics.DrawPath(Pens.DimGray, path); 

       var bgRect1 = new Rectangle(rect1.X + 1, rect1.Y + 1, rect1.Width - 1, rect1.Height - 1); 
       var bgRect2 = new Rectangle(rect2.X + 1, rect2.Y + 1, rect2.Width - 1, rect2.Height - 1); 
       using (GraphicsPath backgroundPath = new GraphicsPath()) 
       { 
        backgroundPath.AddRectangle(bgRect1); 
        backgroundPath.AddRectangle(bgRect2); 
        e.Graphics.FillPath(Brushes.White, backgroundPath); 
       } 
      } 
     } 

Это результат:

This is the result

0

Вам нужно будет использовать регионы для этого, вот пример, адаптированный из вашего существующего кода. Следует отметить, что вы также можете вызвать Exclude, Intersect и Xor в регионе! :)

private void Form1_Paint(object sender, PaintEventArgs e) 
    { 
     GraphicsPath Shape1 = new GraphicsPath(); 
     Shape1.AddRectangle(new Rectangle(e.ClipRectangle.X + (e.ClipRectangle.Width - 40)/2, e.ClipRectangle.Y, 40, e.ClipRectangle.Height)); 

     GraphicsPath Shape2 = new GraphicsPath(); 
     Shape2.AddRectangle(new Rectangle(e.ClipRectangle.X, e.ClipRectangle.Y + (e.ClipRectangle.Height - 40)/2, e.ClipRectangle.Width, 40)); 

     Region UnitedRegion = new Region(); 
     UnitedRegion.MakeEmpty(); 
     UnitedRegion.Union(Shape1); 
     UnitedRegion.Union(Shape2); 

     e.Graphics.FillRegion(Brushes.Black, UnitedRegion); 
    } 
Смежные вопросы