PaintEventArgs中Graphics对象的绘图表面是否相对于ClipRectangle?

时间:2011-03-16 21:14:13

标签: c# .net winforms gdi+ system.drawing

我在我的控制中压倒OnPaint。有时,我的控件会被剪切矩形(e.ClipRectangle)无效,该剪切矩形小于控件的大小。

在我的OnPaint方法中,当我绘制到GDI +曲面(来自GraphicsPaintEventArgs对象)时,我会相对于ClipRectangle开始,还是相对于控制?

例如,假设我的控件是800 x 600像素。如果我打电话:

Invalidate(new Rectangle(42, 0, 100, 600));

然后在OnPaint我画一个字符串:

e.Graphics.DrawString("Don't panic.", new Font("Arial", 12), new Brush(Color.Red), 0, 0);

字符串会显示在我左侧的控件上,还是显示在左侧42英寸处?

1 个答案:

答案 0 :(得分:1)

绘图必须始终与控件的客户端矩形相对。将它与e.ClipRectangle相关是一个常见的错误,在Aero上也可以使用很长一段时间,因为当你拖动另一个窗口时,它不再使窗口无效。当Aero关闭时产生非常有趣的图形效果,看起来像是回声的图形。

您应该只使用e.ClipRectangle来优化您的绘图代码,当它完全在裁剪区域之外时,跳过您绘制的部分内容。图形已经在自动剪辑方面做得非常好,使得这样的剪辑测试得到回报并不那么容易。当不是所有东西都被削减时,非常努力,永远不要优化它。启用Aero还剩下一点点。