请在 C# 应用程序上帮助我

Jiale Xue - MSFT 41,736 信誉分 Microsoft 供应商
2024-05-24T07:14:49.55+00:00

这是我的 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

Windows 窗体
Windows 窗体
一组用于开发图形用户界面的 .NET Framework 托管库。
131 个问题
0 个注释 无注释
{count} 票

接受的答案
  1. Hui Liu-MSFT 47,096 信誉分 Microsoft 供应商
    2024-05-24T09:47:53.1033333+00:00

    您可以使用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();  
                    }  
      
                };  
    

    结果:108699-624.gif


    如果回复有帮助,请点击“接受答案”并点赞。

    注意:如果您想接收此线程的相关电子邮件通知,请按照我们文档中的步骤启用电子邮件通知。

    1 个人认为此答案很有帮助。
    0 个注释 无注释

0 个其他答案

排序依据: 非常有帮助