使用透明度键时标签上的边框

时间:2014-06-24 23:47:37

标签: c# winforms

我有一个winform(带透明度键)以使其透明。但是当我添加一个标签时,我会得到这个" fushia"标签周围的边框。我知道这是因为没有" set"控制的背景。但有没有办法删除这个" border"。

表单设置为背景紫红色(透明度键Fuchsia),标签设置为透明。尝试将它绘制到具有相同结果的面板上。

我错过了什么?

它的外观,http://oi62.tinypic.com/2wq9z7c.jpg

public class CLabel : Label
{
    protected override CreateParams CreateParams { get { CreateParams parms = base.CreateParams; parms.ExStyle |= 0x20; return parms; } }

    public CLabel()
    {
        this.SetStyle(ControlStyles.Opaque, true);
        this.SetStyle(ControlStyles.OptimizedDoubleBuffer, false);
    }

    protected override void OnPaintBackground(PaintEventArgs e)
    {
        // null
    }

     GraphicsPath GetStringPath(RectangleF rect, StringFormat format)
    {
        GraphicsPath Path = new GraphicsPath();

        Path.AddString(this.Text, this.Font.FontFamily, (int)Font.Style, this.Font.Size, rect, format);
        return Path;
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        RectangleF rect = this.ClientRectangle;
        Font font = this.Font;
        StringFormat format = StringFormat.GenericDefault;

        using (GraphicsPath path = GetStringPath(rect, format))
        {
            SmoothingMode sm = e.Graphics.SmoothingMode;
            e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;

            Brush b = new SolidBrush(Color.White);
            e.Graphics.FillPath(b, path);
            e.Graphics.DrawPath(Pens.Black, path);

            b.Dispose();
        }
    }
}

public partial class Dy : Form
{
  protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; cp.ExStyle |= 0x02000000; cp.ExStyle |= 0x80; return cp; } }

    public Dy()
    {
        InitializeComponent();

        SetStyle(ControlStyles.UserPaint, true);
        SetStyle(ControlStyles.AllPaintingInWmPaint, true);
        SetStyle(ControlStyles.DoubleBuffer, true);
        SetStyle(ControlStyles.UserPaint, true);
        SetStyle(ControlStyles.SupportsTransparentBackColor, true);

        this.StartPosition = FormStartPosition.Manual;

        // Here I add the label
        CLabel p = new CLabel{ 
            Location = new Point(768, 702),
            Text = "25",
            AutoSize = false, 
            Size = new Size(50,50), 
            TextAlign = ContentAlignment.MiddleCenter, 
            BackColor = Color.Transparent, 
            ForeColor = Color.White, 
            BorderStyle = BorderStyle.None, 
            Font = new Font("Segoe UI", 30, FontStyle.Bold)
        };
 }
}

1 个答案:

答案 0 :(得分:3)

看起来像抗锯齿的文物。

您可以尝试更改

e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;

e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SingleBitPerPixel;

或者您可以完全关闭抗锯齿:

e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None;

编辑:我已将其移出评论,因为它可能对某些人有所帮助:

这里有一些关于AA-artefacts的额外 ..

AA将始终创建插值的像素,这将始终导致像素略微错过透明度键颜色。

显然,如果没有使用AA,它们就会消失;但如果真的需要一些平滑,这个小技巧可能有助于改善结果:

通常使用TransparencyKeyFuchsia等粗略颜色来完成HotPink。这些很少使用,因此它们不太可能切割孔,但是当它们通过半透明的AA像素发光时,它们是令人讨厌的。如果你使用较少刺激性的颜色,这种效果可以不引人注目。

您只需要确保您没有在其他地方使用它。通过Color.FromArgb(255, r,g,b)选择一个颜色,选择3个您在其他地方使用过的唯一值,但这些值与前景相混合,而后者则更重要。饱和度非常低,取决于您的图形,中等亮度可能会有所帮助..

Black或中性灰不是很好的选择,即使它们融合得很好,因为它们经常被使用。但是选择例如像ARGB(255,7,11,5)这样几乎是黑色的东西很有可能在没有用于输出图形和切割孔的情况下进行混合。

最好的结果是你可以使用接近背景颜色的东西。如果你不能预见它,这个技巧往往会失败,但是......