我在做什么我的自定义“HorizontalRule”控件有问题?
我写利用下述(很简单)控制在一个应用程序(注释为简洁起见删除):我在做什么我的自定义“HorizontalRule”控件有问题?
public partial class HorizontalRule : Control
{
public HorizontalRule()
{
InitializeComponent();
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
var g = e.Graphics;
var rect = new Rectangle(
this.ClientRectangle.Left,
this.ClientRectangle.Height/2 + 1,
this.ClientRectangle.Width,
1);
ControlPaint.DrawBorder3D(g, rect, Border3DStyle.Etched);
return;
}
}
免责声明:我在画我自己的控制是一个新手。
我选择以这种方式绘制线条,基于recommendation in the Vista UX guidelines,这表明分隔符的高度为1的蚀刻矩形。
当静态时,这看起来很好,但我注意到,如果将此控件放置在窗口中并调整其大小(通过锚点,例如),我会重绘工件。我在我的整个客户矩形的宽度上重绘我的边框,但它就像没有真正被绘制。在HorizontalRule的构造函数中启用DoubleBuffered,或以其嵌入的形式启用,似乎也没有什么区别。
我在做什么错?
更新:
%的建议,我打过电话base.OnPaint最后,而不是第一个。我不知道会发生什么变化,也不会改变任何事情。
没有画出背景没有用处。我仍然得到了伪像,但是我也没有得到背景颜色,所以我看到了水平线下的任何图像。
我能砍不通过重写onResize受到导致伪像的解决方案()无效整个控制。
我会在位图上绘制该图,然后绘制位图而不用担心每次都会绘制它。
不要打电话base.OnPaint
,或者最后打电话给我(我现在不能回忆)。
此外,尝试覆盖背景涂色方法,所以它不会调用基地。然而
protected override void OnResize(EventArgs e)
{
base.OnResize(e);
this.Invalidate();
}
我不知道这是“正确”的解决方案,:
不绘制背景肯定会是一个开始 – 2009-04-16 17:50:09
你是什么意思?第一次显示控件时,将边框绘制到位图上,然后在控件的宽度上拉伸该位图? – 2009-04-16 17:21:52
这可以工作,我指的是缓存它。 – 2009-04-16 18:28:04