【问题标题】:Is the drawing surface of the Graphics object in PaintEventArgs relative to the ClipRectangle?PaintEventArgs 中 Graphics 对象的绘图表面是否相对于 ClipRectangle?
【发布时间】:2011-03-16 21:14:12
【问题描述】:

我正在控制 OnPaint。有时,我的控件会因剪切矩形 (e.ClipRectangle) 而失效,该矩形小于控件的大小。

在我的OnPaint 方法中,当我绘制到 GDI+ 表面(来自PaintEventArgsGraphics 对象)时,我会相对于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 像素?

【问题讨论】:

  • 看起来这很容易测试,不是吗?
  • 是的,但我在输入完问题后才意识到:)

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


【解决方案1】:

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

您应该只使用 e.ClipRectangle 来优化您的绘图代码,当您绘制的部分完全超出剪切区域时会跳过它。图形已经在自动剪辑方面做得很好,让这样的剪辑测试得到回报并不是那么容易。当不是所有东西都被剪裁时非常困难,永远不要优化它。启用 Aero 就没什么意义了。

【讨论】:

    猜你喜欢
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    • 2020-11-10
    • 2015-09-14
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多