C# 控件Paint优先级问题


 private void mapLocation_Click(object sender, EventArgs e)
 {
            this.tabControl1.SelectedTab = this.tabControl1.TabPages[0];
            // 绘制新的
            DrawSupplementary();
 }


问题:再绘制新的后被调用的paint覆盖了
不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这篇博客: C#.NET期末必备复习资料中的 4、窗体的Paint事件实例 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    当发生窗体最小化后再最大化、菜单被打开再关闭或打开对话框再关闭等情况,用户区内容可能被破坏。操作系统不保存被破坏的用户区内容,而是由应用程序自己恢复被破坏的用户区内容。
    当应用程序窗口用户区内容被破坏后需恢复时,Windows操作系统向应用程序发送Paint事件,应用程序应把在窗口用户区输出数据的语句放在Paint事件处理函数中,应用程序响应Paint事件,能在事件处理函数中调用这些在窗口用户区输出数据的语句恢复被破坏的内容。
    Form类窗体不能自动响应Paint事件,程序员必须生成Paint事件处理函数

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    
    namespace FormPaintDemo
    {
        public partial class Form1 : Form
        {
            private bool mark = false;//表示鼠标左键是否按下,如按下鼠标再移动将画曲线
            private Point point;//记录画下一条很短线段的起始点。
            private List<Point> Point_List;    //用来记录1条曲线的所有点。
            private List<List<Point>> Line_List;
    
            Pen pen1 = new Pen(Color.Red, (float)3.0);
            Graphics g;
    
            public Form1()
            {
                InitializeComponent();
                Line_List = new List<List<Point>>();
                g = this.CreateGraphics();
                
            }
    
            private void Form1_MouseDown(object sender, MouseEventArgs e)
            {
                if (e.Button == MouseButtons.Left)  
                {
                    Point_List = new List<Point>();  //建立数组,记录1条曲线的所有点
                    point.X = e.X;
                    point.Y = e.Y;
                    mark = true;
                    Point_List.Add(point);      //记录曲线起点的坐标
                }
    
            }
    
            private void Form1_MouseMove(object sender, MouseEventArgs e)
            {
                if (mark)
                {
                   
                    g.DrawLine(pen1, point.X, point.Y, e.X, e.Y);
                    point.X = e.X;
                    point.Y = e.Y;
                    Point_List.Add(point);     //记录曲线中其它点的坐标
                }
    
            }
    
            private void Form1_MouseUp(object sender, MouseEventArgs e)
            {
                mark = false;
                Line_List.Add(Point_List);
    
            }
    
            private void Form1_Paint(object sender, PaintEventArgs e)
            {
                Point p1, p2;
                foreach (List<Point> pl in Line_List)//取出每条线
                {
                    for (int k = 0; k < pl.Count - 1; k++)//重画每条线的点
                    {
                        p1 = pl[k];
                        p2 = pl[k + 1];
                        g.DrawLine(pen1, p1, p2);
                    }
                }
    
            }
        }
    }
    
  • 以下回答来自chatgpt:

    可以通过设置控件的Z-order来控制绘制优先级。Z-order可以理解为控件在三维空间中的位置,值越大则控件越靠前。如果两个控件的Z-order值相同,则后添加的控件会在上层。

    在C#中,可以使用控件的BringToFront()和SendToBack()方法来改变Z-order值。例如,如果想将控件A放在控件B的顶部,则可以使用以下代码:

    A.BringToFront();
    

    如果想将控件A放在控件B的底部,则可以使用以下代码:

    A.SendToBack();
    

    在绘制控件之前,通过设置控件的Z-order值,可以确保控件绘制的顺序符合要求。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

具体看下Paint OnPaint DrawSupplementary的代码,调整下顺序