Dieser Titel könnte ein bisschen nicht genau sein, was ich wirklich habe, ist dieses Problem. Ich zeichnete ein paar Zeilen, die jeweils in einer Liste als Zeilenpfad gespeichert sind. Dann verwende ich IsOutlineVisible
, um zu messen, ob sich die Mausposition auf einer von ihnen befindet, ob die Maus auf einer ist, sie als eine andere Farbe zeichnet oder etwas tut. Aber es erkennt nur die letzte Zeile in der Liste.C# gui Das Mausbewegungsereignis kann kein Listenelement auswählen?
Ich würde nur den relevanten Teil der Codes anbringen, aber das ist mir wirklich nicht sicher, wo das Problem ist, ist so hier der gesamte Code
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
List<GraphicsPath> LineGroup = new List<GraphicsPath>();
Point Latest{get;set;}
List<Point> pointtemp = new List<Point>();
bool startdrawline = true;
bool selectlinestate = false;
int selectedline;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
// Save the mouse coordinates
Latest = new Point(e.X, e.Y);
// Force to invalidate the form client area and immediately redraw itself.
Refresh();
if (startdrawline == false)
{
selectedline = Linesel(LineGroup);
}
}
protected override void OnPaint(PaintEventArgs e)
{
this.DoubleBuffered = true;
var g = e.Graphics;
base.OnPaint(e);
Pen penb = new Pen(Color.Navy,2);
Pen peny=new Pen(Color.Yellow,2);
for (int i = 0; i < LineGroup.Count; i++)
{
if (i == selectedline)
{
g.DrawPath(peny, LineGroup[i]);
}
else
{
g.DrawPath(penb, LineGroup[i]);
}
}
penb.Dispose();
peny.Dispose();
if (startdrawline == true)
{
GraphicsPath tracepath = new GraphicsPath();
Pen penr = new Pen(Color.Red,2);
if (pointtemp.Count == 1)
{
tracepath.AddLine(pointtemp[0], Latest);
}
else if (pointtemp.Count > 1)
{
tracepath.AddLine(pointtemp[1], Latest);
}
g.DrawPath(penr, tracepath);
penr.Dispose();
}
Refresh();
}
private void Form1_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
startdrawline = false;
pointtemp.Clear();
}
else if (e.Button == MouseButtons.Left)
{
startdrawline = true;
Latest = new Point(e.X, e.Y);
if (pointtemp.Count < 2)
{
pointtemp.Add(Latest);
}
else
{
pointtemp[0] = pointtemp[1];
pointtemp[1] = Latest;
}
if (pointtemp.Count == 2)
{
LineP2P(pointtemp);
}
Refresh();
}
}
private void LineP2P(List<Point> pointtemp){
GraphicsPath path = new GraphicsPath();
path.AddLine(pointtemp[0], pointtemp[1]);
LineGroup.Add(path);
}
private int Linesel(List<GraphicsPath> LineGroup)
{
int selectedline=-1;
for (int i =0; i < LineGroup.Count; i++)
{
Pen pen = new Pen(Color.Navy, 8);
if (LineGroup[i].IsOutlineVisible(Latest, pen))
{
selectedline = i;
}
else if (!LineGroup[i].IsOutlineVisible(Latest, pen))
{
selectedline = -1;
}
label1.Text = selectedline.ToString();
}
return selectedline;
}
}
}
Wenn ich den Test Label.text setzte unter wenn die
if (LineGroup[i].IsOutlineVisible(Latest, pen))
{
selectedline = i;
label1.Text = selectedline.ToString();
}
es tatsächlich funktioniert (variiert mit Linien) Kann jemand die Ursache identifizieren? Vielen Dank.