Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在面板上画一条与其他面板重叠的线?_C#_.net_Winforms_Visual Studio 2010 - Fatal编程技术网

C# 如何在面板上画一条与其他面板重叠的线?

C# 如何在面板上画一条与其他面板重叠的线?,c#,.net,winforms,visual-studio-2010,C#,.net,Winforms,Visual Studio 2010,IDE:visual studio、c#、应用程序中的Windows 我正在试着在面板上画一条线。我可以通过点击面板1来画线 //Code public partial class Form1 : Form { static int px=5, py=5; public Form1() { InitializeComponent(); } private void panel1_Paint(object sender, PaintE

IDE:visual studio、c#、应用程序中的Windows

我正在试着在面板上画一条线。我可以通过点击面板1来画线

//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上画相同的线


请建议如何完成此工作?

编辑:修复代码以正常工作。 测试场景为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);
    }
}
请记住相应地订阅事件。

此代码适用于:

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);
}

valter

那么你想让线从panel1延续到panel2?是的,我想,因为panel1上有一个小panel2,我想如果我点击panel2,我想在panel2上有相同的功能(画线)(连续线)。我相信这涉及到一些数学。找到直线和嵌板2之间的交点。然后画两条线。可能有一个更简单的解决方案,但我认为目前还没有其他问题。重叠控件通常是一个问题,位于顶部的控件重叠并模糊了底部的控件。但对于Panel和其他一些不包装本机Windows控件的纯.NET控件,您可以简单地将第二个面板的BackColor属性设置为Color.Transparent。只要它的父面板是重叠面板,当父面板是窗体时,它就不会工作。如果是这样的话,那么不要只考虑使用面板控件,只需使用窗体的油漆事件。