2016-07-21 3 views
-1

В настоящее время я пытаюсь нарисовать округлый прямоугольник с градиентом на панели bar в форме.C# - Рисование округленного прямоугольника на панели

Из некоторых исследований я нашел код, который позволил мне создать пользовательский прямоугольник:

static class CustomRectangle 
{ 
    public static GraphicsPath RoundedRect(Rectangle bounds, int radius) 
    { 
     int diameter = radius * 2; 
     Size size = new Size(diameter, diameter); 
     Rectangle arc = new Rectangle(bounds.Location, size); 
     GraphicsPath path = new GraphicsPath(); 

     if (radius == 0) 
     { 
      path.AddRectangle(bounds); 
      return path; 
     } 

     // top left arc 
     path.AddArc(arc, 180, 90); 

     // top right arc 
     arc.X = bounds.Right - diameter; 
     path.AddArc(arc, 270, 90); 

     // bottom right arc 
     arc.Y = bounds.Bottom - diameter; 
     path.AddArc(arc, 0, 90); 

     // bottom left arc 
     arc.X = bounds.Left; 
     path.AddArc(arc, 90, 90); 

     path.CloseFigure(); 
     return path; 
    } 

    public static void FillRoundedRectangle(this Graphics graphics, Brush brush, Rectangle bounds, int cornerRadius) 
    { 
     if (graphics == null) 
      throw new ArgumentNullException("graphics"); 
     if (brush == null) 
      throw new ArgumentNullException("brush"); 

     using (GraphicsPath path = RoundedRect(bounds, cornerRadius)) 
     { 
      graphics.FillPath(brush, path); 
     } 
    } 

Кредит на этот page

Далее с помощью этого пользовательского прямоугольника, я попытался с помощью метода paint для bar панель.

private void quickMenuBar_Paint(object sender, PaintEventArgs e) 
    { 
     LinearGradientBrush myBrush = new LinearGradientBrush(new Point(20, 20), new Point(120, 520), Color.DarkBlue, Color.RoyalBlue); 
     System.Drawing.Graphics formGraphics = this.CreateGraphics(); 

     CustomRectangle.FillRoundedRectangle(formGraphics, myBrush, new System.Drawing.Rectangle(20, 20, 100, 500), 25); 
     myBrush.Dispose(); 
     formGraphics.Dispose(); 
} 

Но после выполнения этого кода, он печатает только скругленный прямоугольник непосредственно на форму и позади bar панели.

У меня есть другие методы, которые заполняют панель со стандартным прямоугольником с помощью PaintEventArgs e:

e.Graphics.FillRectangle(myBrush , otherBar.ClientRectangle); 

Так, очевидно, что нужно использовать PaintEventArgs e в моем методе пользовательского прямоугольника, но я не знаю, как и где.

Если есть лучшие способы, чем этот способ рисования закругленных прямоугольников, поделитесь им.

+0

_System.Drawing.Graphics formGraphics = this.CreateGraphics(); _ Никогда не используйте 'control.CreateGraphics'! Никогда не пытайтесь кэшировать объект «Graphics»! Либо вставьте «битмап bmp», используя «Графика g = Graphics.FromImage (bmp)» или в событие «Paint» элемента управления, используя параметр «e.Graphics». – TaW

+0

Попробуйте использовать графику для панели, а не для формы. –

ответ

2

Обычно вы никогда не должны использовать CreateGraphics(). Просто удалите эту строку:

System.Drawing.Graphics formGraphics = this.CreateGraphics(); 

И использовать e.Graphics где вы ранее использовать formGraphics. Событие Paint в основном просит вас «нарисовать что-то для меня, вот графический объект для рисования».

Поскольку вы уже предоставляете экземпляр объекта Graphics методу округленного прямоугольника, изменений там не требуется.

Смежные вопросы