2015-01-12 14 views
7

Xét đoạn mã sau từ một tiêu chuẩn System.Windows.Forms.FormLinearGradientBrush không làm đúng

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

Nó tạo ra kết quả này:

enter image description here

Tại sao các đường màu đỏ và màu xanh hiển thị theo thứ tự không chính xác và điều này có thể được khắc phục như thế nào?

Trả lời

2

Nguồn gốc hiển thị là vấn đề. Bạn đang yêu cầu Pen rộng 8px và 8px được định nghĩa là 4px bên ngoài theo cả hai hướng từ đường được xác định bằng hình chữ nhật của bạn. Đó là do giá trị mặc định của Alignment=Center. Nếu bạn đặt Pen để sử dụng Alignment=Inset, bạn sẽ có kết quả tốt hơn.

Bạn có thể thấy dòng này bằng cách thêm này để mã ban đầu của bạn:

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

Thay đổi phương pháp của bạn được điều này, và nó sẽ làm việc:

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); 
    } 
} 
Các vấn đề liên quan