Laden...

Forms Awendung: Mauszeiger soll Form nicht verlassen können

Erstellt von Borbes vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.340 Views
B
Borbes Themenstarter:in
21 Beiträge seit 2018
vor 5 Jahren
Forms Awendung: Mauszeiger soll Form nicht verlassen können

Grüsse,

Ich arbeite gerade an einem Weltraum Shooter, daß ich in Windows Forms programmiere.
Da das Formfenster einen speziellen Bereich hat in dem sich das Raumschiff bewegen soll, möchte ich, dass dieses diesen Bereich nicht verlassen kann.

Der Code funktioniert an sich. Allerdings nicht sauber. An der Stelle habe ich den Events Mouse_Leave und Mouse_Move gearbeitet. Evtl hat ja jemand einen besseren Vorschlag.



private void Form1_MouseLeave(object sender, EventArgs e)
        {
            if (this.PointToClient(Cursor.Position).X <= 30)
            {               
          Cursor.Position = new Point(this.PointToClient(Cursor.Position).X + this.Width- 35, 
                this.PointToClient(Cursor.Position).Y + 130);
            }

private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            lock (_lock)
            {

                raumschiff.PosX = this.PointToClient(Cursor.Position).X;
                raumschiff.PosY = this.PointToClient(Cursor.Position).Y;
                raumschiff.HitboxRaum();
            }
        }


An sich wäre ich damit zufrieden. Wenn man den Mauszeiger versucht "leicht" aus dem Fenster zu schieben, springt er wieder zurück. Wenn es aber mit aller Gewalt probiere, springt er trotzdem raus. Also im Idealfall irgendwas, bei dem ich verhindern kann, dass er das Form verlässt.

C
2.122 Beiträge seit 2010
vor 5 Jahren

Schalte doch einfach den Mauszeiger ab und handle die Koordinaten passend. Dann sieht man nicht mehr dass sie aus dem Fenster laufen.

S
248 Beiträge seit 2008
vor 5 Jahren

Vielleicht hilft dir die ClipCursor function weiter.

Grüße
spooky

2.080 Beiträge seit 2012
vor 5 Jahren

Alternativ kannst Du auch "per Hand" die Maus-Position tracken und wenn sie das Fenster verlässt, immer wieder zur vorherigen Position im Fenster zurück setzen.

Bedenke aber:
Damit verursachst Du früher oder später Frustation beim Nutzer.
Wenn das aus anderen Gründen (z.B. weil der Nutzer eingesperrt sein soll) richtig ist, dann ist das aber egal 😄

PS:
Im Prinzip also das gleiche wie die Funktion, die Spook genannt hat.
Stellt sich nur die Frage, wie sich das verhält, wenn das Fenster die Position (durch Tasten-Kombinationen) ändert oder wenn das Fenster minimiert wird.
Das müsstest Du also auch abfangen.

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

B
Borbes Themenstarter:in
21 Beiträge seit 2018
vor 5 Jahren

Danke für die Antworten. Ich probier es gleich mal.

B
Borbes Themenstarter:in
21 Beiträge seit 2018
vor 5 Jahren

Hab es getestet und es läuft. Zwar auch nicht 100%, aber besser als mein Code.

Wieder was dazu gelernt.

B
Borbes Themenstarter:in
21 Beiträge seit 2018
vor 5 Jahren

Kurzes Update:

Die Cursor.Clip Funktion funktioniert besonders gut mit selbst erstellten Grenzen und etwas weniger gut wenn es sich tatsächlich um die Grenze der Form handelt.

Die Clip Eigenschaft verlangt nach einer Size. Ich habe dafür einfach ein globales Rectangle erstellt mit meinen gewünschten Maßen und hab das einfach mit übergeben.

Jetzt läuft es wie geschmiert.

Vielleicht bin ich doch nicht zu blöd zum programmieren 😃