【问题标题】:How to draw a line on panel overlapped by other panel?如何在与其他面板重叠的面板上画一条线?
【发布时间】:2014-02-19 10:25:39
【问题描述】:

IDE:Visual Studio、C#、来自应用程序的 Windows

我正在尝试在面板上画一条线。我可以通过点击在 panel1 上画线。

//Code  

public partial class Form1 : Form
{
    static int px=5, py=5;
    public Form1()
    {
        InitializeComponent();
    }

    private void panel1_Paint(object sender, PaintEventArgs e)
    {
        e.Graphics.DrawLine(Pens.Red, 5, 5, px, py);
    }

    private void panel1_MouseDown(object sender, MouseEventArgs e)
    {
        initilizeXY(e.X, e.Y);

    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }

    private void panel1_MouseMove(object sender, MouseEventArgs e)
    {

    }
    private void initilizeXY( int pxx, int pyy)
    {
        px = pxx;
        py = pyy;           

    }

    private void panel1_MouseUp(object sender, MouseEventArgs e)
    {
       panel1.Refresh();
    }

    private void panel2_MouseDown(object sender, MouseEventArgs e)
    {
        initilizeXY(e.X, e.Y);
    }
}

// 通过这段代码,我可以在面板 1 上用鼠标向下画一条线。

但由于某些要求的变化,还有另一个面板(面板 2)与面板 1 部分重叠。

现在,如果用户单击 panel1 或 panel2,我想在 panel1 上绘制相同的线。

请建议如何完成这项工作?

【问题讨论】:

  • 所以你想让线路从 panel1 继续到 panel2?
  • 是的,我想要,因为在 panel1 上有小面板 panel2,如果我点击 panel2,我想要在 panel2 上使用相同的功能(画线)(实线)。
  • 我相信这涉及到一些数学。找到您的线和 panel2 之间的交点。然后画两条线。可能有更简单的解决方案,但我现在想不出别的办法
  • 重叠控件通常是一个问题,顶部的控件重叠并遮盖了底部的控件。但对于 Panel,以及其他一些不包装原生 Windows 控件的纯 .NET 控件,您可以简单地将第二个面板的 BackColor 属性设置为 Color.Transparent。只要它的 Parent 是重叠面板,当 parent 是表单时它就不起作用。如果是这种情况,那么考虑根本不使用 Panel 控件,而只需使用表单的 Paint 事件。

标签: c# .net winforms visual-studio-2010


【解决方案1】:

此代码有效:

Point bgn1 = new Point(5, 5);
Point end1 = new Point(5, 5);
Point bgn2 = new Point(0, 0);
Point end2 = new Point(0, 0);

private void Form1_Load(object sender, EventArgs e)
{
    Point pnt, pntscr;

    pnt.X = 5;
    pnt.Y = 5;

    pntscr = Panel1.PointToScreen(pnt);

    bgn2 = Panel2.PointToClient(pntscr);
    end2 = bgn2;
}

private void panel1_MouseDown(object sender, MouseEventArgs e)
{
    end1.X = e.X;
    end1.Y = e.Y;

    Point pntscr;

    pntscr = Panel1.PointToScreen(end1);

    end2 = Panel2.PointToClient(pntscr);
}

private void panel1_MouseUp(object sender, MouseEventArgs e)
{
    panel1.Refresh();
    panel2.Refresh();
}

private void panel2_MouseDown(object sender, MouseEventArgs e)
{
    end2.X = e.X;
    end2.Y = e.Y;

    Point pntscr;

    pntscr = Panel2.PointToScreen(end2);

    end1 = Panel1.PointToClient(pntscr);
}

private void panel2_MouseUp(object sender, MouseEventArgs e)
{
    panel1.Refresh();
    panel2.Refresh();
}

private void panel1_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.DrawLine(Pens.Red, bgn1, end1);
}

private void panel2_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.DrawLine(Pens.Red, bgn2, end2);
}

变态

【讨论】:

    【解决方案2】:

    编辑:修复代码以正常工作。 在 panel2 在 panel1 的右侧与 panel1 重叠的场景中进行了测试,起始位置略低于 panel1 的顶部。

    编写这段代码时,我假设 panel2 的 X 和 Y 坐标大于 panel1。如果反过来,也许你应该反转偏移量计算。

    public partial class Form1 : Form
    {
        static int px = 5, py = 5;
        static int p2x = 0, p2y = 0;
        int offsetX;
        int offsetY;
    
        public Form1()
        {
            InitializeComponent();
            offsetX = panel2.Location.X - panel1.Location.X;
            offsetY = panel2.Location.Y - panel1.Location.Y;
        }
    
        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            e.Graphics.DrawLine(Pens.Red, 5, 5, px, py);
        }
    
        private void panel1_MouseDown(object sender, MouseEventArgs e)
        {
            initilizeXY(e.X, e.Y);
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
        }
    
        private void initilizeXY(int pxx, int pyy)
        {
            px = pxx;
            py = pyy;
        }
    
        private void initilizeXY2(int pxx, int pyy)
        {
            p2x = pxx;
            p2y = pyy;
        }
    
        private void panel1_MouseUp(object sender, MouseEventArgs e)
        {
            panel1.Refresh();
            panel2.Refresh();
        }
    
        private void panel2_MouseDown(object sender, MouseEventArgs e)
        {
            initilizeXY(e.X+offsetX, e.Y+offsetY);
            initilizeXY2(e.X, e.Y);
        }
    
        private void panel2_Paint(object sender, PaintEventArgs e)
        {
            if (px > offsetX && py > offsetY)
            {
                int p2start = findIntersectFromLineEquation(new Point(5, 5), new Point(px, py));
    
                e.Graphics.DrawLine(Pens.Red, 0, p2start - offsetY, p2x, p2y);
            }
        }
    
        private int findIntersectFromLineEquation(Point start, Point end)
        {
            if (start.X == end.X || start.Y == end.Y)
                return 0;
    
            double a = (double)(end.Y - start.Y) / (double)(end.X - start.X);
            double b = (double)(start.Y) - (double)(a * start.X);
    
            return (int)(a * offsetX + b);
        }
    }
    

    记得订阅相应的事件。

    【讨论】:

      猜你喜欢
      • 2019-06-21
      • 1970-01-01
      • 2021-04-17
      • 2011-06-25
      • 1970-01-01
      • 1970-01-01
      • 2021-08-20
      • 2017-09-18
      • 1970-01-01
      相关资源
      最近更新 更多