winforms 在C#/NET5.0 Windows窗体中-在paint事件中绘图之前,如何让面板不被BackColor清除?

k5ifujac  于 2022-12-30  发布在  C#
关注(0)|答案(1)|浏览(143)

我曾经尝试过在更新应用程序中面板的图形内容时消除 Flink 效果。简化后,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窗体在代码可以绘制面板之前不使用BackColor清除面板?

kxe2p93d

kxe2p93d1#

通过使用Panel,我能够使用suggestion from Mark解决这个问题,创建一个Panel的子类,如下所示:

public class NoBackgroundPanel : Panel
{
    public NoBackgroundPanel() { }

    protected override void OnPaintBackground(PaintEventArgs e) { }
}

并在MainForm.Designer.cs - InitializeComponent()中使用此函数而不是系统.窗口.窗体.面板:this.panel1 =新的无背景面板();
这是我想要的解决方案,因为我手动更新位图用作双缓冲区在我的真实的应用程序,然后绘制到面板的整个区域时,它必须重新绘制。

相关问题