在c# /NET5.0 Windows窗体-我怎么能得到一个面板不清除自己的背景色之前绘制在油漆事件?



我试图在我的应用程序中更新面板的图形内容时摆脱闪烁效果。简化后,Mainform.cs看起来像这样:

using System;
using System.Drawing;
using System.Windows.Forms;
namespace WindowsFormsAppRefreshTest
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
private void panel1_Paint(object sender, PaintEventArgs e)
{
var g = panel1.CreateGraphics();
g.FillRectangle(Brushes.Red, 20, 20, panel1.Width - 40, panel1.Height - 40);
if(panel1.Width>100 && panel1.Height>100) g.FillRectangle(Brushes.Blue, 40, 40, panel1.Width - 80, panel1.Height - 80);
}
private void panel1_SizeChanged(object sender, EventArgs e)
{
panel1.Refresh();
}
}
}

如果我在panel1_Paint的第一行设置一个断点,当事件被调用时,面板将被清除为BackColor。这不是我想要的-我希望面板仅通过panel1_Paint方法绘制,因为我每次都使用在我的实际应用程序中准备好的位图绘制整个区域。

我如何得到Windows窗体不清除面板与背景色之前的代码可以画它?

使用Panel,我能够使用Mark的建议解决这个问题,为Panel创建一个子类,看起来像这样:

public class NoBackgroundPanel : Panel
{
public NoBackgroundPanel() { }
protected override void OnPaintBackground(PaintEventArgs e) { }
}

在MainForm.Designer.cs中使用来代替System.Windows.Forms.Panel。panel1 = new NoBackgroundPanel();

这对我来说是理想的解决方案,因为我在实际应用程序中手动更新用作双缓冲区的位图,然后在必须重新绘制时将其绘制到面板的整个区域。

最新更新