C# 如何在面板上画一条与其他面板重叠的线?
IDE:visual studio、c#、应用程序中的Windows 我正在试着在面板上画一条线。我可以通过点击面板1来画线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
//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。只要它的父面板是重叠面板,当父面板是窗体时,它就不会工作。如果是这样的话,那么不要只考虑使用面板控件,只需使用窗体的油漆事件。