我目前正在开发一个我在我的应用程序中使用的个人主题。我有一个关于我正在创建的自定义控件及其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);
}
这个自定义标签为我提供了我需要的东西,一个文本和一个图像(如果它存在)旁边,无论它是左对齐还是右对齐。
创建这样的自定义控件最专业的方法是什么?专业人士(如DevExpress
,Telerik
)是否使用相同的技术或是否有更好的改进(或至少避免)CPU /内存使用?