Aganstrong 2023-04-29 21:09 采纳率: 56.6%
浏览 7
已结题

C# 控件Paint优先级问题


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


问题:再绘制新的后被调用的paint覆盖了
  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-05-05 05:03
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:
    • 这篇博客: 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值,可以确保控件绘制的顺序符合要求。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 5月13日
  • 已采纳回答 5月5日
  • 创建了问题 4月29日

悬赏问题

  • ¥15 Vue3 大型图片数据拖动排序
  • ¥15 划分vlan后不通了
  • ¥15 GDI处理通道视频时总是带有白色锯齿
  • ¥20 用雷电模拟器安装百达屋apk一直闪退
  • ¥15 算能科技20240506咨询(拒绝大模型回答)
  • ¥15 自适应 AR 模型 参数估计Matlab程序
  • ¥100 角动量包络面如何用MATLAB绘制
  • ¥15 merge函数占用内存过大
  • ¥15 使用EMD去噪处理RML2016数据集时候的原理
  • ¥15 神经网络预测均方误差很小 但是图像上看着差别太大