2015-01-12 15 views
7

Rozważmy następujący kod ze standardowej System.Windows.Forms.FormLinearGradientBrush nie czyni prawidłowo

protected override void OnPaint(PaintEventArgs e) 
{ 
    base.OnPaint(e); 
    Rectangle test = new Rectangle(50, 50, 100, 100); 
    using (LinearGradientBrush brush = new LinearGradientBrush(test, Color.Red, Color.Blue, 0f)) 
    { 
     e.Graphics.DrawRectangle(new Pen(brush, 8), test); 
    } 
} 

produkuje ten wynik:

enter image description here

Dlaczego są czerwone i niebieskie linie pojawiają się w niewłaściwej kolejności i jak można to naprawić?

Odpowiedz

2

Początek renderowania jest problemem. Pytasz o szeroką oś o szerokości 8 pikseli i że 8px jest zdefiniowany jako zewnętrzny 4px w obu kierunkach od linii zdefiniowanej przez twój prostokąt. Wynika to z domyślnej wartości Alignment=Center. Jeśli ustawisz Pen do używania Alignment=Inset, uzyskasz lepsze wyniki.

Można zobaczyć tę linię po prostu dodając to do oryginalnego kodu:

e.Graphics.DrawRectangle(Pens.White, test); 

zmienić metodę być to, i będzie działać:

Rectangle test = new Rectangle(50, 50, 100, 100); 
using (LinearGradientBrush brush = new LinearGradientBrush(test, Color.Red, Color.Blue, 0f)) 
{ 
    using (var pen = new Pen(brush, 8f)) 
    { 
     pen.Alignment = PenAlignment.Inset; 
     e.Graphics.DrawRectangle(pen, test); 
    } 
} 
Powiązane problemy