Laden...

Schlieren beim Verschieben eines Buttons

Erstellt von Ranger vor 17 Jahren Letzter Beitrag vor 17 Jahren 1.656 Views
R
Ranger Themenstarter:in
34 Beiträge seit 2006
vor 17 Jahren
Schlieren beim Verschieben eines Buttons

Moin zusammen.

Ich erstell grad in einer GroupBox einen Button, den ich dann zur Laufzeit verschieben will. Dazu bediene ich mich der drei Events MouseDown, MouseUp und MouseMove.

Codemäßig sieht das so aus:


		private void Mouse_Down(object sender, System.Windows.Forms.MouseEventArgs e)
		{
			if (e.Button == MouseButtons.Left)
				buttonpress = true;
		}

		private void Mouse_Move(object sender, System.Windows.Forms.MouseEventArgs e)
		{
			this.relocate_Button(sender);
		}

		private void Mouse_Up(object sender, System.Windows.Forms.MouseEventArgs e)
		{
			if (e.Button == MouseButtons.Left)
				buttonpress = false;
		}

		void relocate_Button(object sender)
		{
			if (verschieben && buttonpress)
			{
				Button b = (Button)sender;
				Point helppoint = PointToClient(Cursor.Position);

				if (b.Left >= 0 && b.Left <= groupBox1.Width - b.Width && b.Top >= 20 && b.Top <= groupBox1.Height - b.Height)
				{
					b.Left = helppoint.X - b.Width / 2 - groupBox1.Left;
					b.Top = helppoint.Y - b.Height / 2 - groupBox1.Top;
					label1.Text = b.Left.ToString();
				}

				if (b.Left < 0) b.Left = 0;
				if (b.Left > groupBox1.Width - b.Width) b.Left = groupBox1.Width - b.Width;
				if (b.Top < 20) b.Top = 20;
				if (b.Top > groupBox1.Height - b.Height) b.Top = groupBox1.Height - b.Height;
				label1.Text = b.Left.ToString();
			}
		}

Soweit funktioniert auch alles, der Button wird in der relocate_Button-Methode verschoben und kommt nicht über die Grenzen der Group-Box hinaus.

Versucht man jedoch, den Button über die Grenzen der GroupBox hinaus zu bewegen, verschiebt sich der Button augenscheinlich mit, er flackert und zieht schwarze Schlieren, wenn man ihn den Rand entlang bewegt. Läßt man die Maustaste los oder geht vom Rand weg, ist alles wunderbar.
Es scheint wohl ein Problem mit dem zeichnen des Buttons zu sein, wie gesagt, der Wert für z.B. b.Left liegt nie unter 0, aber beim zeichnen sieht es bald so aus, als würde der Button darum kämpfen, doch noch aus der GroupBox raus zu kommen. 😉

Haben es dann mit einer abgeleiteten GroupBox versucht:


	public class MyGroupBox : System.Windows.Forms.GroupBox
	{
		public MyGroupBox():base()
		{
			this.SetStyle(ControlStyles.DoubleBuffer | ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint, true);
			this.UpdateStyles();
		}
	}

Hat aber auch nichts geholfen. Wenn jmd weiß, woher das kommt und wie man es evtl beheben kann, würde ich mich über einen Tipp freuen.

MFG. Ranger

N
177 Beiträge seit 2006
vor 17 Jahren

Ich habe vermutlich wieder nicht das Problem verstanden, aber wenn du die Position des Buttons kontrollierst, dann verhindere doch einfach, dass der Button in einen Bereich geschoben wird, in dem Schlieren auftreten.

1.549 Beiträge seit 2004
vor 17 Jahren

doublebuffert?

Wir Arbeiten eigendlich nicht wir nehmen nur das geld

R
Ranger Themenstarter:in
34 Beiträge seit 2006
vor 17 Jahren

Na wenns so einfach wäre.............das schlieren kommt ja nicht, weils zufällig der Rand der GroupBox ist. Wenn ich die Grenzen einenge, kommt es halt anderswo zu diesen Verwischungen und ich habe immernoch diese schönen Effekte, wenn ich den Button an meiner Grenze entlangführe.

Muß irgentwas damit zu tun haben, dass die GroupBox net ordentlich zeichnet, bzw net so, wie ichs gern hätte, nämlich den Button bis zum GroupBox-Rand und egal wie weit ich die Maus noch ziehe, soll der Button keinen Mucks mehr machen (jetzt muckt er noch ganz schön, funktional ist zwar alles wie's sein soll, aber es sieht net gut aus).

P.S. an S.H.-Teichhof:

Wenn du damit meinst, man soll nen DoubleBuffer benutzen: das haben wir ja versucht, indem wir die GroupeBox abgeleitet haben (steht ganz unten). Oder ist da was falsch?

1.549 Beiträge seit 2004
vor 17 Jahren

ich meine den Button

Wir Arbeiten eigendlich nicht wir nehmen nur das geld

N
177 Beiträge seit 2006
vor 17 Jahren

Warum begrenzt du nicht (if (b.Left < 0) b.Left = 0) bevor du die Koordinaten dem Button zuweist?

R
Ranger Themenstarter:in
34 Beiträge seit 2006
vor 17 Jahren

an S.H.-Teichhof: könnt ich mal probieren, n Versuch ist's wert
Versuch gemacht: der abgeleitete Button kennt kein

this.SetStyle(ControlStyles.DoubleBuffer | ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint, true);

SetStyle ist implementiert, aber kein ControlStyles. 🙁
Wenn jmd weiß, wie das anders geht, spreche er zu mir.

an nop: wenn du genau hinschaust, siehst du, dass ich genau das gemacht habe.
In der relocate_Button steht if (b.Left < 0) b.Left = 0;