每个子控件都会调用 OnPaint 方法

发布于 2024-07-14 20:18:52 字数 349 浏览 6 评论 0原文

我有一个 UserControl(WinForms,.net 2.0),并且我有这个:

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);

    var rect = e.ClipRectangle;
    var pen = new Pen(Brushes.LightGray, 1);

    e.Graphics.DrawRectangle(pen, rect);
}

我基本上想在 UserControl 上绘制边框,但也在所有子控件中绘制矩形! 我从来没有读过应该为每个子控件调用它,有解决方案吗?

I've a UserControl (WinForms, .net 2.0), and I've this:

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);

    var rect = e.ClipRectangle;
    var pen = new Pen(Brushes.LightGray, 1);

    e.Graphics.DrawRectangle(pen, rect);
}

I basically want to draw a border on the UserControl, but the rectangle is being draw in all the child controls too!
I never read it should be called for every child control, is there a solution?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

折戟 2024-07-21 20:18:52

为什么使用 PaintEventArgs.ClipRectangle 来确定矩形的边界? 尝试使用 Control.ClientRectangle 相反。

Why are you using PaintEventArgs.ClipRectangle to determine the bounds of the rectangle? Try using Control.ClientRectangle instead.

_畞蕅 2024-07-21 20:18:52

因为子控件使父控件无效,导致每个子控件都会触发此方法。

不要使用 e 作为参数(e 将是触发事件的任何控件,无论是否是子控件),而是显式使用控件名称。

Because the child controls invalidate the parent, causing this method to be fired for each one.

Instead of using e as the parameter (e is going to be whichever control fired the event, child or not) use the control name explicity.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文