2017-03-06 104 views
2

2 labels in windows form標籤光滑圓角

兩個標籤具有AutoSize真正& TextAlign MiddleCenter。

label2如何顯示平滑的邊界?

這裏是處理器Form.Load(...) & Form.Paint(...)測試代碼:

int _cornerRadius = 10; 
Point _locationLabel2; 

// Form.Load(...) 
private void Form3_Load(object sender, EventArgs e) 
{ 
    // Step 1: Cut the label regions (seems to be ok, result is the same for both labels) 
    GraphicsPath graphicsPath = _getRoundPath(label1.ClientRectangle, _cornerRadius); 
    label1.Region = new Region(graphicsPath); 
    graphicsPath = _getRoundPath(label2.ClientRectangle, _cornerRadius); 
    label2.Region = new Region(graphicsPath); 

    _locationLabel2 = this.PointToClient(label2.Parent.PointToScreen(label2.Location)); 
} 

// Form.Paint(...) 
private void Form3_Paint(object sender, PaintEventArgs e) 
{ 
    using (Pen pen = new Pen(label1.BackColor, 3.0f)) 
    { 
     // Step 2: Smooth the label borders (ok only for label1) 
     _drawRoundedRectangle(e.Graphics, pen, label1.Location.X, label1.Location.Y, 
           label1.ClientRectangle.Width, label1.ClientRectangle.Height, _cornerRadius); 
     _drawRoundedRectangle(e.Graphics, pen, _locationLabel2.X, _locationLabel2.Y, 
           label2.ClientRectangle.Width, label2.ClientRectangle.Height, _cornerRadius); 
    } 
} 

// Helper 1/3 
private static GraphicsPath _getRoundPath(Rectangle rectangle, int radius) 
{ 
    int x = rectangle.X; 
    int y = rectangle.Y; 
    int width = rectangle.Width; 
    int height = rectangle.Height; 

    radius = radius << 1; 

    GraphicsPath path = new GraphicsPath(); 

    if (radius > 0) 
    { 
     if (radius > height) radius = height; 
     if (radius > width) radius = width; 
     path.AddArc(x, y, radius, radius, 180, 90); 
     path.AddArc(x + width - radius, y, radius, radius, 270, 90); 
     path.AddArc(x + width - radius, y + height - radius, radius, radius, 0, 90); 
     path.AddArc(x, y + height - radius, radius, radius, 90, 90); 
     path.CloseFigure(); 
    } 
    else 
    { 
     path.AddRectangle(rectangle); 
    } 

    return path; 
} 

// Helper 2/3 
private void _drawRoundedRectangle(Graphics graphics, Pen pen, int x, int y, int width, int height, int radius) 
{ 
    RectangleF rectangle = new RectangleF(x, y, width, height); 
    GraphicsPath path = _generateRoundedRectangle(graphics, rectangle, radius); 
    SmoothingMode old = graphics.SmoothingMode; 
    graphics.SmoothingMode = SmoothingMode.AntiAlias; 
    graphics.DrawPath(pen, path); 
    graphics.SmoothingMode = old; 
} 

// Helper 3/3 
private static GraphicsPath _generateRoundedRectangle(Graphics graphics, RectangleF rectangle, int radius) 
{ 
    GraphicsPath path = new GraphicsPath(); 
    float diameter = radius * 2.0F; 
    SizeF sizeF = new SizeF(diameter, diameter); 
    RectangleF arc = new RectangleF(rectangle.Location, sizeF); 

    path.AddArc(arc, 180, 90); 
    arc.X = rectangle.Right - diameter; 
    path.AddArc(arc, 270, 90); 
    arc.Y = rectangle.Bottom - diameter; 
    path.AddArc(arc, 0, 90); 
    arc.X = rectangle.Left; 
    path.AddArc(arc, 90, 90); 
    path.CloseFigure(); 

    return path; 
} 

主代碼部分是從Arun Reginald Zaheeruddin

+0

__Not possible__,真的。 'Regions'不允許使用抗鋸齒功能,因此SmoothingMode不允許使用任何抗鋸齒像素。根據您的佈局,您可能可以自己繪製它們,但是您可以像在label1中那樣繪製它們。 – TaW

+0

嘗試使用'path .AddBezier「而不是」AddArc「。 – helrich

+0

重複? http://helpoverflow.com/questions/11347576/how-to-make-a-circle-shape-label-in-window-form –

回答

2

answer由@Reza Aghaei解決它。

解決方案

using System.ComponentModel; 
using System.Drawing; 
using System.Drawing.Drawing2D; 
using System.Windows.Forms; 
public class RoundLabel : Label 
{ 
    [Browsable(true)] 
    public Color _BackColor { get; set; } 

    public RoundLabel() 
    { 
     this.DoubleBuffered = true; 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     base.OnPaint(e); 
     using (var graphicsPath = _getRoundRectangle(this.ClientRectangle)) 
     { 
      e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; 
      using (var brush = new SolidBrush(_BackColor)) 
       e.Graphics.FillPath(brush, graphicsPath); 
      using (var pen = new Pen(_BackColor, 1.0f)) 
       e.Graphics.DrawPath(pen, graphicsPath); 
      TextRenderer.DrawText(e.Graphics, Text, this.Font, this.ClientRectangle, this.ForeColor); 
     } 
    } 

    private GraphicsPath _getRoundRectangle(Rectangle rectangle) 
    { 
     int cornerRadius = 15; // change this value according to your needs 
     int diminisher = 1; 
     GraphicsPath path = new GraphicsPath(); 
     path.AddArc(rectangle.X, rectangle.Y, cornerRadius, cornerRadius, 180, 90); 
     path.AddArc(rectangle.X + rectangle.Width - cornerRadius - diminisher, rectangle.Y, cornerRadius, cornerRadius, 270, 90); 
     path.AddArc(rectangle.X + rectangle.Width - cornerRadius - diminisher, rectangle.Y + rectangle.Height - cornerRadius - diminisher, cornerRadius, cornerRadius, 0, 90); 
     path.AddArc(rectangle.X, rectangle.Y + rectangle.Height - cornerRadius - diminisher, cornerRadius, cornerRadius, 90, 90); 
     path.CloseAllFigures(); 
     return path; 
    } 
} 
+0

它工作的第一次,但之後,我正在得到一個正常的標籤,雖然我試圖創建一個圓。 VS2013。 –

+0

@ n.jmurov:你的問題還在嗎? – Pollitzer

+0

是的。我可能會嘗試在稍後添加屏幕截圖。在代碼中,它們是RoundLabels,但在屏幕上它們很正常。我不相信代碼中有錯誤,因爲它第一次運行。 –