【发布时间】:2011-08-12 22:04:31
【问题描述】:
当覆盖自定义控件的 OnPaint 方法时,我得到了一个 PaintEventArgs,它包含一个 Graphics 对象和一个 ClipRectangle。 ClipRectangle 对于我的口味来说太小了,所以我想将它扩展 100 像素,或者完全忽略它。
无论我做什么,我似乎都无法摆脱 ClipRectangle。到目前为止,我已经尝试过:
e.ClipRectangle.Inflate(100, 0);
e.Graphics.ResetClip();
e.Graphics.SetClip(new Rectangle(x, y, w, h));
父控件正在调用 Invalidate(true)(强制所有子控件的子控件无效)。
我还进行了一些谷歌搜索并查看了 bob powell 的网站,但找不到 nuffin。
ResetClip 将 Graphics 对象的剪辑区域重置为一个无限大的 Rectangle,但 Graphics 对象仍继续使用提供的 ClipRectangle。
帮助。
【问题讨论】:
-
调用者必须控制绘制的内容。您应该在拥有控件之一上调用 Invalidate() 以便整个区域无效 -> 计划重绘
-
我认为调用者有权指定要绘制的区域是正确的。问题是,我是调用者,我正常调用 Invalidate,没有任何限制。
-
如果重绘发生,Windows API 将一个剪辑区域传递给 WM_PAINT,因为只有部分控件需要重绘,例如如果您最小化了仅部分覆盖控件的窗口。我假设 ClipRectangle 只是给你一个更友好的剪辑区域视图,但如果你调用 Invalidate,我不希望有一个剪辑区域。该控件是否被其他控件部分覆盖?你能显示简单的重现代码吗?
-
顺便说一下,+1 只是为了标题。
标签: c# winforms custom-controls system.drawing