Windows 窗体
一组用于开发图形用户界面的 .NET Framework 托管库。
111 个问题
这是我的 C# 代码的主要部分,这是一个 Windows 窗体应用程序。
我的代码运行良好,并且可以很好地运行应用程序,但我需要更改它。
使用此应用程序,我可以在图片框中绘制一些线条,画完线条后,我可以按“E”键隐藏线条,并且可以再次按同一键显示这些线条。
当线条被隐藏时,我可以用鼠标左键单击绘制的线的位置,然后应用程序会显示该线,我可以用相同的键“E”再次隐藏这条线
现在我的问题是我无法编写代码:当鼠标水平移动到图片框上时,我不需要单击,应用程序会自动显示该行,当鼠标穿过该行的位置的图片框时,然后再次隐藏该行,当鼠标到达下一行的位置时, 应用程序显示鼠标在它上面的另一行,然后......
您对更改代码有什么建议?
你可以在这里看到我的应用程序: https://i.stack.imgur.com/fZySn.gif[^]
This is my code:
namespace lines
{
public partial class Form1 : Form
{
private Graphics g;
private bool drawingMode = true, lineSelected;
private Pen semiTransPen;
List<line> lines = new List<line>();
public Form1()
{
InitializeComponent();
var pb = pictureBox1;
pb.Size = new Size(400, 400);
pb.Location = new Point(20, 20);
Line line = null;
pb.MouseMove += (s, e) =>
{
if (e.Button == MouseButtons.Left && drawingMode)
{
line.End = e.Location;
if (e.Location.Y < 0)
line.End = new Point(e.Location.X, 0);
else if (e.Location.Y > pb.Size.Height)
line.End = new Point(e.Location.X, pb.Size.Height);
if (e.Location.X < 0)
line.End = new Point(0, e.Location.Y);
else if (e.Location.X > pb.Size.Width)
line.End = new Point(pb.Size.Width, e.Location.Y);
pb.Invalidate();
}
};
pb.MouseDown += (s, e) =>
{
if (e.Button == MouseButtons.Left)
{
if (drawingMode)
line = new Line (e.Location, e.Location, Pens.Red );
else
{
lineSelected = false;
foreach (var a in lines)
{
if (a.OnLine(e.Location))
{
a.linePen = semiTransPen = new Pen(Color.FromArgb(75, 0, 0, 255), 5);
lineSelected = true;
}
else
a.linePen = semiTransPen = new Pen(Color.FromArgb(1, 0, 0, 255), 5);
}
pb.Invalidate();
}
}
};
pb.MouseUp += (s, e) =>
{
if (e.Button == MouseButtons.Left && drawingMode && line.Magnitude() > 1)
lines.Add(line);
};
pb.Paint += (s, e) =>
{
g = pb.CreateGraphics();
if (line != null)
e.Graphics.DrawLine(line.linePen, line.Start, line.End);
foreach (var l in lines)
e.Graphics.DrawLine(l.linePen, l.Start, l.End);
};
this.KeyPress += (s, e) =>
{
if (e.KeyChar == 'e')
{
if (drawingMode)
{
foreach (var a in lines)
{
a.linePen = semiTransPen = new Pen(Color.FromArgb(1, 0, 0, 255), 5);
}
}
else
{
foreach (var a in lines)
{
a.linePen = Pens.Red;
}
lineSelected = false;
}
drawingMode = !drawingMode;
pb.Invalidate();
}
};
}
class Line
{
public Line(Point s, Point e, Pen p)
{
Start = s;
End = e;
linePen = p;
}
public Line(string str)
{
Point s = new Point(0,0);
s.X = Int32.Parse(str.Substring(0, str.IndexOf(' ')));
str = str.Substring(str.IndexOf(' ') + 1);
s.Y = Int32.Parse(str.Substring(0, str.IndexOf(' ')));
str = str.Substring(str.IndexOf(' ') + 1);
Start = s;
s.X = Int32.Parse(str.Substring(0, str.IndexOf(' ')));
str = str.Substring(str.IndexOf(' ') + 1);
s.Y = Int32.Parse(str);
End = s;
linePen = Pens.Red;
}
public Pen linePen;
public Point Start { get; set; }
public Point End { get; set; }
public bool OnLine(Point p)
{
if (p == End || p == Start)
return true;
Point v1 = new Point(p.X - Start.X, p.Y - Start.Y);
Point v2 = new Point(p.X - End.X, p.Y - End.Y);
double d1 = v1.X * v2.X + v1.Y * v2.Y;
double d2 = Math.Sqrt(v1.X * v1.X + v1.Y * v1.Y) * Math.Sqrt(v2.X * v2.X + v2.Y * v2.Y);
d1 /= d2;
return (Math.Abs(d1 + 1) < 0.01);
}
public int Magnitude()
{
Point v1 = new Point(End.X - Start.X, End.Y - Start.Y);
return v1.X * v1.X + v1.Y * v1.Y;
}
public override string ToString()
{
return Start.X + " " + Start.Y + " " + End.X + " " + End.Y;
}
}
}
Note:此问题总结整理于: please help me on c# app
您可以使用MouseMove事件来实现它。 请将以下代码段添加到代码中:
pb.MouseMove += (s, e) =>
{
if (!drawingMode)
{
lineSelected = false;
foreach (var a in lines)
{
if (a.OnLine(e.Location))
{
a.linePen = semiTransPen = new Pen(Color.FromArgb(75, 0, 0, 255), 5);
lineSelected = true;
}
else
a.linePen = semiTransPen = new Pen(Color.FromArgb(1, 0, 0, 255), 5);
}
pb.Invalidate();
}
};
结果:
如果回复有帮助,请点击“接受答案”并点赞。
注意:如果您想接收此线程的相关电子邮件通知,请按照我们文档中的步骤启用电子邮件通知。