无法清除 OnPaint 方法中的自定义控件

Posted

技术标签:

【中文标题】无法清除 OnPaint 方法中的自定义控件【英文标题】:Cannot clear custom control in OnPaint method 【发布时间】:2016-01-13 15:57:55 【问题描述】:

我有一个自定义控件,其功能是显示由外部库创建的图像。我通过重载 OnPaint 函数、在那里生成和绘制图像来实现这一点。

我的问题是,当我的控件大小发生变化并且重新创建和绘制图像时,旧图像仍然可见。

我的 OnPaint 方法相对简单,因为图像创建是在它自己的方法中:

protected override void OnPaint(PaintEventArgs e)

    base.OnPaint(e);

    if (image == null || this.Width != image.Width || this.Height != image.Height)
    
        // Remove the old image so we don't accidentally draw it later.
        this.image = null;

        // Attempt to clear the control.
        //e.Graphics.Clear(this.BackColor);
        e.Graphics.FillRectangle(new SolidBrush(this.BackColor), 0, 0, this.Width, this.Height);

        try
        
            this.Plot(); // Create my image from the library based on current size.
        
        catch (Exception ex)
        
            SizeF size = e.Graphics.MeasureString(ex.Message, this.Font);
            e.Graphics.DrawString(ex.Message, this.Font, Brushes.Black, (this.Width - size.Width) / 2, (this.Height - size.Height) / 2);
        
    
    if (this.image != null)
        e.Graphics.DrawImageUnscaled(image, 0, 0);

如您所见,我尝试了一些方法来清除控件,包括 Graphics.Clear 方法和自己重绘背景。这些都没有任何效果。

在重绘之前我可以做些什么来清除我的控制?

【问题讨论】:

绘制前调用this.invalidate有效吗? 好吧,我试图避免在 OnPaint 中调用它,因为据我所知,它无效会导致重绘,所以我认为这会产生无限循环。 adv12 关于调整大小无效的建议不仅解决了这个问题,而且解决了问题(我现在接受答案还为时过早) 你是对的......有一段时间没有在winforms上工作了,但是adv12的回答很好。 :] 将 FillRectangle 调用移到 if 条件之前。在控件的构造函数中,设置 ResizeRedraw = true 和 DoubleBuffered = true。 OnPaintBackground() 的工作是确保您在“干净”的背景上绘画。您继承的默认设置使用 BackColor 属性填充控件。很不清楚发生了什么。如果您从容器控件(如 Panel)继承,则需要 ResizeRedraw。 【参考方案1】:

可能正在发生的事情是您的控件只有一部分无效,因此只有一部分被重新绘制。要解决此问题,请添加 Resize 事件处理程序并在其中调用 Invalidate() 以使整个控件无效并强制重新绘制。

编辑:在问题的 cmets 中,@LarsTech 建议设置 ResizeRedraw,这是我以前从未注意到的。这似乎比我建议的 Resize 事件处理程序更干净,更符合库的设计。

【讨论】:

以上是关于无法清除 OnPaint 方法中的自定义控件的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的C#Winform自定义控件,继承Control类,然后重写onpaint事件,设计窗体拖动时只剩下外框!

自定义 MFC 控件包含另一个控件 - 消息未通过

在 WPF C# 中无法访问用户控件的自定义属性

如何清除包含在重复使用的自定义 UITableViewCell 中的 WKWebview?

Android中的自定义控件

如何从 nextjs 中的自定义服务器 console.log