Не создавайте новый объект Graphics, но используйте e.Graphics
, указанный в аргументе PaintEventArgs
.
Я не уверен, чего вы пытаетесь достичь с помощью GraphicsPath
. Возможно, вы могли бы просто использовать TextRenderer
вместо.
protected override void OnPaint(PaintEventArgs e)
{
TextRenderer.DrawText(e.Graphics, "LLOOOOLL", Font, ClientRectangle, ForeColor,
TextFormatFlags.Left | TextFormatFlags.VerticalCenter);
}
UPDATE:
Я переключил форму на Aero Glass и провел несколько тестов. Оба подхода с TextRenderer
и с GraphicsPath
работают, однако TextRenderer
работает не очень хорошо, потому что ClearType создает артефакты на стекле.
Требуются эти декларации API
[StructLayout(LayoutKind.Sequential)]
public struct MARGINS
{
public int Left;
public int Right;
public int Top;
public int Bottom;
}
[DllImport("dwmapi.dll", PreserveSig = false)]
public static extern void DwmExtendFrameIntoClientArea (IntPtr hwnd,
ref MARGINS margins);
[DllImport("dwmapi.dll", PreserveSig = false)]
public static extern bool DwmIsCompositionEnabled();
В конструкторе формы у меня есть этот код
InitializeComponent();
if (DwmIsCompositionEnabled()) {
// Stretch the margins into the form for the glass effect.
MARGINS margins = new MARGINS();
margins.Top = 300;
DwmExtendFrameIntoClientArea(this.Handle, ref margins);
}
Пользовательский Label
должен иметь черный фон. Черные части будут отображаться как стекло. Он должен иметь минимальный размер около (125, 70), чтобы соответствовать вашему тексту, потому что вы начинаете рисовать с (55, 55). (Была ли ваша этикетка слишком маленькой?) Вы должны изменить AutoSize
на false
, чтобы иметь возможность изменить размер этикетки. Вот код для пользовательской метки
protected override void OnPaint(PaintEventArgs e)
{
GraphicsPath path = new GraphicsPath();
SolidBrush br = new SolidBrush(Color.FromArgb(1, 0, 0));
path.AddString("LLOOOOLL", Font.FontFamily, (int)Font.Style, Font.SizeInPoints,
new Point(55, 55), StringFormat.GenericDefault);
e.Graphics.SmoothingMode = SmoothingMode.HighQuality;
e.Graphics.FillPath(br, path);
}
С некоторыми отличиями, это тот же код, что и у вас. Важным отличием является то, что цвет текста должен отличаться от черного; в противном случае он будет выглядеть как стекло. Я просто беру свойства шрифта фактического шрифта метки. Таким образом, вы можете изменить его внешний вид в окне свойств.
Я нашел код для эффекта стекла в этой статье TheCodeKing .