如何专业绘制自定义控件以获得更好的CPU /内存使用?

时间:2017-07-18 12:48:31

标签: c# .net graphics gdi+

我目前正在开发一个我在我的应用程序中使用的个人主题。我有一个关于我正在创建的自定义控件及其CPU /内存使用情况的问题!

代码

我将向您展示我的自定义标签控件示例。

构造

这是我设置DoubleBuffer机制和样式/属性的地方。

public DarkLabel()
{
    SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.ResizeRedraw | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint, true);
    DoubleBuffered = true;
    ForeColor = Helpers.TextColor;
    BackColor = Helpers.LightDarkColor;
    _textAlign = TextAlignements.Left;
}

OnPaint覆盖

这是我绘制自定义控件的地方。

protected override void OnPaint(PaintEventArgs e)
{
    Graphics g = e.Graphics;
    Helpers.SetHighQuality(g);

    // Background
    g.Clear(BackColor);

    // Text and Image
    using (SolidBrush b = new SolidBrush(ForeColor))
    {
        // Image but no Text
        if (string.IsNullOrEmpty(Text) && _image != null)
        {
            g.DrawImage(_image, Width / 2 - _image.Width / 2, Height / 2 - _image.Height / 2);
        }
        // Image and Text
        else if (!string.IsNullOrEmpty(Text) && _image != null)
        {
            SizeF textSize = g.MeasureString(Text, Font);
            if (_textAlign == TextAlignements.Left)
            {
                g.DrawImage(_image, 2, Height / 2 - _image.Height / 2);
                g.DrawString(Text, Font, b, _image.Width + 5, Height / 2 - textSize.Height / 2);
            }
            else
            {
                g.DrawImage(_image, Width - Image.Width - 2, Height / 2 - _image.Height / 2);
                g.DrawString(Text, Font, b, Width - _image.Width - textSize.Width - 7, Height / 2 - textSize.Height / 2);
            }
        }
        // Text
        else
        {
            SizeF textSize = g.MeasureString(Text, Font);
            if (_textAlign == TextAlignements.Left)
            {
                g.DrawString(Text, Font, b, 2, Height / 2 - textSize.Height / 2);
            }
            else
            {
                g.DrawString(Text, Font, b, Width - textSize.Width - 2, Height / 2 - textSize.Height / 2);
            }
        }
    }

    base.OnPaint(e);
}

结果

这个自定义标签为我提供了我需要的东西,一个文本和一个图像(如果它存在)旁边,无论它是左对齐还是右对齐。

问题

创建这样的自定义控件最专业的方法是什么?专业人士(如DevExpressTelerik)是否使用相同的技术或是否有更好的改进(或至少避免)CPU /内存使用?

0 个答案:

没有答案