Следующий метод является частью унаследованного класса winform label. Цель состоит в том, чтобы создать эффект ореола или свечения на тексте. Пока что эффект на самом деле является контуром. Его стоит держать как его не плохо, но его еще нет.
protected override void OnPaint(PaintEventArgs e)
{
if (this.Text.Length == 0) return;
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
e.Graphics.CompositingQuality = CompositingQuality.HighQuality;
Rectangle rc = new Rectangle(ClientRectangle.X + Padding.Left,
ClientRectangle.Y + Padding.Top,
ClientRectangle.Width - (Padding.Left + Padding.Right),
ClientRectangle.Height - (Padding.Top + Padding.Bottom));
StringFormat fmt = new StringFormat(StringFormat.GenericTypographic)
{
Alignment = TextAlign == ContentAlignment.TopLeft || TextAlign == ContentAlignment.MiddleLeft || TextAlign == ContentAlignment.BottomLeft
? StringAlignment.Near
: TextAlign == ContentAlignment.TopCenter || TextAlign == ContentAlignment.MiddleCenter || TextAlign == ContentAlignment.BottomCenter
? StringAlignment.Center
: StringAlignment.Far
};
if ((haloSize < 1) | (haloColor == Color.Transparent))
{
using (var brush = new SolidBrush(this.ForeColor))
{
e.Graphics.DrawString(Text, Font, brush, rc, fmt);
}
}
else
{
using (var path = new GraphicsPath())
using (var halopen = new Pen(new SolidBrush(this.haloColor), haloSize) { LineJoin = LineJoin.Round })
using (var brush = new SolidBrush(ForeColor))
{
if (fmt.Alignment == StringAlignment.Center) rc.X += rc.Width / 2;
if (fmt.Alignment == StringAlignment.Far) rc.X += rc.Width;
path.AddString(Text, Font.FontFamily, (int)Font.Style, rc.Height, rc.Location, fmt);
//path.AddString(Text, Font.FontFamily, (int)Font.Style, rc.Height, rc, fmt);
e.Graphics.DrawPath(halopen, path);
e.Graphics.FillPath(brush, path);
}
}
}
Два вопроса.
- Почему строка, закомментированная с использованием
AddString
с Rectangle
, не работает, но работает с Point
? - Эффект свечения гало может быть достигнут с постепенным уменьшением размера и цвета bru sh, но все равно, что изобретать новое колесо. Есть ли простой способ сделать это или библиотека с открытым исходным кодом уже с этим?