Label mit Maus verschieben
-
Hallo...
mein Problem ist das ich Minimumsgrenze und Maximumsgrenze für meinen Coverdrucker einbauen will, bzw. ich schon eingebaut habe.
Dazu habe ich zwei Lables definiert die ich per "Maustaste halten/loslassen" verschieben kann.Wenn ich den gültigen Bereich verlasse mach ich die Lables unsichtbar und setzt die Werte fest. Wenn man die Maustaste
nicht loslässt und wieder zurückfährt werden die Lables wieder sichtbar.
Entsprechende Min- und Maxwerte berechne ich und schreibe die jeweils in andere Anzeigelables, aber das ist für das Problem jetzt unwichtig.
Mein Problem hier ist wenn ich schnell mit der Maus ziehe und den gültigen Bereich verlasse dann kommt es
manchmal vor, dass die Lables nicht ausgeblendet werden !
Es wäre schöner wenn die Lables an den Bereichsgrenzen stehen bleiben würden, d.h. man sie nicht weiter nach rechts oder links verschieben könnte. Wenn ich die Position immer neu setzte, dann hüpft das Lable hin und her. -> Extrem unschön !
Hat jemand eine Idee wie man sowas schön hinbekommt, dass das richtig festsitzt, bzw. kann jemand kurz den Code überfliegen ob das gut realisiert ist, da ja manchmal das Lable sichtbar bleibt ?// Enumeration für das verschieben des Minimum-/Maximumlables private enum Mousestatus { Undefined, Move } Mousestatus MyMouseStatus = Mousestatus.Undefined; private void lbl_maximum_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { MyMouseStatus = Mousestatus.Move; } } private void lbl_maximum_MouseMove(object sender, MouseEventArgs e) { MouseMove_min_max(sender, e, true); } private void lbl_maximum_MouseUp(object sender, MouseEventArgs e) { MyMouseStatus = Mousestatus.Undefined; } private void lbl_minimum_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { MyMouseStatus = Mousestatus.Move; } } private void lbl_minimum_MouseUp(object sender, MouseEventArgs e) { MyMouseStatus = Mousestatus.Undefined; } private void lbl_minimum_MouseMove(object sender, MouseEventArgs e) { MouseMove_min_max(sender, e, false); } private void MouseMove_min_max(object sender, MouseEventArgs e, bool maxmove) { Point myPointx = new Point(); Point myPointy = new Point(); myPointx = lbl_maximum.Location; myPointy = lbl_minimum.Location; if (MyMouseStatus == Mousestatus.Move) { if (lbl_maximum.Location.X < 446) { if (maxmove == true) { // -30 jeweils damit der Mausezeiger im Maximumlabel mittig postiert wird/ist myPointx.X += e.X - 30; myPointy.X -= e.X - 30; } else { // -30 jeweils damit der Mausezeiger im Minimumlabel mittig postiert wird/ist myPointx.X -= e.X - 30; myPointy.X += e.X - 30; } lbl_minimum.Location = myPointy; lbl_maximum.Location = myPointx; } else { // Bereich nach rechts raus verlassen Buttons werden unsichtbar gemacht und Bereichsgrenze // fest definiert lbl_minimum.Visible = false; lbl_maximum.Visible = false; myPointx.X = 445; myPointy.X = 6; lbl_maximum.Location = myPointx; lbl_minimum.Location = myPointy; lbl_minimum.Visible = true; lbl_maximum.Visible = true; } if (lbl_maximum.Location.X < 254) { // Bereich nach links raus verlassen Buttons werden unsichtbar gemacht und Bereichsgrenze // fest definiert lbl_minimum.Visible = false; lbl_maximum.Visible = false; myPointx.X = 254; myPointy.X = 197; lbl_maximum.Location = myPointx; lbl_minimum.Location = myPointy; lbl_minimum.Visible = true; lbl_maximum.Visible = true; } // Linke- und Rechte Grenze berechnen int minlocation = lbl_minimum.Location.X; int maxlocation = lbl_maximum.Location.X; int flaeche = 0; // Rahmenbedingungen miteinrechnen da Grösse noch relativ minlocation -= 6; maxlocation += 38; flaeche = maxlocation - minlocation; // Textfelder für die Anzeige aktualisieren lbl_min.Text = minlocation.ToString(); lbl_max.Text = maxlocation.ToString(); lbl_flaeche.Text = flaeche.ToString(); // Variable füllen linkeGrenze = minlocation; rechteGrenze = maxlocation; pic_cover.Refresh(); } }
Vielen DANK schonmal auch fürs Durchlesen.
-
Prüf einfach ab ob die die position des Labels der entsprechenden Kannte des Forms, Panels, etc. entspricht
z.B.
// In der MouseMove-Methode: if (label1.Left + label.Width < form1.Width) { // Bewege das Label }
Das muss du natürlich auch für Links, Rechts, Oben und unten machen.
-
Sorry ich hab natürlich wieder nur die Hälfte des Problems geschieldert.
Das eigentliche Problem ist wenn ich das so mache wie du schreibst ncc-1701-m
und ich das Lable mit der Maus verlasse dann greift mein lbl_maximum_MouseUp() nichtmehr, da ich mich nichtmehr über dem lbl befinden würde und ich zieh das Label hinter mir her bis ich wieder drüberzieh.Ich habs jetzt so gemacht (obiger Code) das ichs Unsichtbar mitziehe bzw. beim loslassen dann zurücksetzte. So hab ichs auch noch in der "Hand" wenn ich aus Versehen aus dem gültigen Bereich rausfahre und wieder zurück.
Darum auch die Mousestatusflags.Elegante lösung ist das denk ich nicht drum frag ich hier.
Wenn man Mauszeiger irgendwie festhalten könnte würde mir das theoretisch auch schon reichen !?
Am allerschönsten aber wäre wenn nur das Lable stehenbleiben würde er sich meinen Status merken würde und wenn ich wieder (bei immernoch gedrückter Maustaste) zurückzieh, dass Label wieder mitfährt.Ich danke für die Hilfe.
-
Ich glaube, Du könntest das Problem relativ elegant dadurch lösen, daß Du das MouseMove-Event des Formulars verwendest und nicht das der zu verschiebenden Labels (wenn ich Dich bzw. Deinen Code richtig verstanden habe). Bei jedem (Formular-)Move prüfst Du, ob die Maus noch in "Deinem zulässigen Bereich" ist. Falls ja: setz die Labelpositionen entsprechend. Falls nein: mach das Label unsichtbar bzw. setz es in die "Ruheposition".
Du müßtet Dir natürlich noch merken, welches Label gerade verschoben wird. Das müßte über das MouseDown-Event des jeweiligen Labels klappen: Du mußt nur einen Eventhandler bereitstellen, auf den Du dann alle Label-Events setzt. Welches Label gerade geklickt/losgelassen wurde, steht ja im "sender" drin.Ich hoffe, daß hilft Dir weiter.
-
Ok ich denke ich weiss was du meinst.
So könnte das gehen ich werd mich mal dransetzten.
Falls nicht steht dieser Post in ein paar Wochen wieder an der SpitzeVielen DANK für die Hilfe !
mfg ToMjAcK