2015-01-12 6 views
7

Рассмотрим следующий код из стандартного System.Windows.Forms.FormLinearGradientBrush не делает правильно

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); 
    } 
} 

Он производит этот результат:

enter image description here

Почему красные и голубые линии, показывая в неправильном порядке , и как это можно зафиксировать?

ответ

2

Происхождение рендеринга - проблема. Вы запрашиваете Pen с шириной 8 пикселей, а 8px определяется как внешний 4px в обоих направлениях от линии, определенной вашим прямоугольником. Это связано с значением по умолчанию Alignment=Center. Если вы установите Pen для использования Alignment=Inset, вы получите лучшие результаты.

Вы можете увидеть эту строку, просто добавив в ваш исходный код:

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

Изменить свой метод, чтобы быть этим, и он будет работать:

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); 
    } 
} 
Смежные вопросы