Fragensteller
Button verschieben?

Allgemeine Diskussion
-
Hallo, ich habe da mal eine ganz kleine Frage undzwar:
Wie der Titel schon sagt, möchte ich ein Button verschieben und wenn der Button dann auf eine bestimmte Position geschoben wurde, soll irgendwas passieren, geht das ?
Alleine komme ich nicht weiter und im Forum hab ich auch keine passende Antwort gefunden.. :(
Es muss auch nicht ein Button sein, es kann alles sein, hauptsache man kann es verschieben..- Typ geändert Robert BreitenhoferModerator Mittwoch, 19. Dezember 2012 09:58 Keine Rückmeldung des Fragenstellender
Alle Antworten
-
Hi Felix.
Um das zu erreichen brauchst du zwei Dinge: den Auslöser für das Verschieben (wann genau soll es passieren, was muss dazu eintreten?) und die Koordinaten, wohin er verschoben werden soll.
Im einfachsten Fall ist es eine Fix-Koordinate (eine neue Position), und z.B. der Klick des Buttons, dass das Ganze auslöst.
Dazu schreibst du die Verschiebung in die Methode, die das OnClick-Event des Buttons behandelt. Alles Nötige dazu findest du hier:
http://msdn.microsoft.com/en-us/library/ms609089.aspx
Wichtig ist halt das Event, welches du als Auslöser nutzen willst, und die Eigenschaft "Location" des Buttons (die Koordinaten, relativ zu seinem Parent).
Wenn du Probleme mit anderen Events hast, müsstest du konkreter werden mit deiner Frage oder das Problem genauer beschreiben.
Ich hoffe das hilft dir erstmal weiter.
LG, Dennis.
-
Hallo Felix Baum,
Schau Dir auch folgenden Artikel an. Vielleicht kann er Dir weiterhelfen.
Grüße,
Robert
Robert Breitenhofer, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.
-
Hallo,
ergänzend, wenn du den Button animiert verschieben möchtest, kannst du einen Timer nutzen, der die X/Y-Koordinate immer wieder um 1 erhöht/erniedrigt. Das geht dann solange bis dein Zielpunkt erreicht wurde. Dann stoppst du den Timer und startest deine Methode, die du am Ende ausführen möchtest.
In WPF kannst du ein Storyboard dafür nutzen, sparst dir somit den Timer, in WinForms geht das leider nicht.
Koopakiller [kuːpakɪllɐ] http://koopakiller.ko.ohost.de/
-
PS: Wenn du meinst, das der Benutzer ein Control verschieben kann, kannst du dir mal folgenden Link angucken:
http://stackoverflow.com/questions/3781245/how-to-allow-user-to-move-a-control-on-the-formKoopakiller [kuːpakɪllɐ] http://koopakiller.ko.ohost.de/
-
Hallo,
bei den Links von euch habe ich leider keine Hilfe gefunden.Vielleicht habe ich es auch falsch erklärt:
Es soll etwas passieren, wenn ich mit gedrückter Maustaste ein Button oder Ähnliches auf eine bestimmte Position schiebe.
Würde das gehen ? -
Bei meinem 2. Post steht ja schonmal wie man Controls verschieben kann. In MouseUp musst du dann die Koordinaten des Controls abfragen und dann entscheiden ob diese in einem Bereich liegen, wo du etwas ausführen möchtest.
Koopakiller [kuːpakɪllɐ] http://koopakiller.ko.ohost.de/
-
Da Felix von gedrückter Maustaste sprach, könnte auch das Mouse-Move-Ereignis zutreffen, mit einer Abfrage auf Mausbutton-Status (sprich ob einer der Knöpfe während des Ziehens gedrückt ist). Hängt vom Sinn und Zweck der ganzen Operation ab.
Grundsätzlich möchte ich daher mal die Frage in den Raum werfen, wozu das Ganze überhaupt dienen soll???
Einen Button per Mausknopf verschieben ist nämlich etwas problematisch, da der Button ansich ja schon auf Mausdruck reagiert. Sinnvoller wäre, je nach Anwendungszweck (den ich nicht kenne), eventuell ein anderes Objekt, wie ein Panel, eine Picturebox oder ein Label oder sowas.
Davon ab ist noch entscheidend, wie du dein Objekt abfragst. Soll der Button z.B. komplett "in einer Zielzone" sein, oder diese nur "berühren"? Hier hilft dir nicht nur die Button.Location, sondern die Button.Bounds, die du per Rectangle.Intersect mit einem Zielrechteck abgleichen kannst. Die Schnittmenge muss dann entweder "nur größer 0" (Breite/Höhe) sein (zum "berühren"), oder eben in ihrer Größe mit dem kleineren Objekt übereinstimmen (dann passt das kleinere, also vermutlich der Button, in das größere, den Zielbereich, komplett hinein).
LG, Dennis.
-
Hallo Dennis,
Also ich möchte wohl so eine Art Tastensperre für den Computer erstellen. Kann sein dass es sowas schon gibt, aber ich möchte es mal selber probieren.
Es muss nicht unbedingt ein Button sein, hauptsache man kann es sehen und man kann es verschieben.Ich denke nicht, dass du weißt, dass ich noch ein Anfänger bin, also weiß ich leider nicht mit welchen Befehlen ich arbeiten muss..
LG Felix.
-
Gut, in meiner verlinkten Seite wird mit den Events MouseDown, MouseMove und mouseUp ein Button verschoben. Bei dem Kommentar
// Calculate the delta's and move the line here
musst du die aktuellen Koordinaten minus die alten Koordinaten (vom letzten MouseDown bzw. MouseMove) rechnen, dann hast du das Delta. Das musst du dann auf die Koordinaten des Buttons drauf rechnen.
Versuche erstmal das zu implementieren, wenn das dann funktioniert kannst du wie folgt weiter machen:
Frage mittels e.X bzw. e.Y die Position des loslassens ab und berechne wieder das Delta um die Koordinaten des Buttons heraus zu bekommen:
if (e.X + button1.Location.X > 100 && e.X + button1.Location.X < 200 && e.Y + button1.Location.Y > 100 && e.Y + button1.Location.Y < 200) MessageBox.Show("Entriegelt");
Koopakiller [kuːpakɪllɐ] http://koopakiller.ko.ohost.de/
-
Ja genauso.
Ich weiß nur nicht was ich davor schreiben soll, also da muss ja noch bestimmt irgendwas davor.Also wenn ich das jetzt richtig verstanden habe, fragt das Programm immer die Position des Buttons ab und wenn er die gewünschte Position erreicht, soll ein Textfenster kommen wo drinsteht: Entriegelt.
Richtig ?
-
Genau. Die Koordinaten werden im MouseUp abgefangen. Danach wird geprüft ob die linke, obere Ecke in dem Entsprechenden Bereich liegt, falls ja, dann wird die MessageBox angezeigt.
An sich musst du nur die 3 genannten Events abfangen und den entsprechenden Code hineinkopieren (und natürlich den Namen des Button anpassen ;))
Koopakiller [kuːpakɪllɐ] http://koopakiller.ko.ohost.de/
-
Nachfolgend ein Beispiel zu dem ganzen. Versuche einfach mal den Code zu verstehen. An sich braucht du den gesamten Code, den ich dir geschrieben/verlinkt habe.
Koopakiller [kuːpakɪllɐ] http://koopakiller.ko.ohost.de/
-
Ich habe die Projektmappe mit VS 2012 Professional erstellt. Wenn du VS 2010 SP1 oder höher benutzt kannst du wenigstens die csproj öffnen.
Was meldet denn VS, weshalb du die Projektmappe nicht laden kannst?
Alternativ musst du die Eventhandlerabbonnenten aus der *.Designer.cs in deiner *.Designer.cs kopieren und anschließend die Handler aus der *.cs in deine *.cs kopieren.
(* steht für den Namen meiner/deiner Form)
EDIT: Vergas, das du ja VB.NET machst, sorry deswegen, Denis hat es ja bereits übersetzt ;)
Koopakiller [kuːpakɪllɐ] http://koopakiller.ko.ohost.de/
- Bearbeitet Tom Lambert (Koopakiller)Moderator Freitag, 14. Dezember 2012 15:11 EDIT
-
Hi.
Ohne jetzt hier Ideen klauen zu wollen, war ich trotzdem mal so frei und habe den Quellcode von Koopa manuell übersetzt nach VB.NET (der war ja in C#). Zudem habe ich eine kleine Änderung an der Form vorgenommen, damit die von Koopa abgefragte Zone (X<100) sichtbar wird.
Den Code kannst du (Felix) nun einfach in dein VB in ein neues Projekt einbauen und austesten. Auch die bei Koopas Beispiel benötigte Picturebox habe ich im Code eingebettet. Brauchst also nichts hinzufügen im Designer.
Hoffe das hilft dir jetzt etwas besser. :-)
LG, Dennis.
Public Class Form1 Private Picturebox1 As PictureBox = New PictureBox Private _capturingMoves As Boolean = False Private p As Point = New Point Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.Bounds = New Rectangle(10, 10, 800, 600) Me.Controls.Add(Picturebox1) With PictureBox1 .BackColor = Color.Navy .BorderStyle = BorderStyle.FixedSingle .Bounds = New Rectangle(Me.Width \ 2 - 50, Me.Height \ 2 - 30, 100, 60) End With End Sub Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown End Sub Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs) MyBase.OnPaint(e) e.Graphics.DrawLine(Pens.Black, 100, 0, 100, Me.Height) End Sub Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove If Not _capturingMoves Then Exit Sub PictureBox1.Location = New Point(e.X - p.X + PictureBox1.Location.X, e.Y - p.Y + PictureBox1.Location.Y) p = e.Location End Sub Private Sub Form1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp If _capturingMoves Then _capturingMoves = False 'Do any final placement If CheckIsInArea() Then MsgBox("Entriegelt") End If End Sub Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) If e.Button = MouseButtons.Left Then p = New Point(e.X + Picturebox1.Location.X, e.Y + Picturebox1.Location.Y) _capturingMoves = True End If End Sub Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) If Not _capturingMoves Then Exit Sub Dim t As Point = New Point(e.X + Picturebox1.Location.X, e.Y + Picturebox1.Location.Y) Picturebox1.Location = New Point(t.X - p.X + Picturebox1.Location.X, t.Y - p.Y + Picturebox1.Location.Y) p = t End Sub Private Sub PictureBox1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) _capturingMoves = False If (CheckIsInArea()) Then MsgBox("Entriegelt") End Sub Public Function CheckIsInArea() As Boolean Return PictureBox1.Location.X < 100 ' //Bild muss nach ganz links geschoben werden End Function End Class
-
****************************************************************************************************************
Dieser Thread wurde mangels weiterer Beteiligung des Fragestellenden ohne bestätigte Lösung abgeschlossen.
Neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.
****************************************************************************************************************Robert Breitenhofer, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.