我在我的控制中压倒OnPaint
。有时,我的控件会被剪切矩形(e.ClipRectangle
)无效,该剪切矩形小于控件的大小。
在我的OnPaint
方法中,当我绘制到GDI +曲面(来自Graphics
的PaintEventArgs
对象)时,我会相对于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英寸处?
答案 0 :(得分:1)
绘图必须始终与控件的客户端矩形相对。将它与e.ClipRectangle相关是一个常见的错误,在Aero上也可以使用很长一段时间,因为当你拖动另一个窗口时,它不再使窗口无效。当Aero关闭时产生非常有趣的图形效果,看起来像是回声的图形。
您应该只使用e.ClipRectangle来优化您的绘图代码,当它完全在裁剪区域之外时,跳过您绘制的部分内容。图形已经在自动剪辑方面做得非常好,使得这样的剪辑测试得到回报并不那么容易。当不是所有东西都被削减时,非常努力,永远不要优化它。启用Aero还剩下一点点。